1/* $Id: memmove.S,v 1.2 2001/07/27 11:51:09 gniibe Exp $ 2 * 3 * "memmove" implementation of SuperH 4 * 5 * Copyright (C) 1999 Niibe Yutaka 6 * 7 */ 8 9/* 10 * void *memmove(void *dst, const void *src, size_t n); 11 * The memory areas may overlap. 12 */ 13 14#include <linux/linkage.h> 15ENTRY(memmove) 16 ! if dest > src, call memcpy (it copies in decreasing order) 17 cmp/hi r5,r4 18 bf 1f 19 mov.l 2f,r0 20 jmp @r0 21 nop 22 .balign 4 232: .long memcpy 241: 25 sub r5,r4 ! From here, r4 has the distance to r0 26 tst r6,r6 27 bt/s 9f ! if n=0, do nothing 28 mov r5,r0 29 add r6,r5 30 mov #12,r1 31 cmp/gt r6,r1 32 bt/s 8f ! if it's too small, copy a byte at once 33 add #-1,r4 34 add #1,r4 35 ! 36 ! [ ... ] DST [ ... ] SRC 37 ! [ ... ] [ ... ] 38 ! : : 39 ! r0+r4--> [ ... ] r0 --> [ ... ] 40 ! : : 41 ! [ ... ] [ ... ] 42 ! r5 --> 43 ! 44 mov r4,r1 45 mov #3,r2 46 and r2,r1 47 shll2 r1 48 mov r0,r3 ! Save the value on R0 to R3 49 mova jmptable,r0 50 add r1,r0 51 mov.l @r0,r1 52 jmp @r1 53 mov r3,r0 ! and back to R0 54 .balign 4 55jmptable: 56 .long case0 57 .long case1 58 .long case2 59 .long case3 60 61 ! copy a byte at once 628: mov.b @r0+,r1 63 cmp/hs r5,r0 64 bf/s 8b ! while (r0<r5) 65 mov.b r1,@(r0,r4) 66 add #1,r4 679: 68 add r4,r0 69 rts 70 sub r6,r0 71 72case_none: 73 bra 8b 74 add #-1,r4 75 76case0: 77 ! 78 ! GHIJ KLMN OPQR --> GHIJ KLMN OPQR 79 ! 80 ! First, align to long word boundary 81 mov r0,r3 82 and r2,r3 83 tst r3,r3 84 bt/s 2f 85 add #-1,r4 86 mov #4,r2 87 sub r3,r2 881: dt r2 89 mov.b @r0+,r1 90 bf/s 1b 91 mov.b r1,@(r0,r4) 92 ! 932: ! Second, copy a long word at once 94 add #-3,r4 95 add #-3,r5 963: mov.l @r0+,r1 97 cmp/hs r5,r0 98 bf/s 3b 99 mov.l r1,@(r0,r4) 100 add #3,r5 101 ! 102 ! Third, copy a byte at once, if necessary 103 cmp/eq r5,r0 104 bt/s 9b 105 add #4,r4 106 bra 8b 107 add #-1,r4 108 109case3: 110 ! 111 ! GHIJ KLMN OPQR --> ...G HIJK LMNO PQR. 112 ! 113 ! First, align to long word boundary 114 mov r0,r3 115 and r2,r3 116 tst r3,r3 117 bt/s 2f 118 add #-1,r4 119 mov #4,r2 120 sub r3,r2 1211: dt r2 122 mov.b @r0+,r1 123 bf/s 1b 124 mov.b r1,@(r0,r4) 125 ! 1262: ! Second, read a long word and write a long word at once 127 add #-2,r4 128 mov.l @(r0,r4),r1 129 add #-7,r5 130 add #-4,r4 131 ! 132#ifdef __LITTLE_ENDIAN__ 133 shll8 r1 1343: mov r1,r3 ! JIHG 135 shlr8 r3 ! xJIH 136 mov.l @r0+,r1 ! NMLK 137 mov r1,r2 138 shll16 r2 139 shll8 r2 ! Kxxx 140 or r2,r3 ! KJIH 141 cmp/hs r5,r0 142 bf/s 3b 143 mov.l r3,@(r0,r4) 144#else 145 shlr8 r1 1463: mov r1,r3 ! GHIJ 147 shll8 r3 ! HIJx 148 mov.l @r0+,r1 ! KLMN 149 mov r1,r2 150 shlr16 r2 151 shlr8 r2 ! xxxK 152 or r2,r3 ! HIJK 153 cmp/hs r5,r0 154 bf/s 3b 155 mov.l r3,@(r0,r4) 156#endif 157 add #7,r5 158 ! 159 ! Third, copy a byte at once, if necessary 160 cmp/eq r5,r0 161 bt/s 9b 162 add #7,r4 163 add #-3,r0 164 bra 8b 165 add #-1,r4 166 167case2: 168 ! 169 ! GHIJ KLMN OPQR --> ..GH IJKL MNOP QR.. 170 ! 171 ! First, align to word boundary 172 tst #1,r0 173 bt/s 2f 174 add #-1,r4 175 mov.b @r0+,r1 176 mov.b r1,@(r0,r4) 177 ! 1782: ! Second, read a word and write a word at once 179 add #-1,r4 180 add #-1,r5 181 ! 1823: mov.w @r0+,r1 183 cmp/hs r5,r0 184 bf/s 3b 185 mov.w r1,@(r0,r4) 186 add #1,r5 187 ! 188 ! Third, copy a byte at once, if necessary 189 cmp/eq r5,r0 190 bt/s 9b 191 add #2,r4 192 mov.b @r0,r1 193 mov.b r1,@(r0,r4) 194 bra 9b 195 add #1,r0 196 197case1: 198 ! 199 ! GHIJ KLMN OPQR --> .GHI JKLM NOPQ R... 200 ! 201 ! First, align to long word boundary 202 mov r0,r3 203 and r2,r3 204 tst r3,r3 205 bt/s 2f 206 add #-1,r4 207 mov #4,r2 208 sub r3,r2 2091: dt r2 210 mov.b @r0+,r1 211 bf/s 1b 212 mov.b r1,@(r0,r4) 213 ! 2142: ! Second, read a long word and write a long word at once 215 mov.l @(r0,r4),r1 216 add #-7,r5 217 add #-4,r4 218 ! 219#ifdef __LITTLE_ENDIAN__ 220 shll16 r1 221 shll8 r1 2223: mov r1,r3 ! JIHG 223 shlr16 r3 224 shlr8 r3 ! xxxJ 225 mov.l @r0+,r1 ! NMLK 226 mov r1,r2 227 shll8 r2 ! MLKx 228 or r2,r3 ! MLKJ 229 cmp/hs r5,r0 230 bf/s 3b 231 mov.l r3,@(r0,r4) 232#else 233 shlr16 r1 234 shlr8 r1 2353: mov r1,r3 ! GHIJ 236 shll16 r3 237 shll8 r3 ! Jxxx 238 mov.l @r0+,r1 ! KLMN 239 mov r1,r2 240 shlr8 r2 ! xKLM 241 or r2,r3 ! JKLM 242 cmp/hs r5,r0 243 bf/s 3b ! while(r0<r5) 244 mov.l r3,@(r0,r4) 245#endif 246 add #7,r5 247 ! 248 ! Third, copy a byte at once, if necessary 249 cmp/eq r5,r0 250 bt/s 9b 251 add #5,r4 252 add #-3,r0 253 bra 8b 254 add #-1,r4 255