summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXin Qi <xqi@codeaurora.org>2014-02-12 16:39:04 -0800
committerSteve Kondik <shade@chemlab.org>2014-03-13 00:15:44 -0700
commit1c9d43c2c1af3471c1ef064c3598edf131932b34 (patch)
tree999a7fb5cd1ecc83d053f761a08fb4f80c46edbe
parentb64022be031b94c99ae02d0644b183853f9bd54a (diff)
downloadbionic-1c9d43c2c1af3471c1ef064c3598edf131932b34.tar.gz
bionic-1c9d43c2c1af3471c1ef064c3598edf131932b34.tar.bz2
bionic-1c9d43c2c1af3471c1ef064c3598edf131932b34.zip
libc: krait: Fix memmove half-word atomicity
In tailing case of less than 7, if even number of bytes are left, then use half word load/store to make sure the whole routine is half-word atomic Change-Id: I54948ac050ff866986a7e144d4240652981ea87a
-rw-r--r--libc/arch-arm/krait/bionic/memmove.S55
1 files changed, 22 insertions, 33 deletions
diff --git a/libc/arch-arm/krait/bionic/memmove.S b/libc/arch-arm/krait/bionic/memmove.S
index cfa06cef4..b7b77ce7e 100644
--- a/libc/arch-arm/krait/bionic/memmove.S
+++ b/libc/arch-arm/krait/bionic/memmove.S
@@ -94,28 +94,15 @@ _memmove_words:
cmpge r12, r0
it le
ble memcpy
- cmp r2, #4
- it le
- ble .Lneon_b2f_smallcopy_loop
+ cmp r2, #63
+ ble .Lneon_b2f_smallcopy
push {r0, lr}
add r0, r0, r2
add r1, r1, r2
- cmp r2, #64
- it ge
- bge .Lneon_b2f_copy_64
- cmp r2, #32
- it ge
- bge .Lneon_b2f_copy_32
- cmp r2, #8
- it ge
- bge .Lneon_b2f_copy_8
- b .Lneon_b2f_copy_1
-.Lneon_b2f_copy_64:
mov r12, r2, lsr #6
- add r1, r1, #32
add r0, r0, #32
+ add r1, r1, #32
cmp r12, #PLDTHRESH
- it le
ble .Lneon_b2f_copy_64_loop_nopld
sub r12, #PLDOFFS
sub lr, r1, #(PLDOFFS)*PLDSIZE
@@ -129,7 +116,6 @@ _memmove_words:
subs r12, r12, #1
vst1.32 {q0, q1}, [r0]!
vst1.32 {q2, q3}, [r0]
- it ne
bne .Lneon_b2f_copy_64_loop_outer
mov r12, #PLDOFFS
.Lneon_b2f_copy_64_loop_nopld:
@@ -140,15 +126,12 @@ _memmove_words:
subs r12, r12, #1
vst1.32 {q8, q9}, [r0]!
vst1.32 {q10, q11}, [r0]
- it ne
bne .Lneon_b2f_copy_64_loop_nopld
ands r2, r2, #0x3f
- it eq
beq .Lneon_memmove_done
sub r1, r1, #32
sub r0, r0, #32
cmp r2, #32
- it lt
blt .Lneon_b2f_copy_8
.Lneon_b2f_copy_32:
sub r1, r1, #32
@@ -156,12 +139,9 @@ _memmove_words:
vld1.32 {q0, q1}, [r1]
vst1.32 {q0, q1}, [r0]
ands r2, r2, #0x1f
- it eq
beq .Lneon_memmove_done
-.Lneon_b2f_copy_finish:
.Lneon_b2f_copy_8:
movs r12, r2, lsr #0x3
- it eq
beq .Lneon_b2f_copy_1
.Lneon_b2f_copy_8_loop:
sub r1, r1, #8
@@ -169,30 +149,39 @@ _memmove_words:
vld1.32 {d0}, [r1]
subs r12, r12, #1
vst1.32 {d0}, [r0]
- it ne
bne .Lneon_b2f_copy_8_loop
-.Lneon_b2f_copy_1:
ands r2, r2, #0x7
- it eq
beq .Lneon_memmove_done
+.Lneon_b2f_copy_1:
sub r1, r1, r2
sub r0, r0, r2
-.Lneon_b2f_copy_1_loop:
+ ands r12, r2, #1
+ beq .Lneon_b2f_copy_halfword_loop
subs r2, r2, #1
ldrb r3, [r1, r2]
strb r3, [r0, r2]
- it ne
- bne .Lneon_b2f_copy_1_loop
+ beq .Lneon_memmove_done
+.Lneon_b2f_copy_halfword_loop:
+ subs r2, r2, #2
+ ldrh r3, [r1, r2]
+ strh r3, [r0, r2]
+ bne .Lneon_b2f_copy_halfword_loop
.Lneon_memmove_done:
pop {r0, pc}
-.Lneon_b2f_smallcopy_loop:
+.Lneon_b2f_smallcopy:
+ ands r12, r2, #1
+ beq .Lneon_b2f_halfword_small_loop
subs r2, r2, #1
ldrb r3, [r1, r2]
strb r3, [r0, r2]
- it ne
- bne .Lneon_b2f_smallcopy_loop
+ it eq
+ bxeq lr
+.Lneon_b2f_halfword_small_loop:
+ subs r2, r2, #2
+ ldrh r3, [r1, r2]
+ strh r3, [r0, r2]
+ bne .Lneon_b2f_halfword_small_loop
bx lr
.cfi_endproc
END(memmove)
-