root/arch/sh/lib/memcpy.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /* $Id: memcpy.S,v 1.3 2001/07/27 11:50:52 gniibe Exp $
   3  *
   4  * "memcpy" implementation of SuperH
   5  *
   6  * Copyright (C) 1999  Niibe Yutaka
   7  *
   8  */
   9 
  10 /*
  11  * void *memcpy(void *dst, const void *src, size_t n);
  12  * No overlap between the memory of DST and of SRC are assumed.
  13  */
  14 
  15 #include <linux/linkage.h>
  16 ENTRY(memcpy)
  17         tst     r6,r6
  18         bt/s    9f              ! if n=0, do nothing
  19          mov    r4,r0
  20         sub     r4,r5           ! From here, r5 has the distance to r0
  21         add     r6,r0           ! From here, r0 points the end of copying point
  22         mov     #12,r1
  23         cmp/gt  r6,r1
  24         bt/s    7f              ! if it's too small, copy a byte at once
  25          add    #-1,r5
  26         add     #1,r5
  27         !                       From here, r6 is free
  28         !
  29         !      r4   -->  [ ...  ] DST             [ ...  ] SRC
  30         !                [ ...  ]                 [ ...  ]
  31         !                  :                        :
  32         !      r0   -->  [ ...  ]       r0+r5 --> [ ...  ]
  33         !
  34         !
  35         mov     r5,r1
  36         mov     #3,r2
  37         and     r2,r1
  38         shll2   r1
  39         mov     r0,r3           ! Save the value on R0 to R3
  40         mova    jmptable,r0
  41         add     r1,r0
  42         mov.l   @r0,r1
  43         jmp     @r1
  44          mov    r3,r0           ! and back to R0
  45         .balign 4
  46 jmptable:
  47         .long   case0
  48         .long   case1
  49         .long   case2
  50         .long   case3
  51 
  52         ! copy a byte at once
  53 7:      mov     r4,r2
  54         add     #1,r2
  55 8:
  56         cmp/hi  r2,r0
  57         mov.b   @(r0,r5),r1
  58         bt/s    8b                      ! while (r0>r2)
  59          mov.b  r1,@-r0
  60 9:
  61         rts
  62          nop
  63 
  64 case0:
  65         !
  66         !       GHIJ KLMN OPQR -->  GHIJ KLMN OPQR
  67         !
  68         ! First, align to long word boundary
  69         mov     r0,r3
  70         and     r2,r3
  71         tst     r3,r3
  72         bt/s    2f
  73          add    #-4,r5
  74         add     #3,r5
  75 1:      dt      r3
  76         mov.b   @(r0,r5),r1
  77         bf/s    1b
  78          mov.b  r1,@-r0
  79         !
  80         add     #-3,r5
  81 2:      ! Second, copy a long word at once
  82         mov     r4,r2
  83         add     #7,r2
  84 3:      mov.l   @(r0,r5),r1
  85         cmp/hi  r2,r0
  86         bt/s    3b
  87          mov.l  r1,@-r0
  88         !
  89         ! Third, copy a byte at once, if necessary
  90         cmp/eq  r4,r0
  91         bt/s    9b
  92          add    #3,r5
  93         bra     8b
  94          add    #-6,r2
  95 
  96 case1:
  97         !
  98         !       GHIJ KLMN OPQR -->  ...G HIJK LMNO PQR.
  99         !
 100         ! First, align to long word boundary
 101         mov     r0,r3
 102         and     r2,r3
 103         tst     r3,r3
 104         bt/s    2f
 105          add    #-1,r5
 106 1:      dt      r3
 107         mov.b   @(r0,r5),r1
 108         bf/s    1b
 109          mov.b  r1,@-r0
 110         !
 111 2:      ! Second, read a long word and write a long word at once
 112         mov.l   @(r0,r5),r1
 113         add     #-4,r5
 114         mov     r4,r2
 115         add     #7,r2
 116         !
 117 #ifdef __LITTLE_ENDIAN__
 118 3:      mov     r1,r3           ! RQPO
 119         shll16  r3
 120         shll8   r3              ! Oxxx
 121         mov.l   @(r0,r5),r1     ! NMLK
 122         mov     r1,r6
 123         shlr8   r6              ! xNML
 124         or      r6,r3           ! ONML
 125         cmp/hi  r2,r0
 126         bt/s    3b
 127          mov.l  r3,@-r0
 128 #else
 129 3:      mov     r1,r3           ! OPQR
 130         shlr16  r3
 131         shlr8   r3              ! xxxO
 132         mov.l   @(r0,r5),r1     ! KLMN
 133         mov     r1,r6
 134         shll8   r6              ! LMNx
 135         or      r6,r3           ! LMNO
 136         cmp/hi  r2,r0
 137         bt/s    3b
 138          mov.l  r3,@-r0
 139 #endif
 140         !
 141         ! Third, copy a byte at once, if necessary
 142         cmp/eq  r4,r0
 143         bt/s    9b
 144          add    #4,r5
 145         bra     8b
 146          add    #-6,r2
 147 
 148 case2:
 149         !
 150         !       GHIJ KLMN OPQR -->  ..GH IJKL MNOP QR..
 151         !
 152         ! First, align to word boundary
 153         tst     #1,r0
 154         bt/s    2f
 155          add    #-1,r5
 156         mov.b   @(r0,r5),r1
 157         mov.b   r1,@-r0
 158         !
 159 2:      ! Second, read a word and write a word at once
 160         add     #-1,r5
 161         mov     r4,r2
 162         add     #3,r2
 163         !
 164 3:      mov.w   @(r0,r5),r1
 165         cmp/hi  r2,r0
 166         bt/s    3b
 167          mov.w  r1,@-r0
 168         !
 169         ! Third, copy a byte at once, if necessary
 170         cmp/eq  r4,r0
 171         bt/s    9b
 172          add    #1,r5
 173         mov.b   @(r0,r5),r1
 174         rts
 175          mov.b  r1,@-r0
 176 
 177 case3:
 178         !
 179         !       GHIJ KLMN OPQR -->  .GHI JKLM NOPQ R...
 180         !
 181         ! First, align to long word boundary
 182         mov     r0,r3
 183         and     r2,r3
 184         tst     r3,r3
 185         bt/s    2f
 186          add    #-1,r5
 187 1:      dt      r3
 188         mov.b   @(r0,r5),r1
 189         bf/s    1b
 190          mov.b  r1,@-r0
 191         !
 192 2:      ! Second, read a long word and write a long word at once
 193         add     #-2,r5
 194         mov.l   @(r0,r5),r1
 195         add     #-4,r5
 196         mov     r4,r2
 197         add     #7,r2
 198         !
 199 #ifdef __LITTLE_ENDIAN__
 200 3:      mov     r1,r3           ! RQPO
 201         shll8   r3              ! QPOx
 202         mov.l   @(r0,r5),r1     ! NMLK
 203         mov     r1,r6
 204         shlr16  r6
 205         shlr8   r6              ! xxxN
 206         or      r6,r3           ! QPON
 207         cmp/hi  r2,r0
 208         bt/s    3b
 209          mov.l  r3,@-r0
 210 #else
 211 3:      mov     r1,r3           ! OPQR
 212         shlr8   r3              ! xOPQ
 213         mov.l   @(r0,r5),r1     ! KLMN
 214         mov     r1,r6
 215         shll16  r6
 216         shll8   r6              ! Nxxx
 217         or      r6,r3           ! NOPQ
 218         cmp/hi  r2,r0
 219         bt/s    3b
 220          mov.l  r3,@-r0
 221 #endif
 222         !
 223         ! Third, copy a byte at once, if necessary
 224         cmp/eq  r4,r0
 225         bt/s    9b
 226          add    #6,r5
 227         bra     8b
 228          add    #-6,r2

/* [<][>][^][v][top][bottom][index][help] */