Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/gnu/dist/gcc4/gcc/config/m68k Pull following m68k softfloat ...



details:   https://anonhg.NetBSD.org/src/rev/c34b0ea6f577
branches:  trunk
changeset: 765833:c34b0ea6f577
user:      tsutsui <tsutsui%NetBSD.org@localhost>
date:      Tue Jun 07 14:22:14 2011 +0000

description:
Pull following m68k softfloat fixes from upstream:
---
Revision 109143
2005-12-29  Paul Brook  <paul%codesourcery.com@localhost>
        * config/m68k/fpgnulib.c (__extendsfdf2): Handle negative zero.
        (__truncdfsf2): Ditto.
        (__extenddfxf2): Ditto.
        (__truncxfdf2): Ditto.
        * config/m68k/lb1sf68.asm (__addsf3): Return -0.0 for -0.0 + -0.0.
        (__adddf3): Ditto.
---
Revision 109145
2005-12-29  Paul Brook  <paul%codesourcery.com@localhost>
        * config/m68k/lb1sf68.asm (__cmpdf2): Fix typo in immediate mask.
        Create wrapper and rename body...
        (__cmpdf2_internal): ... to this.  Return correct value for unordered
        result.
        (__cmpsf2): Create wrapper and rename body...
        (__cmpsf2_internal): ... to this.  Return corerct value for unordered
        result.
        (__eqdf2, __nedf2, __gtdf2, __gedf2, __ltdf2, __ledf2): Use
        __cmpdf2_internal.
        (__eqsf2, __nesf2, __gtsf2, __gesf2, __ltsf2, __lesf2): Use
        __cmpsf2_internal.
---
Revision 110744
        * gcc/config/m68k/lb1sf68.asm (__divsf3, __divdf3, __mulsf3,
        __muldf3): Return a correctly signed zero.
---

Note:
 - lb1sf68.asm revision 110744 is still GPLv2.
 - fpgnulib.c is not GPLed.

diffstat:

 gnu/dist/gcc4/gcc/config/m68k/fpgnulib.c  |   32 ++++--
 gnu/dist/gcc4/gcc/config/m68k/lb1sf68.asm |  139 +++++++++++++++++++++--------
 2 files changed, 119 insertions(+), 52 deletions(-)

diffs (truncated from 485 to 300 lines):

diff -r a52f0185793f -r c34b0ea6f577 gnu/dist/gcc4/gcc/config/m68k/fpgnulib.c
--- a/gnu/dist/gcc4/gcc/config/m68k/fpgnulib.c  Tue Jun 07 13:52:30 2011 +0000
+++ b/gnu/dist/gcc4/gcc/config/m68k/fpgnulib.c  Tue Jun 07 14:22:14 2011 +0000
@@ -241,13 +241,13 @@
 
   fl1.f = a1;
 
-  if (!fl1.l)
+  dl.l.upper = SIGN (fl1.l);
+  if ((fl1.l & ~SIGNBIT) == 0)
     {
-      dl.l.upper = dl.l.lower = 0;
+      dl.l.lower = 0;
       return dl.d;
     }
 
-  dl.l.upper = SIGN (fl1.l);
   exp = EXP(fl1.l);
   mant = MANT (fl1.l) & ~HIDDEN;
   if (exp == 0)
@@ -280,8 +280,11 @@
 
   dl1.d = a1;
 
-  if (!dl1.l.upper && !dl1.l.lower)
-    return 0;
+  if ((dl1.l.upper & ~SIGNBIT) == 0 && !dl1.l.lower)
+    {
+      fl.l = SIGND(dl1);
+      return fl.f;
+    }
 
   exp = EXPD (dl1) - EXCESSD + EXCESS;
 
@@ -399,10 +402,14 @@
   dl.d = d;
   /*printf ("dfxf in: %g\n", d);*/
 
-  if (!dl.l.upper && !dl.l.lower)
-    return 0;
+  ldl.l.upper = SIGND (dl);
+  if ((dl.l.upper & ~SIGNBIT) == 0 && !dl.l.lower)
+    {
+      ldl.l.middle = 0;
+      ldl.l.lower = 0;
+      return ldl.ld;
+    }
 
-  ldl.l.upper = SIGND (dl);
   exp = EXPD (dl) - EXCESSD + EXCESSX;
   ldl.l.upper |= exp << 16;
   ldl.l.middle = HIDDENX;
@@ -428,14 +435,17 @@
   ldl.ld = ld;
   /*printf ("xfdf in: %s\n", dumpxf (ld));*/
 
-  if (!ldl.l.upper && !ldl.l.middle && !ldl.l.lower)
-    return 0;
+  dl.l.upper = SIGNX (ldl);
+  if ((ldl.l.upper & ~SIGNBIT) == 0 && !ldl.l.middle && !ldl.l.lower)
+    {
+      dl.l.lower = 0;
+      return dl.d;
+    }
 
   exp = EXPX (ldl) - EXCESSX + EXCESSD;
   /* ??? quick and dirty: keep `exp' sane */
   if (exp >= EXPDMASK)
     exp = EXPDMASK - 1;
