io-writesw-armv4.S 1.6 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
/*
 *  linux/arch/arm/lib/io-writesw-armv4.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__
		strh	\rd, [r0]
		mov	\rd, \rd, lsr #16
		strh	\rd, [r0]
#else
		mov	lr, \rd, lsr #16
		strh	lr, [r0]
		strh	\rd, [r0]
#endif
		.endm

25 26
.Loutsw_align:	movs	ip, r1, lsl #31
		bne	.Loutsw_noalign
L
Linus Torvalds 已提交
27 28 29 30 31 32 33 34 35

		ldrh	r3, [r1], #2
		sub	r2, r2, #1
		strh	r3, [r0]

ENTRY(__raw_writesw)
		teq	r2, #0
		moveq	pc, lr
		ands	r3, r1, #3
36
		bne	.Loutsw_align
L
Linus Torvalds 已提交
37 38 39 40

		stmfd	sp!, {r4, r5, lr}

		subs	r2, r2, #8
41
		bmi	.Lno_outsw_8
L
Linus Torvalds 已提交
42

43
.Loutsw_8_lp:	ldmia	r1!, {r3, r4, r5, ip}
L
Linus Torvalds 已提交
44 45 46 47 48
		subs	r2, r2, #8
		outword	r3
		outword	r4
		outword	r5
		outword	ip
49
		bpl	.Loutsw_8_lp
L
Linus Torvalds 已提交
50

51 52
.Lno_outsw_8:	tst	r2, #4
		beq	.Lno_outsw_4
L
Linus Torvalds 已提交
53 54 55 56 57

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

58 59
.Lno_outsw_4:	movs	r2, r2, lsl #31
		bcc	.Lno_outsw_2
L
Linus Torvalds 已提交
60 61 62 63

		ldr	r3, [r1], #4
		outword	r3

64
.Lno_outsw_2:	ldrneh	r3, [r1]
L
Linus Torvalds 已提交
65 66 67 68 69 70 71 72 73 74 75 76
		strneh	r3, [r0]

		ldmfd	sp!, {r4, r5, pc}

#ifdef __ARMEB__
#define pull_hbyte0	lsl #8
#define push_hbyte1	lsr #24
#else
#define pull_hbyte0	lsr #24
#define push_hbyte1	lsl #8
#endif

77 78
.Loutsw_noalign:
		ldr	r3, [r1, -r3]!
L
Linus Torvalds 已提交
79 80 81 82 83 84 85 86 87 88 89 90
		subcs	r2, r2, #1
		bcs	2f
		subs	r2, r2, #2
		bmi	3f

1:		mov	ip, r3, lsr #8
		strh	ip, [r0]
2:		mov	ip, r3, pull_hbyte0
		ldr	r3, [r1, #4]!
		subs	r2, r2, #2
		orr	ip, ip, r3, push_hbyte1
		strh	ip, [r0]
91
		bpl	1b
L
Linus Torvalds 已提交
92

93 94
		tst	r2, #1
3:		movne	ip, r3, lsr #8
L
Linus Torvalds 已提交
95 96
		strneh	ip, [r0]
		mov	pc, lr
97
ENDPROC(__raw_writesw)