http://downloads.netgear.com/files/GPL/GPL_Source_V361j_DM111PSP_series_consumer_rele...
[bcm963xx.git] / kernel / linux / arch / arm / lib / io-readsl-armv4.S
1 /*
2  *  linux/arch/arm/lib/io-readsl-armv4.S
3  *
4  *  Copyright (C) 1995-2000 Russell King
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10 #include <linux/linkage.h>
11 #include <asm/assembler.h>
12
13 /*
14  * Note that some reads can be aligned on half-word boundaries.
15  */
16 ENTRY(__raw_readsl)
17                 teq     r2, #0          @ do we have to check for the zero len?
18                 moveq   pc, lr
19                 ands    ip, r1, #3
20                 bne     2f
21
22                 subs    r2, r2, #4
23                 bmi     1001f
24                 stmfd   sp!, {r4, lr}
25 1000:           ldr     r3, [r0, #0]
26                 ldr     r4, [r0, #0]
27                 ldr     ip, [r0, #0]
28                 ldr     lr, [r0, #0]
29                 subs    r2, r2, #4
30                 stmia   r1!, {r3, r4, ip, lr}
31                 bpl     1000b
32                 ldmfd   sp!, {r4, lr}
33 1001:           tst     r2, #2
34                 ldrne   r3, [r0, #0]
35                 ldrne   ip, [r0, #0]
36                 stmneia r1!, {r3, ip}
37                 tst     r2, #1
38                 ldrne   r3, [r0, #0]
39                 strne   r3, [r1, #0]
40                 mov     pc, lr
41
42 2:              cmp     ip, #2
43                 ldr     ip, [r0]
44                 blt     4f
45                 bgt     6f
46
47 #ifndef __ARMEB__
48
49                 /* little endian code */
50
51                 strh    ip, [r1], #2
52                 mov     ip, ip, lsr #16
53 3:              subs    r2, r2, #1
54                 ldrne   r3, [r0]
55                 orrne   ip, ip, r3, lsl #16
56                 strne   ip, [r1], #4
57                 movne   ip, r3, lsr #16
58                 bne     3b
59                 strh    ip, [r1], #2
60                 mov     pc, lr
61
62 4:              strb    ip, [r1], #1
63                 mov     ip, ip, lsr #8
64                 strh    ip, [r1], #2
65                 mov     ip, ip, lsr #16
66 5:              subs    r2, r2, #1
67                 ldrne   r3, [r0]
68                 orrne   ip, ip, r3, lsl #8
69                 strne   ip, [r1], #4
70                 movne   ip, r3, lsr #24
71                 bne     5b
72                 strb    ip, [r1], #1
73                 mov     pc, lr
74
75 6:              strb    ip, [r1], #1
76                 mov     ip, ip, lsr #8
77 7:              subs    r2, r2, #1
78                 ldrne   r3, [r0]
79                 orrne   ip, ip, r3, lsl #24
80                 strne   ip, [r1], #4
81                 movne   ip, r3, lsr #8
82                 bne     7b
83                 strh    ip, [r1], #2
84                 mov     ip, ip, lsr #16
85                 strb    ip, [r1]
86                 mov     pc, lr
87
88 #else
89
90                 /* big endian code */
91
92
93                 mov     r3, ip, lsr #16
94                 strh    r3, [r1], #2
95 3:              mov     r3, ip, lsl #16
96                 subs    r2, r2, #1
97                 ldrne   ip, [r0]
98                 orrne   r3, r3, ip, lsr #16
99                 strne   r3, [r1], #4
100                 bne     3b
101                 strh    ip, [r1], #2
102                 mov     pc, lr
103
104 4:              mov     r3, ip, lsr #24
105                 strb    r3, [r1], #1
106                 mov     r3, ip, lsr #8
107                 strh    r3, [r1], #2
108 5:              mov     r3, ip, lsl #24
109                 subs    r2, r2, #1
110                 ldrne   ip, [r0]
111                 orrne   r3, r3, ip, lsr #8
112                 strne   r3, [r1], #4
113                 bne     5b
114                 strb    ip, [r1], #1
115                 mov     pc, lr
116
117 6:              mov     r3, ip, lsr #24
118                 strb    r3, [r1], #1
119 7:              mov     r3, ip, lsl #8
120                 subs    r2, r2, #1
121                 ldrne   ip, [r0]
122                 orrne   r3, r3, ip, lsr #24
123                 strne   r3, [r1], #4
124                 bne     7b
125                 mov     r3, ip, lsr #8
126                 strh    r3, [r1], #2
127                 strb    ip, [r1], #1
128                 mov     pc, lr
129
130 #endif
131
132