Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/arch/sh/lib/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 3 kB image not shown  

Quelle  memmove.S   Sprache: Sparc

 
/* SPDX-License-Identifier: GPL-2.0 */
/* $Id: memmove.S,v 1.2 2001/07/27 11:51:09 gniibe Exp $
 *
 * "memmove" implementation of SuperH
 *
 * Copyright (C) 1999  Niibe Yutaka
 *
 */


/*
 * void *memmove(void *dst, const void *src, size_t n);
 * The memory areas may overlap.
 */


#include <linux/linkage.h>
ENTRY(memmove)
 ! if dest > src, call memcpy (it copies in decreasing order)
 cmp/hi r5,r4
 bf 1f
 mov.l 2f,r0
 jmp @r0
  nop
 .balign 4
2: .long memcpy
1:
 sub r5,r4  ! From here, r4 has the distance to r0
 tst r6,r6
 bt/s 9f  ! if n=0, do nothing
  mov r5,r0
 add r6,r5
 mov #12,r1
 cmp/gt r6,r1
 bt/s 8f  ! if it's too small, copy a byte at once
  add #-1,r4
 add #1,r4
 !
 !                [ ...  ] DST             [ ...  ] SRC
 !          [ ...  ]                 [ ...  ]
 !            :                        :
 !      r0+r4-->  [ ...  ]       r0    --> [ ...  ]
 !            :                        :
 !          [ ...  ]                 [ ...  ]
 !         r5    -->
 !
 mov r4,r1
 mov #3,r2
 and r2,r1
 shll2 r1
 mov r0,r3  ! Save the value on R0 to R3
 mova jmptable,r0
 add r1,r0
 mov.l @r0,r1
 jmp @r1
  mov r3,r0  ! and back to R0
 .balign 4
jmptable:
 .long case0
 .long case1
 .long case2
 .long case3

 ! copy a byte at once
8: mov.b @r0+,r1
 cmp/hs r5,r0
 bf/s 8b   ! while (r0<r5)
  mov.b r1,@(r0,r4)
 add #1,r4
9:
 add r4,r0
 rts
  sub r6,r0

case_none:
 bra 8b
  add #-1,r4

case0:
 !
 ! GHIJ KLMN OPQR -->  GHIJ KLMN OPQR
 !
 ! First, align to long word boundary
 mov r0,r3
 and r2,r3
 tst r3,r3
 bt/s 2f
  add #-1,r4
 mov #4,r2
 sub r3,r2
1: dt r2
 mov.b @r0+,r1
 bf/s 1b
  mov.b r1,@(r0,r4)
 !
2: ! Second, copy a long word at once
 add #-3,r4
 add #-3,r5
3: mov.l @r0+,r1
 cmp/hs r5,r0
 bf/s 3b
  mov.l r1,@(r0,r4)
 add #3,r5
 !
 ! Third, copy a byte at once, if necessary
 cmp/eq r5,r0
 bt/s 9b
  add #4,r4
 bra 8b
  add #-1,r4

case3:
 !
 ! GHIJ KLMN OPQR -->  ...G HIJK LMNO PQR.
 !
 ! First, align to long word boundary
 mov r0,r3
 and r2,r3
 tst r3,r3
 bt/s 2f
  add #-1,r4
 mov #4,r2
 sub r3,r2
1: dt r2
 mov.b @r0+,r1
 bf/s 1b
  mov.b r1,@(r0,r4)
 !
2: ! Second, read a long word and write a long word at once
 add #-2,r4
 mov.l @(r0,r4),r1
 add #-7,r5
 add #-4,r4
 !
#ifdef __LITTLE_ENDIAN__
 shll8 r1
3: mov r1,r3  ! JIHG
 shlr8 r3  ! xJIH
 mov.l @r0+,r1  ! NMLK
 mov r1,r2
 shll16 r2
 shll8 r2  ! Kxxx
 or r2,r3  ! KJIH
 cmp/hs r5,r0
 bf/s 3b
  mov.l r3,@(r0,r4)
#else
 shlr8 r1
3: mov r1,r3  ! GHIJ
 shll8 r3  ! HIJx
 mov.l @r0+,r1  ! KLMN
 mov r1,r2
 shlr16 r2
 shlr8 r2  ! xxxK
 or r2,r3  ! HIJK
 cmp/hs r5,r0
 bf/s 3b
  mov.l r3,@(r0,r4)
#endif
 add #7,r5
 !
 ! Third, copy a byte at once, if necessary
 cmp/eq r5,r0
 bt/s 9b
  add #7,r4
 add #-3,r0
 bra 8b
  add #-1,r4

case2:
 !
 ! GHIJ KLMN OPQR -->  ..GH IJKL MNOP QR..
 !
 ! First, align to word boundary
 tst #1,r0
 bt/s 2f
  add #-1,r4
 mov.b @r0+,r1
 mov.b r1,@(r0,r4)
 !
2: ! Second, read a word and write a word at once
 add #-1,r4
 add #-1,r5
 !
3: mov.w @r0+,r1
 cmp/hs r5,r0
 bf/s 3b
  mov.w r1,@(r0,r4)
 add #1,r5
 !
 ! Third, copy a byte at once, if necessary
 cmp/eq r5,r0
 bt/s 9b
  add #2,r4
 mov.b @r0,r1
 mov.b r1,@(r0,r4)
 bra 9b
  add #1,r0

case1:
 !
 ! GHIJ KLMN OPQR -->  .GHI JKLM NOPQ R...
 !
 ! First, align to long word boundary
 mov r0,r3
 and r2,r3
 tst r3,r3
 bt/s 2f
  add #-1,r4
 mov #4,r2
 sub r3,r2
1: dt r2
 mov.b @r0+,r1
 bf/s 1b
  mov.b r1,@(r0,r4)
 !
2: ! Second, read a long word and write a long word at once
 mov.l @(r0,r4),r1
 add #-7,r5
 add #-4,r4
 !
#ifdef __LITTLE_ENDIAN__
 shll16 r1
 shll8 r1
3: mov r1,r3  ! JIHG
 shlr16 r3
 shlr8 r3  ! xxxJ
 mov.l @r0+,r1  ! NMLK
 mov r1,r2
 shll8 r2  ! MLKx
 or r2,r3  ! MLKJ
 cmp/hs r5,r0
 bf/s 3b
  mov.l r3,@(r0,r4)
#else
 shlr16 r1
 shlr8 r1
3: mov r1,r3  ! GHIJ
 shll16 r3
 shll8 r3  ! Jxxx
 mov.l @r0+,r1  ! KLMN
 mov r1,r2
 shlr8 r2  ! xKLM
 or r2,r3  ! JKLM
 cmp/hs r5,r0
 bf/s 3b  ! while(r0<r5)
  mov.l r3,@(r0,r4)
#endif
 add #7,r5
 !
 ! Third, copy a byte at once, if necessary
 cmp/eq r5,r0
 bt/s 9b
  add #5,r4
 add #-3,r0
 bra 8b
  add #-1,r4

Messung V0.5
C=89 H=87 G=87

¤ Dauer der Verarbeitung: 0.13 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.