--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64ArithmeticLIRGenerator.java Thu Oct 17 20:27:44 2019 +0100
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64ArithmeticLIRGenerator.java Thu Oct 17 20:53:35 2019 +0100
@@ -124,8 +124,8 @@
import org.graalvm.compiler.lir.amd64.AMD64SignExtendOp;
import org.graalvm.compiler.lir.amd64.AMD64Ternary;
import org.graalvm.compiler.lir.amd64.AMD64Unary;
-import org.graalvm.compiler.lir.amd64.AMD64ZeroMemoryOp;
import org.graalvm.compiler.lir.amd64.vector.AMD64VectorBinary;
+import org.graalvm.compiler.lir.amd64.vector.AMD64VectorBinary.AVXBinaryConstFloatOp;
import org.graalvm.compiler.lir.amd64.vector.AMD64VectorBinary.AVXBinaryOp;
import org.graalvm.compiler.lir.amd64.vector.AMD64VectorUnary;
import org.graalvm.compiler.lir.gen.ArithmeticLIRGenerator;
@@ -450,6 +450,13 @@
}
}
+ public Value emitBinaryMemory(VexRVMOp op, OperandSize size, AllocatableValue a, AMD64AddressValue location, LIRFrameState state) {
+ assert (size.isXmmType() && supportAVX());
+ Variable result = getLIRGen().newVariable(LIRKind.combine(a));
+ getLIRGen().append(new AMD64VectorBinary.AVXBinaryMemoryOp(op, getRegisterSize(result), result, a, location, state));
+ return result;
+ }
+
public Value emitBinaryMemory(AMD64RMOp op, OperandSize size, AllocatableValue a, AMD64AddressValue location, LIRFrameState state) {
Variable result = getLIRGen().newVariable(LIRKind.combine(a));
getLIRGen().append(new AMD64Binary.MemoryTwoOp(op, size, result, a, location, state));
@@ -1122,12 +1129,6 @@
return new AMD64MathPowOp().emitLIRWrapper(getLIRGen(), x, y);
}
- @Override
- public void emitZeroMemory(Value address, Value length) {
- RegisterValue lengthReg = moveToReg(AMD64.rcx, length);
- getLIRGen().append(new AMD64ZeroMemoryOp(getAMD64LIRGen().asAddressValue(address), lengthReg));
- }
-
protected AMD64LIRGenerator getAMD64LIRGen() {
return (AMD64LIRGenerator) getLIRGen();
}
@@ -1339,7 +1340,7 @@
return result;
}
- private boolean supportAVX() {
+ public boolean supportAVX() {
TargetDescription target = getLIRGen().target();
return ((AMD64) target.arch).getFeatures().contains(CPUFeature.AVX);
}
@@ -1353,9 +1354,13 @@
}
}
- private Variable emitBinary(LIRKind resultKind, VexRVMOp op, Value a, Value b) {
+ protected Variable emitBinary(LIRKind resultKind, VexRVMOp op, Value a, Value b) {
Variable result = getLIRGen().newVariable(resultKind);
- getLIRGen().append(new AVXBinaryOp(op, getRegisterSize(result), result, asAllocatable(a), asAllocatable(b)));
+ if (b instanceof ConstantValue && (b.getPlatformKind() == AMD64Kind.SINGLE || b.getPlatformKind() == AMD64Kind.DOUBLE)) {
+ getLIRGen().append(new AVXBinaryConstFloatOp(op, getRegisterSize(result), result, asAllocatable(a), (ConstantValue) b));
+ } else {
+ getLIRGen().append(new AVXBinaryOp(op, getRegisterSize(result), result, asAllocatable(a), asAllocatable(b)));
+ }
return result;
}