?? gexpr68.c
字號:
freeop(ap2);
ap = temp_addr();
gen_lea(0,ap2,ap);
ap->mode = am_baseindxdata;
ap->sreg = ap1->preg;
ap->scale = 0;
ap->offset = makenode(en_icon,0,0);
return ap;
case am_ind:
if (ap1->preg == -1) {
ap1->preg = ap2->preg;
return ap1;
}
freeop(ap1);
ap = temp_addr();
gen_lea(0,ap1,ap);
ap->mode = am_baseindxaddr;
ap->sreg = ap2->preg;
ap->scale = 0;
ap->offset = ap1->offset;
return ap;
case am_baseindxaddr:
case am_baseindxdata:
if (prm_68020 || (ap1->preg != -1 && ap2->preg != -1)) {
freeop(ap1);
ap = temp_addr();
gen_lea(0,ap1,ap);
ap1 = temp_data();
gen_code(op_move,4,ap,ap1);
freeop(ap2);
gen_lea(0,ap2,ap);
ap->mode = am_baseindxdata;
ap->sreg = ap1->preg;
ap->scale = 0;
ap->offset = makenode(en_icon,0,0);
return ap;
}
if (ap1->preg == -1) {
ap3 = xalloc(sizeof(AMODE));
ap3->preg = ap1->sreg;
if (ap1->mode == am_baseindxdata) {
ap3->mode = F_DREG;
if (ap3->preg < cf_freedata)
ap3->tempflag = 1;
}
else {
ap3->mode = F_AREG;
if (ap3->preg < cf_freeaddress)
ap3->tempflag = 1;
}
if (ap1->scale) {
make_legal(ap3,F_DREG | F_VOL,4);
gen_code(op_asl,4,ap3,make_immed(ap1->scale));
make_legal(ap3,F_AREG | F_VOL,4);
}
else
make_legal(ap3,F_AREG,4);
ap1->preg = ap3->preg;
ap1->mode = am_indx;
}
if (ap2->preg == -1) {
ap3 = xalloc(sizeof(AMODE));
ap3->preg = ap2->sreg;
if (ap2->mode == am_baseindxdata) {
ap3->mode = F_DREG;
if (ap3->preg < cf_freedata)
ap3->tempflag = 1;
}
else {
ap3->mode = F_AREG;
if (ap3->preg < cf_freeaddress)
ap3->tempflag = 1;
}
if (ap2->scale) {
make_legal(ap3,F_DREG | F_VOL,4);
gen_code(op_asl,4,ap3,make_immed(ap2->scale));
make_legal(ap3,F_AREG | F_VOL,4);
}
else
make_legal(ap3,F_AREG,4);
ap2->preg = ap3->preg;
ap2->mode = am_indx;
}
goto tryagain;
}
break;
case am_baseindxdata:
switch (ap2->mode) {
case am_areg:
if (ap1->preg == -1) {
ap1->preg = ap2->preg;
return ap1;
}
freeop(ap1);
ap = temp_addr();
gen_lea(0,ap1,ap);
ap2->mode = am_baseindxaddr;
ap2->scale = 0;
ap2->offset = makenode(en_icon,0,0);
ap2->sreg = ap->preg;
return ap2;
case am_dreg:
if (ap1->preg == -1) {
ap = temp_addr();
gen_code(op_move,4,ap2,ap);
ap1->preg = ap->preg;
return ap1;
}
freeop(ap1);
ap = temp_addr();
gen_lea(0,ap1,ap);
ap->mode = am_baseindxdata;
ap->scale = 0;
ap->offset = makenode(en_icon,0,0);
ap->sreg = ap2->preg;
return ap;
case am_adirect:
if (prm_68020) {
ap1->offset = makenode(en_add,ap1->offset,ap2->offset);
return ap1;
}
if (ap1->preg == -1) {
ap = temp_addr();
ap1->preg = ap->preg;
gen_lea(0,ap2,ap);
return ap1;
}
ap = temp_addr();
gen_lea(0,ap2,ap);
ap1->mode = am_baseindxaddr;
ap1->sreg = ap->preg;
ap1->scale = 0;
ap1->offset = makenode(en_icon,0,0);
return ap1;
case am_immed:
if (!prm_68020 && ap1->preg == -1) {
ap = temp_addr();
gen_code(op_move,4,ap2,ap);
ap1->preg = ap->preg;
return ap1;
}
if (prm_68020 || isambyte2(ap1,ap2)) {
if (ap1->offset->nodetype == am_immed)
ap1->offset->v.i += ap2->offset->v.i;
else
ap1->offset = makenode(en_add,ap1->offset,ap2->offset);
return ap1;
}
freeop(ap1);
ap = temp_addr();
gen_lea(0,ap1,ap);
if ((!prm_largedata && (prm_rel || !prm_smalldata)) || prm_68020) {
ap->mode = am_indx;
ap->offset = ap2->offset;
return ap;
}
ap1 = temp_data();
ap1->mode = am_baseindxdata;
ap1->sreg = ap->preg;
ap1->scale = 0;
ap1->offset = makenode(en_icon,0,0);
return ap1;
case am_indx:
if (prm_68020 || isambyte2(ap1,ap2)) {
if (ap1->preg == -1) {
ap1->preg = ap2->preg;
if (ap2->offset->nodetype == am_immed && ap1->offset->nodetype == am_immed)
ap1->offset->v.i+= ap2->offset->v.i;
else
ap1->offset = makenode(en_add,ap1->offset, ap2->offset);
return ap1;
}
freeop(ap1);
ap = temp_addr();
gen_lea(0,ap1,ap);
ap->mode = am_baseindxaddr;
ap->sreg = ap2->preg;
ap->scale = 0;
ap->offset = ap2->offset;
return ap;
}
if (ap1->preg == -1) {
ap3 = xalloc(sizeof(AMODE));
ap3->preg = ap1->sreg;
if (ap1->mode == am_baseindxdata) {
ap3->mode = F_DREG;
if (ap3->preg < cf_freedata)
ap3->tempflag = 1;
}
else {
ap3->mode = F_AREG;
if (ap3->preg < cf_freeaddress)
ap3->tempflag = 1;
}
if (ap3->preg < cf_freedata)
ap3->tempflag = 1;
if (ap1->scale) {
make_legal(ap3,F_DREG | F_VOL,4);
gen_code(op_asl,4,ap3,make_immed(ap1->scale));
make_legal(ap3,F_AREG | F_VOL,4);
}
else
make_legal(ap3,F_AREG,4);
ap1->preg = ap3->preg;
ap1->mode = am_indx;
return ap1;
}
freeop(ap1);
ap = temp_addr();
gen_lea(0,ap1,ap);
ap1 = temp_data();
gen_code(op_move,4,ap,ap1);
freeop(ap2);
gen_lea(0,ap2,ap);
ap->mode = am_baseindxdata;
ap->sreg = ap1->preg;
ap->scale = 0;
ap->offset = makenode(en_icon,0,0);
return ap;
case am_ind:
if (ap1->preg == -1) {
ap1->preg = ap2->preg;
return ap1;
}
freeop(ap1);
ap = temp_addr();
gen_lea(0,ap1,ap);
ap->mode = am_baseindxaddr;
ap->sreg = ap2->preg;
ap->scale = 0;
ap->offset = ap1->offset;
return ap;
case am_baseindxaddr:
case am_baseindxdata:
if (prm_68020 || (ap1->preg != -1 && ap2->preg != -1)) {
freeop(ap1);
ap = temp_addr();
gen_lea(0,ap1,ap);
ap1 = temp_data();
gen_code(op_move,4,ap,ap1);
freeop(ap2);
gen_lea(0,ap2,ap);
ap->mode = am_baseindxdata;
ap->sreg = ap->preg;
ap->scale = 0;
ap->offset = makenode(en_icon,0,0);
return ap;
}
if (ap1->preg == -1) {
ap3 = xalloc(sizeof(AMODE));
ap3->preg = ap1->sreg;
if (ap1->mode == am_baseindxdata) {
ap3->mode = F_DREG;
if (ap3->preg < cf_freedata)
ap3->tempflag = 1;
}
else {
ap3->mode = F_AREG;
if (ap3->preg < cf_freeaddress)
ap3->tempflag = 1;
}
if (ap1->scale) {
make_legal(ap3,F_DREG | F_VOL,4);
gen_code(op_asl,4,ap3,make_immed(ap1->scale));
make_legal(ap3,F_AREG | F_VOL,4);
}
else
make_legal(ap3,F_AREG,4);
ap1->preg = ap3->preg;
ap1->mode = am_indx;
}
if (ap2->preg == -1) {
ap3 = xalloc(sizeof(AMODE));
ap3->preg = ap2->sreg;
if (ap2->mode == am_baseindxdata) {
ap3->mode = F_DREG;
if (ap3->preg < cf_freedata)
ap3->tempflag = 1;
}
else {
ap3->mode = F_AREG;
if (ap3->preg < cf_freeaddress)
ap3->tempflag = 1;
}
if (ap2->scale) {
make_legal(ap3,F_DREG | F_VOL,4);
gen_code(op_asl,4,ap3,make_immed(ap2->scale));
make_legal(ap3,F_AREG | F_VOL,4);
}
else
make_legal(ap3,F_AREG,4);
ap2->preg = ap3->preg;
ap2->mode = am_indx;
}
goto tryagain;
}
break;
}
DIAG("invalid index conversion");
}
AMODE *gen_deref(ENODE *node, int flags,int size, int flag)
/*
* return the addressing mode of a dereferenced node.
*/
{ AMODE *ap1,*ap2;
int siz1,psize;
psize = size;
if (psize < 0)
psize = - psize;
switch( node->nodetype ) /* get load size */
{
case en_ub_ref:
siz1 = 1;
break;
case en_b_ref:
siz1 = -1;
break;
case en_uw_ref:
siz1 = 2;
break;
case en_w_ref:
siz1 = -2;
break;
case en_l_ref:
siz1 = -4;
break;
case en_add:
case en_ul_ref:
siz1 = 4;
break;
case en_floatref:
siz1 = 6;
break;
case en_doubleref:
siz1 = 8;
break;
case en_longdoubleref:
siz1 = 10;
break;
default:
siz1 = 4;
}
if( node->v.p[0]->nodetype == en_add )
{
ap1 = gen_index(siz1,node->v.p[0]);
do_extend(ap1,siz1,size,flags);
make_legal(ap1,flags,psize);
return ap1;
}
else if( node->v.p[0]->nodetype == en_autocon || node->v.p[0]->nodetype == en_autoreg)
{
ap1 = xalloc(sizeof(AMODE));
ap1->mode = am_indx;
if (prm_linkreg && !currentfunc->intflag) {
ap1->preg = linkreg;
ap1->offset = makenode(en_icon,(char *)((SYM *)node->v.p[0]->v.p[0])->value.i,0);
}
else if (((SYM *)node->v.p[0]->v.p[0])->funcparm) {
if (prm_phiform || currentfunc->intflag) {
ap1->preg = linkreg;
ap1->offset = makenode(en_icon,(char *)((SYM *)node->v.p[0]->v.p[0])->value.i,0);
}
else {
ap1->preg = 7;
ap1->offset = makenode(en_icon,(char *)(((SYM *)node->v.p[0]->v.p[0])->value.i+framedepth+stackdepth),0);
}
}
else {
ap1->preg = 7;
ap1->offset = makenode(en_icon,(char *)(((SYM *)node->v.p[0]->v.p[0])->value.i+stackdepth+lc_maxauto),0);
}
do_extend(ap1,siz1,size,flags);
make_legal(ap1,flags,psize);
return ap1;
}
else if( node->v.p[0]->nodetype == en_nacon)
{
ap1 = xalloc(sizeof(AMODE));
if (prm_rel) {
ap1->preg = basereg;
ap1->offset = makenode(node->v.p[0]->nodetype,((SYM *)node->v.p[0]->v.p[0])->name,0);
if (prm_largedata) {
ap2 = temp_addr();
ap1->mode = am_areg;
gen_code(op_move,4,ap1,ap2);
ap1->mode = am_immed;
gen_code(op_add,4,ap1,ap2);
ap1 = ap2;
ap1->mode = am_ind;
}
else {
ap1->mode = am_indx;
}
}
else {
ap1->mode = am_adirect;
ap1->offset = makenode(node->v.p[0]->nodetype,((SYM *)node->v.p[0]->v.p[0])->name,0);
if (prm_smalldata)
ap1->preg = 2;
else
ap1->preg = 4;
}
do_extend(ap1,siz1,size,flags);
make_legal(ap1,flags,psize);
return ap1;
}
else if( node->v.p[0]->nodetype == en_nalabcon)
{
ap1 = xalloc(sizeof(AMODE));
if (prm_rel) {
ap1->preg = basereg;
ap1->offset = makenode(node->v.p[0]->nodetype,(char *)node->v.p[0]->v.i,0);
if (prm_largedata) {
ap2 = temp_addr();
ap1->mode = am_areg;
gen_code(op_move,4,ap1,ap2);
ap1->mode = am_immed;
gen_code(op_add,4,ap1,ap2);
ap1 = ap2;
ap1->mode = am_ind;
}
else {
ap1->mode = am_indx;
}
}
else {
ap1->mode = am_adirect;
ap1->offset = makenode(node->v.p[0]->nodetype,(char *)node->v.p[0]->v.i,0);
if (prm_smalldata)
ap1->preg = 2;
else
ap1->preg = 4;
}
do_extend(ap1,siz1,size,flags);
make_legal(ap1,flags,psize);
return ap1;
}
else if( node->v.p[0]->nodetype == en_labcon || node->v.p[0]->nodetype == en_napccon)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -