📄 gexpr68.c
字号:
ap1->offset = makeintnode(en_icon, 0);
ap1->scale = 0;
ap1->sreg = ap2->preg;
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);
ap1->mode = am_baseindxaddr;
ap1->scale = 0;
ap1->offset = makeintnode(en_icon, 0);
ap1->sreg = ap->preg;
return ap1;
}
break;
case am_dreg:
switch (ap2->mode)
{
case am_areg:
ap2->sreg = ap1->preg;
ap2->mode = am_baseindxdata;
ap2->offset = makeintnode(en_icon, 0);
ap2->scale = 0;
return ap2;
case am_dreg:
freeop(ap2);
ap = temp_addr();
gen_lea(0, ap1, ap);
ap->sreg = ap1->preg;
ap->mode = am_baseindxdata;
ap->offset = makeintnode(en_icon, 0);
ap->scale = 0;
return ap;
case am_adirect:
if ((!prm_largedata && (prm_datarel || !prm_smalldata)) ||
prm_68020)
{
freeop(ap1);
ap = temp_addr();
gen_codes(op_move, BESZ_DWORD, ap1, ap);
ap->mode = am_indx;
ap->offset = ap2->offset;
return ap;
}
ap = temp_addr();
gen_lea(0, ap2, ap);
ap->mode = am_baseindxdata;
ap->offset = makeintnode(en_icon, 0);
ap->scale = 0;
ap->sreg = ap1->preg;
return ap;
case am_immed:
if (prm_68020 || isamshort(ap2))
{
freeop(ap1);
ap = temp_addr();
gen_codes(op_move, BESZ_DWORD, ap1, ap);
ap->mode = am_indx;
ap->offset = ap2->offset;
return ap;
}
ap = temp_addr();
gen_code(op_move, ap2, ap);
ap->mode = am_baseindxdata;
ap->offset = makeintnode(en_icon, 0);
ap->scale = 0;
ap->sreg = ap1->preg;
return ap;
case am_indx:
if (prm_68020 || isambyte(ap2))
{
ap2->mode = am_baseindxdata;
ap2->scale = 0;
ap2->sreg = ap1->preg;
return ap2;
}
freeop(ap2);
ap = temp_addr();
gen_lea(0, ap2, ap);
ap->mode = am_baseindxdata;
ap->sreg = ap1->preg;
ap->scale = 0;
ap->offset = makeintnode(en_icon, 0);
return ap;
case am_ind:
ap2->mode = am_baseindxdata;
ap2->offset = makeintnode(en_icon, 0);
ap2->scale = 0;
ap2->sreg = ap1->preg;
return ap2;
case am_baseindxaddr:
case am_baseindxdata:
if (ap2->preg == - 1)
{
ap = temp_addr();
gen_codes(op_move, BESZ_DWORD, ap1, ap);
ap2->preg = ap->preg;
return ap2;
}
freeop(ap2);
ap = temp_addr();
gen_lea(0, ap2, ap);
ap->mode = am_baseindxdata;
ap->scale = 0;
ap->offset = makeintnode(en_icon, 0);
ap->sreg = ap1->preg;
return ap;
}
break;
case am_adirect:
switch (ap2->mode)
{
case am_areg:
if ((!prm_largedata && (prm_datarel || !prm_smalldata)) ||
prm_68020)
{
ap2->mode = am_indx;
ap2->offset = ap1->offset;
return ap2;
}
ap = temp_addr();
gen_lea(0, ap1, ap);
ap2->mode = am_baseindxaddr;
ap2->offset = makeintnode(en_icon, 0);
ap2->scale = 0;
ap2->sreg = ap->preg;
return ap2;
case am_dreg:
if ((!prm_largedata && (prm_datarel || !prm_smalldata)) ||
prm_68020)
{
freeop(ap1);
ap = temp_addr();
gen_codes(op_move, BESZ_DWORD, ap2, ap);
ap->mode = am_indx;
ap->offset = ap1->offset;
return ap;
}
ap = temp_addr();
gen_lea(0, ap1, ap);
ap->mode = am_baseindxdata;
ap->offset = makeintnode(en_icon, 0);
ap->scale = 0;
ap->sreg = ap2->preg;
return ap;
case am_adirect:
ap1->offset = makenode(en_add, ap1->offset, ap2->offset);
return ap1;
case am_immed:
ap1->offset = makenode(en_add, ap1->offset, ap2->offset);
return ap1;
case am_indx:
if ((!prm_largedata && (prm_datarel || !prm_smalldata)) ||
prm_68020)
{
ap2->offset = makenode(en_add, ap2->offset, ap1->offset);
return ap2;
}
ap = temp_addr();
gen_lea(0, ap1, ap);
ap2->mode = am_baseindxaddr;
ap2->sreg = ap->preg;
ap2->scale = 0;
return ap2;
case am_ind:
if ((!prm_largedata && (prm_datarel || !prm_smalldata)) ||
prm_68020)
{
ap2->offset = ap1->offset;
ap2->mode = am_indx;
return ap2;
}
ap = temp_addr();
gen_lea(0, ap1, ap);
ap2->mode = am_baseindxaddr;
ap2->sreg = ap->preg;
ap2->scale = 0;
ap2->offset = makeintnode(en_icon, 0);
return ap2;
case am_baseindxaddr:
case am_baseindxdata:
if (prm_68020)
{
ap2->offset = makenode(en_add, ap2->offset, ap1->offset);
return ap2;
}
if (ap2->preg == - 1)
{
ap = temp_addr();
ap2->preg = ap->preg;
gen_lea(0, ap1, ap);
return ap2;
}
ap = temp_addr();
gen_lea(0, ap1, ap);
ap2->mode = am_baseindxaddr;
ap2->sreg = ap->preg;
ap2->scale = 0;
ap2->offset = makeintnode(en_icon, 0);
return ap2;
}
break;
case am_immed:
switch (ap2->mode)
{
case am_areg:
if (prm_68020 || isamshort(ap1))
{
ap2->mode = am_indx;
ap2->offset = ap1->offset;
return ap2;
}
ap = temp_data();
gen_codes(op_move, BESZ_DWORD, ap1, ap);
ap2->mode = am_baseindxdata;
ap2->offset = makeintnode(en_icon, 0);
ap2->scale = 0;
ap2->sreg = ap->preg;
return ap2;
case am_dreg:
if (prm_68020 || isamshort(ap1))
{
freeop(ap2);
ap = temp_addr();
gen_codes(op_move, BESZ_DWORD, ap2, ap);
ap->mode = am_indx;
ap->offset = ap1->offset;
return ap;
}
ap = temp_addr();
gen_codes(op_move, BESZ_DWORD, ap1, ap);
ap->mode = am_baseindxdata;
ap->offset = makeintnode(en_icon, 0);
ap->scale = 0;
ap->sreg = ap2->preg;
return ap;
case am_adirect:
ap2->offset = makenode(en_add, ap2->offset, ap1->offset);
return ap2;
case am_immed:
if (prm_68020 || isamshort2(ap1, ap2))
{
ap1->offset->v.i += ap2->offset->v.i;
return ap1;
}
if (isamshort(ap1))
{
ap = temp_addr();
gen_codes(op_move, BESZ_DWORD, ap2, ap);
ap->mode = am_indx;
ap->offset = ap1->offset;
return ap;
}
if (isamshort(ap2))
{
ap = temp_addr();
gen_codes(op_move, BESZ_DWORD, ap1, ap);
ap->mode = am_indx;
ap->offset = ap2->offset;
return ap;
}
ap = temp_addr();
ap3 = temp_data();
gen_codes(op_move, BESZ_DWORD, ap1, ap);
gen_codes(op_move, BESZ_DWORD, ap2, ap3);
ap->mode = am_baseindxdata;
ap->sreg = ap3->preg;
ap->scale = 0;
ap->offset = makeintnode(en_icon, 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_codes(op_move, BESZ_DWORD, 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_codes(op_move, BESZ_DWORD, 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_codes(op_move, BESZ_DWORD, ap1, ap);
ap2->mode = am_baseindxdata;
ap2->scale = 0;
ap2->sreg = ap->preg;
ap2->offset = makeintnode(en_icon, 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 = makeintnode(en_icon, 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 = makeintnode(en_icon, 0);
return ap;
case am_adirect:
if ((!prm_largedata && (prm_datarel || !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))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -