diff options
author | Xin Qi <xqi@codeaurora.org> | 2014-02-12 16:39:04 -0800 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2014-03-13 00:15:44 -0700 |
commit | 1c9d43c2c1af3471c1ef064c3598edf131932b34 (patch) | |
tree | 999a7fb5cd1ecc83d053f761a08fb4f80c46edbe /libc/arch-arm/krait/bionic/memmove.S | |
parent | b64022be031b94c99ae02d0644b183853f9bd54a (diff) | |
download | bionic-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
Diffstat (limited to 'libc/arch-arm/krait/bionic/memmove.S')
-rw-r--r-- | libc/arch-arm/krait/bionic/memmove.S | 55 |
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) - |