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

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Sep 24 08:43:27 PDT 2009


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



--- Comment #8 from Don <clugdbug at yahoo.com.au> 2009-09-24 08:43:25 PDT ---
There was a problem with the patch (failed the DMD test suite).
Here's a revised patch which passes.  As before, 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(). Note that __DLBULLNG() has never
been used by any previous DMD version, so it can be changed without breaking
anything.


Index: C:/dmd2/src/dmd/backend/cod4.c
===================================================================
--- C:/dmd2/src/dmd/backend/cod4.c    (revision 49)
+++ C:/dmd2/src/dmd/backend/cod4.c    (revision 62)
@@ -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:/dmd2/src/dmd/backend/cod1.c
===================================================================
--- C:/dmd2/src/dmd/backend/cod1.c    (revision 49)
+++ C:/dmd2/src/dmd/backend/cod1.c    (revision 62)
@@ -1936,15 +1936,16 @@
     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
-    Y(DOUBLEREGS_16,"__DBLULLNG"),
+#if 1
+    Y(mST0|mAX|mDX,"__DBLULLNG"),
 #else
     Y(DOUBLEREGS_16,"_DBLULLNG@"),
 #endif
@@ -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,8 +2036,8 @@

     {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
-    {DOUBLEREGS_16,mDX|mAX,0,INFfloat,2,2},        // _DBLULLNG@
+#if 1//TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS
+    {0,mDX|mAX,0,INF32|INFfloat,1,2},    // __LDBLULLNG
 #else
     {DOUBLEREGS_16,mDX|mAX,0,INFfloat,1,1},        // _DBLULLNG@
 #endif
@@ -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