Fixed x86 compilation of filled-new-array/range.

Implemented loadBaseIndexed and found a way to implemented
filled-new-array/range using only 4 temps instead of 5 by regenerating
the target pointer value after the loop.

Change-Id: Ibb694600e6852ba3c4939c5878625655809c60fd
diff --git a/src/compiler/codegen/GenCommon.cc b/src/compiler/codegen/GenCommon.cc
index c9ba285..2209084 100644
--- a/src/compiler/codegen/GenCommon.cc
+++ b/src/compiler/codegen/GenCommon.cc
@@ -582,7 +582,8 @@
 #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 @@
     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++) {