18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *  linux/arch/arm/lib/io-writesw-armv4.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		.macro	outword, rd
118c2ecf20Sopenharmony_ci#ifndef __ARMEB__
128c2ecf20Sopenharmony_ci		strh	\rd, [r0]
138c2ecf20Sopenharmony_ci		mov	\rd, \rd, lsr #16
148c2ecf20Sopenharmony_ci		strh	\rd, [r0]
158c2ecf20Sopenharmony_ci#else
168c2ecf20Sopenharmony_ci		mov	lr, \rd, lsr #16
178c2ecf20Sopenharmony_ci		strh	lr, [r0]
188c2ecf20Sopenharmony_ci		strh	\rd, [r0]
198c2ecf20Sopenharmony_ci#endif
208c2ecf20Sopenharmony_ci		.endm
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci.Loutsw_align:	movs	ip, r1, lsl #31
238c2ecf20Sopenharmony_ci		bne	.Loutsw_noalign
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci		ldrh	r3, [r1], #2
268c2ecf20Sopenharmony_ci		sub	r2, r2, #1
278c2ecf20Sopenharmony_ci		strh	r3, [r0]
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ciENTRY(__raw_writesw)
308c2ecf20Sopenharmony_ci		teq	r2, #0
318c2ecf20Sopenharmony_ci		reteq	lr
328c2ecf20Sopenharmony_ci		ands	r3, r1, #3
338c2ecf20Sopenharmony_ci		bne	.Loutsw_align
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci		stmfd	sp!, {r4, r5, lr}
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci		subs	r2, r2, #8
388c2ecf20Sopenharmony_ci		bmi	.Lno_outsw_8
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci.Loutsw_8_lp:	ldmia	r1!, {r3, r4, r5, ip}
418c2ecf20Sopenharmony_ci		subs	r2, r2, #8
428c2ecf20Sopenharmony_ci		outword	r3
438c2ecf20Sopenharmony_ci		outword	r4
448c2ecf20Sopenharmony_ci		outword	r5
458c2ecf20Sopenharmony_ci		outword	ip
468c2ecf20Sopenharmony_ci		bpl	.Loutsw_8_lp
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci.Lno_outsw_8:	tst	r2, #4
498c2ecf20Sopenharmony_ci		beq	.Lno_outsw_4
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci		ldmia	r1!, {r3, ip}
528c2ecf20Sopenharmony_ci		outword	r3
538c2ecf20Sopenharmony_ci		outword	ip
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci.Lno_outsw_4:	movs	r2, r2, lsl #31
568c2ecf20Sopenharmony_ci		bcc	.Lno_outsw_2
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci		ldr	r3, [r1], #4
598c2ecf20Sopenharmony_ci		outword	r3
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci.Lno_outsw_2:	ldrhne	r3, [r1]
628c2ecf20Sopenharmony_ci		strhne	r3, [r0]
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci		ldmfd	sp!, {r4, r5, pc}
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci#ifdef __ARMEB__
678c2ecf20Sopenharmony_ci#define pull_hbyte0	lsl #8
688c2ecf20Sopenharmony_ci#define push_hbyte1	lsr #24
698c2ecf20Sopenharmony_ci#else
708c2ecf20Sopenharmony_ci#define pull_hbyte0	lsr #24
718c2ecf20Sopenharmony_ci#define push_hbyte1	lsl #8
728c2ecf20Sopenharmony_ci#endif
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_ci.Loutsw_noalign:
758c2ecf20Sopenharmony_ci ARM(		ldr	r3, [r1, -r3]!	)
768c2ecf20Sopenharmony_ci THUMB(		rsb	r3, r3, #0	)
778c2ecf20Sopenharmony_ci THUMB(		ldr	r3, [r1, r3]	)
788c2ecf20Sopenharmony_ci THUMB(		sub	r1, r3		)
798c2ecf20Sopenharmony_ci		subcs	r2, r2, #1
808c2ecf20Sopenharmony_ci		bcs	2f
818c2ecf20Sopenharmony_ci		subs	r2, r2, #2
828c2ecf20Sopenharmony_ci		bmi	3f
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci1:		mov	ip, r3, lsr #8
858c2ecf20Sopenharmony_ci		strh	ip, [r0]
868c2ecf20Sopenharmony_ci2:		mov	ip, r3, pull_hbyte0
878c2ecf20Sopenharmony_ci		ldr	r3, [r1, #4]!
888c2ecf20Sopenharmony_ci		subs	r2, r2, #2
898c2ecf20Sopenharmony_ci		orr	ip, ip, r3, push_hbyte1
908c2ecf20Sopenharmony_ci		strh	ip, [r0]
918c2ecf20Sopenharmony_ci		bpl	1b
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci		tst	r2, #1
948c2ecf20Sopenharmony_ci3:		movne	ip, r3, lsr #8
958c2ecf20Sopenharmony_ci		strhne	ip, [r0]
968c2ecf20Sopenharmony_ci		ret	lr
978c2ecf20Sopenharmony_ciENDPROC(__raw_writesw)
98