1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* GENmemcpy.S: Generic sparc64 memcpy.
4 * Copyright (C) 2007 David S. Miller (davem@davemloft.net)
8 #include <linux/linkage.h>
9 #define GLOBAL_SPARE %g7
11 #define GLOBAL_SPARE %g5
23 #define LOAD(type,addr,dest) type [addr], dest
27 #define STORE(type,src,addr) type src, [addr]
31 #define FUNC_NAME GENmemcpy
42 .register %g2,#scratch
43 .register %g3,#scratch
48 #define EX_RETVAL(x) x
53 ENDPROC(GEN_retl_o4_1)
58 ENDPROC(GEN_retl_g1_8)
62 ENDPROC(GEN_retl_o2_4)
66 ENDPROC(GEN_retl_o2_1)
72 .type FUNC_NAME,#function
73 FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
97 EX_LD(LOAD(ldub, %o1, %g1),GEN_retl_o4_1)
98 EX_ST(STORE(stb, %g1, %o0),GEN_retl_o4_1)
105 1: subcc %g1, 0x8, %g1
106 EX_LD(LOAD(ldx, %o1, %g2),GEN_retl_g1_8)
107 EX_ST(STORE(stx, %g2, %o0),GEN_retl_g1_8)
117 80: /* 0 < len <= 16 */
124 EX_LD(LOAD(lduw, %o1, %g1),GEN_retl_o2_4)
125 EX_ST(STORE(stw, %g1, %o1 + %o3),GEN_retl_o2_4)
130 mov EX_RETVAL(GLOBAL_SPARE), %o0
135 EX_LD(LOAD(ldub, %o1, %g1),GEN_retl_o2_1)
136 EX_ST(STORE(stb, %g1, %o1 + %o3),GEN_retl_o2_1)
140 mov EX_RETVAL(GLOBAL_SPARE), %o0
142 .size FUNC_NAME, .-FUNC_NAME