[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