67 import static org.graalvm.compiler.lir.LIRValueUtil.isConstantValue;
68 import static org.graalvm.compiler.lir.LIRValueUtil.isJavaConstant;
69 import static org.graalvm.compiler.lir.amd64.AMD64Arithmetic.DREM;
70 import static org.graalvm.compiler.lir.amd64.AMD64Arithmetic.FREM;
71 import static org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicBinaryOp.BinaryIntrinsicOpcode.POW;
72 import static org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicUnaryOp.UnaryIntrinsicOpcode.COS;
73 import static org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicUnaryOp.UnaryIntrinsicOpcode.EXP;
74 import static org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicUnaryOp.UnaryIntrinsicOpcode.LOG;
75 import static org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicUnaryOp.UnaryIntrinsicOpcode.LOG10;
76 import static org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicUnaryOp.UnaryIntrinsicOpcode.SIN;
77 import static org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicUnaryOp.UnaryIntrinsicOpcode.TAN;
78
79 import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic;
80 import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64MIOp;
81 import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64MOp;
82 import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64MROp;
83 import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMIOp;
84 import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp;
85 import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift;
86 import org.graalvm.compiler.asm.amd64.AMD64Assembler.SSEOp;
87 import org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize;
88 import org.graalvm.compiler.core.common.LIRKind;
89 import org.graalvm.compiler.core.common.NumUtil;
90 import org.graalvm.compiler.core.common.calc.FloatConvert;
91 import org.graalvm.compiler.debug.GraalError;
92 import org.graalvm.compiler.lir.ConstantValue;
93 import org.graalvm.compiler.lir.LIRFrameState;
94 import org.graalvm.compiler.lir.LIRValueUtil;
95 import org.graalvm.compiler.lir.Variable;
96 import org.graalvm.compiler.lir.amd64.AMD64AddressValue;
97 import org.graalvm.compiler.lir.amd64.AMD64Arithmetic.FPDivRemOp;
98 import org.graalvm.compiler.lir.amd64.AMD64ArithmeticLIRGeneratorTool;
99 import org.graalvm.compiler.lir.amd64.AMD64Binary;
100 import org.graalvm.compiler.lir.amd64.AMD64BinaryConsumer;
101 import org.graalvm.compiler.lir.amd64.AMD64ClearRegisterOp;
102 import org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicBinaryOp;
103 import org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicUnaryOp;
104 import org.graalvm.compiler.lir.amd64.AMD64Move;
105 import org.graalvm.compiler.lir.amd64.AMD64MulDivOp;
106 import org.graalvm.compiler.lir.amd64.AMD64ShiftOp;
107 import org.graalvm.compiler.lir.amd64.AMD64SignExtendOp;
108 import org.graalvm.compiler.lir.amd64.AMD64Unary;
109 import org.graalvm.compiler.lir.gen.ArithmeticLIRGenerator;
110 import org.graalvm.compiler.lir.gen.LIRGenerator;
111
112 import jdk.vm.ci.amd64.AMD64;
113 import jdk.vm.ci.amd64.AMD64Kind;
114 import jdk.vm.ci.code.CodeUtil;
115 import jdk.vm.ci.code.Register;
116 import jdk.vm.ci.code.RegisterValue;
117 import jdk.vm.ci.meta.AllocatableValue;
118 import jdk.vm.ci.meta.Constant;
119 import jdk.vm.ci.meta.JavaConstant;
120 import jdk.vm.ci.meta.JavaKind;
121 import jdk.vm.ci.meta.PlatformKind;
122 import jdk.vm.ci.meta.VMConstant;
123 import jdk.vm.ci.meta.Value;
124 import jdk.vm.ci.meta.ValueKind;
125
126 /**
127 * This class implements the AMD64 specific portion of the LIR generator.
128 */
911 public Value emitCountLeadingZeros(Value value) {
912 Variable result = getLIRGen().newVariable(LIRKind.combine(value).changeType(AMD64Kind.DWORD));
913 assert ((AMD64Kind) value.getPlatformKind()).isInteger();
914 if (value.getPlatformKind() == AMD64Kind.QWORD) {
915 getLIRGen().append(new AMD64Unary.RMOp(LZCNT, QWORD, result, asAllocatable(value)));
916 } else {
917 getLIRGen().append(new AMD64Unary.RMOp(LZCNT, DWORD, result, asAllocatable(value)));
918 }
919 return result;
920 }
921
922 @Override
923 public Value emitCountTrailingZeros(Value value) {
924 Variable result = getLIRGen().newVariable(LIRKind.combine(value).changeType(AMD64Kind.DWORD));
925 assert ((AMD64Kind) value.getPlatformKind()).isInteger();
926 if (value.getPlatformKind() == AMD64Kind.QWORD) {
927 getLIRGen().append(new AMD64Unary.RMOp(TZCNT, QWORD, result, asAllocatable(value)));
928 } else {
929 getLIRGen().append(new AMD64Unary.RMOp(TZCNT, DWORD, result, asAllocatable(value)));
930 }
931 return result;
932 }
933
934 @Override
935 public Value emitMathAbs(Value input) {
936 Variable result = getLIRGen().newVariable(LIRKind.combine(input));
937 switch ((AMD64Kind) input.getPlatformKind()) {
938 case SINGLE:
939 getLIRGen().append(new AMD64Binary.DataTwoOp(SSEOp.AND, PS, result, asAllocatable(input), JavaConstant.forFloat(Float.intBitsToFloat(0x7FFFFFFF)), 16));
940 break;
941 case DOUBLE:
942 getLIRGen().append(new AMD64Binary.DataTwoOp(SSEOp.AND, PD, result, asAllocatable(input), JavaConstant.forDouble(Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL)), 16));
943 break;
944 default:
945 throw GraalError.shouldNotReachHere();
946 }
947 return result;
948 }
949
950 @Override
|
67 import static org.graalvm.compiler.lir.LIRValueUtil.isConstantValue;
68 import static org.graalvm.compiler.lir.LIRValueUtil.isJavaConstant;
69 import static org.graalvm.compiler.lir.amd64.AMD64Arithmetic.DREM;
70 import static org.graalvm.compiler.lir.amd64.AMD64Arithmetic.FREM;
71 import static org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicBinaryOp.BinaryIntrinsicOpcode.POW;
72 import static org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicUnaryOp.UnaryIntrinsicOpcode.COS;
73 import static org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicUnaryOp.UnaryIntrinsicOpcode.EXP;
74 import static org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicUnaryOp.UnaryIntrinsicOpcode.LOG;
75 import static org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicUnaryOp.UnaryIntrinsicOpcode.LOG10;
76 import static org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicUnaryOp.UnaryIntrinsicOpcode.SIN;
77 import static org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicUnaryOp.UnaryIntrinsicOpcode.TAN;
78
79 import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic;
80 import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64MIOp;
81 import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64MOp;
82 import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64MROp;
83 import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMIOp;
84 import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp;
85 import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift;
86 import org.graalvm.compiler.asm.amd64.AMD64Assembler.SSEOp;
87 import org.graalvm.compiler.asm.amd64.AMD64Assembler.VexGeneralPurposeRVMOp;
88 import org.graalvm.compiler.asm.amd64.AMD64Assembler.VexGeneralPurposeRMOp;
89 import org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize;
90 import org.graalvm.compiler.asm.amd64.AVXKind.AVXSize;
91 import org.graalvm.compiler.core.common.LIRKind;
92 import org.graalvm.compiler.core.common.NumUtil;
93 import org.graalvm.compiler.core.common.calc.FloatConvert;
94 import org.graalvm.compiler.debug.GraalError;
95 import org.graalvm.compiler.lir.ConstantValue;
96 import org.graalvm.compiler.lir.LIRFrameState;
97 import org.graalvm.compiler.lir.LIRValueUtil;
98 import org.graalvm.compiler.lir.Variable;
99 import org.graalvm.compiler.lir.amd64.AMD64AddressValue;
100 import org.graalvm.compiler.lir.amd64.AMD64Arithmetic.FPDivRemOp;
101 import org.graalvm.compiler.lir.amd64.AMD64ArithmeticLIRGeneratorTool;
102 import org.graalvm.compiler.lir.amd64.AMD64Binary;
103 import org.graalvm.compiler.lir.amd64.AMD64BinaryConsumer;
104 import org.graalvm.compiler.lir.amd64.AMD64ClearRegisterOp;
105 import org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicBinaryOp;
106 import org.graalvm.compiler.lir.amd64.AMD64MathIntrinsicUnaryOp;
107 import org.graalvm.compiler.lir.amd64.AMD64Move;
108 import org.graalvm.compiler.lir.amd64.AMD64MulDivOp;
109 import org.graalvm.compiler.lir.amd64.AMD64ShiftOp;
110 import org.graalvm.compiler.lir.amd64.AMD64SignExtendOp;
111 import org.graalvm.compiler.lir.amd64.AMD64Unary;
112 import org.graalvm.compiler.lir.amd64.vector.AMD64VectorBinary;
113 import org.graalvm.compiler.lir.amd64.vector.AMD64VectorUnary;
114 import org.graalvm.compiler.lir.gen.ArithmeticLIRGenerator;
115 import org.graalvm.compiler.lir.gen.LIRGenerator;
116
117 import jdk.vm.ci.amd64.AMD64;
118 import jdk.vm.ci.amd64.AMD64Kind;
119 import jdk.vm.ci.code.CodeUtil;
120 import jdk.vm.ci.code.Register;
121 import jdk.vm.ci.code.RegisterValue;
122 import jdk.vm.ci.meta.AllocatableValue;
123 import jdk.vm.ci.meta.Constant;
124 import jdk.vm.ci.meta.JavaConstant;
125 import jdk.vm.ci.meta.JavaKind;
126 import jdk.vm.ci.meta.PlatformKind;
127 import jdk.vm.ci.meta.VMConstant;
128 import jdk.vm.ci.meta.Value;
129 import jdk.vm.ci.meta.ValueKind;
130
131 /**
132 * This class implements the AMD64 specific portion of the LIR generator.
133 */
916 public Value emitCountLeadingZeros(Value value) {
917 Variable result = getLIRGen().newVariable(LIRKind.combine(value).changeType(AMD64Kind.DWORD));
918 assert ((AMD64Kind) value.getPlatformKind()).isInteger();
919 if (value.getPlatformKind() == AMD64Kind.QWORD) {
920 getLIRGen().append(new AMD64Unary.RMOp(LZCNT, QWORD, result, asAllocatable(value)));
921 } else {
922 getLIRGen().append(new AMD64Unary.RMOp(LZCNT, DWORD, result, asAllocatable(value)));
923 }
924 return result;
925 }
926
927 @Override
928 public Value emitCountTrailingZeros(Value value) {
929 Variable result = getLIRGen().newVariable(LIRKind.combine(value).changeType(AMD64Kind.DWORD));
930 assert ((AMD64Kind) value.getPlatformKind()).isInteger();
931 if (value.getPlatformKind() == AMD64Kind.QWORD) {
932 getLIRGen().append(new AMD64Unary.RMOp(TZCNT, QWORD, result, asAllocatable(value)));
933 } else {
934 getLIRGen().append(new AMD64Unary.RMOp(TZCNT, DWORD, result, asAllocatable(value)));
935 }
936 return result;
937 }
938
939 @Override
940 public Value emitLogicalAndNot(Value value1, Value value2) {
941 Variable result = getLIRGen().newVariable(LIRKind.combine(value1, value2));
942
943 if (value1.getPlatformKind() == AMD64Kind.QWORD) {
944 getLIRGen().append(new AMD64VectorBinary.AVXBinaryOp(VexGeneralPurposeRVMOp.ANDN, AVXSize.QWORD, result, asAllocatable(value1), asAllocatable(value2)));
945 } else {
946 getLIRGen().append(new AMD64VectorBinary.AVXBinaryOp(VexGeneralPurposeRVMOp.ANDN, AVXSize.DWORD, result, asAllocatable(value1), asAllocatable(value2)));
947 }
948 return result;
949 }
950
951 @Override
952 public Value emitLowestSetIsolatedBit(Value value) {
953 Variable result = getLIRGen().newVariable(LIRKind.combine(value));
954
955 if (value.getPlatformKind() == AMD64Kind.QWORD) {
956 getLIRGen().append(new AMD64VectorUnary.AVXUnaryOp(VexGeneralPurposeRMOp.BLSI, AVXSize.QWORD, result, asAllocatable(value)));
957 } else {
958 getLIRGen().append(new AMD64VectorUnary.AVXUnaryOp(VexGeneralPurposeRMOp.BLSI, AVXSize.DWORD, result, asAllocatable(value)));
959 }
960
961 return result;
962 }
963
964 @Override
965 public Value emitGetMaskUpToLowestSetBit(Value value) {
966 Variable result = getLIRGen().newVariable(LIRKind.combine(value));
967
968 if (value.getPlatformKind() == AMD64Kind.QWORD) {
969 getLIRGen().append(new AMD64VectorUnary.AVXUnaryOp(VexGeneralPurposeRMOp.BLSMSK, AVXSize.QWORD, result, asAllocatable(value)));
970 } else {
971 getLIRGen().append(new AMD64VectorUnary.AVXUnaryOp(VexGeneralPurposeRMOp.BLSMSK, AVXSize.DWORD, result, asAllocatable(value)));
972 }
973
974 return result;
975 }
976
977 @Override
978 public Value emitResetLowestSetBit(Value value) {
979 Variable result = getLIRGen().newVariable(LIRKind.combine(value));
980
981 if (value.getPlatformKind() == AMD64Kind.QWORD) {
982 getLIRGen().append(new AMD64VectorUnary.AVXUnaryOp(VexGeneralPurposeRMOp.BLSR, AVXSize.QWORD, result, asAllocatable(value)));
983 } else {
984 getLIRGen().append(new AMD64VectorUnary.AVXUnaryOp(VexGeneralPurposeRMOp.BLSR, AVXSize.DWORD, result, asAllocatable(value)));
985 }
986
987 return result;
988 }
989
990 @Override
991 public Value emitMathAbs(Value input) {
992 Variable result = getLIRGen().newVariable(LIRKind.combine(input));
993 switch ((AMD64Kind) input.getPlatformKind()) {
994 case SINGLE:
995 getLIRGen().append(new AMD64Binary.DataTwoOp(SSEOp.AND, PS, result, asAllocatable(input), JavaConstant.forFloat(Float.intBitsToFloat(0x7FFFFFFF)), 16));
996 break;
997 case DOUBLE:
998 getLIRGen().append(new AMD64Binary.DataTwoOp(SSEOp.AND, PD, result, asAllocatable(input), JavaConstant.forDouble(Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL)), 16));
999 break;
1000 default:
1001 throw GraalError.shouldNotReachHere();
1002 }
1003 return result;
1004 }
1005
1006 @Override
|