0001
0002
0003
0004
0005
0006
0007
0008
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
0027 cmpule $5,$16,$2
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
0035 and $16,7,$1
0036 cmpule $16,$17,$3
0037 bne $3,$memmove_up
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)