Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/arm/lib/io-writesw-armv4.S
26292 views
1
/* SPDX-License-Identifier: GPL-2.0-only */
2
/*
3
* linux/arch/arm/lib/io-writesw-armv4.S
4
*
5
* Copyright (C) 1995-2000 Russell King
6
*/
7
#include <linux/linkage.h>
8
#include <asm/assembler.h>
9
10
.macro outword, rd
11
#ifndef __ARMEB__
12
strh \rd, [r0]
13
mov \rd, \rd, lsr #16
14
strh \rd, [r0]
15
#else
16
mov lr, \rd, lsr #16
17
strh lr, [r0]
18
strh \rd, [r0]
19
#endif
20
.endm
21
22
.Loutsw_align: movs ip, r1, lsl #31
23
bne .Loutsw_noalign
24
25
ldrh r3, [r1], #2
26
sub r2, r2, #1
27
strh r3, [r0]
28
29
ENTRY(__raw_writesw)
30
teq r2, #0
31
reteq lr
32
ands r3, r1, #3
33
bne .Loutsw_align
34
35
stmfd sp!, {r4, r5, lr}
36
37
subs r2, r2, #8
38
bmi .Lno_outsw_8
39
40
.Loutsw_8_lp: ldmia r1!, {r3, r4, r5, ip}
41
subs r2, r2, #8
42
outword r3
43
outword r4
44
outword r5
45
outword ip
46
bpl .Loutsw_8_lp
47
48
.Lno_outsw_8: tst r2, #4
49
beq .Lno_outsw_4
50
51
ldmia r1!, {r3, ip}
52
outword r3
53
outword ip
54
55
.Lno_outsw_4: movs r2, r2, lsl #31
56
bcc .Lno_outsw_2
57
58
ldr r3, [r1], #4
59
outword r3
60
61
.Lno_outsw_2: ldrhne r3, [r1]
62
strhne r3, [r0]
63
64
ldmfd sp!, {r4, r5, pc}
65
66
#ifdef __ARMEB__
67
#define pull_hbyte0 lsl #8
68
#define push_hbyte1 lsr #24
69
#else
70
#define pull_hbyte0 lsr #24
71
#define push_hbyte1 lsl #8
72
#endif
73
74
.Loutsw_noalign:
75
ARM( ldr r3, [r1, -r3]! )
76
THUMB( rsb r3, r3, #0 )
77
THUMB( ldr r3, [r1, r3] )
78
THUMB( sub r1, r3 )
79
subcs r2, r2, #1
80
bcs 2f
81
subs r2, r2, #2
82
bmi 3f
83
84
1: mov ip, r3, lsr #8
85
strh ip, [r0]
86
2: mov ip, r3, pull_hbyte0
87
ldr r3, [r1, #4]!
88
subs r2, r2, #2
89
orr ip, ip, r3, push_hbyte1
90
strh ip, [r0]
91
bpl 1b
92
93
tst r2, #1
94
3: movne ip, r3, lsr #8
95
strhne ip, [r0]
96
ret lr
97
ENDPROC(__raw_writesw)
98
99