162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  linux/arch/arm/lib/io-readsw-armv4.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		.macro	pack, rd, hw1, hw2
1162306a36Sopenharmony_ci#ifndef __ARMEB__
1262306a36Sopenharmony_ci		orr	\rd, \hw1, \hw2, lsl #16
1362306a36Sopenharmony_ci#else
1462306a36Sopenharmony_ci		orr	\rd, \hw2, \hw1, lsl #16
1562306a36Sopenharmony_ci#endif
1662306a36Sopenharmony_ci		.endm
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci.Linsw_align:	movs	ip, r1, lsl #31
1962306a36Sopenharmony_ci		bne	.Linsw_noalign
2062306a36Sopenharmony_ci		ldrh	ip, [r0]
2162306a36Sopenharmony_ci		sub	r2, r2, #1
2262306a36Sopenharmony_ci		strh	ip, [r1], #2
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ciENTRY(__raw_readsw)
2562306a36Sopenharmony_ci		teq	r2, #0
2662306a36Sopenharmony_ci		reteq	lr
2762306a36Sopenharmony_ci		tst	r1, #3
2862306a36Sopenharmony_ci		bne	.Linsw_align
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci		stmfd	sp!, {r4, r5, lr}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci		subs	r2, r2, #8
3362306a36Sopenharmony_ci		bmi	.Lno_insw_8
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci.Linsw_8_lp:	ldrh	r3, [r0]
3662306a36Sopenharmony_ci		ldrh	r4, [r0]
3762306a36Sopenharmony_ci		pack	r3, r3, r4
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci		ldrh	r4, [r0]
4062306a36Sopenharmony_ci		ldrh	r5, [r0]
4162306a36Sopenharmony_ci		pack	r4, r4, r5
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci		ldrh	r5, [r0]
4462306a36Sopenharmony_ci		ldrh	ip, [r0]
4562306a36Sopenharmony_ci		pack	r5, r5, ip
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci		ldrh	ip, [r0]
4862306a36Sopenharmony_ci		ldrh	lr, [r0]
4962306a36Sopenharmony_ci		pack	ip, ip, lr
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci		subs	r2, r2, #8
5262306a36Sopenharmony_ci		stmia	r1!, {r3 - r5, ip}
5362306a36Sopenharmony_ci		bpl	.Linsw_8_lp
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci.Lno_insw_8:	tst	r2, #4
5662306a36Sopenharmony_ci		beq	.Lno_insw_4
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci		ldrh	r3, [r0]
5962306a36Sopenharmony_ci		ldrh	r4, [r0]
6062306a36Sopenharmony_ci		pack	r3, r3, r4
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci		ldrh	r4, [r0]
6362306a36Sopenharmony_ci		ldrh	ip, [r0]
6462306a36Sopenharmony_ci		pack	r4, r4, ip
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci		stmia	r1!, {r3, r4}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci.Lno_insw_4:	movs	r2, r2, lsl #31
6962306a36Sopenharmony_ci		bcc	.Lno_insw_2
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci		ldrh	r3, [r0]
7262306a36Sopenharmony_ci		ldrh	ip, [r0]
7362306a36Sopenharmony_ci		pack	r3, r3, ip
7462306a36Sopenharmony_ci		str	r3, [r1], #4
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci.Lno_insw_2:	ldrhne	r3, [r0]
7762306a36Sopenharmony_ci		strhne	r3, [r1]
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci		ldmfd	sp!, {r4, r5, pc}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci#ifdef __ARMEB__
8262306a36Sopenharmony_ci#define _BE_ONLY_(code...)	code
8362306a36Sopenharmony_ci#define _LE_ONLY_(code...)
8462306a36Sopenharmony_ci#define push_hbyte0		lsr #8
8562306a36Sopenharmony_ci#define pull_hbyte1		lsl #24
8662306a36Sopenharmony_ci#else
8762306a36Sopenharmony_ci#define _BE_ONLY_(code...)
8862306a36Sopenharmony_ci#define _LE_ONLY_(code...) code
8962306a36Sopenharmony_ci#define push_hbyte0		lsl #24
9062306a36Sopenharmony_ci#define pull_hbyte1		lsr #8
9162306a36Sopenharmony_ci#endif
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci.Linsw_noalign:	stmfd	sp!, {r4, lr}
9462306a36Sopenharmony_ci		ldrbcc	ip, [r1, #-1]!
9562306a36Sopenharmony_ci		bcc	1f
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci		ldrh	ip, [r0]
9862306a36Sopenharmony_ci		sub	r2, r2, #1
9962306a36Sopenharmony_ci   _BE_ONLY_(	mov	ip, ip, ror #8		)
10062306a36Sopenharmony_ci		strb	ip, [r1], #1
10162306a36Sopenharmony_ci   _LE_ONLY_(	mov	ip, ip, lsr #8		)
10262306a36Sopenharmony_ci   _BE_ONLY_(	mov	ip, ip, lsr #24		)
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci1:		subs	r2, r2, #2
10562306a36Sopenharmony_ci		bmi	3f
10662306a36Sopenharmony_ci   _BE_ONLY_(	mov	ip, ip, lsl #24		)
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci2:		ldrh	r3, [r0]
10962306a36Sopenharmony_ci		ldrh	r4, [r0]
11062306a36Sopenharmony_ci		subs	r2, r2, #2
11162306a36Sopenharmony_ci		orr	ip, ip, r3, lsl #8
11262306a36Sopenharmony_ci		orr	ip, ip, r4, push_hbyte0
11362306a36Sopenharmony_ci		str	ip, [r1], #4
11462306a36Sopenharmony_ci		mov	ip, r4, pull_hbyte1
11562306a36Sopenharmony_ci		bpl	2b
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci   _BE_ONLY_(	mov	ip, ip, lsr #24		)
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci3:		tst	r2, #1
12062306a36Sopenharmony_ci		strb	ip, [r1], #1
12162306a36Sopenharmony_ci		ldrhne	ip, [r0]
12262306a36Sopenharmony_ci   _BE_ONLY_(	movne	ip, ip, ror #8		)
12362306a36Sopenharmony_ci		strbne	ip, [r1], #1
12462306a36Sopenharmony_ci   _LE_ONLY_(	movne	ip, ip, lsr #8		)
12562306a36Sopenharmony_ci   _BE_ONLY_(	movne	ip, ip, lsr #24		)
12662306a36Sopenharmony_ci		strbne	ip, [r1]
12762306a36Sopenharmony_ci		ldmfd	sp!, {r4, pc}
12862306a36Sopenharmony_ciENDPROC(__raw_readsw)
129