linux/arch/sh/lib64/strcpy.S
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/* Cloned and hacked for uClibc by Paul Mundt, December 2003 */
   3/* Modified by SuperH, Inc. September 2003 */
   4! Entry: arg0: destination
   5!        arg1: source
   6! Exit:  result: destination
   7!
   8! SH5 code Copyright 2002 SuperH Ltd.
   9
  10#if __BYTE_ORDER == __LITTLE_ENDIAN
  11#define SHHI shlld
  12#define SHLO shlrd
  13#else
  14#define SHHI shlrd
  15#define SHLO shlld
  16#endif
  17
  18        .section .text..SHmedia32,"ax"
  19        .globl  strcpy
  20        .type   strcpy, @function
  21        .align 5
  22
  23strcpy:
  24
  25        pta/l shortstring,tr1
  26        ldlo.q r3,0,r4
  27        ptabs r18,tr4
  28        shlli r3,3,r7
  29        addi r2, 8, r0
  30        mcmpeq.b r4,r63,r6
  31        SHHI r6,r7,r6
  32        bnei/u r6,0,tr1 // shortstring
  33        pta/l no_lddst, tr2
  34        ori r3,-8,r23
  35        sub r2, r23, r0
  36        sub r3, r2, r21
  37        addi r21, 8, r20
  38        ldx.q r0, r21, r5
  39        pta/l loop, tr0
  40        ori r2,-8,r22
  41        mcmpeq.b r5, r63, r6
  42        bgt/u r22, r23, tr2 // no_lddst
  43
  44        // r22 < r23 :  Need to do a load from the destination.
  45        // r22 == r23 : Doesn't actually need to load from destination,
  46        //              but still can be handled here.
  47        ldlo.q r2, 0, r9
  48        movi -1, r8
  49        SHLO r8, r7, r8
  50        mcmv r4, r8, r9
  51        stlo.q r2, 0, r9
  52        beqi/l r6, 0, tr0 // loop
  53
  54        add r5, r63, r4
  55        addi r0, 8, r0
  56        blink tr1, r63 // shortstring
  57no_lddst:
  58        // r22 > r23: note that for r22 == r23 the sthi.q would clobber
  59        //            bytes before the destination region.
  60        stlo.q r2, 0, r4
  61        SHHI r4, r7, r4
  62        sthi.q r0, -1, r4
  63        beqi/l r6, 0, tr0 // loop
  64
  65        add r5, r63, r4
  66        addi r0, 8, r0
  67shortstring:
  68#if __BYTE_ORDER != __LITTLE_ENDIAN
  69        pta/l shortstring2,tr1
  70        byterev r4,r4
  71#endif
  72shortstring2:
  73        st.b r0,-8,r4
  74        andi r4,0xff,r5
  75        shlri r4,8,r4
  76        addi r0,1,r0
  77        bnei/l r5,0,tr1
  78        blink tr4,r63 // return
  79        
  80        .balign 8
  81loop:
  82        stlo.q r0, 0, r5
  83        ldx.q r0, r20, r4
  84        addi r0, 16, r0
  85        sthi.q r0, -9, r5
  86        mcmpeq.b r4, r63, r6
  87        bnei/u r6, 0, tr1 // shortstring
  88        ldx.q r0, r21, r5
  89        stlo.q r0, -8, r4
  90        sthi.q r0, -1, r4
  91        mcmpeq.b r5, r63, r6
  92        beqi/l r6, 0, tr0 // loop
  93
  94        add r5, r63, r4
  95        addi r0, 8, r0
  96        blink tr1, r63 // shortstring
  97
  98        .size   strcpy,.-strcpy
  99