opcodes/
[binutils.git] / gas / testsuite / gas / ia64 / dv-raw-err.s
blob13a1d3a42542edcb3b1ff4126f7fc327e154145b
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]
9 mov ar.bspstore = r1
10 mov r0 = ar.bsp
13 // AR[BSPSTORE]
14 mov ar.bspstore = r2
15 mov r3 = ar.bspstore
18 // AR[CCV]
19 mov ar.ccv = r4
20 cmpxchg8.acq r5 = [r6],r7,ar.ccv
23 // AR[EC]
24 br.wtop.sptk L
25 mov r8 = ar.ec
28 // AR[FPSR].sf0.controls
29 fsetc.s0 0x7f, 0x0f
30 fpcmp.eq.s0 f2 = f3, f4
33 // AR[FPSR].sf1.controls
34 fsetc.s1 0x7f, 0x0f
35 fpcmp.eq.s1 f2 = f3, f4
38 // AR[FPSR].sf2.controls
39 fsetc.s2 0x7f, 0x0f
40 fpcmp.eq.s2 f2 = f3, f4
43 // AR[FPSR].sf3.controls
44 fsetc.s3 0x7f, 0x0f
45 fpcmp.eq.s3 f2 = f3, f4
48 // AR[FPSR].sf0.flags
49 fpcmp.eq.s0 f2 = f3, f4
50 fchkf.s0 L
53 // AR[FPSR].sf1.flags
54 fpcmp.eq.s1 f2 = f3, f4
55 fchkf.s1 L
58 // AR[FPSR].sf2.flags
59 fpcmp.eq.s2 f2 = f3, f4
60 fchkf.s2 L
63 // AR[FPSR].sf3.flags
64 fpcmp.eq.s3 f2 = f3, f4
65 fchkf.s3 L
68 // AR[FPSR].traps/rv
69 mov ar.fpsr = r0
70 fcmp.eq.s3 p1, p2 = f5, f6
73 // AR[ITC]
74 mov ar.itc = r1
75 mov r2 = ar.itc
78 // AR[K]
79 mov ar.k1 = r3
80 br.ia.sptk b0
83 // AR[LC]
84 br.cloop.sptk L
85 mov r4 = ar.lc
88 // AR[PFS]
89 mov ar.pfs = r5
90 epc
92 // AR[RNAT]
93 mov ar.bspstore = r8
94 mov r9 = ar.rnat
97 // AR[RSC]
98 mov ar.rsc = r10
99 mov r11 = ar.rnat
102 // AR[UNAT]
103 mov ar.unat = r12
104 ld8.fill r13 = [r14]
107 // AR%
109 // BR%
110 mov b0 = r0
111 mov r0 = b0
114 // CFM
115 br.wtop.sptk L
116 fadd f0 = f1, f32 // read from rotating register region
119 // CR[CMCV]
120 mov cr.cmcv = r1
121 mov r2 = cr.cmcv
124 // CR[DCR]
125 mov cr.dcr = r3
126 ld8.s r4 = [r5]
129 // CR[EOI]
131 // CR[GPTA]
132 mov cr.gpta = r6
133 thash r7 = r8
135 srlz.d
137 // CR[IFA]
138 mov cr.ifa = r9
139 itc.i r10
142 // CR[IFS]
143 mov cr.ifs = r11
144 mov r12 = cr.ifs
147 // CR[IHA]
148 mov cr.iha = r13
149 mov r14 = cr.iha
152 // CR[IIM]
153 mov cr.iim = r15
154 mov r16 = cr.iim
157 // CR[IIP]
158 mov cr.iip = r17
162 // CR[IIPA]
163 mov cr.iipa = r19
164 mov r20 = cr.iipa
167 // CR[IPSR]
168 mov cr.ipsr = r21
172 // CR[IRR%]
173 mov r22 = cr.ivr
174 mov r23 = cr.irr0
177 // CR[ISR]
178 mov cr.isr = r24
179 mov r25 = cr.isr
182 // CR[ITIR]
183 mov cr.itir = r26
184 itc.d r27
187 // CR[ITM]
188 mov cr.itm = r28
189 mov r29 = cr.itm
192 // CR[ITV]
193 mov cr.itv = r0
194 mov r1 = cr.itv
197 // CR[IVR] (all writes are implicit in other resource usage)
199 // CR[IVA]
200 mov cr.iva = r0
201 mov r1 = cr.iva
204 // CR[LID]
205 mov cr.lid = r0
206 mov r1 = cr.lid
208 srlz.d
210 // CR[LRR%]
211 mov cr.lrr0 = r0
212 mov r1 = cr.lrr0
215 // CR[PMV]
216 mov cr.pmv = r0
217 mov r1 = cr.pmv
220 // CR[PTA]
221 mov cr.pta = r0
222 thash r1 = r2
225 // CR[TPR]
226 mov cr.tpr = r0
227 mov r1 = cr.ivr // data
229 srlz.d
230 mov cr.tpr = r2
231 mov psr.l = r3 // other
233 srlz.d
235 // DBR#
236 mov dbr[r0] = r1
237 mov r2 = dbr[r3]
239 srlz.d
240 mov dbr[r4] = r5
241 probe.r r6 = r7, r8
243 srlz.d
245 // DTC
246 ptc.e r0
247 fc r1
249 srlz.d
250 itr.i itr[r2] = r3
251 ptc.e r4
254 // DTC_LIMIT/ITC_LIMIT
255 ptc.g r0, r1 // NOTE: GAS automatically emits stops after
256 ptc.ga r2, r3 // ptc.g/ptc.ga, so this conflict is no
257 ;; // longer possible in GAS-generated assembly
258 srlz.d
260 // DTR
261 itr.d dtr[r0] = r1
262 tak r2 = r3
264 srlz.d
265 ptr.d r4, r5
266 tpa r6 = r7
268 srlz.d
270 // FR%
271 ldfs.c.clr f2 = [r1]
272 mov f3 = f2 // no DV here
274 mov f4 = f5
275 mov f6 = f4
278 // GR%
279 ld8.c.clr r0 = [r1] // no DV here
280 mov r2 = r0
282 mov r3 = r4
283 mov r5 = r3
286 // IBR#
287 mov ibr[r0] = r1
288 mov r2 = ibr[r3]
291 // InService
292 mov cr.eoi = r0
293 mov r1 = cr.ivr
295 srlz.d
296 mov r2 = cr.ivr
297 mov r3 = cr.ivr // several DVs
299 mov cr.eoi = r4
300 mov cr.eoi = r5
303 // ITC
304 ptc.e r0
307 srlz.i
310 // ITC_LIMIT (see DTC_LIMIT)
312 // ITR
313 itr.i itr[r0] = r1
316 srlz.i
319 // PKR#
320 mov pkr[r0] = r1
321 probe.r r2 = r3, r4
323 srlz.d
324 mov pkr[r5] = r6
325 mov r7 = pkr[r8]
327 srlz.d
329 // PMC#
330 mov pmc[r0] = r1
331 mov r2 = pmc[r3]
333 srlz.d
334 mov pmc[r4] = r5
335 mov r6 = pmd[r7]
337 srlz.d
339 // PMD#
340 mov pmd[r0] = r1
341 mov r2 = pmd[r3]
344 // PR%, 1 - 15
345 cmp.eq p1, p2 = r0, r1 // pr-writer/pr-reader-nobr-nomovpr
346 (p1) add r2 = r3, r4
348 mov pr = r5, 0xffff // mov-to-pr-allreg/pr-reader-nobr-nomovpr
349 (p2) add r6 = r7, r8
351 fcmp.eq p5, p6 = f2, f3 // pr-writer-fp/pr-reader-br
352 (p5) br.cond.sptk b0
354 cmp.eq p7, p8 = r11, r12
355 (p7) br.cond.sptk b1 // no DV here
358 // PR63
359 br.wtop.sptk L
360 (p63) add r0 = r1, r2
362 fcmp.eq p62, p63 = f2, f3
363 (p63) add r3 = r4, r5
365 cmp.eq p62, p63 = r6, r7 // no DV here
366 (p63) br.cond.sptk b0
369 // PSR.ac
370 rum (1<<3)
371 ld8 r0 = [r1]
374 // PSR.be
375 rum (1<<1)
376 ld8 r0 = [r1]
379 // PSR.bn
380 bsw.0
381 mov r0 = r15 // no DV here, since gr < 16
383 bsw.1 // GAS automatically emits a stop after bsw.n
384 mov r1 = r16 // so this conflict is avoided
387 // PSR.cpl
389 st8 [r0] = r1
392 mov r2 = ar.itc
395 mov ar.itc = r3
398 mov ar.rsc = r4
401 mov ar.k0 = r5
404 mov r6 = pmd[r7]
407 mov ar.bsp = r8 // no DV here
410 mov r9 = ar.bsp // no DV here
413 mov cr.ifa = r10 // any mov-to/from-cr is a DV
416 mov r11 = cr.eoi // any mov-to/from-cr is a DV
419 // PSR.da (rfi is the only writer)
420 // PSR.db (also ac,be,dt,pk)
421 mov psr.l = r0
422 ld8 r1 = [r2]
424 srlz.d
426 // PSR.dd (rfi is the only writer)
428 // PSR.dfh
429 mov psr.l = r0
430 mov f64 = f65
432 srlz.d
434 // PSR.dfl
435 mov psr.l = r0
436 mov f3 = f4
438 srlz.d
440 // PSR.di
441 rsm (1<<22)
442 mov r0 = psr
445 // PSR.dt
446 rsm (1<<17)
447 ld8 r0 = [r1]
450 // PSR.ed (rfi is the only writer)
451 // PSR.i
452 ssm (1<<14)
453 mov r0 = psr
456 // PSR.ia (no DV semantics)
457 // PSR.ic
458 ssm (1<<13)
459 mov r0 = psr
461 srlz.d
462 rsm (1<<13)
463 mov r1 = cr.itir
465 srlz.d
466 rsm (1<<13)
467 mov r1 = cr.irr0 // no DV here
469 srlz.d
471 // PSR.id (rfi is the only writer)
472 // PSR.is (br.ia and rfi are the only writers)
473 // PSR.it (rfi is the only writer)
474 // PSR.lp
475 mov psr.l = r0
476 br.ret.sptk b0
479 // PSR.mc (rfi is the only writer)
480 // PSR.mfh
481 mov f32 = f33
482 mov r0 = psr
485 // PSR.mfl
486 mov f2 = f3
487 mov r0 = psr
490 // PSR.pk
491 rsm (1<<15)
492 ld8 r0 = [r1]
494 rsm (1<<15)
495 mov r2 = psr
498 // PSR.pp
499 rsm (1<<21)
500 mov r0 = psr
503 // PSR.ri (no DV semantics)
504 // PSR.rt
505 mov psr.l = r0
506 flushrs
508 srlz.d
510 // PSR.si
511 rsm (1<<23)
512 mov r0 = ar.itc
514 ssm (1<<23)
515 mov r1 = ar.ec // no DV here
518 // PSR.sp
519 ssm (1<<20)
520 mov r0 = pmd[r1]
522 ssm (1<<20)
523 rum 0xff
525 ssm (1<<20)
526 mov r0 = rr[r1]
529 // PSR.ss (rfi is the only writer)
530 // PSR.tb
531 mov psr.l = r0
532 chk.s r0, L
535 // PSR.up
536 rsm (1<<2)
537 mov r0 = psr.um
539 srlz.d
541 // RR#
542 mov rr[r0] = r1
543 ld8 r2 = [r0] // data
545 mov rr[r4] = r5
546 mov r6 = rr[r7] // impliedf
548 srlz.d
550 // RSE
552 // GR%, additional cases
553 // addl
554 mov r2 = r32
555 addl r3 = 12345, r2 // impliedf, IA64_OPND_R3_2
557 // postinc
558 ld8 r2 = [r32], 8
559 mov r8 = r32 // impliedf
562 // PR%, 16 - 62
563 cmp.eq p21, p22 = r0, r1 // pr-writer/pr-reader-nobr-nomovpr
564 (p21) add r2 = r3, r4
566 mov pr = r5, 0x1ffff // mov-to-pr-allreg/pr-reader-nobr-nomovpr
567 (p22) add r6 = r7, r8
569 mov pr.rot = 0xffff0000 // mov-to-pr-rotreg/pr-reader-nobr-nomovpr
570 (p23) add r9 = r10, r11
572 fcmp.eq p25, p26 = f2, f3 // pr-writer-fp/pr-reader-br
573 (p25) br.cond.sptk b0
575 cmp.eq p27, p28 = r11, r12
576 (p27) br.cond.sptk b1 // no DV here
579 // postinc
580 st8 [r6] = r8, 16
581 add r7 = 8, r6 // impliedf
583 ldfd f14 = [r6], 16
584 add r7 = 8, r6 // impliedf
586 stfd [r6] = f14, 16
587 add r7 = r8, r6
589 add r6 = 8, r7
590 ld8 r8 = [r6], 16 // impliedf, WAW
592 add r6 = 8, r7
593 ldfd f14 = [r6], 16 // impliedf, WAW