40 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.MOVSD;
41 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.MOVSS;
42 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.MOVSX;
43 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.MOVSXB;
44 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.MOVSXD;
45 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.MOVZX;
46 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.MOVZXB;
47 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.POPCNT;
48 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.TEST;
49 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.TESTB;
50 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.TZCNT;
51 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift.ROL;
52 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift.ROR;
53 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift.SAR;
54 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift.SHL;
55 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift.SHR;
56 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VADDSD;
57 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VADDSS;
58 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VDIVSD;
59 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VDIVSS;
60 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VMULSD;
61 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VMULSS;
62 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VORPD;
63 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VORPS;
64 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VSUBSD;
65 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VSUBSS;
66 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VXORPD;
67 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VXORPS;
68 import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.BYTE;
69 import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.DWORD;
70 import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.PD;
71 import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.PS;
72 import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.QWORD;
73 import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.SD;
74 import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.SS;
75 import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.WORD;
76 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
77 import static org.graalvm.compiler.lir.LIRValueUtil.asConstantValue;
78 import static org.graalvm.compiler.lir.LIRValueUtil.asJavaConstant;
79 import static org.graalvm.compiler.lir.LIRValueUtil.isConstantValue;
103 import org.graalvm.compiler.lir.LIRFrameState;
104 import org.graalvm.compiler.lir.LIRValueUtil;
105 import org.graalvm.compiler.lir.Variable;
106 import org.graalvm.compiler.lir.amd64.AMD64AddressValue;
107 import org.graalvm.compiler.lir.amd64.AMD64Arithmetic.FPDivRemOp;
108 import org.graalvm.compiler.lir.amd64.AMD64ArithmeticLIRGeneratorTool;
109 import org.graalvm.compiler.lir.amd64.AMD64Binary;
110 import org.graalvm.compiler.lir.amd64.AMD64BinaryConsumer;
111 import org.graalvm.compiler.lir.amd64.AMD64ClearRegisterOp;
112 import org.graalvm.compiler.lir.amd64.AMD64MathCosOp;
113 import org.graalvm.compiler.lir.amd64.AMD64MathExpOp;
114 import org.graalvm.compiler.lir.amd64.AMD64MathLog10Op;
115 import org.graalvm.compiler.lir.amd64.AMD64MathLogOp;
116 import org.graalvm.compiler.lir.amd64.AMD64MathPowOp;
117 import org.graalvm.compiler.lir.amd64.AMD64MathSinOp;
118 import org.graalvm.compiler.lir.amd64.AMD64MathTanOp;
119 import org.graalvm.compiler.lir.amd64.AMD64Move;
120 import org.graalvm.compiler.lir.amd64.AMD64MulDivOp;
121 import org.graalvm.compiler.lir.amd64.AMD64ShiftOp;
122 import org.graalvm.compiler.lir.amd64.AMD64SignExtendOp;
123 import org.graalvm.compiler.lir.amd64.AMD64Unary;
124 import org.graalvm.compiler.lir.amd64.AMD64ZeroMemoryOp;
125 import org.graalvm.compiler.lir.amd64.vector.AMD64VectorBinary;
126 import org.graalvm.compiler.lir.amd64.vector.AMD64VectorBinary.AVXBinaryOp;
127 import org.graalvm.compiler.lir.amd64.vector.AMD64VectorUnary;
128 import org.graalvm.compiler.lir.gen.ArithmeticLIRGenerator;
129
130 import jdk.vm.ci.amd64.AMD64;
131 import jdk.vm.ci.amd64.AMD64.CPUFeature;
132 import jdk.vm.ci.amd64.AMD64Kind;
133 import jdk.vm.ci.code.CodeUtil;
134 import jdk.vm.ci.code.Register;
135 import jdk.vm.ci.code.RegisterValue;
136 import jdk.vm.ci.code.TargetDescription;
137 import jdk.vm.ci.meta.AllocatableValue;
138 import jdk.vm.ci.meta.Constant;
139 import jdk.vm.ci.meta.JavaConstant;
140 import jdk.vm.ci.meta.JavaKind;
141 import jdk.vm.ci.meta.PlatformKind;
142 import jdk.vm.ci.meta.VMConstant;
941 getLIRGen().append(new AMD64Unary.RMOp(POPCNT, DWORD, result, asAllocatable(value)));
942 }
943 return result;
944 }
945
946 @Override
947 public Variable emitBitScanForward(Value value) {
948 Variable result = getLIRGen().newVariable(LIRKind.combine(value).changeType(AMD64Kind.DWORD));
949 getLIRGen().append(new AMD64Unary.RMOp(BSF, QWORD, result, asAllocatable(value)));
950 return result;
951 }
952
953 @Override
954 public Variable emitBitScanReverse(Value value) {
955 Variable result = getLIRGen().newVariable(LIRKind.combine(value).changeType(AMD64Kind.DWORD));
956 assert ((AMD64Kind) value.getPlatformKind()).isInteger();
957 if (value.getPlatformKind() == AMD64Kind.QWORD) {
958 getLIRGen().append(new AMD64Unary.RMOp(BSR, QWORD, result, asAllocatable(value)));
959 } else {
960 getLIRGen().append(new AMD64Unary.RMOp(BSR, DWORD, result, asAllocatable(value)));
961 }
962 return result;
963 }
964
965 @Override
966 public Value emitCountLeadingZeros(Value value) {
967 Variable result = getLIRGen().newVariable(LIRKind.combine(value).changeType(AMD64Kind.DWORD));
968 assert ((AMD64Kind) value.getPlatformKind()).isInteger();
969 if (value.getPlatformKind() == AMD64Kind.QWORD) {
970 getLIRGen().append(new AMD64Unary.RMOp(LZCNT, QWORD, result, asAllocatable(value)));
971 } else {
972 getLIRGen().append(new AMD64Unary.RMOp(LZCNT, DWORD, result, asAllocatable(value)));
973 }
974 return result;
975 }
976
977 @Override
978 public Value emitCountTrailingZeros(Value value) {
979 Variable result = getLIRGen().newVariable(LIRKind.combine(value).changeType(AMD64Kind.DWORD));
980 assert ((AMD64Kind) value.getPlatformKind()).isInteger();
|
40 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.MOVSD;
41 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.MOVSS;
42 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.MOVSX;
43 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.MOVSXB;
44 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.MOVSXD;
45 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.MOVZX;
46 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.MOVZXB;
47 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.POPCNT;
48 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.TEST;
49 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.TESTB;
50 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp.TZCNT;
51 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift.ROL;
52 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift.ROR;
53 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift.SAR;
54 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift.SHL;
55 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift.SHR;
56 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VADDSD;
57 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VADDSS;
58 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VDIVSD;
59 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VDIVSS;
60 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VFMADD231SD;
61 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VFMADD231SS;
62 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VMULSD;
63 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VMULSS;
64 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VORPD;
65 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VORPS;
66 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VSUBSD;
67 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VSUBSS;
68 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VXORPD;
69 import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VXORPS;
70 import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.BYTE;
71 import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.DWORD;
72 import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.PD;
73 import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.PS;
74 import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.QWORD;
75 import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.SD;
76 import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.SS;
77 import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.WORD;
78 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
79 import static org.graalvm.compiler.lir.LIRValueUtil.asConstantValue;
80 import static org.graalvm.compiler.lir.LIRValueUtil.asJavaConstant;
81 import static org.graalvm.compiler.lir.LIRValueUtil.isConstantValue;
105 import org.graalvm.compiler.lir.LIRFrameState;
106 import org.graalvm.compiler.lir.LIRValueUtil;
107 import org.graalvm.compiler.lir.Variable;
108 import org.graalvm.compiler.lir.amd64.AMD64AddressValue;
109 import org.graalvm.compiler.lir.amd64.AMD64Arithmetic.FPDivRemOp;
110 import org.graalvm.compiler.lir.amd64.AMD64ArithmeticLIRGeneratorTool;
111 import org.graalvm.compiler.lir.amd64.AMD64Binary;
112 import org.graalvm.compiler.lir.amd64.AMD64BinaryConsumer;
113 import org.graalvm.compiler.lir.amd64.AMD64ClearRegisterOp;
114 import org.graalvm.compiler.lir.amd64.AMD64MathCosOp;
115 import org.graalvm.compiler.lir.amd64.AMD64MathExpOp;
116 import org.graalvm.compiler.lir.amd64.AMD64MathLog10Op;
117 import org.graalvm.compiler.lir.amd64.AMD64MathLogOp;
118 import org.graalvm.compiler.lir.amd64.AMD64MathPowOp;
119 import org.graalvm.compiler.lir.amd64.AMD64MathSinOp;
120 import org.graalvm.compiler.lir.amd64.AMD64MathTanOp;
121 import org.graalvm.compiler.lir.amd64.AMD64Move;
122 import org.graalvm.compiler.lir.amd64.AMD64MulDivOp;
123 import org.graalvm.compiler.lir.amd64.AMD64ShiftOp;
124 import org.graalvm.compiler.lir.amd64.AMD64SignExtendOp;
125 import org.graalvm.compiler.lir.amd64.AMD64Ternary;
126 import org.graalvm.compiler.lir.amd64.AMD64Unary;
127 import org.graalvm.compiler.lir.amd64.AMD64ZeroMemoryOp;
128 import org.graalvm.compiler.lir.amd64.vector.AMD64VectorBinary;
129 import org.graalvm.compiler.lir.amd64.vector.AMD64VectorBinary.AVXBinaryOp;
130 import org.graalvm.compiler.lir.amd64.vector.AMD64VectorUnary;
131 import org.graalvm.compiler.lir.gen.ArithmeticLIRGenerator;
132
133 import jdk.vm.ci.amd64.AMD64;
134 import jdk.vm.ci.amd64.AMD64.CPUFeature;
135 import jdk.vm.ci.amd64.AMD64Kind;
136 import jdk.vm.ci.code.CodeUtil;
137 import jdk.vm.ci.code.Register;
138 import jdk.vm.ci.code.RegisterValue;
139 import jdk.vm.ci.code.TargetDescription;
140 import jdk.vm.ci.meta.AllocatableValue;
141 import jdk.vm.ci.meta.Constant;
142 import jdk.vm.ci.meta.JavaConstant;
143 import jdk.vm.ci.meta.JavaKind;
144 import jdk.vm.ci.meta.PlatformKind;
145 import jdk.vm.ci.meta.VMConstant;
944 getLIRGen().append(new AMD64Unary.RMOp(POPCNT, DWORD, result, asAllocatable(value)));
945 }
946 return result;
947 }
948
949 @Override
950 public Variable emitBitScanForward(Value value) {
951 Variable result = getLIRGen().newVariable(LIRKind.combine(value).changeType(AMD64Kind.DWORD));
952 getLIRGen().append(new AMD64Unary.RMOp(BSF, QWORD, result, asAllocatable(value)));
953 return result;
954 }
955
956 @Override
957 public Variable emitBitScanReverse(Value value) {
958 Variable result = getLIRGen().newVariable(LIRKind.combine(value).changeType(AMD64Kind.DWORD));
959 assert ((AMD64Kind) value.getPlatformKind()).isInteger();
960 if (value.getPlatformKind() == AMD64Kind.QWORD) {
961 getLIRGen().append(new AMD64Unary.RMOp(BSR, QWORD, result, asAllocatable(value)));
962 } else {
963 getLIRGen().append(new AMD64Unary.RMOp(BSR, DWORD, result, asAllocatable(value)));
964 }
965 return result;
966 }
967
968 @Override
969 public Variable emitFusedMultiplyAdd(Value a, Value b, Value c) {
970 Variable result = getLIRGen().newVariable(LIRKind.combine(a, b, c));
971 assert ((AMD64Kind) a.getPlatformKind()).isXMM() && ((AMD64Kind) b.getPlatformKind()).isXMM() && ((AMD64Kind) c.getPlatformKind()).isXMM();
972 assert a.getPlatformKind().equals(b.getPlatformKind());
973 assert b.getPlatformKind().equals(c.getPlatformKind());
974
975 if (a.getPlatformKind() == AMD64Kind.DOUBLE) {
976 getLIRGen().append(new AMD64Ternary.ThreeOp(VFMADD231SD, AVXSize.XMM, result, asAllocatable(c), asAllocatable(a), asAllocatable(b)));
977 } else {
978 assert a.getPlatformKind() == AMD64Kind.SINGLE;
979 getLIRGen().append(new AMD64Ternary.ThreeOp(VFMADD231SS, AVXSize.XMM, result, asAllocatable(c), asAllocatable(a), asAllocatable(b)));
980 }
981 return result;
982 }
983
984 @Override
985 public Value emitCountLeadingZeros(Value value) {
986 Variable result = getLIRGen().newVariable(LIRKind.combine(value).changeType(AMD64Kind.DWORD));
987 assert ((AMD64Kind) value.getPlatformKind()).isInteger();
988 if (value.getPlatformKind() == AMD64Kind.QWORD) {
989 getLIRGen().append(new AMD64Unary.RMOp(LZCNT, QWORD, result, asAllocatable(value)));
990 } else {
991 getLIRGen().append(new AMD64Unary.RMOp(LZCNT, DWORD, result, asAllocatable(value)));
992 }
993 return result;
994 }
995
996 @Override
997 public Value emitCountTrailingZeros(Value value) {
998 Variable result = getLIRGen().newVariable(LIRKind.combine(value).changeType(AMD64Kind.DWORD));
999 assert ((AMD64Kind) value.getPlatformKind()).isInteger();
|