< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64StringSubstitutions.java
Print this page
rev 52509 : [mq]: graal2
@@ -27,39 +27,40 @@
import org.graalvm.compiler.api.replacements.ClassSubstitution;
import org.graalvm.compiler.api.replacements.Fold;
import org.graalvm.compiler.api.replacements.Fold.InjectedParameter;
import org.graalvm.compiler.api.replacements.MethodSubstitution;
import org.graalvm.compiler.core.common.SuppressFBWarnings;
-import org.graalvm.compiler.core.common.spi.ArrayOffsetProvider;
import org.graalvm.compiler.graph.Node.ConstantNodeParameter;
import org.graalvm.compiler.replacements.StringSubstitutions;
import org.graalvm.compiler.replacements.nodes.ArrayCompareToNode;
+import org.graalvm.compiler.replacements.nodes.ArrayRegionEqualsNode;
import org.graalvm.compiler.word.Word;
import jdk.internal.vm.compiler.word.Pointer;
import jdk.vm.ci.meta.JavaKind;
+import jdk.vm.ci.meta.MetaAccessProvider;
// JaCoCo Exclude
/**
* Substitutions for {@link java.lang.String} methods.
*/
@ClassSubstitution(String.class)
public class AMD64StringSubstitutions {
@Fold
- static int charArrayBaseOffset(@InjectedParameter ArrayOffsetProvider arrayOffsetProvider) {
- return arrayOffsetProvider.arrayBaseOffset(JavaKind.Char);
+ static int charArrayBaseOffset(@InjectedParameter MetaAccessProvider metaAccess) {
+ return metaAccess.getArrayBaseOffset(JavaKind.Char);
}
@Fold
- static int charArrayIndexScale(@InjectedParameter ArrayOffsetProvider arrayOffsetProvider) {
- return arrayOffsetProvider.arrayScalingFactor(JavaKind.Char);
+ static int charArrayIndexScale(@InjectedParameter MetaAccessProvider metaAccess) {
+ return metaAccess.getArrayIndexScale(JavaKind.Char);
}
/** Marker value for the {@link InjectedParameter} injected parameter. */
- static final ArrayOffsetProvider INJECTED = null;
+ static final MetaAccessProvider INJECTED = null;
// Only exists in JDK <= 8
@MethodSubstitution(isStatic = true, optional = true)
public static int indexOf(char[] source, int sourceOffset, int sourceCount,
@ConstantNodeParameter char[] target, int targetOffset, int targetCount,
@@ -81,17 +82,43 @@
// The empty string contains nothing except the empty string.
return -1;
}
assert sourceCount - fromIndex > 0 && targetCount > 0;
+ if (targetCount == 1) {
Pointer sourcePointer = Word.objectToTrackedPointer(source).add(charArrayBaseOffset(INJECTED)).add(totalOffset * charArrayIndexScale(INJECTED));
+ int indexOfResult = AMD64ArrayIndexOf.indexOf1Char(sourcePointer, sourceCount - fromIndex, target[targetOffset]);
+ if (indexOfResult >= 0) {
+ return indexOfResult + totalOffset;
+ }
+ return indexOfResult;
+ } else if (targetCount == 2) {
+ Pointer sourcePointer = Word.objectToTrackedPointer(source).add(charArrayBaseOffset(INJECTED)).add(totalOffset * charArrayIndexScale(INJECTED));
+ int indexOfResult = AMD64ArrayIndexOf.indexOfTwoConsecutiveChars(sourcePointer, sourceCount - fromIndex, target[targetOffset], target[targetOffset + 1]);
+ if (indexOfResult >= 0) {
+ return indexOfResult + totalOffset;
+ }
+ return indexOfResult;
+ } else {
+ int haystackLength = sourceCount - (fromIndex + (targetCount - 2));
+ while (haystackLength > 0) {
+ Pointer sourcePointer = Word.objectToTrackedPointer(source).add(charArrayBaseOffset(INJECTED)).add(totalOffset * charArrayIndexScale(INJECTED));
+ int indexOfResult = AMD64ArrayIndexOf.indexOfTwoConsecutiveChars(sourcePointer, haystackLength, target[targetOffset], target[targetOffset + 1]);
+ if (indexOfResult < 0) {
+ return -1;
+ }
+ totalOffset += indexOfResult;
+ haystackLength -= (indexOfResult + 1);
+ Pointer cmpSourcePointer = Word.objectToTrackedPointer(source).add(charArrayBaseOffset(INJECTED)).add(totalOffset * charArrayIndexScale(INJECTED));
Pointer targetPointer = Word.objectToTrackedPointer(target).add(charArrayBaseOffset(INJECTED)).add(targetOffset * charArrayIndexScale(INJECTED));
- int result = AMD64StringIndexOfNode.optimizedStringIndexPointer(sourcePointer, sourceCount - fromIndex, targetPointer, targetCount);
- if (result >= 0) {
- return result + totalOffset;
+ if (ArrayRegionEqualsNode.regionEquals(cmpSourcePointer, targetPointer, targetCount, JavaKind.Char)) {
+ return totalOffset;
+ }
+ totalOffset++;
+ }
+ return -1;
}
- return result;
}
// Only exists in JDK <= 8
@MethodSubstitution(isStatic = false, optional = true)
public static int indexOf(String source, int ch, int origFromIndex) {
@@ -107,11 +134,11 @@
if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
char[] sourceArray = StringSubstitutions.getValue(source);
Pointer sourcePointer = Word.objectToTrackedPointer(sourceArray).add(charArrayBaseOffset(INJECTED)).add(fromIndex * charArrayIndexScale(INJECTED));
- int result = AMD64ArrayIndexOfNode.optimizedArrayIndexOf(sourcePointer, sourceCount - fromIndex, (char) ch, JavaKind.Char);
+ int result = AMD64ArrayIndexOf.indexOf1Char(sourcePointer, sourceCount - fromIndex, (char) ch);
if (result != -1) {
return result + fromIndex;
}
return result;
} else {
< prev index next >