^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-writesl.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) ENTRY(__raw_writesl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) teq r2, #0 @ do we have to check for the zero len?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) reteq lr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) ands ip, r1, #3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) bne 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) subs r2, r2, #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) bmi 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) stmfd sp!, {r4, lr}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) 1: ldmia r1!, {r3, r4, ip, lr}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) subs r2, r2, #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) str r3, [r0, #0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) str r4, [r0, #0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) str ip, [r0, #0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) str lr, [r0, #0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) bpl 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) ldmfd sp!, {r4, lr}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) 2: movs r2, r2, lsl #31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) ldmiacs r1!, {r3, ip}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) strcs r3, [r0, #0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) ldrne r3, [r1, #0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) strcs ip, [r0, #0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) strne r3, [r0, #0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) ret lr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) 3: bic r1, r1, #3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) ldr r3, [r1], #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) cmp ip, #2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) blt 5f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) bgt 6f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) 4: mov ip, r3, lspull #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) ldr r3, [r1], #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) subs r2, r2, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) orr ip, ip, r3, lspush #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) bne 4b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) ret lr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) 5: mov ip, r3, lspull #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) ldr r3, [r1], #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) subs r2, r2, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) orr ip, ip, r3, lspush #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) bne 5b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) ret lr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) 6: mov ip, r3, lspull #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) ldr r3, [r1], #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) subs r2, r2, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) orr ip, ip, r3, lspush #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) str ip, [r0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) bne 6b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) ret lr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) ENDPROC(__raw_writesl)