xref: /OK3568_Linux_fs/kernel/arch/arm/lib/io-readsw-armv4.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun/*
3*4882a593Smuzhiyun *  linux/arch/arm/lib/io-readsw-armv4.S
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun *  Copyright (C) 1995-2000 Russell King
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun#include <linux/linkage.h>
8*4882a593Smuzhiyun#include <asm/assembler.h>
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun		.macro	pack, rd, hw1, hw2
11*4882a593Smuzhiyun#ifndef __ARMEB__
12*4882a593Smuzhiyun		orr	\rd, \hw1, \hw2, lsl #16
13*4882a593Smuzhiyun#else
14*4882a593Smuzhiyun		orr	\rd, \hw2, \hw1, lsl #16
15*4882a593Smuzhiyun#endif
16*4882a593Smuzhiyun		.endm
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun.Linsw_align:	movs	ip, r1, lsl #31
19*4882a593Smuzhiyun		bne	.Linsw_noalign
20*4882a593Smuzhiyun		ldrh	ip, [r0]
21*4882a593Smuzhiyun		sub	r2, r2, #1
22*4882a593Smuzhiyun		strh	ip, [r1], #2
23*4882a593Smuzhiyun
24*4882a593SmuzhiyunENTRY(__raw_readsw)
25*4882a593Smuzhiyun		teq	r2, #0
26*4882a593Smuzhiyun		reteq	lr
27*4882a593Smuzhiyun		tst	r1, #3
28*4882a593Smuzhiyun		bne	.Linsw_align
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun		stmfd	sp!, {r4, r5, lr}
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun		subs	r2, r2, #8
33*4882a593Smuzhiyun		bmi	.Lno_insw_8
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun.Linsw_8_lp:	ldrh	r3, [r0]
36*4882a593Smuzhiyun		ldrh	r4, [r0]
37*4882a593Smuzhiyun		pack	r3, r3, r4
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun		ldrh	r4, [r0]
40*4882a593Smuzhiyun		ldrh	r5, [r0]
41*4882a593Smuzhiyun		pack	r4, r4, r5
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun		ldrh	r5, [r0]
44*4882a593Smuzhiyun		ldrh	ip, [r0]
45*4882a593Smuzhiyun		pack	r5, r5, ip
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun		ldrh	ip, [r0]
48*4882a593Smuzhiyun		ldrh	lr, [r0]
49*4882a593Smuzhiyun		pack	ip, ip, lr
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun		subs	r2, r2, #8
52*4882a593Smuzhiyun		stmia	r1!, {r3 - r5, ip}
53*4882a593Smuzhiyun		bpl	.Linsw_8_lp
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun.Lno_insw_8:	tst	r2, #4
56*4882a593Smuzhiyun		beq	.Lno_insw_4
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun		ldrh	r3, [r0]
59*4882a593Smuzhiyun		ldrh	r4, [r0]
60*4882a593Smuzhiyun		pack	r3, r3, r4
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun		ldrh	r4, [r0]
63*4882a593Smuzhiyun		ldrh	ip, [r0]
64*4882a593Smuzhiyun		pack	r4, r4, ip
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun		stmia	r1!, {r3, r4}
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun.Lno_insw_4:	movs	r2, r2, lsl #31
69*4882a593Smuzhiyun		bcc	.Lno_insw_2
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun		ldrh	r3, [r0]
72*4882a593Smuzhiyun		ldrh	ip, [r0]
73*4882a593Smuzhiyun		pack	r3, r3, ip
74*4882a593Smuzhiyun		str	r3, [r1], #4
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun.Lno_insw_2:	ldrhne	r3, [r0]
77*4882a593Smuzhiyun		strhne	r3, [r1]
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun		ldmfd	sp!, {r4, r5, pc}
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun#ifdef __ARMEB__
82*4882a593Smuzhiyun#define _BE_ONLY_(code...)	code
83*4882a593Smuzhiyun#define _LE_ONLY_(code...)
84*4882a593Smuzhiyun#define push_hbyte0		lsr #8
85*4882a593Smuzhiyun#define pull_hbyte1		lsl #24
86*4882a593Smuzhiyun#else
87*4882a593Smuzhiyun#define _BE_ONLY_(code...)
88*4882a593Smuzhiyun#define _LE_ONLY_(code...) code
89*4882a593Smuzhiyun#define push_hbyte0		lsl #24
90*4882a593Smuzhiyun#define pull_hbyte1		lsr #8
91*4882a593Smuzhiyun#endif
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun.Linsw_noalign:	stmfd	sp!, {r4, lr}
94*4882a593Smuzhiyun		ldrbcc	ip, [r1, #-1]!
95*4882a593Smuzhiyun		bcc	1f
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun		ldrh	ip, [r0]
98*4882a593Smuzhiyun		sub	r2, r2, #1
99*4882a593Smuzhiyun   _BE_ONLY_(	mov	ip, ip, ror #8		)
100*4882a593Smuzhiyun		strb	ip, [r1], #1
101*4882a593Smuzhiyun   _LE_ONLY_(	mov	ip, ip, lsr #8		)
102*4882a593Smuzhiyun   _BE_ONLY_(	mov	ip, ip, lsr #24		)
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun1:		subs	r2, r2, #2
105*4882a593Smuzhiyun		bmi	3f
106*4882a593Smuzhiyun   _BE_ONLY_(	mov	ip, ip, lsl #24		)
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun2:		ldrh	r3, [r0]
109*4882a593Smuzhiyun		ldrh	r4, [r0]
110*4882a593Smuzhiyun		subs	r2, r2, #2
111*4882a593Smuzhiyun		orr	ip, ip, r3, lsl #8
112*4882a593Smuzhiyun		orr	ip, ip, r4, push_hbyte0
113*4882a593Smuzhiyun		str	ip, [r1], #4
114*4882a593Smuzhiyun		mov	ip, r4, pull_hbyte1
115*4882a593Smuzhiyun		bpl	2b
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun   _BE_ONLY_(	mov	ip, ip, lsr #24		)
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun3:		tst	r2, #1
120*4882a593Smuzhiyun		strb	ip, [r1], #1
121*4882a593Smuzhiyun		ldrhne	ip, [r0]
122*4882a593Smuzhiyun   _BE_ONLY_(	movne	ip, ip, ror #8		)
123*4882a593Smuzhiyun		strbne	ip, [r1], #1
124*4882a593Smuzhiyun   _LE_ONLY_(	movne	ip, ip, lsr #8		)
125*4882a593Smuzhiyun   _BE_ONLY_(	movne	ip, ip, lsr #24		)
126*4882a593Smuzhiyun		strbne	ip, [r1]
127*4882a593Smuzhiyun		ldmfd	sp!, {r4, pc}
128*4882a593SmuzhiyunENDPROC(__raw_readsw)
129