xref: /linux/arch/arm/lib/io-writesb.S (revision b6ebbac51bedf9e98e837688bc838f400196da5e)
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.Loutsb_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	.Loutsb_aligned
45
46ENTRY(__raw_writesb)
47		teq	r2, #0		@ do we have to check for the zero len?
48		reteq	lr
49		ands	ip, r1, #3
50		bne	.Loutsb_align
51
52.Loutsb_aligned:
53		stmfd	sp!, {r4, r5, lr}
54
55		subs	r2, r2, #16
56		bmi	.Loutsb_no_16
57
58.Loutsb_16_lp:	ldmia	r1!, {r3, r4, r5, ip}
59		outword	r3
60		outword	r4
61		outword	r5
62		outword	ip
63		subs	r2, r2, #16
64		bpl	.Loutsb_16_lp
65
66		tst	r2, #15
67		ldmeqfd	sp!, {r4, r5, pc}
68
69.Loutsb_no_16:	tst	r2, #8
70		beq	.Loutsb_no_8
71
72		ldmia	r1!, {r3, r4}
73		outword	r3
74		outword	r4
75
76.Loutsb_no_8:	tst	r2, #4
77		beq	.Loutsb_no_4
78
79		ldr	r3, [r1], #4
80		outword	r3
81
82.Loutsb_no_4:	ands	r2, r2, #3
83		ldmeqfd	sp!, {r4, r5, pc}
84
85		cmp	r2, #2
86		ldrb	r3, [r1], #1
87		strb	r3, [r0]
88		ldrgeb	r3, [r1], #1
89		strgeb	r3, [r0]
90		ldrgtb	r3, [r1]
91		strgtb	r3, [r0]
92
93		ldmfd	sp!, {r4, r5, pc}
94ENDPROC(__raw_writesb)
95