src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringLatin1InflateOp.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringLatin1InflateOp.java Thu Oct 31 14:23:06 2019 -0700
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringLatin1InflateOp.java Thu Oct 31 16:54:16 2019 -0700
@@ -32,6 +32,8 @@
import static jdk.vm.ci.code.ValueUtil.asRegister;
import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG;
+import java.util.EnumSet;
+
import org.graalvm.compiler.asm.Label;
import org.graalvm.compiler.asm.amd64.AMD64Address;
import org.graalvm.compiler.asm.amd64.AMD64Assembler;
@@ -43,8 +45,10 @@
import org.graalvm.compiler.lir.gen.LIRGeneratorTool;
import jdk.vm.ci.amd64.AMD64;
+import jdk.vm.ci.amd64.AMD64.CPUFeature;
import jdk.vm.ci.amd64.AMD64Kind;
import jdk.vm.ci.code.Register;
+import jdk.vm.ci.code.TargetDescription;
import jdk.vm.ci.meta.Value;
@Opcode("AMD64_STRING_INFLATE")
@@ -73,7 +77,7 @@
rdstTemp = rdst = dst;
rlenTemp = rlen = len;
- vtmp1 = tool.newVariable(LIRKind.value(AMD64Kind.V512_BYTE));
+ vtmp1 = useAVX512ForStringInflateCompress(tool.target()) ? tool.newVariable(LIRKind.value(AMD64Kind.V512_BYTE)) : tool.newVariable(LIRKind.value(AMD64Kind.V128_BYTE));
rtmp2 = tool.newVariable(LIRKind.value(AMD64Kind.DWORD));
}
@@ -89,6 +93,13 @@
byteArrayInflate(masm, src, dst, len, tmp1, tmp2);
}
+ public static boolean useAVX512ForStringInflateCompress(TargetDescription target) {
+ EnumSet<CPUFeature> features = ((AMD64) target.arch).getFeatures();
+ return features.contains(AMD64.CPUFeature.AVX512BW) &&
+ features.contains(AMD64.CPUFeature.AVX512VL) &&
+ features.contains(AMD64.CPUFeature.BMI2);
+ }
+
/**
* Inflate a Latin1 string using a byte[] array representation into a UTF16 string using a
* char[] array representation.
@@ -110,10 +121,7 @@
assert dst.number != len.number && dst.number != tmp.number;
assert len.number != tmp.number;
- if (masm.supports(AMD64.CPUFeature.AVX512BW) &&
- masm.supports(AMD64.CPUFeature.AVX512VL) &&
- masm.supports(AMD64.CPUFeature.BMI2)) {
-
+ if (useAVX512ForStringInflateCompress(masm.target)) {
// If the length of the string is less than 16, we chose not to use the
// AVX512 instructions.
masm.testl(len, -16);