root/arch/alpha/lib/memmove.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /*
   3  * arch/alpha/lib/memmove.S
   4  *
   5  * Barely optimized memmove routine for Alpha EV5.
   6  *
   7  * This is hand-massaged output from the original memcpy.c.  We defer to
   8  * memcpy whenever possible; the backwards copy loops are not unrolled.
   9  */
  10 #include <asm/export.h>        
  11         .set noat
  12         .set noreorder
  13         .text
  14 
  15         .align 4
  16         .globl memmove
  17         .ent memmove
  18 memmove:
  19         ldgp $29, 0($27)
  20         unop
  21         nop
  22         .prologue 1
  23 
  24         addq $16,$18,$4
  25         addq $17,$18,$5
  26         cmpule $4,$17,$1                /*  dest + n <= src  */
  27         cmpule $5,$16,$2                /*  dest >= src + n  */
  28 
  29         bis $1,$2,$1
  30         mov $16,$0
  31         xor $16,$17,$2
  32         bne $1,memcpy                   !samegp
  33 
  34         and $2,7,$2                     /* Test for src/dest co-alignment.  */
  35         and $16,7,$1
  36         cmpule $16,$17,$3
  37         bne $3,$memmove_up              /* dest < src */
  38 
  39         and $4,7,$1
  40         bne $2,$misaligned_dn
  41         unop
  42         beq $1,$skip_aligned_byte_loop_head_dn
  43 
  44 $aligned_byte_loop_head_dn:
  45         lda $4,-1($4)
  46         lda $5,-1($5)
  47         unop
  48         ble $18,$egress
  49 
  50         ldq_u $3,0($5)
  51         ldq_u $2,0($4)
  52         lda $18,-1($18)
  53         extbl $3,$5,$1
  54 
  55         insbl $1,$4,$1
  56         mskbl $2,$4,$2
  57         bis $1,$2,$1
  58         and $4,7,$6
  59 
  60         stq_u $1,0($4)
  61         bne $6,$aligned_byte_loop_head_dn
  62 
  63 $skip_aligned_byte_loop_head_dn:
  64         lda $18,-8($18)
  65         blt $18,$skip_aligned_word_loop_dn
  66 
  67 $aligned_word_loop_dn:
  68         ldq $1,-8($5)
  69         nop
  70         lda $5,-8($5)
  71         lda $18,-8($18)
  72 
  73         stq $1,-8($4)
  74         nop
  75         lda $4,-8($4)
  76         bge $18,$aligned_word_loop_dn
  77 
  78 $skip_aligned_word_loop_dn:
  79         lda $18,8($18)
  80         bgt $18,$byte_loop_tail_dn
  81         unop
  82         ret $31,($26),1
  83 
  84         .align 4
  85 $misaligned_dn:
  86         nop
  87         fnop
  88         unop
  89         beq $18,$egress
  90 
  91 $byte_loop_tail_dn:
  92         ldq_u $3,-1($5)
  93         ldq_u $2,-1($4)
  94         lda $5,-1($5)
  95         lda $4,-1($4)
  96 
  97         lda $18,-1($18)
  98         extbl $3,$5,$1
  99         insbl $1,$4,$1
 100         mskbl $2,$4,$2
 101 
 102         bis $1,$2,$1
 103         stq_u $1,0($4)
 104         bgt $18,$byte_loop_tail_dn
 105         br $egress
 106 
 107 $memmove_up:
 108         mov $16,$4
 109         mov $17,$5
 110         bne $2,$misaligned_up
 111         beq $1,$skip_aligned_byte_loop_head_up
 112 
 113 $aligned_byte_loop_head_up:
 114         unop
 115         ble $18,$egress
 116         ldq_u $3,0($5)
 117         ldq_u $2,0($4)
 118 
 119         lda $18,-1($18)
 120         extbl $3,$5,$1
 121         insbl $1,$4,$1
 122         mskbl $2,$4,$2
 123 
 124         bis $1,$2,$1
 125         lda $5,1($5)
 126         stq_u $1,0($4)
 127         lda $4,1($4)
 128 
 129         and $4,7,$6
 130         bne $6,$aligned_byte_loop_head_up
 131 
 132 $skip_aligned_byte_loop_head_up:
 133         lda $18,-8($18)
 134         blt $18,$skip_aligned_word_loop_up
 135 
 136 $aligned_word_loop_up:
 137         ldq $1,0($5)
 138         nop
 139         lda $5,8($5)
 140         lda $18,-8($18)
 141 
 142         stq $1,0($4)
 143         nop
 144         lda $4,8($4)
 145         bge $18,$aligned_word_loop_up
 146 
 147 $skip_aligned_word_loop_up:
 148         lda $18,8($18)
 149         bgt $18,$byte_loop_tail_up
 150         unop
 151         ret $31,($26),1
 152 
 153         .align 4
 154 $misaligned_up:
 155         nop
 156         fnop
 157         unop
 158         beq $18,$egress
 159 
 160 $byte_loop_tail_up:
 161         ldq_u $3,0($5)
 162         ldq_u $2,0($4)
 163         lda $18,-1($18)
 164         extbl $3,$5,$1
 165 
 166         insbl $1,$4,$1
 167         mskbl $2,$4,$2
 168         bis $1,$2,$1
 169         stq_u $1,0($4)
 170 
 171         lda $5,1($5)
 172         lda $4,1($4)
 173         nop
 174         bgt $18,$byte_loop_tail_up
 175 
 176 $egress:
 177         ret $31,($26),1
 178         nop
 179         nop
 180         nop
 181 
 182         .end memmove
 183         EXPORT_SYMBOL(memmove)

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