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