From 872797be0eed05ee2607af71f41eddfa7c171c35 Mon Sep 17 00:00:00 2001 From: Thom Johansen Date: Wed, 5 Apr 2006 15:41:07 +0000 Subject: Make ASM memset for ARM return destination address, as is standard. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9519 a1c6a512-1295-4272-9138-f99709370657 --- firmware/common/memset_a.S | 55 +++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 28 deletions(-) (limited to 'firmware') diff --git a/firmware/common/memset_a.S b/firmware/common/memset_a.S index 96fece4421..6dbdab9595 100644 --- a/firmware/common/memset_a.S +++ b/firmware/common/memset_a.S @@ -241,30 +241,29 @@ memset: #elif defined(CPU_ARM) -/* The following code is taken from the Linux kernel version 2.6.15.3 +/* The following code is based on code found in Linux kernel version 2.6.15.3 * linux/arch/arm/lib/memset.S * * Copyright (C) 1995-2000 Russell King */ -@ .word 0 -1: subs r2, r2, #4 @ 1 do we have enough +/* This code will align a pointer for memset, if needed */ +1: cmp r2, #4 @ 1 do we have enough blt 5f @ 1 bytes to align with? cmp r3, #2 @ 1 - strltb r1, [r0], #1 @ 1 - strleb r1, [r0], #1 @ 1 - strb r1, [r0], #1 @ 1 - add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3)) -/* - * The pointer is now aligned and the length is adjusted. Try doing the - * memzero again. - */ + strgtb r1, [r0, #-1]! @ 1 + strgeb r1, [r0, #-1]! @ 1 + strb r1, [r0, #-1]! @ 1 + sub r2, r2, r3 @ 1 r2 = r2 - r3 + b 2f .global memset .type memset,%function memset: + add r0, r0, r2 @ we'll write backwards in memory ands r3, r0, #3 @ 1 unaligned? bne 1b @ 1 +2: /* * we know that the pointer in r0 is aligned to a word boundary. */ @@ -272,7 +271,7 @@ memset: orr r1, r1, r1, lsl #16 mov r3, r1 cmp r2, #16 - blt 4f + blt 5f /* * We need an extra register for this loop - save the return address and * use the LR @@ -281,36 +280,36 @@ memset: mov ip, r1 mov lr, r1 -2: subs r2, r2, #64 - stmgeia r0!, {r1, r3, ip, lr} @ 64 bytes at a time. - stmgeia r0!, {r1, r3, ip, lr} - stmgeia r0!, {r1, r3, ip, lr} - stmgeia r0!, {r1, r3, ip, lr} - bgt 2b +3: subs r2, r2, #64 + stmgedb r0!, {r1, r3, ip, lr} @ 64 bytes at a time. + stmgedb r0!, {r1, r3, ip, lr} + stmgedb r0!, {r1, r3, ip, lr} + stmgedb r0!, {r1, r3, ip, lr} + bgt 3b ldmeqfd sp!, {pc} @ Now <64 bytes to go. /* * No need to correct the count; we're only testing bits from now on */ tst r2, #32 - stmneia r0!, {r1, r3, ip, lr} - stmneia r0!, {r1, r3, ip, lr} + stmnedb r0!, {r1, r3, ip, lr} + stmnedb r0!, {r1, r3, ip, lr} tst r2, #16 - stmneia r0!, {r1, r3, ip, lr} + stmnedb r0!, {r1, r3, ip, lr} ldr lr, [sp], #4 -4: tst r2, #8 - stmneia r0!, {r1, r3} +5: tst r2, #8 + stmnedb r0!, {r1, r3} tst r2, #4 - strne r1, [r0], #4 + strne r1, [r0, #-4]! /* * When we get here, we've got less than 4 bytes to zero. We * may have an unaligned pointer as well. */ -5: tst r2, #2 - strneb r1, [r0], #1 - strneb r1, [r0], #1 +6: tst r2, #2 + strneb r1, [r0, #-1]! + strneb r1, [r0, #-1]! tst r2, #1 - strneb r1, [r0], #1 + strneb r1, [r0, #-1]! mov pc, lr end: .size memset,.end-memset -- cgit v1.2.3