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