Example #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();
            }
        }
Example #2
0
        public Number Duplicate()
        {
            var dup = new Number(dummy: string.Empty);

            dup.State = this.State;
            dup.Kind  = this.Kind;
            if (this.Value.Pointer.ToInt64() != 0)
            {
                dup.Value = Value;
            }
            if (this.APFloat.Pointer.ToInt64() != 0)
            {
                int status;
                dup.APFloat = LLVMExt.APFloatFromAPFloat(this.APFloat, GetAPFloatSemantics(this.Kind), out status);
            }
            return(dup);
        }
Example #3
0
        public Number Convert(NumberKind kind)
        {
            if (kind == this.Kind)
            {
                return(this);
            }
            if (this.HasErrors)
            {
                return(new Number(this.State, this.Kind));
            }

            if (this.Kind.IsInteger())
            {
                if (this.Kind.IsSigned())
                {
                    var n = new Number(this.Int64Value, kind);
                    n.State |= this.State;
                    return(n);
                }
                else
                {
                    var n = new Number(this.UInt64Value, kind);
                    n.State |= this.State;
                    return(n);
                }
            }
            else
            {
                if (kind.IsFloat())
                {
                    int status;
                    var apFloat = LLVMExt.APFloatFromAPFloat(this.APFloat, GetAPFloatSemantics(kind), out status);
                    return(new Number(dummy: string.Empty)
                    {
                        APFloat = apFloat,
                        State = this.State | (NumberState)status,
                        Kind = kind
                    });
                }
                else
                {
                    if (this.Kind == NumberKind.Double)
                    {
                        var n = new Number(this.DoubleValue, kind);
                        n.State |= this.State;
                        return(n);
                    }
                    else if (this.Kind == NumberKind.Float)
                    {
                        var n = new Number(this.FloatValue, kind);
                        n.State |= this.State;
                        return(n);
                    }
                    else
                    {
                        if (kind.IsSigned())
                        {
                            var overflows = CheckForLongOverflow();
                            if (overflows == 1)
                            {
                                return(new Number(NumberState.Overflow, kind));
                            }
                            else if (overflows == -1)
                            {
                                return(new Number(NumberState.Underflow, kind));
                            }
                            else
                            {
                                var longValue  = LLVM.ConstFPToSI(LLVMExt.APFloatToValue(APFloat), LLVM.Int64Type());
                                var longValue2 = LLVM.ConstIntGetSExtValue(longValue);

                                return(new Number(longValue2, kind));
                            }
                        }
                        else
                        {
                            var overflows = CheckForULongOverflow();
                            if (overflows == 1)
                            {
                                return(new Number(NumberState.Overflow, kind));
                            }
                            else if (overflows == -1)
                            {
                                return(new Number(NumberState.Underflow, kind));
                            }
                            else
                            {
                                var ulongValue  = LLVM.ConstFPToUI(LLVMExt.APFloatToValue(APFloat), LLVM.Int64Type());
                                var ulongValue2 = LLVM.ConstIntGetZExtValue(ulongValue);

                                return(new Number(ulongValue2, kind));
                            }
                        }
                    }
                }
            }
        }