18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *  linux/arch/arm/lib/io-writesb.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		strb	\rd, [r0]
138c2ecf20Sopenharmony_ci		mov	\rd, \rd, lsr #8
148c2ecf20Sopenharmony_ci		strb	\rd, [r0]
158c2ecf20Sopenharmony_ci		mov	\rd, \rd, lsr #8
168c2ecf20Sopenharmony_ci		strb	\rd, [r0]
178c2ecf20Sopenharmony_ci		mov	\rd, \rd, lsr #8
188c2ecf20Sopenharmony_ci		strb	\rd, [r0]
198c2ecf20Sopenharmony_ci#else
208c2ecf20Sopenharmony_ci		mov	lr, \rd, lsr #24
218c2ecf20Sopenharmony_ci		strb	lr, [r0]
228c2ecf20Sopenharmony_ci		mov	lr, \rd, lsr #16
238c2ecf20Sopenharmony_ci		strb	lr, [r0]
248c2ecf20Sopenharmony_ci		mov	lr, \rd, lsr #8
258c2ecf20Sopenharmony_ci		strb	lr, [r0]
268c2ecf20Sopenharmony_ci		strb	\rd, [r0]
278c2ecf20Sopenharmony_ci#endif
288c2ecf20Sopenharmony_ci		.endm
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci.Loutsb_align:	rsb	ip, ip, #4
318c2ecf20Sopenharmony_ci		cmp	ip, r2
328c2ecf20Sopenharmony_ci		movgt	ip, r2
338c2ecf20Sopenharmony_ci		cmp	ip, #2
348c2ecf20Sopenharmony_ci		ldrb	r3, [r1], #1
358c2ecf20Sopenharmony_ci		strb	r3, [r0]
368c2ecf20Sopenharmony_ci		ldrbge	r3, [r1], #1
378c2ecf20Sopenharmony_ci		strbge	r3, [r0]
388c2ecf20Sopenharmony_ci		ldrbgt	r3, [r1], #1
398c2ecf20Sopenharmony_ci		strbgt	r3, [r0]
408c2ecf20Sopenharmony_ci		subs	r2, r2, ip
418c2ecf20Sopenharmony_ci		bne	.Loutsb_aligned
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ciENTRY(__raw_writesb)
448c2ecf20Sopenharmony_ci		teq	r2, #0		@ do we have to check for the zero len?
458c2ecf20Sopenharmony_ci		reteq	lr
468c2ecf20Sopenharmony_ci		ands	ip, r1, #3
478c2ecf20Sopenharmony_ci		bne	.Loutsb_align
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci.Loutsb_aligned:
508c2ecf20Sopenharmony_ci		stmfd	sp!, {r4, r5, lr}
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci		subs	r2, r2, #16
538c2ecf20Sopenharmony_ci		bmi	.Loutsb_no_16
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci.Loutsb_16_lp:	ldmia	r1!, {r3, r4, r5, ip}
568c2ecf20Sopenharmony_ci		outword	r3
578c2ecf20Sopenharmony_ci		outword	r4
588c2ecf20Sopenharmony_ci		outword	r5
598c2ecf20Sopenharmony_ci		outword	ip
608c2ecf20Sopenharmony_ci		subs	r2, r2, #16
618c2ecf20Sopenharmony_ci		bpl	.Loutsb_16_lp
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci		tst	r2, #15
648c2ecf20Sopenharmony_ci		ldmfdeq	sp!, {r4, r5, pc}
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci.Loutsb_no_16:	tst	r2, #8
678c2ecf20Sopenharmony_ci		beq	.Loutsb_no_8
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci		ldmia	r1!, {r3, r4}
708c2ecf20Sopenharmony_ci		outword	r3
718c2ecf20Sopenharmony_ci		outword	r4
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci.Loutsb_no_8:	tst	r2, #4
748c2ecf20Sopenharmony_ci		beq	.Loutsb_no_4
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci		ldr	r3, [r1], #4
778c2ecf20Sopenharmony_ci		outword	r3
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci.Loutsb_no_4:	ands	r2, r2, #3
808c2ecf20Sopenharmony_ci		ldmfdeq	sp!, {r4, r5, pc}
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci		cmp	r2, #2
838c2ecf20Sopenharmony_ci		ldrb	r3, [r1], #1
848c2ecf20Sopenharmony_ci		strb	r3, [r0]
858c2ecf20Sopenharmony_ci		ldrbge	r3, [r1], #1
868c2ecf20Sopenharmony_ci		strbge	r3, [r0]
878c2ecf20Sopenharmony_ci		ldrbgt	r3, [r1]
888c2ecf20Sopenharmony_ci		strbgt	r3, [r0]
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci		ldmfd	sp!, {r4, r5, pc}
918c2ecf20Sopenharmony_ciENDPROC(__raw_writesb)
92