183 lines · 2.7 KB · Assembly
RawDownload
/* SPDX-License-Identifier: GPL-2.0 *//* * arch/alpha/lib/memmove.S * * Barely optimized memmove routine for Alpha EV5. * * This is hand-massaged output from the original memcpy.c.  We defer to * memcpy whenever possible; the backwards copy loops are not unrolled. */#include <linux/export.h>	.set noat	.set noreorder	.text 	.align 4	.globl memmove	.ent memmovememmove:	ldgp $29, 0($27)	unop	nop	.prologue 1 	addq $16,$18,$4	addq $17,$18,$5	cmpule $4,$17,$1		/*  dest + n <= src  */	cmpule $5,$16,$2		/*  dest >= src + n  */ 	bis $1,$2,$1	mov $16,$0	xor $16,$17,$2	bne $1,memcpy			!samegp 	and $2,7,$2			/* Test for src/dest co-alignment.  */	and $16,7,$1	cmpule $16,$17,$3	bne $3,$memmove_up		/* dest < src */ 	and $4,7,$1	bne $2,$misaligned_dn	unop	beq $1,$skip_aligned_byte_loop_head_dn $aligned_byte_loop_head_dn:	lda $4,-1($4)	lda $5,-1($5)	unop	ble $18,$egress 	ldq_u $3,0($5)	ldq_u $2,0($4)	lda $18,-1($18)	extbl $3,$5,$1 	insbl $1,$4,$1	mskbl $2,$4,$2	bis $1,$2,$1	and $4,7,$6 	stq_u $1,0($4)	bne $6,$aligned_byte_loop_head_dn $skip_aligned_byte_loop_head_dn:	lda $18,-8($18)	blt $18,$skip_aligned_word_loop_dn $aligned_word_loop_dn:	ldq $1,-8($5)	nop	lda $5,-8($5)	lda $18,-8($18) 	stq $1,-8($4)	nop	lda $4,-8($4)	bge $18,$aligned_word_loop_dn $skip_aligned_word_loop_dn:	lda $18,8($18)	bgt $18,$byte_loop_tail_dn	unop	ret $31,($26),1 	.align 4$misaligned_dn:	nop	fnop	unop	beq $18,$egress $byte_loop_tail_dn:	ldq_u $3,-1($5)	ldq_u $2,-1($4)	lda $5,-1($5)	lda $4,-1($4) 	lda $18,-1($18)	extbl $3,$5,$1	insbl $1,$4,$1	mskbl $2,$4,$2 	bis $1,$2,$1	stq_u $1,0($4)	bgt $18,$byte_loop_tail_dn	br $egress $memmove_up:	mov $16,$4	mov $17,$5	bne $2,$misaligned_up	beq $1,$skip_aligned_byte_loop_head_up $aligned_byte_loop_head_up:	unop	ble $18,$egress	ldq_u $3,0($5)	ldq_u $2,0($4) 	lda $18,-1($18)	extbl $3,$5,$1	insbl $1,$4,$1	mskbl $2,$4,$2 	bis $1,$2,$1	lda $5,1($5)	stq_u $1,0($4)	lda $4,1($4) 	and $4,7,$6	bne $6,$aligned_byte_loop_head_up $skip_aligned_byte_loop_head_up:	lda $18,-8($18)	blt $18,$skip_aligned_word_loop_up $aligned_word_loop_up:	ldq $1,0($5)	nop	lda $5,8($5)	lda $18,-8($18) 	stq $1,0($4)	nop	lda $4,8($4)	bge $18,$aligned_word_loop_up $skip_aligned_word_loop_up:	lda $18,8($18)	bgt $18,$byte_loop_tail_up	unop	ret $31,($26),1 	.align 4$misaligned_up:	nop	fnop	unop	beq $18,$egress $byte_loop_tail_up:	ldq_u $3,0($5)	ldq_u $2,0($4)	lda $18,-1($18)	extbl $3,$5,$1 	insbl $1,$4,$1	mskbl $2,$4,$2	bis $1,$2,$1	stq_u $1,0($4) 	lda $5,1($5)	lda $4,1($4)	nop	bgt $18,$byte_loop_tail_up $egress:	ret $31,($26),1	nop	nop	nop 	.end memmove	EXPORT_SYMBOL(memmove)