Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / arch / arm / lib / io-readsl.S
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  *  linux/arch/arm/lib/io-readsl.S
4  *
5  *  Copyright (C) 1995-2000 Russell King
6  */
7 #include <linux/linkage.h>
8 #include <asm/assembler.h>
9
10 ENTRY(__raw_readsl)
11                 teq     r2, #0          @ do we have to check for the zero len?
12                 reteq   lr
13                 ands    ip, r1, #3
14                 bne     3f
15
16                 subs    r2, r2, #4
17                 bmi     2f
18                 stmfd   sp!, {r4, lr}
19 1:              ldr     r3, [r0, #0]
20                 ldr     r4, [r0, #0]
21                 ldr     ip, [r0, #0]
22                 ldr     lr, [r0, #0]
23                 subs    r2, r2, #4
24                 stmia   r1!, {r3, r4, ip, lr}
25                 bpl     1b
26                 ldmfd   sp!, {r4, lr}
27 2:              movs    r2, r2, lsl #31
28                 ldrcs   r3, [r0, #0]
29                 ldrcs   ip, [r0, #0]
30                 stmiacs r1!, {r3, ip}
31                 ldrne   r3, [r0, #0]
32                 strne   r3, [r1, #0]
33                 ret     lr
34
35 3:              ldr     r3, [r0]
36                 cmp     ip, #2
37                 mov     ip, r3, get_byte_0
38                 strb    ip, [r1], #1
39                 bgt     6f
40                 mov     ip, r3, get_byte_1
41                 strb    ip, [r1], #1
42                 beq     5f
43                 mov     ip, r3, get_byte_2
44                 strb    ip, [r1], #1
45
46 4:              subs    r2, r2, #1
47                 mov     ip, r3, lspull #24
48                 ldrne   r3, [r0]
49                 orrne   ip, ip, r3, lspush #8
50                 strne   ip, [r1], #4
51                 bne     4b
52                 b       8f
53
54 5:              subs    r2, r2, #1
55                 mov     ip, r3, lspull #16
56                 ldrne   r3, [r0]
57                 orrne   ip, ip, r3, lspush #16
58                 strne   ip, [r1], #4
59                 bne     5b
60                 b       7f
61
62 6:              subs    r2, r2, #1
63                 mov     ip, r3, lspull #8
64                 ldrne   r3, [r0]
65                 orrne   ip, ip, r3, lspush #24
66                 strne   ip, [r1], #4
67                 bne     6b
68
69                 mov     r3, ip, get_byte_2
70                 strb    r3, [r1, #2]
71 7:              mov     r3, ip, get_byte_1
72                 strb    r3, [r1, #1]
73 8:              mov     r3, ip, get_byte_0
74                 strb    r3, [r1, #0]
75                 ret     lr
76 ENDPROC(__raw_readsl)