|  | /* | 
|  | * 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. | 
|  | */ | 
|  |  | 
|  | .set noat | 
|  | .set noreorder | 
|  | .text | 
|  |  | 
|  | .align 4 | 
|  | .globl memmove | 
|  | .ent memmove | 
|  | memmove: | 
|  | 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 |