xref: /openbmc/linux/arch/arm/lib/io-writesb.S (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1/*
2 *  linux/arch/arm/lib/io-writesb.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
13		.macro	outword, rd
14#ifndef __ARMEB__
15		strb	\rd, [r0]
16		mov	\rd, \rd, lsr #8
17		strb	\rd, [r0]
18		mov	\rd, \rd, lsr #8
19		strb	\rd, [r0]
20		mov	\rd, \rd, lsr #8
21		strb	\rd, [r0]
22#else
23		mov	lr, \rd, lsr #24
24		strb	lr, [r0]
25		mov	lr, \rd, lsr #16
26		strb	lr, [r0]
27		mov	lr, \rd, lsr #8
28		strb	lr, [r0]
29		strb	\rd, [r0]
30#endif
31		.endm
32
33.outsb_align:	rsb	ip, ip, #4
34		cmp	ip, r2
35		movgt	ip, r2
36		cmp	ip, #2
37		ldrb	r3, [r1], #1
38		strb	r3, [r0]
39		ldrgeb	r3, [r1], #1
40		strgeb	r3, [r0]
41		ldrgtb	r3, [r1], #1
42		strgtb	r3, [r0]
43		subs	r2, r2, ip
44		bne	.outsb_aligned
45
46ENTRY(__raw_writesb)
47		teq	r2, #0		@ do we have to check for the zero len?
48		moveq	pc, lr
49		ands	ip, r1, #3
50		bne	.outsb_align
51
52.outsb_aligned:	stmfd	sp!, {r4, r5, lr}
53
54		subs	r2, r2, #16
55		bmi	.outsb_no_16
56
57.outsb_16_lp:	ldmia	r1!, {r3, r4, r5, ip}
58		outword	r3
59		outword	r4
60		outword	r5
61		outword	ip
62		subs	r2, r2, #16
63		bpl	.outsb_16_lp
64
65		tst	r2, #15
66		LOADREGS(eqfd, sp!, {r4, r5, pc})
67
68.outsb_no_16:	tst	r2, #8
69		beq	.outsb_no_8
70
71		ldmia	r1!, {r3, r4}
72		outword	r3
73		outword	r4
74
75.outsb_no_8:	tst	r2, #4
76		beq	.outsb_no_4
77
78		ldr	r3, [r1], #4
79		outword	r3
80
81.outsb_no_4:	ands	r2, r2, #3
82		LOADREGS(eqfd, sp!, {r4, r5, pc})
83
84		cmp	r2, #2
85		ldrb	r3, [r1], #1
86		strb	r3, [r0]
87		ldrgeb	r3, [r1], #1
88		strgeb	r3, [r0]
89		ldrgtb	r3, [r1]
90		strgtb	r3, [r0]
91
92		LOADREGS(fd, sp!, {r4, r5, pc})
93