< 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
rev 52509 : [mq]: graal2


  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


< prev index next >