More MIPS fixes. Many run-test tests pass.
Run-test tests 001-043 work, including 003-omnibus-opcodes. 044 is
proxy, which is still broken.
Changes made:
- Fixed argument marshalling of FP values for calls to helper functions
in the compiler.
- Fixed CheckCast compilation's mistaken use of rARG0 instead of rRET0.
- Fixed conversion calls to marshall FP arguments properly.
- Created named values for FP args, though they differ in MIPS only.
- Fixed assembly to always use T9 to hold code pointer to jump to.
- Fixed proxy offset values.
Change-Id: If121db322683a307e5a1016210f4f73283aa817c
diff --git a/src/compiler/codegen/GenCommon.cc b/src/compiler/codegen/GenCommon.cc
index 21f824d..7305271 100644
--- a/src/compiler/codegen/GenCommon.cc
+++ b/src/compiler/codegen/GenCommon.cc
@@ -216,18 +216,26 @@
int rTgt = loadHelper(cUnit, helperOffset);
#endif
if (arg0.wide == 0) {
- loadValueDirectFixed(cUnit, arg0, rARG0);
+ loadValueDirectFixed(cUnit, arg0, arg0.fp ? rFARG0 : rARG0);
if (arg1.wide == 0) {
+#if defined(TARGET_MIPS)
+ loadValueDirectFixed(cUnit, arg1, arg1.fp ? rFARG2 : rARG1);
+#else
loadValueDirectFixed(cUnit, arg1, rARG1);
+#endif
} else {
+#if defined(TARGET_MIPS)
+ loadValueDirectWideFixed(cUnit, arg1, arg1.fp ? rFARG2 : rARG1, arg1.fp ? rFARG3 : rARG2);
+#else
loadValueDirectWideFixed(cUnit, arg1, rARG1, rARG2);
+#endif
}
} else {
- loadValueDirectWideFixed(cUnit, arg0, rARG0, rARG1);
+ loadValueDirectWideFixed(cUnit, arg0, arg0.fp ? rFARG0 : rARG0, arg0.fp ? rFARG1 : rARG1);
if (arg1.wide == 0) {
- loadValueDirectFixed(cUnit, arg1, rARG2);
+ loadValueDirectFixed(cUnit, arg1, arg1.fp ? rFARG2 : rARG2);
} else {
- loadValueDirectWideFixed(cUnit, arg1, rARG2, rARG3);
+ loadValueDirectWideFixed(cUnit, arg1, arg1.fp ? rFARG2 : rARG2, arg1.fp ? rFARG3 : rARG3);
}
}
oatClobberCalleeSave(cUnit);
@@ -1400,7 +1408,7 @@
// InitializeTypeFromCode(idx, method)
callRuntimeHelperImmReg(cUnit, ENTRYPOINT_OFFSET(pInitializeTypeFromCode), type_idx, rARG1,
true);
- opRegCopy(cUnit, classReg, rARG0); // Align usage with fast path
+ opRegCopy(cUnit, classReg, rRET0); // Align usage with fast path
// Rejoin code paths
LIR* hopTarget = newLIR0(cUnit, kPseudoTargetLabel);
hopBranch->target = (LIR*)hopTarget;
@@ -2363,9 +2371,9 @@
*/
oatFlushAllRegs(cUnit); /* Send everything to home location */
if (rlSrc.wide) {
- loadValueDirectWideFixed(cUnit, rlSrc, rARG0, rARG1);
+ loadValueDirectWideFixed(cUnit, rlSrc, rlSrc.fp ? rFARG0 : rARG0, rlSrc.fp ? rFARG1 : rARG1);
} else {
- loadValueDirectFixed(cUnit, rlSrc, rARG0);
+ loadValueDirectFixed(cUnit, rlSrc, rlSrc.fp ? rFARG0 : rARG0);
}
callRuntimeHelperRegLocation(cUnit, funcOffset, rlSrc, false);
if (rlDest.wide) {
diff --git a/src/compiler/codegen/arm/ArmLIR.h b/src/compiler/codegen/arm/ArmLIR.h
index a40df20..1da567e 100644
--- a/src/compiler/codegen/arm/ArmLIR.h
+++ b/src/compiler/codegen/arm/ArmLIR.h
@@ -251,6 +251,10 @@
#define rARG1 r1
#define rARG2 r2
#define rARG3 r3
+#define rFARG0 r0
+#define rFARG1 r1
+#define rFARG2 r2
+#define rFARG3 r3
#define rRET0 r0
#define rRET1 r1
#define rINVOKE_TGT rLR
diff --git a/src/compiler/codegen/mips/FP/MipsFP.cc b/src/compiler/codegen/mips/FP/MipsFP.cc
index 437f1ed..990c71f 100644
--- a/src/compiler/codegen/mips/FP/MipsFP.cc
+++ b/src/compiler/codegen/mips/FP/MipsFP.cc
@@ -197,11 +197,11 @@
oatFlushAllRegs(cUnit);
oatLockCallTemps(cUnit);
if (wide) {
- loadValueDirectWideFixed(cUnit, rlSrc1, r_FARG0, r_FARG1);
- loadValueDirectWideFixed(cUnit, rlSrc2, r_FARG2, r_FARG3);
+ loadValueDirectWideFixed(cUnit, rlSrc1, rFARG0, rFARG1);
+ loadValueDirectWideFixed(cUnit, rlSrc2, rFARG2, rFARG3);
} else {
- loadValueDirectFixed(cUnit, rlSrc1, r_FARG0);
- loadValueDirectFixed(cUnit, rlSrc2, r_FARG2);
+ loadValueDirectFixed(cUnit, rlSrc1, rFARG0);
+ loadValueDirectFixed(cUnit, rlSrc2, rFARG2);
}
int rTgt = loadHelper(cUnit, offset);
// NOTE: not a safepoint
diff --git a/src/compiler/codegen/mips/MipsLIR.h b/src/compiler/codegen/mips/MipsLIR.h
index 5077c9f..4b7da55 100644
--- a/src/compiler/codegen/mips/MipsLIR.h
+++ b/src/compiler/codegen/mips/MipsLIR.h
@@ -301,6 +301,10 @@
#define rARG1 r_ARG1
#define rARG2 r_ARG2
#define rARG3 r_ARG3
+#define rFARG0 r_FARG0
+#define rFARG1 r_FARG1
+#define rFARG2 r_FARG2
+#define rFARG3 r_FARG3
#define rRET0 r_RESULT0
#define rRET1 r_RESULT1
#define rINVOKE_TGT r_T9
diff --git a/src/compiler/codegen/x86/X86LIR.h b/src/compiler/codegen/x86/X86LIR.h
index d3e3da8..8ad014a 100644
--- a/src/compiler/codegen/x86/X86LIR.h
+++ b/src/compiler/codegen/x86/X86LIR.h
@@ -238,6 +238,10 @@
#define rARG1 rCX
#define rARG2 rDX
#define rARG3 rBX
+#define rFARG0 rAX
+#define rFARG1 rCX
+#define rFARG2 rDX
+#define rFARG3 rBX
#define rRET0 rAX
#define rRET1 rDX
#define rINVOKE_TGT rAX