987 } 988 989 @Override 990 public Value emitBitScanForward(Value value) { 991 Variable result = newVariable(LIRKind.derive(value).changeType(Kind.Int)); 992 append(new AMD64BitManipulationOp(BSF, result, asAllocatable(value))); 993 return result; 994 } 995 996 @Override 997 public Value emitBitScanReverse(Value value) { 998 Variable result = newVariable(LIRKind.derive(value).changeType(Kind.Int)); 999 if (value.getKind().getStackKind() == Kind.Int) { 1000 append(new AMD64BitManipulationOp(IBSR, result, asAllocatable(value))); 1001 } else { 1002 append(new AMD64BitManipulationOp(LBSR, result, asAllocatable(value))); 1003 } 1004 return result; 1005 } 1006 1007 @Override 1008 public Value emitMathAbs(Value input) { 1009 Variable result = newVariable(LIRKind.derive(input)); 1010 switch (input.getKind()) { 1011 case Float: 1012 append(new BinaryRegConst(FAND, result, asAllocatable(input), JavaConstant.forFloat(Float.intBitsToFloat(0x7FFFFFFF)))); 1013 break; 1014 case Double: 1015 append(new BinaryRegConst(DAND, result, asAllocatable(input), JavaConstant.forDouble(Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL)))); 1016 break; 1017 default: 1018 throw GraalInternalError.shouldNotReachHere(); 1019 } 1020 return result; 1021 } 1022 1023 @Override 1024 public Value emitMathSqrt(Value input) { 1025 Variable result = newVariable(LIRKind.derive(input)); 1026 append(new Unary2Op(SQRT, result, asAllocatable(input))); | 987 } 988 989 @Override 990 public Value emitBitScanForward(Value value) { 991 Variable result = newVariable(LIRKind.derive(value).changeType(Kind.Int)); 992 append(new AMD64BitManipulationOp(BSF, result, asAllocatable(value))); 993 return result; 994 } 995 996 @Override 997 public Value emitBitScanReverse(Value value) { 998 Variable result = newVariable(LIRKind.derive(value).changeType(Kind.Int)); 999 if (value.getKind().getStackKind() == Kind.Int) { 1000 append(new AMD64BitManipulationOp(IBSR, result, asAllocatable(value))); 1001 } else { 1002 append(new AMD64BitManipulationOp(LBSR, result, asAllocatable(value))); 1003 } 1004 return result; 1005 } 1006 1007 public Value emitCountLeadingZeros(Value value) { 1008 Variable result = newVariable(LIRKind.derive(value).changeType(Kind.Int)); 1009 if (value.getKind().getStackKind() == Kind.Int) { 1010 append(new AMD64BitManipulationOp(ILZCNT, result, asAllocatable(value))); 1011 } else { 1012 append(new AMD64BitManipulationOp(LLZCNT, result, asAllocatable(value))); 1013 } 1014 return result; 1015 } 1016 1017 public Value emitCountTrailingZeros(Value value) { 1018 Variable result = newVariable(LIRKind.derive(value).changeType(Kind.Int)); 1019 if (value.getKind().getStackKind() == Kind.Int) { 1020 append(new AMD64BitManipulationOp(ITZCNT, result, asAllocatable(value))); 1021 } else { 1022 append(new AMD64BitManipulationOp(LTZCNT, result, asAllocatable(value))); 1023 } 1024 return result; 1025 } 1026 1027 @Override 1028 public Value emitMathAbs(Value input) { 1029 Variable result = newVariable(LIRKind.derive(input)); 1030 switch (input.getKind()) { 1031 case Float: 1032 append(new BinaryRegConst(FAND, result, asAllocatable(input), JavaConstant.forFloat(Float.intBitsToFloat(0x7FFFFFFF)))); 1033 break; 1034 case Double: 1035 append(new BinaryRegConst(DAND, result, asAllocatable(input), JavaConstant.forDouble(Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL)))); 1036 break; 1037 default: 1038 throw GraalInternalError.shouldNotReachHere(); 1039 } 1040 return result; 1041 } 1042 1043 @Override 1044 public Value emitMathSqrt(Value input) { 1045 Variable result = newVariable(LIRKind.derive(input)); 1046 append(new Unary2Op(SQRT, result, asAllocatable(input))); |