changeset 918:9f00229d78ce

6875866: Intrinsic for String.indexOf() is broken on x86 with SSE4.2 Summary: Start rescan from the next element after the previous match. Reviewed-by: never
author kvn
date Wed, 26 Aug 2009 12:54:18 -0700
parents e502d7524e3a
children c41db48fadd5
files src/cpu/x86/vm/x86_32.ad src/cpu/x86/vm/x86_64.ad test/compiler/6875866/Test.java
diffstat 3 files changed, 60 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/cpu/x86/vm/x86_32.ad	Wed Aug 26 10:46:24 2009 -0700
+++ b/src/cpu/x86/vm/x86_32.ad	Wed Aug 26 12:54:18 2009 -0700
@@ -3991,6 +3991,13 @@
     masm.bind(LOAD_SUBSTR);
     masm.movptr(rdi, Address(rsp, 4));
     masm.movl(rax, Address(rsp, 0));
+    // We came here after the beginninig of the substring was
+    // matched but the rest of it was not so we need to search
+    // again. Start from the next element after the previous match.
+    masm.subptr(rsi, rbx); // Restore counter
+    masm.shrl(rsi, 1);
+    masm.addl(rdx, rsi);
+    masm.lea(rsi, Address(rbx, 2));
 
     // Load substr
     masm.bind(PREP_FOR_SCAN);
--- a/src/cpu/x86/vm/x86_64.ad	Wed Aug 26 10:46:24 2009 -0700
+++ b/src/cpu/x86/vm/x86_64.ad	Wed Aug 26 12:54:18 2009 -0700
@@ -3882,6 +3882,13 @@
     masm.bind(LOAD_SUBSTR);
     masm.movptr(rdi, Address(rsp, 8));
     masm.movl(rax, Address(rsp, 0));
+    // We came here after the beginninig of the substring was
+    // matched but the rest of it was not so we need to search
+    // again. Start from the next element after the previous match.
+    masm.subptr(rsi, rbx); // Restore counter
+    masm.shrl(rsi, 1);
+    masm.addl(rdx, rsi);
+    masm.lea(rsi, Address(rbx, 2));
 
     // Load substr
     masm.bind(PREP_FOR_SCAN);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/compiler/6875866/Test.java	Wed Aug 26 12:54:18 2009 -0700
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6875866
+ * @summary Intrinsic for String.indexOf() is broken on x86 with SSE4.2
+ *
+ * @run main -Xcomp Test
+ */
+
+public class Test {
+
+  static int IndexOfTest(String str) {
+    return str.indexOf("11111xx1x");
+  }
+
+  public static void main(String args[]) {
+    String str = "11111xx11111xx1x";
+    int idx = IndexOfTest(str);
+    System.out.println("IndexOf = " + idx);
+    if (idx != 7) {
+      System.exit(97);
+    }
+  }
+}