fix preproc tags

git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@4302 1b9489fe-b721-0410-924e-b54b9192deb8
This commit is contained in:
Minero Aoki 2009-06-27 08:26:27 +00:00
parent 9ada80d267
commit 4ec1db3eea
1 changed files with 15 additions and 11 deletions

View File

@ -413,7 +413,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
// #@@range/cfb_offset{ // #@@range/cfb_offset{
AssemblyCode body = optimize(compileStmts(func)); AssemblyCode body = optimize(compileStmts(func));
frame.saveRegs = usedCalleeSavedRegisters(body); frame.saveRegs = usedCalleeSaveRegisters(body);
frame.tempSize = body.virtualStack.maxSize(); frame.tempSize = body.virtualStack.maxSize();
fixLocalVariableOffsets(func.lvarScope(), frame.lvarOffset()); fixLocalVariableOffsets(func.lvarScope(), frame.lvarOffset());
@ -494,10 +494,10 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
// #@@} // #@@}
// does NOT include BP // does NOT include BP
// #@@range/usedCalleeSavedRegisters{ // #@@range/usedCalleeSaveRegisters{
private List<Register> usedCalleeSavedRegisters(AssemblyCode body) { private List<Register> usedCalleeSaveRegisters(AssemblyCode body) {
List<Register> result = new ArrayList<Register>(); List<Register> result = new ArrayList<Register>();
for (Register reg : calleeSavedRegisters()) { for (Register reg : calleeSaveRegisters()) {
if (body.doesUses(reg)) { if (body.doesUses(reg)) {
result.add(reg); result.add(reg);
} }
@ -507,22 +507,22 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
} }
// #@@} // #@@}
static final RegisterClass[] CALLEE_SAVED_REGISTERS = { static final RegisterClass[] CALLEE_SAVE_REGISTERS = {
RegisterClass.BX, RegisterClass.BP, RegisterClass.BX, RegisterClass.BP,
RegisterClass.SI, RegisterClass.DI RegisterClass.SI, RegisterClass.DI
}; };
private List<Register> calleeSavedRegistersCache = null; private List<Register> calleeSaveRegistersCache = null;
private List<Register> calleeSavedRegisters() { private List<Register> calleeSaveRegisters() {
if (calleeSavedRegistersCache == null) { if (calleeSaveRegistersCache == null) {
List<Register> regs = new ArrayList<Register>(); List<Register> regs = new ArrayList<Register>();
for (RegisterClass c : CALLEE_SAVED_REGISTERS) { for (RegisterClass c : CALLEE_SAVE_REGISTERS) {
regs.add(new Register(c, naturalType)); regs.add(new Register(c, naturalType));
} }
calleeSavedRegistersCache = regs; calleeSaveRegistersCache = regs;
} }
return calleeSavedRegistersCache; return calleeSaveRegistersCache;
} }
// #@@range/generateFunctionBody{ // #@@range/generateFunctionBody{
@ -830,6 +830,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
case MUL: case MUL:
as.imul(right, left); as.imul(right, left);
break; break;
// #@@range/compileBinaryOp_sdiv{
case S_DIV: case S_DIV:
case S_MOD: case S_MOD:
as.cltd(); as.cltd();
@ -837,6 +838,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
if (op == Op.S_MOD) { if (op == Op.S_MOD) {
as.mov(dx(), left); as.mov(dx(), left);
} }
// #@@}
break; break;
case U_DIV: case U_DIV:
case U_MOD: case U_MOD:
@ -904,9 +906,11 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
as.not(ax(src)); as.not(ax(src));
break; break;
case NOT: case NOT:
// #@@range/Uni_not{
as.test(ax(src), ax(src)); as.test(ax(src), ax(src));
as.sete(al()); as.sete(al());
as.movzx(al(), ax(dest)); as.movzx(al(), ax(dest));
// #@@}
break; break;
case S_CAST: case S_CAST:
as.movsx(ax(src), ax(dest)); as.movsx(ax(src), ax(dest));