FP breakage workaround
This should get the x86 runtests passing again until I track down
the root cause. The bug is related to the invoke/move_result fusing,
but the problem remained after fixing the issue with x86 using a
different return register for floats. This CL disables the fusing for
x86.
Change-Id: Id2b2ebc5ebd4089fe3053d8f077dcadba3466de0
diff --git a/src/compiler/codegen/MethodCodegenDriver.cc b/src/compiler/codegen/MethodCodegenDriver.cc
index e06cf3f..edf880b 100644
--- a/src/compiler/codegen/MethodCodegenDriver.cc
+++ b/src/compiler/codegen/MethodCodegenDriver.cc
@@ -159,10 +159,10 @@
if (info->result.location != kLocInvalid) {
// We have a following MOVE_RESULT - do it now.
if (info->result.wide) {
- RegLocation retLoc = oatGetReturnWide(cUnit, false);
+ RegLocation retLoc = oatGetReturnWide(cUnit, info->result.fp);
storeValueWide(cUnit, info->result, retLoc);
} else {
- RegLocation retLoc = oatGetReturn(cUnit, false);
+ RegLocation retLoc = oatGetReturn(cUnit, info->result.fp);
storeValue(cUnit, info->result, retLoc);
}
}
@@ -179,6 +179,9 @@
{
CallInfo* info = (CallInfo*)oatNew(cUnit, sizeof(CallInfo), true,
kAllocMisc);
+#if defined(TARGET_X86)
+ info->result.location = kLocInvalid;
+#else
MIR* moveResultMIR = oatFindMoveResult(cUnit, bb, mir);
if (moveResultMIR == NULL) {
info->result.location = kLocInvalid;
@@ -186,6 +189,7 @@
info->result = oatGetRawDest(cUnit, moveResultMIR);
moveResultMIR->dalvikInsn.opcode = Instruction::NOP;
}
+#endif
info->numArgWords = mir->ssaRep->numUses;
info->args = (info->numArgWords == 0) ? NULL : (RegLocation*)
oatNew(cUnit, sizeof(RegLocation) * info->numArgWords, false, kAllocMisc);