memmove.S (2735B)
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 18memmove: 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)