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