2005-12-29 Paul Brook <paul@codesourcery.com>
+ * 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.
+
+2005-12-29 Paul Brook <paul@codesourcery.com>
+
* config/m68k/fpgnulib.c (__extendsfdf2): Handle negative zero.
(__truncdfsf2): Ditto.
(__extenddfxf2): Ditto.
.globl SYM (__divdf3)
.globl SYM (__negdf2)
.globl SYM (__cmpdf2)
+ .globl SYM (__cmpdf2_internal)
.text
.even
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
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 |
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
|=============================================================================
.globl SYM (__divsf3)
.globl SYM (__negsf2)
.globl SYM (__cmpsf2)
+ .globl SYM (__cmpsf2_internal)
| These are common routines to return and signal exceptions.
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
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
bclr IMM (31),d7
bra Lcmpsf$2
+Lcmpf$inop:
+ movl a6@(16),d0
+ movew IMM (INEXACT_RESULT+INVALID_OPERATION),d7
+ moveq IMM (SINGLE_FLOAT),d6
+ PICJUMP $_exception_handler
+
+| int __cmpsf2(float, float);
+SYM (__cmpsf2):
+ link a6,IMM (0)
+ pea 1
+ movl a6@(12),sp@-
+ movl a6@(8),sp@-
+ bsr (__cmpsf2_internal)
+ unlk a6
+ rts
+
|=============================================================================
| rounding routines
|=============================================================================
| simply calls __cmpdf2. It would be more efficient to give the
| __cmpdf2 routine several names, but separating them out will make it
| easier to write efficient versions of these routines someday.
+| If the operands recompare unordered unordered __gtdf2 and __gedf2 return -1.
+| The other routines return 1.
#ifdef L_eqdf2
.text
.globl SYM (__eqdf2)
SYM (__eqdf2):
link a6,IMM (0)
+ pea 1
movl a6@(20),sp@-
movl a6@(16),sp@-
movl a6@(12),sp@-
movl a6@(8),sp@-
- PICCALL SYM (__cmpdf2)
+ PICCALL SYM (__cmpdf2_internal)
unlk a6
rts
#endif /* L_eqdf2 */
.globl SYM (__nedf2)
SYM (__nedf2):
link a6,IMM (0)
+ pea 1
movl a6@(20),sp@-
movl a6@(16),sp@-
movl a6@(12),sp@-
movl a6@(8),sp@-
- PICCALL SYM (__cmpdf2)
+ PICCALL SYM (__cmpdf2_internal)
unlk a6
rts
#endif /* L_nedf2 */
.globl SYM (__gtdf2)
SYM (__gtdf2):
link a6,IMM (0)
+ pea -1
movl a6@(20),sp@-
movl a6@(16),sp@-
movl a6@(12),sp@-
movl a6@(8),sp@-
- PICCALL SYM (__cmpdf2)
+ PICCALL SYM (__cmpdf2_internal)
unlk a6
rts
#endif /* L_gtdf2 */
.globl SYM (__gedf2)
SYM (__gedf2):
link a6,IMM (0)
+ pea -1
movl a6@(20),sp@-
movl a6@(16),sp@-
movl a6@(12),sp@-
movl a6@(8),sp@-
- PICCALL SYM (__cmpdf2)
+ PICCALL SYM (__cmpdf2_internal)
unlk a6
rts
#endif /* L_gedf2 */
.globl SYM (__ltdf2)
SYM (__ltdf2):
link a6,IMM (0)
+ pea 1
movl a6@(20),sp@-
movl a6@(16),sp@-
movl a6@(12),sp@-
movl a6@(8),sp@-
- PICCALL SYM (__cmpdf2)
+ PICCALL SYM (__cmpdf2_internal)
unlk a6
rts
#endif /* L_ltdf2 */
.globl SYM (__ledf2)
SYM (__ledf2):
link a6,IMM (0)
+ pea 1
movl a6@(20),sp@-
movl a6@(16),sp@-
movl a6@(12),sp@-
movl a6@(8),sp@-
- PICCALL SYM (__cmpdf2)
+ PICCALL SYM (__cmpdf2_internal)
unlk a6
rts
#endif /* L_ledf2 */
.globl SYM (__eqsf2)
SYM (__eqsf2):
link a6,IMM (0)
+ pea 1
movl a6@(12),sp@-
movl a6@(8),sp@-
- PICCALL SYM (__cmpsf2)
+ PICCALL SYM (__cmpsf2_internal)
unlk a6
rts
#endif /* L_eqsf2 */
.globl SYM (__nesf2)
SYM (__nesf2):
link a6,IMM (0)
+ pea 1
movl a6@(12),sp@-
movl a6@(8),sp@-
- PICCALL SYM (__cmpsf2)
+ PICCALL SYM (__cmpsf2_internal)
unlk a6
rts
#endif /* L_nesf2 */
.globl SYM (__gtsf2)
SYM (__gtsf2):
link a6,IMM (0)
+ pea -1
movl a6@(12),sp@-
movl a6@(8),sp@-
- PICCALL SYM (__cmpsf2)
+ PICCALL SYM (__cmpsf2_internal)
unlk a6
rts
#endif /* L_gtsf2 */
.globl SYM (__gesf2)
SYM (__gesf2):
link a6,IMM (0)
+ pea -1
movl a6@(12),sp@-
movl a6@(8),sp@-
- PICCALL SYM (__cmpsf2)
+ PICCALL SYM (__cmpsf2_internal)
unlk a6
rts
#endif /* L_gesf2 */
.globl SYM (__ltsf2)
SYM (__ltsf2):
link a6,IMM (0)
+ pea 1
movl a6@(12),sp@-
movl a6@(8),sp@-
- PICCALL SYM (__cmpsf2)
+ PICCALL SYM (__cmpsf2_internal)
unlk a6
rts
#endif /* L_ltsf2 */
.globl SYM (__lesf2)
SYM (__lesf2):
link a6,IMM (0)
+ pea 1
movl a6@(12),sp@-
movl a6@(8),sp@-
- PICCALL SYM (__cmpsf2)
+ PICCALL SYM (__cmpsf2_internal)
unlk a6
rts
#endif /* L_lesf2 */