Commit | Line | Data |
---|---|---|
7d8e00cf RS |
1 | .macro check2 insn |
2 | mflo $2 | |
3 | \insn $3,$3 | |
4 | .endm | |
5 | ||
6 | .macro check3 insn | |
7 | mfhi $2 | |
8 | \insn $0,$3,$3 | |
9 | .endm | |
10 | ||
11 | .macro main func | |
12 | ||
13 | .ent \func | |
14 | .type \func,@function | |
15 | \func: | |
16 | ||
17 | # PART A | |
18 | # | |
65b02341 | 19 | # Check that mfhis and mflos in .set noreorder blocks are considered. |
7d8e00cf RS |
20 | |
21 | .set noreorder | |
22 | mfhi $2 | |
23 | .set reorder | |
24 | mult $3,$3 | |
25 | ||
26 | .set noreorder | |
27 | mflo $2 | |
28 | .set reorder | |
29 | mult $3,$3 | |
30 | ||
31 | # PART B | |
32 | # | |
33 | # Check for simple instances. | |
34 | ||
35 | mfhi $2 | |
36 | mult $3,$3 # 4 nops | |
37 | ||
38 | mfhi $2 | |
39 | addiu $3,1 | |
40 | mult $4,$4 # 3 nops | |
41 | ||
42 | mfhi $2 | |
43 | addiu $3,1 | |
44 | addiu $4,1 | |
45 | mult $5,$5 # 2 nops | |
46 | ||
47 | mfhi $2 | |
48 | addiu $3,1 | |
49 | addiu $4,1 | |
50 | addiu $5,1 | |
51 | mult $6,$6 # 1 nop | |
52 | ||
53 | mfhi $2 | |
54 | addiu $3,1 | |
55 | addiu $4,1 | |
56 | addiu $5,1 | |
57 | addiu $6,1 | |
58 | mult $7,$7 # 0 nops | |
59 | ||
60 | # PART C | |
61 | # | |
62 | # Check that no nops are inserted after the result has been read. | |
63 | ||
64 | mfhi $2 | |
65 | addiu $2,1 | |
66 | addiu $3,1 | |
67 | addiu $4,1 | |
68 | mult $5,$5 | |
69 | ||
70 | mfhi $2 | |
71 | addiu $3,1 | |
72 | addiu $2,1 | |
73 | addiu $4,1 | |
74 | mult $5,$5 | |
75 | ||
76 | mfhi $2 | |
77 | addiu $3,1 | |
78 | addiu $4,1 | |
79 | addiu $2,1 | |
80 | mult $5,$5 | |
81 | ||
82 | mfhi $2 | |
83 | addiu $3,1 | |
84 | addiu $4,1 | |
85 | addiu $5,1 | |
86 | mult $2,$2 | |
87 | ||
88 | # PART D | |
89 | # | |
90 | # Check that we still insert the usual interlocking nops in cases | |
91 | # where the VR4130 errata doesn't apply. | |
92 | ||
93 | mfhi $2 | |
94 | mult $2,$2 # 2 nops | |
95 | ||
96 | mfhi $2 | |
97 | addiu $2,1 | |
98 | mult $3,$3 # 1 nop | |
99 | ||
100 | mfhi $2 | |
101 | addiu $3,1 | |
102 | mult $2,$2 # 1 nop | |
103 | ||
104 | # PART E | |
105 | # | |
106 | # Check for branches whose targets might be affected. | |
107 | ||
108 | mfhi $2 | |
109 | bnez $3,1f # 2 nops for normal mode, 3 for mips16 | |
110 | ||
111 | mfhi $2 | |
112 | addiu $3,1 | |
113 | bnez $3,1f # 1 nop for normal mode, 2 for mips16 | |
114 | ||
115 | mfhi $2 | |
116 | addiu $3,1 | |
117 | addiu $3,1 | |
118 | bnez $3,1f # 0 nops for normal mode, 1 for mips16 | |
119 | ||
120 | mfhi $2 | |
121 | addiu $3,1 | |
122 | addiu $3,1 | |
123 | addiu $3,1 | |
124 | bnez $3,1f # 0 nops | |
125 | ||
126 | # PART F | |
127 | # | |
128 | # As above, but with no dependencies between the branch and | |
129 | # the previous instruction. The final branch can use the | |
130 | # preceding addiu as its delay slot. | |
131 | ||
132 | mfhi $2 | |
133 | addiu $3,1 | |
134 | bnez $4,1f # 1 nop for normal mode, 2 for mips16 | |
135 | ||
136 | mfhi $2 | |
137 | addiu $3,1 | |
138 | addiu $4,1 | |
139 | bnez $5,1f # 0 nops for normal mode, 1 for mips16 | |
140 | ||
141 | mfhi $2 | |
142 | addiu $3,1 | |
143 | addiu $4,1 | |
144 | addiu $5,1 | |
145 | bnez $6,1f # 0 nops, fill delay slot in normal mode | |
146 | 1: | |
147 | ||
148 | # PART G | |
149 | # | |
150 | # Like part B, but check that intervening .set noreorders don't | |
151 | # affect the number of nops. | |
152 | ||
153 | mfhi $2 | |
154 | .set noreorder | |
155 | addiu $3,1 | |
156 | .set reorder | |
157 | mult $4,$4 # 3 nops | |
158 | ||
159 | mfhi $2 | |
160 | .set noreorder | |
161 | addiu $3,1 | |
162 | .set reorder | |
163 | addiu $4,1 | |
164 | mult $5,$5 # 2 nops | |
165 | ||
166 | mfhi $2 | |
167 | addiu $3,1 | |
168 | .set noreorder | |
169 | addiu $4,1 | |
170 | .set reorder | |
171 | mult $5,$5 # 2 nops | |
172 | ||
173 | mfhi $2 | |
174 | .set noreorder | |
175 | addiu $3,1 | |
176 | addiu $4,1 | |
177 | .set reorder | |
178 | mult $5,$5 # 2 nops | |
179 | ||
180 | mfhi $2 | |
181 | addiu $3,1 | |
182 | .set noreorder | |
183 | addiu $4,1 | |
184 | .set reorder | |
185 | addiu $5,1 | |
186 | mult $6,$6 # 1 nop | |
187 | ||
188 | mfhi $2 | |
189 | .set noreorder | |
190 | addiu $3,1 | |
191 | addiu $4,1 | |
192 | addiu $5,1 | |
193 | .set reorder | |
194 | mult $6,$6 # 1 nop | |
195 | ||
196 | mfhi $2 | |
197 | .set noreorder | |
198 | addiu $3,1 | |
199 | addiu $4,1 | |
200 | addiu $5,1 | |
201 | addiu $6,1 | |
202 | .set reorder | |
203 | mult $7,$7 # 0 nops | |
204 | ||
205 | # PART H | |
206 | # | |
207 | # Like part B, but the mult occurs in a .set noreorder block. | |
208 | ||
209 | mfhi $2 | |
210 | .set noreorder | |
211 | mult $3,$3 # 4 nops | |
212 | .set reorder | |
213 | ||
214 | mfhi $2 | |
215 | .set noreorder | |
216 | addiu $3,1 | |
217 | mult $4,$4 # 3 nops | |
218 | .set reorder | |
219 | ||
220 | mfhi $2 | |
221 | addiu $3,1 | |
222 | .set noreorder | |
223 | addiu $4,1 | |
224 | mult $5,$5 # 2 nops | |
225 | .set reorder | |
226 | ||
227 | mfhi $2 | |
228 | .set noreorder | |
229 | addiu $3,1 | |
230 | addiu $4,1 | |
231 | addiu $5,1 | |
232 | mult $6,$6 # 1 nop | |
233 | .set reorder | |
234 | ||
235 | mfhi $2 | |
236 | .set noreorder | |
237 | addiu $3,1 | |
238 | addiu $4,1 | |
239 | addiu $5,1 | |
240 | addiu $6,1 | |
241 | mult $7,$7 # 0 nops | |
242 | .set reorder | |
243 | ||
244 | # PART I | |
245 | # | |
246 | # Check every affected multiplication and division instruction. | |
247 | ||
248 | check2 mult | |
249 | check2 multu | |
250 | check2 dmult | |
251 | check2 dmultu | |
252 | ||
253 | check3 div | |
254 | check3 divu | |
255 | check3 ddiv | |
256 | check3 ddivu | |
257 | ||
258 | .end \func | |
259 | .endm | |
260 | ||
261 | .set nomips16 | |
262 | main foo | |
263 | ||
264 | # PART J | |
265 | # | |
266 | # Check every affected multiply-accumulate instruction. | |
267 | ||
268 | check3 macc | |
269 | check3 macchi | |
270 | check3 macchis | |
271 | check3 macchiu | |
272 | check3 macchius | |
273 | check3 maccs | |
274 | check3 maccu | |
275 | check3 maccus | |
276 | ||
277 | check3 dmacc | |
278 | check3 dmacchi | |
279 | check3 dmacchis | |
280 | check3 dmacchiu | |
281 | check3 dmacchius | |
282 | check3 dmaccs | |
283 | check3 dmaccu | |
284 | check3 dmaccus | |
285 | ||
286 | # PART K | |
287 | # | |
288 | # Check that mtlo and mthi are exempt from the VR4130 errata, | |
289 | # although the usual interlocking delay applies. | |
290 | ||
291 | mflo $2 | |
292 | mtlo $3 | |
293 | ||
294 | mflo $2 | |
295 | mthi $3 | |
296 | ||
297 | mfhi $2 | |
298 | mtlo $3 | |
299 | ||
300 | mfhi $2 | |
301 | mthi $3 | |
302 | ||
303 | .set mips16 | |
304 | main bar |