[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