Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/arm/lib/io-writesb.S
26292 views
1
/* SPDX-License-Identifier: GPL-2.0-only */
2
/*
3
* linux/arch/arm/lib/io-writesb.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
strb \rd, [r0]
13
mov \rd, \rd, lsr #8
14
strb \rd, [r0]
15
mov \rd, \rd, lsr #8
16
strb \rd, [r0]
17
mov \rd, \rd, lsr #8
18
strb \rd, [r0]
19
#else
20
mov lr, \rd, lsr #24
21
strb lr, [r0]
22
mov lr, \rd, lsr #16
23
strb lr, [r0]
24
mov lr, \rd, lsr #8
25
strb lr, [r0]
26
strb \rd, [r0]
27
#endif
28
.endm
29
30
.Loutsb_align: rsb ip, ip, #4
31
cmp ip, r2
32
movgt ip, r2
33
cmp ip, #2
34
ldrb r3, [r1], #1
35
strb r3, [r0]
36
ldrbge r3, [r1], #1
37
strbge r3, [r0]
38
ldrbgt r3, [r1], #1
39
strbgt r3, [r0]
40
subs r2, r2, ip
41
bne .Loutsb_aligned
42
43
ENTRY(__raw_writesb)
44
teq r2, #0 @ do we have to check for the zero len?
45
reteq lr
46
ands ip, r1, #3
47
bne .Loutsb_align
48
49
.Loutsb_aligned:
50
stmfd sp!, {r4, r5, lr}
51
52
subs r2, r2, #16
53
bmi .Loutsb_no_16
54
55
.Loutsb_16_lp: ldmia r1!, {r3, r4, r5, ip}
56
outword r3
57
outword r4
58
outword r5
59
outword ip
60
subs r2, r2, #16
61
bpl .Loutsb_16_lp
62
63
tst r2, #15
64
ldmfdeq sp!, {r4, r5, pc}
65
66
.Loutsb_no_16: tst r2, #8
67
beq .Loutsb_no_8
68
69
ldmia r1!, {r3, r4}
70
outword r3
71
outword r4
72
73
.Loutsb_no_8: tst r2, #4
74
beq .Loutsb_no_4
75
76
ldr r3, [r1], #4
77
outword r3
78
79
.Loutsb_no_4: ands r2, r2, #3
80
ldmfdeq sp!, {r4, r5, pc}
81
82
cmp r2, #2
83
ldrb r3, [r1], #1
84
strb r3, [r0]
85
ldrbge r3, [r1], #1
86
strbge r3, [r0]
87
ldrbgt r3, [r1]
88
strbgt r3, [r0]
89
90
ldmfd sp!, {r4, r5, pc}
91
ENDPROC(__raw_writesb)
92
93