lib1funcs.asm: Rename abi_entry/abi_return macros to leaf_entry/leaf_return.
* config/xtensa/lib1funcs.asm: Rename abi_entry/abi_return macros to leaf_entry/leaf_return. Change leaf_entry to add 16 bytes to the frame size. Update to use the new macros. * config/xtensa/ieee754-sf.S: Use new leaf_entry/leaf_return macros. * config/xtensa/ieee754-df.S: Likewise. From-SVN: r112604
This commit is contained in:
parent
56e8401921
commit
b7974b3af5
4 changed files with 216 additions and 207 deletions
|
@ -1,4 +1,12 @@
|
|||
2004-03-31 Richard Henderson <rth@redhat.com>
|
||||
2006-03-31 Bob Wilson <bob.wilson@acm.org>
|
||||
|
||||
* config/xtensa/lib1funcs.asm: Rename abi_entry/abi_return macros
|
||||
to leaf_entry/leaf_return. Change leaf_entry to add 16 bytes to
|
||||
the frame size. Update to use the new macros.
|
||||
* config/xtensa/ieee754-sf.S: Use new leaf_entry/leaf_return macros.
|
||||
* config/xtensa/ieee754-df.S: Likewise.
|
||||
|
||||
2006-03-31 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* tree-cfg.c (make_ctrl_stmt_edges, make_exit_edges): Merge into...
|
||||
(make_edges): ... here. Control fallthru creation with a local
|
||||
|
|
|
@ -51,10 +51,10 @@
|
|||
.global __negdf2
|
||||
.type __negdf2, @function
|
||||
__negdf2:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a4, 0x80000000
|
||||
xor xh, xh, a4
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_negdf2 */
|
||||
|
||||
|
@ -74,13 +74,13 @@ __adddf3_aux:
|
|||
slli a7, xh, 12
|
||||
or a7, a7, xl
|
||||
beqz a7, .Ladd_ynan_or_inf
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Ladd_ynan_or_inf:
|
||||
/* Return y. */
|
||||
mov xh, yh
|
||||
mov xl, yl
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Ladd_opposite_signs:
|
||||
/* Operand signs differ. Do a subtraction. */
|
||||
|
@ -92,7 +92,7 @@ __adddf3_aux:
|
|||
.global __adddf3
|
||||
.type __adddf3, @function
|
||||
__adddf3:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a6, 0x7ff00000
|
||||
|
||||
/* Check if the two operands have the same sign. */
|
||||
|
@ -166,7 +166,7 @@ __adddf3:
|
|||
add xh, xh, yh
|
||||
bgeu xl, yl, 1f
|
||||
addi xh, xh, 1
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Ladd_bigshifty:
|
||||
/* Exponent difference > 64 -- just return the bigger value. */
|
||||
|
@ -229,7 +229,7 @@ __adddf3:
|
|||
/* Check if the leftover fraction is exactly 1/2. */
|
||||
slli a9, a9, 1
|
||||
beqz a9, .Ladd_exactlyhalf
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Ladd_bigshiftx:
|
||||
/* Mostly the same thing as "bigshifty".... */
|
||||
|
@ -247,7 +247,7 @@ __adddf3:
|
|||
.Ladd_returny:
|
||||
mov xh, yh
|
||||
mov xl, yl
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Ladd_carry:
|
||||
/* The addition has overflowed into the exponent field, so the
|
||||
|
@ -288,7 +288,7 @@ __adddf3:
|
|||
addi xl, xl, 1
|
||||
beqz xl, .Ladd_roundcarry
|
||||
beqz a9, .Ladd_exactlyhalf
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Ladd_infinity:
|
||||
/* Clear the mantissa. */
|
||||
|
@ -299,20 +299,20 @@ __adddf3:
|
|||
/* The sign bit may have been lost in a carry-out. Put it back. */
|
||||
slli a8, a8, 1
|
||||
or xh, xh, a8
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Ladd_exactlyhalf:
|
||||
/* Round down to the nearest even value. */
|
||||
srli xl, xl, 1
|
||||
slli xl, xl, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Ladd_roundcarry:
|
||||
/* xl is always zero when the rounding increment overflows, so
|
||||
there's no need to round it to an even value. */
|
||||
addi xh, xh, 1
|
||||
/* Overflow to the exponent is OK. */
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
|
||||
/* Subtraction */
|
||||
|
@ -328,14 +328,14 @@ __subdf3_aux:
|
|||
/* Both x and y are either NaN or Inf, so the result is NaN. */
|
||||
movi a4, 0x80000 /* make it a quiet NaN */
|
||||
or xh, xh, a4
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Lsub_ynan_or_inf:
|
||||
/* Negate y and return it. */
|
||||
slli a7, a6, 11
|
||||
xor xh, yh, a7
|
||||
mov xl, yl
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lsub_opposite_signs:
|
||||
/* Operand signs differ. Do an addition. */
|
||||
|
@ -347,7 +347,7 @@ __subdf3_aux:
|
|||
.global __subdf3
|
||||
.type __subdf3, @function
|
||||
__subdf3:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a6, 0x7ff00000
|
||||
|
||||
/* Check if the two operands have the same sign. */
|
||||
|
@ -415,7 +415,7 @@ __subdf3:
|
|||
/* The operands are equal. Return 0.0. */
|
||||
movi xh, 0
|
||||
movi xl, 0
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Lsub_yexpzero:
|
||||
/* y is a subnormal value. Replace its sign/exponent with zero,
|
||||
|
@ -493,7 +493,7 @@ __subdf3:
|
|||
/* Check if the leftover fraction is exactly 1/2. */
|
||||
slli a9, a9, 1
|
||||
beqz a9, .Lsub_exactlyhalf
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Lsub_xexpzero:
|
||||
/* Same as "yexpzero". */
|
||||
|
@ -523,7 +523,7 @@ __subdf3:
|
|||
slli a7, a6, 11
|
||||
xor xh, yh, a7
|
||||
mov xl, yl
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lsub_borrow:
|
||||
/* The subtraction has underflowed into the exponent field, so the
|
||||
|
@ -560,14 +560,14 @@ __subdf3:
|
|||
/* Round down to the nearest even value. */
|
||||
srli xl, xl, 1
|
||||
slli xl, xl, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lsub_roundcarry:
|
||||
/* xl is always zero when the rounding increment overflows, so
|
||||
there's no need to round it to an even value. */
|
||||
addi xh, xh, 1
|
||||
/* Overflow to the exponent is OK. */
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lsub_xhzero:
|
||||
/* When normalizing the result, all the mantissa bits in the high
|
||||
|
@ -728,7 +728,7 @@ __muldf3_aux:
|
|||
.global __muldf3
|
||||
.type __muldf3, @function
|
||||
__muldf3:
|
||||
abi_entry sp, 48
|
||||
leaf_entry sp, 32
|
||||
#if __XTENSA_CALL0_ABI__
|
||||
addi sp, sp, -32
|
||||
s32i a12, sp, 16
|
||||
|
@ -1093,7 +1093,7 @@ __muldf3:
|
|||
l32i a15, sp, 28
|
||||
addi sp, sp, 32
|
||||
#endif
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lmul_exactlyhalf:
|
||||
/* Round down to the nearest even value. */
|
||||
|
@ -1246,7 +1246,7 @@ __divdf3_aux:
|
|||
movi a4, 0x80000 /* make it a quiet NaN */
|
||||
or xh, xh, a4
|
||||
1: movi xl, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Ldiv_xexpzero:
|
||||
/* Clear the sign bit of x. */
|
||||
|
@ -1287,7 +1287,7 @@ __divdf3_aux:
|
|||
srli xh, a7, 31
|
||||
slli xh, xh, 31
|
||||
movi xl, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Ldiv_xnan_or_inf:
|
||||
/* Set the sign bit of the result. */
|
||||
|
@ -1298,7 +1298,7 @@ __divdf3_aux:
|
|||
bnall yh, a6, 1f
|
||||
movi a4, 0x80000 /* make it a quiet NaN */
|
||||
or xh, xh, a4
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Ldiv_ynan_or_inf:
|
||||
/* If y is Infinity, return zero. */
|
||||
|
@ -1308,7 +1308,7 @@ __divdf3_aux:
|
|||
/* y is NaN; return it. */
|
||||
mov xh, yh
|
||||
mov xl, yl
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Ldiv_highequal1:
|
||||
bltu xl, yl, 2f
|
||||
|
@ -1318,7 +1318,7 @@ __divdf3_aux:
|
|||
.global __divdf3
|
||||
.type __divdf3, @function
|
||||
__divdf3:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a6, 0x7ff00000
|
||||
|
||||
/* Get the sign of the result. */
|
||||
|
@ -1431,7 +1431,7 @@ __divdf3:
|
|||
srli a7, a7, 31
|
||||
slli a7, a7, 31
|
||||
or xh, xh, a7
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Ldiv_highequal2:
|
||||
bgeu xl, yl, 2b
|
||||
|
@ -1510,7 +1510,7 @@ __divdf3:
|
|||
srli xh, a7, 31
|
||||
slli xh, xh, 31
|
||||
movi xl, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_divdf3 */
|
||||
|
||||
|
@ -1524,7 +1524,7 @@ __divdf3:
|
|||
.set __nedf2, __eqdf2
|
||||
.type __eqdf2, @function
|
||||
__eqdf2:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
bne xl, yl, 2f
|
||||
bne xh, yh, 4f
|
||||
|
||||
|
@ -1534,11 +1534,11 @@ __eqdf2:
|
|||
|
||||
/* Equal. */
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
/* Not equal. */
|
||||
2: movi a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
/* Check if the mantissas are nonzero. */
|
||||
3: slli a7, xh, 12
|
||||
|
@ -1555,7 +1555,7 @@ __eqdf2:
|
|||
5: movi a2, 0
|
||||
movi a3, 1
|
||||
movnez a2, a3, a7
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
|
||||
/* Greater Than */
|
||||
|
@ -1564,7 +1564,7 @@ __eqdf2:
|
|||
.global __gtdf2
|
||||
.type __gtdf2, @function
|
||||
__gtdf2:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a6, 0x7ff00000
|
||||
ball xh, a6, 2f
|
||||
1: bnall yh, a6, .Lle_cmp
|
||||
|
@ -1574,14 +1574,14 @@ __gtdf2:
|
|||
or a7, a7, yl
|
||||
beqz a7, .Lle_cmp
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
/* Check if x is a NaN. */
|
||||
2: slli a7, xh, 12
|
||||
or a7, a7, xl
|
||||
beqz a7, 1b
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
|
||||
/* Less Than or Equal */
|
||||
|
@ -1590,7 +1590,7 @@ __gtdf2:
|
|||
.global __ledf2
|
||||
.type __ledf2, @function
|
||||
__ledf2:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a6, 0x7ff00000
|
||||
ball xh, a6, 2f
|
||||
1: bnall yh, a6, .Lle_cmp
|
||||
|
@ -1600,14 +1600,14 @@ __ledf2:
|
|||
or a7, a7, yl
|
||||
beqz a7, .Lle_cmp
|
||||
movi a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
/* Check if x is a NaN. */
|
||||
2: slli a7, xh, 12
|
||||
or a7, a7, xl
|
||||
beqz a7, 1b
|
||||
movi a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lle_cmp:
|
||||
/* Check if x and y have different signs. */
|
||||
|
@ -1622,7 +1622,7 @@ __ledf2:
|
|||
bne xh, yh, 5f
|
||||
bltu yl, xl, 5f
|
||||
4: movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lle_xneg:
|
||||
/* Check if y <= x. */
|
||||
|
@ -1630,7 +1630,7 @@ __ledf2:
|
|||
bne yh, xh, 5f
|
||||
bgeu xl, yl, 4b
|
||||
5: movi a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lle_diff_signs:
|
||||
bltz xh, 4b
|
||||
|
@ -1643,7 +1643,7 @@ __ledf2:
|
|||
movi a2, 1
|
||||
movi a3, 0
|
||||
moveqz a2, a3, a7
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
|
||||
/* Greater Than or Equal */
|
||||
|
@ -1652,7 +1652,7 @@ __ledf2:
|
|||
.global __gedf2
|
||||
.type __gedf2, @function
|
||||
__gedf2:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a6, 0x7ff00000
|
||||
ball xh, a6, 2f
|
||||
1: bnall yh, a6, .Llt_cmp
|
||||
|
@ -1662,14 +1662,14 @@ __gedf2:
|
|||
or a7, a7, yl
|
||||
beqz a7, .Llt_cmp
|
||||
movi a2, -1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
/* Check if x is a NaN. */
|
||||
2: slli a7, xh, 12
|
||||
or a7, a7, xl
|
||||
beqz a7, 1b
|
||||
movi a2, -1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
|
||||
/* Less Than */
|
||||
|
@ -1678,7 +1678,7 @@ __gedf2:
|
|||
.global __ltdf2
|
||||
.type __ltdf2, @function
|
||||
__ltdf2:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a6, 0x7ff00000
|
||||
ball xh, a6, 2f
|
||||
1: bnall yh, a6, .Llt_cmp
|
||||
|
@ -1688,14 +1688,14 @@ __ltdf2:
|
|||
or a7, a7, yl
|
||||
beqz a7, .Llt_cmp
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
/* Check if x is a NaN. */
|
||||
2: slli a7, xh, 12
|
||||
or a7, a7, xl
|
||||
beqz a7, 1b
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Llt_cmp:
|
||||
/* Check if x and y have different signs. */
|
||||
|
@ -1710,7 +1710,7 @@ __ltdf2:
|
|||
bne xh, yh, 5f
|
||||
bgeu xl, yl, 5f
|
||||
4: movi a2, -1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Llt_xneg:
|
||||
/* Check if y < x. */
|
||||
|
@ -1718,7 +1718,7 @@ __ltdf2:
|
|||
bne yh, xh, 5f
|
||||
bltu yl, xl, 4b
|
||||
5: movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Llt_diff_signs:
|
||||
bgez xh, 5b
|
||||
|
@ -1731,7 +1731,7 @@ __ltdf2:
|
|||
movi a2, 0
|
||||
movi a3, -1
|
||||
movnez a2, a3, a7
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
|
||||
/* Unordered */
|
||||
|
@ -1740,24 +1740,24 @@ __ltdf2:
|
|||
.global __unorddf2
|
||||
.type __unorddf2, @function
|
||||
__unorddf2:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a6, 0x7ff00000
|
||||
ball xh, a6, 3f
|
||||
1: ball yh, a6, 4f
|
||||
2: movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
3: slli a7, xh, 12
|
||||
or a7, a7, xl
|
||||
beqz a7, 1b
|
||||
movi a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
4: slli a7, yh, 12
|
||||
or a7, a7, yl
|
||||
beqz a7, 2b
|
||||
movi a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_cmpdf2 */
|
||||
|
||||
|
@ -1767,7 +1767,7 @@ __unorddf2:
|
|||
.global __fixdfsi
|
||||
.type __fixdfsi, @function
|
||||
__fixdfsi:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
/* Check for NaN and Infinity. */
|
||||
movi a6, 0x7ff00000
|
||||
|
@ -1792,7 +1792,7 @@ __fixdfsi:
|
|||
/* Negate the result if sign != 0. */
|
||||
neg a2, a5
|
||||
movgez a2, a5, a7
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixdfsi_nan_or_inf:
|
||||
/* Handle Infinity and NaN. */
|
||||
|
@ -1808,11 +1808,11 @@ __fixdfsi:
|
|||
addi a5, a4, -1 /* 0x7fffffff */
|
||||
movgez a4, a5, xh
|
||||
mov a2, a4
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixdfsi_zero:
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_fixdfsi */
|
||||
|
||||
|
@ -1822,7 +1822,7 @@ __fixdfsi:
|
|||
.global __fixdfdi
|
||||
.type __fixdfdi, @function
|
||||
__fixdfdi:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
/* Check for NaN and Infinity. */
|
||||
movi a6, 0x7ff00000
|
||||
|
@ -1854,7 +1854,7 @@ __fixdfdi:
|
|||
neg xh, xh
|
||||
beqz xl, 1f
|
||||
addi xh, xh, -1
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Lfixdfdi_smallshift:
|
||||
src xl, xh, xl
|
||||
|
@ -1875,16 +1875,16 @@ __fixdfdi:
|
|||
bgez xh, 1f
|
||||
mov xh, a7
|
||||
movi xl, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
1: addi xh, a7, -1 /* 0x7fffffff */
|
||||
movi xl, -1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixdfdi_zero:
|
||||
movi xh, 0
|
||||
movi xl, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_fixdfdi */
|
||||
|
||||
|
@ -1894,7 +1894,7 @@ __fixdfdi:
|
|||
.global __fixunsdfsi
|
||||
.type __fixunsdfsi, @function
|
||||
__fixunsdfsi:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
/* Check for NaN and Infinity. */
|
||||
movi a6, 0x7ff00000
|
||||
|
@ -1921,7 +1921,7 @@ __fixunsdfsi:
|
|||
/* Negate the result if sign != 0. */
|
||||
neg a2, a5
|
||||
movgez a2, a5, a7
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixunsdfsi_nan_or_inf:
|
||||
/* Handle Infinity and NaN. */
|
||||
|
@ -1931,28 +1931,28 @@ __fixunsdfsi:
|
|||
|
||||
/* Translate NaN to 0xffffffff. */
|
||||
movi a2, -1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixunsdfsi_maxint:
|
||||
slli a4, a6, 11 /* 0x80000000 */
|
||||
movi a5, -1 /* 0xffffffff */
|
||||
movgez a4, a5, xh
|
||||
mov a2, a4
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixunsdfsi_zero:
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixunsdfsi_bigexp:
|
||||
/* Handle unsigned maximum exponent case. */
|
||||
bltz xh, 1f
|
||||
mov a2, a5 /* no shift needed */
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
/* Return 0x80000000 if negative. */
|
||||
1: slli a2, a6, 11
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_fixunsdfsi */
|
||||
|
||||
|
@ -1962,7 +1962,7 @@ __fixunsdfsi:
|
|||
.global __fixunsdfdi
|
||||
.type __fixunsdfdi, @function
|
||||
__fixunsdfdi:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
/* Check for NaN and Infinity. */
|
||||
movi a6, 0x7ff00000
|
||||
|
@ -1996,7 +1996,7 @@ __fixunsdfdi:
|
|||
neg xh, xh
|
||||
beqz xl, 1f
|
||||
addi xh, xh, -1
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Lfixunsdfdi_smallshift:
|
||||
src xl, xh, xl
|
||||
|
@ -2012,23 +2012,23 @@ __fixunsdfdi:
|
|||
/* Translate NaN to 0xffffffff.... */
|
||||
1: movi xh, -1
|
||||
movi xl, -1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixunsdfdi_maxint:
|
||||
bgez xh, 1b
|
||||
2: slli xh, a6, 11 /* 0x80000000 */
|
||||
movi xl, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixunsdfdi_zero:
|
||||
movi xh, 0
|
||||
movi xl, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixunsdfdi_bigexp:
|
||||
/* Handle unsigned maximum exponent case. */
|
||||
bltz a7, 2b
|
||||
abi_return /* no shift needed */
|
||||
leaf_return /* no shift needed */
|
||||
|
||||
#endif /* L_fixunsdfdi */
|
||||
|
||||
|
@ -2038,7 +2038,7 @@ __fixunsdfdi:
|
|||
.global __floatunsidf
|
||||
.type __floatunsidf, @function
|
||||
__floatunsidf:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
beqz a2, .Lfloatsidf_return_zero
|
||||
|
||||
/* Set the sign to zero and jump to the floatsidf code. */
|
||||
|
@ -2049,7 +2049,7 @@ __floatunsidf:
|
|||
.global __floatsidf
|
||||
.type __floatsidf, @function
|
||||
__floatsidf:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
/* Check for zero. */
|
||||
beqz a2, .Lfloatsidf_return_zero
|
||||
|
@ -2084,11 +2084,11 @@ __floatsidf:
|
|||
/* Add the sign and return. */
|
||||
slli a7, a7, 31
|
||||
or xh, xh, a7
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfloatsidf_return_zero:
|
||||
movi a3, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_floatsidf */
|
||||
|
||||
|
@ -2098,7 +2098,7 @@ __floatsidf:
|
|||
.global __floatundidf
|
||||
.type __floatundidf, @function
|
||||
__floatundidf:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
/* Check for zero. */
|
||||
or a4, xh, xl
|
||||
|
@ -2112,7 +2112,7 @@ __floatundidf:
|
|||
.global __floatdidf
|
||||
.type __floatdidf, @function
|
||||
__floatdidf:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
/* Check for zero. */
|
||||
or a4, xh, xl
|
||||
|
@ -2161,7 +2161,7 @@ __floatdidf:
|
|||
/* Check if the leftover fraction is exactly 1/2. */
|
||||
slli a6, a6, 1
|
||||
beqz a6, .Lfloatdidf_exactlyhalf
|
||||
2: abi_return
|
||||
2: leaf_return
|
||||
|
||||
.Lfloatdidf_bigshift:
|
||||
/* xh is zero. Normalize with first 1 bit of xl in the msb of xh. */
|
||||
|
@ -2176,14 +2176,14 @@ __floatdidf:
|
|||
/* Round down to the nearest even value. */
|
||||
srli xl, xl, 1
|
||||
slli xl, xl, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfloatdidf_roundcarry:
|
||||
/* xl is always zero when the rounding increment overflows, so
|
||||
there's no need to round it to an even value. */
|
||||
addi xh, xh, 1
|
||||
/* Overflow to the exponent is OK. */
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_floatdidf */
|
||||
|
||||
|
@ -2193,7 +2193,7 @@ __floatdidf:
|
|||
.global __truncdfsf2
|
||||
.type __truncdfsf2, @function
|
||||
__truncdfsf2:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
/* Adjust the exponent bias. */
|
||||
movi a4, (0x3ff - 0x7f) << 20
|
||||
|
@ -2228,13 +2228,13 @@ __truncdfsf2:
|
|||
/* Check if the leftover fraction is exactly 1/2. */
|
||||
slli a4, a4, 1
|
||||
beqz a4, .Ltrunc_exactlyhalf
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Ltrunc_exactlyhalf:
|
||||
/* Round down to the nearest even value. */
|
||||
srli a2, a2, 1
|
||||
slli a2, a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Ltrunc_overflow:
|
||||
/* Check if exponent == 0x7ff. */
|
||||
|
@ -2254,7 +2254,7 @@ __truncdfsf2:
|
|||
extui a6, xh, 31, 1
|
||||
ssai 1
|
||||
src a2, a6, a4
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Ltrunc_underflow:
|
||||
/* Find shift count for a subnormal. Flush to zero if >= 32. */
|
||||
|
@ -2287,7 +2287,7 @@ __truncdfsf2:
|
|||
/* Return +/- zero. */
|
||||
1: extui a2, xh, 31, 1
|
||||
slli a2, a2, 31
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_truncdfsf2 */
|
||||
|
||||
|
@ -2297,7 +2297,7 @@ __truncdfsf2:
|
|||
.global __extendsfdf2
|
||||
.type __extendsfdf2, @function
|
||||
__extendsfdf2:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
/* Save the sign bit and then shift it off. */
|
||||
extui a5, a2, 31, 1
|
||||
|
@ -2320,7 +2320,7 @@ __extendsfdf2:
|
|||
|
||||
/* Add the sign bit. */
|
||||
or xh, a4, a5
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lextend_nan_or_inf:
|
||||
movi a4, 0x7ff00000
|
||||
|
@ -2335,7 +2335,7 @@ __extendsfdf2:
|
|||
/* Add the sign and return. */
|
||||
1: or xh, a4, a5
|
||||
movi xl, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lextend_expzero:
|
||||
beqz a4, 1b
|
||||
|
@ -2358,7 +2358,7 @@ __extendsfdf2:
|
|||
|
||||
/* Add the sign and return. */
|
||||
or xh, a4, a5
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_extendsfdf2 */
|
||||
|
||||
|
|
|
@ -51,10 +51,10 @@
|
|||
.global __negsf2
|
||||
.type __negsf2, @function
|
||||
__negsf2:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a4, 0x80000000
|
||||
xor a2, a2, a4
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_negsf2 */
|
||||
|
||||
|
@ -73,12 +73,12 @@ __addsf3_aux:
|
|||
/* If x is a NaN, return it. Otherwise, return y. */
|
||||
slli a7, a2, 9
|
||||
beqz a7, .Ladd_ynan_or_inf
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Ladd_ynan_or_inf:
|
||||
/* Return y. */
|
||||
mov a2, a3
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Ladd_opposite_signs:
|
||||
/* Operand signs differ. Do a subtraction. */
|
||||
|
@ -90,7 +90,7 @@ __addsf3_aux:
|
|||
.global __addsf3
|
||||
.type __addsf3, @function
|
||||
__addsf3:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a6, 0x7f800000
|
||||
|
||||
/* Check if the two operands have the same sign. */
|
||||
|
@ -158,7 +158,7 @@ __addsf3:
|
|||
a carry into the exponent field will not work because it
|
||||
assumes there is an implicit "1.0" that needs to be added. */
|
||||
add a2, a2, a3
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Ladd_xexpzero:
|
||||
/* Same as "yexpzero" except skip handling the case when both
|
||||
|
@ -200,11 +200,11 @@ __addsf3:
|
|||
/* Check if the leftover fraction is exactly 1/2. */
|
||||
slli a9, a9, 1
|
||||
beqz a9, .Ladd_exactlyhalf
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Ladd_returny:
|
||||
mov a2, a3
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Ladd_carry:
|
||||
/* The addition has overflowed into the exponent field, so the
|
||||
|
@ -242,7 +242,7 @@ __addsf3:
|
|||
bbci.l a10, 0, 1f
|
||||
addi a2, a2, 1
|
||||
beqz a9, .Ladd_exactlyhalf
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Ladd_infinity:
|
||||
/* Clear the mantissa. */
|
||||
|
@ -252,13 +252,13 @@ __addsf3:
|
|||
/* The sign bit may have been lost in a carry-out. Put it back. */
|
||||
slli a8, a8, 1
|
||||
or a2, a2, a8
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Ladd_exactlyhalf:
|
||||
/* Round down to the nearest even value. */
|
||||
srli a2, a2, 1
|
||||
slli a2, a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
|
||||
/* Subtraction */
|
||||
|
@ -274,13 +274,13 @@ __subsf3_aux:
|
|||
/* Both x and y are either NaN or Inf, so the result is NaN. */
|
||||
movi a4, 0x400000 /* make it a quiet NaN */
|
||||
or a2, a2, a4
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Lsub_ynan_or_inf:
|
||||
/* Negate y and return it. */
|
||||
slli a7, a6, 8
|
||||
xor a2, a3, a7
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lsub_opposite_signs:
|
||||
/* Operand signs differ. Do an addition. */
|
||||
|
@ -292,7 +292,7 @@ __subsf3_aux:
|
|||
.global __subsf3
|
||||
.type __subsf3, @function
|
||||
__subsf3:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a6, 0x7f800000
|
||||
|
||||
/* Check if the two operands have the same sign. */
|
||||
|
@ -366,7 +366,7 @@ __subsf3:
|
|||
/* Negate and return y. */
|
||||
slli a7, a6, 8
|
||||
xor a2, a3, a7
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Lsub_xsmaller:
|
||||
/* Same thing as the "ysmaller" code, but with x and y swapped and
|
||||
|
@ -408,7 +408,7 @@ __subsf3:
|
|||
/* Check if the leftover fraction is exactly 1/2. */
|
||||
slli a9, a9, 1
|
||||
beqz a9, .Lsub_exactlyhalf
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Lsub_xexpzero:
|
||||
/* Same as "yexpzero". */
|
||||
|
@ -421,7 +421,7 @@ __subsf3:
|
|||
|
||||
.Lsub_return_zero:
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lsub_borrow:
|
||||
/* The subtraction has underflowed into the exponent field, so the
|
||||
|
@ -457,7 +457,7 @@ __subsf3:
|
|||
/* Round down to the nearest even value. */
|
||||
srli a2, a2, 1
|
||||
slli a2, a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lsub_xzero:
|
||||
/* If there was a borrow from the exponent, and the mantissa and
|
||||
|
@ -570,7 +570,7 @@ __mulsf3_aux:
|
|||
.global __mulsf3
|
||||
.type __mulsf3, @function
|
||||
__mulsf3:
|
||||
abi_entry sp, 48
|
||||
leaf_entry sp, 32
|
||||
#if __XTENSA_CALL0_ABI__
|
||||
addi sp, sp, -32
|
||||
s32i a12, sp, 16
|
||||
|
@ -780,7 +780,7 @@ __mulsf3:
|
|||
l32i a15, sp, 28
|
||||
addi sp, sp, 32
|
||||
#endif
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lmul_exactlyhalf:
|
||||
/* Round down to the nearest even value. */
|
||||
|
@ -895,7 +895,7 @@ __divsf3_aux:
|
|||
bnez a4, 1f
|
||||
movi a4, 0x400000 /* make it a quiet NaN */
|
||||
or a2, a2, a4
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Ldiv_xexpzero:
|
||||
/* Clear the sign bit of x. */
|
||||
|
@ -918,7 +918,7 @@ __divsf3_aux:
|
|||
/* Return zero with the appropriate sign bit. */
|
||||
srli a2, a7, 31
|
||||
slli a2, a2, 31
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Ldiv_xnan_or_inf:
|
||||
/* Set the sign bit of the result. */
|
||||
|
@ -929,7 +929,7 @@ __divsf3_aux:
|
|||
bnall a3, a6, 1f
|
||||
movi a4, 0x400000 /* make it a quiet NaN */
|
||||
or a2, a2, a4
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Ldiv_ynan_or_inf:
|
||||
/* If y is Infinity, return zero. */
|
||||
|
@ -937,13 +937,13 @@ __divsf3_aux:
|
|||
beqz a8, .Ldiv_return_zero
|
||||
/* y is NaN; return it. */
|
||||
mov a2, a3
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.align 4
|
||||
.global __divsf3
|
||||
.type __divsf3, @function
|
||||
__divsf3:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a6, 0x7f800000
|
||||
|
||||
/* Get the sign of the result. */
|
||||
|
@ -1036,7 +1036,7 @@ __divsf3:
|
|||
srli a7, a7, 31
|
||||
slli a7, a7, 31
|
||||
or a2, a2, a7
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Ldiv_overflow:
|
||||
bltz a8, .Ldiv_underflow
|
||||
|
@ -1085,7 +1085,7 @@ __divsf3:
|
|||
/* Return zero with the appropriate sign bit. */
|
||||
srli a2, a7, 31
|
||||
slli a2, a2, 31
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_divsf3 */
|
||||
|
||||
|
@ -1099,7 +1099,7 @@ __divsf3:
|
|||
.set __nesf2, __eqsf2
|
||||
.type __eqsf2, @function
|
||||
__eqsf2:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
bne a2, a3, 4f
|
||||
|
||||
/* The values are equal but NaN != NaN. Check the exponent. */
|
||||
|
@ -1108,11 +1108,11 @@ __eqsf2:
|
|||
|
||||
/* Equal. */
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
/* Not equal. */
|
||||
2: movi a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
/* Check if the mantissas are nonzero. */
|
||||
3: slli a7, a2, 9
|
||||
|
@ -1127,7 +1127,7 @@ __eqsf2:
|
|||
5: movi a2, 0
|
||||
movi a3, 1
|
||||
movnez a2, a3, a7
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
|
||||
/* Greater Than */
|
||||
|
@ -1136,7 +1136,7 @@ __eqsf2:
|
|||
.global __gtsf2
|
||||
.type __gtsf2, @function
|
||||
__gtsf2:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a6, 0x7f800000
|
||||
ball a2, a6, 2f
|
||||
1: bnall a3, a6, .Lle_cmp
|
||||
|
@ -1145,13 +1145,13 @@ __gtsf2:
|
|||
slli a7, a3, 9
|
||||
beqz a7, .Lle_cmp
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
/* Check if x is a NaN. */
|
||||
2: slli a7, a2, 9
|
||||
beqz a7, 1b
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
|
||||
/* Less Than or Equal */
|
||||
|
@ -1160,7 +1160,7 @@ __gtsf2:
|
|||
.global __lesf2
|
||||
.type __lesf2, @function
|
||||
__lesf2:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a6, 0x7f800000
|
||||
ball a2, a6, 2f
|
||||
1: bnall a3, a6, .Lle_cmp
|
||||
|
@ -1169,13 +1169,13 @@ __lesf2:
|
|||
slli a7, a3, 9
|
||||
beqz a7, .Lle_cmp
|
||||
movi a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
/* Check if x is a NaN. */
|
||||
2: slli a7, a2, 9
|
||||
beqz a7, 1b
|
||||
movi a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lle_cmp:
|
||||
/* Check if x and y have different signs. */
|
||||
|
@ -1188,13 +1188,13 @@ __lesf2:
|
|||
/* Check if x <= y. */
|
||||
bltu a3, a2, 5f
|
||||
4: movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lle_xneg:
|
||||
/* Check if y <= x. */
|
||||
bgeu a2, a3, 4b
|
||||
5: movi a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lle_diff_signs:
|
||||
bltz a2, 4b
|
||||
|
@ -1205,7 +1205,7 @@ __lesf2:
|
|||
movi a2, 1
|
||||
movi a3, 0
|
||||
moveqz a2, a3, a7
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
|
||||
/* Greater Than or Equal */
|
||||
|
@ -1214,7 +1214,7 @@ __lesf2:
|
|||
.global __gesf2
|
||||
.type __gesf2, @function
|
||||
__gesf2:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a6, 0x7f800000
|
||||
ball a2, a6, 2f
|
||||
1: bnall a3, a6, .Llt_cmp
|
||||
|
@ -1223,13 +1223,13 @@ __gesf2:
|
|||
slli a7, a3, 9
|
||||
beqz a7, .Llt_cmp
|
||||
movi a2, -1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
/* Check if x is a NaN. */
|
||||
2: slli a7, a2, 9
|
||||
beqz a7, 1b
|
||||
movi a2, -1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
|
||||
/* Less Than */
|
||||
|
@ -1238,7 +1238,7 @@ __gesf2:
|
|||
.global __ltsf2
|
||||
.type __ltsf2, @function
|
||||
__ltsf2:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a6, 0x7f800000
|
||||
ball a2, a6, 2f
|
||||
1: bnall a3, a6, .Llt_cmp
|
||||
|
@ -1247,13 +1247,13 @@ __ltsf2:
|
|||
slli a7, a3, 9
|
||||
beqz a7, .Llt_cmp
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
/* Check if x is a NaN. */
|
||||
2: slli a7, a2, 9
|
||||
beqz a7, 1b
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Llt_cmp:
|
||||
/* Check if x and y have different signs. */
|
||||
|
@ -1266,13 +1266,13 @@ __ltsf2:
|
|||
/* Check if x < y. */
|
||||
bgeu a2, a3, 5f
|
||||
4: movi a2, -1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Llt_xneg:
|
||||
/* Check if y < x. */
|
||||
bltu a3, a2, 4b
|
||||
5: movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Llt_diff_signs:
|
||||
bgez a2, 5b
|
||||
|
@ -1283,7 +1283,7 @@ __ltsf2:
|
|||
movi a2, 0
|
||||
movi a3, -1
|
||||
movnez a2, a3, a7
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
|
||||
/* Unordered */
|
||||
|
@ -1292,22 +1292,22 @@ __ltsf2:
|
|||
.global __unordsf2
|
||||
.type __unordsf2, @function
|
||||
__unordsf2:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
movi a6, 0x7f800000
|
||||
ball a2, a6, 3f
|
||||
1: ball a3, a6, 4f
|
||||
2: movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
3: slli a7, a2, 9
|
||||
beqz a7, 1b
|
||||
movi a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
4: slli a7, a3, 9
|
||||
beqz a7, 2b
|
||||
movi a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_cmpsf2 */
|
||||
|
||||
|
@ -1317,7 +1317,7 @@ __unordsf2:
|
|||
.global __fixsfsi
|
||||
.type __fixsfsi, @function
|
||||
__fixsfsi:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
/* Check for NaN and Infinity. */
|
||||
movi a6, 0x7f800000
|
||||
|
@ -1340,7 +1340,7 @@ __fixsfsi:
|
|||
/* Negate the result if sign != 0. */
|
||||
neg a2, a5
|
||||
movgez a2, a5, a7
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixsfsi_nan_or_inf:
|
||||
/* Handle Infinity and NaN. */
|
||||
|
@ -1355,11 +1355,11 @@ __fixsfsi:
|
|||
addi a5, a4, -1 /* 0x7fffffff */
|
||||
movgez a4, a5, a2
|
||||
mov a2, a4
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixsfsi_zero:
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_fixsfsi */
|
||||
|
||||
|
@ -1369,7 +1369,7 @@ __fixsfsi:
|
|||
.global __fixsfdi
|
||||
.type __fixsfdi, @function
|
||||
__fixsfdi:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
/* Check for NaN and Infinity. */
|
||||
movi a6, 0x7f800000
|
||||
|
@ -1398,7 +1398,7 @@ __fixsfdi:
|
|||
neg xh, xh
|
||||
beqz xl, 1f
|
||||
addi xh, xh, -1
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Lfixsfdi_smallshift:
|
||||
movi xl, 0
|
||||
|
@ -1419,16 +1419,16 @@ __fixsfdi:
|
|||
bgez a2, 1f
|
||||
mov xh, a7
|
||||
movi xl, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
1: addi xh, a7, -1 /* 0x7fffffff */
|
||||
movi xl, -1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixsfdi_zero:
|
||||
movi xh, 0
|
||||
movi xl, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_fixsfdi */
|
||||
|
||||
|
@ -1438,7 +1438,7 @@ __fixsfdi:
|
|||
.global __fixunssfsi
|
||||
.type __fixunssfsi, @function
|
||||
__fixunssfsi:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
/* Check for NaN and Infinity. */
|
||||
movi a6, 0x7f800000
|
||||
|
@ -1463,7 +1463,7 @@ __fixunssfsi:
|
|||
/* Negate the result if sign != 0. */
|
||||
neg a2, a5
|
||||
movgez a2, a5, a7
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixunssfsi_nan_or_inf:
|
||||
/* Handle Infinity and NaN. */
|
||||
|
@ -1472,28 +1472,28 @@ __fixunssfsi:
|
|||
|
||||
/* Translate NaN to 0xffffffff. */
|
||||
movi a2, -1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixunssfsi_maxint:
|
||||
slli a4, a6, 8 /* 0x80000000 */
|
||||
movi a5, -1 /* 0xffffffff */
|
||||
movgez a4, a5, a2
|
||||
mov a2, a4
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixunssfsi_zero:
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixunssfsi_bigexp:
|
||||
/* Handle unsigned maximum exponent case. */
|
||||
bltz a2, 1f
|
||||
mov a2, a5 /* no shift needed */
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
/* Return 0x80000000 if negative. */
|
||||
1: slli a2, a6, 8
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_fixunssfsi */
|
||||
|
||||
|
@ -1503,7 +1503,7 @@ __fixunssfsi:
|
|||
.global __fixunssfdi
|
||||
.type __fixunssfdi, @function
|
||||
__fixunssfdi:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
/* Check for NaN and Infinity. */
|
||||
movi a6, 0x7f800000
|
||||
|
@ -1534,7 +1534,7 @@ __fixunssfdi:
|
|||
neg xh, xh
|
||||
beqz xl, 1f
|
||||
addi xh, xh, -1
|
||||
1: abi_return
|
||||
1: leaf_return
|
||||
|
||||
.Lfixunssfdi_smallshift:
|
||||
movi xl, 0
|
||||
|
@ -1550,24 +1550,24 @@ __fixunssfdi:
|
|||
/* Translate NaN to 0xffffffff.... */
|
||||
1: movi xh, -1
|
||||
movi xl, -1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixunssfdi_maxint:
|
||||
bgez a2, 1b
|
||||
2: slli xh, a6, 8 /* 0x80000000 */
|
||||
movi xl, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixunssfdi_zero:
|
||||
movi xh, 0
|
||||
movi xl, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfixunssfdi_bigexp:
|
||||
/* Handle unsigned maximum exponent case. */
|
||||
bltz a7, 2b
|
||||
movi xl, 0
|
||||
abi_return /* no shift needed */
|
||||
leaf_return /* no shift needed */
|
||||
|
||||
#endif /* L_fixunssfdi */
|
||||
|
||||
|
@ -1577,7 +1577,7 @@ __fixunssfdi:
|
|||
.global __floatunsisf
|
||||
.type __floatunsisf, @function
|
||||
__floatunsisf:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
beqz a2, .Lfloatsisf_return
|
||||
|
||||
/* Set the sign to zero and jump to the floatsisf code. */
|
||||
|
@ -1588,7 +1588,7 @@ __floatunsisf:
|
|||
.global __floatsisf
|
||||
.type __floatsisf, @function
|
||||
__floatsisf:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
/* Check for zero. */
|
||||
beqz a2, .Lfloatsisf_return
|
||||
|
@ -1633,13 +1633,13 @@ __floatsisf:
|
|||
beqz a6, .Lfloatsisf_exactlyhalf
|
||||
|
||||
.Lfloatsisf_return:
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lfloatsisf_exactlyhalf:
|
||||
/* Round down to the nearest even value. */
|
||||
srli a2, a2, 1
|
||||
slli a2, a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_floatsisf */
|
||||
|
||||
|
@ -1649,7 +1649,7 @@ __floatsisf:
|
|||
.global __floatundisf
|
||||
.type __floatundisf, @function
|
||||
__floatundisf:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
/* Check for zero. */
|
||||
or a4, xh, xl
|
||||
|
@ -1663,7 +1663,7 @@ __floatundisf:
|
|||
.global __floatdisf
|
||||
.type __floatdisf, @function
|
||||
__floatdisf:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
/* Check for zero. */
|
||||
or a4, xh, xl
|
||||
|
@ -1714,7 +1714,7 @@ __floatdisf:
|
|||
/* Check if the leftover fraction is exactly 1/2. */
|
||||
slli a6, a6, 1
|
||||
beqz a6, .Lfloatdisf_exactlyhalf
|
||||
2: abi_return
|
||||
2: leaf_return
|
||||
|
||||
.Lfloatdisf_bigshift:
|
||||
/* xh is zero. Normalize with first 1 bit of xl in the msb of xh. */
|
||||
|
@ -1729,6 +1729,6 @@ __floatdisf:
|
|||
/* Round down to the nearest even value. */
|
||||
srli a2, a2, 1
|
||||
slli a2, a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
#endif /* L_floatdisf */
|
||||
|
|
|
@ -30,10 +30,11 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
|||
|
||||
#include "xtensa-config.h"
|
||||
|
||||
# Note: These functions use a minimum stack frame size of 32. This is
|
||||
# necessary for Xtensa configurations that only support a fixed register
|
||||
# window size of 8, where even leaf functions (such as these) need to
|
||||
# allocate space for a 4-word "extra save area".
|
||||
# Force each stack frame to contain an "Extra Save Area" (ESA) of at least
|
||||
# 16 bytes. This is necessary for non-standard Xtensa configurations that
|
||||
# only support a fixed register window size of 8, where even leaf functions
|
||||
# (such as these) need the ESA for interrupt handlers.
|
||||
#define MIN_ESA 16
|
||||
|
||||
# Define macros for the ABS and ADDX* instructions to handle cases
|
||||
# where they are not included in the Xtensa processor configuration.
|
||||
|
@ -75,20 +76,20 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
|||
#endif
|
||||
.endm
|
||||
|
||||
# Define macros for function entry and return, supporting either the
|
||||
# Define macros for leaf function entry and return, supporting either the
|
||||
# standard register windowed ABI or the non-windowed call0 ABI. These
|
||||
# macros do not allocate any extra stack space, so they only work for
|
||||
# leaf functions that do not need to spill anything to the stack.
|
||||
|
||||
.macro abi_entry reg, size
|
||||
.macro leaf_entry reg, size
|
||||
#if XCHAL_HAVE_WINDOWED && !__XTENSA_CALL0_ABI__
|
||||
entry \reg, \size
|
||||
entry \reg, \size + MIN_ESA
|
||||
#else
|
||||
/* do nothing */
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro abi_return
|
||||
.macro leaf_return
|
||||
#if XCHAL_HAVE_WINDOWED && !__XTENSA_CALL0_ABI__
|
||||
retw
|
||||
#else
|
||||
|
@ -102,14 +103,14 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
|||
.global __mulsi3
|
||||
.type __mulsi3,@function
|
||||
__mulsi3:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
|
||||
#if XCHAL_HAVE_MUL16
|
||||
or a4, a2, a3
|
||||
srai a4, a4, 16
|
||||
bnez a4, .LMUL16
|
||||
mul16u a2, a2, a3
|
||||
abi_return
|
||||
leaf_return
|
||||
.LMUL16:
|
||||
srai a4, a2, 16
|
||||
srai a5, a3, 16
|
||||
|
@ -165,7 +166,7 @@ __mulsi3:
|
|||
bgeui a3, 16, .Lmult_main_loop
|
||||
neg a3, a2
|
||||
movltz a2, a3, a5
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.align 4
|
||||
.Lmult_main_loop:
|
||||
|
@ -195,7 +196,7 @@ __mulsi3:
|
|||
|
||||
#endif /* !XCHAL_HAVE_MUL16 && !XCHAL_HAVE_MAC16 */
|
||||
|
||||
abi_return
|
||||
leaf_return
|
||||
.size __mulsi3,.-__mulsi3
|
||||
|
||||
#endif /* L_mulsi3 */
|
||||
|
@ -264,7 +265,7 @@ __nsau_data:
|
|||
.global __udivsi3
|
||||
.type __udivsi3,@function
|
||||
__udivsi3:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
bltui a3, 2, .Lle_one # check if the divisor <= 1
|
||||
|
||||
mov a6, a2 # keep dividend in a6
|
||||
|
@ -297,24 +298,24 @@ __udivsi3:
|
|||
bltu a6, a3, .Lreturn
|
||||
addi a2, a2, 1 # increment quotient if dividend >= divisor
|
||||
.Lreturn:
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lle_one:
|
||||
beqz a3, .Lerror # if divisor == 1, return the dividend
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lspecial:
|
||||
# return dividend >= divisor
|
||||
bltu a6, a3, .Lreturn0
|
||||
movi a2, 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lerror:
|
||||
# just return 0; could throw an exception
|
||||
|
||||
.Lreturn0:
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
.size __udivsi3,.-__udivsi3
|
||||
|
||||
#endif /* L_udivsi3 */
|
||||
|
@ -325,7 +326,7 @@ __udivsi3:
|
|||
.global __divsi3
|
||||
.type __divsi3,@function
|
||||
__divsi3:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
xor a7, a2, a3 # sign = dividend ^ divisor
|
||||
do_abs a6, a2, a4 # udividend = abs(dividend)
|
||||
do_abs a3, a3, a4 # udivisor = abs(divisor)
|
||||
|
@ -361,27 +362,27 @@ __divsi3:
|
|||
.Lreturn:
|
||||
neg a5, a2
|
||||
movltz a2, a5, a7 # return (sign < 0) ? -quotient : quotient
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lle_one:
|
||||
beqz a3, .Lerror
|
||||
neg a2, a6 # if udivisor == 1, then return...
|
||||
movgez a2, a6, a7 # (sign < 0) ? -udividend : udividend
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lspecial:
|
||||
bltu a6, a3, .Lreturn0 # if dividend < divisor, return 0
|
||||
movi a2, 1
|
||||
movi a4, -1
|
||||
movltz a2, a4, a7 # else return (sign < 0) ? -1 : 1
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lerror:
|
||||
# just return 0; could throw an exception
|
||||
|
||||
.Lreturn0:
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
.size __divsi3,.-__divsi3
|
||||
|
||||
#endif /* L_divsi3 */
|
||||
|
@ -392,7 +393,7 @@ __divsi3:
|
|||
.global __umodsi3
|
||||
.type __umodsi3,@function
|
||||
__umodsi3:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
bltui a3, 2, .Lle_one # check if the divisor is <= 1
|
||||
|
||||
do_nsau a5, a2, a6, a7 # dividend_shift = nsau(dividend)
|
||||
|
@ -422,13 +423,13 @@ __umodsi3:
|
|||
bltu a2, a3, .Lreturn
|
||||
sub a2, a2, a3 # subtract once more if dividend >= divisor
|
||||
.Lreturn:
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lle_one:
|
||||
# the divisor is either 0 or 1, so just return 0.
|
||||
# someday we may want to throw an exception if the divisor is 0.
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
.size __umodsi3,.-__umodsi3
|
||||
|
||||
#endif /* L_umodsi3 */
|
||||
|
@ -439,7 +440,7 @@ __umodsi3:
|
|||
.global __modsi3
|
||||
.type __modsi3,@function
|
||||
__modsi3:
|
||||
abi_entry sp, 32
|
||||
leaf_entry sp, 16
|
||||
mov a7, a2 # save original (signed) dividend
|
||||
do_abs a2, a2, a4 # udividend = abs(dividend)
|
||||
do_abs a3, a3, a4 # udivisor = abs(divisor)
|
||||
|
@ -474,13 +475,13 @@ __modsi3:
|
|||
bgez a7, .Lpositive
|
||||
neg a2, a2 # if (dividend < 0), return -udividend
|
||||
.Lpositive:
|
||||
abi_return
|
||||
leaf_return
|
||||
|
||||
.Lle_one:
|
||||
# udivisor is either 0 or 1, so just return 0.
|
||||
# someday we may want to throw an exception if udivisor is 0.
|
||||
movi a2, 0
|
||||
abi_return
|
||||
leaf_return
|
||||
.size __modsi3,.-__modsi3
|
||||
|
||||
#endif /* L_modsi3 */
|
||||
|
|
Loading…
Add table
Reference in a new issue