libgcc: xtensa: fix NaN return from add/sub/mul/div helpers
libgcc/ 2018-01-23 Max Filippov <jcmvbkbc@gmail.com> * config/xtensa/ieee754-df.S (__addsf3, __subsf3, __mulsf3) (__divsf3): Make NaN return value quiet. * config/xtensa/ieee754-sf.S (__adddf3, __subdf3, __muldf3) (__divdf3): Make NaN return value quiet. From-SVN: r257002
This commit is contained in:
parent
ea070f267c
commit
0889f16859
|
@ -1,3 +1,10 @@
|
||||||
|
2018-01-23 Max Filippov <jcmvbkbc@gmail.com>
|
||||||
|
|
||||||
|
* config/xtensa/ieee754-df.S (__addsf3, __subsf3, __mulsf3)
|
||||||
|
(__divsf3): Make NaN return value quiet.
|
||||||
|
* config/xtensa/ieee754-sf.S (__adddf3, __subdf3, __muldf3)
|
||||||
|
(__divdf3): Make NaN return value quiet.
|
||||||
|
|
||||||
2018-01-22 Sebastian Perta <sebastian.perta@renesas.com>
|
2018-01-22 Sebastian Perta <sebastian.perta@renesas.com>
|
||||||
|
|
||||||
* config/rl78/anddi3.S: New assembly file.
|
* config/rl78/anddi3.S: New assembly file.
|
||||||
|
|
|
@ -64,17 +64,26 @@ __adddf3_aux:
|
||||||
|
|
||||||
.Ladd_xnan_or_inf:
|
.Ladd_xnan_or_inf:
|
||||||
/* If y is neither Infinity nor NaN, return x. */
|
/* If y is neither Infinity nor NaN, return x. */
|
||||||
bnall yh, a6, 1f
|
bnall yh, a6, .Ladd_return_nan_or_inf
|
||||||
/* If x is a NaN, return it. Otherwise, return y. */
|
/* If x is a NaN, return it. Otherwise, return y. */
|
||||||
slli a7, xh, 12
|
slli a7, xh, 12
|
||||||
or a7, a7, xl
|
or a7, a7, xl
|
||||||
beqz a7, .Ladd_ynan_or_inf
|
bnez a7, .Ladd_return_nan
|
||||||
1: leaf_return
|
|
||||||
|
|
||||||
.Ladd_ynan_or_inf:
|
.Ladd_ynan_or_inf:
|
||||||
/* Return y. */
|
/* Return y. */
|
||||||
mov xh, yh
|
mov xh, yh
|
||||||
mov xl, yl
|
mov xl, yl
|
||||||
|
|
||||||
|
.Ladd_return_nan_or_inf:
|
||||||
|
slli a7, xh, 12
|
||||||
|
or a7, a7, xl
|
||||||
|
bnez a7, .Ladd_return_nan
|
||||||
|
leaf_return
|
||||||
|
|
||||||
|
.Ladd_return_nan:
|
||||||
|
movi a4, 0x80000 /* make it a quiet NaN */
|
||||||
|
or xh, xh, a4
|
||||||
leaf_return
|
leaf_return
|
||||||
|
|
||||||
.Ladd_opposite_signs:
|
.Ladd_opposite_signs:
|
||||||
|
@ -319,17 +328,24 @@ __subdf3_aux:
|
||||||
|
|
||||||
.Lsub_xnan_or_inf:
|
.Lsub_xnan_or_inf:
|
||||||
/* If y is neither Infinity nor NaN, return x. */
|
/* If y is neither Infinity nor NaN, return x. */
|
||||||
bnall yh, a6, 1f
|
bnall yh, a6, .Lsub_return_nan_or_inf
|
||||||
|
|
||||||
|
.Lsub_return_nan:
|
||||||
/* Both x and y are either NaN or Inf, so the result is NaN. */
|
/* Both x and y are either NaN or Inf, so the result is NaN. */
|
||||||
movi a4, 0x80000 /* make it a quiet NaN */
|
movi a4, 0x80000 /* make it a quiet NaN */
|
||||||
or xh, xh, a4
|
or xh, xh, a4
|
||||||
1: leaf_return
|
leaf_return
|
||||||
|
|
||||||
.Lsub_ynan_or_inf:
|
.Lsub_ynan_or_inf:
|
||||||
/* Negate y and return it. */
|
/* Negate y and return it. */
|
||||||
slli a7, a6, 11
|
slli a7, a6, 11
|
||||||
xor xh, yh, a7
|
xor xh, yh, a7
|
||||||
mov xl, yl
|
mov xl, yl
|
||||||
|
|
||||||
|
.Lsub_return_nan_or_inf:
|
||||||
|
slli a7, xh, 12
|
||||||
|
or a7, a7, xl
|
||||||
|
bnez a7, .Lsub_return_nan
|
||||||
leaf_return
|
leaf_return
|
||||||
|
|
||||||
.Lsub_opposite_signs:
|
.Lsub_opposite_signs:
|
||||||
|
@ -692,10 +708,7 @@ __muldf3_aux:
|
||||||
/* If y is zero, return NaN. */
|
/* If y is zero, return NaN. */
|
||||||
bnez yl, 1f
|
bnez yl, 1f
|
||||||
slli a8, yh, 1
|
slli a8, yh, 1
|
||||||
bnez a8, 1f
|
beqz a8, .Lmul_return_nan
|
||||||
movi a4, 0x80000 /* make it a quiet NaN */
|
|
||||||
or xh, xh, a4
|
|
||||||
j .Lmul_done
|
|
||||||
1:
|
1:
|
||||||
/* If y is NaN, return y. */
|
/* If y is NaN, return y. */
|
||||||
bnall yh, a6, .Lmul_returnx
|
bnall yh, a6, .Lmul_returnx
|
||||||
|
@ -708,6 +721,9 @@ __muldf3_aux:
|
||||||
mov xl, yl
|
mov xl, yl
|
||||||
|
|
||||||
.Lmul_returnx:
|
.Lmul_returnx:
|
||||||
|
slli a8, xh, 12
|
||||||
|
or a8, a8, xl
|
||||||
|
bnez a8, .Lmul_return_nan
|
||||||
/* Set the sign bit and return. */
|
/* Set the sign bit and return. */
|
||||||
extui a7, a7, 31, 1
|
extui a7, a7, 31, 1
|
||||||
slli xh, xh, 1
|
slli xh, xh, 1
|
||||||
|
@ -720,8 +736,11 @@ __muldf3_aux:
|
||||||
bnez xl, .Lmul_returny
|
bnez xl, .Lmul_returny
|
||||||
slli a8, xh, 1
|
slli a8, xh, 1
|
||||||
bnez a8, .Lmul_returny
|
bnez a8, .Lmul_returny
|
||||||
movi a7, 0x80000 /* make it a quiet NaN */
|
mov xh, yh
|
||||||
or xh, yh, a7
|
|
||||||
|
.Lmul_return_nan:
|
||||||
|
movi a4, 0x80000 /* make it a quiet NaN */
|
||||||
|
or xh, xh, a4
|
||||||
j .Lmul_done
|
j .Lmul_done
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
|
@ -1370,10 +1389,11 @@ __divdf3_aux:
|
||||||
slli a7, a7, 31
|
slli a7, a7, 31
|
||||||
xor xh, xh, a7
|
xor xh, xh, a7
|
||||||
/* If y is NaN or Inf, return NaN. */
|
/* If y is NaN or Inf, return NaN. */
|
||||||
bnall yh, a6, 1f
|
ball yh, a6, .Ldiv_return_nan
|
||||||
movi a4, 0x80000 /* make it a quiet NaN */
|
slli a8, xh, 12
|
||||||
or xh, xh, a4
|
or a8, a8, xl
|
||||||
1: leaf_return
|
bnez a8, .Ldiv_return_nan
|
||||||
|
leaf_return
|
||||||
|
|
||||||
.Ldiv_ynan_or_inf:
|
.Ldiv_ynan_or_inf:
|
||||||
/* If y is Infinity, return zero. */
|
/* If y is Infinity, return zero. */
|
||||||
|
@ -1383,6 +1403,10 @@ __divdf3_aux:
|
||||||
/* y is NaN; return it. */
|
/* y is NaN; return it. */
|
||||||
mov xh, yh
|
mov xh, yh
|
||||||
mov xl, yl
|
mov xl, yl
|
||||||
|
|
||||||
|
.Ldiv_return_nan:
|
||||||
|
movi a4, 0x80000 /* make it a quiet NaN */
|
||||||
|
or xh, xh, a4
|
||||||
leaf_return
|
leaf_return
|
||||||
|
|
||||||
.Ldiv_highequal1:
|
.Ldiv_highequal1:
|
||||||
|
|
|
@ -64,15 +64,23 @@ __addsf3_aux:
|
||||||
|
|
||||||
.Ladd_xnan_or_inf:
|
.Ladd_xnan_or_inf:
|
||||||
/* If y is neither Infinity nor NaN, return x. */
|
/* If y is neither Infinity nor NaN, return x. */
|
||||||
bnall a3, a6, 1f
|
bnall a3, a6, .Ladd_return_nan_or_inf
|
||||||
/* If x is a NaN, return it. Otherwise, return y. */
|
/* If x is a NaN, return it. Otherwise, return y. */
|
||||||
slli a7, a2, 9
|
slli a7, a2, 9
|
||||||
beqz a7, .Ladd_ynan_or_inf
|
bnez a7, .Ladd_return_nan
|
||||||
1: leaf_return
|
|
||||||
|
|
||||||
.Ladd_ynan_or_inf:
|
.Ladd_ynan_or_inf:
|
||||||
/* Return y. */
|
/* Return y. */
|
||||||
mov a2, a3
|
mov a2, a3
|
||||||
|
|
||||||
|
.Ladd_return_nan_or_inf:
|
||||||
|
slli a7, a2, 9
|
||||||
|
bnez a7, .Ladd_return_nan
|
||||||
|
leaf_return
|
||||||
|
|
||||||
|
.Ladd_return_nan:
|
||||||
|
movi a6, 0x400000 /* make it a quiet NaN */
|
||||||
|
or a2, a2, a6
|
||||||
leaf_return
|
leaf_return
|
||||||
|
|
||||||
.Ladd_opposite_signs:
|
.Ladd_opposite_signs:
|
||||||
|
@ -265,16 +273,22 @@ __subsf3_aux:
|
||||||
|
|
||||||
.Lsub_xnan_or_inf:
|
.Lsub_xnan_or_inf:
|
||||||
/* If y is neither Infinity nor NaN, return x. */
|
/* If y is neither Infinity nor NaN, return x. */
|
||||||
bnall a3, a6, 1f
|
bnall a3, a6, .Lsub_return_nan_or_inf
|
||||||
/* Both x and y are either NaN or Inf, so the result is NaN. */
|
/* Both x and y are either NaN or Inf, so the result is NaN. */
|
||||||
|
|
||||||
|
.Lsub_return_nan:
|
||||||
movi a4, 0x400000 /* make it a quiet NaN */
|
movi a4, 0x400000 /* make it a quiet NaN */
|
||||||
or a2, a2, a4
|
or a2, a2, a4
|
||||||
1: leaf_return
|
leaf_return
|
||||||
|
|
||||||
.Lsub_ynan_or_inf:
|
.Lsub_ynan_or_inf:
|
||||||
/* Negate y and return it. */
|
/* Negate y and return it. */
|
||||||
slli a7, a6, 8
|
slli a7, a6, 8
|
||||||
xor a2, a3, a7
|
xor a2, a3, a7
|
||||||
|
|
||||||
|
.Lsub_return_nan_or_inf:
|
||||||
|
slli a7, a2, 9
|
||||||
|
bnez a7, .Lsub_return_nan
|
||||||
leaf_return
|
leaf_return
|
||||||
|
|
||||||
.Lsub_opposite_signs:
|
.Lsub_opposite_signs:
|
||||||
|
@ -537,11 +551,7 @@ __mulsf3_aux:
|
||||||
.Lmul_xnan_or_inf:
|
.Lmul_xnan_or_inf:
|
||||||
/* If y is zero, return NaN. */
|
/* If y is zero, return NaN. */
|
||||||
slli a8, a3, 1
|
slli a8, a3, 1
|
||||||
bnez a8, 1f
|
beqz a8, .Lmul_return_nan
|
||||||
movi a4, 0x400000 /* make it a quiet NaN */
|
|
||||||
or a2, a2, a4
|
|
||||||
j .Lmul_done
|
|
||||||
1:
|
|
||||||
/* If y is NaN, return y. */
|
/* If y is NaN, return y. */
|
||||||
bnall a3, a6, .Lmul_returnx
|
bnall a3, a6, .Lmul_returnx
|
||||||
slli a8, a3, 9
|
slli a8, a3, 9
|
||||||
|
@ -551,6 +561,8 @@ __mulsf3_aux:
|
||||||
mov a2, a3
|
mov a2, a3
|
||||||
|
|
||||||
.Lmul_returnx:
|
.Lmul_returnx:
|
||||||
|
slli a8, a2, 9
|
||||||
|
bnez a8, .Lmul_return_nan
|
||||||
/* Set the sign bit and return. */
|
/* Set the sign bit and return. */
|
||||||
extui a7, a7, 31, 1
|
extui a7, a7, 31, 1
|
||||||
slli a2, a2, 1
|
slli a2, a2, 1
|
||||||
|
@ -562,8 +574,11 @@ __mulsf3_aux:
|
||||||
/* If x is zero, return NaN. */
|
/* If x is zero, return NaN. */
|
||||||
slli a8, a2, 1
|
slli a8, a2, 1
|
||||||
bnez a8, .Lmul_returny
|
bnez a8, .Lmul_returny
|
||||||
movi a7, 0x400000 /* make it a quiet NaN */
|
mov a2, a3
|
||||||
or a2, a3, a7
|
|
||||||
|
.Lmul_return_nan:
|
||||||
|
movi a4, 0x400000 /* make it a quiet NaN */
|
||||||
|
or a2, a2, a4
|
||||||
j .Lmul_done
|
j .Lmul_done
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
|
@ -995,10 +1010,10 @@ __divsf3_aux:
|
||||||
slli a7, a7, 31
|
slli a7, a7, 31
|
||||||
xor a2, a2, a7
|
xor a2, a2, a7
|
||||||
/* If y is NaN or Inf, return NaN. */
|
/* If y is NaN or Inf, return NaN. */
|
||||||
bnall a3, a6, 1f
|
ball a3, a6, .Ldiv_return_nan
|
||||||
movi a4, 0x400000 /* make it a quiet NaN */
|
slli a7, a2, 9
|
||||||
or a2, a2, a4
|
bnez a7, .Ldiv_return_nan
|
||||||
1: leaf_return
|
leaf_return
|
||||||
|
|
||||||
.Ldiv_ynan_or_inf:
|
.Ldiv_ynan_or_inf:
|
||||||
/* If y is Infinity, return zero. */
|
/* If y is Infinity, return zero. */
|
||||||
|
@ -1006,6 +1021,10 @@ __divsf3_aux:
|
||||||
beqz a8, .Ldiv_return_zero
|
beqz a8, .Ldiv_return_zero
|
||||||
/* y is NaN; return it. */
|
/* y is NaN; return it. */
|
||||||
mov a2, a3
|
mov a2, a3
|
||||||
|
|
||||||
|
.Ldiv_return_nan:
|
||||||
|
movi a4, 0x400000 /* make it a quiet NaN */
|
||||||
|
or a2, a2, a4
|
||||||
leaf_return
|
leaf_return
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
|
|
Loading…
Reference in New Issue