1
2
3
4
5
6
7
8
9
10#include <linux/linkage.h>
11#include <asm/assembler.h>
12
13.Loutsw_bad_alignment:
14 adr r0, .Loutsw_bad_align_msg
15 mov r2, lr
16 b panic
17.Loutsw_bad_align_msg:
18 .asciz "outsw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
19 .align
20
21.Loutsw_align: tst r1,
22 bne .Loutsw_bad_alignment
23
24 add r1, r1,
25
26 ldr r3, [r1,
27 mov r3, r3, lsr
28 orr r3, r3, r3, lsl
29 str r3, [r0]
30 subs r2, r2,
31 reteq lr
32
33ENTRY(__raw_writesw)
34 teq r2,
35 reteq lr
36 tst r1,
37 bne .Loutsw_align
38
39 stmfd sp!, {r4, r5, r6, lr}
40
41 subs r2, r2,
42 bmi .Lno_outsw_8
43
44.Loutsw_8_lp: ldmia r1!, {r3, r4, r5, r6}
45
46 mov ip, r3, lsl
47 orr ip, ip, ip, lsr
48 str ip, [r0]
49
50 mov ip, r3, lsr
51 orr ip, ip, ip, lsl
52 str ip, [r0]
53
54 mov ip, r4, lsl
55 orr ip, ip, ip, lsr
56 str ip, [r0]
57
58 mov ip, r4, lsr
59 orr ip, ip, ip, lsl
60 str ip, [r0]
61
62 mov ip, r5, lsl
63 orr ip, ip, ip, lsr
64 str ip, [r0]
65
66 mov ip, r5, lsr
67 orr ip, ip, ip, lsl
68 str ip, [r0]
69
70 mov ip, r6, lsl
71 orr ip, ip, ip, lsr
72 str ip, [r0]
73
74 mov ip, r6, lsr
75 orr ip, ip, ip, lsl
76 str ip, [r0]
77
78 subs r2, r2,
79 bpl .Loutsw_8_lp
80
81 tst r2,
82 ldmeqfd sp!, {r4, r5, r6, pc}
83
84.Lno_outsw_8: tst r2,
85 beq .Lno_outsw_4
86
87 ldmia r1!, {r3, r4}
88
89 mov ip, r3, lsl
90 orr ip, ip, ip, lsr
91 str ip, [r0]
92
93 mov ip, r3, lsr
94 orr ip, ip, ip, lsl
95 str ip, [r0]
96
97 mov ip, r4, lsl
98 orr ip, ip, ip, lsr
99 str ip, [r0]
100
101 mov ip, r4, lsr
102 orr ip, ip, ip, lsl
103 str ip, [r0]
104
105.Lno_outsw_4: tst r2,
106 beq .Lno_outsw_2
107
108 ldr r3, [r1],
109
110 mov ip, r3, lsl
111 orr ip, ip, ip, lsr
112 str ip, [r0]
113
114 mov ip, r3, lsr
115 orr ip, ip, ip, lsl
116 str ip, [r0]
117
118.Lno_outsw_2: tst r2,
119
120 ldrne r3, [r1]
121
122 movne ip, r3, lsl
123 orrne ip, ip, ip, lsr
124 strne ip, [r0]
125
126 ldmfd sp!, {r4, r5, r6, pc}
127