123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- /*
- * 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 <asm/export.h>
- .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
- EXPORT_SYMBOL(memmove)
|