Back to home page

OSCL-LXR

 
 

    


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