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