Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/alpha/lib/memmove.S
10817 views
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 memmove
16
.ent memmove
17
memmove:
18
ldgp $29, 0($27)
19
unop
20
nop
21
.prologue 1
22
23
addq $16,$18,$4
24
addq $17,$18,$5
25
cmpule $4,$17,$1 /* dest + n <= src */
26
cmpule $5,$16,$2 /* dest >= src + n */
27
28
bis $1,$2,$1
29
mov $16,$0
30
xor $16,$17,$2
31
bne $1,memcpy !samegp
32
33
and $2,7,$2 /* Test for src/dest co-alignment. */
34
and $16,7,$1
35
cmpule $16,$17,$3
36
bne $3,$memmove_up /* dest < src */
37
38
and $4,7,$1
39
bne $2,$misaligned_dn
40
unop
41
beq $1,$skip_aligned_byte_loop_head_dn
42
43
$aligned_byte_loop_head_dn:
44
lda $4,-1($4)
45
lda $5,-1($5)
46
unop
47
ble $18,$egress
48
49
ldq_u $3,0($5)
50
ldq_u $2,0($4)
51
lda $18,-1($18)
52
extbl $3,$5,$1
53
54
insbl $1,$4,$1
55
mskbl $2,$4,$2
56
bis $1,$2,$1
57
and $4,7,$6
58
59
stq_u $1,0($4)
60
bne $6,$aligned_byte_loop_head_dn
61
62
$skip_aligned_byte_loop_head_dn:
63
lda $18,-8($18)
64
blt $18,$skip_aligned_word_loop_dn
65
66
$aligned_word_loop_dn:
67
ldq $1,-8($5)
68
nop
69
lda $5,-8($5)
70
lda $18,-8($18)
71
72
stq $1,-8($4)
73
nop
74
lda $4,-8($4)
75
bge $18,$aligned_word_loop_dn
76
77
$skip_aligned_word_loop_dn:
78
lda $18,8($18)
79
bgt $18,$byte_loop_tail_dn
80
unop
81
ret $31,($26),1
82
83
.align 4
84
$misaligned_dn:
85
nop
86
fnop
87
unop
88
beq $18,$egress
89
90
$byte_loop_tail_dn:
91
ldq_u $3,-1($5)
92
ldq_u $2,-1($4)
93
lda $5,-1($5)
94
lda $4,-1($4)
95
96
lda $18,-1($18)
97
extbl $3,$5,$1
98
insbl $1,$4,$1
99
mskbl $2,$4,$2
100
101
bis $1,$2,$1
102
stq_u $1,0($4)
103
bgt $18,$byte_loop_tail_dn
104
br $egress
105
106
$memmove_up:
107
mov $16,$4
108
mov $17,$5
109
bne $2,$misaligned_up
110
beq $1,$skip_aligned_byte_loop_head_up
111
112
$aligned_byte_loop_head_up:
113
unop
114
ble $18,$egress
115
ldq_u $3,0($5)
116
ldq_u $2,0($4)
117
118
lda $18,-1($18)
119
extbl $3,$5,$1
120
insbl $1,$4,$1
121
mskbl $2,$4,$2
122
123
bis $1,$2,$1
124
lda $5,1($5)
125
stq_u $1,0($4)
126
lda $4,1($4)
127
128
and $4,7,$6
129
bne $6,$aligned_byte_loop_head_up
130
131
$skip_aligned_byte_loop_head_up:
132
lda $18,-8($18)
133
blt $18,$skip_aligned_word_loop_up
134
135
$aligned_word_loop_up:
136
ldq $1,0($5)
137
nop
138
lda $5,8($5)
139
lda $18,-8($18)
140
141
stq $1,0($4)
142
nop
143
lda $4,8($4)
144
bge $18,$aligned_word_loop_up
145
146
$skip_aligned_word_loop_up:
147
lda $18,8($18)
148
bgt $18,$byte_loop_tail_up
149
unop
150
ret $31,($26),1
151
152
.align 4
153
$misaligned_up:
154
nop
155
fnop
156
unop
157
beq $18,$egress
158
159
$byte_loop_tail_up:
160
ldq_u $3,0($5)
161
ldq_u $2,0($4)
162
lda $18,-1($18)
163
extbl $3,$5,$1
164
165
insbl $1,$4,$1
166
mskbl $2,$4,$2
167
bis $1,$2,$1
168
stq_u $1,0($4)
169
170
lda $5,1($5)
171
lda $4,1($4)
172
nop
173
bgt $18,$byte_loop_tail_up
174
175
$egress:
176
ret $31,($26),1
177
nop
178
nop
179
nop
180
181
.end memmove
182
183