18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *  linux/arch/arm/lib/io-readsb.S
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci *  Copyright (C) 1995-2000 Russell King
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci#include <linux/linkage.h>
88c2ecf20Sopenharmony_ci#include <asm/assembler.h>
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci.Linsb_align:	rsb	ip, ip, #4
118c2ecf20Sopenharmony_ci		cmp	ip, r2
128c2ecf20Sopenharmony_ci		movgt	ip, r2
138c2ecf20Sopenharmony_ci		cmp	ip, #2
148c2ecf20Sopenharmony_ci		ldrb	r3, [r0]
158c2ecf20Sopenharmony_ci		strb	r3, [r1], #1
168c2ecf20Sopenharmony_ci		ldrbge	r3, [r0]
178c2ecf20Sopenharmony_ci		strbge	r3, [r1], #1
188c2ecf20Sopenharmony_ci		ldrbgt	r3, [r0]
198c2ecf20Sopenharmony_ci		strbgt	r3, [r1], #1
208c2ecf20Sopenharmony_ci		subs	r2, r2, ip
218c2ecf20Sopenharmony_ci		bne	.Linsb_aligned
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ciENTRY(__raw_readsb)
248c2ecf20Sopenharmony_ci		teq	r2, #0		@ do we have to check for the zero len?
258c2ecf20Sopenharmony_ci		reteq	lr
268c2ecf20Sopenharmony_ci		ands	ip, r1, #3
278c2ecf20Sopenharmony_ci		bne	.Linsb_align
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci.Linsb_aligned:	stmfd	sp!, {r4 - r6, lr}
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci		subs	r2, r2, #16
328c2ecf20Sopenharmony_ci		bmi	.Linsb_no_16
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci.Linsb_16_lp:	ldrb	r3, [r0]
358c2ecf20Sopenharmony_ci		ldrb	r4, [r0]
368c2ecf20Sopenharmony_ci		ldrb	r5, [r0]
378c2ecf20Sopenharmony_ci		mov	r3, r3,     put_byte_0
388c2ecf20Sopenharmony_ci		ldrb	r6, [r0]
398c2ecf20Sopenharmony_ci		orr	r3, r3, r4, put_byte_1
408c2ecf20Sopenharmony_ci		ldrb	r4, [r0]
418c2ecf20Sopenharmony_ci		orr	r3, r3, r5, put_byte_2
428c2ecf20Sopenharmony_ci		ldrb	r5, [r0]
438c2ecf20Sopenharmony_ci		orr	r3, r3, r6, put_byte_3
448c2ecf20Sopenharmony_ci		ldrb	r6, [r0]
458c2ecf20Sopenharmony_ci		mov	r4, r4,     put_byte_0
468c2ecf20Sopenharmony_ci		ldrb	ip, [r0]
478c2ecf20Sopenharmony_ci		orr	r4, r4, r5, put_byte_1
488c2ecf20Sopenharmony_ci		ldrb	r5, [r0]
498c2ecf20Sopenharmony_ci		orr	r4, r4, r6, put_byte_2
508c2ecf20Sopenharmony_ci		ldrb	r6, [r0]
518c2ecf20Sopenharmony_ci		orr	r4, r4, ip, put_byte_3
528c2ecf20Sopenharmony_ci		ldrb	ip, [r0]
538c2ecf20Sopenharmony_ci		mov	r5, r5,     put_byte_0
548c2ecf20Sopenharmony_ci		ldrb	lr, [r0]
558c2ecf20Sopenharmony_ci		orr	r5, r5, r6, put_byte_1
568c2ecf20Sopenharmony_ci		ldrb	r6, [r0]
578c2ecf20Sopenharmony_ci		orr	r5, r5, ip, put_byte_2
588c2ecf20Sopenharmony_ci		ldrb	ip, [r0]
598c2ecf20Sopenharmony_ci		orr	r5, r5, lr, put_byte_3
608c2ecf20Sopenharmony_ci		ldrb	lr, [r0]
618c2ecf20Sopenharmony_ci		mov	r6, r6,     put_byte_0
628c2ecf20Sopenharmony_ci		orr	r6, r6, ip, put_byte_1
638c2ecf20Sopenharmony_ci		ldrb	ip, [r0]
648c2ecf20Sopenharmony_ci		orr	r6, r6, lr, put_byte_2
658c2ecf20Sopenharmony_ci		orr	r6, r6, ip, put_byte_3
668c2ecf20Sopenharmony_ci		stmia	r1!, {r3 - r6}
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci		subs	r2, r2, #16
698c2ecf20Sopenharmony_ci		bpl	.Linsb_16_lp
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci		tst	r2, #15
728c2ecf20Sopenharmony_ci		ldmfdeq	sp!, {r4 - r6, pc}
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_ci.Linsb_no_16:	tst	r2, #8
758c2ecf20Sopenharmony_ci		beq	.Linsb_no_8
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci		ldrb	r3, [r0]
788c2ecf20Sopenharmony_ci		ldrb	r4, [r0]
798c2ecf20Sopenharmony_ci		ldrb	r5, [r0]
808c2ecf20Sopenharmony_ci		mov	r3, r3,     put_byte_0
818c2ecf20Sopenharmony_ci		ldrb	r6, [r0]
828c2ecf20Sopenharmony_ci		orr	r3, r3, r4, put_byte_1
838c2ecf20Sopenharmony_ci		ldrb	r4, [r0]
848c2ecf20Sopenharmony_ci		orr	r3, r3, r5, put_byte_2
858c2ecf20Sopenharmony_ci		ldrb	r5, [r0]
868c2ecf20Sopenharmony_ci		orr	r3, r3, r6, put_byte_3
878c2ecf20Sopenharmony_ci		ldrb	r6, [r0]
888c2ecf20Sopenharmony_ci		mov	r4, r4,     put_byte_0
898c2ecf20Sopenharmony_ci		ldrb	ip, [r0]
908c2ecf20Sopenharmony_ci		orr	r4, r4, r5, put_byte_1
918c2ecf20Sopenharmony_ci		orr	r4, r4, r6, put_byte_2
928c2ecf20Sopenharmony_ci		orr	r4, r4, ip, put_byte_3
938c2ecf20Sopenharmony_ci		stmia	r1!, {r3, r4}
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci.Linsb_no_8:	tst	r2, #4
968c2ecf20Sopenharmony_ci		beq	.Linsb_no_4
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci		ldrb	r3, [r0]
998c2ecf20Sopenharmony_ci		ldrb	r4, [r0]
1008c2ecf20Sopenharmony_ci		ldrb	r5, [r0]
1018c2ecf20Sopenharmony_ci		ldrb	r6, [r0]
1028c2ecf20Sopenharmony_ci		mov	r3, r3,     put_byte_0
1038c2ecf20Sopenharmony_ci		orr	r3, r3, r4, put_byte_1
1048c2ecf20Sopenharmony_ci		orr	r3, r3, r5, put_byte_2
1058c2ecf20Sopenharmony_ci		orr	r3, r3, r6, put_byte_3
1068c2ecf20Sopenharmony_ci		str	r3, [r1], #4
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ci.Linsb_no_4:	ands	r2, r2, #3
1098c2ecf20Sopenharmony_ci		ldmfdeq	sp!, {r4 - r6, pc}
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_ci		cmp	r2, #2
1128c2ecf20Sopenharmony_ci		ldrb	r3, [r0]
1138c2ecf20Sopenharmony_ci		strb	r3, [r1], #1
1148c2ecf20Sopenharmony_ci		ldrbge	r3, [r0]
1158c2ecf20Sopenharmony_ci		strbge	r3, [r1], #1
1168c2ecf20Sopenharmony_ci		ldrbgt	r3, [r0]
1178c2ecf20Sopenharmony_ci		strbgt	r3, [r1]
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci		ldmfd	sp!, {r4 - r6, pc}
1208c2ecf20Sopenharmony_ciENDPROC(__raw_readsb)
121