^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* memmove.S: Simple memmove implementation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 1997, 2004 David S. Miller (davem@redhat.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 1996, 1997, 1998, 1999 Jakub Jelinek (jj@ultra.linux.cz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <asm/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) ENTRY(memmove) /* o0=dst o1=src o2=len */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) brz,pn %o2, 99f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) mov %o0, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) cmp %o0, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) bleu,pt %xcc, 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) add %o1, %o2, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) cmp %g7, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) bleu,pt %xcc, memcpy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) add %o0, %o2, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) sub %g7, 1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) sub %o5, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) 1: ldub [%o1], %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) subcc %o2, 1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) sub %o1, 1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) stb %g7, [%o0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) bne,pt %icc, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) sub %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) 99:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) mov %g1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) /* We can't just call memcpy for these memmove cases. On some
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * chips the memcpy uses cache initializing stores and when dst
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * and src are close enough, those can clobber the source data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * before we've loaded it in.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) 2: or %o0, %o1, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) or %o2, %g7, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) andcc %g7, 0x7, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) bne,pn %xcc, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) 3: ldx [%o1], %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) add %o1, 8, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) subcc %o2, 8, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) add %o0, 8, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) bne,pt %icc, 3b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) stx %g7, [%o0 - 0x8]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) ba,a,pt %xcc, 99b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) 4: ldub [%o1], %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) add %o1, 1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) subcc %o2, 1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) add %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) bne,pt %icc, 4b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) stb %g7, [%o0 - 0x1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) ba,a,pt %xcc, 99b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) ENDPROC(memmove)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) EXPORT_SYMBOL(memmove)