162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  linux/arch/arm/lib/io-writesw-armv3.S
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 1995-2000 Russell King
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci#include <linux/linkage.h>
862306a36Sopenharmony_ci#include <asm/assembler.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci.Loutsw_bad_alignment:
1162306a36Sopenharmony_ci		adr	r0, .Loutsw_bad_align_msg
1262306a36Sopenharmony_ci		mov	r2, lr
1362306a36Sopenharmony_ci		b	panic
1462306a36Sopenharmony_ci.Loutsw_bad_align_msg:
1562306a36Sopenharmony_ci		.asciz	"outsw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
1662306a36Sopenharmony_ci		.align
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci.Loutsw_align:	tst	r1, #1
1962306a36Sopenharmony_ci		bne	.Loutsw_bad_alignment
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci		add	r1, r1, #2
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci		ldr	r3, [r1, #-4]
2462306a36Sopenharmony_ci		mov	r3, r3, lsr #16
2562306a36Sopenharmony_ci		orr	r3, r3, r3, lsl #16
2662306a36Sopenharmony_ci		str	r3, [r0]
2762306a36Sopenharmony_ci		subs	r2, r2, #1
2862306a36Sopenharmony_ci		reteq	lr
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ciENTRY(__raw_writesw)
3162306a36Sopenharmony_ci		teq	r2, #0		@ do we have to check for the zero len?
3262306a36Sopenharmony_ci		reteq	lr
3362306a36Sopenharmony_ci		tst	r1, #3
3462306a36Sopenharmony_ci		bne	.Loutsw_align
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci		stmfd	sp!, {r4, r5, r6, lr}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci		subs	r2, r2, #8
3962306a36Sopenharmony_ci		bmi	.Lno_outsw_8
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci.Loutsw_8_lp:	ldmia	r1!, {r3, r4, r5, r6}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci		mov	ip, r3, lsl #16
4462306a36Sopenharmony_ci		orr	ip, ip, ip, lsr #16
4562306a36Sopenharmony_ci		str	ip, [r0]
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci		mov	ip, r3, lsr #16
4862306a36Sopenharmony_ci		orr	ip, ip, ip, lsl #16
4962306a36Sopenharmony_ci		str	ip, [r0]
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci		mov	ip, r4, lsl #16
5262306a36Sopenharmony_ci		orr	ip, ip, ip, lsr #16
5362306a36Sopenharmony_ci		str	ip, [r0]
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci		mov	ip, r4, lsr #16
5662306a36Sopenharmony_ci		orr	ip, ip, ip, lsl #16
5762306a36Sopenharmony_ci		str	ip, [r0]
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci		mov	ip, r5, lsl #16
6062306a36Sopenharmony_ci		orr	ip, ip, ip, lsr #16
6162306a36Sopenharmony_ci		str	ip, [r0]
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci		mov	ip, r5, lsr #16
6462306a36Sopenharmony_ci		orr	ip, ip, ip, lsl #16
6562306a36Sopenharmony_ci		str	ip, [r0]
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci		mov	ip, r6, lsl #16
6862306a36Sopenharmony_ci		orr	ip, ip, ip, lsr #16
6962306a36Sopenharmony_ci		str	ip, [r0]
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci		mov	ip, r6, lsr #16
7262306a36Sopenharmony_ci		orr	ip, ip, ip, lsl #16
7362306a36Sopenharmony_ci		str	ip, [r0]
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci		subs	r2, r2, #8
7662306a36Sopenharmony_ci		bpl	.Loutsw_8_lp
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci		tst	r2, #7
7962306a36Sopenharmony_ci		ldmfdeq	sp!, {r4, r5, r6, pc}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci.Lno_outsw_8:	tst	r2, #4
8262306a36Sopenharmony_ci		beq	.Lno_outsw_4
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci		ldmia	r1!, {r3, r4}
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci		mov	ip, r3, lsl #16
8762306a36Sopenharmony_ci		orr	ip, ip, ip, lsr #16
8862306a36Sopenharmony_ci		str	ip, [r0]
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci		mov	ip, r3, lsr #16
9162306a36Sopenharmony_ci		orr	ip, ip, ip, lsl #16
9262306a36Sopenharmony_ci		str	ip, [r0]
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci		mov	ip, r4, lsl #16
9562306a36Sopenharmony_ci		orr	ip, ip, ip, lsr #16
9662306a36Sopenharmony_ci		str	ip, [r0]
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci		mov	ip, r4, lsr #16
9962306a36Sopenharmony_ci		orr	ip, ip, ip, lsl #16
10062306a36Sopenharmony_ci		str	ip, [r0]
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci.Lno_outsw_4:	tst	r2, #2
10362306a36Sopenharmony_ci		beq	.Lno_outsw_2
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci		ldr	r3, [r1], #4
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci		mov	ip, r3, lsl #16
10862306a36Sopenharmony_ci		orr	ip, ip, ip, lsr #16
10962306a36Sopenharmony_ci		str	ip, [r0]
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci		mov	ip, r3, lsr #16
11262306a36Sopenharmony_ci		orr	ip, ip, ip, lsl #16
11362306a36Sopenharmony_ci		str	ip, [r0]
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci.Lno_outsw_2:	tst	r2, #1
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci		ldrne	r3, [r1]
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci		movne	ip, r3, lsl #16
12062306a36Sopenharmony_ci		orrne	ip, ip, ip, lsr #16
12162306a36Sopenharmony_ci		strne	ip, [r0]
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci		ldmfd	sp!, {r4, r5, r6, pc}
124