xref: /openbmc/linux/arch/arm/lib/io-writesw-armv4.S (revision d2912cb1)
1d2912cb1SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */
21da177e4SLinus Torvalds/*
31da177e4SLinus Torvalds *  linux/arch/arm/lib/io-writesw-armv4.S
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds *  Copyright (C) 1995-2000 Russell King
61da177e4SLinus Torvalds */
71da177e4SLinus Torvalds#include <linux/linkage.h>
81da177e4SLinus Torvalds#include <asm/assembler.h>
91da177e4SLinus Torvalds
101da177e4SLinus Torvalds		.macro	outword, rd
111da177e4SLinus Torvalds#ifndef __ARMEB__
121da177e4SLinus Torvalds		strh	\rd, [r0]
131da177e4SLinus Torvalds		mov	\rd, \rd, lsr #16
141da177e4SLinus Torvalds		strh	\rd, [r0]
151da177e4SLinus Torvalds#else
161da177e4SLinus Torvalds		mov	lr, \rd, lsr #16
171da177e4SLinus Torvalds		strh	lr, [r0]
181da177e4SLinus Torvalds		strh	\rd, [r0]
191da177e4SLinus Torvalds#endif
201da177e4SLinus Torvalds		.endm
211da177e4SLinus Torvalds
22a9c4814dSNicolas Pitre.Loutsw_align:	movs	ip, r1, lsl #31
23a9c4814dSNicolas Pitre		bne	.Loutsw_noalign
241da177e4SLinus Torvalds
251da177e4SLinus Torvalds		ldrh	r3, [r1], #2
261da177e4SLinus Torvalds		sub	r2, r2, #1
271da177e4SLinus Torvalds		strh	r3, [r0]
281da177e4SLinus Torvalds
291da177e4SLinus TorvaldsENTRY(__raw_writesw)
301da177e4SLinus Torvalds		teq	r2, #0
316ebbf2ceSRussell King		reteq	lr
321da177e4SLinus Torvalds		ands	r3, r1, #3
33a9c4814dSNicolas Pitre		bne	.Loutsw_align
341da177e4SLinus Torvalds
351da177e4SLinus Torvalds		stmfd	sp!, {r4, r5, lr}
361da177e4SLinus Torvalds
371da177e4SLinus Torvalds		subs	r2, r2, #8
38a9c4814dSNicolas Pitre		bmi	.Lno_outsw_8
391da177e4SLinus Torvalds
40a9c4814dSNicolas Pitre.Loutsw_8_lp:	ldmia	r1!, {r3, r4, r5, ip}
411da177e4SLinus Torvalds		subs	r2, r2, #8
421da177e4SLinus Torvalds		outword	r3
431da177e4SLinus Torvalds		outword	r4
441da177e4SLinus Torvalds		outword	r5
451da177e4SLinus Torvalds		outword	ip
46a9c4814dSNicolas Pitre		bpl	.Loutsw_8_lp
471da177e4SLinus Torvalds
48a9c4814dSNicolas Pitre.Lno_outsw_8:	tst	r2, #4
49a9c4814dSNicolas Pitre		beq	.Lno_outsw_4
501da177e4SLinus Torvalds
511da177e4SLinus Torvalds		ldmia	r1!, {r3, ip}
521da177e4SLinus Torvalds		outword	r3
531da177e4SLinus Torvalds		outword	ip
541da177e4SLinus Torvalds
55a9c4814dSNicolas Pitre.Lno_outsw_4:	movs	r2, r2, lsl #31
56a9c4814dSNicolas Pitre		bcc	.Lno_outsw_2
571da177e4SLinus Torvalds
581da177e4SLinus Torvalds		ldr	r3, [r1], #4
591da177e4SLinus Torvalds		outword	r3
601da177e4SLinus Torvalds
61e44fc388SStefan Agner.Lno_outsw_2:	ldrhne	r3, [r1]
62e44fc388SStefan Agner		strhne	r3, [r0]
631da177e4SLinus Torvalds
641da177e4SLinus Torvalds		ldmfd	sp!, {r4, r5, pc}
651da177e4SLinus Torvalds
661da177e4SLinus Torvalds#ifdef __ARMEB__
671da177e4SLinus Torvalds#define pull_hbyte0	lsl #8
681da177e4SLinus Torvalds#define push_hbyte1	lsr #24
691da177e4SLinus Torvalds#else
701da177e4SLinus Torvalds#define pull_hbyte0	lsr #24
711da177e4SLinus Torvalds#define push_hbyte1	lsl #8
721da177e4SLinus Torvalds#endif
731da177e4SLinus Torvalds
74a9c4814dSNicolas Pitre.Loutsw_noalign:
758b592783SCatalin Marinas ARM(		ldr	r3, [r1, -r3]!	)
768b592783SCatalin Marinas THUMB(		rsb	r3, r3, #0	)
778b592783SCatalin Marinas THUMB(		ldr	r3, [r1, r3]	)
788b592783SCatalin Marinas THUMB(		sub	r1, r3		)
791da177e4SLinus Torvalds		subcs	r2, r2, #1
801da177e4SLinus Torvalds		bcs	2f
811da177e4SLinus Torvalds		subs	r2, r2, #2
821da177e4SLinus Torvalds		bmi	3f
831da177e4SLinus Torvalds
841da177e4SLinus Torvalds1:		mov	ip, r3, lsr #8
851da177e4SLinus Torvalds		strh	ip, [r0]
861da177e4SLinus Torvalds2:		mov	ip, r3, pull_hbyte0
871da177e4SLinus Torvalds		ldr	r3, [r1, #4]!
881da177e4SLinus Torvalds		subs	r2, r2, #2
891da177e4SLinus Torvalds		orr	ip, ip, r3, push_hbyte1
901da177e4SLinus Torvalds		strh	ip, [r0]
91aeabbbbeSNicolas Pitre		bpl	1b
921da177e4SLinus Torvalds
93aeabbbbeSNicolas Pitre		tst	r2, #1
94aeabbbbeSNicolas Pitre3:		movne	ip, r3, lsr #8
95e44fc388SStefan Agner		strhne	ip, [r0]
966ebbf2ceSRussell King		ret	lr
9793ed3970SCatalin MarinasENDPROC(__raw_writesw)
98