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