AMD64StringSubstitutions.java revision 12968:4d8a004e5c6d
1218065Sadrian/*
2218065Sadrian * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
3240592Sadrian * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4218065Sadrian *
5218065Sadrian * This code is free software; you can redistribute it and/or modify it
6218065Sadrian * under the terms of the GNU General Public License version 2 only, as
7218065Sadrian * published by the Free Software Foundation.
8218065Sadrian *
9218065Sadrian * This code is distributed in the hope that it will be useful, but WITHOUT
10218065Sadrian * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11218065Sadrian * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12218065Sadrian * version 2 for more details (a copy is included in the LICENSE file that
13218065Sadrian * accompanied this code).
14218065Sadrian *
15218065Sadrian * You should have received a copy of the GNU General Public License version
16218065Sadrian * 2 along with this work; if not, write to the Free Software Foundation,
17218065Sadrian * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18218065Sadrian *
19218065Sadrian * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20218065Sadrian * or visit www.oracle.com if you need additional information or have any
21218065Sadrian * questions.
22218065Sadrian */
23218065Sadrianpackage org.graalvm.compiler.replacements.amd64;
24218065Sadrian
25218065Sadrianimport org.graalvm.compiler.api.replacements.ClassSubstitution;
26218065Sadrianimport org.graalvm.compiler.api.replacements.MethodSubstitution;
27218065Sadrianimport org.graalvm.compiler.graph.Node.ConstantNodeParameter;
28218065Sadrianimport org.graalvm.compiler.word.Pointer;
29218065Sadrianimport org.graalvm.compiler.word.Word;
30218065Sadrian
31218065Sadrianimport sun.misc.Unsafe;
32218065Sadrian
33218065Sadrian// JaCoCo Exclude
34218065Sadrian
35218065Sadrian/**
36218065Sadrian * Substitutions for {@link java.lang.String} methods.
37218065Sadrian */
38218065Sadrian@ClassSubstitution(String.class)
39218065Sadrianpublic class AMD64StringSubstitutions {
40218065Sadrian
41218065Sadrian    // Only exists in JDK <= 8
42218065Sadrian    @MethodSubstitution(isStatic = true, optional = true)
43218065Sadrian    public static int indexOf(char[] source, int sourceOffset, int sourceCount,
44218065Sadrian                    @ConstantNodeParameter char[] target, int targetOffset, int targetCount,
45218065Sadrian                    int origFromIndex) {
46218065Sadrian        int fromIndex = origFromIndex;
47218065Sadrian        if (fromIndex >= sourceCount) {
48218065Sadrian            return (targetCount == 0 ? sourceCount : -1);
49218065Sadrian        }
50218065Sadrian        if (fromIndex < 0) {
51218065Sadrian            fromIndex = 0;
52218065Sadrian        }
53218065Sadrian        if (targetCount == 0) {
54218065Sadrian            // The empty string is in every string.
55218065Sadrian            return fromIndex;
56218065Sadrian        }
57218065Sadrian
58218065Sadrian        int totalOffset = sourceOffset + fromIndex;
59218065Sadrian        if (sourceCount - fromIndex < targetCount) {
60218065Sadrian            // The empty string contains nothing except the empty string.
61218065Sadrian            return -1;
62218065Sadrian        }
63218065Sadrian        assert sourceCount - fromIndex > 0 && targetCount > 0;
64218065Sadrian
65218065Sadrian        Pointer sourcePointer = Word.objectToTrackedPointer(source).add(Unsafe.ARRAY_CHAR_BASE_OFFSET).add(totalOffset * Unsafe.ARRAY_CHAR_INDEX_SCALE);
66218065Sadrian        Pointer targetPointer = Word.objectToTrackedPointer(target).add(Unsafe.ARRAY_CHAR_BASE_OFFSET).add(targetOffset * Unsafe.ARRAY_CHAR_INDEX_SCALE);
67218065Sadrian        int result = AMD64StringIndexOfNode.optimizedStringIndexPointer(sourcePointer, sourceCount - fromIndex, targetPointer, targetCount);
68218065Sadrian        if (result >= 0) {
69218065Sadrian            return result + totalOffset;
70218065Sadrian        }
71218065Sadrian        return result;
72218065Sadrian    }
73218065Sadrian}
74218065Sadrian