summaryrefslogtreecommitdiff
path: root/firmware/bitswap.S
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2002-08-20 14:22:11 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2002-08-20 14:22:11 +0000
commitbfc8d0ac44374201e3e63f6e7421949fede315b7 (patch)
tree566705f102d916a32e7a991b9bca171d6d21dd64 /firmware/bitswap.S
parentef3a3e70930658d499cf200d198e6a86fd183bc0 (diff)
downloadrockbox-bfc8d0ac44374201e3e63f6e7421949fede315b7.tar.gz
rockbox-bfc8d0ac44374201e3e63f6e7421949fede315b7.zip
Faster, 8-bit bitswap by Magnus Holmgren
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1819 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/bitswap.S')
-rw-r--r--firmware/bitswap.S101
1 files changed, 101 insertions, 0 deletions
diff --git a/firmware/bitswap.S b/firmware/bitswap.S
new file mode 100644
index 0000000000..5f94fedb36
--- /dev/null
+++ b/firmware/bitswap.S
@@ -0,0 +1,101 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2002 by Magnus Holmgren
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19
20 .section .icode,"ax",@progbits
21 .global _bitswap
22 .align 4
23 .type _bitswap,@function
24
25/* Registers used:
26 *
27 * r0 Temporary (required by some instructions)
28 * r1 Low byte
29 * r2 High byte
30 * r3 Result after flip
31 * r4 Data
32 * r5 Length
33 * r6 Current (position in Data)
34 * r7 Flip table
35 */
36
37_bitswap:
38 mov.l .fliptable,r7
39 mov r4,r6
40 add r5,r6 /* goto end of buffer */
41 add r5,r6 /* (direction IS important) */
42 bra .init
43.loop:
44 mov.w @r4,r1 /* data to flip */
45 swap.b r1,r2
46 extu.b r2,r0 /* high byte */
47 mov.b @(r0,r7),r2
48 extu.b r2,r0 /* remove any sign extend */
49 swap.b r0,r3 /* put high byte in result */
50 extu.b r1,r0 /* low byte */
51 mov.b @(r0,r7),r1
52 extu.b r1,r0 /* remove any sign extend */
53 or r0,r3 /* put low byte in result */
54 mov.w r3,@r4 /* store result */
55 add #2,r4
56.init:
57 cmp/gt r4,r6 /* while (data < start+length*2) */
58 bt .loop
59 rts
60
61 .align 4
62
63.fliptable:
64 .long _fliptable
65
66_fliptable:
67 .byte 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0
68 .byte 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0
69 .byte 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8
70 .byte 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8
71 .byte 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4
72 .byte 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4
73 .byte 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec
74 .byte 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc
75 .byte 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2
76 .byte 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2
77 .byte 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea
78 .byte 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa
79 .byte 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6
80 .byte 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6
81 .byte 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee
82 .byte 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe
83 .byte 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1
84 .byte 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1
85 .byte 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9
86 .byte 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9
87 .byte 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5
88 .byte 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5
89 .byte 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed
90 .byte 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd
91 .byte 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3
92 .byte 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3
93 .byte 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb
94 .byte 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb
95 .byte 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7
96 .byte 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7
97 .byte 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef
98 .byte 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
99
100.end:
101 .size _bitswap,.end-_bitswap