^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) /* GENmemcpy.S: Generic sparc64 memcpy.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2007 David S. Miller (davem@davemloft.net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #ifdef __KERNEL__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #define GLOBAL_SPARE %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #define GLOBAL_SPARE %g5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #ifndef EX_LD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define EX_LD(x,y) x
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #ifndef EX_ST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define EX_ST(x,y) x
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #ifndef LOAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define LOAD(type,addr,dest) type [addr], dest
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #ifndef STORE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define STORE(type,src,addr) type src, [addr]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #ifndef FUNC_NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define FUNC_NAME GENmemcpy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #ifndef PREAMBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define PREAMBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #ifndef XCC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define XCC xcc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) .register %g2,#scratch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) .register %g3,#scratch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #ifndef EX_RETVAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define EX_RETVAL(x) x
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ENTRY(GEN_retl_o4_1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) add %o4, %o2, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) add %o4, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) ENDPROC(GEN_retl_o4_1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) ENTRY(GEN_retl_g1_8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) add %g1, %o2, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) add %g1, 8, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) ENDPROC(GEN_retl_g1_8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) ENTRY(GEN_retl_o2_4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) add %o2, 4, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) ENDPROC(GEN_retl_o2_4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) ENTRY(GEN_retl_o2_1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) add %o2, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) ENDPROC(GEN_retl_o2_1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) .align 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) .globl FUNC_NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) .type FUNC_NAME,#function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) srlx %o2, 31, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) cmp %g2, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) tne %XCC, 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) PREAMBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) mov %o0, GLOBAL_SPARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) cmp %o2, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) be,pn %XCC, 85f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) or %o0, %o1, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) cmp %o2, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) blu,a,pn %XCC, 80f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) or %o3, %o2, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) xor %o0, %o1, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) andcc %o4, 0x7, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) bne,a,pn %XCC, 90f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) sub %o0, %o1, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) and %o0, 0x7, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) sub %o4, 0x8, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) sub %g0, %o4, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) sub %o2, %o4, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) 1: subcc %o4, 1, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) EX_LD(LOAD(ldub, %o1, %g1),GEN_retl_o4_1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) EX_ST(STORE(stb, %g1, %o0),GEN_retl_o4_1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) add %o1, 1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) bne,pt %XCC, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) add %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) andn %o2, 0x7, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) sub %o2, %g1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 1: subcc %g1, 0x8, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) EX_LD(LOAD(ldx, %o1, %g2),GEN_retl_g1_8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) EX_ST(STORE(stx, %g2, %o0),GEN_retl_g1_8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) add %o1, 0x8, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) bne,pt %XCC, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) add %o0, 0x8, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) brz,pt %o2, 85f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) sub %o0, %o1, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) ba,a,pt %XCC, 90f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) .align 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 80: /* 0 < len <= 16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) andcc %o3, 0x3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) bne,pn %XCC, 90f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) sub %o0, %o1, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) subcc %o2, 4, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) EX_LD(LOAD(lduw, %o1, %g1),GEN_retl_o2_4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) EX_ST(STORE(stw, %g1, %o1 + %o3),GEN_retl_o2_4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) bgu,pt %XCC, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) add %o1, 4, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 85: retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) mov EX_RETVAL(GLOBAL_SPARE), %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) .align 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 90:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) subcc %o2, 1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) EX_LD(LOAD(ldub, %o1, %g1),GEN_retl_o2_1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) EX_ST(STORE(stb, %g1, %o1 + %o3),GEN_retl_o2_1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) bgu,pt %XCC, 90b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) add %o1, 1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) mov EX_RETVAL(GLOBAL_SPARE), %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) .size FUNC_NAME, .-FUNC_NAME