xref: /openbmc/linux/arch/arm/lib/io-readsl.S (revision 93032e31)
1/*
2 *  linux/arch/arm/lib/io-readsl.S
3 *
4 *  Copyright (C) 1995-2000 Russell King
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10#include <linux/linkage.h>
11#include <asm/assembler.h>
12#include <asm/export.h>
13
14ENTRY(__raw_readsl)
15		teq	r2, #0		@ do we have to check for the zero len?
16		reteq	lr
17		ands	ip, r1, #3
18		bne	3f
19
20		subs	r2, r2, #4
21		bmi	2f
22		stmfd	sp!, {r4, lr}
231:		ldr	r3, [r0, #0]
24		ldr	r4, [r0, #0]
25		ldr	ip, [r0, #0]
26		ldr	lr, [r0, #0]
27		subs	r2, r2, #4
28		stmia	r1!, {r3, r4, ip, lr}
29		bpl	1b
30		ldmfd	sp!, {r4, lr}
312:		movs	r2, r2, lsl #31
32		ldrcs	r3, [r0, #0]
33		ldrcs	ip, [r0, #0]
34		stmcsia	r1!, {r3, ip}
35		ldrne	r3, [r0, #0]
36		strne	r3, [r1, #0]
37		ret	lr
38
393:		ldr	r3, [r0]
40		cmp	ip, #2
41		mov	ip, r3, get_byte_0
42		strb	ip, [r1], #1
43		bgt	6f
44		mov	ip, r3, get_byte_1
45		strb	ip, [r1], #1
46		beq	5f
47		mov	ip, r3, get_byte_2
48		strb	ip, [r1], #1
49
504:		subs	r2, r2, #1
51		mov	ip, r3, lspull #24
52		ldrne	r3, [r0]
53		orrne	ip, ip, r3, lspush #8
54		strne	ip, [r1], #4
55		bne	4b
56		b	8f
57
585:		subs	r2, r2, #1
59		mov	ip, r3, lspull #16
60		ldrne	r3, [r0]
61		orrne	ip, ip, r3, lspush #16
62		strne	ip, [r1], #4
63		bne	5b
64		b	7f
65
666:		subs	r2, r2, #1
67		mov	ip, r3, lspull #8
68		ldrne	r3, [r0]
69		orrne	ip, ip, r3, lspush #24
70		strne	ip, [r1], #4
71		bne	6b
72
73		mov	r3, ip, get_byte_2
74		strb	r3, [r1, #2]
757:		mov	r3, ip, get_byte_1
76		strb	r3, [r1, #1]
778:		mov	r3, ip, get_byte_0
78		strb	r3, [r1, #0]
79		ret	lr
80ENDPROC(__raw_readsl)
81EXPORT_SYMBOL(__raw_readsl)
82