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