?? an386.c
字號:
}
}
else {
/* Should never get here */
DIAG("float reg assigned in analyze");
}
freeop(ap);
if (lvalue(exptr) && ((SYM *)exptr->v.p[0]->v.p[0])->funcparm) {
((SYM *)exptr->v.p[0]->v.p[0])->inreg = TRUE;
((SYM *)exptr->v.p[0]->v.p[0])->value.i = -csp->reg;
}
}
}
csp = csp->next;
}
}
void asm_scannode (ENODE *node)
{
CSE *csp;
if (node->nodetype == en_add) {
asm_scannode(node->v.p[0]);
asm_scannode(node->v.p[1]);
}
else {
switch (node->nodetype) {
case en_icon:
case en_lcon:
case en_iucon:
case en_lucon:
case en_ccon:
break;
case en_napccon:
case en_nacon:
case en_absacon:
case en_autocon:
case en_autoreg:
csp = enternode(node,0,0);
csp->voidf = TRUE;
break;
case en_labcon: case en_nalabcon:
break;
default:
DIAG("Invalid node in assembler line");
break;
}
}
}
void asm_scan1(AMODE *ap)
{
if (!ap || !ap->offset)
return;
asm_scannode(ap->offset);
}
void asm_scan(OCODE *cd)
{
asm_scan1(cd->oper1);
asm_scan1(cd->oper2);
asm_scan1(cd->oper3);
}
void asm_repnode(ENODE **node)
{
if ((*node)->nodetype == en_add) {
asm_repnode(&(*node)->v.p[0]);
asm_repnode(&(*node)->v.p[1]);
}
else
if( (*node)->nodetype == en_autocon || (*node)->nodetype == en_autoreg)
{
if (prm_linkreg) {
*node = makenode(en_icon,(char *)((SYM *)(*node)->v.p[0])->value.i,0);
}
else if (((SYM *)(*node)->v.p[0])->funcparm)
*node = makenode(en_icon,(char *)(((SYM *)(*node)->v.p[0])->value.i+framedepth+stackdepth),0);
else
*node = makenode(en_icon,(char *)(((SYM *)(*node)->v.p[0])->value.i+stackdepth+lc_maxauto),0);
}
else if( (*node)->nodetype == en_nacon || (*node)->nodetype == en_napccon)
{
*node = makenode((*node)->nodetype,(char *)((SYM *)(*node)->v.p[0])->name,0);
}
else if( (*node)->nodetype == en_nalabcon)
{
*node = makenode((*node)->nodetype,(char *)(*node)->v.i,0);
}
else if( (*node)->nodetype == en_labcon)
{
*node = makenode((*node)->nodetype,(char *)(*node)->v.i,0);
}
else if ((*node)->nodetype == en_absacon) {
*node = makenode(en_absacon,(char *)((SYM *)(*node)->v.p[0])->value.i,0);
}
}
int voidexpr(ENODE *node)
{ CSE *csp;
if( node == 0 )
return 0;
switch( node->nodetype ) {
case en_rcon: case en_lrcon: case en_fcon:
return 1;
case en_icon:
case en_lcon:
case en_iucon:
case en_lucon:
case en_ccon:
case en_nacon:
case en_napccon:
case en_absacon:
case en_autocon:
case en_autoreg:
return 0;
case en_floatref:
case en_doubleref:
case en_longdoubleref:
return 1;
case en_ub_ref:
case en_uw_ref:
case en_b_ref:
case en_w_ref:
case en_l_ref:
case en_ul_ref:
return 0;
case en_uminus: case en_bits:
case en_not: case en_compl:
case en_ainc: case en_adec:
return voidexpr(node->v.p[0]);
case en_cb: case en_cub:
case en_cw: case en_cuw:
case en_cl: case en_cul:
case en_cf: case en_cd: case en_cp: case en_cld:
return voidexpr(node->v.p[0]);
case en_add: case en_sub:
case en_umul: case en_udiv: case en_umod:
case en_mul: case en_div:
case en_mod: case en_lsh:
case en_asalsh: case en_asarsh: case en_alsh: case en_arsh:
case en_rsh: case en_and:
case en_or: case en_xor:
case en_land: case en_lor:
case en_eq: case en_ne:
case en_lt: case en_le:
case en_ugt: case en_uge: case en_ult: case en_ule:
case en_gt: case en_ge:
case en_cond: case en_void:
case en_pmul:
case en_fcall: case en_trapcall: case en_pdiv:
case en_pfcall: case en_pfcallb:
case en_intcall: case en_fcallb:
case en_moveblock: case en_stackblock: case en_callblock:
case en_pcallblock:
return voidexpr(node->v.p[0]) || voidexpr(node->v.p[1]);
case en_asadd: case en_assub:
case en_asmul: case en_asdiv:
case en_asor: case en_asand: case en_asxor:
case en_asmod: case en_aslsh:
case en_asumod: case en_asudiv: case en_asumul:
case en_asrsh: case en_assign: case en_refassign:
if (voidexpr(node->v.p[1])) {
csp = searchnode(node->v.p[0]);
if (csp)
csp->voidf = 1;
}
return voidexpr(node->v.p[0]);
default:
return 0;
}
}
void voidfloat(SNODE *block)
/*
* Scan through a block and void all CSEs which do asadd, asmul, asmodiv
* of float to int
*/
{ while( block != 0 ) {
switch( block->stype ) {
case st_return:
case st_expr:
voidexpr(block->exp);
break;
case st_while:
case st_do:
voidexpr(block->exp);
voidfloat(block->s1);
break;
case st_for:
voidexpr(block->label);
voidexpr(block->exp);
voidfloat(block->s1);
voidexpr(block->s2);
break;
case st_if:
voidexpr(block->exp);
voidfloat(block->s1);
voidfloat(block->s2);
break;
case st_switch:
voidexpr(block->exp);
voidfloat(block->s1);
break;
case st_case:
voidfloat(block->s1);
break;
case st_block:
voidfloat(block->exp);
break;
}
block = block->next;
}
}
void asm_repcse1(AMODE *ap)
{
if (!ap || !ap->offset)
return;
asm_repnode(&ap->offset);
}
void asm_repcse(OCODE *cd)
{
asm_repcse1(cd->oper1);
asm_repcse1(cd->oper2);
asm_repcse1(cd->oper3);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -