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