treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500
[sfrench/cifs-2.6.git] / arch / arm / lib / io-writesb.S
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)