Line 240... |
Line 240... |
case en_or: case en_xor:
|
case en_or: case en_xor:
|
case en_lor: case en_land:
|
case en_lor: case en_land:
|
case en_eq: case en_ne:
|
case en_eq: case en_ne:
|
case en_gt: case en_ge:
|
case en_gt: case en_ge:
|
case en_lt: case en_le:
|
case en_lt: case en_le:
|
|
case en_ugt: case en_uge:
|
|
case en_ult: case en_ule:
|
case en_asmul: case en_asdiv:
|
case en_asmul: case en_asdiv:
|
case en_asmod: case en_aslsh:
|
case en_asmod: case en_aslsh:
|
case en_asrsh:
|
case en_asrsh:
|
case en_asand: case en_asxor: case en_asor:
|
case en_asand: case en_asxor: case en_asor:
|
case en_cond:
|
case en_cond:
|
Line 305... |
Line 307... |
case st_case:
|
case st_case:
|
scan(block->s1);
|
scan(block->s1);
|
break;
|
break;
|
case st_spinlock:
|
case st_spinlock:
|
scan(block->s1);
|
scan(block->s1);
|
|
scan(block->s2);
|
break;
|
break;
|
}
|
}
|
block = block->next;
|
block = block->next;
|
}
|
}
|
}
|
}
|
Line 370... |
Line 373... |
CSE *csp;
|
CSE *csp;
|
ENODE *exptr;
|
ENODE *exptr;
|
int reg, mask, rmask;
|
int reg, mask, rmask;
|
AMODE *ap, *ap2;
|
AMODE *ap, *ap2;
|
int nn;
|
int nn;
|
|
int cnt;
|
|
|
reg = 11;
|
reg = 11;
|
mask = 0;
|
mask = 0;
|
rmask = 0;
|
rmask = 0;
|
while( bsort(&olist) ); /* sort the expression list */
|
while( bsort(&olist) ); /* sort the expression list */
|
csp = olist;
|
csp = olist;
|
while( csp != NULL ) {
|
while( csp != NULL ) {
|
if( OptimizationDesireability(csp) < 3 ) // was < 3
|
if( OptimizationDesireability(csp) < 3 ) // was < 3
|
csp->reg = -1;
|
csp->reg = -1;
|
// else if( csp->duses > csp->uses / 8 && reg < 18 ) // was / 4
|
// else if( csp->duses > csp->uses / 4 && reg < 18 )
|
else if( reg < 18 ) // was / 4
|
else if( reg < 18 ) // was / 4
|
csp->reg = reg++;
|
csp->reg = reg++;
|
else
|
else
|
csp->reg = -1;
|
csp->reg = -1;
|
if( csp->reg != -1 )
|
if( csp->reg != -1 )
|
Line 392... |
Line 396... |
mask = mask | (1 << csp->reg);
|
mask = mask | (1 << csp->reg);
|
}
|
}
|
csp = csp->next;
|
csp = csp->next;
|
}
|
}
|
if( mask != 0 ) {
|
if( mask != 0 ) {
|
if (bitsset(rmask) < 2) {
|
cnt = 0;
|
for (nn = 0; nn < 32; nn++)
|
GenerateTriadic(op_subui,0,makereg(30),makereg(30),make_immed(bitsset(rmask)*8));
|
|
for (nn = 0; nn < 32; nn++) {
|
if (rmask & (0x80000000 >> nn)) {
|
if (rmask & (0x80000000 >> nn)) {
|
GenerateTriadic(op_subui,0,makereg(30),makereg(30),make_immed(8));
|
GenerateTriadic(op_sw,0,makereg(nn&31),make_indexed(cnt,30),NULL);
|
GenerateTriadic(op_sw,0,makereg(nn&31),make_indirect(30),NULL);
|
cnt+=8;
|
}
|
|
}
|
}
|
else {
|
|
GenerateTriadic(op_subui,0,makereg(30),makereg(30),make_immed(popcnt(mask)*8));
|
|
GenerateDiadic(op_sm,0,make_indirect(30),make_mask(mask),NULL);
|
|
}
|
}
|
|
//else {
|
|
// GenerateTriadic(op_subui,0,makereg(30),makereg(30),make_immed(popcnt(mask)*8));
|
|
// GenerateDiadic(op_sm,0,make_indirect(30),make_mask(mask),NULL);
|
|
//}
|
}
|
}
|
save_mask = mask;
|
save_mask = mask;
|
csp = olist;
|
csp = olist;
|
while( csp != NULL ) {
|
while( csp != NULL ) {
|
if( csp->reg != -1 )
|
if( csp->reg != -1 )
|
Line 493... |
Line 498... |
case en_or: case en_xor:
|
case en_or: case en_xor:
|
case en_land: case en_lor:
|
case en_land: case en_lor:
|
case en_eq: case en_ne:
|
case en_eq: case en_ne:
|
case en_lt: case en_le:
|
case en_lt: case en_le:
|
case en_gt: case en_ge:
|
case en_gt: case en_ge:
|
|
case en_ult: case en_ule:
|
|
case en_ugt: case en_uge:
|
case en_cond: case en_void:
|
case en_cond: case en_void:
|
case en_asadd: case en_assub:
|
case en_asadd: case en_assub:
|
case en_asmul: case en_asdiv:
|
case en_asmul: case en_asdiv:
|
case en_asor: case en_asand:
|
case en_asor: case en_asand:
|
case en_asmod: case en_aslsh:
|
case en_asmod: case en_aslsh:
|