18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *  linux/arch/arm/lib/io-readsw-armv3.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.Linsw_bad_alignment:
118c2ecf20Sopenharmony_ci		adr	r0, .Linsw_bad_align_msg
128c2ecf20Sopenharmony_ci		mov	r2, lr
138c2ecf20Sopenharmony_ci		b	panic
148c2ecf20Sopenharmony_ci.Linsw_bad_align_msg:
158c2ecf20Sopenharmony_ci		.asciz	"insw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
168c2ecf20Sopenharmony_ci		.align
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci.Linsw_align:	tst	r1, #1
198c2ecf20Sopenharmony_ci		bne	.Linsw_bad_alignment
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci		ldr	r3, [r0]
228c2ecf20Sopenharmony_ci		strb	r3, [r1], #1
238c2ecf20Sopenharmony_ci		mov	r3, r3, lsr #8
248c2ecf20Sopenharmony_ci		strb	r3, [r1], #1
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci		subs	r2, r2, #1
278c2ecf20Sopenharmony_ci		reteq	lr
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ciENTRY(__raw_readsw)
308c2ecf20Sopenharmony_ci		teq	r2, #0		@ do we have to check for the zero len?
318c2ecf20Sopenharmony_ci		reteq	lr
328c2ecf20Sopenharmony_ci		tst	r1, #3
338c2ecf20Sopenharmony_ci		bne	.Linsw_align
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci.Linsw_aligned:	mov	ip, #0xff
368c2ecf20Sopenharmony_ci		orr	ip, ip, ip, lsl #8
378c2ecf20Sopenharmony_ci		stmfd	sp!, {r4, r5, r6, lr}
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci		subs	r2, r2, #8
408c2ecf20Sopenharmony_ci		bmi	.Lno_insw_8
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci.Linsw_8_lp:	ldr	r3, [r0]
438c2ecf20Sopenharmony_ci		and	r3, r3, ip
448c2ecf20Sopenharmony_ci		ldr	r4, [r0]
458c2ecf20Sopenharmony_ci		orr	r3, r3, r4, lsl #16
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci		ldr	r4, [r0]
488c2ecf20Sopenharmony_ci		and	r4, r4, ip
498c2ecf20Sopenharmony_ci		ldr	r5, [r0]
508c2ecf20Sopenharmony_ci		orr	r4, r4, r5, lsl #16
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci		ldr	r5, [r0]
538c2ecf20Sopenharmony_ci		and	r5, r5, ip
548c2ecf20Sopenharmony_ci		ldr	r6, [r0]
558c2ecf20Sopenharmony_ci		orr	r5, r5, r6, lsl #16
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci		ldr	r6, [r0]
588c2ecf20Sopenharmony_ci		and	r6, r6, ip
598c2ecf20Sopenharmony_ci		ldr	lr, [r0]
608c2ecf20Sopenharmony_ci		orr	r6, r6, lr, lsl #16
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci		stmia	r1!, {r3 - r6}
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci		subs	r2, r2, #8
658c2ecf20Sopenharmony_ci		bpl	.Linsw_8_lp
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci		tst	r2, #7
688c2ecf20Sopenharmony_ci		ldmfdeq	sp!, {r4, r5, r6, pc}
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci.Lno_insw_8:	tst	r2, #4
718c2ecf20Sopenharmony_ci		beq	.Lno_insw_4
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci		ldr	r3, [r0]
748c2ecf20Sopenharmony_ci		and	r3, r3, ip
758c2ecf20Sopenharmony_ci		ldr	r4, [r0]
768c2ecf20Sopenharmony_ci		orr	r3, r3, r4, lsl #16
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci		ldr	r4, [r0]
798c2ecf20Sopenharmony_ci		and	r4, r4, ip
808c2ecf20Sopenharmony_ci		ldr	r5, [r0]
818c2ecf20Sopenharmony_ci		orr	r4, r4, r5, lsl #16
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci		stmia	r1!, {r3, r4}
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci.Lno_insw_4:	tst	r2, #2
868c2ecf20Sopenharmony_ci		beq	.Lno_insw_2
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci		ldr	r3, [r0]
898c2ecf20Sopenharmony_ci		and	r3, r3, ip
908c2ecf20Sopenharmony_ci		ldr	r4, [r0]
918c2ecf20Sopenharmony_ci		orr	r3, r3, r4, lsl #16
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci		str	r3, [r1], #4
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci.Lno_insw_2:	tst	r2, #1
968c2ecf20Sopenharmony_ci		ldrne	r3, [r0]
978c2ecf20Sopenharmony_ci		strbne	r3, [r1], #1
988c2ecf20Sopenharmony_ci		movne	r3, r3, lsr #8
998c2ecf20Sopenharmony_ci		strbne	r3, [r1]
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci		ldmfd	sp!, {r4, r5, r6, pc}
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ci
104