OSDN Git Service

ART's intrinsic for String.indexOf use the incorrect register
authorYevgeny Rouban <yevgeny.y.rouban@intel.com>
Thu, 13 Mar 2014 05:15:58 +0000 (12:15 +0700)
committerYevgeny Rouban <yevgeny.y.rouban@intel.com>
Thu, 13 Mar 2014 07:15:42 +0000 (14:15 +0700)
ART's intrinsic for String.indexOf of x86 platform use the incorrect register
to compare start with the string length. It should be fixed.

Change-Id: I22986b4d4b23f62b4bb97baab9fe43152d12145e
Signed-off-by: Vladimir Ivanov <vladimir.a.ivanov@intel.com>
Signed-off-by: Yevgeny Rouban <yevgeny.y.rouban@intel.com>
compiler/dex/quick/x86/target_x86.cc
test/082-inline-execute/src/Main.java

index 083fccb..3596fff 100644 (file)
@@ -1028,7 +1028,7 @@ bool X86Mir2Lir::GenInlinedIndexOf(CallInfo* info, bool zero_based) {
       } else {
         // Compare to memory to avoid a register load.  Handle pushed EDI.
         int displacement = SRegOffset(rl_start.s_reg_low) + sizeof(uint32_t);
-        OpRegMem(kOpCmp, rDX, rX86_SP, displacement);
+        OpRegMem(kOpCmp, rCX, rX86_SP, displacement);
         length_compare = NewLIR2(kX86Jcc8, 0, kX86CondLe);
         OpRegMem(kOpSub, rCX, rX86_SP, displacement);
       }
index f4d2dd1..86a03ab 100644 (file)
@@ -96,8 +96,10 @@ public class Main {
     }
   }
 
+  static int start;
   public static void test_String_indexOf() {
     String str0 = "";
+    String str1 = "/";
     String str3 = "abc";
     String str10 = "abcdefghij";
     String str40 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabc";
@@ -122,6 +124,7 @@ public class Main {
     Assert.assertEquals(str0.indexOf('a',20), -1);
     Assert.assertEquals(str0.indexOf('a',0), -1);
     Assert.assertEquals(str0.indexOf('a',-1), -1);
+    Assert.assertEquals(str1.indexOf('/',++start), -1);
     Assert.assertEquals(str3.indexOf('a',0), 0);
     Assert.assertEquals(str3.indexOf('a',1), -1);
     Assert.assertEquals(str3.indexOf('a',1234), -1);