1
2
3
4
5
6
7
8
9
10#include <linux/linkage.h>
11#include <asm/assembler.h>
12
13 .macro pack, rd, hw1, hw2
14#ifndef __ARMEB__
15 orr \rd, \hw1, \hw2, lsl
16#else
17 orr \rd, \hw2, \hw1, lsl
18#endif
19 .endm
20
21.Linsw_align: movs ip, r1, lsl
22 bne .Linsw_noalign
23 ldrh ip, [r0]
24 sub r2, r2,
25 strh ip, [r1],
26
27ENTRY(__raw_readsw)
28 teq r2,
29 reteq lr
30 tst r1,
31 bne .Linsw_align
32
33 stmfd sp!, {r4, r5, lr}
34
35 subs r2, r2,
36 bmi .Lno_insw_8
37
38.Linsw_8_lp: ldrh r3, [r0]
39 ldrh r4, [r0]
40 pack r3, r3, r4
41
42 ldrh r4, [r0]
43 ldrh r5, [r0]
44 pack r4, r4, r5
45
46 ldrh r5, [r0]
47 ldrh ip, [r0]
48 pack r5, r5, ip
49
50 ldrh ip, [r0]
51 ldrh lr, [r0]
52 pack ip, ip, lr
53
54 subs r2, r2,
55 stmia r1!, {r3 - r5, ip}
56 bpl .Linsw_8_lp
57
58.Lno_insw_8: tst r2,
59 beq .Lno_insw_4
60
61 ldrh r3, [r0]
62 ldrh r4, [r0]
63 pack r3, r3, r4
64
65 ldrh r4, [r0]
66 ldrh ip, [r0]
67 pack r4, r4, ip
68
69 stmia r1!, {r3, r4}
70
71.Lno_insw_4: movs r2, r2, lsl
72 bcc .Lno_insw_2
73
74 ldrh r3, [r0]
75 ldrh ip, [r0]
76 pack r3, r3, ip
77 str r3, [r1],
78
79.Lno_insw_2: ldrneh r3, [r0]
80 strneh r3, [r1]
81
82 ldmfd sp!, {r4, r5, pc}
83
84#ifdef __ARMEB__
85#define _BE_ONLY_(code...) code
86#define _LE_ONLY_(code...)
87#define push_hbyte0 lsr
88#define pull_hbyte1 lsl
89#else
90#define _BE_ONLY_(code...)
91#define _LE_ONLY_(code...) code
92#define push_hbyte0 lsl
93#define pull_hbyte1 lsr
94#endif
95
96.Linsw_noalign: stmfd sp!, {r4, lr}
97 ldrccb ip, [r1,
98 bcc 1f
99
100 ldrh ip, [r0]
101 sub r2, r2,
102 _BE_ONLY_( mov ip, ip, ror
103 strb ip, [r1],
104 _LE_ONLY_( mov ip, ip, lsr
105 _BE_ONLY_( mov ip, ip, lsr
106
1071: subs r2, r2,
108 bmi 3f
109 _BE_ONLY_( mov ip, ip, lsl
110
1112: ldrh r3, [r0]
112 ldrh r4, [r0]
113 subs r2, r2,
114 orr ip, ip, r3, lsl
115 orr ip, ip, r4, push_hbyte0
116 str ip, [r1],
117 mov ip, r4, pull_hbyte1
118 bpl 2b
119
120 _BE_ONLY_( mov ip, ip, lsr
121
1223: tst r2,
123 strb ip, [r1],
124 ldrneh ip, [r0]
125 _BE_ONLY_( movne ip, ip, ror
126 strneb ip, [r1],
127 _LE_ONLY_( movne ip, ip, lsr
128 _BE_ONLY_( movne ip, ip, lsr
129 strneb ip, [r1]
130 ldmfd sp!, {r4, pc}
131ENDPROC(__raw_readsw)
132