Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * arch/alpha/lib/memmove.S
0004  *
0005  * Barely optimized memmove routine for Alpha EV5.
0006  *
0007  * This is hand-massaged output from the original memcpy.c.  We defer to
0008  * memcpy whenever possible; the backwards copy loops are not unrolled.
0009  */
0010 #include <asm/export.h>        
0011     .set noat
0012     .set noreorder
0013     .text
0014 
0015     .align 4
0016     .globl memmove
0017     .ent memmove
0018 memmove:
0019     ldgp $29, 0($27)
0020     unop
0021     nop
0022     .prologue 1
0023 
0024     addq $16,$18,$4
0025     addq $17,$18,$5
0026     cmpule $4,$17,$1        /*  dest + n <= src  */
0027     cmpule $5,$16,$2        /*  dest >= src + n  */
0028 
0029     bis $1,$2,$1
0030     mov $16,$0
0031     xor $16,$17,$2
0032     bne $1,memcpy           !samegp
0033 
0034     and $2,7,$2         /* Test for src/dest co-alignment.  */
0035     and $16,7,$1
0036     cmpule $16,$17,$3
0037     bne $3,$memmove_up      /* dest < src */
0038 
0039     and $4,7,$1
0040     bne $2,$misaligned_dn
0041     unop
0042     beq $1,$skip_aligned_byte_loop_head_dn
0043 
0044 $aligned_byte_loop_head_dn:
0045     lda $4,-1($4)
0046     lda $5,-1($5)
0047     unop
0048     ble $18,$egress
0049 
0050     ldq_u $3,0($5)
0051     ldq_u $2,0($4)
0052     lda $18,-1($18)
0053     extbl $3,$5,$1
0054 
0055     insbl $1,$4,$1
0056     mskbl $2,$4,$2
0057     bis $1,$2,$1
0058     and $4,7,$6
0059 
0060     stq_u $1,0($4)
0061     bne $6,$aligned_byte_loop_head_dn
0062 
0063 $skip_aligned_byte_loop_head_dn:
0064     lda $18,-8($18)
0065     blt $18,$skip_aligned_word_loop_dn
0066 
0067 $aligned_word_loop_dn:
0068     ldq $1,-8($5)
0069     nop
0070     lda $5,-8($5)
0071     lda $18,-8($18)
0072 
0073     stq $1,-8($4)
0074     nop
0075     lda $4,-8($4)
0076     bge $18,$aligned_word_loop_dn
0077 
0078 $skip_aligned_word_loop_dn:
0079     lda $18,8($18)
0080     bgt $18,$byte_loop_tail_dn
0081     unop
0082     ret $31,($26),1
0083 
0084     .align 4
0085 $misaligned_dn:
0086     nop
0087     fnop
0088     unop
0089     beq $18,$egress
0090 
0091 $byte_loop_tail_dn:
0092     ldq_u $3,-1($5)
0093     ldq_u $2,-1($4)
0094     lda $5,-1($5)
0095     lda $4,-1($4)
0096 
0097     lda $18,-1($18)
0098     extbl $3,$5,$1
0099     insbl $1,$4,$1
0100     mskbl $2,$4,$2
0101 
0102     bis $1,$2,$1
0103     stq_u $1,0($4)
0104     bgt $18,$byte_loop_tail_dn
0105     br $egress
0106 
0107 $memmove_up:
0108     mov $16,$4
0109     mov $17,$5
0110     bne $2,$misaligned_up
0111     beq $1,$skip_aligned_byte_loop_head_up
0112 
0113 $aligned_byte_loop_head_up:
0114     unop
0115     ble $18,$egress
0116     ldq_u $3,0($5)
0117     ldq_u $2,0($4)
0118 
0119     lda $18,-1($18)
0120     extbl $3,$5,$1
0121     insbl $1,$4,$1
0122     mskbl $2,$4,$2
0123 
0124     bis $1,$2,$1
0125     lda $5,1($5)
0126     stq_u $1,0($4)
0127     lda $4,1($4)
0128 
0129     and $4,7,$6
0130     bne $6,$aligned_byte_loop_head_up
0131 
0132 $skip_aligned_byte_loop_head_up:
0133     lda $18,-8($18)
0134     blt $18,$skip_aligned_word_loop_up
0135 
0136 $aligned_word_loop_up:
0137     ldq $1,0($5)
0138     nop
0139     lda $5,8($5)
0140     lda $18,-8($18)
0141 
0142     stq $1,0($4)
0143     nop
0144     lda $4,8($4)
0145     bge $18,$aligned_word_loop_up
0146 
0147 $skip_aligned_word_loop_up:
0148     lda $18,8($18)
0149     bgt $18,$byte_loop_tail_up
0150     unop
0151     ret $31,($26),1
0152 
0153     .align 4
0154 $misaligned_up:
0155     nop
0156     fnop
0157     unop
0158     beq $18,$egress
0159 
0160 $byte_loop_tail_up:
0161     ldq_u $3,0($5)
0162     ldq_u $2,0($4)
0163     lda $18,-1($18)
0164     extbl $3,$5,$1
0165 
0166     insbl $1,$4,$1
0167     mskbl $2,$4,$2
0168     bis $1,$2,$1
0169     stq_u $1,0($4)
0170 
0171     lda $5,1($5)
0172     lda $4,1($4)
0173     nop
0174     bgt $18,$byte_loop_tail_up
0175 
0176 $egress:
0177     ret $31,($26),1
0178     nop
0179     nop
0180     nop
0181 
0182     .end memmove
0183     EXPORT_SYMBOL(memmove)