Skip to content

Commit

Permalink
alpha: Fix [BZ #13718]
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Richard Henderson committed Jun 6, 2012
1 parent 43ac6d2 commit 8e2f4e9
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 16 deletions.
4 changes: 4 additions & 0 deletions ChangeLog.alpha
Original file line number Diff line number Diff line change
@@ -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.

Expand Down
19 changes: 13 additions & 6 deletions sysdeps/alpha/alphaev6/stxncpy.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
23 changes: 13 additions & 10 deletions sysdeps/alpha/stxncpy.S
Original file line number Diff line number Diff line change
Expand Up @@ -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. */

Expand Down

0 comments on commit 8e2f4e9

Please sign in to comment.