]>
Commit | Line | Data |
---|---|---|
800eeca4 JW |
1 | // |
2 | // Detect RAW violations. Cases taken from DV tables. | |
3 | // This test is by no means complete but tries to hit the things that are | |
4 | // likely to be missed. | |
5 | // | |
6 | .text | |
7 | .explicit | |
8 | // AR[BSP] | |
4b09e828 JB |
9 | mov ar.bspstore = r0 |
10 | mov r1 = ar.bsp | |
800eeca4 JW |
11 | ;; |
12 | ||
13 | // AR[BSPSTORE] | |
14 | mov ar.bspstore = r2 | |
15 | mov r3 = ar.bspstore | |
16 | ;; | |
17 | ||
18 | // AR[CCV] | |
19 | mov ar.ccv = r4 | |
20 | cmpxchg8.acq r5 = [r6],r7,ar.ccv | |
21 | ;; | |
22 | ||
23 | // AR[EC] | |
24 | br.wtop.sptk L | |
25 | mov r8 = ar.ec | |
26 | ;; | |
27 | ||
28 | // AR[FPSR].sf0.controls | |
29 | fsetc.s0 0x7f, 0x0f | |
30 | fpcmp.eq.s0 f2 = f3, f4 | |
31 | ;; | |
32 | ||
33 | // AR[FPSR].sf1.controls | |
34 | fsetc.s1 0x7f, 0x0f | |
35 | fpcmp.eq.s1 f2 = f3, f4 | |
36 | ;; | |
37 | ||
38 | // AR[FPSR].sf2.controls | |
39 | fsetc.s2 0x7f, 0x0f | |
40 | fpcmp.eq.s2 f2 = f3, f4 | |
41 | ;; | |
42 | ||
43 | // AR[FPSR].sf3.controls | |
44 | fsetc.s3 0x7f, 0x0f | |
45 | fpcmp.eq.s3 f2 = f3, f4 | |
46 | ;; | |
47 | ||
48 | // AR[FPSR].sf0.flags | |
49 | fpcmp.eq.s0 f2 = f3, f4 | |
50 | fchkf.s0 L | |
51 | ;; | |
52 | ||
53 | // AR[FPSR].sf1.flags | |
54 | fpcmp.eq.s1 f2 = f3, f4 | |
55 | fchkf.s1 L | |
56 | ;; | |
57 | ||
58 | // AR[FPSR].sf2.flags | |
59 | fpcmp.eq.s2 f2 = f3, f4 | |
60 | fchkf.s2 L | |
61 | ;; | |
62 | ||
63 | // AR[FPSR].sf3.flags | |
64 | fpcmp.eq.s3 f2 = f3, f4 | |
65 | fchkf.s3 L | |
66 | ;; | |
67 | ||
68 | // AR[FPSR].traps/rv | |
69 | mov ar.fpsr = r0 | |
70 | fcmp.eq.s3 p1, p2 = f5, f6 | |
71 | ;; | |
72 | ||
73 | // AR[ITC] | |
74 | mov ar.itc = r1 | |
75 | mov r2 = ar.itc | |
76 | ;; | |
77 | ||
4f8631b1 L |
78 | // AR[RUC] |
79 | mov ar.ruc = r1 | |
80 | mov r2 = ar.ruc | |
81 | ;; | |
82 | ||
800eeca4 JW |
83 | // AR[K] |
84 | mov ar.k1 = r3 | |
85 | br.ia.sptk b0 | |
86 | ;; | |
87 | ||
88 | // AR[LC] | |
89 | br.cloop.sptk L | |
90 | mov r4 = ar.lc | |
91 | ;; | |
92 | ||
93 | // AR[PFS] | |
94 | mov ar.pfs = r5 | |
95 | epc | |
96 | ||
97 | // AR[RNAT] | |
98 | mov ar.bspstore = r8 | |
99 | mov r9 = ar.rnat | |
100 | ;; | |
101 | ||
102 | // AR[RSC] | |
103 | mov ar.rsc = r10 | |
104 | mov r11 = ar.rnat | |
105 | ;; | |
106 | ||
107 | // AR[UNAT] | |
108 | mov ar.unat = r12 | |
109 | ld8.fill r13 = [r14] | |
110 | ;; | |
111 | ||
112 | // AR% | |
113 | ||
114 | // BR% | |
115 | mov b0 = r0 | |
4b09e828 | 116 | mov r2 = b0 |
800eeca4 JW |
117 | ;; |
118 | ||
119 | // CFM | |
120 | br.wtop.sptk L | |
4b09e828 | 121 | fadd f2 = f1, f32 // read from rotating register region |
800eeca4 JW |
122 | ;; |
123 | ||
124 | // CR[CMCV] | |
125 | mov cr.cmcv = r1 | |
126 | mov r2 = cr.cmcv | |
127 | ;; | |
128 | ||
129 | // CR[DCR] | |
130 | mov cr.dcr = r3 | |
131 | ld8.s r4 = [r5] | |
132 | ;; | |
133 | ||
134 | // CR[EOI] | |
135 | ||
136 | // CR[GPTA] | |
137 | mov cr.gpta = r6 | |
138 | thash r7 = r8 | |
139 | ;; | |
140 | srlz.d | |
141 | ||
142 | // CR[IFA] | |
143 | mov cr.ifa = r9 | |
144 | itc.i r10 | |
145 | ;; | |
146 | ||
147 | // CR[IFS] | |
148 | mov cr.ifs = r11 | |
149 | mov r12 = cr.ifs | |
150 | ;; | |
151 | ||
152 | // CR[IHA] | |
153 | mov cr.iha = r13 | |
154 | mov r14 = cr.iha | |
155 | ;; | |
156 | ||
1ca35711 L |
157 | // CR[IIB%] |
158 | mov cr.iib0 = r15 | |
159 | mov r16 = cr.iib0 | |
160 | ;; | |
161 | ||
162 | mov cr.iib1 = r15 | |
163 | mov r16 = cr.iib1 | |
164 | ;; | |
165 | ||
800eeca4 JW |
166 | // CR[IIM] |
167 | mov cr.iim = r15 | |
168 | mov r16 = cr.iim | |
169 | ;; | |
170 | ||
171 | // CR[IIP] | |
172 | mov cr.iip = r17 | |
173 | rfi | |
174 | ;; | |
175 | ||
176 | // CR[IIPA] | |
177 | mov cr.iipa = r19 | |
178 | mov r20 = cr.iipa | |
179 | ;; | |
180 | ||
181 | // CR[IPSR] | |
182 | mov cr.ipsr = r21 | |
183 | rfi | |
184 | ;; | |
185 | ||
186 | // CR[IRR%] | |
187 | mov r22 = cr.ivr | |
188 | mov r23 = cr.irr0 | |
189 | ;; | |
190 | ||
191 | // CR[ISR] | |
192 | mov cr.isr = r24 | |
193 | mov r25 = cr.isr | |
194 | ;; | |
195 | ||
196 | // CR[ITIR] | |
197 | mov cr.itir = r26 | |
198 | itc.d r27 | |
199 | ;; | |
200 | ||
201 | // CR[ITM] | |
202 | mov cr.itm = r28 | |
203 | mov r29 = cr.itm | |
204 | ;; | |
205 | ||
206 | // CR[ITV] | |
207 | mov cr.itv = r0 | |
208 | mov r1 = cr.itv | |
209 | ;; | |
210 | ||
211 | // CR[IVR] (all writes are implicit in other resource usage) | |
212 | ||
213 | // CR[IVA] | |
214 | mov cr.iva = r0 | |
215 | mov r1 = cr.iva | |
216 | ;; | |
217 | ||
218 | // CR[LID] | |
219 | mov cr.lid = r0 | |
220 | mov r1 = cr.lid | |
221 | ;; | |
222 | srlz.d | |
223 | ||
224 | // CR[LRR%] | |
225 | mov cr.lrr0 = r0 | |
226 | mov r1 = cr.lrr0 | |
227 | ;; | |
228 | ||
229 | // CR[PMV] | |
230 | mov cr.pmv = r0 | |
231 | mov r1 = cr.pmv | |
232 | ;; | |
233 | ||
234 | // CR[PTA] | |
235 | mov cr.pta = r0 | |
236 | thash r1 = r2 | |
237 | ;; | |
238 | ||
239 | // CR[TPR] | |
240 | mov cr.tpr = r0 | |
241 | mov r1 = cr.ivr // data | |
242 | ;; | |
243 | srlz.d | |
244 | mov cr.tpr = r2 | |
245 | mov psr.l = r3 // other | |
246 | ;; | |
247 | srlz.d | |
248 | ||
249 | // DBR# | |
250 | mov dbr[r0] = r1 | |
251 | mov r2 = dbr[r3] | |
252 | ;; | |
253 | srlz.d | |
254 | mov dbr[r4] = r5 | |
255 | probe.r r6 = r7, r8 | |
256 | ;; | |
257 | srlz.d | |
258 | ||
259 | // DTC | |
260 | ptc.e r0 | |
261 | fc r1 | |
262 | ;; | |
263 | srlz.d | |
264 | itr.i itr[r2] = r3 | |
265 | ptc.e r4 | |
266 | ;; | |
267 | ||
268 | // DTC_LIMIT/ITC_LIMIT | |
269 | ptc.g r0, r1 // NOTE: GAS automatically emits stops after | |
270 | ptc.ga r2, r3 // ptc.g/ptc.ga, so this conflict is no | |
271 | ;; // longer possible in GAS-generated assembly | |
272 | srlz.d | |
273 | ||
274 | // DTR | |
275 | itr.d dtr[r0] = r1 | |
276 | tak r2 = r3 | |
277 | ;; | |
278 | srlz.d | |
279 | ptr.d r4, r5 | |
280 | tpa r6 = r7 | |
281 | ;; | |
282 | srlz.d | |
283 | ||
284 | // FR% | |
285 | ldfs.c.clr f2 = [r1] | |
286 | mov f3 = f2 // no DV here | |
287 | ;; | |
288 | mov f4 = f5 | |
289 | mov f6 = f4 | |
290 | ;; | |
291 | ||
292 | // GR% | |
4b09e828 | 293 | ld8.c.clr r1 = [r1] // no DV here |
800eeca4 JW |
294 | mov r2 = r0 |
295 | ;; | |
296 | mov r3 = r4 | |
297 | mov r5 = r3 | |
298 | ;; | |
299 | ||
300 | // IBR# | |
301 | mov ibr[r0] = r1 | |
302 | mov r2 = ibr[r3] | |
303 | ;; | |
304 | ||
305 | // InService | |
306 | mov cr.eoi = r0 | |
307 | mov r1 = cr.ivr | |
308 | ;; | |
309 | srlz.d | |
310 | mov r2 = cr.ivr | |
311 | mov r3 = cr.ivr // several DVs | |
312 | ;; | |
313 | mov cr.eoi = r4 | |
314 | mov cr.eoi = r5 | |
315 | ;; | |
316 | ||
317 | // ITC | |
318 | ptc.e r0 | |
319 | epc | |
320 | ;; | |
321 | srlz.i | |
322 | ;; | |
323 | ||
324 | // ITC_LIMIT (see DTC_LIMIT) | |
325 | ||
326 | // ITR | |
327 | itr.i itr[r0] = r1 | |
328 | epc | |
329 | ;; | |
330 | srlz.i | |
331 | ;; | |
332 | ||
333 | // PKR# | |
334 | mov pkr[r0] = r1 | |
335 | probe.r r2 = r3, r4 | |
336 | ;; | |
337 | srlz.d | |
338 | mov pkr[r5] = r6 | |
339 | mov r7 = pkr[r8] | |
340 | ;; | |
341 | srlz.d | |
342 | ||
343 | // PMC# | |
344 | mov pmc[r0] = r1 | |
345 | mov r2 = pmc[r3] | |
346 | ;; | |
347 | srlz.d | |
348 | mov pmc[r4] = r5 | |
349 | mov r6 = pmd[r7] | |
350 | ;; | |
351 | srlz.d | |
352 | ||
353 | // PMD# | |
354 | mov pmd[r0] = r1 | |
355 | mov r2 = pmd[r3] | |
356 | ;; | |
357 | ||
139368c9 | 358 | // PR%, 1 - 15 |
800eeca4 JW |
359 | cmp.eq p1, p2 = r0, r1 // pr-writer/pr-reader-nobr-nomovpr |
360 | (p1) add r2 = r3, r4 | |
361 | ;; | |
362 | mov pr = r5, 0xffff // mov-to-pr-allreg/pr-reader-nobr-nomovpr | |
363 | (p2) add r6 = r7, r8 | |
364 | ;; | |
365 | fcmp.eq p5, p6 = f2, f3 // pr-writer-fp/pr-reader-br | |
366 | (p5) br.cond.sptk b0 | |
367 | ;; | |
368 | cmp.eq p7, p8 = r11, r12 | |
369 | (p7) br.cond.sptk b1 // no DV here | |
370 | ;; | |
371 | ||
372 | // PR63 | |
373 | br.wtop.sptk L | |
4b09e828 | 374 | (p63) add r3 = r1, r2 |
800eeca4 JW |
375 | ;; |
376 | fcmp.eq p62, p63 = f2, f3 | |
377 | (p63) add r3 = r4, r5 | |
378 | ;; | |
379 | cmp.eq p62, p63 = r6, r7 // no DV here | |
380 | (p63) br.cond.sptk b0 | |
381 | ;; | |
382 | ||
383 | // PSR.ac | |
384 | rum (1<<3) | |
4b09e828 | 385 | ld8 r2 = [r1] |
800eeca4 JW |
386 | ;; |
387 | ||
388 | // PSR.be | |
389 | rum (1<<1) | |
4b09e828 | 390 | ld8 r2 = [r1] |
800eeca4 JW |
391 | ;; |
392 | ||
393 | // PSR.bn | |
394 | bsw.0 | |
4b09e828 | 395 | mov r1 = r15 // no DV here, since gr < 16 |
800eeca4 JW |
396 | ;; |
397 | bsw.1 // GAS automatically emits a stop after bsw.n | |
398 | mov r1 = r16 // so this conflict is avoided | |
399 | ;; | |
400 | ||
401 | // PSR.cpl | |
402 | epc | |
403 | st8 [r0] = r1 | |
404 | ;; | |
405 | epc | |
406 | mov r2 = ar.itc | |
407 | ;; | |
408 | epc | |
409 | mov ar.itc = r3 | |
410 | ;; | |
411 | epc | |
4f8631b1 L |
412 | mov r2 = ar.ruc |
413 | ;; | |
414 | epc | |
415 | mov ar.ruc = r3 | |
416 | ;; | |
417 | epc | |
800eeca4 JW |
418 | mov ar.rsc = r4 |
419 | ;; | |
420 | epc | |
421 | mov ar.k0 = r5 | |
422 | ;; | |
423 | epc | |
424 | mov r6 = pmd[r7] | |
425 | ;; | |
426 | epc | |
427 | mov ar.bsp = r8 // no DV here | |
428 | ;; | |
429 | epc | |
430 | mov r9 = ar.bsp // no DV here | |
431 | ;; | |
432 | epc | |
433 | mov cr.ifa = r10 // any mov-to/from-cr is a DV | |
434 | ;; | |
435 | epc | |
436 | mov r11 = cr.eoi // any mov-to/from-cr is a DV | |
437 | ;; | |
438 | ||
439 | // PSR.da (rfi is the only writer) | |
440 | // PSR.db (also ac,be,dt,pk) | |
441 | mov psr.l = r0 | |
442 | ld8 r1 = [r2] | |
443 | ;; | |
444 | srlz.d | |
445 | ||
446 | // PSR.dd (rfi is the only writer) | |
447 | ||
448 | // PSR.dfh | |
449 | mov psr.l = r0 | |
450 | mov f64 = f65 | |
451 | ;; | |
452 | srlz.d | |
453 | ||
454 | // PSR.dfl | |
455 | mov psr.l = r0 | |
456 | mov f3 = f4 | |
457 | ;; | |
458 | srlz.d | |
459 | ||
460 | // PSR.di | |
461 | rsm (1<<22) | |
4b09e828 | 462 | mov r1 = psr |
800eeca4 JW |
463 | ;; |
464 | ||
465 | // PSR.dt | |
466 | rsm (1<<17) | |
4b09e828 | 467 | ld8 r1 = [r1] |
800eeca4 JW |
468 | ;; |
469 | ||
470 | // PSR.ed (rfi is the only writer) | |
471 | // PSR.i | |
472 | ssm (1<<14) | |
4b09e828 | 473 | mov r1 = psr |
800eeca4 JW |
474 | ;; |
475 | ||
476 | // PSR.ia (no DV semantics) | |
477 | // PSR.ic | |
478 | ssm (1<<13) | |
4b09e828 | 479 | mov r1 = psr |
800eeca4 JW |
480 | ;; |
481 | srlz.d | |
482 | rsm (1<<13) | |
483 | mov r1 = cr.itir | |
484 | ;; | |
485 | srlz.d | |
486 | rsm (1<<13) | |
487 | mov r1 = cr.irr0 // no DV here | |
488 | ;; | |
489 | srlz.d | |
490 | ||
491 | // PSR.id (rfi is the only writer) | |
492 | // PSR.is (br.ia and rfi are the only writers) | |
493 | // PSR.it (rfi is the only writer) | |
494 | // PSR.lp | |
495 | mov psr.l = r0 | |
496 | br.ret.sptk b0 | |
497 | ;; | |
498 | ||
499 | // PSR.mc (rfi is the only writer) | |
500 | // PSR.mfh | |
501 | mov f32 = f33 | |
4b09e828 | 502 | mov r1 = psr |
800eeca4 JW |
503 | ;; |
504 | ||
505 | // PSR.mfl | |
506 | mov f2 = f3 | |
4b09e828 | 507 | mov r1 = psr |
800eeca4 JW |
508 | ;; |
509 | ||
510 | // PSR.pk | |
511 | rsm (1<<15) | |
4b09e828 | 512 | ld8 r1 = [r1] |
800eeca4 JW |
513 | ;; |
514 | rsm (1<<15) | |
515 | mov r2 = psr | |
516 | ;; | |
517 | ||
518 | // PSR.pp | |
519 | rsm (1<<21) | |
4b09e828 | 520 | mov r1 = psr |
800eeca4 JW |
521 | ;; |
522 | ||
523 | // PSR.ri (no DV semantics) | |
524 | // PSR.rt | |
525 | mov psr.l = r0 | |
526 | flushrs | |
527 | ;; | |
528 | srlz.d | |
529 | ||
530 | // PSR.si | |
531 | rsm (1<<23) | |
4b09e828 | 532 | mov r1 = ar.itc |
800eeca4 | 533 | ;; |
4f8631b1 L |
534 | rsm (1<<23) |
535 | mov r1 = ar.ruc | |
536 | ;; | |
800eeca4 JW |
537 | ssm (1<<23) |
538 | mov r1 = ar.ec // no DV here | |
539 | ;; | |
540 | ||
541 | // PSR.sp | |
542 | ssm (1<<20) | |
4b09e828 | 543 | mov r1 = pmd[r1] |
800eeca4 JW |
544 | ;; |
545 | ssm (1<<20) | |
546 | rum 0xff | |
547 | ;; | |
548 | ssm (1<<20) | |
4b09e828 | 549 | mov r1 = rr[r1] |
800eeca4 JW |
550 | ;; |
551 | ||
552 | // PSR.ss (rfi is the only writer) | |
553 | // PSR.tb | |
554 | mov psr.l = r0 | |
555 | chk.s r0, L | |
556 | ;; | |
557 | ||
558 | // PSR.up | |
559 | rsm (1<<2) | |
4b09e828 | 560 | mov r1 = psr.um |
800eeca4 JW |
561 | ;; |
562 | srlz.d | |
563 | ||
564 | // RR# | |
565 | mov rr[r0] = r1 | |
566 | ld8 r2 = [r0] // data | |
567 | ;; | |
568 | mov rr[r4] = r5 | |
569 | mov r6 = rr[r7] // impliedf | |
570 | ;; | |
50b81f19 JW |
571 | srlz.d |
572 | ;; | |
800eeca4 | 573 | // RSE |
50b81f19 JW |
574 | |
575 | // GR%, additional cases | |
576 | // addl | |
577 | mov r2 = r32 | |
578 | addl r3 = 12345, r2 // impliedf, IA64_OPND_R3_2 | |
579 | ;; | |
580 | // postinc | |
581 | ld8 r2 = [r32], 8 | |
582 | mov r8 = r32 // impliedf | |
583 | ;; | |
139368c9 JW |
584 | |
585 | // PR%, 16 - 62 | |
586 | cmp.eq p21, p22 = r0, r1 // pr-writer/pr-reader-nobr-nomovpr | |
587 | (p21) add r2 = r3, r4 | |
588 | ;; | |
589 | mov pr = r5, 0x1ffff // mov-to-pr-allreg/pr-reader-nobr-nomovpr | |
590 | (p22) add r6 = r7, r8 | |
591 | ;; | |
592 | mov pr.rot = 0xffff0000 // mov-to-pr-rotreg/pr-reader-nobr-nomovpr | |
593 | (p23) add r9 = r10, r11 | |
594 | ;; | |
595 | fcmp.eq p25, p26 = f2, f3 // pr-writer-fp/pr-reader-br | |
596 | (p25) br.cond.sptk b0 | |
597 | ;; | |
598 | cmp.eq p27, p28 = r11, r12 | |
599 | (p27) br.cond.sptk b1 // no DV here | |
600 | ;; | |
601 | ||
bad9ceea JJ |
602 | // postinc |
603 | st8 [r6] = r8, 16 | |
604 | add r7 = 8, r6 // impliedf | |
605 | ;; | |
606 | ldfd f14 = [r6], 16 | |
607 | add r7 = 8, r6 // impliedf | |
608 | ;; | |
609 | stfd [r6] = f14, 16 | |
610 | add r7 = r8, r6 | |
611 | ;; | |
612 | add r6 = 8, r7 | |
613 | ld8 r8 = [r6], 16 // impliedf, WAW | |
614 | ;; | |
615 | add r6 = 8, r7 | |
616 | ldfd f14 = [r6], 16 // impliedf, WAW | |
617 | ;; | |
618 | ||
619 | L: | |
7f3dfb9c L |
620 | br.ret.sptk rp |
621 | ||
622 | // PSR.vm. New in SDM 2.2 | |
623 | vmsw.0 | |
624 | ld8 r2 = [r1] | |
625 | ;; |