--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64StringUTF16Substitutions.java Thu Jun 27 03:10:52 2019 +0200
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64StringUTF16Substitutions.java Thu Jun 27 03:33:44 2019 +0200
@@ -103,12 +103,7 @@
@MethodSubstitution
public static int indexOfCharUnsafe(byte[] value, int ch, int fromIndex, int max) {
- Pointer sourcePointer = charOffsetPointer(value, fromIndex);
- int result = AMD64ArrayIndexOf.indexOf1Char(sourcePointer, max - fromIndex, (char) ch);
- if (result != -1) {
- return result + fromIndex;
- }
- return result;
+ return AMD64ArrayIndexOf.indexOf1Char(value, max, fromIndex, (char) ch);
}
private static Word pointer(byte[] target) {
@@ -125,39 +120,26 @@
ReplacementsUtil.runtimeAssert(targetCount > 0, "StringUTF16.indexOfUnsafe invalid args: targetCount <= 0");
ReplacementsUtil.runtimeAssert(targetCount <= length(target), "StringUTF16.indexOfUnsafe invalid args: targetCount > length(target)");
ReplacementsUtil.runtimeAssert(sourceCount >= targetCount, "StringUTF16.indexOfUnsafe invalid args: sourceCount < targetCount");
- int totalOffset = fromIndex;
if (targetCount == 1) {
- Pointer sourcePointer = charOffsetPointer(source, totalOffset);
- int indexOfResult = AMD64ArrayIndexOf.indexOf1Char(sourcePointer, sourceCount - fromIndex, StringUTF16Substitutions.getChar(target, 0));
- if (indexOfResult >= 0) {
- return indexOfResult + totalOffset;
- }
- return indexOfResult;
+ return AMD64ArrayIndexOf.indexOf1Char(source, sourceCount, fromIndex, StringUTF16Substitutions.getChar(target, 0));
} else if (targetCount == 2) {
- Pointer sourcePointer = charOffsetPointer(source, totalOffset);
- int indexOfResult = AMD64ArrayIndexOf.indexOfTwoConsecutiveChars(sourcePointer, sourceCount - fromIndex, StringUTF16Substitutions.getChar(target, 0),
- StringUTF16Substitutions.getChar(target, 1));
- if (indexOfResult >= 0) {
- return indexOfResult + totalOffset;
- }
- return indexOfResult;
+ return AMD64ArrayIndexOf.indexOfTwoConsecutiveChars(source, sourceCount, fromIndex, StringUTF16Substitutions.getChar(target, 0), StringUTF16Substitutions.getChar(target, 1));
} else {
- int haystackLength = sourceCount - (fromIndex + (targetCount - 2));
- while (haystackLength > 0) {
- Pointer sourcePointer = charOffsetPointer(source, totalOffset);
- int indexOfResult = AMD64ArrayIndexOf.indexOfTwoConsecutiveChars(sourcePointer, haystackLength, StringUTF16Substitutions.getChar(target, 0),
+ int haystackLength = sourceCount - (targetCount - 2);
+ int offset = fromIndex;
+ while (offset < haystackLength) {
+ int indexOfResult = AMD64ArrayIndexOf.indexOfTwoConsecutiveChars(source, haystackLength, offset, StringUTF16Substitutions.getChar(target, 0),
StringUTF16Substitutions.getChar(target, 1));
if (indexOfResult < 0) {
return -1;
}
- totalOffset += indexOfResult;
- haystackLength -= (indexOfResult + 1);
- Pointer cmpSourcePointer = charOffsetPointer(source, totalOffset);
+ offset = indexOfResult;
+ Pointer cmpSourcePointer = charOffsetPointer(source, offset);
Pointer targetPointer = pointer(target);
if (ArrayRegionEqualsNode.regionEquals(cmpSourcePointer, targetPointer, targetCount, JavaKind.Char)) {
- return totalOffset;
+ return offset;
}
- totalOffset++;
+ offset++;
}
return -1;
}
@@ -169,37 +151,25 @@
ReplacementsUtil.runtimeAssert(targetCount > 0, "StringUTF16.indexOfLatin1Unsafe invalid args: targetCount <= 0");
ReplacementsUtil.runtimeAssert(targetCount <= target.length, "StringUTF16.indexOfLatin1Unsafe invalid args: targetCount > length(target)");
ReplacementsUtil.runtimeAssert(sourceCount >= targetCount, "StringUTF16.indexOfLatin1Unsafe invalid args: sourceCount < targetCount");
- int totalOffset = fromIndex;
if (targetCount == 1) {
- Pointer sourcePointer = charOffsetPointer(source, totalOffset);
- int indexOfResult = AMD64ArrayIndexOf.indexOf1Char(sourcePointer, sourceCount - fromIndex, (char) Byte.toUnsignedInt(target[0]));
- if (indexOfResult >= 0) {
- return indexOfResult + totalOffset;
- }
- return indexOfResult;
+ return AMD64ArrayIndexOf.indexOf1Char(source, sourceCount, fromIndex, (char) Byte.toUnsignedInt(target[0]));
} else if (targetCount == 2) {
- Pointer sourcePointer = charOffsetPointer(source, totalOffset);
- int indexOfResult = AMD64ArrayIndexOf.indexOfTwoConsecutiveChars(sourcePointer, sourceCount - fromIndex, (char) Byte.toUnsignedInt(target[0]), (char) Byte.toUnsignedInt(target[1]));
- if (indexOfResult >= 0) {
- return indexOfResult + totalOffset;
- }
- return indexOfResult;
+ return AMD64ArrayIndexOf.indexOfTwoConsecutiveChars(source, sourceCount, fromIndex, (char) Byte.toUnsignedInt(target[0]), (char) Byte.toUnsignedInt(target[1]));
} else {
- int haystackLength = sourceCount - (fromIndex + (targetCount - 2));
- while (haystackLength > 0) {
- Pointer sourcePointer = charOffsetPointer(source, totalOffset);
- int indexOfResult = AMD64ArrayIndexOf.indexOfTwoConsecutiveChars(sourcePointer, haystackLength, (char) Byte.toUnsignedInt(target[0]), (char) Byte.toUnsignedInt(target[1]));
+ int haystackLength = sourceCount - (targetCount - 2);
+ int offset = fromIndex;
+ while (offset < haystackLength) {
+ int indexOfResult = AMD64ArrayIndexOf.indexOfTwoConsecutiveChars(source, haystackLength, offset, (char) Byte.toUnsignedInt(target[0]), (char) Byte.toUnsignedInt(target[1]));
if (indexOfResult < 0) {
return -1;
}
- totalOffset += indexOfResult;
- haystackLength -= (indexOfResult + 1);
- Pointer cmpSourcePointer = charOffsetPointer(source, totalOffset);
+ offset = indexOfResult;
+ Pointer cmpSourcePointer = charOffsetPointer(source, offset);
Pointer targetPointer = pointer(target);
if (ArrayRegionEqualsNode.regionEquals(cmpSourcePointer, targetPointer, targetCount, JavaKind.Char, JavaKind.Byte)) {
- return totalOffset;
+ return offset;
}
- totalOffset++;
+ offset++;
}
return -1;
}