1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * linux/arch/arm/lib/io-readsw-armv3.S
4 *
5 * Copyright (C) 1995-2000 Russell King
6 */
7#include <linux/linkage.h>
8#include <asm/assembler.h>
9
10.Linsw_bad_alignment:
11 adr r0, .Linsw_bad_align_msg
12 mov r2, lr
13 b panic
14.Linsw_bad_align_msg:
15 .asciz "insw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
16 .align
17
18.Linsw_align: tst r1, #1
19 bne .Linsw_bad_alignment
20
21 ldr r3, [r0]
22 strb r3, [r1], #1
23 mov r3, r3, lsr #8
24 strb r3, [r1], #1
25
26 subs r2, r2, #1
27 reteq lr
28
29ENTRY(__raw_readsw)
30 teq r2, #0 @ do we have to check for the zero len?
31 reteq lr
32 tst r1, #3
33 bne .Linsw_align
34
35.Linsw_aligned: mov ip, #0xff
36 orr ip, ip, ip, lsl #8
37 stmfd sp!, {r4, r5, r6, lr}
38
39 subs r2, r2, #8
40 bmi .Lno_insw_8
41
42.Linsw_8_lp: ldr r3, [r0]
43 and r3, r3, ip
44 ldr r4, [r0]
45 orr r3, r3, r4, lsl #16
46
47 ldr r4, [r0]
48 and r4, r4, ip
49 ldr r5, [r0]
50 orr r4, r4, r5, lsl #16
51
52 ldr r5, [r0]
53 and r5, r5, ip
54 ldr r6, [r0]
55 orr r5, r5, r6, lsl #16
56
57 ldr r6, [r0]
58 and r6, r6, ip
59 ldr lr, [r0]
60 orr r6, r6, lr, lsl #16
61
62 stmia r1!, {r3 - r6}
63
64 subs r2, r2, #8
65 bpl .Linsw_8_lp
66
67 tst r2, #7
68 ldmfdeq sp!, {r4, r5, r6, pc}
69
70.Lno_insw_8: tst r2, #4
71 beq .Lno_insw_4
72
73 ldr r3, [r0]
74 and r3, r3, ip
75 ldr r4, [r0]
76 orr r3, r3, r4, lsl #16
77
78 ldr r4, [r0]
79 and r4, r4, ip
80 ldr r5, [r0]
81 orr r4, r4, r5, lsl #16
82
83 stmia r1!, {r3, r4}
84
85.Lno_insw_4: tst r2, #2
86 beq .Lno_insw_2
87
88 ldr r3, [r0]
89 and r3, r3, ip
90 ldr r4, [r0]
91 orr r3, r3, r4, lsl #16
92
93 str r3, [r1], #4
94
95.Lno_insw_2: tst r2, #1
96 ldrne r3, [r0]
97 strbne r3, [r1], #1
98 movne r3, r3, lsr #8
99 strbne r3, [r1]
100
101 ldmfd sp!, {r4, r5, r6, pc}
102
103
104

source code of linux/arch/arm/lib/io-readsw-armv3.S