162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * arch/alpha/lib/memmove.S 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Barely optimized memmove routine for Alpha EV5. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * This is hand-massaged output from the original memcpy.c. We defer to 862306a36Sopenharmony_ci * memcpy whenever possible; the backwards copy loops are not unrolled. 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci#include <linux/export.h> 1162306a36Sopenharmony_ci .set noat 1262306a36Sopenharmony_ci .set noreorder 1362306a36Sopenharmony_ci .text 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci .align 4 1662306a36Sopenharmony_ci .globl memmove 1762306a36Sopenharmony_ci .ent memmove 1862306a36Sopenharmony_cimemmove: 1962306a36Sopenharmony_ci ldgp $29, 0($27) 2062306a36Sopenharmony_ci unop 2162306a36Sopenharmony_ci nop 2262306a36Sopenharmony_ci .prologue 1 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci addq $16,$18,$4 2562306a36Sopenharmony_ci addq $17,$18,$5 2662306a36Sopenharmony_ci cmpule $4,$17,$1 /* dest + n <= src */ 2762306a36Sopenharmony_ci cmpule $5,$16,$2 /* dest >= src + n */ 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci bis $1,$2,$1 3062306a36Sopenharmony_ci mov $16,$0 3162306a36Sopenharmony_ci xor $16,$17,$2 3262306a36Sopenharmony_ci bne $1,memcpy !samegp 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci and $2,7,$2 /* Test for src/dest co-alignment. */ 3562306a36Sopenharmony_ci and $16,7,$1 3662306a36Sopenharmony_ci cmpule $16,$17,$3 3762306a36Sopenharmony_ci bne $3,$memmove_up /* dest < src */ 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci and $4,7,$1 4062306a36Sopenharmony_ci bne $2,$misaligned_dn 4162306a36Sopenharmony_ci unop 4262306a36Sopenharmony_ci beq $1,$skip_aligned_byte_loop_head_dn 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci$aligned_byte_loop_head_dn: 4562306a36Sopenharmony_ci lda $4,-1($4) 4662306a36Sopenharmony_ci lda $5,-1($5) 4762306a36Sopenharmony_ci unop 4862306a36Sopenharmony_ci ble $18,$egress 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci ldq_u $3,0($5) 5162306a36Sopenharmony_ci ldq_u $2,0($4) 5262306a36Sopenharmony_ci lda $18,-1($18) 5362306a36Sopenharmony_ci extbl $3,$5,$1 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci insbl $1,$4,$1 5662306a36Sopenharmony_ci mskbl $2,$4,$2 5762306a36Sopenharmony_ci bis $1,$2,$1 5862306a36Sopenharmony_ci and $4,7,$6 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci stq_u $1,0($4) 6162306a36Sopenharmony_ci bne $6,$aligned_byte_loop_head_dn 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci$skip_aligned_byte_loop_head_dn: 6462306a36Sopenharmony_ci lda $18,-8($18) 6562306a36Sopenharmony_ci blt $18,$skip_aligned_word_loop_dn 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci$aligned_word_loop_dn: 6862306a36Sopenharmony_ci ldq $1,-8($5) 6962306a36Sopenharmony_ci nop 7062306a36Sopenharmony_ci lda $5,-8($5) 7162306a36Sopenharmony_ci lda $18,-8($18) 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci stq $1,-8($4) 7462306a36Sopenharmony_ci nop 7562306a36Sopenharmony_ci lda $4,-8($4) 7662306a36Sopenharmony_ci bge $18,$aligned_word_loop_dn 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci$skip_aligned_word_loop_dn: 7962306a36Sopenharmony_ci lda $18,8($18) 8062306a36Sopenharmony_ci bgt $18,$byte_loop_tail_dn 8162306a36Sopenharmony_ci unop 8262306a36Sopenharmony_ci ret $31,($26),1 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci .align 4 8562306a36Sopenharmony_ci$misaligned_dn: 8662306a36Sopenharmony_ci nop 8762306a36Sopenharmony_ci fnop 8862306a36Sopenharmony_ci unop 8962306a36Sopenharmony_ci beq $18,$egress 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci$byte_loop_tail_dn: 9262306a36Sopenharmony_ci ldq_u $3,-1($5) 9362306a36Sopenharmony_ci ldq_u $2,-1($4) 9462306a36Sopenharmony_ci lda $5,-1($5) 9562306a36Sopenharmony_ci lda $4,-1($4) 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci lda $18,-1($18) 9862306a36Sopenharmony_ci extbl $3,$5,$1 9962306a36Sopenharmony_ci insbl $1,$4,$1 10062306a36Sopenharmony_ci mskbl $2,$4,$2 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci bis $1,$2,$1 10362306a36Sopenharmony_ci stq_u $1,0($4) 10462306a36Sopenharmony_ci bgt $18,$byte_loop_tail_dn 10562306a36Sopenharmony_ci br $egress 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci$memmove_up: 10862306a36Sopenharmony_ci mov $16,$4 10962306a36Sopenharmony_ci mov $17,$5 11062306a36Sopenharmony_ci bne $2,$misaligned_up 11162306a36Sopenharmony_ci beq $1,$skip_aligned_byte_loop_head_up 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci$aligned_byte_loop_head_up: 11462306a36Sopenharmony_ci unop 11562306a36Sopenharmony_ci ble $18,$egress 11662306a36Sopenharmony_ci ldq_u $3,0($5) 11762306a36Sopenharmony_ci ldq_u $2,0($4) 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci lda $18,-1($18) 12062306a36Sopenharmony_ci extbl $3,$5,$1 12162306a36Sopenharmony_ci insbl $1,$4,$1 12262306a36Sopenharmony_ci mskbl $2,$4,$2 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci bis $1,$2,$1 12562306a36Sopenharmony_ci lda $5,1($5) 12662306a36Sopenharmony_ci stq_u $1,0($4) 12762306a36Sopenharmony_ci lda $4,1($4) 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci and $4,7,$6 13062306a36Sopenharmony_ci bne $6,$aligned_byte_loop_head_up 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci$skip_aligned_byte_loop_head_up: 13362306a36Sopenharmony_ci lda $18,-8($18) 13462306a36Sopenharmony_ci blt $18,$skip_aligned_word_loop_up 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci$aligned_word_loop_up: 13762306a36Sopenharmony_ci ldq $1,0($5) 13862306a36Sopenharmony_ci nop 13962306a36Sopenharmony_ci lda $5,8($5) 14062306a36Sopenharmony_ci lda $18,-8($18) 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci stq $1,0($4) 14362306a36Sopenharmony_ci nop 14462306a36Sopenharmony_ci lda $4,8($4) 14562306a36Sopenharmony_ci bge $18,$aligned_word_loop_up 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci$skip_aligned_word_loop_up: 14862306a36Sopenharmony_ci lda $18,8($18) 14962306a36Sopenharmony_ci bgt $18,$byte_loop_tail_up 15062306a36Sopenharmony_ci unop 15162306a36Sopenharmony_ci ret $31,($26),1 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci .align 4 15462306a36Sopenharmony_ci$misaligned_up: 15562306a36Sopenharmony_ci nop 15662306a36Sopenharmony_ci fnop 15762306a36Sopenharmony_ci unop 15862306a36Sopenharmony_ci beq $18,$egress 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci$byte_loop_tail_up: 16162306a36Sopenharmony_ci ldq_u $3,0($5) 16262306a36Sopenharmony_ci ldq_u $2,0($4) 16362306a36Sopenharmony_ci lda $18,-1($18) 16462306a36Sopenharmony_ci extbl $3,$5,$1 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci insbl $1,$4,$1 16762306a36Sopenharmony_ci mskbl $2,$4,$2 16862306a36Sopenharmony_ci bis $1,$2,$1 16962306a36Sopenharmony_ci stq_u $1,0($4) 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci lda $5,1($5) 17262306a36Sopenharmony_ci lda $4,1($4) 17362306a36Sopenharmony_ci nop 17462306a36Sopenharmony_ci bgt $18,$byte_loop_tail_up 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci$egress: 17762306a36Sopenharmony_ci ret $31,($26),1 17862306a36Sopenharmony_ci nop 17962306a36Sopenharmony_ci nop 18062306a36Sopenharmony_ci nop 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci .end memmove 18362306a36Sopenharmony_ci EXPORT_SYMBOL(memmove) 184