0001
0002
0003
0004
0005
0006
0007 #include <linux/linkage.h>
0008 #include <asm/assembler.h>
0009
0010 .macro outword, rd
0011 #ifndef __ARMEB__
0012 strb \rd, [r0]
0013 mov \rd, \rd, lsr #8
0014 strb \rd, [r0]
0015 mov \rd, \rd, lsr #8
0016 strb \rd, [r0]
0017 mov \rd, \rd, lsr #8
0018 strb \rd, [r0]
0019 #else
0020 mov lr, \rd, lsr #24
0021 strb lr, [r0]
0022 mov lr, \rd, lsr #16
0023 strb lr, [r0]
0024 mov lr, \rd, lsr #8
0025 strb lr, [r0]
0026 strb \rd, [r0]
0027 #endif
0028 .endm
0029
0030 .Loutsb_align: rsb ip, ip, #4
0031 cmp ip, r2
0032 movgt ip, r2
0033 cmp ip, #2
0034 ldrb r3, [r1], #1
0035 strb r3, [r0]
0036 ldrbge r3, [r1], #1
0037 strbge r3, [r0]
0038 ldrbgt r3, [r1], #1
0039 strbgt r3, [r0]
0040 subs r2, r2, ip
0041 bne .Loutsb_aligned
0042
0043 ENTRY(__raw_writesb)
0044 teq r2, #0 @ do we have to check for the zero len?
0045 reteq lr
0046 ands ip, r1, #3
0047 bne .Loutsb_align
0048
0049 .Loutsb_aligned:
0050 stmfd sp!, {r4, r5, lr}
0051
0052 subs r2, r2, #16
0053 bmi .Loutsb_no_16
0054
0055 .Loutsb_16_lp: ldmia r1!, {r3, r4, r5, ip}
0056 outword r3
0057 outword r4
0058 outword r5
0059 outword ip
0060 subs r2, r2, #16
0061 bpl .Loutsb_16_lp
0062
0063 tst r2, #15
0064 ldmfdeq sp!, {r4, r5, pc}
0065
0066 .Loutsb_no_16: tst r2, #8
0067 beq .Loutsb_no_8
0068
0069 ldmia r1!, {r3, r4}
0070 outword r3
0071 outword r4
0072
0073 .Loutsb_no_8: tst r2, #4
0074 beq .Loutsb_no_4
0075
0076 ldr r3, [r1], #4
0077 outword r3
0078
0079 .Loutsb_no_4: ands r2, r2, #3
0080 ldmfdeq sp!, {r4, r5, pc}
0081
0082 cmp r2, #2
0083 ldrb r3, [r1], #1
0084 strb r3, [r0]
0085 ldrbge r3, [r1], #1
0086 strbge r3, [r0]
0087 ldrbgt r3, [r1]
0088 strbgt r3, [r0]
0089
0090 ldmfd sp!, {r4, r5, pc}
0091 ENDPROC(__raw_writesb)