Пример #1
0
        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();
            }
        }
Пример #2
0
        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);
                }
            }
        }