diff options
| author | Thom Johansen <thomj@rockbox.org> | 2006-04-05 15:41:07 +0000 |
|---|---|---|
| committer | Thom Johansen <thomj@rockbox.org> | 2006-04-05 15:41:07 +0000 |
| commit | 872797be0eed05ee2607af71f41eddfa7c171c35 (patch) | |
| tree | a10f877c9de4d3edebde4bbeb82fbfc69f6f82f7 | |
| parent | ffefe9237b5a194c309374c8d117325203f9460f (diff) | |
| download | rockbox-872797be0eed05ee2607af71f41eddfa7c171c35.zip rockbox-872797be0eed05ee2607af71f41eddfa7c171c35.tar.gz rockbox-872797be0eed05ee2607af71f41eddfa7c171c35.tar.bz2 rockbox-872797be0eed05ee2607af71f41eddfa7c171c35.tar.xz | |
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
| -rw-r--r-- | firmware/common/memset_a.S | 55 |
1 files changed, 27 insertions, 28 deletions
diff --git a/firmware/common/memset_a.S b/firmware/common/memset_a.S index 96fece4..6dbdab9 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 |