Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  *  linux/arch/arm/lib/io-readsw-armv3.S
0004  *
0005  *  Copyright (C) 1995-2000 Russell King
0006  */
0007 #include <linux/linkage.h>
0008 #include <asm/assembler.h>
0009 
0010 .Linsw_bad_alignment:
0011         adr r0, .Linsw_bad_align_msg
0012         mov r2, lr
0013         b   panic
0014 .Linsw_bad_align_msg:
0015         .asciz  "insw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
0016         .align
0017 
0018 .Linsw_align:   tst r1, #1
0019         bne .Linsw_bad_alignment
0020 
0021         ldr r3, [r0]
0022         strb    r3, [r1], #1
0023         mov r3, r3, lsr #8
0024         strb    r3, [r1], #1
0025 
0026         subs    r2, r2, #1
0027         reteq   lr
0028 
0029 ENTRY(__raw_readsw)
0030         teq r2, #0      @ do we have to check for the zero len?
0031         reteq   lr
0032         tst r1, #3
0033         bne .Linsw_align
0034 
0035 .Linsw_aligned: mov ip, #0xff
0036         orr ip, ip, ip, lsl #8
0037         stmfd   sp!, {r4, r5, r6, lr}
0038 
0039         subs    r2, r2, #8
0040         bmi .Lno_insw_8
0041 
0042 .Linsw_8_lp:    ldr r3, [r0]
0043         and r3, r3, ip
0044         ldr r4, [r0]
0045         orr r3, r3, r4, lsl #16
0046 
0047         ldr r4, [r0]
0048         and r4, r4, ip
0049         ldr r5, [r0]
0050         orr r4, r4, r5, lsl #16
0051 
0052         ldr r5, [r0]
0053         and r5, r5, ip
0054         ldr r6, [r0]
0055         orr r5, r5, r6, lsl #16
0056 
0057         ldr r6, [r0]
0058         and r6, r6, ip
0059         ldr lr, [r0]
0060         orr r6, r6, lr, lsl #16
0061 
0062         stmia   r1!, {r3 - r6}
0063 
0064         subs    r2, r2, #8
0065         bpl .Linsw_8_lp
0066 
0067         tst r2, #7
0068         ldmfdeq sp!, {r4, r5, r6, pc}
0069 
0070 .Lno_insw_8:    tst r2, #4
0071         beq .Lno_insw_4
0072 
0073         ldr r3, [r0]
0074         and r3, r3, ip
0075         ldr r4, [r0]
0076         orr r3, r3, r4, lsl #16
0077 
0078         ldr r4, [r0]
0079         and r4, r4, ip
0080         ldr r5, [r0]
0081         orr r4, r4, r5, lsl #16
0082 
0083         stmia   r1!, {r3, r4}
0084 
0085 .Lno_insw_4:    tst r2, #2
0086         beq .Lno_insw_2
0087 
0088         ldr r3, [r0]
0089         and r3, r3, ip
0090         ldr r4, [r0]
0091         orr r3, r3, r4, lsl #16
0092 
0093         str r3, [r1], #4
0094 
0095 .Lno_insw_2:    tst r2, #1
0096         ldrne   r3, [r0]
0097         strbne  r3, [r1], #1
0098         movne   r3, r3, lsr #8
0099         strbne  r3, [r1]
0100 
0101         ldmfd   sp!, {r4, r5, r6, pc}
0102 
0103