?? gexpr68.c
字號:
gen_code(op_move,4,ap1,ap);
ap->mode = am_indx;
ap->offset = ap2->offset;
return ap;
}
ap = temp_addr();
ap3 = temp_data();
gen_code(op_move,4,ap1,ap);
gen_code(op_move,4,ap2,ap3);
ap->mode = am_baseindxdata;
ap->sreg = ap3->preg;
ap->scale = 0;
ap->offset = makenode(en_icon,0,0);
return ap;
case am_indx:
if (prm_68020 || isamshort2(ap1,ap2)) {
if (ap2->offset->nodetype == en_icon)
ap2->offset->v.i += ap1->offset->v.i;
else
ap2->offset = makenode(en_add,ap2->offset,ap1->offset);
return ap2;
}
ap = temp_data();
gen_code(op_move,4,ap2,ap);
ap1->mode = am_baseindxdata;
ap1->scale = 0;
ap1->sreg = ap->preg;
return ap1;
case am_baseindxaddr:
case am_baseindxdata:
if (ap2->preg == -1 && !prm_68020) {
ap = temp_addr();
gen_code(op_move,4,ap1,ap);
ap2->preg = ap->preg;
return ap2;
}
if (prm_68020 || isambyte2(ap1,ap2)) {
if (ap2->offset->nodetype == am_immed)
ap2->offset->v.i += ap1->offset->v.i;
else
ap2->offset = makenode(en_add,ap2->offset,ap1->offset);
return ap2;
}
freeop(ap2);
ap = temp_addr();
gen_lea(0,ap2,ap);
ap->mode = am_ind;
ap2 = ap;
/* drop through */
case am_ind:
if (prm_68020 || isamshort(ap1)) {
ap2->offset = ap1->offset;
ap2->mode = am_indx;
return ap2;
}
ap = temp_data();
gen_code(op_move,4,ap1,ap);
ap2->mode = am_baseindxdata;
ap2->scale = 0;
ap2->sreg = ap->preg;
ap2->offset = makenode(en_icon,0,0);
return ap2;
}
break;
case am_indx:
switch (ap2->mode) {
case am_areg:
if (prm_68020 || isambyte(ap1)) {
ap2->mode = am_baseindxaddr;
ap2->offset = ap1->offset;
ap2->scale = 0;
ap2->sreg = ap2->preg;
return ap2;
}
freeop(ap1);
ap = temp_addr();
gen_lea(0,ap1,ap);
ap->mode = am_baseindxaddr;
ap->sreg = ap2->preg;
ap->scale = 0;
ap->offset = makenode(en_icon,0,0);
return ap;
case am_dreg:
if (prm_68020 || isambyte(ap1)) {
ap1->mode = am_baseindxdata;
ap1->scale = 0;
ap1->sreg = ap2->preg;
return ap1;
}
freeop(ap1);
ap = temp_addr();
gen_lea(0,ap1,ap);
ap->mode = am_baseindxdata;
ap->sreg = ap2->preg;
ap->scale = 0;
ap->offset = makenode(en_icon,0,0);
return ap;
case am_adirect:
if ((!prm_largedata && (prm_rel || !prm_smalldata)) || prm_68020) {
ap1->offset = makenode(en_add,ap1->offset,ap2->offset);
return ap1;
}
ap = temp_addr();
gen_lea(0,ap2,ap);
ap1->mode = am_baseindxaddr;
ap1->sreg = ap->preg;
ap1->scale = 0;
return ap1;
case am_immed:
if (prm_68020 || isamshort2(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;
}
ap = temp_data();
gen_code(op_move,4,ap2,ap);
ap1->mode = am_baseindxdata;
ap1->scale = 0;
ap1->sreg = ap->preg;
return ap1;
case am_indx:
if (isambyte2(ap1,ap2) || prm_68020) {
if (ap1->offset->nodetype == am_immed && ap2->offset->nodetype)
ap1->offset->v.i += ap2->offset->v.i;
else
ap1->offset = makenode(en_add,ap1->offset,ap2->offset);
ap1->mode = am_baseindxaddr;
ap1->sreg = ap2->preg;
ap1->scale = 0;
ap1->offset = makenode(en_icon,0,0);
return ap1;
}
if (isambyte(ap1)) {
freeop(ap2);
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;
}
if (isambyte(ap2)) {
freeop(ap1);
ap = temp_addr();
gen_lea(0,ap1,ap);
ap2->mode = am_baseindxaddr;
ap2->sreg = ap->preg;
ap2->scale = 0;
ap2->offset = makenode(en_icon,0,0);
return ap2;
}
freeop(ap1);
ap = temp_addr();
gen_lea(0,ap1,ap);
freeop(ap2);
ap1 = temp_addr();
gen_lea(0,ap2,ap1);
ap1->sreg = ap->preg;
ap1->mode = am_baseindxaddr;
ap1->scale = 0;
ap1->offset = makenode(en_icon,0,0);
return ap1;
case am_ind:
if (isambyte(ap1) || prm_68020) {
ap1->mode = am_baseindxaddr;
ap1->sreg = ap2->preg;
ap1->scale = 0;
return ap1;
}
freeop(ap1);
ap = temp_addr();
gen_lea(0,ap1,ap);
ap2->sreg = ap->preg;
ap2->mode = am_baseindxaddr;
ap2->scale = 0;
ap2->offset = makenode(en_icon,0,0);
return ap2;
case am_baseindxaddr:
case am_baseindxdata:
if (prm_68020 || isambyte2(ap1,ap2)) {
if (ap2->preg == -1) {
ap2->preg = ap1->preg;
if (ap2->offset->nodetype == am_immed && ap1->offset->nodetype == am_immed)
ap2->offset->v.i+= ap1->offset->v.i;
else
ap2->offset = makenode(en_add,ap2->offset, ap1->offset);
return ap2;
}
freeop(ap2);
ap = temp_addr();
gen_lea(0,ap2,ap);
ap->mode = am_baseindxaddr;
ap->sreg = ap1->preg;
ap->scale = 0;
ap->offset = ap1->offset;
return ap;
}
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;
return ap2;
}
freeop(ap2);
ap = temp_addr();
gen_lea(0,ap2,ap);
ap2 = temp_data();
gen_code(op_move,4,ap,ap2);
freeop(ap1);
gen_lea(0,ap1,ap);
ap->mode = am_baseindxdata;
ap->sreg = ap2->preg;
ap->scale = 0;
ap->offset = makenode(en_icon,0,0);
return ap;
}
break;
case am_ind:
switch (ap2->mode) {
case am_areg:
ap2->mode = am_baseindxaddr;
ap2->offset = makenode(en_icon,0,0);
ap2->scale = 0;
ap2->sreg = ap1->preg;
return ap2;
case am_dreg:
ap1->mode = am_baseindxdata;
ap1->offset = makenode(en_icon,0,0);
ap1->scale = 0;
ap1->sreg = ap2->preg;
return ap1;
case am_adirect:
if ((!prm_largedata && (prm_rel || !prm_smalldata)) || prm_68020) {
ap1->offset = ap2->offset;
ap1->mode = am_indx;
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 || isamshort(ap2)) {
ap1->offset = ap2->offset;
ap1->mode = am_indx;
return ap1;
}
ap = temp_data();
gen_code(op_move,4,ap2,ap);
ap1->mode = am_baseindxdata;
ap1->scale = 0;
ap1->sreg = ap->preg;
ap1->offset = makenode(en_icon,0,0);
return ap1;
case am_indx:
if (isambyte(ap2) || prm_68020) {
ap2->mode = am_baseindxaddr;
ap2->sreg = ap1->preg;
return ap2;
}
freeop(ap2);
ap = temp_addr();
gen_lea(0,ap2,ap);
ap1->sreg = ap->preg;
ap1->mode = am_baseindxaddr;
ap1->scale = 0;
ap1->offset = makenode(en_icon,0,0);
return ap1;
case am_ind:
ap1->mode = am_baseindxaddr;
ap1->sreg= ap2->preg;
ap1->scale = 0;
ap1->offset = makenode(en_icon,0,0);
return ap1;
case am_baseindxaddr:
case am_baseindxdata:
if (ap2->preg == -1) {
ap2->preg = ap1->preg;
return ap2;
}
freeop(ap2);
ap = temp_addr();
gen_lea(0,ap2,ap);
ap->mode = am_baseindxaddr;
ap->sreg = ap1->preg;
ap->scale = 0;
ap->offset = makenode(en_icon,0,0);
return ap;
}
break;
case am_baseindxaddr:
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 (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);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -