TestStringIntrinsics2.java revision 10049:73443d24e529
1215976Sjmallett/*
2232812Sjmallett * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
3215976Sjmallett * Copyright (c) 2016 SAP SE. All rights reserved.
4215976Sjmallett * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5215976Sjmallett *
6215976Sjmallett * This code is free software; you can redistribute it and/or modify it
7215976Sjmallett * under the terms of the GNU General Public License version 2 only, as
8215976Sjmallett * published by the Free Software Foundation.
9215976Sjmallett *
10215976Sjmallett * This code is distributed in the hope that it will be useful, but WITHOUT
11215976Sjmallett * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12215976Sjmallett * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13215976Sjmallett * version 2 for more details (a copy is included in the LICENSE file that
14215976Sjmallett * accompanied this code).
15215976Sjmallett *
16215976Sjmallett * You should have received a copy of the GNU General Public License version
17215976Sjmallett * 2 along with this work; if not, write to the Free Software Foundation,
18232812Sjmallett * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19215976Sjmallett *
20215976Sjmallett * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21215976Sjmallett * or visit www.oracle.com if you need additional information or have any
22215976Sjmallett * questions.
23215976Sjmallett */
24215976Sjmallett
25215976Sjmallett/*
26215976Sjmallett * @test
27215976Sjmallett * @bug 8145336
28215976Sjmallett * @summary PPC64: fix string intrinsics after CompactStrings change
29232812Sjmallett * @library /testlibrary /../../test/lib
30215976Sjmallett * @build sun.hotspot.WhiteBox
31215976Sjmallett * @run main ClassFileInstaller sun.hotspot.WhiteBox
32215976Sjmallett *                              sun.hotspot.WhiteBox$WhiteBoxPermission
33215976Sjmallett *
34215976Sjmallett * @run main/othervm
35215976Sjmallett *        -Xbootclasspath/a:.
36215976Sjmallett *        -XX:+UnlockDiagnosticVMOptions
37215976Sjmallett *        -XX:+WhiteBoxAPI
38215976Sjmallett *        -XX:MaxInlineSize=100
39215976Sjmallett *        -XX:MinInliningThreshold=0
40215976Sjmallett *        TestStringIntrinsics2
41215976Sjmallett */
42215976Sjmallett
43215976Sjmallettimport java.lang.annotation.ElementType;
44215976Sjmallettimport java.lang.annotation.RetentionPolicy;
45215976Sjmallettimport java.lang.annotation.Retention;
46215976Sjmallettimport java.lang.annotation.Target;
47215976Sjmallettimport java.lang.reflect.Method;
48215976Sjmallettimport java.util.Arrays;
49215976Sjmallettimport java.util.function.Consumer;
50215976Sjmallettimport java.util.function.Function;
51215976Sjmallett
52232812Sjmallettimport static jdk.test.lib.Asserts.*;
53232812Sjmallettimport sun.hotspot.WhiteBox;
54215976Sjmallett
55215976Sjmallettpublic class TestStringIntrinsics2 {
56215976Sjmallett    // ------------------------------------------------------------------------
57215976Sjmallett    //
58215976Sjmallett    // We test the following cases:
59215976Sjmallett    // - no match in string.  Do we miss the end condition? Will crash if we read
60215976Sjmallett    //   past the string.
61215976Sjmallett    // - no match in string, but after the string there is a match.
62215976Sjmallett    //   Do we incorrectly report this match?  We had a case where we stepped
63215976Sjmallett    //   a few chars past the string, this test would report that error. The
64215976Sjmallett    //   one above would not.
65215976Sjmallett    // - The needle is exactly at the end of the string.
66215976Sjmallett    // - The needle spans the end of the string
67215976Sjmallett    //
68215976Sjmallett    // A special case are needles of length 1. For these we test:
69215976Sjmallett    // - needle is first char
70215976Sjmallett    // - needle is last char
71215976Sjmallett    // - no match
72215976Sjmallett    // - match behind string.
73215976Sjmallett    //
74215976Sjmallett    // We test all these for an unknown needle, and needles known to the compiler
75215976Sjmallett    // of lengths 5, 2 and 1.
76215976Sjmallett
77215976Sjmallett
78215976Sjmallett    private static final WhiteBox WB = WhiteBox.getWhiteBox();
79215976Sjmallett
80215976Sjmallett    public enum Role {
81215976Sjmallett        TEST_ENTRY,
82215976Sjmallett        TEST_HELPER
83215976Sjmallett    }
84215976Sjmallett
85215976Sjmallett    @Retention(RetentionPolicy.RUNTIME)
86215976Sjmallett    @Target(ElementType.METHOD)
87215976Sjmallett    @interface Test {
88215976Sjmallett        Role role();
89215976Sjmallett        int compileAt() default 0;
90215976Sjmallett        int warmup() default 0;
91215976Sjmallett        String[] warmupArgs() default {};
92215976Sjmallett    }
93215976Sjmallett
94215976Sjmallett    // All this mess is needed to avoid try/catch inside the lambdas below.
95215976Sjmallett    // See: http://stackoverflow.com/questions/27644361/how-can-i-throw-checked-exceptions-from-inside-java-8-streams
96215976Sjmallett    @SuppressWarnings ("unchecked")
97215976Sjmallett    private static <E extends Throwable> void throwAsUnchecked(Exception exception) throws E {
98215976Sjmallett        throw (E)exception;
99215976Sjmallett    }
100215976Sjmallett    @FunctionalInterface
101215976Sjmallett    public interface Consumer_WithExceptions<T, E extends Exception> {
102215976Sjmallett        void accept(T t) throws E;
103215976Sjmallett    }
104215976Sjmallett    public static <T, E extends Exception> Consumer<T> rethrowConsumer(Consumer_WithExceptions<T, E> consumer) {
105215976Sjmallett        return t -> {
106215976Sjmallett            try { consumer.accept(t); }
107215976Sjmallett            catch (Exception exception) { throwAsUnchecked(exception); }
108215976Sjmallett        };
109215976Sjmallett    }
110215976Sjmallett
111215976Sjmallett    public static void main(String[] args) throws Exception {
112215976Sjmallett
113215976Sjmallett        // Warmup helper methods
114215976Sjmallett        Arrays.stream(TestStringIntrinsics2.class.getDeclaredMethods())
115215976Sjmallett            .filter(m -> m.isAnnotationPresent(Test.class))
116215976Sjmallett            .filter(m -> m.getAnnotation(Test.class).warmup() > 0)
117215976Sjmallett            .forEach(rethrowConsumer(m -> {
118215976Sjmallett                        Test a = m.getAnnotation(Test.class);
119215976Sjmallett                        System.out.println("Warming up " + m + " " + a.warmup() + " time(s) ");
120215976Sjmallett                        for (int i=0; i < a.warmup(); i++) {
121215976Sjmallett                            m.invoke(null, (Object[])a.warmupArgs());
122215976Sjmallett                        }
123215976Sjmallett                    }));
124215976Sjmallett
125215976Sjmallett        // Compile helper methods
126215976Sjmallett        Arrays.stream(TestStringIntrinsics2.class.getDeclaredMethods())
127215976Sjmallett            .filter(m -> m.isAnnotationPresent(Test.class))
128215976Sjmallett            .filter(m -> m.getAnnotation(Test.class).compileAt() > 0)
129215976Sjmallett            .forEach(rethrowConsumer(m -> {
130215976Sjmallett                        Test a = m.getAnnotation(Test.class);
131215976Sjmallett                        if (WB.isMethodCompilable(m, a.compileAt())) {
132215976Sjmallett                            WB.enqueueMethodForCompilation(m, a.compileAt());
133215976Sjmallett                            while (WB.isMethodQueuedForCompilation(m)) Thread.sleep(10);
134215976Sjmallett                            System.out.println(m + " compiled at " + WB.getMethodCompilationLevel(m));
135215976Sjmallett                        } else {
136215976Sjmallett                            System.out.println("Can't compile " + m + " at level " + a.compileAt());
137215976Sjmallett                        }
138215976Sjmallett                    }));
139215976Sjmallett
140215976Sjmallett        // Run test methods
141215976Sjmallett        Arrays.stream(TestStringIntrinsics2.class.getDeclaredMethods())
142215976Sjmallett            .filter(m -> m.isAnnotationPresent(Test.class))
143215976Sjmallett            .filter(m -> m.getAnnotation(Test.class).role() == Role.TEST_ENTRY)
144215976Sjmallett            .forEach(rethrowConsumer(m -> {
145215976Sjmallett                        System.out.print("Executing " + m);
146215976Sjmallett                        m.invoke(null, (Object[])null);
147215976Sjmallett                        System.out.println(" - OK");
148215976Sjmallett                    }));
149215976Sjmallett    }
150215976Sjmallett
151215976Sjmallett    static String text = "<t><t><t><t><t><t>\n" + "<hit>";
152215976Sjmallett    static String text2 = "<t><t><t><t><t><t><t>\n" + "<hit>";
153215976Sjmallett    static String[] ss = text.split("\n");
154215976Sjmallett    static String[] ss2 = null;
155215976Sjmallett    static String needle = "<miss>";
156215976Sjmallett
157215976Sjmallett    @Test(role = Role.TEST_ENTRY)
158215976Sjmallett    public static void test_indexOf_no_match() {
159215976Sjmallett        int res = indexOf_no_match_unknown_needle(ss[0], "<miss>");
160215976Sjmallett        assertEquals(res, -1, "test_indexOf_no_match_unknown_needle matched at: " + res);
161215976Sjmallett        res = indexOf_no_match_imm_needle(ss[0]);
162215976Sjmallett        assertEquals(res, -1, "test_indexOf_no_match_imm_needle matched at: " + res);
163215976Sjmallett        res = indexOf_no_match_imm2_needle(ss[0]);
164215976Sjmallett        assertEquals(res, -1, "test_indexOf_no_match_imm2_needle matched at: " + res);
165215976Sjmallett
166215976Sjmallett        if (ss2 == null) ss2 = text.split("\n");
167215976Sjmallett        res = indexOf_no_match_unknown_needle(ss2[0], "<miss>");
168215976Sjmallett        assertEquals(res, -1, "test_indexOf_no_match_unknown_needle matched at: " + res);
169215976Sjmallett        res = indexOf_no_match_imm_needle(ss2[0]);
170215976Sjmallett        assertEquals(res, -1, "test_indexOf_no_match_imm_needle matched at: " + res);
171215976Sjmallett        res = indexOf_no_match_imm2_needle(ss2[0]);
172215976Sjmallett        assertEquals(res, -1, "test_indexOf_no_match_imm2_needle matched at: " + res);
173215976Sjmallett        res = indexOf_no_match_imm1_needle(ss2[0]);
174215976Sjmallett        assertEquals(res, -1, "test_indexOf_no_match_imm1_needle matched at: " + res);
175215976Sjmallett    }
176215976Sjmallett
177215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>", "<miss>" })
178215976Sjmallett    static int indexOf_no_match_unknown_needle(String s, String needle) {
179215976Sjmallett        int index = s.indexOf(needle);
180215976Sjmallett        return index;
181215976Sjmallett    }
182215976Sjmallett
183215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" })
184215976Sjmallett    static int indexOf_no_match_imm_needle(String s) {
185215976Sjmallett        int index = s.indexOf("<hitt>");
186215976Sjmallett        return index;
187215976Sjmallett    }
188215976Sjmallett
189215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" })
190215976Sjmallett    static int indexOf_no_match_imm2_needle(String s) {
191215976Sjmallett        int index = s.indexOf("<m");
192215976Sjmallett        return index;
193215976Sjmallett    }
194232812Sjmallett
195215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" })
196232812Sjmallett    static int indexOf_no_match_imm1_needle(String s) {
197232812Sjmallett        int index = s.indexOf("m");
198215976Sjmallett        return index;
199215976Sjmallett    }
200215976Sjmallett
201215976Sjmallett    @Test(role = Role.TEST_ENTRY)
202215976Sjmallett    public static void test_indexOf_reads_past_string() {
203215976Sjmallett        if (ss == null) ss = text.split("\n");
204215976Sjmallett        String res = indexOf_reads_past_string_unknown_needle(ss[0], "<hit>");
205215976Sjmallett        assertEquals(res, null, "test_indexOf_reads_past_string_unknown_needle " + res);
206215976Sjmallett        res = indexOf_reads_past_string_imm_needle(ss[0]);
207215976Sjmallett        assertEquals(res, null, "test_indexOf_reads_past_string_imm_needle " + res);
208215976Sjmallett        res = indexOf_reads_past_string_imm2_needle(ss[0]);
209215976Sjmallett        assertEquals(res, null, "test_indexOf_reads_past_string_imm2_needle " + res);
210215976Sjmallett        res = indexOf_reads_past_string_imm1_needle(ss[0]);
211215976Sjmallett        assertEquals(res, null, "test_indexOf_reads_past_string_imm1_needle " + res);
212215976Sjmallett    }
213215976Sjmallett
214215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>", "<hit>" })
215215976Sjmallett    static String indexOf_reads_past_string_unknown_needle(String s, String needle) {
216215976Sjmallett        int index = s.indexOf(needle);
217215976Sjmallett        if (index > s.length()) {
218215976Sjmallett            return "Found needle \"" + needle + "\" behind string of length " + s.length()
219215976Sjmallett                + " at position " + index + ".";
220215976Sjmallett        }
221215976Sjmallett        return null;
222215976Sjmallett    }
223215976Sjmallett
224215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" })
225215976Sjmallett    static String indexOf_reads_past_string_imm_needle(String s) {
226215976Sjmallett        int index = s.indexOf("<hit>");
227215976Sjmallett        if (index > s.length()) {
228215976Sjmallett            return "Found needle \"<hit>\" behind string of length " + s.length() + " at position " + index + ".";
229215976Sjmallett        }
230215976Sjmallett        return null;
231215976Sjmallett    }
232215976Sjmallett
233215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" })
234215976Sjmallett    static String indexOf_reads_past_string_imm2_needle(String s) {
235215976Sjmallett        int index = s.indexOf("<h");
236215976Sjmallett        if (index > s.length()) {
237215976Sjmallett            return "Found needle \"<h\" behind string of length " + s.length() + " at position " + index + ".";
238215976Sjmallett        }
239215976Sjmallett        return null;
240215976Sjmallett    }
241215976Sjmallett
242215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t>" })
243215976Sjmallett    static String indexOf_reads_past_string_imm1_needle(String s) {
244215976Sjmallett        int index = s.indexOf("h");
245232812Sjmallett        if (index > s.length()) {
246215976Sjmallett            return "Found needle \"<h\" behind string of length " + s.length() + " at position " + index + ".";
247232812Sjmallett        }
248232812Sjmallett        return null;
249215976Sjmallett    }
250215976Sjmallett
251215976Sjmallett    static String text3 =    "<t><hi><t><h><hit<t><hit>";
252215976Sjmallett    static String text4 =   "a<t><hi><t><h><hit<t><hit>";
253215976Sjmallett    static String text5 =  "gg<t><hi><t><h><hit<t><hit>";
254215976Sjmallett    static String text6 = "ccc<t><hi><t><h><hit<t><hit>";
255215976Sjmallett    static int len3 = text3.length();
256215976Sjmallett    static int len4 = text4.length();
257215976Sjmallett    static int len5 = text5.length();
258215976Sjmallett    static int len6 = text6.length();
259215976Sjmallett
260215976Sjmallett    static String text7  =    "<t><t><t><t><t<t><h";
261215976Sjmallett    static String text8  =   "a<t><t><t><t><t<t><h";
262215976Sjmallett    static String text9  =  "gg<t><t><t><t><t<t><h";
263215976Sjmallett    static String text10 = "ccc<t><t><t><t><t<t><h";
264215976Sjmallett
265215976Sjmallett    @Test(role = Role.TEST_ENTRY)
266215976Sjmallett    public static void test_indexOf_match_at_end_of_string() {
267215976Sjmallett        String testname = "test_indexOf_match_at_end_of_string";
268215976Sjmallett        int res = 0;
269215976Sjmallett        res = indexOf_match_at_end_of_string_unknown_needle(text3, "<hit>");
270215976Sjmallett        assertEquals(len3, res + 5, testname);
271215976Sjmallett        res = indexOf_match_at_end_of_string_unknown_needle(text4, "<hit>");
272215976Sjmallett        assertEquals(len4, res + 5, testname);
273215976Sjmallett        res = indexOf_match_at_end_of_string_unknown_needle(text5, "<hit>");
274215976Sjmallett        assertEquals(len5, res + 5, testname);
275215976Sjmallett        res = indexOf_match_at_end_of_string_unknown_needle(text6, "<hit>");
276215976Sjmallett        assertEquals(len6, res + 5, testname);
277215976Sjmallett
278215976Sjmallett        res = indexOf_match_at_end_of_string_imm_needle(text3);
279215976Sjmallett        assertEquals(len3, res + 5, testname);
280215976Sjmallett        res = indexOf_match_at_end_of_string_imm_needle(text4);
281215976Sjmallett        assertEquals(len4, res + 5, testname);
282215976Sjmallett        res = indexOf_match_at_end_of_string_imm_needle(text5);
283215976Sjmallett        assertEquals(len5, res + 5, testname);
284215976Sjmallett        res = indexOf_match_at_end_of_string_imm_needle(text6);
285215976Sjmallett        assertEquals(len6, res + 5, testname);
286215976Sjmallett
287215976Sjmallett        res = indexOf_match_at_end_of_string_imm2_needle(text7);
288215976Sjmallett        assertEquals(text7.length(),  res + 2, testname);
289215976Sjmallett        res = indexOf_match_at_end_of_string_imm2_needle(text8);
290232812Sjmallett        assertEquals(text8.length(),  res + 2, testname);
291215976Sjmallett        res = indexOf_match_at_end_of_string_imm2_needle(text9);
292232812Sjmallett        assertEquals(text9.length(),  res + 2, testname);
293232812Sjmallett        res = indexOf_match_at_end_of_string_imm2_needle(text10);
294215976Sjmallett        assertEquals(text10.length(), res + 2, testname);
295215976Sjmallett
296215976Sjmallett        res = indexOf_match_at_end_of_string_imm1_needle(text7);
297215976Sjmallett        assertEquals(text7.length(),  res + 1, testname);
298215976Sjmallett        res = indexOf_match_at_end_of_string_imm1_needle(text8);
299215976Sjmallett        assertEquals(text8.length(),  res + 1, testname);
300215976Sjmallett        res = indexOf_match_at_end_of_string_imm1_needle(text9);
301215976Sjmallett        assertEquals(text9.length(),  res + 1, testname);
302215976Sjmallett        res = indexOf_match_at_end_of_string_imm1_needle(text10);
303215976Sjmallett        assertEquals(text10.length(), res + 1, testname);
304215976Sjmallett    }
305215976Sjmallett
306215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit>", "<hit>" })
307215976Sjmallett    static int indexOf_match_at_end_of_string_unknown_needle(String s, String needle) {
308215976Sjmallett        int index = s.indexOf(needle);
309215976Sjmallett        return index;
310215976Sjmallett    }
311215976Sjmallett
312215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit>" })
313215976Sjmallett    static int indexOf_match_at_end_of_string_imm_needle(String s) {
314215976Sjmallett        int index = s.indexOf("<hit>");
315215976Sjmallett        return index;
316215976Sjmallett    }
317215976Sjmallett
318215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit>" })
319215976Sjmallett    static int indexOf_match_at_end_of_string_imm2_needle(String s) {
320215976Sjmallett        int index = s.indexOf("<h");
321215976Sjmallett        return index;
322215976Sjmallett    }
323215976Sjmallett
324215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit>" })
325215976Sjmallett    static int indexOf_match_at_end_of_string_imm1_needle(String s) {
326215976Sjmallett        int index = s.indexOf("h");
327215976Sjmallett        return index;
328215976Sjmallett    }
329215976Sjmallett
330215976Sjmallett    static String s0_1 = text3.substring(0, len3-1);
331215976Sjmallett    static String s0_2 = text3.substring(0, len3-2);
332215976Sjmallett    static String s0_3 = text3.substring(0, len3-3);
333215976Sjmallett    static String s0_4 = text3.substring(0, len3-4);
334215976Sjmallett    static String s1_1 = text4.substring(0, len4-1);
335232812Sjmallett    static String s1_2 = text4.substring(0, len4-2);
336215976Sjmallett    static String s1_3 = text4.substring(0, len4-3);
337232812Sjmallett    static String s1_4 = text4.substring(0, len4-4);
338232812Sjmallett    static String s2_1 = text5.substring(0, len5-1);
339215976Sjmallett    static String s2_2 = text5.substring(0, len5-2);
340215976Sjmallett    static String s2_3 = text5.substring(0, len5-3);
341215976Sjmallett    static String s2_4 = text5.substring(0, len5-4);
342215976Sjmallett    static String s3_1 = text6.substring(0, len6-1);
343215976Sjmallett    static String s3_2 = text6.substring(0, len6-2);
344215976Sjmallett    static String s3_3 = text6.substring(0, len6-3);
345215976Sjmallett    static String s3_4 = text6.substring(0, len6-4);
346215976Sjmallett
347215976Sjmallett    static String s0_1x = text7 .substring(0, text7 .length()-1);
348215976Sjmallett    static String s1_1x = text8 .substring(0, text8 .length()-1);
349215976Sjmallett    static String s2_1x = text9 .substring(0, text9 .length()-1);
350215976Sjmallett    static String s3_1x = text10.substring(0, text10.length()-1);
351215976Sjmallett
352215976Sjmallett    @Test(role = Role.TEST_ENTRY)
353215976Sjmallett    public static void test_indexOf_match_spans_end_of_string() {
354215976Sjmallett        String res = null;
355215976Sjmallett        res = indexOf_match_spans_end_of_string_unknown_needle(s0_1, "<hit>");
356215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s0_1 " + res);
357215976Sjmallett        res = indexOf_match_spans_end_of_string_unknown_needle(s0_2, "<hit>");
358215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s0_2 " + res);
359215976Sjmallett        res = indexOf_match_spans_end_of_string_unknown_needle(s0_3, "<hit>");
360215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s0_3 " + res);
361215976Sjmallett        res = indexOf_match_spans_end_of_string_unknown_needle(s0_4, "<hit>");
362215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s0_4 " + res);
363215976Sjmallett        res = indexOf_match_spans_end_of_string_unknown_needle(s1_1, "<hit>");
364215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s1_1 " + res);
365215976Sjmallett        res = indexOf_match_spans_end_of_string_unknown_needle(s1_2, "<hit>");
366215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s1_2 " + res);
367215976Sjmallett        res = indexOf_match_spans_end_of_string_unknown_needle(s1_3, "<hit>");
368215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s1_3 " + res);
369215976Sjmallett        res = indexOf_match_spans_end_of_string_unknown_needle(s1_4, "<hit>");
370215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s1_4 " + res);
371215976Sjmallett        res = indexOf_match_spans_end_of_string_unknown_needle(s2_1, "<hit>");
372215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s2_1 " + res);
373215976Sjmallett        res = indexOf_match_spans_end_of_string_unknown_needle(s2_2, "<hit>");
374215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s2_2 " + res);
375215976Sjmallett        res = indexOf_match_spans_end_of_string_unknown_needle(s2_3, "<hit>");
376215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s2_3 " + res);
377215976Sjmallett        res = indexOf_match_spans_end_of_string_unknown_needle(s2_4, "<hit>");
378215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s2_4 " + res);
379215976Sjmallett        res = indexOf_match_spans_end_of_string_unknown_needle(s3_1, "<hit>");
380215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s3_1 " + res);
381232812Sjmallett        res = indexOf_match_spans_end_of_string_unknown_needle(s3_2, "<hit>");
382215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s3_2 " + res);
383232812Sjmallett        res = indexOf_match_spans_end_of_string_unknown_needle(s3_3, "<hit>");
384232812Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s3_3 " + res);
385215976Sjmallett        res = indexOf_match_spans_end_of_string_unknown_needle(s3_4, "<hit>");
386215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_unknown_needle s3_4 " + res);
387215976Sjmallett
388215976Sjmallett        res = indexOf_match_spans_end_of_string_imm_needle(s0_1);
389215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s0_1 " + res);
390215976Sjmallett        res = indexOf_match_spans_end_of_string_imm_needle(s0_2);
391215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s0_2 " + res);
392215976Sjmallett        res = indexOf_match_spans_end_of_string_imm_needle(s0_3);
393215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s0_3 " + res);
394215976Sjmallett        res = indexOf_match_spans_end_of_string_imm_needle(s0_4);
395215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s0_4 " + res);
396215976Sjmallett        res = indexOf_match_spans_end_of_string_imm_needle(s1_1);
397215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s1_1 " + res);
398215976Sjmallett        res = indexOf_match_spans_end_of_string_imm_needle(s1_2);
399215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s1_2 " + res);
400215976Sjmallett        res = indexOf_match_spans_end_of_string_imm_needle(s1_3);
401215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s1_3 " + res);
402215976Sjmallett        res = indexOf_match_spans_end_of_string_imm_needle(s1_4);
403215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s1_4 " + res);
404215976Sjmallett        res = indexOf_match_spans_end_of_string_imm_needle(s2_1);
405215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s2_1 " + res);
406215976Sjmallett        res = indexOf_match_spans_end_of_string_imm_needle(s2_2);
407215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s2_2 " + res);
408215976Sjmallett        res = indexOf_match_spans_end_of_string_imm_needle(s2_3);
409215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s2_3 " + res);
410215976Sjmallett        res = indexOf_match_spans_end_of_string_imm_needle(s2_4);
411215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s2_4 " + res);
412215976Sjmallett        res = indexOf_match_spans_end_of_string_imm_needle(s3_1);
413215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s3_1 " + res);
414215976Sjmallett        res = indexOf_match_spans_end_of_string_imm_needle(s3_2);
415215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s3_2 " + res);
416215976Sjmallett        res = indexOf_match_spans_end_of_string_imm_needle(s3_3);
417215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s3_3 " + res);
418215976Sjmallett        res = indexOf_match_spans_end_of_string_imm_needle(s3_4);
419215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm_needle s3_4 " + res);
420215976Sjmallett
421215976Sjmallett        res = indexOf_match_spans_end_of_string_imm2_needle(s0_1x);
422215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm2_needle s0_1x " + res);
423215976Sjmallett        res = indexOf_match_spans_end_of_string_imm2_needle(s1_1x);
424215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm2_needle s1_1x " + res);
425215976Sjmallett        res = indexOf_match_spans_end_of_string_imm2_needle(s2_1x);
426215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm2_needle s2_1x " + res);
427215976Sjmallett        res = indexOf_match_spans_end_of_string_imm2_needle(s3_1x);
428215976Sjmallett        assertEquals(res, null, "test_indexOf_match_spans_end_of_string_imm2_needle s3_1x " + res);
429215976Sjmallett    }
430215976Sjmallett
431215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit", "<hit>" })
432215976Sjmallett    static String indexOf_match_spans_end_of_string_unknown_needle(String s, String needle) {
433215976Sjmallett        int index = s.indexOf(needle);
434215976Sjmallett        if (index > -1) {
435215976Sjmallett            return "Found needle \"" + needle + "\" that is spanning the end of the string: " + s + ".";
436215976Sjmallett        }
437215976Sjmallett        return null;
438215976Sjmallett    }
439215976Sjmallett
440215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><hi><t><h><hit<t><hit" })
441215976Sjmallett    static String indexOf_match_spans_end_of_string_imm_needle(String s) {
442215976Sjmallett        int index = s.indexOf("<hit>");
443232812Sjmallett        if (index > -1) {
444215976Sjmallett            return "Found needle \"<hit>\" that is spanning the end of the string: " + s + ".";
445232812Sjmallett        }
446232812Sjmallett        return null;
447215976Sjmallett    }
448215976Sjmallett
449215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "<t><t><t><t><t<t><" })
450215976Sjmallett    static String indexOf_match_spans_end_of_string_imm2_needle(String s) {
451215976Sjmallett        int index = s.indexOf("<h");
452215976Sjmallett        if (index > -1) {
453215976Sjmallett            return "Found needle \"<h\" that is spanning the end of the string: " + s + ".";
454215976Sjmallett        }
455215976Sjmallett        return null;
456215976Sjmallett    }
457215976Sjmallett
458215976Sjmallett    static String text16 = "ooooooo";
459215976Sjmallett    static String text11 = "1ooooooo";
460215976Sjmallett    static String text12 = "ooooooo1";
461215976Sjmallett    static String text13 = "oooooooo1";
462215976Sjmallett    static String text14 = "ooooooooo1";
463215976Sjmallett    static String text15 = "oooooooooo1";
464215976Sjmallett    static int len12 = text12.length();
465215976Sjmallett    static int len13 = text13.length();
466232812Sjmallett    static int len14 = text14.length();
467232812Sjmallett    static int len15 = text15.length();
468215976Sjmallett
469215976Sjmallett    static String text12_1 = text12.substring(0, len12-1);
470215976Sjmallett    static String text13_1 = text13.substring(0, len13-1);
471215976Sjmallett    static String text14_1 = text14.substring(0, len14-1);
472215976Sjmallett    static String text15_1 = text15.substring(0, len15-1);
473215976Sjmallett
474215976Sjmallett    @Test(role = Role.TEST_ENTRY)
475215976Sjmallett    public static void test_indexOf_imm1_needle() {
476215976Sjmallett        assertEquals(     -1, indexOf_imm1_needle(text16), "test_indexOf_imm1_needle no_match");
477215976Sjmallett
478215976Sjmallett        assertEquals(      0, indexOf_imm1_needle(text11), "test_indexOf_imm1_needle first_matches");
479215976Sjmallett
480215976Sjmallett        assertEquals(len12-1, indexOf_imm1_needle(text12), "test_indexOf_imm1_needle last_matches");
481215976Sjmallett        assertEquals(len13-1, indexOf_imm1_needle(text13), "test_indexOf_imm1_needle last_matches");
482215976Sjmallett        assertEquals(len14-1, indexOf_imm1_needle(text14), "test_indexOf_imm1_needle last_matches");
483215976Sjmallett        assertEquals(len15-1, indexOf_imm1_needle(text15), "test_indexOf_imm1_needle last_matches");
484232812Sjmallett
485232812Sjmallett        assertEquals(     -1, indexOf_imm1_needle(text12_1), "test_indexOf_imm1_needle walked_past");
486215976Sjmallett        assertEquals(     -1, indexOf_imm1_needle(text13_1), "test_indexOf_imm1_needle walked_past");
487215976Sjmallett        assertEquals(     -1, indexOf_imm1_needle(text14_1), "test_indexOf_imm1_needle walked_past");
488215976Sjmallett        assertEquals(     -1, indexOf_imm1_needle(text15_1), "test_indexOf_imm1_needle walked_past");
489215976Sjmallett    }
490215976Sjmallett
491215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "ooooooo1" })
492215976Sjmallett    static int indexOf_imm1_needle(String s) {
493215976Sjmallett        return s.indexOf("1");
494215976Sjmallett    }
495215976Sjmallett
496215976Sjmallett
497215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "abc", "abcd" })
498215976Sjmallett    public static int asmStringCompareTo(String a, String b) {
499215976Sjmallett        return a.compareTo(b);
500215976Sjmallett    }
501215976Sjmallett
502215976Sjmallett    @Test(role = Role.TEST_ENTRY)
503232812Sjmallett    public static void test_asmStringCompareTo() {
504232812Sjmallett        // null
505215976Sjmallett        try {
506215976Sjmallett            asmStringCompareTo("not null", null);
507215976Sjmallett            assertTrue(false,
508215976Sjmallett                       "TestOther.asmStringCompareTo(\"not null\", null) doesn't throw exception");
509215976Sjmallett        } catch (NullPointerException e) {
510215976Sjmallett            assertEquals("java.lang.String.compareTo",
511215976Sjmallett                         e.getStackTrace()[0].getClassName() + "." +
512215976Sjmallett                         e.getStackTrace()[0].getMethodName(),
513215976Sjmallett                         "TestOther.asmStringCompareTo(\"not null\", null) throws exception");
514215976Sjmallett        }
515215976Sjmallett
516215976Sjmallett        // ==0
517215976Sjmallett        {
518232812Sjmallett            // check length 0 optimization
519232812Sjmallett            assertEquals(0, asmStringCompareTo("", ""),
520215976Sjmallett                         "TestOther.asmStringCompareTo(\"\", \"\")");
521215976Sjmallett
522215976Sjmallett            // check first character optimization
523215976Sjmallett            assertEquals(0, asmStringCompareTo("A", "A"),
524215976Sjmallett                         "TestOther.asmStringCompareTo(\"A\", \"A\")");
525215976Sjmallett
526215976Sjmallett            // check real comparisons
527215976Sjmallett            assertEquals(0, asmStringCompareTo(new String("eq") + new String("ual"), "equal"),
528215976Sjmallett                         "TestOther.asmStringCompareTo(\"equal\", \"equal\")");
529215976Sjmallett            assertEquals(0, asmStringCompareTo("textABC", "textABC"),
530215976Sjmallett                         "TestOther.asmStringCompareTo(\"textABC\", \"textABC\")");
531215976Sjmallett            assertEquals(0,
532215976Sjmallett                         asmStringCompareTo(new String("abcdefgh01234") +
533215976Sjmallett                                            new String("56abcdefgh0123456abcdefgh0123456"),
534215976Sjmallett                                            "abcdefgh0123456abcdefgh0123456abcdefgh0123456"),
535215976Sjmallett                         "TestOther.asmStringCompareTo(\"abcdefgh0123456abcdefgh0123456abcdefgh0123456\", " +
536215976Sjmallett                         "\"abcdefgh0123456abcdefgh0123456abcdefgh0123456\")");
537232812Sjmallett        }
538232812Sjmallett
539215976Sjmallett        // <0
540215976Sjmallett        {
541215976Sjmallett            // check first character optimization
542215976Sjmallett            assertEquals(-1, asmStringCompareTo("4", "5"),
543215976Sjmallett                         "TestOther.asmStringCompareTo(\"4\", \"5\")");
544215976Sjmallett
545215976Sjmallett            // check real comparisons
546215976Sjmallett            assertEquals(-1, asmStringCompareTo("diff4", "diff5"),
547215976Sjmallett                         "TestOther.asmStringCompareTo(\"diff4\", \"diff5\")");
548215976Sjmallett            assertEquals(-10, asmStringCompareTo("", "123456789A"),
549215976Sjmallett                         "TestOther.asmStringCompareTo(\"\", \"123456789A\")");
550215976Sjmallett            assertEquals(-10, asmStringCompareTo("ZYX", "ZYX123456789A"),
551215976Sjmallett                         "TestOther.asmStringCompareTo(\"ZYX\", \"ZYX123456789A\")");
552215976Sjmallett        }
553215976Sjmallett
554215976Sjmallett        // >0
555215976Sjmallett        {
556215976Sjmallett            // check first character optimization
557215976Sjmallett            assertEquals(1, asmStringCompareTo("5", "4"),
558215976Sjmallett                         "TestOther.asmStringCompareTo(\"5\", \"4\")");
559215976Sjmallett
560215976Sjmallett            // check real comparisons
561215976Sjmallett            assertEquals(1, asmStringCompareTo("diff5", "diff4"),
562215976Sjmallett                         "TestOther.asmStringCompareTo(\"diff5\", \"diff4\")");
563215976Sjmallett            assertEquals(10, asmStringCompareTo("123456789A", ""),
564215976Sjmallett                         "TestOther.asmStringCompareTo(\"123456789A\", \"\")");
565215976Sjmallett            assertEquals(10, asmStringCompareTo("ZYX123456789A", "ZYX"),
566215976Sjmallett                         "TestOther.asmStringCompareTo(\"ZYX123456789A\", \"ZYX\")");
567215976Sjmallett        }
568215976Sjmallett
569215976Sjmallett        // very long strings (100k)
570215976Sjmallett        {
571215976Sjmallett            char[] ac = new char[(100 * 1024)];
572215976Sjmallett            for (int i = 0; i < (100 * 1024); i += 315)
573215976Sjmallett                ac[i] = (char) ((i % 12) + 'a');
574215976Sjmallett            char[] bc = new char[(100 * 1024)];
575232812Sjmallett            for (int i = 0; i < (100 * 1024); i += 315)
576215976Sjmallett                bc[i] = (char) ((i % 12) + 'a');
577232812Sjmallett
578232812Sjmallett            ac[(100 * 1024) - 1] = '2';
579215976Sjmallett            bc[(100 * 1024) - 1] = '2';
580215976Sjmallett            String a1 = new String(ac);
581215976Sjmallett            String b1 = new String(bc);
582215976Sjmallett            assertEquals(0, asmStringCompareTo(a1, b1),
583215976Sjmallett                         "TestOther.asmStringCompareTo(very_long_strings_1)");
584215976Sjmallett
585215976Sjmallett            ac[(100 * 1024) - 1] = 'X';
586215976Sjmallett            bc[(100 * 1024) - 1] = 'Z';
587215976Sjmallett            String a2 = new String(ac);
588215976Sjmallett            String b2 = new String(bc);
589215976Sjmallett            assertEquals(-2, asmStringCompareTo(a2, b2),
590215976Sjmallett                         "TestOther.asmStringCompareTo(very_long_strings_2)");
591215976Sjmallett        }
592215976Sjmallett
593215976Sjmallett        // very very long strings (2M)
594215976Sjmallett        {
595215976Sjmallett            char[] ac = new char[(2 * 1024 * 1024)];
596215976Sjmallett            for (int i = 0; i < (2 * 1024 * 1024); i += 315)
597215976Sjmallett                ac[i] = (char) ((i % 12) + 'a');
598215976Sjmallett            char[] bc = new char[(2 * 1024 * 1024)];
599215976Sjmallett            for (int i = 0; i < (2 * 1024 * 1024); i += 315)
600215976Sjmallett                bc[i] = (char) ((i % 12) + 'a');
601215976Sjmallett
602215976Sjmallett            ac[(2 * 1024 * 1024) - 1] = '3';
603215976Sjmallett            bc[(2 * 1024 * 1024) - 1] = '3';
604215976Sjmallett            String a1 = new String(ac);
605215976Sjmallett            String b1 = new String(bc);
606215976Sjmallett            assertEquals(0, asmStringCompareTo(a1, b1),
607215976Sjmallett                         "TestOther.asmStringCompareTo(very_very_long_strings_1)");
608215976Sjmallett
609215976Sjmallett            ac[(2 * 1024 * 1024) - 1] = 'W';
610215976Sjmallett            bc[(2 * 1024 * 1024) - 1] = 'Z';
611215976Sjmallett            String a2 = new String(ac);
612215976Sjmallett            String b2 = new String(bc);
613215976Sjmallett            assertEquals(-3, asmStringCompareTo(a2, b2),
614215976Sjmallett                         "TestOther.asmStringCompareTo(very_very_long_strings_2)");
615215976Sjmallett        }
616215976Sjmallett    }
617215976Sjmallett
618215976Sjmallett
619215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1, warmupArgs = { "abc", "abcd" })
620215976Sjmallett    public static boolean asmStringEquals(String a, String b) {
621215976Sjmallett        return a.equals(b);
622215976Sjmallett    }
623215976Sjmallett
624215976Sjmallett    static String a1 = "abcd";
625215976Sjmallett    static String b1 = "abcd";
626215976Sjmallett    static final String a2 = "1234";
627215976Sjmallett    static final String b2 = "1234";
628215976Sjmallett
629215976Sjmallett    @Test(role = Role.TEST_HELPER, compileAt = 4, warmup = 1)
630215976Sjmallett    public static boolean asmStringEqualsConst() {
631215976Sjmallett        boolean ret = a1.equals(b1);
632215976Sjmallett        ret &= a2.equals(b2);
633232812Sjmallett        ret &= !a2.equals(b1);
634215976Sjmallett        ret &= "ABCD".equals("ABCD");
635232812Sjmallett        return ret;
636232812Sjmallett    }
637215976Sjmallett
638215976Sjmallett
639215976Sjmallett    @Test(role = Role.TEST_ENTRY)
640215976Sjmallett    public static void test_asmStringEquals() {
641215976Sjmallett        // null
642215976Sjmallett        {
643215976Sjmallett            assertFalse(asmStringEquals("not null", null),
644215976Sjmallett                        "TestOther.asmStringEquals(\"not null\", null)");
645215976Sjmallett        }
646215976Sjmallett
647215976Sjmallett        // true
648215976Sjmallett        {
649215976Sjmallett            // check constant optimization
650215976Sjmallett            assertTrue(asmStringEqualsConst(),
651215976Sjmallett                       "TestOther.asmStringEqualsConst(\"\", \"\")");
652215976Sjmallett
653215976Sjmallett            // check length 0 optimization
654215976Sjmallett            assertTrue(asmStringEquals("", ""),
655215976Sjmallett                       "TestOther.asmStringEquals(\"\", \"\")");
656215976Sjmallett
657215976Sjmallett            // check first character optimization
658215976Sjmallett            assertTrue(asmStringEquals("A", "A"),
659215976Sjmallett                       "TestOther.asmStringEquals(\"A\", \"A\")");
660215976Sjmallett
661215976Sjmallett            // check real comparisons
662215976Sjmallett            assertTrue(asmStringEquals(new String("eq") + new String("ual"), "equal"),
663215976Sjmallett                       "TestOther.asmStringEquals(\"equal\", \"equal\")");
664215976Sjmallett            assertTrue(asmStringEquals("textABC", "textABC"),
665215976Sjmallett                       "TestOther.asmStringEquals(\"textABC\", \"textABC\")");
666232812Sjmallett            assertTrue(asmStringEquals(new String("abcdefgh01234") +
667215976Sjmallett                                       new String("56abcdefgh0123456abcdefgh0123456"),
668232812Sjmallett                                       "abcdefgh0123456abcdefgh0123456abcdefgh0123456"),
669232812Sjmallett                       "TestOther.asmStringEquals(\"abcdefgh0123456abcdefgh0123456abcdefgh0123456\", " +
670215976Sjmallett                       "\"abcdefgh0123456abcdefgh0123456abcdefgh0123456\")");
671215976Sjmallett        }
672215976Sjmallett    }
673215976Sjmallett
674215976Sjmallett}
675215976Sjmallett