^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-writesb.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) .macro outword, rd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #ifndef __ARMEB__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) strb \rd, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) mov \rd, \rd, lsr #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) strb \rd, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) mov \rd, \rd, lsr #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) strb \rd, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) mov \rd, \rd, lsr #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) strb \rd, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) mov lr, \rd, lsr #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) strb lr, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) mov lr, \rd, lsr #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) strb lr, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) mov lr, \rd, lsr #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) strb lr, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) strb \rd, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) .Loutsb_align: rsb ip, ip, #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) cmp ip, r2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) movgt ip, r2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) cmp ip, #2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) ldrb r3, [r1], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) strb r3, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) ldrbge r3, [r1], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) strbge r3, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) ldrbgt r3, [r1], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) strbgt r3, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) subs r2, r2, ip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) bne .Loutsb_aligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) ENTRY(__raw_writesb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) teq r2, #0 @ do we have to check for the zero len?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) reteq lr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) ands ip, r1, #3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) bne .Loutsb_align
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) .Loutsb_aligned:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) stmfd sp!, {r4, r5, lr}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) subs r2, r2, #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) bmi .Loutsb_no_16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) .Loutsb_16_lp: ldmia r1!, {r3, r4, r5, ip}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) outword r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) outword r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) outword r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) outword ip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) subs r2, r2, #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) bpl .Loutsb_16_lp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) tst r2, #15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) ldmfdeq sp!, {r4, r5, pc}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) .Loutsb_no_16: tst r2, #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) beq .Loutsb_no_8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) ldmia r1!, {r3, r4}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) outword r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) outword r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) .Loutsb_no_8: tst r2, #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) beq .Loutsb_no_4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) ldr r3, [r1], #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) outword r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) .Loutsb_no_4: ands r2, r2, #3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) ldmfdeq sp!, {r4, r5, pc}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) cmp r2, #2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) ldrb r3, [r1], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) strb r3, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) ldrbge r3, [r1], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) strbge r3, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) ldrbgt r3, [r1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) strbgt r3, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) ldmfd sp!, {r4, r5, pc}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) ENDPROC(__raw_writesb)