-  dl.l.upper = SIGNX (ldl);
   dl.l.upper |= exp << (32 - (EXPDBITS + 1));
   /* +1-1: add one for sign bit, but take one off for explicit-integer-bit */
   dl.l.upper |= (ldl.l.middle & MANTXMASK) >> (EXPDBITS + 1 - 1);
diff -r a52f0185793f -r c34b0ea6f577 gnu/dist/gcc4/gcc/config/m68k/lb1sf68.asm
--- a/gnu/dist/gcc4/gcc/config/m68k/lb1sf68.asm Tue Jun 07 13:52:30 2011 +0000
+++ b/gnu/dist/gcc4/gcc/config/m68k/lb1sf68.asm Tue Jun 07 14:22:14 2011 +0000
@@ -599,6 +599,7 @@
        .globl SYM (__divdf3)
        .globl SYM (__negdf2)
        .globl SYM (__cmpdf2)
+       .globl SYM (__cmpdf2_internal)
 
        .text
        .even
@@ -1285,7 +1286,12 @@
 | Return b (if a is zero)
        movel   d2,d0
        movel   d3,d1
-       bra     1f
+       bne     1f                      | Check if b is -0
+       cmpl    IMM (0x80000000),d0
+       bne     1f
+       andl    IMM (0x80000000),d7     | Use the sign of a
+       clrl    d0
+       bra     Ladddf$ret
 Ladddf$a:
        movel   a6@(8),d0
        movel   a6@(12),d1
@@ -1665,16 +1671,16 @@
 #ifndef __mcoldfire__
        exg     d2,d0           | put b (==0) into d0-d1
        exg     d3,d1           | and a (with sign bit cleared) into d2-d3
+       movel   a0,d0           | set result sign
 #else
-       movel   d2,d7
-       movel   d0,d2
-       movel   d7,d0
-       movel   d3,d7
+       movel   d0,d2           | put a into d2-d3
        movel   d1,d3
-       movel   d7,d1
+       movel   a0,d0           | put result zero into d0-d1
+       movq    IMM(0),d1
 #endif
        bra     1f
 Lmuldf$a$0:
+       movel   a0,d0           | set result sign
        movel   a6@(16),d2      | put b into d2-d3 again
        movel   a6@(20),d3      |
        bclr    IMM (31),d2     | clear sign bit
@@ -1952,7 +1958,7 @@
 Ldivdf$a$0:
 | If a is zero check to see whether b is zero also. In that case return
 | NaN; then check if b is NaN, and return NaN also in that case. Else
-| return zero.
+| return a properly signed zero.
        moveq   IMM (DIVIDE),d5
        bclr    IMM (31),d2     |
        movel   d2,d4           | 
@@ -1963,8 +1969,8 @@
        blt     1f              |
        tstl    d3              |
        bne     Ld$inop         |
-1:     movel   IMM (0),d0      | else return zero
-       movel   d0,d1           | 
+1:     movel   a0,d0           | else return signed zero
+       moveq   IMM(0),d1       | 
        PICLEA  SYM (_fpCCR),a0 | clear exception flags
        movew   IMM (0),a0@     |
 #ifndef __mcoldfire__
@@ -2218,8 +2224,8 @@
 LESS    = -1
 EQUAL   =  0
 
-| int __cmpdf2(double, double);
-SYM (__cmpdf2):
+| int __cmpdf2_internal(double, double, int);
+SYM (__cmpdf2_internal):
 #ifndef __mcoldfire__
        link    a6,IMM (0)
        moveml  d2-d7,sp@-      | save registers
@@ -2238,15 +2244,15 @@
        bclr    IMM (31),d0     | and clear signs in d0 and d2
        movel   d2,d7           |
        bclr    IMM (31),d2     |
-       cmpl    IMM (0x7fff0000),d0 | check for a == NaN
-       bhi     Ld$inop         | if d0 > 0x7ff00000, a is NaN
+       cmpl    IMM (0x7ff00000),d0 | check for a == NaN
+       bhi     Lcmpd$inop              | if d0 > 0x7ff00000, a is NaN
        beq     Lcmpdf$a$nf     | if equal can be INFINITY, so check d1
        movel   d0,d4           | copy into d4 to test for zero
        orl     d1,d4           |
        beq     Lcmpdf$a$0      |
 Lcmpdf$0:
-       cmpl    IMM (0x7fff0000),d2 | check for b == NaN
-       bhi     Ld$inop         | if d2 > 0x7ff00000, b is NaN
+       cmpl    IMM (0x7ff00000),d2 | check for b == NaN
+       bhi     Lcmpd$inop              | if d2 > 0x7ff00000, b is NaN
        beq     Lcmpdf$b$nf     | if equal can be INFINITY, so check d3
        movel   d2,d4           |
        orl     d3,d4           |
@@ -2336,6 +2342,24 @@
        bne     Ld$inop
        bra     Lcmpdf$1
 
