0001
0002
0003
0004
0005
0006
0007 #include <linux/linkage.h>
0008 #include <asm/assembler.h>
0009
0010 ENTRY(__raw_readsl)
0011 teq r2, #0 @ do we have to check for the zero len?
0012 reteq lr
0013 ands ip, r1, #3
0014 bne 3f
0015
0016 subs r2, r2, #4
0017 bmi 2f
0018 stmfd sp!, {r4, lr}
0019 1: ldr r3, [r0, #0]
0020 ldr r4, [r0, #0]
0021 ldr ip, [r0, #0]
0022 ldr lr, [r0, #0]
0023 subs r2, r2, #4
0024 stmia r1!, {r3, r4, ip, lr}
0025 bpl 1b
0026 ldmfd sp!, {r4, lr}
0027 2: movs r2, r2, lsl #31
0028 ldrcs r3, [r0, #0]
0029 ldrcs ip, [r0, #0]
0030 stmiacs r1!, {r3, ip}
0031 ldrne r3, [r0, #0]
0032 strne r3, [r1, #0]
0033 ret lr
0034
0035 3: ldr r3, [r0]
0036 cmp ip, #2
0037 mov ip, r3, get_byte_0
0038 strb ip, [r1], #1
0039 bgt 6f
0040 mov ip, r3, get_byte_1
0041 strb ip, [r1], #1
0042 beq 5f
0043 mov ip, r3, get_byte_2
0044 strb ip, [r1], #1
0045
0046 4: subs r2, r2, #1
0047 mov ip, r3, lspull #24
0048 ldrne r3, [r0]
0049 orrne ip, ip, r3, lspush #8
0050 strne ip, [r1], #4
0051 bne 4b
0052 b 8f
0053
0054 5: subs r2, r2, #1
0055 mov ip, r3, lspull #16
0056 ldrne r3, [r0]
0057 orrne ip, ip, r3, lspush #16
0058 strne ip, [r1], #4
0059 bne 5b
0060 b 7f
0061
0062 6: subs r2, r2, #1
0063 mov ip, r3, lspull #8
0064 ldrne r3, [r0]
0065 orrne ip, ip, r3, lspush #24
0066 strne ip, [r1], #4
0067 bne 6b
0068
0069 mov r3, ip, get_byte_2
0070 strb r3, [r1, #2]
0071 7: mov r3, ip, get_byte_1
0072 strb r3, [r1, #1]
0073 8: mov r3, ip, get_byte_0
0074 strb r3, [r1, #0]
0075 ret lr
0076 ENDPROC(__raw_readsl)