mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 13:00:06 +00:00
alpha: Fix [BZ #13718]
The routines expect to be able to bias the count by a small number. If the count is near -1ull, the count will overflow. Since we cannot use the whole 64-bit address space, bound the count to LONG_MAX.
This commit is contained in:
parent
43ac6d2665
commit
8e2f4e971f
@ -1,5 +1,9 @@
|
||||
2012-06-06 Richard Henderson <rth@twiddle.net>
|
||||
|
||||
[BZ #13718]
|
||||
* sysdeps/alpha/stxncmp.S: Bound count to LONG_MAX at startup.
|
||||
* sysdeps/alpha/alphaev6/stxncmp.S: Likewise.
|
||||
|
||||
* sysdeps/alpha/fpu/e_sqrt.c: Include <math_private.h> before
|
||||
redefining __ieee758_sqrt.
|
||||
|
||||
|
@ -143,18 +143,25 @@ $a_eoc:
|
||||
.align 4
|
||||
__stxncpy:
|
||||
/* Are source and destination co-aligned? */
|
||||
lda t2, -1 # E :
|
||||
xor a0, a1, t1 # E :
|
||||
and a0, 7, t0 # E : find dest misalignment
|
||||
and t1, 7, t1 # E : (stall)
|
||||
addq a2, t0, a2 # E : bias count by dest misalignment (stall)
|
||||
nop # E :
|
||||
|
||||
subq a2, 1, a2 # E :
|
||||
srl t2, 1, t2 # U :
|
||||
and t1, 7, t1 # E :
|
||||
cmovlt a2, t2, a2 # E : bound count to LONG_MAX (stall)
|
||||
nop # E :
|
||||
|
||||
addq a2, t0, a2 # E : bias count by dest misalignment
|
||||
subq a2, 1, a2 # E : (stall)
|
||||
and a2, 7, t2 # E : (stall)
|
||||
srl a2, 3, a2 # U : a2 = loop counter = (count - 1)/8 (stall)
|
||||
addq zero, 1, t10 # E :
|
||||
lda t10, 1 # E :
|
||||
|
||||
srl a2, 3, a2 # U : a2 = loop counter = (count - 1)/8
|
||||
sll t10, t2, t10 # U : t10 = bitmask of last count byte
|
||||
bne t1, $unaligned # U :
|
||||
nop # E :
|
||||
bne t1, $unaligned # U : (stall)
|
||||
|
||||
/* We are co-aligned; take care of a partial first word. */
|
||||
ldq_u t1, 0(a1) # L : load first src word
|
||||
|
@ -123,16 +123,19 @@ $a_eoc:
|
||||
.align 3
|
||||
__stxncpy:
|
||||
/* Are source and destination co-aligned? */
|
||||
xor a0, a1, t1 # e0 :
|
||||
and a0, 7, t0 # .. e1 : find dest misalignment
|
||||
and t1, 7, t1 # e0 :
|
||||
addq a2, t0, a2 # .. e1 : bias count by dest misalignment
|
||||
subq a2, 1, a2 # e0 :
|
||||
and a2, 7, t2 # e1 :
|
||||
srl a2, 3, a2 # e0 : a2 = loop counter = (count - 1)/8
|
||||
addq zero, 1, t10 # .. e1 :
|
||||
sll t10, t2, t10 # e0 : t10 = bitmask of last count byte
|
||||
bne t1, $unaligned # .. e1 :
|
||||
lda t2, -1
|
||||
xor a0, a1, t1
|
||||
srl t2, 1, t2
|
||||
and a0, 7, t0 # find dest misalignment
|
||||
cmovlt a2, t2, a2 # bound neg count to LONG_MAX
|
||||
and t1, 7, t1
|
||||
addq a2, t0, a2 # bias count by dest misalignment
|
||||
subq a2, 1, a2
|
||||
and a2, 7, t2
|
||||
srl a2, 3, a2 # a2 = loop counter = (count - 1)/8
|
||||
addq zero, 1, t10
|
||||
sll t10, t2, t10 # t10 = bitmask of last count byte
|
||||
bne t1, $unaligned
|
||||
|
||||
/* We are co-aligned; take care of a partial first word. */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user