18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *  linux/arch/arm/lib/io-readsw-armv4.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	pack, rd, hw1, hw2
118c2ecf20Sopenharmony_ci#ifndef __ARMEB__
128c2ecf20Sopenharmony_ci		orr	\rd, \hw1, \hw2, lsl #16
138c2ecf20Sopenharmony_ci#else
148c2ecf20Sopenharmony_ci		orr	\rd, \hw2, \hw1, lsl #16
158c2ecf20Sopenharmony_ci#endif
168c2ecf20Sopenharmony_ci		.endm
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci.Linsw_align:	movs	ip, r1, lsl #31
198c2ecf20Sopenharmony_ci		bne	.Linsw_noalign
208c2ecf20Sopenharmony_ci		ldrh	ip, [r0]
218c2ecf20Sopenharmony_ci		sub	r2, r2, #1
228c2ecf20Sopenharmony_ci		strh	ip, [r1], #2
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ciENTRY(__raw_readsw)
258c2ecf20Sopenharmony_ci		teq	r2, #0
268c2ecf20Sopenharmony_ci		reteq	lr
278c2ecf20Sopenharmony_ci		tst	r1, #3
288c2ecf20Sopenharmony_ci		bne	.Linsw_align
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci		stmfd	sp!, {r4, r5, lr}
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci		subs	r2, r2, #8
338c2ecf20Sopenharmony_ci		bmi	.Lno_insw_8
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci.Linsw_8_lp:	ldrh	r3, [r0]
368c2ecf20Sopenharmony_ci		ldrh	r4, [r0]
378c2ecf20Sopenharmony_ci		pack	r3, r3, r4
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci		ldrh	r4, [r0]
408c2ecf20Sopenharmony_ci		ldrh	r5, [r0]
418c2ecf20Sopenharmony_ci		pack	r4, r4, r5
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci		ldrh	r5, [r0]
448c2ecf20Sopenharmony_ci		ldrh	ip, [r0]
458c2ecf20Sopenharmony_ci		pack	r5, r5, ip
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci		ldrh	ip, [r0]
488c2ecf20Sopenharmony_ci		ldrh	lr, [r0]
498c2ecf20Sopenharmony_ci		pack	ip, ip, lr
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci		subs	r2, r2, #8
528c2ecf20Sopenharmony_ci		stmia	r1!, {r3 - r5, ip}
538c2ecf20Sopenharmony_ci		bpl	.Linsw_8_lp
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci.Lno_insw_8:	tst	r2, #4
568c2ecf20Sopenharmony_ci		beq	.Lno_insw_4
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci		ldrh	r3, [r0]
598c2ecf20Sopenharmony_ci		ldrh	r4, [r0]
608c2ecf20Sopenharmony_ci		pack	r3, r3, r4
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci		ldrh	r4, [r0]
638c2ecf20Sopenharmony_ci		ldrh	ip, [r0]
648c2ecf20Sopenharmony_ci		pack	r4, r4, ip
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci		stmia	r1!, {r3, r4}
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci.Lno_insw_4:	movs	r2, r2, lsl #31
698c2ecf20Sopenharmony_ci		bcc	.Lno_insw_2
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci		ldrh	r3, [r0]
728c2ecf20Sopenharmony_ci		ldrh	ip, [r0]
738c2ecf20Sopenharmony_ci		pack	r3, r3, ip
748c2ecf20Sopenharmony_ci		str	r3, [r1], #4
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci.Lno_insw_2:	ldrhne	r3, [r0]
778c2ecf20Sopenharmony_ci		strhne	r3, [r1]
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci		ldmfd	sp!, {r4, r5, pc}
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci#ifdef __ARMEB__
828c2ecf20Sopenharmony_ci#define _BE_ONLY_(code...)	code
838c2ecf20Sopenharmony_ci#define _LE_ONLY_(code...)
848c2ecf20Sopenharmony_ci#define push_hbyte0		lsr #8
858c2ecf20Sopenharmony_ci#define pull_hbyte1		lsl #24
868c2ecf20Sopenharmony_ci#else
878c2ecf20Sopenharmony_ci#define _BE_ONLY_(code...)
888c2ecf20Sopenharmony_ci#define _LE_ONLY_(code...) code
898c2ecf20Sopenharmony_ci#define push_hbyte0		lsl #24
908c2ecf20Sopenharmony_ci#define pull_hbyte1		lsr #8
918c2ecf20Sopenharmony_ci#endif
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci.Linsw_noalign:	stmfd	sp!, {r4, lr}
948c2ecf20Sopenharmony_ci		ldrbcc	ip, [r1, #-1]!
958c2ecf20Sopenharmony_ci		bcc	1f
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci		ldrh	ip, [r0]
988c2ecf20Sopenharmony_ci		sub	r2, r2, #1
998c2ecf20Sopenharmony_ci   _BE_ONLY_(	mov	ip, ip, ror #8		)
1008c2ecf20Sopenharmony_ci		strb	ip, [r1], #1
1018c2ecf20Sopenharmony_ci   _LE_ONLY_(	mov	ip, ip, lsr #8		)
1028c2ecf20Sopenharmony_ci   _BE_ONLY_(	mov	ip, ip, lsr #24		)
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci1:		subs	r2, r2, #2
1058c2ecf20Sopenharmony_ci		bmi	3f
1068c2ecf20Sopenharmony_ci   _BE_ONLY_(	mov	ip, ip, lsl #24		)
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ci2:		ldrh	r3, [r0]
1098c2ecf20Sopenharmony_ci		ldrh	r4, [r0]
1108c2ecf20Sopenharmony_ci		subs	r2, r2, #2
1118c2ecf20Sopenharmony_ci		orr	ip, ip, r3, lsl #8
1128c2ecf20Sopenharmony_ci		orr	ip, ip, r4, push_hbyte0
1138c2ecf20Sopenharmony_ci		str	ip, [r1], #4
1148c2ecf20Sopenharmony_ci		mov	ip, r4, pull_hbyte1
1158c2ecf20Sopenharmony_ci		bpl	2b
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci   _BE_ONLY_(	mov	ip, ip, lsr #24		)
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci3:		tst	r2, #1
1208c2ecf20Sopenharmony_ci		strb	ip, [r1], #1
1218c2ecf20Sopenharmony_ci		ldrhne	ip, [r0]
1228c2ecf20Sopenharmony_ci   _BE_ONLY_(	movne	ip, ip, ror #8		)
1238c2ecf20Sopenharmony_ci		strbne	ip, [r1], #1
1248c2ecf20Sopenharmony_ci   _LE_ONLY_(	movne	ip, ip, lsr #8		)
1258c2ecf20Sopenharmony_ci   _BE_ONLY_(	movne	ip, ip, lsr #24		)
1268c2ecf20Sopenharmony_ci		strbne	ip, [r1]
1278c2ecf20Sopenharmony_ci		ldmfd	sp!, {r4, pc}
1288c2ecf20Sopenharmony_ciENDPROC(__raw_readsw)
129