GNU Linux-libre 4.19.264-gnu1
[releases.git] / arch / arm / lib / io-writesw-armv4.S
1 /*
2  *  linux/arch/arm/lib/io-writesw-armv4.S
3  *
4  *  Copyright (C) 1995-2000 Russell King
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10 #include <linux/linkage.h>
11 #include <asm/assembler.h>
12
13                 .macro  outword, rd
14 #ifndef __ARMEB__
15                 strh    \rd, [r0]
16                 mov     \rd, \rd, lsr #16
17                 strh    \rd, [r0]
18 #else
19                 mov     lr, \rd, lsr #16
20                 strh    lr, [r0]
21                 strh    \rd, [r0]
22 #endif
23                 .endm
24
25 .Loutsw_align:  movs    ip, r1, lsl #31
26                 bne     .Loutsw_noalign
27
28                 ldrh    r3, [r1], #2
29                 sub     r2, r2, #1
30                 strh    r3, [r0]
31
32 ENTRY(__raw_writesw)
33                 teq     r2, #0
34                 reteq   lr
35                 ands    r3, r1, #3
36                 bne     .Loutsw_align
37
38                 stmfd   sp!, {r4, r5, lr}
39
40                 subs    r2, r2, #8
41                 bmi     .Lno_outsw_8
42
43 .Loutsw_8_lp:   ldmia   r1!, {r3, r4, r5, ip}
44                 subs    r2, r2, #8
45                 outword r3
46                 outword r4
47                 outword r5
48                 outword ip
49                 bpl     .Loutsw_8_lp
50
51 .Lno_outsw_8:   tst     r2, #4
52                 beq     .Lno_outsw_4
53
54                 ldmia   r1!, {r3, ip}
55                 outword r3
56                 outword ip
57
58 .Lno_outsw_4:   movs    r2, r2, lsl #31
59                 bcc     .Lno_outsw_2
60
61                 ldr     r3, [r1], #4
62                 outword r3
63
64 .Lno_outsw_2:   ldrneh  r3, [r1]
65                 strneh  r3, [r0]
66
67                 ldmfd   sp!, {r4, r5, pc}
68
69 #ifdef __ARMEB__
70 #define pull_hbyte0     lsl #8
71 #define push_hbyte1     lsr #24
72 #else
73 #define pull_hbyte0     lsr #24
74 #define push_hbyte1     lsl #8
75 #endif
76
77 .Loutsw_noalign:
78  ARM(           ldr     r3, [r1, -r3]!  )
79  THUMB(         rsb     r3, r3, #0      )
80  THUMB(         ldr     r3, [r1, r3]    )
81  THUMB(         sub     r1, r3          )
82                 subcs   r2, r2, #1
83                 bcs     2f
84                 subs    r2, r2, #2
85                 bmi     3f
86
87 1:              mov     ip, r3, lsr #8
88                 strh    ip, [r0]
89 2:              mov     ip, r3, pull_hbyte0
90                 ldr     r3, [r1, #4]!
91                 subs    r2, r2, #2
92                 orr     ip, ip, r3, push_hbyte1
93                 strh    ip, [r0]
94                 bpl     1b
95
96                 tst     r2, #1
97 3:              movne   ip, r3, lsr #8
98                 strneh  ip, [r0]
99                 ret     lr
100 ENDPROC(__raw_writesw)