From 1c9d43c2c1af3471c1ef064c3598edf131932b34 Mon Sep 17 00:00:00 2001 From: Xin Qi Date: Wed, 12 Feb 2014 16:39:04 -0800 Subject: 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 --- libc/arch-arm/krait/bionic/memmove.S | 55 +++++++++++++++--------------------- 1 file changed, 22 insertions(+), 33 deletions(-) (limited to 'libc/arch-arm/krait/bionic/memmove.S') 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) - -- cgit v1.2.3