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