0001
0002
0003
0004
0005
0006
0007 #include <linux/linkage.h>
0008 #include <asm/assembler.h>
0009
0010 .Linsb_align: rsb ip, ip, #4
0011 cmp ip, r2
0012 movgt ip, r2
0013 cmp ip, #2
0014 ldrb r3, [r0]
0015 strb r3, [r1], #1
0016 ldrbge r3, [r0]
0017 strbge r3, [r1], #1
0018 ldrbgt r3, [r0]
0019 strbgt r3, [r1], #1
0020 subs r2, r2, ip
0021 bne .Linsb_aligned
0022
0023 ENTRY(__raw_readsb)
0024 teq r2, #0 @ do we have to check for the zero len?
0025 reteq lr
0026 ands ip, r1, #3
0027 bne .Linsb_align
0028
0029 .Linsb_aligned: stmfd sp!, {r4 - r6, lr}
0030
0031 subs r2, r2, #16
0032 bmi .Linsb_no_16
0033
0034 .Linsb_16_lp: ldrb r3, [r0]
0035 ldrb r4, [r0]
0036 ldrb r5, [r0]
0037 mov r3, r3, put_byte_0
0038 ldrb r6, [r0]
0039 orr r3, r3, r4, put_byte_1
0040 ldrb r4, [r0]
0041 orr r3, r3, r5, put_byte_2
0042 ldrb r5, [r0]
0043 orr r3, r3, r6, put_byte_3
0044 ldrb r6, [r0]
0045 mov r4, r4, put_byte_0
0046 ldrb ip, [r0]
0047 orr r4, r4, r5, put_byte_1
0048 ldrb r5, [r0]
0049 orr r4, r4, r6, put_byte_2
0050 ldrb r6, [r0]
0051 orr r4, r4, ip, put_byte_3
0052 ldrb ip, [r0]
0053 mov r5, r5, put_byte_0
0054 ldrb lr, [r0]
0055 orr r5, r5, r6, put_byte_1
0056 ldrb r6, [r0]
0057 orr r5, r5, ip, put_byte_2
0058 ldrb ip, [r0]
0059 orr r5, r5, lr, put_byte_3
0060 ldrb lr, [r0]
0061 mov r6, r6, put_byte_0
0062 orr r6, r6, ip, put_byte_1
0063 ldrb ip, [r0]
0064 orr r6, r6, lr, put_byte_2
0065 orr r6, r6, ip, put_byte_3
0066 stmia r1!, {r3 - r6}
0067
0068 subs r2, r2, #16
0069 bpl .Linsb_16_lp
0070
0071 tst r2, #15
0072 ldmfdeq sp!, {r4 - r6, pc}
0073
0074 .Linsb_no_16: tst r2, #8
0075 beq .Linsb_no_8
0076
0077 ldrb r3, [r0]
0078 ldrb r4, [r0]
0079 ldrb r5, [r0]
0080 mov r3, r3, put_byte_0
0081 ldrb r6, [r0]
0082 orr r3, r3, r4, put_byte_1
0083 ldrb r4, [r0]
0084 orr r3, r3, r5, put_byte_2
0085 ldrb r5, [r0]
0086 orr r3, r3, r6, put_byte_3
0087 ldrb r6, [r0]
0088 mov r4, r4, put_byte_0
0089 ldrb ip, [r0]
0090 orr r4, r4, r5, put_byte_1
0091 orr r4, r4, r6, put_byte_2
0092 orr r4, r4, ip, put_byte_3
0093 stmia r1!, {r3, r4}
0094
0095 .Linsb_no_8: tst r2, #4
0096 beq .Linsb_no_4
0097
0098 ldrb r3, [r0]
0099 ldrb r4, [r0]
0100 ldrb r5, [r0]
0101 ldrb r6, [r0]
0102 mov r3, r3, put_byte_0
0103 orr r3, r3, r4, put_byte_1
0104 orr r3, r3, r5, put_byte_2
0105 orr r3, r3, r6, put_byte_3
0106 str r3, [r1], #4
0107
0108 .Linsb_no_4: ands r2, r2, #3
0109 ldmfdeq sp!, {r4 - r6, pc}
0110
0111 cmp r2, #2
0112 ldrb r3, [r0]
0113 strb r3, [r1], #1
0114 ldrbge r3, [r0]
0115 strbge r3, [r1], #1
0116 ldrbgt r3, [r0]
0117 strbgt r3, [r1]
0118
0119 ldmfd sp!, {r4 - r6, pc}
0120 ENDPROC(__raw_readsb)