1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * linux/arch/arm/lib/io-readsb.S 4 * 5 * Copyright (C) 1995-2000 Russell King 6 */ 7#include <linux/linkage.h> 8#include <asm/assembler.h> 9 10.Linsb_align: rsb ip, ip, #4 11 cmp ip, r2 12 movgt ip, r2 13 cmp ip, #2 14 ldrb r3, [r0] 15 strb r3, [r1], #1 16 ldrbge r3, [r0] 17 strbge r3, [r1], #1 18 ldrbgt r3, [r0] 19 strbgt r3, [r1], #1 20 subs r2, r2, ip 21 bne .Linsb_aligned 22 23ENTRY(__raw_readsb) 24 teq r2, #0 @ do we have to check for the zero len? 25 reteq lr 26 ands ip, r1, #3 27 bne .Linsb_align 28 29.Linsb_aligned: stmfd sp!, {r4 - r6, lr} 30 31 subs r2, r2, #16 32 bmi .Linsb_no_16 33 34.Linsb_16_lp: ldrb r3, [r0] 35 ldrb r4, [r0] 36 ldrb r5, [r0] 37 mov r3, r3, put_byte_0 38 ldrb r6, [r0] 39 orr r3, r3, r4, put_byte_1 40 ldrb r4, [r0] 41 orr r3, r3, r5, put_byte_2 42 ldrb r5, [r0] 43 orr r3, r3, r6, put_byte_3 44 ldrb r6, [r0] 45 mov r4, r4, put_byte_0 46 ldrb ip, [r0] 47 orr r4, r4, r5, put_byte_1 48 ldrb r5, [r0] 49 orr r4, r4, r6, put_byte_2 50 ldrb r6, [r0] 51 orr r4, r4, ip, put_byte_3 52 ldrb ip, [r0] 53 mov r5, r5, put_byte_0 54 ldrb lr, [r0] 55 orr r5, r5, r6, put_byte_1 56 ldrb r6, [r0] 57 orr r5, r5, ip, put_byte_2 58 ldrb ip, [r0] 59 orr r5, r5, lr, put_byte_3 60 ldrb lr, [r0] 61 mov r6, r6, put_byte_0 62 orr r6, r6, ip, put_byte_1 63 ldrb ip, [r0] 64 orr r6, r6, lr, put_byte_2 65 orr r6, r6, ip, put_byte_3 66 stmia r1!, {r3 - r6} 67 68 subs r2, r2, #16 69 bpl .Linsb_16_lp 70 71 tst r2, #15 72 ldmfdeq sp!, {r4 - r6, pc} 73 74.Linsb_no_16: tst r2, #8 75 beq .Linsb_no_8 76 77 ldrb r3, [r0] 78 ldrb r4, [r0] 79 ldrb r5, [r0] 80 mov r3, r3, put_byte_0 81 ldrb r6, [r0] 82 orr r3, r3, r4, put_byte_1 83 ldrb r4, [r0] 84 orr r3, r3, r5, put_byte_2 85 ldrb r5, [r0] 86 orr r3, r3, r6, put_byte_3 87 ldrb r6, [r0] 88 mov r4, r4, put_byte_0 89 ldrb ip, [r0] 90 orr r4, r4, r5, put_byte_1 91 orr r4, r4, r6, put_byte_2 92 orr r4, r4, ip, put_byte_3 93 stmia r1!, {r3, r4} 94 95.Linsb_no_8: tst r2, #4 96 beq .Linsb_no_4 97 98 ldrb r3, [r0] 99 ldrb r4, [r0] 100 ldrb r5, [r0] 101 ldrb r6, [r0] 102 mov r3, r3, put_byte_0 103 orr r3, r3, r4, put_byte_1 104 orr r3, r3, r5, put_byte_2 105 orr r3, r3, r6, put_byte_3 106 str r3, [r1], #4 107 108.Linsb_no_4: ands r2, r2, #3 109 ldmfdeq sp!, {r4 - r6, pc} 110 111 cmp r2, #2 112 ldrb r3, [r0] 113 strb r3, [r1], #1 114 ldrbge r3, [r0] 115 strbge r3, [r1], #1 116 ldrbgt r3, [r0] 117 strbgt r3, [r1] 118 119 ldmfd sp!, {r4 - r6, pc} 120ENDPROC(__raw_readsb) 121