xref: /openbmc/linux/arch/arm/lib/io-writesb.S (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*d2912cb1SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */
21da177e4SLinus Torvalds/*
31da177e4SLinus Torvalds *  linux/arch/arm/lib/io-writesb.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		strb	\rd, [r0]
131da177e4SLinus Torvalds		mov	\rd, \rd, lsr #8
141da177e4SLinus Torvalds		strb	\rd, [r0]
151da177e4SLinus Torvalds		mov	\rd, \rd, lsr #8
161da177e4SLinus Torvalds		strb	\rd, [r0]
171da177e4SLinus Torvalds		mov	\rd, \rd, lsr #8
181da177e4SLinus Torvalds		strb	\rd, [r0]
191da177e4SLinus Torvalds#else
201da177e4SLinus Torvalds		mov	lr, \rd, lsr #24
211da177e4SLinus Torvalds		strb	lr, [r0]
221da177e4SLinus Torvalds		mov	lr, \rd, lsr #16
231da177e4SLinus Torvalds		strb	lr, [r0]
241da177e4SLinus Torvalds		mov	lr, \rd, lsr #8
251da177e4SLinus Torvalds		strb	lr, [r0]
261da177e4SLinus Torvalds		strb	\rd, [r0]
271da177e4SLinus Torvalds#endif
281da177e4SLinus Torvalds		.endm
291da177e4SLinus Torvalds
30a9c4814dSNicolas Pitre.Loutsb_align:	rsb	ip, ip, #4
311da177e4SLinus Torvalds		cmp	ip, r2
321da177e4SLinus Torvalds		movgt	ip, r2
331da177e4SLinus Torvalds		cmp	ip, #2
341da177e4SLinus Torvalds		ldrb	r3, [r1], #1
351da177e4SLinus Torvalds		strb	r3, [r0]
36e44fc388SStefan Agner		ldrbge	r3, [r1], #1
37e44fc388SStefan Agner		strbge	r3, [r0]
38e44fc388SStefan Agner		ldrbgt	r3, [r1], #1
39e44fc388SStefan Agner		strbgt	r3, [r0]
401da177e4SLinus Torvalds		subs	r2, r2, ip
41a9c4814dSNicolas Pitre		bne	.Loutsb_aligned
421da177e4SLinus Torvalds
431da177e4SLinus TorvaldsENTRY(__raw_writesb)
441da177e4SLinus Torvalds		teq	r2, #0		@ do we have to check for the zero len?
456ebbf2ceSRussell King		reteq	lr
461da177e4SLinus Torvalds		ands	ip, r1, #3
47a9c4814dSNicolas Pitre		bne	.Loutsb_align
481da177e4SLinus Torvalds
49a9c4814dSNicolas Pitre.Loutsb_aligned:
50a9c4814dSNicolas Pitre		stmfd	sp!, {r4, r5, lr}
511da177e4SLinus Torvalds
521da177e4SLinus Torvalds		subs	r2, r2, #16
53a9c4814dSNicolas Pitre		bmi	.Loutsb_no_16
541da177e4SLinus Torvalds
55a9c4814dSNicolas Pitre.Loutsb_16_lp:	ldmia	r1!, {r3, r4, r5, ip}
561da177e4SLinus Torvalds		outword	r3
571da177e4SLinus Torvalds		outword	r4
581da177e4SLinus Torvalds		outword	r5
591da177e4SLinus Torvalds		outword	ip
601da177e4SLinus Torvalds		subs	r2, r2, #16
61a9c4814dSNicolas Pitre		bpl	.Loutsb_16_lp
621da177e4SLinus Torvalds
631da177e4SLinus Torvalds		tst	r2, #15
64e44fc388SStefan Agner		ldmfdeq	sp!, {r4, r5, pc}
651da177e4SLinus Torvalds
66a9c4814dSNicolas Pitre.Loutsb_no_16:	tst	r2, #8
67a9c4814dSNicolas Pitre		beq	.Loutsb_no_8
681da177e4SLinus Torvalds
691da177e4SLinus Torvalds		ldmia	r1!, {r3, r4}
701da177e4SLinus Torvalds		outword	r3
711da177e4SLinus Torvalds		outword	r4
721da177e4SLinus Torvalds
73a9c4814dSNicolas Pitre.Loutsb_no_8:	tst	r2, #4
74a9c4814dSNicolas Pitre		beq	.Loutsb_no_4
751da177e4SLinus Torvalds
761da177e4SLinus Torvalds		ldr	r3, [r1], #4
771da177e4SLinus Torvalds		outword	r3
781da177e4SLinus Torvalds
79a9c4814dSNicolas Pitre.Loutsb_no_4:	ands	r2, r2, #3
80e44fc388SStefan Agner		ldmfdeq	sp!, {r4, r5, pc}
811da177e4SLinus Torvalds
821da177e4SLinus Torvalds		cmp	r2, #2
831da177e4SLinus Torvalds		ldrb	r3, [r1], #1
841da177e4SLinus Torvalds		strb	r3, [r0]
85e44fc388SStefan Agner		ldrbge	r3, [r1], #1
86e44fc388SStefan Agner		strbge	r3, [r0]
87e44fc388SStefan Agner		ldrbgt	r3, [r1]
88e44fc388SStefan Agner		strbgt	r3, [r0]
891da177e4SLinus Torvalds
901b93a717SRussell King		ldmfd	sp!, {r4, r5, pc}
9193ed3970SCatalin MarinasENDPROC(__raw_writesb)
92