summaryrefslogtreecommitdiff
path: root/src/compiler/codegen/GenCommon.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/codegen/GenCommon.cc')
-rw-r--r--src/compiler/codegen/GenCommon.cc8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/compiler/codegen/GenCommon.cc b/src/compiler/codegen/GenCommon.cc
index c9ba285c5f..2209084934 100644
--- a/src/compiler/codegen/GenCommon.cc
+++ b/src/compiler/codegen/GenCommon.cc
@@ -582,7 +582,8 @@ void genFilledNewArray(CompilationUnit* cUnit, MIR* mir, bool isRange)
#if defined(TARGET_ARM)
int rVal = rLR; // Using a lot of temps, rLR is known free here
#elif defined(TARGET_X86)
- int rVal = rSrc;
+ oatFreeTemp(cUnit, rRET0);
+ int rVal = oatAllocTemp(cUnit);
#else
int rVal = oatAllocTemp(cUnit);
#endif
@@ -609,6 +610,11 @@ void genFilledNewArray(CompilationUnit* cUnit, MIR* mir, bool isRange)
opRegImm(cUnit, kOpSub, rIdx, 1);
opCmpImmBranch(cUnit, kCondGe, rIdx, 0, target);
#endif
+#if defined(TARGET_X86)
+ // Restore the target pointer
+ opRegRegImm(cUnit, kOpAdd, rRET0, rDst,
+ -Array::DataOffset(component_size).Int32Value());
+#endif
} else if (!isRange) {
// TUNING: interleave
for (unsigned int i = 0; i < dInsn->vA; i++) {