view tango/lib/compiler/llvmdc/typeinfo/ti_double.d @ 314:8d98e42ece93 trunk

[svn r335] The basics of exception handling are in place. Still need to make sure calls are turned into invokes everywhere. (NewExpression for instance) Still some rough edges and corner cases to figure out. Needs testing!
author ChristianK
date Wed, 02 Jul 2008 22:20:18 +0200
parents 1700239cab2e
children
line wrap: on
line source


// double

module typeinfo.ti_double;

class TypeInfo_d : TypeInfo
{
    char[] toString() { return "double"; }

    hash_t getHash(void *p)
    {
        return (cast(uint *)p)[0] + (cast(uint *)p)[1];
    }

    static int _equals(double f1, double f2)
    {
        return f1 == f2 ||
                (f1 !<>= f1 && f2 !<>= f2);
    }

    static int _compare(double d1, double d2)
    {
        if (d1 !<>= d2)         // if either are NaN
        {
            if (d1 !<>= d1)
            {   if (d2 !<>= d2)
                    return 0;
                return -1;
            }
            return 1;
        }
        return (d1 == d2) ? 0 : ((d1 < d2) ? -1 : 1);
    }

    int equals(void *p1, void *p2)
    {
        return _equals(*cast(double *)p1, *cast(double *)p2);
    }

    int compare(void *p1, void *p2)
    {
        return _compare(*cast(double *)p1, *cast(double *)p2);
    }

    size_t tsize()
    {
        return double.sizeof;
    }

    void swap(void *p1, void *p2)
    {
        double t;

        t = *cast(double *)p1;
        *cast(double *)p1 = *cast(double *)p2;
        *cast(double *)p2 = t;
    }

    void[] init()
    {   static double r;

        return (cast(double *)&r)[0 .. 1];
    }
}