linux/arch/sh/lib/movmem.S
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0
   2
   3   Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
   4   2004, 2005, 2006
   5   Free Software Foundation, Inc.
   6*/
   7
   8!! libgcc routines for the Renesas / SuperH SH CPUs.
   9!! Contributed by Steve Chamberlain.
  10!! sac@cygnus.com
  11
  12!! ashiftrt_r4_x, ___ashrsi3, ___ashlsi3, ___lshrsi3 routines
  13!! recoded in assembly by Toshiyasu Morita
  14!! tm@netcom.com
  15
  16/* SH2 optimizations for ___ashrsi3, ___ashlsi3, ___lshrsi3 and
  17   ELF local label prefixes by J"orn Rennecke
  18   amylaar@cygnus.com  */
  19
  20        .text
  21        .balign 4
  22        .global __movmem
  23        .global __movstr
  24        .set __movstr, __movmem 
  25        /* This would be a lot simpler if r6 contained the byte count
  26           minus 64, and we wouldn't be called here for a byte count of 64.  */
  27__movmem:
  28        sts.l   pr,@-r15
  29        shll2   r6
  30        bsr     __movmemSI52+2
  31        mov.l   @(48,r5),r0
  32        .balign 4
  33movmem_loop: /* Reached with rts */
  34        mov.l   @(60,r5),r0
  35        add     #-64,r6
  36        mov.l   r0,@(60,r4)
  37        tst     r6,r6
  38        mov.l   @(56,r5),r0
  39        bt      movmem_done
  40        mov.l   r0,@(56,r4)
  41        cmp/pl  r6
  42        mov.l   @(52,r5),r0
  43        add     #64,r5
  44        mov.l   r0,@(52,r4)
  45        add     #64,r4
  46        bt      __movmemSI52
  47! done all the large groups, do the remainder
  48! jump to movmem+
  49        mova    __movmemSI4+4,r0
  50        add     r6,r0
  51        jmp     @r0
  52movmem_done: ! share slot insn, works out aligned.
  53        lds.l   @r15+,pr
  54        mov.l   r0,@(56,r4)
  55        mov.l   @(52,r5),r0
  56        rts
  57        mov.l   r0,@(52,r4)
  58        .balign 4
  59
  60        .global __movmemSI64
  61        .global __movstrSI64
  62        .set    __movstrSI64, __movmemSI64
  63__movmemSI64:
  64        mov.l   @(60,r5),r0
  65        mov.l   r0,@(60,r4)
  66        .global __movmemSI60
  67        .global __movstrSI60
  68        .set    __movstrSI60, __movmemSI60
  69__movmemSI60:
  70        mov.l   @(56,r5),r0
  71        mov.l   r0,@(56,r4)
  72        .global __movmemSI56
  73        .global __movstrSI56
  74        .set    __movstrSI56, __movmemSI56
  75__movmemSI56:
  76        mov.l   @(52,r5),r0
  77        mov.l   r0,@(52,r4)
  78        .global __movmemSI52
  79        .global __movstrSI52
  80        .set    __movstrSI52, __movmemSI52
  81__movmemSI52:
  82        mov.l   @(48,r5),r0
  83        mov.l   r0,@(48,r4)
  84        .global __movmemSI48
  85        .global __movstrSI48
  86        .set    __movstrSI48, __movmemSI48
  87__movmemSI48:
  88        mov.l   @(44,r5),r0
  89        mov.l   r0,@(44,r4)
  90        .global __movmemSI44
  91        .global __movstrSI44
  92        .set    __movstrSI44, __movmemSI44
  93__movmemSI44:
  94        mov.l   @(40,r5),r0
  95        mov.l   r0,@(40,r4)
  96        .global __movmemSI40
  97        .global __movstrSI40
  98        .set    __movstrSI40, __movmemSI40
  99__movmemSI40:
 100        mov.l   @(36,r5),r0
 101        mov.l   r0,@(36,r4)
 102        .global __movmemSI36
 103        .global __movstrSI36
 104        .set    __movstrSI36, __movmemSI36
 105__movmemSI36:
 106        mov.l   @(32,r5),r0
 107        mov.l   r0,@(32,r4)
 108        .global __movmemSI32
 109        .global __movstrSI32
 110        .set    __movstrSI32, __movmemSI32
 111__movmemSI32:
 112        mov.l   @(28,r5),r0
 113        mov.l   r0,@(28,r4)
 114        .global __movmemSI28
 115        .global __movstrSI28
 116        .set    __movstrSI28, __movmemSI28
 117__movmemSI28:
 118        mov.l   @(24,r5),r0
 119        mov.l   r0,@(24,r4)
 120        .global __movmemSI24
 121        .global __movstrSI24
 122        .set    __movstrSI24, __movmemSI24
 123__movmemSI24:
 124        mov.l   @(20,r5),r0
 125        mov.l   r0,@(20,r4)
 126        .global __movmemSI20
 127        .global __movstrSI20
 128        .set    __movstrSI20, __movmemSI20
 129__movmemSI20:
 130        mov.l   @(16,r5),r0
 131        mov.l   r0,@(16,r4)
 132        .global __movmemSI16
 133        .global __movstrSI16
 134        .set    __movstrSI16, __movmemSI16
 135__movmemSI16:
 136        mov.l   @(12,r5),r0
 137        mov.l   r0,@(12,r4)
 138        .global __movmemSI12
 139        .global __movstrSI12
 140        .set    __movstrSI12, __movmemSI12
 141__movmemSI12:
 142        mov.l   @(8,r5),r0
 143        mov.l   r0,@(8,r4)
 144        .global __movmemSI8
 145        .global __movstrSI8
 146        .set    __movstrSI8, __movmemSI8
 147__movmemSI8:
 148        mov.l   @(4,r5),r0
 149        mov.l   r0,@(4,r4)
 150        .global __movmemSI4
 151        .global __movstrSI4
 152        .set    __movstrSI4, __movmemSI4
 153__movmemSI4:
 154        mov.l   @(0,r5),r0
 155        rts
 156        mov.l   r0,@(0,r4)
 157
 158        .global __movmem_i4_even
 159        .global __movstr_i4_even
 160        .set    __movstr_i4_even, __movmem_i4_even
 161
 162        .global __movmem_i4_odd
 163        .global __movstr_i4_odd
 164        .set    __movstr_i4_odd, __movmem_i4_odd
 165
 166        .global __movmemSI12_i4
 167        .global __movstrSI12_i4
 168        .set    __movstrSI12_i4, __movmemSI12_i4
 169
 170        .p2align        5
 171L_movmem_2mod4_end:
 172        mov.l   r0,@(16,r4)
 173        rts
 174        mov.l   r1,@(20,r4)
 175
 176        .p2align        2
 177
 178__movmem_i4_even:
 179        mov.l   @r5+,r0
 180        bra     L_movmem_start_even
 181        mov.l   @r5+,r1
 182
 183__movmem_i4_odd:
 184        mov.l   @r5+,r1
 185        add     #-4,r4
 186        mov.l   @r5+,r2
 187        mov.l   @r5+,r3
 188        mov.l   r1,@(4,r4)
 189        mov.l   r2,@(8,r4)
 190
 191L_movmem_loop:
 192        mov.l   r3,@(12,r4)
 193        dt      r6
 194        mov.l   @r5+,r0
 195        bt/s    L_movmem_2mod4_end
 196        mov.l   @r5+,r1
 197        add     #16,r4
 198L_movmem_start_even:
 199        mov.l   @r5+,r2
 200        mov.l   @r5+,r3
 201        mov.l   r0,@r4
 202        dt      r6
 203        mov.l   r1,@(4,r4)
 204        bf/s    L_movmem_loop
 205        mov.l   r2,@(8,r4)
 206        rts
 207        mov.l   r3,@(12,r4)
 208
 209        .p2align        4
 210__movmemSI12_i4:
 211        mov.l   @r5,r0
 212        mov.l   @(4,r5),r1
 213        mov.l   @(8,r5),r2
 214        mov.l   r0,@r4
 215        mov.l   r1,@(4,r4)
 216        rts
 217        mov.l   r2,@(8,r4)
 218