1 /* SPDX-License-Identifier: GPL-2.0 */ 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 2 /* 3 * arch/alpha/lib/memmove.S 3 * arch/alpha/lib/memmove.S 4 * 4 * 5 * Barely optimized memmove routine for Alpha 5 * Barely optimized memmove routine for Alpha EV5. 6 * 6 * 7 * This is hand-massaged output from the origi 7 * This is hand-massaged output from the original memcpy.c. We defer to 8 * memcpy whenever possible; the backwards cop 8 * memcpy whenever possible; the backwards copy loops are not unrolled. 9 */ 9 */ 10 #include <linux/export.h> !! 10 #include <asm/export.h> 11 .set noat 11 .set noat 12 .set noreorder 12 .set noreorder 13 .text 13 .text 14 14 15 .align 4 15 .align 4 16 .globl memmove 16 .globl memmove 17 .ent memmove 17 .ent memmove 18 memmove: 18 memmove: 19 ldgp $29, 0($27) 19 ldgp $29, 0($27) 20 unop 20 unop 21 nop 21 nop 22 .prologue 1 22 .prologue 1 23 23 24 addq $16,$18,$4 24 addq $16,$18,$4 25 addq $17,$18,$5 25 addq $17,$18,$5 26 cmpule $4,$17,$1 /* de 26 cmpule $4,$17,$1 /* dest + n <= src */ 27 cmpule $5,$16,$2 /* de 27 cmpule $5,$16,$2 /* dest >= src + n */ 28 28 29 bis $1,$2,$1 29 bis $1,$2,$1 30 mov $16,$0 30 mov $16,$0 31 xor $16,$17,$2 31 xor $16,$17,$2 32 bne $1,memcpy !sameg 32 bne $1,memcpy !samegp 33 33 34 and $2,7,$2 /* Tes 34 and $2,7,$2 /* Test for src/dest co-alignment. */ 35 and $16,7,$1 35 and $16,7,$1 36 cmpule $16,$17,$3 36 cmpule $16,$17,$3 37 bne $3,$memmove_up /* des 37 bne $3,$memmove_up /* dest < src */ 38 38 39 and $4,7,$1 39 and $4,7,$1 40 bne $2,$misaligned_dn 40 bne $2,$misaligned_dn 41 unop 41 unop 42 beq $1,$skip_aligned_byte_loop_head_dn 42 beq $1,$skip_aligned_byte_loop_head_dn 43 43 44 $aligned_byte_loop_head_dn: 44 $aligned_byte_loop_head_dn: 45 lda $4,-1($4) 45 lda $4,-1($4) 46 lda $5,-1($5) 46 lda $5,-1($5) 47 unop 47 unop 48 ble $18,$egress 48 ble $18,$egress 49 49 50 ldq_u $3,0($5) 50 ldq_u $3,0($5) 51 ldq_u $2,0($4) 51 ldq_u $2,0($4) 52 lda $18,-1($18) 52 lda $18,-1($18) 53 extbl $3,$5,$1 53 extbl $3,$5,$1 54 54 55 insbl $1,$4,$1 55 insbl $1,$4,$1 56 mskbl $2,$4,$2 56 mskbl $2,$4,$2 57 bis $1,$2,$1 57 bis $1,$2,$1 58 and $4,7,$6 58 and $4,7,$6 59 59 60 stq_u $1,0($4) 60 stq_u $1,0($4) 61 bne $6,$aligned_byte_loop_head_dn 61 bne $6,$aligned_byte_loop_head_dn 62 62 63 $skip_aligned_byte_loop_head_dn: 63 $skip_aligned_byte_loop_head_dn: 64 lda $18,-8($18) 64 lda $18,-8($18) 65 blt $18,$skip_aligned_word_loop_dn 65 blt $18,$skip_aligned_word_loop_dn 66 66 67 $aligned_word_loop_dn: 67 $aligned_word_loop_dn: 68 ldq $1,-8($5) 68 ldq $1,-8($5) 69 nop 69 nop 70 lda $5,-8($5) 70 lda $5,-8($5) 71 lda $18,-8($18) 71 lda $18,-8($18) 72 72 73 stq $1,-8($4) 73 stq $1,-8($4) 74 nop 74 nop 75 lda $4,-8($4) 75 lda $4,-8($4) 76 bge $18,$aligned_word_loop_dn 76 bge $18,$aligned_word_loop_dn 77 77 78 $skip_aligned_word_loop_dn: 78 $skip_aligned_word_loop_dn: 79 lda $18,8($18) 79 lda $18,8($18) 80 bgt $18,$byte_loop_tail_dn 80 bgt $18,$byte_loop_tail_dn 81 unop 81 unop 82 ret $31,($26),1 82 ret $31,($26),1 83 83 84 .align 4 84 .align 4 85 $misaligned_dn: 85 $misaligned_dn: 86 nop 86 nop 87 fnop 87 fnop 88 unop 88 unop 89 beq $18,$egress 89 beq $18,$egress 90 90 91 $byte_loop_tail_dn: 91 $byte_loop_tail_dn: 92 ldq_u $3,-1($5) 92 ldq_u $3,-1($5) 93 ldq_u $2,-1($4) 93 ldq_u $2,-1($4) 94 lda $5,-1($5) 94 lda $5,-1($5) 95 lda $4,-1($4) 95 lda $4,-1($4) 96 96 97 lda $18,-1($18) 97 lda $18,-1($18) 98 extbl $3,$5,$1 98 extbl $3,$5,$1 99 insbl $1,$4,$1 99 insbl $1,$4,$1 100 mskbl $2,$4,$2 100 mskbl $2,$4,$2 101 101 102 bis $1,$2,$1 102 bis $1,$2,$1 103 stq_u $1,0($4) 103 stq_u $1,0($4) 104 bgt $18,$byte_loop_tail_dn 104 bgt $18,$byte_loop_tail_dn 105 br $egress 105 br $egress 106 106 107 $memmove_up: 107 $memmove_up: 108 mov $16,$4 108 mov $16,$4 109 mov $17,$5 109 mov $17,$5 110 bne $2,$misaligned_up 110 bne $2,$misaligned_up 111 beq $1,$skip_aligned_byte_loop_head_up 111 beq $1,$skip_aligned_byte_loop_head_up 112 112 113 $aligned_byte_loop_head_up: 113 $aligned_byte_loop_head_up: 114 unop 114 unop 115 ble $18,$egress 115 ble $18,$egress 116 ldq_u $3,0($5) 116 ldq_u $3,0($5) 117 ldq_u $2,0($4) 117 ldq_u $2,0($4) 118 118 119 lda $18,-1($18) 119 lda $18,-1($18) 120 extbl $3,$5,$1 120 extbl $3,$5,$1 121 insbl $1,$4,$1 121 insbl $1,$4,$1 122 mskbl $2,$4,$2 122 mskbl $2,$4,$2 123 123 124 bis $1,$2,$1 124 bis $1,$2,$1 125 lda $5,1($5) 125 lda $5,1($5) 126 stq_u $1,0($4) 126 stq_u $1,0($4) 127 lda $4,1($4) 127 lda $4,1($4) 128 128 129 and $4,7,$6 129 and $4,7,$6 130 bne $6,$aligned_byte_loop_head_up 130 bne $6,$aligned_byte_loop_head_up 131 131 132 $skip_aligned_byte_loop_head_up: 132 $skip_aligned_byte_loop_head_up: 133 lda $18,-8($18) 133 lda $18,-8($18) 134 blt $18,$skip_aligned_word_loop_up 134 blt $18,$skip_aligned_word_loop_up 135 135 136 $aligned_word_loop_up: 136 $aligned_word_loop_up: 137 ldq $1,0($5) 137 ldq $1,0($5) 138 nop 138 nop 139 lda $5,8($5) 139 lda $5,8($5) 140 lda $18,-8($18) 140 lda $18,-8($18) 141 141 142 stq $1,0($4) 142 stq $1,0($4) 143 nop 143 nop 144 lda $4,8($4) 144 lda $4,8($4) 145 bge $18,$aligned_word_loop_up 145 bge $18,$aligned_word_loop_up 146 146 147 $skip_aligned_word_loop_up: 147 $skip_aligned_word_loop_up: 148 lda $18,8($18) 148 lda $18,8($18) 149 bgt $18,$byte_loop_tail_up 149 bgt $18,$byte_loop_tail_up 150 unop 150 unop 151 ret $31,($26),1 151 ret $31,($26),1 152 152 153 .align 4 153 .align 4 154 $misaligned_up: 154 $misaligned_up: 155 nop 155 nop 156 fnop 156 fnop 157 unop 157 unop 158 beq $18,$egress 158 beq $18,$egress 159 159 160 $byte_loop_tail_up: 160 $byte_loop_tail_up: 161 ldq_u $3,0($5) 161 ldq_u $3,0($5) 162 ldq_u $2,0($4) 162 ldq_u $2,0($4) 163 lda $18,-1($18) 163 lda $18,-1($18) 164 extbl $3,$5,$1 164 extbl $3,$5,$1 165 165 166 insbl $1,$4,$1 166 insbl $1,$4,$1 167 mskbl $2,$4,$2 167 mskbl $2,$4,$2 168 bis $1,$2,$1 168 bis $1,$2,$1 169 stq_u $1,0($4) 169 stq_u $1,0($4) 170 170 171 lda $5,1($5) 171 lda $5,1($5) 172 lda $4,1($4) 172 lda $4,1($4) 173 nop 173 nop 174 bgt $18,$byte_loop_tail_up 174 bgt $18,$byte_loop_tail_up 175 175 176 $egress: 176 $egress: 177 ret $31,($26),1 177 ret $31,($26),1 178 nop 178 nop 179 nop 179 nop 180 nop 180 nop 181 181 182 .end memmove 182 .end memmove 183 EXPORT_SYMBOL(memmove) 183 EXPORT_SYMBOL(memmove)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.