+Lcmpd$inop:
+       movl    a6@(24),d0
+       movew   IMM (INEXACT_RESULT+INVALID_OPERATION),d7
+       moveq   IMM (DOUBLE_FLOAT),d6
+       PICJUMP $_exception_handler
+
+| int __cmpdf2(double, double);
+SYM (__cmpdf2):
+       link    a6,IMM (0)
+       pea     1
+       movl    a6@(20),sp@-
+       movl    a6@(16),sp@-
+       movl    a6@(12),sp@-
+       movl    a6@(8),sp@-
+       bsr     SYM (__cmpdf2_internal)
+       unlk    a6
+       rts
+
 |=============================================================================
 |                           rounding routines
 |=============================================================================
@@ -2483,6 +2507,7 @@
        .globl SYM (__divsf3)
        .globl SYM (__negsf2)
        .globl SYM (__cmpsf2)
+       .globl SYM (__cmpsf2_internal)
 
 | These are common routines to return and signal exceptions.   
 
@@ -2570,16 +2595,13 @@
 #endif
        movel   a6@(8),d0       | get first operand
        movel   a6@(12),d1      | get second operand
-       movel   d0,d6           | get d0's sign bit '
+       movel   d0,a0           | get d0's sign bit '
        addl    d0,d0           | check and clear sign bit of a
        beq     Laddsf$b        | if zero return second operand
-       movel   d1,d7           | save b's sign bit '
+       movel   d1,a1           | save b's sign bit '
        addl    d1,d1           | get rid of sign bit
        beq     Laddsf$a        | if zero return first operand
 
-       movel   d6,a0           | save signs in address registers
-       movel   d7,a1           | so we can use d6 and d7
-
 | Get the exponents and check for denormalized and/or infinity.
 
        movel   IMM (0x00ffffff),d4     | mask to get fraction
@@ -2950,7 +2972,12 @@
 Laddsf$b:
 | Return b (if a is zero).
        movel   a6@(12),d0
-       bra     1f
+       cmpl    IMM (0x80000000),d0     | Check if b is -0
+       bne     1f
+       movel   a0,d7
+       andl    IMM (0x80000000),d7     | Use the sign of a
+       clrl    d0
+       bra     Laddsf$ret
 Laddsf$a:
 | Return a (if b is zero).
        movel   a6@(8),d0
@@ -3203,7 +3230,6 @@
 | or NaN, in which case we return NaN.
 Lmulsf$b$0:
 | Here d1 (==b) is zero.
-       movel   d1,d0           | put b into d0 (just a zero)
        movel   a6@(8),d1       | get a again to check for non-finiteness
        bra     1f
 Lmulsf$a$0:
@@ -3211,7 +3237,8 @@
 1:     bclr    IMM (31),d1     | clear sign bit 
        cmpl    IMM (INFINITY),d1 | and check for a large exponent
        bge     Lf$inop         | if b is +/-INFINITY or NaN return NaN
-       PICLEA  SYM (_fpCCR),a0 | else return zero
+       movel   d7,d0           | else return signed zero
+       PICLEA  SYM (_fpCCR),a0 |
        movew   IMM (0),a0@     | 
 #ifndef __mcoldfire__
        moveml  sp@+,d2-d7      | 
@@ -3405,12 +3432,12 @@
        moveq   IMM (DIVIDE),d5
 | If a is zero check to see whether b is zero also. In that case return
 | NaN; then check if b is NaN, and return NaN also in that case. Else
-| return zero.
+| return a properly signed zero.
        andl    IMM (0x7fffffff),d1     | clear sign bit and test b
        beq     Lf$inop                 | if b is also zero return NaN
        cmpl    IMM (INFINITY),d1       | check for NaN
        bhi     Lf$inop                 | 
-       movel   IMM (0),d0              | else return zero
+       movel   d7,d0                   | else return signed zero
        PICLEA  SYM (_fpCCR),a0         |
        movew   IMM (0),a0@             |
 #ifndef __mcoldfire__
@@ -3626,8 +3653,8 @@
 LESS    = -1
 EQUAL   =  0
 
-| int __cmpsf2(float, float);
-SYM (__cmpsf2):
+| int __cmpsf2_internal(float, float, int);
+SYM (__cmpsf2_internal):
 #ifndef __mcoldfire__
        link    a6,IMM (0)
        moveml  d2-d7,sp@-      | save registers
@@ -3645,13 +3672,13 @@
        andl    IMM (0x7fffffff),d0
        beq     Lcmpsf$a$0
        cmpl    IMM (0x7f800000),d0
-       bhi     Lf$inop
+       bhi     Lcmpf$inop
 Lcmpsf$1:
        movel   d1,d7
        andl    IMM (0x7fffffff),d1
        beq     Lcmpsf$b$0
        cmpl    IMM (0x7f800000),d1
-       bhi     Lf$inop
+       bhi     Lcmpf$inop
 Lcmpsf$2:
 | Check the signs
        eorl    d6,d7
@@ -3717,6 +3744,22 @@
        bclr    IMM (31),d7
        bra     Lcmpsf$2



Home | Main Index | Thread Index | Old Index