io-writesb.S 1.7 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/*
 *  linux/arch/arm/lib/io-writesb.S
 *
 *  Copyright (C) 1995-2000 Russell King
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#include <linux/linkage.h>
#include <asm/assembler.h>

		.macro	outword, rd
#ifndef __ARMEB__
		strb	\rd, [r0]
		mov	\rd, \rd, lsr #8
		strb	\rd, [r0]
		mov	\rd, \rd, lsr #8
		strb	\rd, [r0]
		mov	\rd, \rd, lsr #8
		strb	\rd, [r0]
#else
		mov	lr, \rd, lsr #24
		strb	lr, [r0]
		mov	lr, \rd, lsr #16
		strb	lr, [r0]
		mov	lr, \rd, lsr #8
		strb	lr, [r0]
		strb	\rd, [r0]
#endif
		.endm

33
.Loutsb_align:	rsb	ip, ip, #4
L
Linus Torvalds 已提交
34 35 36 37 38 39 40 41 42 43
		cmp	ip, r2
		movgt	ip, r2
		cmp	ip, #2
		ldrb	r3, [r1], #1
		strb	r3, [r0]
		ldrgeb	r3, [r1], #1
		strgeb	r3, [r0]
		ldrgtb	r3, [r1], #1
		strgtb	r3, [r0]
		subs	r2, r2, ip
44
		bne	.Loutsb_aligned
L
Linus Torvalds 已提交
45 46 47 48 49

ENTRY(__raw_writesb)
		teq	r2, #0		@ do we have to check for the zero len?
		moveq	pc, lr
		ands	ip, r1, #3
50
		bne	.Loutsb_align
L
Linus Torvalds 已提交
51

52 53
.Loutsb_aligned:
		stmfd	sp!, {r4, r5, lr}
L
Linus Torvalds 已提交
54 55

		subs	r2, r2, #16
56
		bmi	.Loutsb_no_16
L
Linus Torvalds 已提交
57

58
.Loutsb_16_lp:	ldmia	r1!, {r3, r4, r5, ip}
L
Linus Torvalds 已提交
59 60 61 62 63
		outword	r3
		outword	r4
		outword	r5
		outword	ip
		subs	r2, r2, #16
64
		bpl	.Loutsb_16_lp
L
Linus Torvalds 已提交
65 66 67 68

		tst	r2, #15
		LOADREGS(eqfd, sp!, {r4, r5, pc})

69 70
.Loutsb_no_16:	tst	r2, #8
		beq	.Loutsb_no_8
L
Linus Torvalds 已提交
71 72 73 74 75

		ldmia	r1!, {r3, r4}
		outword	r3
		outword	r4

76 77
.Loutsb_no_8:	tst	r2, #4
		beq	.Loutsb_no_4
L
Linus Torvalds 已提交
78 79 80 81

		ldr	r3, [r1], #4
		outword	r3

82
.Loutsb_no_4:	ands	r2, r2, #3
L
Linus Torvalds 已提交
83 84 85 86 87 88 89 90 91 92 93
		LOADREGS(eqfd, sp!, {r4, r5, pc})

		cmp	r2, #2
		ldrb	r3, [r1], #1
		strb	r3, [r0]
		ldrgeb	r3, [r1], #1
		strgeb	r3, [r0]
		ldrgtb	r3, [r1]
		strgtb	r3, [r0]

		LOADREGS(fd, sp!, {r4, r5, pc})