From: Dave G. <dgr...@us...> - 2006-07-13 14:50:20
|
Update of /cvsroot/jikesrvm/rvm/src/vm/arch/intel/compilers/optimizing/ir/conversions/mir2mc In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv32529 Modified Files: OPT_AssemblerBase.java Log Message: slightly restructure code and inject some debug to try to catch 1494784 in overnight tests. I've been unable to get it to fail when building normally on my machine since I put in the debug code Index: OPT_AssemblerBase.java =================================================================== RCS file: /cvsroot/jikesrvm/rvm/src/vm/arch/intel/compilers/optimizing/ir/conversions/mir2mc/OPT_AssemblerBase.java,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** OPT_AssemblerBase.java 14 Oct 2005 12:25:25 -0000 1.24 --- OPT_AssemblerBase.java 13 Jul 2006 14:50:03 -0000 1.25 *************** *** 497,501 **** return true; } ! switch (inst.getOpcode()) { case LABEL_opcode:case BBEND_opcode:case UNINT_BEGIN_opcode:case UNINT_END_opcode: // these generate no code --- 497,508 ---- return true; } ! budget -= estimateSize(inst); ! inst = inst.nextInstructionInCodeOrder(); ! } ! } ! ! private static int estimateSize(OPT_Instruction inst) { ! int size = 0; ! switch (inst.getOpcode()) { case LABEL_opcode:case BBEND_opcode:case UNINT_BEGIN_opcode:case UNINT_END_opcode: // these generate no code *************** *** 506,522 **** case IA32_OR_opcode:case IA32_SBB_opcode: case IA32_XOR_opcode: ! budget -= 2; // opcode + modr/m ! budget -= operandCost(MIR_BinaryAcc.getResult(inst), true); ! budget -= operandCost(MIR_BinaryAcc.getValue(inst), true); break; case IA32_CMP_opcode: ! budget -= 2; // opcode + modr/m ! budget -= operandCost(MIR_Compare.getVal1(inst), true); ! budget -= operandCost(MIR_Compare.getVal2(inst), true); break; case IA32_TEST_opcode: ! budget -= 2; // opcode + modr/m ! budget -= operandCost(MIR_Test.getVal1(inst), true); ! budget -= operandCost(MIR_Test.getVal2(inst), true); break; --- 513,529 ---- case IA32_OR_opcode:case IA32_SBB_opcode: case IA32_XOR_opcode: ! size += 2; // opcode + modr/m ! size += operandCost(MIR_BinaryAcc.getResult(inst), true); ! size += operandCost(MIR_BinaryAcc.getValue(inst), true); break; case IA32_CMP_opcode: ! size += 2; // opcode + modr/m ! size += operandCost(MIR_Compare.getVal1(inst), true); ! size += operandCost(MIR_Compare.getVal2(inst), true); break; case IA32_TEST_opcode: ! size += 2; // opcode + modr/m ! size += operandCost(MIR_Test.getVal1(inst), true); ! size += operandCost(MIR_Test.getVal2(inst), true); break; *************** *** 525,577 **** OPT_Operand op = MIR_UnaryNoRes.getVal(inst); if (op instanceof OPT_RegisterOperand) { ! budget -= 1; } else if (op instanceof OPT_IntConstantOperand) { if (fits(((OPT_IntConstantOperand)op).value,8)) { ! budget -= 2; } else { ! budget -= 5; } } else { ! budget -= (2+operandCost(op, true)); } } break; case IA32_MOV_opcode: ! budget -= 2; // opcode + modr/m ! budget -= operandCost(MIR_Move.getResult(inst), false); ! budget -= operandCost(MIR_Move.getValue(inst), false); break; case IA32_OFFSET_opcode: ! budget -= 4; break; case IA32_JCC_opcode: case IA32_JMP_opcode: ! budget -= 6; // assume long form break; case IA32_LOCK_opcode: ! budget -= 1; break; case IG_PATCH_POINT_opcode: ! budget -= 6; break; case IA32_INT_opcode: ! budget -= 2; break; case IA32_RET_opcode: ! budget -= 3; break; default: ! budget -= 3; // 2 bytes opcode + 1 byte modr/m for (OPT_OperandEnumeration opEnum = inst.getRootOperands(); opEnum.hasMoreElements();) { OPT_Operand op = opEnum.next(); ! budget -= operandCost(op, false); } break; } ! inst = inst.nextInstructionInCodeOrder(); ! } } ! ! private int operandCost(OPT_Operand op, boolean shortFormImmediate) { if (op instanceof OPT_MemoryOperand) { int cost = 1; // might need SIB byte --- 532,583 ---- OPT_Operand op = MIR_UnaryNoRes.getVal(inst); if (op instanceof OPT_RegisterOperand) { ! size += 1; } else if (op instanceof OPT_IntConstantOperand) { if (fits(((OPT_IntConstantOperand)op).value,8)) { ! size += 2; } else { ! size += 5; } } else { ! size += (2+operandCost(op, true)); } } break; case IA32_MOV_opcode: ! size += 2; // opcode + modr/m ! size += operandCost(MIR_Move.getResult(inst), false); ! size += operandCost(MIR_Move.getValue(inst), false); break; case IA32_OFFSET_opcode: ! size += 4; break; case IA32_JCC_opcode: case IA32_JMP_opcode: ! size += 6; // assume long form break; case IA32_LOCK_opcode: ! size += 1; break; case IG_PATCH_POINT_opcode: ! size += 6; break; case IA32_INT_opcode: ! size += 2; break; case IA32_RET_opcode: ! size += 3; break; default: ! size += 3; // 2 bytes opcode + 1 byte modr/m for (OPT_OperandEnumeration opEnum = inst.getRootOperands(); opEnum.hasMoreElements();) { OPT_Operand op = opEnum.next(); ! size += operandCost(op, false); } break; } ! return size; } ! ! private static int operandCost(OPT_Operand op, boolean shortFormImmediate) { if (op instanceof OPT_MemoryOperand) { int cost = 1; // might need SIB byte *************** *** 700,706 **** p != null; p = p.nextInstructionInCodeOrder()) { ! asm.doInst(p); } ! ir.MIRInfo.machinecode = asm.getMachineCodes(); --- 706,728 ---- p != null; p = p.nextInstructionInCodeOrder()) { ! int start = asm.getMachineCodeIndex(); ! int estimate = estimateSize(p); ! try { ! asm.doInst(p); ! } catch (RuntimeException e) { ! System.err.println("Failed while assembling "+p.toString()); ! ir.printInstructions(); ! int end = asm.getMachineCodeIndex(); ! if (start-end > estimate) { ! VM.sysWriteln("Bad estimate: "+(start-end)+" "+estimate+" "+p); ! } ! VM._assert(false); ! } ! int end = asm.getMachineCodeIndex(); ! if (start-end > estimate) { ! VM.sysWriteln("Bad estimate: "+(start-end)+" "+estimate+" "+p); ! } } ! ir.MIRInfo.machinecode = asm.getMachineCodes(); |