Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /* GENmemcpy.S: Generic sparc64 memcpy.
0003  *
0004  * Copyright (C) 2007 David S. Miller (davem@davemloft.net)
0005  */
0006 
0007 #ifdef __KERNEL__
0008 #include <linux/linkage.h>
0009 #define GLOBAL_SPARE    %g7
0010 #else
0011 #define GLOBAL_SPARE    %g5
0012 #endif
0013 
0014 #ifndef EX_LD
0015 #define EX_LD(x,y)  x
0016 #endif
0017 
0018 #ifndef EX_ST
0019 #define EX_ST(x,y)  x
0020 #endif
0021 
0022 #ifndef LOAD
0023 #define LOAD(type,addr,dest)    type [addr], dest
0024 #endif
0025 
0026 #ifndef STORE
0027 #define STORE(type,src,addr)    type src, [addr]
0028 #endif
0029 
0030 #ifndef FUNC_NAME
0031 #define FUNC_NAME   GENmemcpy
0032 #endif
0033 
0034 #ifndef PREAMBLE
0035 #define PREAMBLE
0036 #endif
0037 
0038 #ifndef XCC
0039 #define XCC xcc
0040 #endif
0041 
0042     .register   %g2,#scratch
0043     .register   %g3,#scratch
0044 
0045     .text
0046 
0047 #ifndef EX_RETVAL
0048 #define EX_RETVAL(x)    x
0049 ENTRY(GEN_retl_o4_1)
0050     add %o4, %o2, %o4
0051     retl
0052      add    %o4, 1, %o0
0053 ENDPROC(GEN_retl_o4_1)
0054 ENTRY(GEN_retl_g1_8)
0055     add %g1, %o2, %g1
0056     retl
0057      add    %g1, 8, %o0
0058 ENDPROC(GEN_retl_g1_8)
0059 ENTRY(GEN_retl_o2_4)
0060     retl
0061      add    %o2, 4, %o0
0062 ENDPROC(GEN_retl_o2_4)
0063 ENTRY(GEN_retl_o2_1)
0064     retl
0065      add    %o2, 1, %o0
0066 ENDPROC(GEN_retl_o2_1)
0067 #endif
0068 
0069     .align      64
0070 
0071     .globl  FUNC_NAME
0072     .type   FUNC_NAME,#function
0073 FUNC_NAME:  /* %o0=dst, %o1=src, %o2=len */
0074     srlx        %o2, 31, %g2
0075     cmp     %g2, 0
0076     tne     %XCC, 5
0077     PREAMBLE
0078     mov     %o0, GLOBAL_SPARE
0079 
0080     cmp     %o2, 0
0081     be,pn       %XCC, 85f
0082      or     %o0, %o1, %o3
0083     cmp     %o2, 16
0084     blu,a,pn    %XCC, 80f
0085      or     %o3, %o2, %o3
0086 
0087     xor     %o0, %o1, %o4
0088     andcc       %o4, 0x7, %g0
0089     bne,a,pn    %XCC, 90f
0090      sub        %o0, %o1, %o3
0091 
0092     and     %o0, 0x7, %o4
0093     sub     %o4, 0x8, %o4
0094     sub     %g0, %o4, %o4
0095     sub     %o2, %o4, %o2
0096 1:  subcc       %o4, 1, %o4
0097     EX_LD(LOAD(ldub, %o1, %g1),GEN_retl_o4_1)
0098     EX_ST(STORE(stb, %g1, %o0),GEN_retl_o4_1)
0099     add     %o1, 1, %o1
0100     bne,pt      %XCC, 1b
0101     add     %o0, 1, %o0
0102 
0103     andn        %o2, 0x7, %g1
0104     sub     %o2, %g1, %o2
0105 1:  subcc       %g1, 0x8, %g1
0106     EX_LD(LOAD(ldx, %o1, %g2),GEN_retl_g1_8)
0107     EX_ST(STORE(stx, %g2, %o0),GEN_retl_g1_8)
0108     add     %o1, 0x8, %o1
0109     bne,pt      %XCC, 1b
0110      add        %o0, 0x8, %o0
0111 
0112     brz,pt      %o2, 85f
0113      sub        %o0, %o1, %o3
0114     ba,a,pt     %XCC, 90f
0115 
0116     .align      64
0117 80: /* 0 < len <= 16 */
0118     andcc       %o3, 0x3, %g0
0119     bne,pn      %XCC, 90f
0120      sub        %o0, %o1, %o3
0121 
0122 1:
0123     subcc       %o2, 4, %o2
0124     EX_LD(LOAD(lduw, %o1, %g1),GEN_retl_o2_4)
0125     EX_ST(STORE(stw, %g1, %o1 + %o3),GEN_retl_o2_4)
0126     bgu,pt      %XCC, 1b
0127      add        %o1, 4, %o1
0128 
0129 85: retl
0130      mov        EX_RETVAL(GLOBAL_SPARE), %o0
0131 
0132     .align      32
0133 90:
0134     subcc       %o2, 1, %o2
0135     EX_LD(LOAD(ldub, %o1, %g1),GEN_retl_o2_1)
0136     EX_ST(STORE(stb, %g1, %o1 + %o3),GEN_retl_o2_1)
0137     bgu,pt      %XCC, 90b
0138      add        %o1, 1, %o1
0139     retl
0140      mov        EX_RETVAL(GLOBAL_SPARE), %o0
0141 
0142     .size       FUNC_NAME, .-FUNC_NAME