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

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