blob: 0def9388fb1566ebd0b75ed1322c06d4b7542760 [file] [log] [blame]
Thomas Gleixnerd2912cb2019-06-04 10:11:33 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
3 * linux/arch/arm/lib/io-readsb.S
4 *
5 * Copyright (C) 1995-2000 Russell King
Linus Torvalds1da177e2005-04-16 15:20:36 -07006 */
7#include <linux/linkage.h>
8#include <asm/assembler.h>
9
Nicolas Pitrea9c48142005-11-11 21:51:48 +000010.Linsb_align: rsb ip, ip, #4
Linus Torvalds1da177e2005-04-16 15:20:36 -070011 cmp ip, r2
12 movgt ip, r2
13 cmp ip, #2
14 ldrb r3, [r0]
15 strb r3, [r1], #1
Stefan Agnere44fc382019-02-18 00:57:38 +010016 ldrbge r3, [r0]
17 strbge r3, [r1], #1
18 ldrbgt r3, [r0]
19 strbgt r3, [r1], #1
Linus Torvalds1da177e2005-04-16 15:20:36 -070020 subs r2, r2, ip
Nicolas Pitrea9c48142005-11-11 21:51:48 +000021 bne .Linsb_aligned
Linus Torvalds1da177e2005-04-16 15:20:36 -070022
23ENTRY(__raw_readsb)
24 teq r2, #0 @ do we have to check for the zero len?
Russell King6ebbf2c2014-06-30 16:29:12 +010025 reteq lr
Linus Torvalds1da177e2005-04-16 15:20:36 -070026 ands ip, r1, #3
Nicolas Pitrea9c48142005-11-11 21:51:48 +000027 bne .Linsb_align
Linus Torvalds1da177e2005-04-16 15:20:36 -070028
Nicolas Pitrea9c48142005-11-11 21:51:48 +000029.Linsb_aligned: stmfd sp!, {r4 - r6, lr}
Linus Torvalds1da177e2005-04-16 15:20:36 -070030
31 subs r2, r2, #16
Nicolas Pitrea9c48142005-11-11 21:51:48 +000032 bmi .Linsb_no_16
Linus Torvalds1da177e2005-04-16 15:20:36 -070033
Nicolas Pitrea9c48142005-11-11 21:51:48 +000034.Linsb_16_lp: ldrb r3, [r0]
Linus Torvalds1da177e2005-04-16 15:20:36 -070035 ldrb r4, [r0]
36 ldrb r5, [r0]
37 mov r3, r3, put_byte_0
38 ldrb r6, [r0]
39 orr r3, r3, r4, put_byte_1
40 ldrb r4, [r0]
41 orr r3, r3, r5, put_byte_2
42 ldrb r5, [r0]
43 orr r3, r3, r6, put_byte_3
44 ldrb r6, [r0]
45 mov r4, r4, put_byte_0
46 ldrb ip, [r0]
47 orr r4, r4, r5, put_byte_1
48 ldrb r5, [r0]
49 orr r4, r4, r6, put_byte_2
50 ldrb r6, [r0]
51 orr r4, r4, ip, put_byte_3
52 ldrb ip, [r0]
53 mov r5, r5, put_byte_0
54 ldrb lr, [r0]
55 orr r5, r5, r6, put_byte_1
56 ldrb r6, [r0]
57 orr r5, r5, ip, put_byte_2
58 ldrb ip, [r0]
59 orr r5, r5, lr, put_byte_3
60 ldrb lr, [r0]
61 mov r6, r6, put_byte_0
62 orr r6, r6, ip, put_byte_1
63 ldrb ip, [r0]
64 orr r6, r6, lr, put_byte_2
65 orr r6, r6, ip, put_byte_3
66 stmia r1!, {r3 - r6}
67
68 subs r2, r2, #16
Nicolas Pitrea9c48142005-11-11 21:51:48 +000069 bpl .Linsb_16_lp
Linus Torvalds1da177e2005-04-16 15:20:36 -070070
71 tst r2, #15
Stefan Agnere44fc382019-02-18 00:57:38 +010072 ldmfdeq sp!, {r4 - r6, pc}
Linus Torvalds1da177e2005-04-16 15:20:36 -070073
Nicolas Pitrea9c48142005-11-11 21:51:48 +000074.Linsb_no_16: tst r2, #8
75 beq .Linsb_no_8
Linus Torvalds1da177e2005-04-16 15:20:36 -070076
77 ldrb r3, [r0]
78 ldrb r4, [r0]
79 ldrb r5, [r0]
80 mov r3, r3, put_byte_0
81 ldrb r6, [r0]
82 orr r3, r3, r4, put_byte_1
83 ldrb r4, [r0]
84 orr r3, r3, r5, put_byte_2
85 ldrb r5, [r0]
86 orr r3, r3, r6, put_byte_3
87 ldrb r6, [r0]
88 mov r4, r4, put_byte_0
89 ldrb ip, [r0]
90 orr r4, r4, r5, put_byte_1
91 orr r4, r4, r6, put_byte_2
92 orr r4, r4, ip, put_byte_3
93 stmia r1!, {r3, r4}
94
Nicolas Pitrea9c48142005-11-11 21:51:48 +000095.Linsb_no_8: tst r2, #4
96 beq .Linsb_no_4
Linus Torvalds1da177e2005-04-16 15:20:36 -070097
98 ldrb r3, [r0]
99 ldrb r4, [r0]
100 ldrb r5, [r0]
101 ldrb r6, [r0]
102 mov r3, r3, put_byte_0
103 orr r3, r3, r4, put_byte_1
104 orr r3, r3, r5, put_byte_2
105 orr r3, r3, r6, put_byte_3
106 str r3, [r1], #4
107
Nicolas Pitrea9c48142005-11-11 21:51:48 +0000108.Linsb_no_4: ands r2, r2, #3
Stefan Agnere44fc382019-02-18 00:57:38 +0100109 ldmfdeq sp!, {r4 - r6, pc}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110
111 cmp r2, #2
112 ldrb r3, [r0]
113 strb r3, [r1], #1
Stefan Agnere44fc382019-02-18 00:57:38 +0100114 ldrbge r3, [r0]
115 strbge r3, [r1], #1
116 ldrbgt r3, [r0]
117 strbgt r3, [r1]
Linus Torvalds1da177e2005-04-16 15:20:36 -0700118
Russell King1b93a712006-06-25 11:23:45 +0100119 ldmfd sp!, {r4 - r6, pc}
Catalin Marinas93ed3972008-08-28 11:22:32 +0100120ENDPROC(__raw_readsb)