int CheckForULongOverflow() { switch (this.Kind) { case NumberKind.Real: case NumberKind.Quad: int status; LLVMAPFloatRef apFloat = LLVMExt.APFloatFromAPFloat(APFloat, APFloatSemantics.IEEEquad, out status); var comparisonMax = LLVMExt.APFloatCompare(apFloat, MaxULongValue); var comparisonMin = LLVMExt.APFloatCompare(apFloat, MinULongValue); LLVMExt.APFloatDispose(apFloat); if (comparisonMax == 2) { return(1); } if (comparisonMin == 0) { return(-1); } return(0); default: throw new NotSupportedException(); } }
public NumberComparison CompareTo(Number n) { if (this.HasErrors || n.HasErrors) { return(NumberComparison.Invalid); } var opKind = OperationKind(this.Kind, n.Kind); var op1 = this.Convert(opKind); var op2 = n.Convert(opKind); if (opKind.IsInteger()) { var result = LLVM.ConstICmp(LLVMIntPredicate.LLVMIntEQ, op1.LLVMValue, op2.LLVMValue).ConstIntGetZExtValue(); if (result == 1) { return(NumberComparison.Eq); } else { result = LLVM.ConstICmp(opKind.IsSigned() ? LLVMIntPredicate.LLVMIntSGT : LLVMIntPredicate.LLVMIntUGT, op1.LLVMValue, op2.LLVMValue).ConstIntGetZExtValue(); return(result == 1 ? NumberComparison.Gt : NumberComparison.Ls); } } else { var result = LLVMExt.APFloatCompare(op1.APFloat, op2.APFloat); switch (result) { case 0: return(NumberComparison.Ls); case 1: return(NumberComparison.Eq); case 2: return(NumberComparison.Gt); default: return(NumberComparison.Undef); } } }