Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  *  linux/arch/arm/lib/io-readsl.S
0004  *
0005  *  Copyright (C) 1995-2000 Russell King
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)