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[RUC] 79 mov ar.ruc = r1 80 mov r2 = ar.ruc 81 ;; 82 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 116 mov r2 = b0 117 ;; 118 119// CFM 120 br.wtop.sptk L 121 fadd f2 = f1, f32 // read from rotating register region 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 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 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% 293 ld8.c.clr r1 = [r1] // no DV here 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 358// PR%, 1 - 15 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 374(p63) add r3 = r1, r2 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) 385 ld8 r2 = [r1] 386 ;; 387 388// PSR.be 389 rum (1<<1) 390 ld8 r2 = [r1] 391 ;; 392 393// PSR.bn 394 bsw.0 395 mov r1 = r15 // no DV here, since gr < 16 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 412 mov r2 = ar.ruc 413 ;; 414 epc 415 mov ar.ruc = r3 416 ;; 417 epc 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) 462 mov r1 = psr 463 ;; 464 465// PSR.dt 466 rsm (1<<17) 467 ld8 r1 = [r1] 468 ;; 469 470// PSR.ed (rfi is the only writer) 471// PSR.i 472 ssm (1<<14) 473 mov r1 = psr 474 ;; 475 476// PSR.ia (no DV semantics) 477// PSR.ic 478 ssm (1<<13) 479 mov r1 = psr 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 502 mov r1 = psr 503 ;; 504 505// PSR.mfl 506 mov f2 = f3 507 mov r1 = psr 508 ;; 509 510// PSR.pk 511 rsm (1<<15) 512 ld8 r1 = [r1] 513 ;; 514 rsm (1<<15) 515 mov r2 = psr 516 ;; 517 518// PSR.pp 519 rsm (1<<21) 520 mov r1 = psr 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) 532 mov r1 = ar.itc 533 ;; 534 rsm (1<<23) 535 mov r1 = ar.ruc 536 ;; 537 ssm (1<<23) 538 mov r1 = ar.ec // no DV here 539 ;; 540 541// PSR.sp 542 ssm (1<<20) 543 mov r1 = pmd[r1] 544 ;; 545 ssm (1<<20) 546 rum 0xff 547 ;; 548 ssm (1<<20) 549 mov r1 = rr[r1] 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) 560 mov r1 = psr.um 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 ;; 571 srlz.d 572 ;; 573// RSE 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 ;; 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 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 619L: 620 br.ret.sptk rp 621 622// PSR.vm. New in SDM 2.2 623 vmsw.0 624 ld8 r2 = [r1] 625 ;; 626