forked from len0rd/rockbox
Magnus Holmgrens improved word swap
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2529 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
1e972b53e5
commit
095c68bc1d
1 changed files with 44 additions and 16 deletions
|
@ -25,28 +25,56 @@
|
||||||
/* Registers used:
|
/* Registers used:
|
||||||
*
|
*
|
||||||
* r0 Temporary (required by some instructions)
|
* r0 Temporary (required by some instructions)
|
||||||
* r1 Flip table
|
* r1 Low byte
|
||||||
* r4 Argument: Data pointer
|
* r2 High byte
|
||||||
* r5 Argument: Length (in bytes)
|
* r3 Result after flip
|
||||||
|
* r4 Data
|
||||||
|
* r5 Length
|
||||||
|
* r6 1
|
||||||
|
* r7 Flip table
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* TODO: Optimize for DRAM burst operation by reading and writing in chunks
|
|
||||||
We do not want to optimize by reading/writing words, because the data
|
|
||||||
pointer may be odd */
|
|
||||||
|
|
||||||
_bitswap:
|
_bitswap:
|
||||||
mov.l .fliptable,r1
|
mov.l .fliptable,r7
|
||||||
add r4,r5 /* Calculate end of buffer */
|
mov #1,r6
|
||||||
|
mov r4,r0
|
||||||
|
and #1,r0 /* odd address? */
|
||||||
|
cmp/eq #0,r0
|
||||||
|
bt .init /* no, address is even */
|
||||||
|
|
||||||
|
mov.b @r4,r0 /* swap first byte */
|
||||||
|
extu.b r0,r0
|
||||||
|
mov.b @(r0,r7),r0
|
||||||
|
mov.b r0,@r4
|
||||||
|
add #1,r4
|
||||||
|
add #-1,r5
|
||||||
bra .init
|
bra .init
|
||||||
.loop:
|
.loop:
|
||||||
mov.b @r4,r0 /* Data to flip */
|
mov.w @r4,r1 /* data to flip */
|
||||||
extu.b r0,r0 /* Zero extend */
|
swap.b r1,r2
|
||||||
mov.b @(r0,r1),r0 /* Look up in the flip table */
|
extu.b r2,r0 /* high byte */
|
||||||
mov.b r0,@r4 /* Store result */
|
mov.b @(r0,r7),r2
|
||||||
add #1,r4
|
extu.b r2,r0 /* Zero extend */
|
||||||
|
swap.b r0,r3 /* put high byte in result */
|
||||||
|
extu.b r1,r0 /* low byte */
|
||||||
|
mov.b @(r0,r7),r1
|
||||||
|
extu.b r1,r0 /* Zero extend */
|
||||||
|
or r0,r3 /* put low byte in result */
|
||||||
|
mov.w r3,@r4 /* store result */
|
||||||
|
add #2,r4
|
||||||
|
add #-2,r5
|
||||||
.init:
|
.init:
|
||||||
cmp/gt r4,r5 /* while (dataptr < start+length) */
|
cmp/gt r6,r5 /* while [bytes remaining] > 1 */
|
||||||
bt .loop
|
bt .loop /* (at least 2 bytes left) */
|
||||||
|
|
||||||
|
cmp/eq r6,r5
|
||||||
|
bf .exit /* if not 1 byte left, exit */
|
||||||
|
|
||||||
|
mov.b @r4,r0 /* swap last byte */
|
||||||
|
extu.b r0,r0
|
||||||
|
mov.b @(r0,r7),r0
|
||||||
|
mov.b r0,@r4
|
||||||
|
.exit:
|
||||||
rts
|
rts
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue