xref: /OK3568_Linux_fs/kernel/arch/arm/lib/io-readsl.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun/*
3*4882a593Smuzhiyun *  linux/arch/arm/lib/io-readsl.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*4882a593SmuzhiyunENTRY(__raw_readsl)
11*4882a593Smuzhiyun		teq	r2, #0		@ do we have to check for the zero len?
12*4882a593Smuzhiyun		reteq	lr
13*4882a593Smuzhiyun		ands	ip, r1, #3
14*4882a593Smuzhiyun		bne	3f
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun		subs	r2, r2, #4
17*4882a593Smuzhiyun		bmi	2f
18*4882a593Smuzhiyun		stmfd	sp!, {r4, lr}
19*4882a593Smuzhiyun1:		ldr	r3, [r0, #0]
20*4882a593Smuzhiyun		ldr	r4, [r0, #0]
21*4882a593Smuzhiyun		ldr	ip, [r0, #0]
22*4882a593Smuzhiyun		ldr	lr, [r0, #0]
23*4882a593Smuzhiyun		subs	r2, r2, #4
24*4882a593Smuzhiyun		stmia	r1!, {r3, r4, ip, lr}
25*4882a593Smuzhiyun		bpl	1b
26*4882a593Smuzhiyun		ldmfd	sp!, {r4, lr}
27*4882a593Smuzhiyun2:		movs	r2, r2, lsl #31
28*4882a593Smuzhiyun		ldrcs	r3, [r0, #0]
29*4882a593Smuzhiyun		ldrcs	ip, [r0, #0]
30*4882a593Smuzhiyun		stmiacs	r1!, {r3, ip}
31*4882a593Smuzhiyun		ldrne	r3, [r0, #0]
32*4882a593Smuzhiyun		strne	r3, [r1, #0]
33*4882a593Smuzhiyun		ret	lr
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun3:		ldr	r3, [r0]
36*4882a593Smuzhiyun		cmp	ip, #2
37*4882a593Smuzhiyun		mov	ip, r3, get_byte_0
38*4882a593Smuzhiyun		strb	ip, [r1], #1
39*4882a593Smuzhiyun		bgt	6f
40*4882a593Smuzhiyun		mov	ip, r3, get_byte_1
41*4882a593Smuzhiyun		strb	ip, [r1], #1
42*4882a593Smuzhiyun		beq	5f
43*4882a593Smuzhiyun		mov	ip, r3, get_byte_2
44*4882a593Smuzhiyun		strb	ip, [r1], #1
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun4:		subs	r2, r2, #1
47*4882a593Smuzhiyun		mov	ip, r3, lspull #24
48*4882a593Smuzhiyun		ldrne	r3, [r0]
49*4882a593Smuzhiyun		orrne	ip, ip, r3, lspush #8
50*4882a593Smuzhiyun		strne	ip, [r1], #4
51*4882a593Smuzhiyun		bne	4b
52*4882a593Smuzhiyun		b	8f
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun5:		subs	r2, r2, #1
55*4882a593Smuzhiyun		mov	ip, r3, lspull #16
56*4882a593Smuzhiyun		ldrne	r3, [r0]
57*4882a593Smuzhiyun		orrne	ip, ip, r3, lspush #16
58*4882a593Smuzhiyun		strne	ip, [r1], #4
59*4882a593Smuzhiyun		bne	5b
60*4882a593Smuzhiyun		b	7f
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun6:		subs	r2, r2, #1
63*4882a593Smuzhiyun		mov	ip, r3, lspull #8
64*4882a593Smuzhiyun		ldrne	r3, [r0]
65*4882a593Smuzhiyun		orrne	ip, ip, r3, lspush #24
66*4882a593Smuzhiyun		strne	ip, [r1], #4
67*4882a593Smuzhiyun		bne	6b
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun		mov	r3, ip, get_byte_2
70*4882a593Smuzhiyun		strb	r3, [r1, #2]
71*4882a593Smuzhiyun7:		mov	r3, ip, get_byte_1
72*4882a593Smuzhiyun		strb	r3, [r1, #1]
73*4882a593Smuzhiyun8:		mov	r3, ip, get_byte_0
74*4882a593Smuzhiyun		strb	r3, [r1, #0]
75*4882a593Smuzhiyun		ret	lr
76*4882a593SmuzhiyunENDPROC(__raw_readsl)
77