Merge remote-tracking branch 'iommu/next'
[deliverable/linux.git] / arch / arm / lib / io-writesb.S
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 #include <asm/export.h>
13
14 .macro outword, rd
15 #ifndef __ARMEB__
16 strb \rd, [r0]
17 mov \rd, \rd, lsr #8
18 strb \rd, [r0]
19 mov \rd, \rd, lsr #8
20 strb \rd, [r0]
21 mov \rd, \rd, lsr #8
22 strb \rd, [r0]
23 #else
24 mov lr, \rd, lsr #24
25 strb lr, [r0]
26 mov lr, \rd, lsr #16
27 strb lr, [r0]
28 mov lr, \rd, lsr #8
29 strb lr, [r0]
30 strb \rd, [r0]
31 #endif
32 .endm
33
34 .Loutsb_align: rsb ip, ip, #4
35 cmp ip, r2
36 movgt ip, r2
37 cmp ip, #2
38 ldrb r3, [r1], #1
39 strb r3, [r0]
40 ldrgeb r3, [r1], #1
41 strgeb r3, [r0]
42 ldrgtb r3, [r1], #1
43 strgtb r3, [r0]
44 subs r2, r2, ip
45 bne .Loutsb_aligned
46
47 ENTRY(__raw_writesb)
48 teq r2, #0 @ do we have to check for the zero len?
49 reteq lr
50 ands ip, r1, #3
51 bne .Loutsb_align
52
53 .Loutsb_aligned:
54 stmfd sp!, {r4, r5, lr}
55
56 subs r2, r2, #16
57 bmi .Loutsb_no_16
58
59 .Loutsb_16_lp: ldmia r1!, {r3, r4, r5, ip}
60 outword r3
61 outword r4
62 outword r5
63 outword ip
64 subs r2, r2, #16
65 bpl .Loutsb_16_lp
66
67 tst r2, #15
68 ldmeqfd sp!, {r4, r5, pc}
69
70 .Loutsb_no_16: tst r2, #8
71 beq .Loutsb_no_8
72
73 ldmia r1!, {r3, r4}
74 outword r3
75 outword r4
76
77 .Loutsb_no_8: tst r2, #4
78 beq .Loutsb_no_4
79
80 ldr r3, [r1], #4
81 outword r3
82
83 .Loutsb_no_4: ands r2, r2, #3
84 ldmeqfd sp!, {r4, r5, pc}
85
86 cmp r2, #2
87 ldrb r3, [r1], #1
88 strb r3, [r0]
89 ldrgeb r3, [r1], #1
90 strgeb r3, [r0]
91 ldrgtb r3, [r1]
92 strgtb r3, [r0]
93
94 ldmfd sp!, {r4, r5, pc}
95 ENDPROC(__raw_writesb)
96 EXPORT_SYMBOL(__raw_writesb)
This page took 0.033866 seconds and 5 git commands to generate.