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 ldrbge r3, [r1], #1 40 strbge r3, [r0] 41 ldrbgt r3, [r1], #1 42 strbgt 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 ldmfdeq 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 ldmfdeq sp!, {r4, r5, pc} 84 85 cmp r2, #2 86 ldrb r3, [r1], #1 87 strb r3, [r0] 88 ldrbge r3, [r1], #1 89 strbge r3, [r0] 90 ldrbgt r3, [r1] 91 strbgt r3, [r0] 92 93 ldmfd sp!, {r4, r5, pc} 94ENDPROC(__raw_writesb) 95