]>
Commit | Line | Data |
---|---|---|
d2912cb1 | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
1da177e4 LT |
2 | /* |
3 | * linux/arch/arm/lib/io-readsb.S | |
4 | * | |
5 | * Copyright (C) 1995-2000 Russell King | |
1da177e4 LT |
6 | */ |
7 | #include <linux/linkage.h> | |
8 | #include <asm/assembler.h> | |
9 | ||
a9c4814d | 10 | .Linsb_align: rsb ip, ip, #4 |
1da177e4 LT |
11 | cmp ip, r2 |
12 | movgt ip, r2 | |
13 | cmp ip, #2 | |
14 | ldrb r3, [r0] | |
15 | strb r3, [r1], #1 | |
e44fc388 SA |
16 | ldrbge r3, [r0] |
17 | strbge r3, [r1], #1 | |
18 | ldrbgt r3, [r0] | |
19 | strbgt r3, [r1], #1 | |
1da177e4 | 20 | subs r2, r2, ip |
a9c4814d | 21 | bne .Linsb_aligned |
1da177e4 LT |
22 | |
23 | ENTRY(__raw_readsb) | |
24 | teq r2, #0 @ do we have to check for the zero len? | |
6ebbf2ce | 25 | reteq lr |
1da177e4 | 26 | ands ip, r1, #3 |
a9c4814d | 27 | bne .Linsb_align |
1da177e4 | 28 | |
a9c4814d | 29 | .Linsb_aligned: stmfd sp!, {r4 - r6, lr} |
1da177e4 LT |
30 | |
31 | subs r2, r2, #16 | |
a9c4814d | 32 | bmi .Linsb_no_16 |
1da177e4 | 33 | |
a9c4814d | 34 | .Linsb_16_lp: ldrb r3, [r0] |
1da177e4 LT |
35 | ldrb r4, [r0] |
36 | ldrb r5, [r0] | |
37 | mov r3, r3, put_byte_0 | |
38 | ldrb r6, [r0] | |
39 | orr r3, r3, r4, put_byte_1 | |
40 | ldrb r4, [r0] | |
41 | orr r3, r3, r5, put_byte_2 | |
42 | ldrb r5, [r0] | |
43 | orr r3, r3, r6, put_byte_3 | |
44 | ldrb r6, [r0] | |
45 | mov r4, r4, put_byte_0 | |
46 | ldrb ip, [r0] | |
47 | orr r4, r4, r5, put_byte_1 | |
48 | ldrb r5, [r0] | |
49 | orr r4, r4, r6, put_byte_2 | |
50 | ldrb r6, [r0] | |
51 | orr r4, r4, ip, put_byte_3 | |
52 | ldrb ip, [r0] | |
53 | mov r5, r5, put_byte_0 | |
54 | ldrb lr, [r0] | |
55 | orr r5, r5, r6, put_byte_1 | |
56 | ldrb r6, [r0] | |
57 | orr r5, r5, ip, put_byte_2 | |
58 | ldrb ip, [r0] | |
59 | orr r5, r5, lr, put_byte_3 | |
60 | ldrb lr, [r0] | |
61 | mov r6, r6, put_byte_0 | |
62 | orr r6, r6, ip, put_byte_1 | |
63 | ldrb ip, [r0] | |
64 | orr r6, r6, lr, put_byte_2 | |
65 | orr r6, r6, ip, put_byte_3 | |
66 | stmia r1!, {r3 - r6} | |
67 | ||
68 | subs r2, r2, #16 | |
a9c4814d | 69 | bpl .Linsb_16_lp |
1da177e4 LT |
70 | |
71 | tst r2, #15 | |
e44fc388 | 72 | ldmfdeq sp!, {r4 - r6, pc} |
1da177e4 | 73 | |
a9c4814d NP |
74 | .Linsb_no_16: tst r2, #8 |
75 | beq .Linsb_no_8 | |
1da177e4 LT |
76 | |
77 | ldrb r3, [r0] | |
78 | ldrb r4, [r0] | |
79 | ldrb r5, [r0] | |
80 | mov r3, r3, put_byte_0 | |
81 | ldrb r6, [r0] | |
82 | orr r3, r3, r4, put_byte_1 | |
83 | ldrb r4, [r0] | |
84 | orr r3, r3, r5, put_byte_2 | |
85 | ldrb r5, [r0] | |
86 | orr r3, r3, r6, put_byte_3 | |
87 | ldrb r6, [r0] | |
88 | mov r4, r4, put_byte_0 | |
89 | ldrb ip, [r0] | |
90 | orr r4, r4, r5, put_byte_1 | |
91 | orr r4, r4, r6, put_byte_2 | |
92 | orr r4, r4, ip, put_byte_3 | |
93 | stmia r1!, {r3, r4} | |
94 | ||
a9c4814d NP |
95 | .Linsb_no_8: tst r2, #4 |
96 | beq .Linsb_no_4 | |
1da177e4 LT |
97 | |
98 | ldrb r3, [r0] | |
99 | ldrb r4, [r0] | |
100 | ldrb r5, [r0] | |
101 | ldrb r6, [r0] | |
102 | mov r3, r3, put_byte_0 | |
103 | orr r3, r3, r4, put_byte_1 | |
104 | orr r3, r3, r5, put_byte_2 | |
105 | orr r3, r3, r6, put_byte_3 | |
106 | str r3, [r1], #4 | |
107 | ||
a9c4814d | 108 | .Linsb_no_4: ands r2, r2, #3 |
e44fc388 | 109 | ldmfdeq sp!, {r4 - r6, pc} |
1da177e4 LT |
110 | |
111 | cmp r2, #2 | |
112 | ldrb r3, [r0] | |
113 | strb r3, [r1], #1 | |
e44fc388 SA |
114 | ldrbge r3, [r0] |
115 | strbge r3, [r1], #1 | |
116 | ldrbgt r3, [r0] | |
117 | strbgt r3, [r1] | |
1da177e4 | 118 | |
1b93a717 | 119 | ldmfd sp!, {r4 - r6, pc} |
93ed3970 | 120 | ENDPROC(__raw_readsb) |