--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64ArrayIndexOfNode.java Thu Oct 17 20:27:44 2019 +0100
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64ArrayIndexOfNode.java Thu Oct 17 20:53:35 2019 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2019, Oracle and/or its affiliates. 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
@@ -24,8 +24,8 @@
package org.graalvm.compiler.replacements.amd64;
-import jdk.vm.ci.meta.JavaKind;
-import jdk.vm.ci.meta.Value;
+import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_512;
+
import org.graalvm.compiler.core.common.type.StampFactory;
import org.graalvm.compiler.graph.NodeClass;
import org.graalvm.compiler.graph.NodeInputList;
@@ -41,41 +41,46 @@
import org.graalvm.compiler.nodes.spi.LIRLowerable;
import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
import jdk.internal.vm.compiler.word.LocationIdentity;
-import jdk.internal.vm.compiler.word.Pointer;
-import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_512;
+import jdk.vm.ci.meta.JavaKind;
+import jdk.vm.ci.meta.Value;
@NodeInfo(size = SIZE_512, cycles = NodeCycles.CYCLES_UNKNOWN)
public class AMD64ArrayIndexOfNode extends FixedWithNextNode implements LIRLowerable, MemoryAccess {
public static final NodeClass<AMD64ArrayIndexOfNode> TYPE = NodeClass.create(AMD64ArrayIndexOfNode.class);
- private final JavaKind kind;
+ private final JavaKind arrayKind;
+ private final JavaKind valueKind;
private final boolean findTwoConsecutive;
@Input private ValueNode arrayPointer;
@Input private ValueNode arrayLength;
+ @Input private ValueNode fromIndex;
@Input private NodeInputList<ValueNode> searchValues;
@OptionalInput(InputType.Memory) private MemoryNode lastLocationAccess;
- public AMD64ArrayIndexOfNode(@ConstantNodeParameter JavaKind kind, @ConstantNodeParameter boolean findTwoConsecutive,
- ValueNode arrayPointer, ValueNode arrayLength, ValueNode... searchValues) {
+ public AMD64ArrayIndexOfNode(@ConstantNodeParameter JavaKind arrayKind, @ConstantNodeParameter JavaKind valueKind, @ConstantNodeParameter boolean findTwoConsecutive,
+ ValueNode arrayPointer, ValueNode arrayLength, ValueNode fromIndex, ValueNode... searchValues) {
super(TYPE, StampFactory.forKind(JavaKind.Int));
- this.kind = kind;
+ this.arrayKind = arrayKind;
+ this.valueKind = valueKind;
this.findTwoConsecutive = findTwoConsecutive;
this.arrayPointer = arrayPointer;
this.arrayLength = arrayLength;
+ this.fromIndex = fromIndex;
this.searchValues = new NodeInputList<>(this, searchValues);
}
- public AMD64ArrayIndexOfNode(@ConstantNodeParameter JavaKind kind, ValueNode arrayPointer, ValueNode arrayLength, ValueNode... searchValues) {
- this(kind, false, arrayPointer, arrayLength, searchValues);
+ public AMD64ArrayIndexOfNode(@ConstantNodeParameter JavaKind arrayKind, @ConstantNodeParameter JavaKind valueKind,
+ ValueNode arrayPointer, ValueNode arrayLength, ValueNode fromIndex, ValueNode... searchValues) {
+ this(arrayKind, valueKind, false, arrayPointer, arrayLength, fromIndex, searchValues);
}
@Override
public LocationIdentity getLocationIdentity() {
- return NamedLocationIdentity.getArrayLocation(kind);
+ return NamedLocationIdentity.getArrayLocation(arrayKind);
}
@Override
@@ -84,7 +89,8 @@
for (int i = 0; i < searchValues.size(); i++) {
searchValueOperands[i] = gen.operand(searchValues.get(i));
}
- Value result = gen.getLIRGeneratorTool().emitArrayIndexOf(kind, findTwoConsecutive, gen.operand(arrayPointer), gen.operand(arrayLength), searchValueOperands);
+ Value result = gen.getLIRGeneratorTool().emitArrayIndexOf(arrayKind, valueKind, findTwoConsecutive,
+ gen.operand(arrayPointer), gen.operand(arrayLength), gen.operand(fromIndex), searchValueOperands);
gen.setResult(this, result);
}
@@ -100,30 +106,125 @@
}
@NodeIntrinsic
- public static native int optimizedArrayIndexOf(@ConstantNodeParameter JavaKind kind, @ConstantNodeParameter boolean findTwoConsecutive,
- Pointer arrayPointer, int arrayLength, int searchValue);
+ private static native int optimizedArrayIndexOf(
+ @ConstantNodeParameter JavaKind arrayKind,
+ @ConstantNodeParameter JavaKind valueKind,
+ @ConstantNodeParameter boolean findTwoConsecutive,
+ Object array, int arrayLength, int fromIndex, byte v1);
+
+ @NodeIntrinsic
+ private static native int optimizedArrayIndexOf(
+ @ConstantNodeParameter JavaKind arrayKind,
+ @ConstantNodeParameter JavaKind valueKind,
+ @ConstantNodeParameter boolean findTwoConsecutive,
+ Object array, int arrayLength, int fromIndex, byte v1, byte v2);
+
+ @NodeIntrinsic
+ private static native int optimizedArrayIndexOf(
+ @ConstantNodeParameter JavaKind arrayKind,
+ @ConstantNodeParameter JavaKind valueKind,
+ @ConstantNodeParameter boolean findTwoConsecutive,
+ Object array, int arrayLength, int fromIndex, byte v1, byte v2, byte v3);
@NodeIntrinsic
- public static native int optimizedArrayIndexOf(@ConstantNodeParameter JavaKind kind, Pointer arrayPointer, int arrayLength, char c1);
+ private static native int optimizedArrayIndexOf(
+ @ConstantNodeParameter JavaKind arrayKind,
+ @ConstantNodeParameter JavaKind valueKind,
+ @ConstantNodeParameter boolean findTwoConsecutive,
+ Object array, int arrayLength, int fromIndex, byte v1, byte v2, byte v3, byte v4);
+
+ @NodeIntrinsic
+ private static native int optimizedArrayIndexOf(
+ @ConstantNodeParameter JavaKind arrayKind,
+ @ConstantNodeParameter JavaKind valueKind,
+ @ConstantNodeParameter boolean findTwoConsecutive,
+ Object array, int arrayLength, int fromIndex, char v1);
@NodeIntrinsic
- public static native int optimizedArrayIndexOf(@ConstantNodeParameter JavaKind kind, Pointer arrayPointer, int arrayLength, char c1, char c2);
+ private static native int optimizedArrayIndexOf(
+ @ConstantNodeParameter JavaKind arrayKind,
+ @ConstantNodeParameter JavaKind valueKind,
+ @ConstantNodeParameter boolean findTwoConsecutive,
+ Object array, int arrayLength, int fromIndex, char v1, char v2);
@NodeIntrinsic
- public static native int optimizedArrayIndexOf(@ConstantNodeParameter JavaKind kind, Pointer arrayPointer, int arrayLength, char c1, char c2, char c3);
+ private static native int optimizedArrayIndexOf(
+ @ConstantNodeParameter JavaKind arrayKind,
+ @ConstantNodeParameter JavaKind valueKind,
+ @ConstantNodeParameter boolean findTwoConsecutive,
+ Object array, int arrayLength, int fromIndex, char v1, char v2, char v3);
+
+ @NodeIntrinsic
+ private static native int optimizedArrayIndexOf(
+ @ConstantNodeParameter JavaKind arrayKind,
+ @ConstantNodeParameter JavaKind valueKind,
+ @ConstantNodeParameter boolean findTwoConsecutive,
+ Object array, int arrayLength, int fromIndex, char v1, char v2, char v3, char v4);
@NodeIntrinsic
- public static native int optimizedArrayIndexOf(@ConstantNodeParameter JavaKind kind, Pointer arrayPointer, int arrayLength, char c1, char c2, char c3, char c4);
+ private static native int optimizedArrayIndexOf(
+ @ConstantNodeParameter JavaKind arrayKind,
+ @ConstantNodeParameter JavaKind valueKind,
+ @ConstantNodeParameter boolean findTwoConsecutive,
+ Object array, int arrayLength, int fromIndex, int searchValue);
+
+ public static int indexOf(byte[] array, int arrayLength, int fromIndex, byte v1) {
+ return optimizedArrayIndexOf(JavaKind.Byte, JavaKind.Byte, false, array, arrayLength, fromIndex, v1);
+ }
+
+ public static int indexOf(byte[] array, int arrayLength, int fromIndex, byte v1, byte v2) {
+ return optimizedArrayIndexOf(JavaKind.Byte, JavaKind.Byte, false, array, arrayLength, fromIndex, v1, v2);
+ }
- @NodeIntrinsic
- public static native int optimizedArrayIndexOf(@ConstantNodeParameter JavaKind kind, Pointer arrayPointer, int arrayLength, byte c1);
+ public static int indexOf(byte[] array, int arrayLength, int fromIndex, byte v1, byte v2, byte v3) {
+ return optimizedArrayIndexOf(JavaKind.Byte, JavaKind.Byte, false, array, arrayLength, fromIndex, v1, v2, v3);
+ }
+
+ public static int indexOf(byte[] array, int arrayLength, int fromIndex, byte v1, byte v2, byte v3, byte v4) {
+ return optimizedArrayIndexOf(JavaKind.Byte, JavaKind.Byte, false, array, arrayLength, fromIndex, v1, v2, v3, v4);
+ }
+
+ public static int indexOf(byte[] array, int arrayLength, int fromIndex, char v1) {
+ return optimizedArrayIndexOf(JavaKind.Byte, JavaKind.Char, false, array, arrayLength, fromIndex, v1);
+ }
+
+ public static int indexOf(byte[] array, int arrayLength, int fromIndex, char v1, char v2) {
+ return optimizedArrayIndexOf(JavaKind.Byte, JavaKind.Char, false, array, arrayLength, fromIndex, v1, v2);
+ }
- @NodeIntrinsic
- public static native int optimizedArrayIndexOf(@ConstantNodeParameter JavaKind kind, Pointer arrayPointer, int arrayLength, byte c1, byte c2);
+ public static int indexOf(byte[] array, int arrayLength, int fromIndex, char v1, char v2, char v3) {
+ return optimizedArrayIndexOf(JavaKind.Byte, JavaKind.Char, false, array, arrayLength, fromIndex, v1, v2, v3);
+ }
+
+ public static int indexOf(byte[] array, int arrayLength, int fromIndex, char v1, char v2, char v3, char v4) {
+ return optimizedArrayIndexOf(JavaKind.Byte, JavaKind.Char, false, array, arrayLength, fromIndex, v1, v2, v3, v4);
+ }
+
+ public static int indexOf(char[] array, int arrayLength, int fromIndex, char v1) {
+ return optimizedArrayIndexOf(JavaKind.Char, JavaKind.Char, false, array, arrayLength, fromIndex, v1);
+ }
+
+ public static int indexOf(char[] array, int arrayLength, int fromIndex, char v1, char v2) {
+ return optimizedArrayIndexOf(JavaKind.Char, JavaKind.Char, false, array, arrayLength, fromIndex, v1, v2);
+ }
- @NodeIntrinsic
- public static native int optimizedArrayIndexOf(@ConstantNodeParameter JavaKind kind, Pointer arrayPointer, int arrayLength, byte c1, byte c2, byte c3);
+ public static int indexOf(char[] array, int arrayLength, int fromIndex, char v1, char v2, char v3) {
+ return optimizedArrayIndexOf(JavaKind.Char, JavaKind.Char, false, array, arrayLength, fromIndex, v1, v2, v3);
+ }
+
+ public static int indexOf(char[] array, int arrayLength, int fromIndex, char v1, char v2, char v3, char v4) {
+ return optimizedArrayIndexOf(JavaKind.Char, JavaKind.Char, false, array, arrayLength, fromIndex, v1, v2, v3, v4);
+ }
- @NodeIntrinsic
- public static native int optimizedArrayIndexOf(@ConstantNodeParameter JavaKind kind, Pointer arrayPointer, int arrayLength, byte c1, byte c2, byte c3, byte c4);
+ public static int indexOf2ConsecutiveBytes(byte[] array, int arrayLength, int fromIndex, int values) {
+ return optimizedArrayIndexOf(JavaKind.Byte, JavaKind.Byte, true, array, arrayLength, fromIndex, values);
+ }
+
+ public static int indexOf2ConsecutiveChars(byte[] array, int arrayLength, int fromIndex, int values) {
+ return optimizedArrayIndexOf(JavaKind.Byte, JavaKind.Char, true, array, arrayLength, fromIndex, values);
+ }
+
+ public static int indexOf2ConsecutiveChars(char[] array, int arrayLength, int fromIndex, int values) {
+ return optimizedArrayIndexOf(JavaKind.Char, JavaKind.Char, true, array, arrayLength, fromIndex, values);
+ }
}