< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64ArithmeticLIRGenerator.java

Print this page




  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();


< prev index next >