[Issue 2697] Cast of float function return to ulong or uint gives bogus value

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Sep 8 08:44:58 PDT 2009


http://d.puremagic.com/issues/show_bug.cgi?id=2697


Don <clugdbug at yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |patch
            Summary|[DMC too] Cast of float     |Cast of float function
                   |function return to ulong or |return to ulong or uint
                   |uint gives bogus value      |gives bogus value


--- Comment #7 from Don <clugdbug at yahoo.com.au> 2009-09-08 08:44:56 PDT ---
Here's a patch against DMD2.032. It also requires a change to llmath.d in
druntime (or in Phobos1). The simplest way is to copy the contents of 
__LDBLULLNG() and put it into __DBLULLNG(). Because there's no need for a
difference between those functions (although there can be a performance
benefit, so they are both worth retaining, I think).

=================

Index: C:/dmd2best/src/dmd/backend/cod4.c
===================================================================
--- C:/dmd2best/src/dmd/backend/cod4.c    (revision 49)
+++ C:/dmd2best/src/dmd/backend/cod4.c    (revision 51)
@@ -2313,7 +2313,7 @@
         case OPd_s64:
         return cnvt87(e,pretregs);
         case OPd_u32:        // use subroutine, not 8087
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS
+#if 1//TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS
         retregs = mST0;
 #else
         retregs = DOUBLEREGS;
@@ -2321,7 +2321,8 @@
         goto L1;

         case OPd_u64:
-        retregs = DOUBLEREGS;
+        retregs = mST0;
+        //retregs = DOUBLEREGS;
         goto L1;
         case OPu64_d:
         if (*pretregs & mST0)
Index: C:/dmd2best/src/dmd/backend/cod1.c
===================================================================
--- C:/dmd2best/src/dmd/backend/cod1.c    (revision 49)
+++ C:/dmd2best/src/dmd/backend/cod1.c    (revision 51)
@@ -1936,14 +1936,15 @@
     Y(DOUBLEREGS_16,"_INTDBL@"),
     Y(DOUBLEREGS_16,"_DBLUNS@"),
     Y(DOUBLEREGS_16,"_UNSDBL@"),
-    Y(DOUBLEREGS_16,"_DBLULNG@"),
+//    Y(DOUBLEREGS_16,"_DBLULNG@"),
+    Y(DOUBLEREGS_16,"__DBLULNG"),
     Y(DOUBLEREGS_16,"_ULNGDBL@"),
     Y(DOUBLEREGS_16,"_DBLFLT@"),
     Y(ALLREGS,"_FLTDBL@"),

     Y(DOUBLEREGS_16,"_DBLLLNG@"),
     Y(DOUBLEREGS_16,"_LLNGDBL@"),
-#if 0
+#if 1
     Y(DOUBLEREGS_16,"__DBLULLNG"),
 #else
     Y(DOUBLEREGS_16,"_DBLULLNG@"),
@@ -2022,7 +2023,7 @@
     {DOUBLEREGS_16,DOUBLEREGS_32,0,INFfloat,1,1},    // _INTDBL@    intdbl
     {mAX,mAX,0,INFfloat,1,1},                // _DBLUNS@    dbluns
     {DOUBLEREGS_16,DOUBLEREGS_32,0,INFfloat,1,1},    // _UNSDBL@    unsdbl
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS
+#if 1//TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS
     {mDX|mAX,mAX,0,INF32|INFfloat,0,1},            // _DBLULNG@    dblulng
 #else
     {mDX|mAX,mAX,0,INFfloat,1,1},            // _DBLULNG@    dblulng
@@ -2035,7 +2036,7 @@

     {DOUBLEREGS_16,mDX|mAX,0,INFfloat,1,1},        // _DBLLLNG@
     {DOUBLEREGS_16,DOUBLEREGS_32,0,INFfloat,1,1},    // _LLNGDBL@
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS
+#if 1//TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS
     {DOUBLEREGS_16,mDX|mAX,0,INFfloat,2,2},        // _DBLULLNG@
 #else
     {DOUBLEREGS_16,mDX|mAX,0,INFfloat,1,1},        // _DBLULLNG@
@@ -2143,7 +2144,6 @@
         0x66,0xf7,0xe1,        // mul    ECX
         0x66,0x0f,0xa4,0xc2,0x10,    // shld    EDX,EAX,16    ;DX,AX = EAX
     };
-
     c = genasm(c,lmul,sizeof(lmul));
   }
   else

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list