www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 5323] New: std.math: struct FloatingPointControl, duplicate code and assumes X86

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5323

           Summary: std.math: struct FloatingPointControl, duplicate code
                    and assumes X86
           Product: D
           Version: D2
          Platform: Other
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Phobos
        AssignedTo: nobody puremagic.com
        ReportedBy: ibuclaw ubuntu.com


--- Comment #0 from Iain Buclaw <ibuclaw ubuntu.com> 2010-12-05 08:01:19 PST ---
Excerpt from struct FloatingPointControl:

/** IEEE hardware exceptions.
 *  By default, all exceptions are masked (disabled).
 */
enum : uint
{
    inexactException   = 0x20,
    underflowException = 0x10,
    overflowException  = 0x08,
    divByZeroException = 0x04,
    invalidException   = 0x01,
    /// Severe = The overflow, division by zero, and invalid exceptions.
    severeExceptions   = overflowException | divByZeroException
                         | invalidException,
    allExceptions      = severeExceptions | underflowException
                         | inexactException,
};


A little further up the file in struct IeeeFlags:

// The x87 FPU status register is 16 bits.
// The Pentium SSE2 status register is 32 bits.
uint flags;
version (X86_Any) {
    // Applies to both x87 status word (16 bits) and SSE2 status word(32 bits).
    enum : int {
        INEXACT_MASK   = 0x20,
        UNDERFLOW_MASK = 0x10,
        OVERFLOW_MASK  = 0x08,
        DIVBYZERO_MASK = 0x04,
        INVALID_MASK   = 0x01
    }
    // Don't bother about denormals, they are not supported on most CPUs.
    //  DENORMAL_MASK = 0x02;
} else version (PPC) {



Both implement the same thing, but have (rather confusingly) different names
and one only implements for X86 whereas the other (at least tries) to implement
PPC and SPARC too.

IMO, as both structs take their values from <fpu_control.h> for GlibC
(<machine/ieeeflags.h> for FreeBSD?? <float.h> for Windows???), these enums
(and possibly the Get/Set/Clear CW functions too) should be consolidated into
one place elsewhere. For example, std.internal.math.fpbits, or possibly
DRuntime...

Regards

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Dec 05 2010
parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5323



--- Comment #1 from Iain Buclaw <ibuclaw ubuntu.com> 2010-12-05 08:30:25 PST ---
Hmm... also found in <fenv.h>, so perhaps should just be importing
core.stdc.fenv (merging any bits added by std.math).

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