1 //==- SystemZInstrFormats.td - SystemZ Instruction Formats --*- tablegen -*-==// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 //===----------------------------------------------------------------------===// 11 // Basic SystemZ instruction definition 12 //===----------------------------------------------------------------------===// 13 14 class InstSystemZ<int size, dag outs, dag ins, string asmstr, 15 list<dag> pattern> : Instruction { 16 let Namespace = "SystemZ"; 17 18 dag OutOperandList = outs; 19 dag InOperandList = ins; 20 let Size = size; 21 let Pattern = pattern; 22 let AsmString = asmstr; 23 24 let hasSideEffects = 0; 25 let mayLoad = 0; 26 let mayStore = 0; 27 28 // Some instructions come in pairs, one having a 12-bit displacement 29 // and the other having a 20-bit displacement. Both instructions in 30 // the pair have the same DispKey and their DispSizes are "12" and "20" 31 // respectively. 32 string DispKey = ""; 33 string DispSize = "none"; 34 35 // Many register-based <INSN>R instructions have a memory-based <INSN> 36 // counterpart. OpKey uniquely identifies <INSN>R, while OpType is 37 // "reg" for <INSN>R and "mem" for <INSN>. 38 string OpKey = ""; 39 string OpType = "none"; 40 41 // Many distinct-operands instructions have older 2-operand equivalents. 42 // NumOpsKey uniquely identifies one of these 2-operand and 3-operand pairs, 43 // with NumOpsValue being "2" or "3" as appropriate. 44 string NumOpsKey = ""; 45 string NumOpsValue = "none"; 46 47 // True if this instruction is a simple D(X,B) load of a register 48 // (with no sign or zero extension). 49 bit SimpleBDXLoad = 0; 50 51 // True if this instruction is a simple D(X,B) store of a register 52 // (with no truncation). 53 bit SimpleBDXStore = 0; 54 55 // True if this instruction has a 20-bit displacement field. 56 bit Has20BitOffset = 0; 57 58 // True if addresses in this instruction have an index register. 59 bit HasIndex = 0; 60 61 // True if this is a 128-bit pseudo instruction that combines two 64-bit 62 // operations. 63 bit Is128Bit = 0; 64 65 // The access size of all memory operands in bytes, or 0 if not known. 66 bits<5> AccessBytes = 0; 67 68 // If the instruction sets CC to a useful value, this gives the mask 69 // of all possible CC results. The mask has the same form as 70 // SystemZ::CCMASK_*. 71 bits<4> CCValues = 0; 72 73 // The subset of CCValues that have the same meaning as they would after 74 // a comparison of the first operand against zero. 75 bits<4> CompareZeroCCMask = 0; 76 77 // True if the instruction is conditional and if the CC mask operand 78 // comes first (as for BRC, etc.). 79 bit CCMaskFirst = 0; 80 81 // Similar, but true if the CC mask operand comes last (as for LOC, etc.). 82 bit CCMaskLast = 0; 83 84 // True if the instruction is the "logical" rather than "arithmetic" form, 85 // in cases where a distinction exists. 86 bit IsLogical = 0; 87 88 let TSFlags{0} = SimpleBDXLoad; 89 let TSFlags{1} = SimpleBDXStore; 90 let TSFlags{2} = Has20BitOffset; 91 let TSFlags{3} = HasIndex; 92 let TSFlags{4} = Is128Bit; 93 let TSFlags{9-5} = AccessBytes; 94 let TSFlags{13-10} = CCValues; 95 let TSFlags{17-14} = CompareZeroCCMask; 96 let TSFlags{18} = CCMaskFirst; 97 let TSFlags{19} = CCMaskLast; 98 let TSFlags{20} = IsLogical; 99 } 100 101 //===----------------------------------------------------------------------===// 102 // Mappings between instructions 103 //===----------------------------------------------------------------------===// 104 105 // Return the version of an instruction that has an unsigned 12-bit 106 // displacement. 107 def getDisp12Opcode : InstrMapping { 108 let FilterClass = "InstSystemZ"; 109 let RowFields = ["DispKey"]; 110 let ColFields = ["DispSize"]; 111 let KeyCol = ["20"]; 112 let ValueCols = [["12"]]; 113 } 114 115 // Return the version of an instruction that has a signed 20-bit displacement. 116 def getDisp20Opcode : InstrMapping { 117 let FilterClass = "InstSystemZ"; 118 let RowFields = ["DispKey"]; 119 let ColFields = ["DispSize"]; 120 let KeyCol = ["12"]; 121 let ValueCols = [["20"]]; 122 } 123 124 // Return the memory form of a register instruction. 125 def getMemOpcode : InstrMapping { 126 let FilterClass = "InstSystemZ"; 127 let RowFields = ["OpKey"]; 128 let ColFields = ["OpType"]; 129 let KeyCol = ["reg"]; 130 let ValueCols = [["mem"]]; 131 } 132 133 // Return the 3-operand form of a 2-operand instruction. 134 def getThreeOperandOpcode : InstrMapping { 135 let FilterClass = "InstSystemZ"; 136 let RowFields = ["NumOpsKey"]; 137 let ColFields = ["NumOpsValue"]; 138 let KeyCol = ["2"]; 139 let ValueCols = [["3"]]; 140 } 141 142 //===----------------------------------------------------------------------===// 143 // Instruction formats 144 //===----------------------------------------------------------------------===// 145 // 146 // Formats are specified using operand field declarations of the form: 147 // 148 // bits<4> Rn : register input or output for operand n 149 // bits<5> Vn : vector register input or output for operand n 150 // bits<m> In : immediate value of width m for operand n 151 // bits<4> BDn : address operand n, which has a base and a displacement 152 // bits<m> XBDn : address operand n, which has an index, a base and a 153 // displacement 154 // bits<m> VBDn : address operand n, which has a vector index, a base and a 155 // displacement 156 // bits<4> Xn : index register for address operand n 157 // bits<4> Mn : mode value for operand n 158 // 159 // The operand numbers ("n" in the list above) follow the architecture manual. 160 // Assembly operands sometimes have a different order; in particular, R3 often 161 // is often written between operands 1 and 2. 162 // 163 //===----------------------------------------------------------------------===// 164 165 class InstE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 166 : InstSystemZ<2, outs, ins, asmstr, pattern> { 167 field bits<16> Inst; 168 field bits<16> SoftFail = 0; 169 170 let Inst = op; 171 } 172 173 class InstI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> 174 : InstSystemZ<2, outs, ins, asmstr, pattern> { 175 field bits<16> Inst; 176 field bits<16> SoftFail = 0; 177 178 bits<8> I1; 179 180 let Inst{15-8} = op; 181 let Inst{7-0} = I1; 182 } 183 184 class InstIE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 185 : InstSystemZ<4, outs, ins, asmstr, pattern> { 186 field bits<32> Inst; 187 field bits<32> SoftFail = 0; 188 189 bits<4> I1; 190 bits<4> I2; 191 192 let Inst{31-16} = op; 193 let Inst{15-8} = 0; 194 let Inst{7-4} = I1; 195 let Inst{3-0} = I2; 196 } 197 198 class InstMII<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> 199 : InstSystemZ<6, outs, ins, asmstr, pattern> { 200 field bits<48> Inst; 201 field bits<48> SoftFail = 0; 202 203 bits<4> M1; 204 bits<12> RI2; 205 bits<24> RI3; 206 207 let Inst{47-40} = op; 208 let Inst{39-36} = M1; 209 let Inst{35-24} = RI2; 210 let Inst{23-0} = RI3; 211 } 212 213 class InstRIa<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern> 214 : InstSystemZ<4, outs, ins, asmstr, pattern> { 215 field bits<32> Inst; 216 field bits<32> SoftFail = 0; 217 218 bits<4> R1; 219 bits<16> I2; 220 221 let Inst{31-24} = op{11-4}; 222 let Inst{23-20} = R1; 223 let Inst{19-16} = op{3-0}; 224 let Inst{15-0} = I2; 225 } 226 227 class InstRIb<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern> 228 : InstSystemZ<4, outs, ins, asmstr, pattern> { 229 field bits<32> Inst; 230 field bits<32> SoftFail = 0; 231 232 bits<4> R1; 233 bits<16> RI2; 234 235 let Inst{31-24} = op{11-4}; 236 let Inst{23-20} = R1; 237 let Inst{19-16} = op{3-0}; 238 let Inst{15-0} = RI2; 239 } 240 241 class InstRIc<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern> 242 : InstSystemZ<4, outs, ins, asmstr, pattern> { 243 field bits<32> Inst; 244 field bits<32> SoftFail = 0; 245 246 bits<4> M1; 247 bits<16> RI2; 248 249 let Inst{31-24} = op{11-4}; 250 let Inst{23-20} = M1; 251 let Inst{19-16} = op{3-0}; 252 let Inst{15-0} = RI2; 253 } 254 255 class InstRIEa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 256 : InstSystemZ<6, outs, ins, asmstr, pattern> { 257 field bits<48> Inst; 258 field bits<48> SoftFail = 0; 259 260 bits<4> R1; 261 bits<16> I2; 262 bits<4> M3; 263 264 let Inst{47-40} = op{15-8}; 265 let Inst{39-36} = R1; 266 let Inst{35-32} = 0; 267 let Inst{31-16} = I2; 268 let Inst{15-12} = M3; 269 let Inst{11-8} = 0; 270 let Inst{7-0} = op{7-0}; 271 } 272 273 class InstRIEb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 274 : InstSystemZ<6, outs, ins, asmstr, pattern> { 275 field bits<48> Inst; 276 field bits<48> SoftFail = 0; 277 278 bits<4> R1; 279 bits<4> R2; 280 bits<4> M3; 281 bits<16> RI4; 282 283 let Inst{47-40} = op{15-8}; 284 let Inst{39-36} = R1; 285 let Inst{35-32} = R2; 286 let Inst{31-16} = RI4; 287 let Inst{15-12} = M3; 288 let Inst{11-8} = 0; 289 let Inst{7-0} = op{7-0}; 290 } 291 292 class InstRIEc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 293 : InstSystemZ<6, outs, ins, asmstr, pattern> { 294 field bits<48> Inst; 295 field bits<48> SoftFail = 0; 296 297 bits<4> R1; 298 bits<8> I2; 299 bits<4> M3; 300 bits<16> RI4; 301 302 let Inst{47-40} = op{15-8}; 303 let Inst{39-36} = R1; 304 let Inst{35-32} = M3; 305 let Inst{31-16} = RI4; 306 let Inst{15-8} = I2; 307 let Inst{7-0} = op{7-0}; 308 } 309 310 class InstRIEd<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 311 : InstSystemZ<6, outs, ins, asmstr, pattern> { 312 field bits<48> Inst; 313 field bits<48> SoftFail = 0; 314 315 bits<4> R1; 316 bits<4> R3; 317 bits<16> I2; 318 319 let Inst{47-40} = op{15-8}; 320 let Inst{39-36} = R1; 321 let Inst{35-32} = R3; 322 let Inst{31-16} = I2; 323 let Inst{15-8} = 0; 324 let Inst{7-0} = op{7-0}; 325 } 326 327 class InstRIEe<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 328 : InstSystemZ<6, outs, ins, asmstr, pattern> { 329 field bits<48> Inst; 330 field bits<48> SoftFail = 0; 331 332 bits<4> R1; 333 bits<4> R3; 334 bits<16> RI2; 335 336 let Inst{47-40} = op{15-8}; 337 let Inst{39-36} = R1; 338 let Inst{35-32} = R3; 339 let Inst{31-16} = RI2; 340 let Inst{15-8} = 0; 341 let Inst{7-0} = op{7-0}; 342 } 343 344 class InstRIEf<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 345 : InstSystemZ<6, outs, ins, asmstr, pattern> { 346 field bits<48> Inst; 347 field bits<48> SoftFail = 0; 348 349 bits<4> R1; 350 bits<4> R2; 351 bits<8> I3; 352 bits<8> I4; 353 bits<8> I5; 354 355 let Inst{47-40} = op{15-8}; 356 let Inst{39-36} = R1; 357 let Inst{35-32} = R2; 358 let Inst{31-24} = I3; 359 let Inst{23-16} = I4; 360 let Inst{15-8} = I5; 361 let Inst{7-0} = op{7-0}; 362 } 363 364 class InstRIEg<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 365 : InstSystemZ<6, outs, ins, asmstr, pattern> { 366 field bits<48> Inst; 367 field bits<48> SoftFail = 0; 368 369 bits<4> R1; 370 bits<4> M3; 371 bits<16> I2; 372 373 let Inst{47-40} = op{15-8}; 374 let Inst{39-36} = R1; 375 let Inst{35-32} = M3; 376 let Inst{31-16} = I2; 377 let Inst{15-8} = 0; 378 let Inst{7-0} = op{7-0}; 379 } 380 381 class InstRILa<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern> 382 : InstSystemZ<6, outs, ins, asmstr, pattern> { 383 field bits<48> Inst; 384 field bits<48> SoftFail = 0; 385 386 bits<4> R1; 387 bits<32> I2; 388 389 let Inst{47-40} = op{11-4}; 390 let Inst{39-36} = R1; 391 let Inst{35-32} = op{3-0}; 392 let Inst{31-0} = I2; 393 } 394 395 class InstRILb<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern> 396 : InstSystemZ<6, outs, ins, asmstr, pattern> { 397 field bits<48> Inst; 398 field bits<48> SoftFail = 0; 399 400 bits<4> R1; 401 bits<32> RI2; 402 403 let Inst{47-40} = op{11-4}; 404 let Inst{39-36} = R1; 405 let Inst{35-32} = op{3-0}; 406 let Inst{31-0} = RI2; 407 } 408 409 class InstRILc<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern> 410 : InstSystemZ<6, outs, ins, asmstr, pattern> { 411 field bits<48> Inst; 412 field bits<48> SoftFail = 0; 413 414 bits<4> M1; 415 bits<32> RI2; 416 417 let Inst{47-40} = op{11-4}; 418 let Inst{39-36} = M1; 419 let Inst{35-32} = op{3-0}; 420 let Inst{31-0} = RI2; 421 } 422 423 class InstRIS<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 424 : InstSystemZ<6, outs, ins, asmstr, pattern> { 425 field bits<48> Inst; 426 field bits<48> SoftFail = 0; 427 428 bits<4> R1; 429 bits<8> I2; 430 bits<4> M3; 431 bits<16> BD4; 432 433 let Inst{47-40} = op{15-8}; 434 let Inst{39-36} = R1; 435 let Inst{35-32} = M3; 436 let Inst{31-16} = BD4; 437 let Inst{15-8} = I2; 438 let Inst{7-0} = op{7-0}; 439 } 440 441 class InstRR<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> 442 : InstSystemZ<2, outs, ins, asmstr, pattern> { 443 field bits<16> Inst; 444 field bits<16> SoftFail = 0; 445 446 bits<4> R1; 447 bits<4> R2; 448 449 let Inst{15-8} = op; 450 let Inst{7-4} = R1; 451 let Inst{3-0} = R2; 452 } 453 454 class InstRRD<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 455 : InstSystemZ<4, outs, ins, asmstr, pattern> { 456 field bits<32> Inst; 457 field bits<32> SoftFail = 0; 458 459 bits<4> R1; 460 bits<4> R3; 461 bits<4> R2; 462 463 let Inst{31-16} = op; 464 let Inst{15-12} = R1; 465 let Inst{11-8} = 0; 466 let Inst{7-4} = R3; 467 let Inst{3-0} = R2; 468 } 469 470 class InstRRE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 471 : InstSystemZ<4, outs, ins, asmstr, pattern> { 472 field bits<32> Inst; 473 field bits<32> SoftFail = 0; 474 475 bits<4> R1; 476 bits<4> R2; 477 478 let Inst{31-16} = op; 479 let Inst{15-8} = 0; 480 let Inst{7-4} = R1; 481 let Inst{3-0} = R2; 482 } 483 484 class InstRRFa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 485 : InstSystemZ<4, outs, ins, asmstr, pattern> { 486 field bits<32> Inst; 487 field bits<32> SoftFail = 0; 488 489 bits<4> R1; 490 bits<4> R2; 491 bits<4> R3; 492 bits<4> M4; 493 494 let Inst{31-16} = op; 495 let Inst{15-12} = R3; 496 let Inst{11-8} = M4; 497 let Inst{7-4} = R1; 498 let Inst{3-0} = R2; 499 } 500 501 class InstRRFb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 502 : InstSystemZ<4, outs, ins, asmstr, pattern> { 503 field bits<32> Inst; 504 field bits<32> SoftFail = 0; 505 506 bits<4> R1; 507 bits<4> R2; 508 bits<4> R3; 509 bits<4> M4; 510 511 let Inst{31-16} = op; 512 let Inst{15-12} = R3; 513 let Inst{11-8} = M4; 514 let Inst{7-4} = R1; 515 let Inst{3-0} = R2; 516 } 517 518 class InstRRFc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 519 : InstSystemZ<4, outs, ins, asmstr, pattern> { 520 field bits<32> Inst; 521 field bits<32> SoftFail = 0; 522 523 bits<4> R1; 524 bits<4> R2; 525 bits<4> M3; 526 527 let Inst{31-16} = op; 528 let Inst{15-12} = M3; 529 let Inst{11-8} = 0; 530 let Inst{7-4} = R1; 531 let Inst{3-0} = R2; 532 } 533 534 class InstRRFd<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 535 : InstSystemZ<4, outs, ins, asmstr, pattern> { 536 field bits<32> Inst; 537 field bits<32> SoftFail = 0; 538 539 bits<4> R1; 540 bits<4> R2; 541 bits<4> M4; 542 543 let Inst{31-16} = op; 544 let Inst{15-12} = 0; 545 let Inst{11-8} = M4; 546 let Inst{7-4} = R1; 547 let Inst{3-0} = R2; 548 } 549 550 class InstRRFe<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 551 : InstSystemZ<4, outs, ins, asmstr, pattern> { 552 field bits<32> Inst; 553 field bits<32> SoftFail = 0; 554 555 bits<4> R1; 556 bits<4> R2; 557 bits<4> M3; 558 bits<4> M4; 559 560 let Inst{31-16} = op; 561 let Inst{15-12} = M3; 562 let Inst{11-8} = M4; 563 let Inst{7-4} = R1; 564 let Inst{3-0} = R2; 565 } 566 567 class InstRRS<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 568 : InstSystemZ<6, outs, ins, asmstr, pattern> { 569 field bits<48> Inst; 570 field bits<48> SoftFail = 0; 571 572 bits<4> R1; 573 bits<4> R2; 574 bits<4> M3; 575 bits<16> BD4; 576 577 let Inst{47-40} = op{15-8}; 578 let Inst{39-36} = R1; 579 let Inst{35-32} = R2; 580 let Inst{31-16} = BD4; 581 let Inst{15-12} = M3; 582 let Inst{11-8} = 0; 583 let Inst{7-0} = op{7-0}; 584 } 585 586 class InstRXa<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> 587 : InstSystemZ<4, outs, ins, asmstr, pattern> { 588 field bits<32> Inst; 589 field bits<32> SoftFail = 0; 590 591 bits<4> R1; 592 bits<20> XBD2; 593 594 let Inst{31-24} = op; 595 let Inst{23-20} = R1; 596 let Inst{19-0} = XBD2; 597 598 let HasIndex = 1; 599 } 600 601 class InstRXb<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> 602 : InstSystemZ<4, outs, ins, asmstr, pattern> { 603 field bits<32> Inst; 604 field bits<32> SoftFail = 0; 605 606 bits<4> M1; 607 bits<20> XBD2; 608 609 let Inst{31-24} = op; 610 let Inst{23-20} = M1; 611 let Inst{19-0} = XBD2; 612 613 let HasIndex = 1; 614 } 615 616 class InstRXE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 617 : InstSystemZ<6, outs, ins, asmstr, pattern> { 618 field bits<48> Inst; 619 field bits<48> SoftFail = 0; 620 621 bits<4> R1; 622 bits<20> XBD2; 623 bits<4> M3; 624 625 let Inst{47-40} = op{15-8}; 626 let Inst{39-36} = R1; 627 let Inst{35-16} = XBD2; 628 let Inst{15-12} = M3; 629 let Inst{11-8} = 0; 630 let Inst{7-0} = op{7-0}; 631 632 let HasIndex = 1; 633 } 634 635 class InstRXF<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 636 : InstSystemZ<6, outs, ins, asmstr, pattern> { 637 field bits<48> Inst; 638 field bits<48> SoftFail = 0; 639 640 bits<4> R1; 641 bits<4> R3; 642 bits<20> XBD2; 643 644 let Inst{47-40} = op{15-8}; 645 let Inst{39-36} = R3; 646 let Inst{35-16} = XBD2; 647 let Inst{15-12} = R1; 648 let Inst{11-8} = 0; 649 let Inst{7-0} = op{7-0}; 650 651 let HasIndex = 1; 652 } 653 654 class InstRXYa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 655 : InstSystemZ<6, outs, ins, asmstr, pattern> { 656 field bits<48> Inst; 657 field bits<48> SoftFail = 0; 658 659 bits<4> R1; 660 bits<28> XBD2; 661 662 let Inst{47-40} = op{15-8}; 663 let Inst{39-36} = R1; 664 let Inst{35-8} = XBD2; 665 let Inst{7-0} = op{7-0}; 666 667 let Has20BitOffset = 1; 668 let HasIndex = 1; 669 } 670 671 class InstRXYb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 672 : InstSystemZ<6, outs, ins, asmstr, pattern> { 673 field bits<48> Inst; 674 field bits<48> SoftFail = 0; 675 676 bits<4> M1; 677 bits<28> XBD2; 678 679 let Inst{47-40} = op{15-8}; 680 let Inst{39-36} = M1; 681 let Inst{35-8} = XBD2; 682 let Inst{7-0} = op{7-0}; 683 684 let Has20BitOffset = 1; 685 let HasIndex = 1; 686 } 687 688 class InstRSa<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> 689 : InstSystemZ<4, outs, ins, asmstr, pattern> { 690 field bits<32> Inst; 691 field bits<32> SoftFail = 0; 692 693 bits<4> R1; 694 bits<4> R3; 695 bits<16> BD2; 696 697 let Inst{31-24} = op; 698 let Inst{23-20} = R1; 699 let Inst{19-16} = R3; 700 let Inst{15-0} = BD2; 701 } 702 703 class InstRSb<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> 704 : InstSystemZ<4, outs, ins, asmstr, pattern> { 705 field bits<32> Inst; 706 field bits<32> SoftFail = 0; 707 708 bits<4> R1; 709 bits<4> M3; 710 bits<16> BD2; 711 712 let Inst{31-24} = op; 713 let Inst{23-20} = R1; 714 let Inst{19-16} = M3; 715 let Inst{15-0} = BD2; 716 } 717 718 class InstRSI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> 719 : InstSystemZ<4, outs, ins, asmstr, pattern> { 720 field bits<32> Inst; 721 field bits<32> SoftFail = 0; 722 723 bits<4> R1; 724 bits<4> R3; 725 bits<16> RI2; 726 727 let Inst{31-24} = op; 728 let Inst{23-20} = R1; 729 let Inst{19-16} = R3; 730 let Inst{15-0} = RI2; 731 } 732 733 class InstRSLa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 734 : InstSystemZ<6, outs, ins, asmstr, pattern> { 735 field bits<48> Inst; 736 field bits<48> SoftFail = 0; 737 738 bits<20> BDL1; 739 740 let Inst{47-40} = op{15-8}; 741 let Inst{39-36} = BDL1{19-16}; 742 let Inst{35-32} = 0; 743 let Inst{31-16} = BDL1{15-0}; 744 let Inst{15-8} = 0; 745 let Inst{7-0} = op{7-0}; 746 } 747 748 class InstRSLb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 749 : InstSystemZ<6, outs, ins, asmstr, pattern> { 750 field bits<48> Inst; 751 field bits<48> SoftFail = 0; 752 753 bits<4> R1; 754 bits<24> BDL2; 755 bits<4> M3; 756 757 let Inst{47-40} = op{15-8}; 758 let Inst{39-16} = BDL2; 759 let Inst{15-12} = R1; 760 let Inst{11-8} = M3; 761 let Inst{7-0} = op{7-0}; 762 } 763 764 class InstRSYa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 765 : InstSystemZ<6, outs, ins, asmstr, pattern> { 766 field bits<48> Inst; 767 field bits<48> SoftFail = 0; 768 769 bits<4> R1; 770 bits<4> R3; 771 bits<24> BD2; 772 773 let Inst{47-40} = op{15-8}; 774 let Inst{39-36} = R1; 775 let Inst{35-32} = R3; 776 let Inst{31-8} = BD2; 777 let Inst{7-0} = op{7-0}; 778 779 let Has20BitOffset = 1; 780 } 781 782 class InstRSYb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 783 : InstSystemZ<6, outs, ins, asmstr, pattern> { 784 field bits<48> Inst; 785 field bits<48> SoftFail = 0; 786 787 bits<4> R1; 788 bits<4> M3; 789 bits<24> BD2; 790 791 let Inst{47-40} = op{15-8}; 792 let Inst{39-36} = R1; 793 let Inst{35-32} = M3; 794 let Inst{31-8} = BD2; 795 let Inst{7-0} = op{7-0}; 796 797 let Has20BitOffset = 1; 798 } 799 800 class InstSI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> 801 : InstSystemZ<4, outs, ins, asmstr, pattern> { 802 field bits<32> Inst; 803 field bits<32> SoftFail = 0; 804 805 bits<16> BD1; 806 bits<8> I2; 807 808 let Inst{31-24} = op; 809 let Inst{23-16} = I2; 810 let Inst{15-0} = BD1; 811 } 812 813 class InstSIL<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 814 : InstSystemZ<6, outs, ins, asmstr, pattern> { 815 field bits<48> Inst; 816 field bits<48> SoftFail = 0; 817 818 bits<16> BD1; 819 bits<16> I2; 820 821 let Inst{47-32} = op; 822 let Inst{31-16} = BD1; 823 let Inst{15-0} = I2; 824 } 825 826 class InstSIY<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 827 : InstSystemZ<6, outs, ins, asmstr, pattern> { 828 field bits<48> Inst; 829 field bits<48> SoftFail = 0; 830 831 bits<24> BD1; 832 bits<8> I2; 833 834 let Inst{47-40} = op{15-8}; 835 let Inst{39-32} = I2; 836 let Inst{31-8} = BD1; 837 let Inst{7-0} = op{7-0}; 838 839 let Has20BitOffset = 1; 840 } 841 842 class InstSMI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> 843 : InstSystemZ<6, outs, ins, asmstr, pattern> { 844 field bits<48> Inst; 845 field bits<48> SoftFail = 0; 846 847 bits<4> M1; 848 bits<16> RI2; 849 bits<16> BD3; 850 851 let Inst{47-40} = op; 852 let Inst{39-36} = M1; 853 let Inst{35-32} = 0; 854 let Inst{31-16} = BD3; 855 let Inst{15-0} = RI2; 856 } 857 858 class InstSSa<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> 859 : InstSystemZ<6, outs, ins, asmstr, pattern> { 860 field bits<48> Inst; 861 field bits<48> SoftFail = 0; 862 863 bits<24> BDL1; 864 bits<16> BD2; 865 866 let Inst{47-40} = op; 867 let Inst{39-16} = BDL1; 868 let Inst{15-0} = BD2; 869 } 870 871 class InstSSb<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> 872 : InstSystemZ<6, outs, ins, asmstr, pattern> { 873 field bits<48> Inst; 874 field bits<48> SoftFail = 0; 875 876 bits<20> BDL1; 877 bits<20> BDL2; 878 879 let Inst{47-40} = op; 880 let Inst{39-36} = BDL1{19-16}; 881 let Inst{35-32} = BDL2{19-16}; 882 let Inst{31-16} = BDL1{15-0}; 883 let Inst{15-0} = BDL2{15-0}; 884 } 885 886 class InstSSc<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> 887 : InstSystemZ<6, outs, ins, asmstr, pattern> { 888 field bits<48> Inst; 889 field bits<48> SoftFail = 0; 890 891 bits<20> BDL1; 892 bits<16> BD2; 893 bits<4> I3; 894 895 let Inst{47-40} = op; 896 let Inst{39-36} = BDL1{19-16}; 897 let Inst{35-32} = I3; 898 let Inst{31-16} = BDL1{15-0}; 899 let Inst{15-0} = BD2; 900 } 901 902 class InstSSd<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> 903 : InstSystemZ<6, outs, ins, asmstr, pattern> { 904 field bits<48> Inst; 905 field bits<48> SoftFail = 0; 906 907 bits<20> RBD1; 908 bits<16> BD2; 909 bits<4> R3; 910 911 let Inst{47-40} = op; 912 let Inst{39-36} = RBD1{19-16}; 913 let Inst{35-32} = R3; 914 let Inst{31-16} = RBD1{15-0}; 915 let Inst{15-0} = BD2; 916 } 917 918 class InstSSe<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> 919 : InstSystemZ<6, outs, ins, asmstr, pattern> { 920 field bits<48> Inst; 921 field bits<48> SoftFail = 0; 922 923 bits<4> R1; 924 bits<16> BD2; 925 bits<4> R3; 926 bits<16> BD4; 927 928 let Inst{47-40} = op; 929 let Inst{39-36} = R1; 930 let Inst{35-32} = R3; 931 let Inst{31-16} = BD2; 932 let Inst{15-0} = BD4; 933 } 934 935 class InstSSf<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern> 936 : InstSystemZ<6, outs, ins, asmstr, pattern> { 937 field bits<48> Inst; 938 field bits<48> SoftFail = 0; 939 940 bits<16> BD1; 941 bits<24> BDL2; 942 943 let Inst{47-40} = op; 944 let Inst{39-32} = BDL2{23-16}; 945 let Inst{31-16} = BD1; 946 let Inst{15-0} = BDL2{15-0}; 947 } 948 949 class InstSSE<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 950 : InstSystemZ<6, outs, ins, asmstr, pattern> { 951 field bits<48> Inst; 952 field bits<48> SoftFail = 0; 953 954 bits<16> BD1; 955 bits<16> BD2; 956 957 let Inst{47-32} = op; 958 let Inst{31-16} = BD1; 959 let Inst{15-0} = BD2; 960 } 961 962 class InstSSF<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern> 963 : InstSystemZ<6, outs, ins, asmstr, pattern> { 964 field bits<48> Inst; 965 field bits<48> SoftFail = 0; 966 967 bits<16> BD1; 968 bits<16> BD2; 969 bits<4> R3; 970 971 let Inst{47-40} = op{11-4}; 972 let Inst{39-36} = R3; 973 let Inst{35-32} = op{3-0}; 974 let Inst{31-16} = BD1; 975 let Inst{15-0} = BD2; 976 } 977 978 class InstS<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 979 : InstSystemZ<4, outs, ins, asmstr, pattern> { 980 field bits<32> Inst; 981 field bits<32> SoftFail = 0; 982 983 bits<16> BD2; 984 985 let Inst{31-16} = op; 986 let Inst{15-0} = BD2; 987 } 988 989 class InstVRIa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 990 : InstSystemZ<6, outs, ins, asmstr, pattern> { 991 field bits<48> Inst; 992 field bits<48> SoftFail = 0; 993 994 bits<5> V1; 995 bits<16> I2; 996 bits<4> M3; 997 998 let Inst{47-40} = op{15-8}; 999 let Inst{39-36} = V1{3-0}; 1000 let Inst{35-32} = 0; 1001 let Inst{31-16} = I2; 1002 let Inst{15-12} = M3; 1003 let Inst{11} = V1{4}; 1004 let Inst{10-8} = 0; 1005 let Inst{7-0} = op{7-0}; 1006 } 1007 1008 class InstVRIb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1009 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1010 field bits<48> Inst; 1011 field bits<48> SoftFail = 0; 1012 1013 bits<5> V1; 1014 bits<8> I2; 1015 bits<8> I3; 1016 bits<4> M4; 1017 1018 let Inst{47-40} = op{15-8}; 1019 let Inst{39-36} = V1{3-0}; 1020 let Inst{35-32} = 0; 1021 let Inst{31-24} = I2; 1022 let Inst{23-16} = I3; 1023 let Inst{15-12} = M4; 1024 let Inst{11} = V1{4}; 1025 let Inst{10-8} = 0; 1026 let Inst{7-0} = op{7-0}; 1027 } 1028 1029 class InstVRIc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1030 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1031 field bits<48> Inst; 1032 field bits<48> SoftFail = 0; 1033 1034 bits<5> V1; 1035 bits<5> V3; 1036 bits<16> I2; 1037 bits<4> M4; 1038 1039 let Inst{47-40} = op{15-8}; 1040 let Inst{39-36} = V1{3-0}; 1041 let Inst{35-32} = V3{3-0}; 1042 let Inst{31-16} = I2; 1043 let Inst{15-12} = M4; 1044 let Inst{11} = V1{4}; 1045 let Inst{10} = V3{4}; 1046 let Inst{9-8} = 0; 1047 let Inst{7-0} = op{7-0}; 1048 } 1049 1050 class InstVRId<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1051 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1052 field bits<48> Inst; 1053 field bits<48> SoftFail = 0; 1054 1055 bits<5> V1; 1056 bits<5> V2; 1057 bits<5> V3; 1058 bits<8> I4; 1059 bits<4> M5; 1060 1061 let Inst{47-40} = op{15-8}; 1062 let Inst{39-36} = V1{3-0}; 1063 let Inst{35-32} = V2{3-0}; 1064 let Inst{31-28} = V3{3-0}; 1065 let Inst{27-24} = 0; 1066 let Inst{23-16} = I4; 1067 let Inst{15-12} = M5; 1068 let Inst{11} = V1{4}; 1069 let Inst{10} = V2{4}; 1070 let Inst{9} = V3{4}; 1071 let Inst{8} = 0; 1072 let Inst{7-0} = op{7-0}; 1073 } 1074 1075 class InstVRIe<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1076 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1077 field bits<48> Inst; 1078 field bits<48> SoftFail = 0; 1079 1080 bits<5> V1; 1081 bits<5> V2; 1082 bits<12> I3; 1083 bits<4> M4; 1084 bits<4> M5; 1085 1086 let Inst{47-40} = op{15-8}; 1087 let Inst{39-36} = V1{3-0}; 1088 let Inst{35-32} = V2{3-0}; 1089 let Inst{31-20} = I3; 1090 let Inst{19-16} = M5; 1091 let Inst{15-12} = M4; 1092 let Inst{11} = V1{4}; 1093 let Inst{10} = V2{4}; 1094 let Inst{9-8} = 0; 1095 let Inst{7-0} = op{7-0}; 1096 } 1097 1098 class InstVRIf<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1099 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1100 field bits<48> Inst; 1101 field bits<48> SoftFail = 0; 1102 1103 bits<5> V1; 1104 bits<5> V2; 1105 bits<5> V3; 1106 bits<8> I4; 1107 bits<4> M5; 1108 1109 let Inst{47-40} = op{15-8}; 1110 let Inst{39-36} = V1{3-0}; 1111 let Inst{35-32} = V2{3-0}; 1112 let Inst{31-28} = V3{3-0}; 1113 let Inst{27-24} = 0; 1114 let Inst{23-20} = M5; 1115 let Inst{19-12} = I4; 1116 let Inst{11} = V1{4}; 1117 let Inst{10} = V2{4}; 1118 let Inst{9} = V3{4}; 1119 let Inst{8} = 0; 1120 let Inst{7-0} = op{7-0}; 1121 } 1122 1123 class InstVRIg<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1124 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1125 field bits<48> Inst; 1126 field bits<48> SoftFail = 0; 1127 1128 bits<5> V1; 1129 bits<5> V2; 1130 bits<8> I3; 1131 bits<8> I4; 1132 bits<4> M5; 1133 1134 let Inst{47-40} = op{15-8}; 1135 let Inst{39-36} = V1{3-0}; 1136 let Inst{35-32} = V2{3-0}; 1137 let Inst{31-24} = I4; 1138 let Inst{23-20} = M5; 1139 let Inst{19-12} = I3; 1140 let Inst{11} = V1{4}; 1141 let Inst{10} = V2{4}; 1142 let Inst{9-8} = 0; 1143 let Inst{7-0} = op{7-0}; 1144 } 1145 1146 class InstVRIh<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1147 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1148 field bits<48> Inst; 1149 field bits<48> SoftFail = 0; 1150 1151 bits<5> V1; 1152 bits<16> I2; 1153 bits<4> I3; 1154 1155 let Inst{47-40} = op{15-8}; 1156 let Inst{39-36} = V1{3-0}; 1157 let Inst{35-32} = 0; 1158 let Inst{31-16} = I2; 1159 let Inst{15-12} = I3; 1160 let Inst{11} = V1{4}; 1161 let Inst{10-8} = 0; 1162 let Inst{7-0} = op{7-0}; 1163 } 1164 1165 class InstVRIi<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1166 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1167 field bits<48> Inst; 1168 field bits<48> SoftFail = 0; 1169 1170 bits<5> V1; 1171 bits<4> R2; 1172 bits<8> I3; 1173 bits<4> M4; 1174 1175 let Inst{47-40} = op{15-8}; 1176 let Inst{39-36} = V1{3-0}; 1177 let Inst{35-32} = R2; 1178 let Inst{31-24} = 0; 1179 let Inst{23-20} = M4; 1180 let Inst{19-12} = I3; 1181 let Inst{11} = V1{4}; 1182 let Inst{10-8} = 0; 1183 let Inst{7-0} = op{7-0}; 1184 } 1185 1186 // Depending on the instruction mnemonic, certain bits may be or-ed into 1187 // the M4 value provided as explicit operand. These are passed as m4or. 1188 class InstVRRa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern, 1189 bits<4> m4or = 0> 1190 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1191 field bits<48> Inst; 1192 field bits<48> SoftFail = 0; 1193 1194 bits<5> V1; 1195 bits<5> V2; 1196 bits<4> M3; 1197 bits<4> M4; 1198 bits<4> M5; 1199 1200 let Inst{47-40} = op{15-8}; 1201 let Inst{39-36} = V1{3-0}; 1202 let Inst{35-32} = V2{3-0}; 1203 let Inst{31-24} = 0; 1204 let Inst{23-20} = M5; 1205 let Inst{19} = !if (!eq (m4or{3}, 1), 1, M4{3}); 1206 let Inst{18} = !if (!eq (m4or{2}, 1), 1, M4{2}); 1207 let Inst{17} = !if (!eq (m4or{1}, 1), 1, M4{1}); 1208 let Inst{16} = !if (!eq (m4or{0}, 1), 1, M4{0}); 1209 let Inst{15-12} = M3; 1210 let Inst{11} = V1{4}; 1211 let Inst{10} = V2{4}; 1212 let Inst{9-8} = 0; 1213 let Inst{7-0} = op{7-0}; 1214 } 1215 1216 // Depending on the instruction mnemonic, certain bits may be or-ed into 1217 // the M5 value provided as explicit operand. These are passed as m5or. 1218 class InstVRRb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern, 1219 bits<4> m5or = 0> 1220 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1221 field bits<48> Inst; 1222 field bits<48> SoftFail = 0; 1223 1224 bits<5> V1; 1225 bits<5> V2; 1226 bits<5> V3; 1227 bits<4> M4; 1228 bits<4> M5; 1229 1230 let Inst{47-40} = op{15-8}; 1231 let Inst{39-36} = V1{3-0}; 1232 let Inst{35-32} = V2{3-0}; 1233 let Inst{31-28} = V3{3-0}; 1234 let Inst{27-24} = 0; 1235 let Inst{23} = !if (!eq (m5or{3}, 1), 1, M5{3}); 1236 let Inst{22} = !if (!eq (m5or{2}, 1), 1, M5{2}); 1237 let Inst{21} = !if (!eq (m5or{1}, 1), 1, M5{1}); 1238 let Inst{20} = !if (!eq (m5or{0}, 1), 1, M5{0}); 1239 let Inst{19-16} = 0; 1240 let Inst{15-12} = M4; 1241 let Inst{11} = V1{4}; 1242 let Inst{10} = V2{4}; 1243 let Inst{9} = V3{4}; 1244 let Inst{8} = 0; 1245 let Inst{7-0} = op{7-0}; 1246 } 1247 1248 class InstVRRc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1249 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1250 field bits<48> Inst; 1251 field bits<48> SoftFail = 0; 1252 1253 bits<5> V1; 1254 bits<5> V2; 1255 bits<5> V3; 1256 bits<4> M4; 1257 bits<4> M5; 1258 bits<4> M6; 1259 1260 let Inst{47-40} = op{15-8}; 1261 let Inst{39-36} = V1{3-0}; 1262 let Inst{35-32} = V2{3-0}; 1263 let Inst{31-28} = V3{3-0}; 1264 let Inst{27-24} = 0; 1265 let Inst{23-20} = M6; 1266 let Inst{19-16} = M5; 1267 let Inst{15-12} = M4; 1268 let Inst{11} = V1{4}; 1269 let Inst{10} = V2{4}; 1270 let Inst{9} = V3{4}; 1271 let Inst{8} = 0; 1272 let Inst{7-0} = op{7-0}; 1273 } 1274 1275 // Depending on the instruction mnemonic, certain bits may be or-ed into 1276 // the M6 value provided as explicit operand. These are passed as m6or. 1277 class InstVRRd<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern, 1278 bits<4> m6or = 0> 1279 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1280 field bits<48> Inst; 1281 field bits<48> SoftFail = 0; 1282 1283 bits<5> V1; 1284 bits<5> V2; 1285 bits<5> V3; 1286 bits<5> V4; 1287 bits<4> M5; 1288 bits<4> M6; 1289 1290 let Inst{47-40} = op{15-8}; 1291 let Inst{39-36} = V1{3-0}; 1292 let Inst{35-32} = V2{3-0}; 1293 let Inst{31-28} = V3{3-0}; 1294 let Inst{27-24} = M5; 1295 let Inst{23} = !if (!eq (m6or{3}, 1), 1, M6{3}); 1296 let Inst{22} = !if (!eq (m6or{2}, 1), 1, M6{2}); 1297 let Inst{21} = !if (!eq (m6or{1}, 1), 1, M6{1}); 1298 let Inst{20} = !if (!eq (m6or{0}, 1), 1, M6{0}); 1299 let Inst{19-16} = 0; 1300 let Inst{15-12} = V4{3-0}; 1301 let Inst{11} = V1{4}; 1302 let Inst{10} = V2{4}; 1303 let Inst{9} = V3{4}; 1304 let Inst{8} = V4{4}; 1305 let Inst{7-0} = op{7-0}; 1306 } 1307 1308 class InstVRRe<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1309 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1310 field bits<48> Inst; 1311 field bits<48> SoftFail = 0; 1312 1313 bits<5> V1; 1314 bits<5> V2; 1315 bits<5> V3; 1316 bits<5> V4; 1317 bits<4> M5; 1318 bits<4> M6; 1319 1320 let Inst{47-40} = op{15-8}; 1321 let Inst{39-36} = V1{3-0}; 1322 let Inst{35-32} = V2{3-0}; 1323 let Inst{31-28} = V3{3-0}; 1324 let Inst{27-24} = M6; 1325 let Inst{23-20} = 0; 1326 let Inst{19-16} = M5; 1327 let Inst{15-12} = V4{3-0}; 1328 let Inst{11} = V1{4}; 1329 let Inst{10} = V2{4}; 1330 let Inst{9} = V3{4}; 1331 let Inst{8} = V4{4}; 1332 let Inst{7-0} = op{7-0}; 1333 } 1334 1335 class InstVRRf<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1336 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1337 field bits<48> Inst; 1338 field bits<48> SoftFail = 0; 1339 1340 bits<5> V1; 1341 bits<4> R2; 1342 bits<4> R3; 1343 1344 let Inst{47-40} = op{15-8}; 1345 let Inst{39-36} = V1{3-0}; 1346 let Inst{35-32} = R2; 1347 let Inst{31-28} = R3; 1348 let Inst{27-12} = 0; 1349 let Inst{11} = V1{4}; 1350 let Inst{10-8} = 0; 1351 let Inst{7-0} = op{7-0}; 1352 } 1353 1354 class InstVRRg<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1355 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1356 field bits<48> Inst; 1357 field bits<48> SoftFail = 0; 1358 1359 bits<5> V1; 1360 1361 let Inst{47-40} = op{15-8}; 1362 let Inst{39-36} = 0; 1363 let Inst{35-32} = V1{3-0}; 1364 let Inst{31-12} = 0; 1365 let Inst{11} = 0; 1366 let Inst{10} = V1{4}; 1367 let Inst{9-8} = 0; 1368 let Inst{7-0} = op{7-0}; 1369 } 1370 1371 class InstVRRh<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1372 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1373 field bits<48> Inst; 1374 field bits<48> SoftFail = 0; 1375 1376 bits<5> V1; 1377 bits<5> V2; 1378 bits<4> M3; 1379 1380 let Inst{47-40} = op{15-8}; 1381 let Inst{39-36} = 0; 1382 let Inst{35-32} = V1{3-0}; 1383 let Inst{31-28} = V2{3-0}; 1384 let Inst{27-24} = 0; 1385 let Inst{23-20} = M3; 1386 let Inst{19-12} = 0; 1387 let Inst{11} = 0; 1388 let Inst{10} = V1{4}; 1389 let Inst{9} = V2{4}; 1390 let Inst{8} = 0; 1391 let Inst{7-0} = op{7-0}; 1392 } 1393 1394 class InstVRRi<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1395 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1396 field bits<48> Inst; 1397 field bits<48> SoftFail = 0; 1398 1399 bits<4> R1; 1400 bits<5> V2; 1401 bits<4> M3; 1402 1403 let Inst{47-40} = op{15-8}; 1404 let Inst{39-36} = R1; 1405 let Inst{35-32} = V2{3-0}; 1406 let Inst{31-24} = 0; 1407 let Inst{23-20} = M3; 1408 let Inst{19-12} = 0; 1409 let Inst{11} = 0; 1410 let Inst{10} = V2{4}; 1411 let Inst{9-8} = 0; 1412 let Inst{7-0} = op{7-0}; 1413 } 1414 1415 class InstVRSa<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1416 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1417 field bits<48> Inst; 1418 field bits<48> SoftFail = 0; 1419 1420 bits<5> V1; 1421 bits<16> BD2; 1422 bits<5> V3; 1423 bits<4> M4; 1424 1425 let Inst{47-40} = op{15-8}; 1426 let Inst{39-36} = V1{3-0}; 1427 let Inst{35-32} = V3{3-0}; 1428 let Inst{31-16} = BD2; 1429 let Inst{15-12} = M4; 1430 let Inst{11} = V1{4}; 1431 let Inst{10} = V3{4}; 1432 let Inst{9-8} = 0; 1433 let Inst{7-0} = op{7-0}; 1434 } 1435 1436 class InstVRSb<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1437 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1438 field bits<48> Inst; 1439 field bits<48> SoftFail = 0; 1440 1441 bits<5> V1; 1442 bits<16> BD2; 1443 bits<4> R3; 1444 bits<4> M4; 1445 1446 let Inst{47-40} = op{15-8}; 1447 let Inst{39-36} = V1{3-0}; 1448 let Inst{35-32} = R3; 1449 let Inst{31-16} = BD2; 1450 let Inst{15-12} = M4; 1451 let Inst{11} = V1{4}; 1452 let Inst{10-8} = 0; 1453 let Inst{7-0} = op{7-0}; 1454 } 1455 1456 class InstVRSc<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1457 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1458 field bits<48> Inst; 1459 field bits<48> SoftFail = 0; 1460 1461 bits<4> R1; 1462 bits<16> BD2; 1463 bits<5> V3; 1464 bits<4> M4; 1465 1466 let Inst{47-40} = op{15-8}; 1467 let Inst{39-36} = R1; 1468 let Inst{35-32} = V3{3-0}; 1469 let Inst{31-16} = BD2; 1470 let Inst{15-12} = M4; 1471 let Inst{11} = 0; 1472 let Inst{10} = V3{4}; 1473 let Inst{9-8} = 0; 1474 let Inst{7-0} = op{7-0}; 1475 } 1476 1477 class InstVRSd<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1478 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1479 field bits<48> Inst; 1480 field bits<48> SoftFail = 0; 1481 1482 bits<5> V1; 1483 bits<16> BD2; 1484 bits<4> R3; 1485 1486 let Inst{47-40} = op{15-8}; 1487 let Inst{39-36} = 0; 1488 let Inst{35-32} = R3; 1489 let Inst{31-16} = BD2; 1490 let Inst{15-12} = V1{3-0}; 1491 let Inst{11-9} = 0; 1492 let Inst{8} = V1{4}; 1493 let Inst{7-0} = op{7-0}; 1494 } 1495 1496 class InstVRV<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1497 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1498 field bits<48> Inst; 1499 field bits<48> SoftFail = 0; 1500 1501 bits<5> V1; 1502 bits<21> VBD2; 1503 bits<4> M3; 1504 1505 let Inst{47-40} = op{15-8}; 1506 let Inst{39-36} = V1{3-0}; 1507 let Inst{35-16} = VBD2{19-0}; 1508 let Inst{15-12} = M3; 1509 let Inst{11} = V1{4}; 1510 let Inst{10} = VBD2{20}; 1511 let Inst{9-8} = 0; 1512 let Inst{7-0} = op{7-0}; 1513 } 1514 1515 class InstVRX<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1516 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1517 field bits<48> Inst; 1518 field bits<48> SoftFail = 0; 1519 1520 bits<5> V1; 1521 bits<20> XBD2; 1522 bits<4> M3; 1523 1524 let Inst{47-40} = op{15-8}; 1525 let Inst{39-36} = V1{3-0}; 1526 let Inst{35-16} = XBD2; 1527 let Inst{15-12} = M3; 1528 let Inst{11} = V1{4}; 1529 let Inst{10-8} = 0; 1530 let Inst{7-0} = op{7-0}; 1531 } 1532 1533 class InstVSI<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern> 1534 : InstSystemZ<6, outs, ins, asmstr, pattern> { 1535 field bits<48> Inst; 1536 field bits<48> SoftFail = 0; 1537 1538 bits<5> V1; 1539 bits<16> BD2; 1540 bits<8> I3; 1541 1542 let Inst{47-40} = op{15-8}; 1543 let Inst{39-32} = I3; 1544 let Inst{31-16} = BD2; 1545 let Inst{15-12} = V1{3-0}; 1546 let Inst{11-9} = 0; 1547 let Inst{8} = V1{4}; 1548 let Inst{7-0} = op{7-0}; 1549 } 1550 1551 //===----------------------------------------------------------------------===// 1552 // Instruction classes for .insn directives 1553 //===----------------------------------------------------------------------===// 1554 1555 class DirectiveInsnE<dag outs, dag ins, string asmstr, list<dag> pattern> 1556 : InstE<0, outs, ins, asmstr, pattern> { 1557 bits<16> enc; 1558 1559 let Inst = enc; 1560 } 1561 1562 class DirectiveInsnRI<dag outs, dag ins, string asmstr, list<dag> pattern> 1563 : InstRIa<0, outs, ins, asmstr, pattern> { 1564 bits<32> enc; 1565 1566 let Inst{31-24} = enc{31-24}; 1567 let Inst{19-16} = enc{19-16}; 1568 } 1569 1570 class DirectiveInsnRIE<dag outs, dag ins, string asmstr, list<dag> pattern> 1571 : InstRIEd<0, outs, ins, asmstr, pattern> { 1572 bits<48> enc; 1573 1574 let Inst{47-40} = enc{47-40}; 1575 let Inst{7-0} = enc{7-0}; 1576 } 1577 1578 class DirectiveInsnRIL<dag outs, dag ins, string asmstr, list<dag> pattern> 1579 : InstRILa<0, outs, ins, asmstr, pattern> { 1580 bits<48> enc; 1581 string type; 1582 1583 let Inst{47-40} = enc{47-40}; 1584 let Inst{35-32} = enc{35-32}; 1585 } 1586 1587 class DirectiveInsnRIS<dag outs, dag ins, string asmstr, list<dag> pattern> 1588 : InstRIS<0, outs, ins, asmstr, pattern> { 1589 bits<48> enc; 1590 1591 let Inst{47-40} = enc{47-40}; 1592 let Inst{7-0} = enc{7-0}; 1593 } 1594 1595 class DirectiveInsnRR<dag outs, dag ins, string asmstr, list<dag> pattern> 1596 : InstRR<0, outs, ins, asmstr, pattern> { 1597 bits<16> enc; 1598 1599 let Inst{15-8} = enc{15-8}; 1600 } 1601 1602 class DirectiveInsnRRE<dag outs, dag ins, string asmstr, list<dag> pattern> 1603 : InstRRE<0, outs, ins, asmstr, pattern> { 1604 bits<32> enc; 1605 1606 let Inst{31-16} = enc{31-16}; 1607 } 1608 1609 class DirectiveInsnRRF<dag outs, dag ins, string asmstr, list<dag> pattern> 1610 : InstRRFa<0, outs, ins, asmstr, pattern> { 1611 bits<32> enc; 1612 1613 let Inst{31-16} = enc{31-16}; 1614 } 1615 1616 class DirectiveInsnRRS<dag outs, dag ins, string asmstr, list<dag> pattern> 1617 : InstRRS<0, outs, ins, asmstr, pattern> { 1618 bits<48> enc; 1619 1620 let Inst{47-40} = enc{47-40}; 1621 let Inst{7-0} = enc{7-0}; 1622 } 1623 1624 class DirectiveInsnRS<dag outs, dag ins, string asmstr, list<dag> pattern> 1625 : InstRSa<0, outs, ins, asmstr, pattern> { 1626 bits<32> enc; 1627 1628 let Inst{31-24} = enc{31-24}; 1629 } 1630 1631 // RSE is like RSY except with a 12 bit displacement (instead of 20). 1632 class DirectiveInsnRSE<dag outs, dag ins, string asmstr, list<dag> pattern> 1633 : InstRSYa<6, outs, ins, asmstr, pattern> { 1634 bits <48> enc; 1635 1636 let Inst{47-40} = enc{47-40}; 1637 let Inst{31-16} = BD2{15-0}; 1638 let Inst{15-8} = 0; 1639 let Inst{7-0} = enc{7-0}; 1640 } 1641 1642 class DirectiveInsnRSI<dag outs, dag ins, string asmstr, list<dag> pattern> 1643 : InstRSI<0, outs, ins, asmstr, pattern> { 1644 bits<32> enc; 1645 1646 let Inst{31-24} = enc{31-24}; 1647 } 1648 1649 class DirectiveInsnRSY<dag outs, dag ins, string asmstr, list<dag> pattern> 1650 : InstRSYa<0, outs, ins, asmstr, pattern> { 1651 bits<48> enc; 1652 1653 let Inst{47-40} = enc{47-40}; 1654 let Inst{7-0} = enc{7-0}; 1655 } 1656 1657 class DirectiveInsnRX<dag outs, dag ins, string asmstr, list<dag> pattern> 1658 : InstRXa<0, outs, ins, asmstr, pattern> { 1659 bits<32> enc; 1660 1661 let Inst{31-24} = enc{31-24}; 1662 } 1663 1664 class DirectiveInsnRXE<dag outs, dag ins, string asmstr, list<dag> pattern> 1665 : InstRXE<0, outs, ins, asmstr, pattern> { 1666 bits<48> enc; 1667 1668 let M3 = 0; 1669 1670 let Inst{47-40} = enc{47-40}; 1671 let Inst{7-0} = enc{7-0}; 1672 } 1673 1674 class DirectiveInsnRXF<dag outs, dag ins, string asmstr, list<dag> pattern> 1675 : InstRXF<0, outs, ins, asmstr, pattern> { 1676 bits<48> enc; 1677 1678 let Inst{47-40} = enc{47-40}; 1679 let Inst{7-0} = enc{7-0}; 1680 } 1681 1682 class DirectiveInsnRXY<dag outs, dag ins, string asmstr, list<dag> pattern> 1683 : InstRXYa<0, outs, ins, asmstr, pattern> { 1684 bits<48> enc; 1685 1686 let Inst{47-40} = enc{47-40}; 1687 let Inst{7-0} = enc{7-0}; 1688 } 1689 1690 class DirectiveInsnS<dag outs, dag ins, string asmstr, list<dag> pattern> 1691 : InstS<0, outs, ins, asmstr, pattern> { 1692 bits<32> enc; 1693 1694 let Inst{31-16} = enc{31-16}; 1695 } 1696 1697 class DirectiveInsnSI<dag outs, dag ins, string asmstr, list<dag> pattern> 1698 : InstSI<0, outs, ins, asmstr, pattern> { 1699 bits<32> enc; 1700 1701 let Inst{31-24} = enc{31-24}; 1702 } 1703 1704 class DirectiveInsnSIY<dag outs, dag ins, string asmstr, list<dag> pattern> 1705 : InstSIY<0, outs, ins, asmstr, pattern> { 1706 bits<48> enc; 1707 1708 let Inst{47-40} = enc{47-40}; 1709 let Inst{7-0} = enc{7-0}; 1710 } 1711 1712 class DirectiveInsnSIL<dag outs, dag ins, string asmstr, list<dag> pattern> 1713 : InstSIL<0, outs, ins, asmstr, pattern> { 1714 bits<48> enc; 1715 1716 let Inst{47-32} = enc{47-32}; 1717 } 1718 1719 class DirectiveInsnSS<dag outs, dag ins, string asmstr, list<dag> pattern> 1720 : InstSSd<0, outs, ins, asmstr, pattern> { 1721 bits<48> enc; 1722 1723 let Inst{47-40} = enc{47-40}; 1724 } 1725 1726 class DirectiveInsnSSE<dag outs, dag ins, string asmstr, list<dag> pattern> 1727 : InstSSE<0, outs, ins, asmstr, pattern> { 1728 bits<48> enc; 1729 1730 let Inst{47-32} = enc{47-32}; 1731 } 1732 1733 class DirectiveInsnSSF<dag outs, dag ins, string asmstr, list<dag> pattern> 1734 : InstSSF<0, outs, ins, asmstr, pattern> { 1735 bits<48> enc; 1736 1737 let Inst{47-40} = enc{47-40}; 1738 let Inst{35-32} = enc{35-32}; 1739 } 1740 1741 //===----------------------------------------------------------------------===// 1742 // Variants of instructions with condition mask 1743 //===----------------------------------------------------------------------===// 1744 // 1745 // For instructions using a condition mask (e.g. conditional branches, 1746 // compare-and-branch instructions, or conditional move instructions), 1747 // we generally need to create multiple instruction patterns: 1748 // 1749 // - One used for code generation, which encodes the condition mask as an 1750 // MI operand, but writes out an extended mnemonic for better readability. 1751 // - One pattern for the base form of the instruction with an explicit 1752 // condition mask (encoded as a plain integer MI operand). 1753 // - Specific patterns for each extended mnemonic, where the condition mask 1754 // is implied by the pattern name and not otherwise encoded at all. 1755 // 1756 // We need the latter primarily for the assembler and disassembler, since the 1757 // assembler parser is not able to decode part of an instruction mnemonic 1758 // into an operand. Thus we provide separate patterns for each mnemonic. 1759 // 1760 // Note that in some cases there are two different mnemonics for the same 1761 // condition mask. In this case we cannot have both instructions available 1762 // to the disassembler at the same time since the encodings are not distinct. 1763 // Therefore the alternate forms are marked isAsmParserOnly. 1764 // 1765 // We don't make one of the two names an alias of the other because 1766 // we need the custom parsing routines to select the correct register class. 1767 // 1768 // This section provides helpers for generating the specific forms. 1769 // 1770 //===----------------------------------------------------------------------===// 1771 1772 // A class to describe a variant of an instruction with condition mask. 1773 class CondVariant<bits<4> ccmaskin, string suffixin, bit alternatein> { 1774 // The fixed condition mask to use. 1775 bits<4> ccmask = ccmaskin; 1776 1777 // The suffix to use for the extended assembler mnemonic. 1778 string suffix = suffixin; 1779 1780 // Whether this is an alternate that needs to be marked isAsmParserOnly. 1781 bit alternate = alternatein; 1782 } 1783 1784 // Condition mask 15 means "always true", which is used to define 1785 // unconditional branches as a variant of conditional branches. 1786 def CondAlways : CondVariant<15, "", 0>; 1787 1788 // Condition masks for general instructions that can set all 4 bits. 1789 def CondVariantO : CondVariant<1, "o", 0>; 1790 def CondVariantH : CondVariant<2, "h", 0>; 1791 def CondVariantP : CondVariant<2, "p", 1>; 1792 def CondVariantNLE : CondVariant<3, "nle", 0>; 1793 def CondVariantL : CondVariant<4, "l", 0>; 1794 def CondVariantM : CondVariant<4, "m", 1>; 1795 def CondVariantNHE : CondVariant<5, "nhe", 0>; 1796 def CondVariantLH : CondVariant<6, "lh", 0>; 1797 def CondVariantNE : CondVariant<7, "ne", 0>; 1798 def CondVariantNZ : CondVariant<7, "nz", 1>; 1799 def CondVariantE : CondVariant<8, "e", 0>; 1800 def CondVariantZ : CondVariant<8, "z", 1>; 1801 def CondVariantNLH : CondVariant<9, "nlh", 0>; 1802 def CondVariantHE : CondVariant<10, "he", 0>; 1803 def CondVariantNL : CondVariant<11, "nl", 0>; 1804 def CondVariantNM : CondVariant<11, "nm", 1>; 1805 def CondVariantLE : CondVariant<12, "le", 0>; 1806 def CondVariantNH : CondVariant<13, "nh", 0>; 1807 def CondVariantNP : CondVariant<13, "np", 1>; 1808 def CondVariantNO : CondVariant<14, "no", 0>; 1809 1810 // A helper class to look up one of the above by name. 1811 class CV<string name> 1812 : CondVariant<!cast<CondVariant>("CondVariant"#name).ccmask, 1813 !cast<CondVariant>("CondVariant"#name).suffix, 1814 !cast<CondVariant>("CondVariant"#name).alternate>; 1815 1816 // Condition masks for integer instructions (e.g. compare-and-branch). 1817 // This is like the list above, except that condition 3 is not possible 1818 // and that the low bit of the mask is therefore always 0. This means 1819 // that each condition has two names. Conditions "o" and "no" are not used. 1820 def IntCondVariantH : CondVariant<2, "h", 0>; 1821 def IntCondVariantNLE : CondVariant<2, "nle", 1>; 1822 def IntCondVariantL : CondVariant<4, "l", 0>; 1823 def IntCondVariantNHE : CondVariant<4, "nhe", 1>; 1824 def IntCondVariantLH : CondVariant<6, "lh", 0>; 1825 def IntCondVariantNE : CondVariant<6, "ne", 1>; 1826 def IntCondVariantE : CondVariant<8, "e", 0>; 1827 def IntCondVariantNLH : CondVariant<8, "nlh", 1>; 1828 def IntCondVariantHE : CondVariant<10, "he", 0>; 1829 def IntCondVariantNL : CondVariant<10, "nl", 1>; 1830 def IntCondVariantLE : CondVariant<12, "le", 0>; 1831 def IntCondVariantNH : CondVariant<12, "nh", 1>; 1832 1833 // A helper class to look up one of the above by name. 1834 class ICV<string name> 1835 : CondVariant<!cast<CondVariant>("IntCondVariant"#name).ccmask, 1836 !cast<CondVariant>("IntCondVariant"#name).suffix, 1837 !cast<CondVariant>("IntCondVariant"#name).alternate>; 1838 1839 //===----------------------------------------------------------------------===// 1840 // Instruction definitions with semantics 1841 //===----------------------------------------------------------------------===// 1842 // 1843 // These classes have the form [Cond]<Category><Format>, where <Format> is one 1844 // of the formats defined above and where <Category> describes the inputs 1845 // and outputs. "Cond" is used if the instruction is conditional, 1846 // in which case the 4-bit condition-code mask is added as a final operand. 1847 // <Category> can be one of: 1848 // 1849 // Inherent: 1850 // One register output operand and no input operands. 1851 // 1852 // InherentDual: 1853 // Two register output operands and no input operands. 1854 // 1855 // StoreInherent: 1856 // One address operand. The instruction stores to the address. 1857 // 1858 // SideEffectInherent: 1859 // No input or output operands, but causes some side effect. 1860 // 1861 // Branch: 1862 // One branch target. The instruction branches to the target. 1863 // 1864 // Call: 1865 // One output operand and one branch target. The instruction stores 1866 // the return address to the output operand and branches to the target. 1867 // 1868 // CmpBranch: 1869 // Two input operands and one optional branch target. The instruction 1870 // compares the two input operands and branches or traps on the result. 1871 // 1872 // BranchUnary: 1873 // One register output operand, one register input operand and one branch 1874 // target. The instructions stores a modified form of the source register 1875 // in the destination register and branches on the result. 1876 // 1877 // BranchBinary: 1878 // One register output operand, two register input operands and one branch 1879 // target. The instructions stores a modified form of one of the source 1880 // registers in the destination register and branches on the result. 1881 // 1882 // LoadMultiple: 1883 // One address input operand and two explicit output operands. 1884 // The instruction loads a range of registers from the address, 1885 // with the explicit operands giving the first and last register 1886 // to load. Other loaded registers are added as implicit definitions. 1887 // 1888 // StoreMultiple: 1889 // Two explicit input register operands and an address operand. 1890 // The instruction stores a range of registers to the address, 1891 // with the explicit operands giving the first and last register 1892 // to store. Other stored registers are added as implicit uses. 1893 // 1894 // StoreLength: 1895 // One value operand, one length operand and one address operand. 1896 // The instruction stores the value operand to the address but 1897 // doesn't write more than the number of bytes specified by the 1898 // length operand. 1899 // 1900 // LoadAddress: 1901 // One register output operand and one address operand. 1902 // 1903 // SideEffectAddress: 1904 // One address operand. No output operands, but causes some side effect. 1905 // 1906 // Unary: 1907 // One register output operand and one input operand. 1908 // 1909 // Store: 1910 // One address operand and one other input operand. The instruction 1911 // stores to the address. 1912 // 1913 // SideEffectUnary: 1914 // One input operand. No output operands, but causes some side effect. 1915 // 1916 // Binary: 1917 // One register output operand and two input operands. 1918 // 1919 // StoreBinary: 1920 // One address operand and two other input operands. The instruction 1921 // stores to the address. 1922 // 1923 // SideEffectBinary: 1924 // Two input operands. No output operands, but causes some side effect. 1925 // 1926 // Compare: 1927 // Two input operands and an implicit CC output operand. 1928 // 1929 // Test: 1930 // One or two input operands and an implicit CC output operand. If 1931 // present, the second input operand is an "address" operand used as 1932 // a test class mask. 1933 // 1934 // Ternary: 1935 // One register output operand and three input operands. 1936 // 1937 // SideEffectTernary: 1938 // Three input operands. No output operands, but causes some side effect. 1939 // 1940 // Quaternary: 1941 // One register output operand and four input operands. 1942 // 1943 // LoadAndOp: 1944 // One output operand and two input operands, one of which is an address. 1945 // The instruction both reads from and writes to the address. 1946 // 1947 // CmpSwap: 1948 // One output operand and three input operands, one of which is an address. 1949 // The instruction both reads from and writes to the address. 1950 // 1951 // RotateSelect: 1952 // One output operand and five input operands. The first two operands 1953 // are registers and the other three are immediates. 1954 // 1955 // Prefetch: 1956 // One 4-bit immediate operand and one address operand. The immediate 1957 // operand is 1 for a load prefetch and 2 for a store prefetch. 1958 // 1959 // BranchPreload: 1960 // One 4-bit immediate operand and two address operands. 1961 // 1962 // The format determines which input operands are tied to output operands, 1963 // and also determines the shape of any address operand. 1964 // 1965 // Multiclasses of the form <Category><Format>Pair define two instructions, 1966 // one with <Category><Format> and one with <Category><Format>Y. The name 1967 // of the first instruction has no suffix, the name of the second has 1968 // an extra "y". 1969 // 1970 //===----------------------------------------------------------------------===// 1971 1972 class InherentRRE<string mnemonic, bits<16> opcode, RegisterOperand cls, 1973 SDPatternOperator operator> 1974 : InstRRE<opcode, (outs cls:$R1), (ins), 1975 mnemonic#"\t$R1", 1976 [(set cls:$R1, (operator))]> { 1977 let R2 = 0; 1978 } 1979 1980 class InherentDualRRE<string mnemonic, bits<16> opcode, RegisterOperand cls> 1981 : InstRRE<opcode, (outs cls:$R1, cls:$R2), (ins), 1982 mnemonic#"\t$R1, $R2", []>; 1983 1984 class InherentVRIa<string mnemonic, bits<16> opcode, bits<16> value> 1985 : InstVRIa<opcode, (outs VR128:$V1), (ins), mnemonic#"\t$V1", []> { 1986 let I2 = value; 1987 let M3 = 0; 1988 } 1989 1990 class StoreInherentS<string mnemonic, bits<16> opcode, 1991 SDPatternOperator operator, bits<5> bytes> 1992 : InstS<opcode, (outs), (ins bdaddr12only:$BD2), 1993 mnemonic#"\t$BD2", [(operator bdaddr12only:$BD2)]> { 1994 let mayStore = 1; 1995 let AccessBytes = bytes; 1996 } 1997 1998 class SideEffectInherentE<string mnemonic, bits<16>opcode> 1999 : InstE<opcode, (outs), (ins), mnemonic, []>; 2000 2001 class SideEffectInherentS<string mnemonic, bits<16> opcode, 2002 SDPatternOperator operator> 2003 : InstS<opcode, (outs), (ins), mnemonic, [(operator)]> { 2004 let BD2 = 0; 2005 } 2006 2007 class SideEffectInherentRRE<string mnemonic, bits<16> opcode> 2008 : InstRRE<opcode, (outs), (ins), mnemonic, []> { 2009 let R1 = 0; 2010 let R2 = 0; 2011 } 2012 2013 // Allow an optional TLS marker symbol to generate TLS call relocations. 2014 class CallRI<string mnemonic, bits<12> opcode> 2015 : InstRIb<opcode, (outs), (ins GR64:$R1, brtarget16tls:$RI2), 2016 mnemonic#"\t$R1, $RI2", []>; 2017 2018 // Allow an optional TLS marker symbol to generate TLS call relocations. 2019 class CallRIL<string mnemonic, bits<12> opcode> 2020 : InstRILb<opcode, (outs), (ins GR64:$R1, brtarget32tls:$RI2), 2021 mnemonic#"\t$R1, $RI2", []>; 2022 2023 class CallRR<string mnemonic, bits<8> opcode> 2024 : InstRR<opcode, (outs), (ins GR64:$R1, ADDR64:$R2), 2025 mnemonic#"\t$R1, $R2", []>; 2026 2027 class CallRX<string mnemonic, bits<8> opcode> 2028 : InstRXa<opcode, (outs), (ins GR64:$R1, bdxaddr12only:$XBD2), 2029 mnemonic#"\t$R1, $XBD2", []>; 2030 2031 class CondBranchRI<string mnemonic, bits<12> opcode, 2032 SDPatternOperator operator = null_frag> 2033 : InstRIc<opcode, (outs), (ins cond4:$valid, cond4:$M1, brtarget16:$RI2), 2034 !subst("#", "${M1}", mnemonic)#"\t$RI2", 2035 [(operator cond4:$valid, cond4:$M1, bb:$RI2)]> { 2036 let CCMaskFirst = 1; 2037 } 2038 2039 class AsmCondBranchRI<string mnemonic, bits<12> opcode> 2040 : InstRIc<opcode, (outs), (ins imm32zx4:$M1, brtarget16:$RI2), 2041 mnemonic#"\t$M1, $RI2", []>; 2042 2043 class FixedCondBranchRI<CondVariant V, string mnemonic, bits<12> opcode, 2044 SDPatternOperator operator = null_frag> 2045 : InstRIc<opcode, (outs), (ins brtarget16:$RI2), 2046 !subst("#", V.suffix, mnemonic)#"\t$RI2", [(operator bb:$RI2)]> { 2047 let isAsmParserOnly = V.alternate; 2048 let M1 = V.ccmask; 2049 } 2050 2051 class CondBranchRIL<string mnemonic, bits<12> opcode> 2052 : InstRILc<opcode, (outs), (ins cond4:$valid, cond4:$M1, brtarget32:$RI2), 2053 !subst("#", "${M1}", mnemonic)#"\t$RI2", []> { 2054 let CCMaskFirst = 1; 2055 } 2056 2057 class AsmCondBranchRIL<string mnemonic, bits<12> opcode> 2058 : InstRILc<opcode, (outs), (ins imm32zx4:$M1, brtarget32:$RI2), 2059 mnemonic#"\t$M1, $RI2", []>; 2060 2061 class FixedCondBranchRIL<CondVariant V, string mnemonic, bits<12> opcode> 2062 : InstRILc<opcode, (outs), (ins brtarget32:$RI2), 2063 !subst("#", V.suffix, mnemonic)#"\t$RI2", []> { 2064 let isAsmParserOnly = V.alternate; 2065 let M1 = V.ccmask; 2066 } 2067 2068 class CondBranchRR<string mnemonic, bits<8> opcode> 2069 : InstRR<opcode, (outs), (ins cond4:$valid, cond4:$R1, GR64:$R2), 2070 !subst("#", "${R1}", mnemonic)#"\t$R2", []> { 2071 let CCMaskFirst = 1; 2072 } 2073 2074 class AsmCondBranchRR<string mnemonic, bits<8> opcode> 2075 : InstRR<opcode, (outs), (ins imm32zx4:$R1, GR64:$R2), 2076 mnemonic#"\t$R1, $R2", []>; 2077 2078 class FixedCondBranchRR<CondVariant V, string mnemonic, bits<8> opcode, 2079 SDPatternOperator operator = null_frag> 2080 : InstRR<opcode, (outs), (ins ADDR64:$R2), 2081 !subst("#", V.suffix, mnemonic)#"\t$R2", [(operator ADDR64:$R2)]> { 2082 let isAsmParserOnly = V.alternate; 2083 let R1 = V.ccmask; 2084 } 2085 2086 class CondBranchRX<string mnemonic, bits<8> opcode> 2087 : InstRXb<opcode, (outs), (ins cond4:$valid, cond4:$M1, bdxaddr12only:$XBD2), 2088 !subst("#", "${M1}", mnemonic)#"\t$XBD2", []> { 2089 let CCMaskFirst = 1; 2090 } 2091 2092 class AsmCondBranchRX<string mnemonic, bits<8> opcode> 2093 : InstRXb<opcode, (outs), (ins imm32zx4:$M1, bdxaddr12only:$XBD2), 2094 mnemonic#"\t$M1, $XBD2", []>; 2095 2096 class FixedCondBranchRX<CondVariant V, string mnemonic, bits<8> opcode> 2097 : InstRXb<opcode, (outs), (ins bdxaddr12only:$XBD2), 2098 !subst("#", V.suffix, mnemonic)#"\t$XBD2", []> { 2099 let isAsmParserOnly = V.alternate; 2100 let M1 = V.ccmask; 2101 } 2102 2103 class CondBranchRXY<string mnemonic, bits<16> opcode> 2104 : InstRXYb<opcode, (outs), (ins cond4:$valid, cond4:$M1, bdxaddr20only:$XBD2), 2105 !subst("#", "${M1}", mnemonic)#"\t$XBD2", []> { 2106 let CCMaskFirst = 1; 2107 let mayLoad = 1; 2108 } 2109 2110 class AsmCondBranchRXY<string mnemonic, bits<16> opcode> 2111 : InstRXYb<opcode, (outs), (ins imm32zx4:$M1, bdxaddr20only:$XBD2), 2112 mnemonic#"\t$M1, $XBD2", []> { 2113 let mayLoad = 1; 2114 } 2115 2116 class FixedCondBranchRXY<CondVariant V, string mnemonic, bits<16> opcode, 2117 SDPatternOperator operator = null_frag> 2118 : InstRXYb<opcode, (outs), (ins bdxaddr20only:$XBD2), 2119 !subst("#", V.suffix, mnemonic)#"\t$XBD2", 2120 [(operator (load bdxaddr20only:$XBD2))]> { 2121 let isAsmParserOnly = V.alternate; 2122 let M1 = V.ccmask; 2123 let mayLoad = 1; 2124 } 2125 2126 class CmpBranchRIEa<string mnemonic, bits<16> opcode, 2127 RegisterOperand cls, Immediate imm> 2128 : InstRIEa<opcode, (outs), (ins cls:$R1, imm:$I2, cond4:$M3), 2129 mnemonic#"$M3\t$R1, $I2", []>; 2130 2131 class AsmCmpBranchRIEa<string mnemonic, bits<16> opcode, 2132 RegisterOperand cls, Immediate imm> 2133 : InstRIEa<opcode, (outs), (ins cls:$R1, imm:$I2, imm32zx4:$M3), 2134 mnemonic#"\t$R1, $I2, $M3", []>; 2135 2136 class FixedCmpBranchRIEa<CondVariant V, string mnemonic, bits<16> opcode, 2137 RegisterOperand cls, Immediate imm> 2138 : InstRIEa<opcode, (outs), (ins cls:$R1, imm:$I2), 2139 mnemonic#V.suffix#"\t$R1, $I2", []> { 2140 let isAsmParserOnly = V.alternate; 2141 let M3 = V.ccmask; 2142 } 2143 2144 multiclass CmpBranchRIEaPair<string mnemonic, bits<16> opcode, 2145 RegisterOperand cls, Immediate imm> { 2146 let isCodeGenOnly = 1 in 2147 def "" : CmpBranchRIEa<mnemonic, opcode, cls, imm>; 2148 def Asm : AsmCmpBranchRIEa<mnemonic, opcode, cls, imm>; 2149 } 2150 2151 class CmpBranchRIEb<string mnemonic, bits<16> opcode, 2152 RegisterOperand cls> 2153 : InstRIEb<opcode, (outs), 2154 (ins cls:$R1, cls:$R2, cond4:$M3, brtarget16:$RI4), 2155 mnemonic#"$M3\t$R1, $R2, $RI4", []>; 2156 2157 class AsmCmpBranchRIEb<string mnemonic, bits<16> opcode, 2158 RegisterOperand cls> 2159 : InstRIEb<opcode, (outs), 2160 (ins cls:$R1, cls:$R2, imm32zx4:$M3, brtarget16:$RI4), 2161 mnemonic#"\t$R1, $R2, $M3, $RI4", []>; 2162 2163 class FixedCmpBranchRIEb<CondVariant V, string mnemonic, bits<16> opcode, 2164 RegisterOperand cls> 2165 : InstRIEb<opcode, (outs), (ins cls:$R1, cls:$R2, brtarget16:$RI4), 2166 mnemonic#V.suffix#"\t$R1, $R2, $RI4", []> { 2167 let isAsmParserOnly = V.alternate; 2168 let M3 = V.ccmask; 2169 } 2170 2171 multiclass CmpBranchRIEbPair<string mnemonic, bits<16> opcode, 2172 RegisterOperand cls> { 2173 let isCodeGenOnly = 1 in 2174 def "" : CmpBranchRIEb<mnemonic, opcode, cls>; 2175 def Asm : AsmCmpBranchRIEb<mnemonic, opcode, cls>; 2176 } 2177 2178 class CmpBranchRIEc<string mnemonic, bits<16> opcode, 2179 RegisterOperand cls, Immediate imm> 2180 : InstRIEc<opcode, (outs), 2181 (ins cls:$R1, imm:$I2, cond4:$M3, brtarget16:$RI4), 2182 mnemonic#"$M3\t$R1, $I2, $RI4", []>; 2183 2184 class AsmCmpBranchRIEc<string mnemonic, bits<16> opcode, 2185 RegisterOperand cls, Immediate imm> 2186 : InstRIEc<opcode, (outs), 2187 (ins cls:$R1, imm:$I2, imm32zx4:$M3, brtarget16:$RI4), 2188 mnemonic#"\t$R1, $I2, $M3, $RI4", []>; 2189 2190 class FixedCmpBranchRIEc<CondVariant V, string mnemonic, bits<16> opcode, 2191 RegisterOperand cls, Immediate imm> 2192 : InstRIEc<opcode, (outs), (ins cls:$R1, imm:$I2, brtarget16:$RI4), 2193 mnemonic#V.suffix#"\t$R1, $I2, $RI4", []> { 2194 let isAsmParserOnly = V.alternate; 2195 let M3 = V.ccmask; 2196 } 2197 2198 multiclass CmpBranchRIEcPair<string mnemonic, bits<16> opcode, 2199 RegisterOperand cls, Immediate imm> { 2200 let isCodeGenOnly = 1 in 2201 def "" : CmpBranchRIEc<mnemonic, opcode, cls, imm>; 2202 def Asm : AsmCmpBranchRIEc<mnemonic, opcode, cls, imm>; 2203 } 2204 2205 class CmpBranchRRFc<string mnemonic, bits<16> opcode, 2206 RegisterOperand cls> 2207 : InstRRFc<opcode, (outs), (ins cls:$R1, cls:$R2, cond4:$M3), 2208 mnemonic#"$M3\t$R1, $R2", []>; 2209 2210 class AsmCmpBranchRRFc<string mnemonic, bits<16> opcode, 2211 RegisterOperand cls> 2212 : InstRRFc<opcode, (outs), (ins cls:$R1, cls:$R2, imm32zx4:$M3), 2213 mnemonic#"\t$R1, $R2, $M3", []>; 2214 2215 multiclass CmpBranchRRFcPair<string mnemonic, bits<16> opcode, 2216 RegisterOperand cls> { 2217 let isCodeGenOnly = 1 in 2218 def "" : CmpBranchRRFc<mnemonic, opcode, cls>; 2219 def Asm : AsmCmpBranchRRFc<mnemonic, opcode, cls>; 2220 } 2221 2222 class FixedCmpBranchRRFc<CondVariant V, string mnemonic, bits<16> opcode, 2223 RegisterOperand cls> 2224 : InstRRFc<opcode, (outs), (ins cls:$R1, cls:$R2), 2225 mnemonic#V.suffix#"\t$R1, $R2", []> { 2226 let isAsmParserOnly = V.alternate; 2227 let M3 = V.ccmask; 2228 } 2229 2230 class CmpBranchRRS<string mnemonic, bits<16> opcode, 2231 RegisterOperand cls> 2232 : InstRRS<opcode, (outs), 2233 (ins cls:$R1, cls:$R2, cond4:$M3, bdaddr12only:$BD4), 2234 mnemonic#"$M3\t$R1, $R2, $BD4", []>; 2235 2236 class AsmCmpBranchRRS<string mnemonic, bits<16> opcode, 2237 RegisterOperand cls> 2238 : InstRRS<opcode, (outs), 2239 (ins cls:$R1, cls:$R2, imm32zx4:$M3, bdaddr12only:$BD4), 2240 mnemonic#"\t$R1, $R2, $M3, $BD4", []>; 2241 2242 class FixedCmpBranchRRS<CondVariant V, string mnemonic, bits<16> opcode, 2243 RegisterOperand cls> 2244 : InstRRS<opcode, (outs), (ins cls:$R1, cls:$R2, bdaddr12only:$BD4), 2245 mnemonic#V.suffix#"\t$R1, $R2, $BD4", []> { 2246 let isAsmParserOnly = V.alternate; 2247 let M3 = V.ccmask; 2248 } 2249 2250 multiclass CmpBranchRRSPair<string mnemonic, bits<16> opcode, 2251 RegisterOperand cls> { 2252 let isCodeGenOnly = 1 in 2253 def "" : CmpBranchRRS<mnemonic, opcode, cls>; 2254 def Asm : AsmCmpBranchRRS<mnemonic, opcode, cls>; 2255 } 2256 2257 class CmpBranchRIS<string mnemonic, bits<16> opcode, 2258 RegisterOperand cls, Immediate imm> 2259 : InstRIS<opcode, (outs), 2260 (ins cls:$R1, imm:$I2, cond4:$M3, bdaddr12only:$BD4), 2261 mnemonic#"$M3\t$R1, $I2, $BD4", []>; 2262 2263 class AsmCmpBranchRIS<string mnemonic, bits<16> opcode, 2264 RegisterOperand cls, Immediate imm> 2265 : InstRIS<opcode, (outs), 2266 (ins cls:$R1, imm:$I2, imm32zx4:$M3, bdaddr12only:$BD4), 2267 mnemonic#"\t$R1, $I2, $M3, $BD4", []>; 2268 2269 class FixedCmpBranchRIS<CondVariant V, string mnemonic, bits<16> opcode, 2270 RegisterOperand cls, Immediate imm> 2271 : InstRIS<opcode, (outs), (ins cls:$R1, imm:$I2, bdaddr12only:$BD4), 2272 mnemonic#V.suffix#"\t$R1, $I2, $BD4", []> { 2273 let isAsmParserOnly = V.alternate; 2274 let M3 = V.ccmask; 2275 } 2276 2277 multiclass CmpBranchRISPair<string mnemonic, bits<16> opcode, 2278 RegisterOperand cls, Immediate imm> { 2279 let isCodeGenOnly = 1 in 2280 def "" : CmpBranchRIS<mnemonic, opcode, cls, imm>; 2281 def Asm : AsmCmpBranchRIS<mnemonic, opcode, cls, imm>; 2282 } 2283 2284 class CmpBranchRSYb<string mnemonic, bits<16> opcode, 2285 RegisterOperand cls> 2286 : InstRSYb<opcode, (outs), (ins cls:$R1, bdaddr20only:$BD2, cond4:$M3), 2287 mnemonic#"$M3\t$R1, $BD2", []>; 2288 2289 class AsmCmpBranchRSYb<string mnemonic, bits<16> opcode, 2290 RegisterOperand cls> 2291 : InstRSYb<opcode, (outs), (ins cls:$R1, bdaddr20only:$BD2, imm32zx4:$M3), 2292 mnemonic#"\t$R1, $M3, $BD2", []>; 2293 2294 multiclass CmpBranchRSYbPair<string mnemonic, bits<16> opcode, 2295 RegisterOperand cls> { 2296 let isCodeGenOnly = 1 in 2297 def "" : CmpBranchRSYb<mnemonic, opcode, cls>; 2298 def Asm : AsmCmpBranchRSYb<mnemonic, opcode, cls>; 2299 } 2300 2301 class FixedCmpBranchRSYb<CondVariant V, string mnemonic, bits<16> opcode, 2302 RegisterOperand cls> 2303 : InstRSYb<opcode, (outs), (ins cls:$R1, bdaddr20only:$BD2), 2304 mnemonic#V.suffix#"\t$R1, $BD2", []> { 2305 let isAsmParserOnly = V.alternate; 2306 let M3 = V.ccmask; 2307 } 2308 2309 class BranchUnaryRI<string mnemonic, bits<12> opcode, RegisterOperand cls> 2310 : InstRIb<opcode, (outs cls:$R1), (ins cls:$R1src, brtarget16:$RI2), 2311 mnemonic##"\t$R1, $RI2", []> { 2312 let Constraints = "$R1 = $R1src"; 2313 let DisableEncoding = "$R1src"; 2314 } 2315 2316 class BranchUnaryRIL<string mnemonic, bits<12> opcode, RegisterOperand cls> 2317 : InstRILb<opcode, (outs cls:$R1), (ins cls:$R1src, brtarget32:$RI2), 2318 mnemonic##"\t$R1, $RI2", []> { 2319 let Constraints = "$R1 = $R1src"; 2320 let DisableEncoding = "$R1src"; 2321 } 2322 2323 class BranchUnaryRR<string mnemonic, bits<8> opcode, RegisterOperand cls> 2324 : InstRR<opcode, (outs cls:$R1), (ins cls:$R1src, GR64:$R2), 2325 mnemonic##"\t$R1, $R2", []> { 2326 let Constraints = "$R1 = $R1src"; 2327 let DisableEncoding = "$R1src"; 2328 } 2329 2330 class BranchUnaryRRE<string mnemonic, bits<16> opcode, RegisterOperand cls> 2331 : InstRRE<opcode, (outs cls:$R1), (ins cls:$R1src, GR64:$R2), 2332 mnemonic##"\t$R1, $R2", []> { 2333 let Constraints = "$R1 = $R1src"; 2334 let DisableEncoding = "$R1src"; 2335 } 2336 2337 class BranchUnaryRX<string mnemonic, bits<8> opcode, RegisterOperand cls> 2338 : InstRXa<opcode, (outs cls:$R1), (ins cls:$R1src, bdxaddr12only:$XBD2), 2339 mnemonic##"\t$R1, $XBD2", []> { 2340 let Constraints = "$R1 = $R1src"; 2341 let DisableEncoding = "$R1src"; 2342 } 2343 2344 class BranchUnaryRXY<string mnemonic, bits<16> opcode, RegisterOperand cls> 2345 : InstRXYa<opcode, (outs cls:$R1), (ins cls:$R1src, bdxaddr20only:$XBD2), 2346 mnemonic##"\t$R1, $XBD2", []> { 2347 let Constraints = "$R1 = $R1src"; 2348 let DisableEncoding = "$R1src"; 2349 } 2350 2351 class BranchBinaryRSI<string mnemonic, bits<8> opcode, RegisterOperand cls> 2352 : InstRSI<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, brtarget16:$RI2), 2353 mnemonic##"\t$R1, $R3, $RI2", []> { 2354 let Constraints = "$R1 = $R1src"; 2355 let DisableEncoding = "$R1src"; 2356 } 2357 2358 class BranchBinaryRIEe<string mnemonic, bits<16> opcode, RegisterOperand cls> 2359 : InstRIEe<opcode, (outs cls:$R1), 2360 (ins cls:$R1src, cls:$R3, brtarget16:$RI2), 2361 mnemonic##"\t$R1, $R3, $RI2", []> { 2362 let Constraints = "$R1 = $R1src"; 2363 let DisableEncoding = "$R1src"; 2364 } 2365 2366 class BranchBinaryRS<string mnemonic, bits<8> opcode, RegisterOperand cls> 2367 : InstRSa<opcode, (outs cls:$R1), 2368 (ins cls:$R1src, cls:$R3, bdaddr12only:$BD2), 2369 mnemonic##"\t$R1, $R3, $BD2", []> { 2370 let Constraints = "$R1 = $R1src"; 2371 let DisableEncoding = "$R1src"; 2372 } 2373 2374 class BranchBinaryRSY<string mnemonic, bits<16> opcode, RegisterOperand cls> 2375 : InstRSYa<opcode, 2376 (outs cls:$R1), (ins cls:$R1src, cls:$R3, bdaddr20only:$BD2), 2377 mnemonic##"\t$R1, $R3, $BD2", []> { 2378 let Constraints = "$R1 = $R1src"; 2379 let DisableEncoding = "$R1src"; 2380 } 2381 2382 class LoadMultipleRS<string mnemonic, bits<8> opcode, RegisterOperand cls, 2383 AddressingMode mode = bdaddr12only> 2384 : InstRSa<opcode, (outs cls:$R1, cls:$R3), (ins mode:$BD2), 2385 mnemonic#"\t$R1, $R3, $BD2", []> { 2386 let mayLoad = 1; 2387 } 2388 2389 class LoadMultipleRSY<string mnemonic, bits<16> opcode, RegisterOperand cls, 2390 AddressingMode mode = bdaddr20only> 2391 : InstRSYa<opcode, (outs cls:$R1, cls:$R3), (ins mode:$BD2), 2392 mnemonic#"\t$R1, $R3, $BD2", []> { 2393 let mayLoad = 1; 2394 } 2395 2396 multiclass LoadMultipleRSPair<string mnemonic, bits<8> rsOpcode, 2397 bits<16> rsyOpcode, RegisterOperand cls> { 2398 let DispKey = mnemonic ## #cls in { 2399 let DispSize = "12" in 2400 def "" : LoadMultipleRS<mnemonic, rsOpcode, cls, bdaddr12pair>; 2401 let DispSize = "20" in 2402 def Y : LoadMultipleRSY<mnemonic#"y", rsyOpcode, cls, bdaddr20pair>; 2403 } 2404 } 2405 2406 class LoadMultipleSSe<string mnemonic, bits<8> opcode, RegisterOperand cls> 2407 : InstSSe<opcode, (outs cls:$R1, cls:$R3), 2408 (ins bdaddr12only:$BD2, bdaddr12only:$BD4), 2409 mnemonic#"\t$R1, $R3, $BD2, $BD4", []> { 2410 let mayLoad = 1; 2411 } 2412 2413 class LoadMultipleVRSa<string mnemonic, bits<16> opcode> 2414 : InstVRSa<opcode, (outs VR128:$V1, VR128:$V3), (ins bdaddr12only:$BD2), 2415 mnemonic#"\t$V1, $V3, $BD2", []> { 2416 let M4 = 0; 2417 let mayLoad = 1; 2418 } 2419 2420 class StoreRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator, 2421 RegisterOperand cls> 2422 : InstRILb<opcode, (outs), (ins cls:$R1, pcrel32:$RI2), 2423 mnemonic#"\t$R1, $RI2", 2424 [(operator cls:$R1, pcrel32:$RI2)]> { 2425 let mayStore = 1; 2426 // We want PC-relative addresses to be tried ahead of BD and BDX addresses. 2427 // However, BDXs have two extra operands and are therefore 6 units more 2428 // complex. 2429 let AddedComplexity = 7; 2430 } 2431 2432 class StoreRX<string mnemonic, bits<8> opcode, SDPatternOperator operator, 2433 RegisterOperand cls, bits<5> bytes, 2434 AddressingMode mode = bdxaddr12only> 2435 : InstRXa<opcode, (outs), (ins cls:$R1, mode:$XBD2), 2436 mnemonic#"\t$R1, $XBD2", 2437 [(operator cls:$R1, mode:$XBD2)]> { 2438 let OpKey = mnemonic#"r"#cls; 2439 let OpType = "mem"; 2440 let mayStore = 1; 2441 let AccessBytes = bytes; 2442 } 2443 2444 class StoreRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator, 2445 RegisterOperand cls, bits<5> bytes, 2446 AddressingMode mode = bdxaddr20only> 2447 : InstRXYa<opcode, (outs), (ins cls:$R1, mode:$XBD2), 2448 mnemonic#"\t$R1, $XBD2", 2449 [(operator cls:$R1, mode:$XBD2)]> { 2450 let OpKey = mnemonic#"r"#cls; 2451 let OpType = "mem"; 2452 let mayStore = 1; 2453 let AccessBytes = bytes; 2454 } 2455 2456 multiclass StoreRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode, 2457 SDPatternOperator operator, RegisterOperand cls, 2458 bits<5> bytes> { 2459 let DispKey = mnemonic ## #cls in { 2460 let DispSize = "12" in 2461 def "" : StoreRX<mnemonic, rxOpcode, operator, cls, bytes, bdxaddr12pair>; 2462 let DispSize = "20" in 2463 def Y : StoreRXY<mnemonic#"y", rxyOpcode, operator, cls, bytes, 2464 bdxaddr20pair>; 2465 } 2466 } 2467 2468 class StoreVRX<string mnemonic, bits<16> opcode, SDPatternOperator operator, 2469 TypedReg tr, bits<5> bytes, bits<4> type = 0> 2470 : InstVRX<opcode, (outs), (ins tr.op:$V1, bdxaddr12only:$XBD2), 2471 mnemonic#"\t$V1, $XBD2", 2472 [(set (tr.vt tr.op:$V1), (operator bdxaddr12only:$XBD2))]> { 2473 let M3 = type; 2474 let mayStore = 1; 2475 let AccessBytes = bytes; 2476 } 2477 2478 class StoreLengthVRSb<string mnemonic, bits<16> opcode, 2479 SDPatternOperator operator, bits<5> bytes> 2480 : InstVRSb<opcode, (outs), (ins VR128:$V1, GR32:$R3, bdaddr12only:$BD2), 2481 mnemonic#"\t$V1, $R3, $BD2", 2482 [(operator VR128:$V1, GR32:$R3, bdaddr12only:$BD2)]> { 2483 let M4 = 0; 2484 let mayStore = 1; 2485 let AccessBytes = bytes; 2486 } 2487 2488 class StoreLengthVRSd<string mnemonic, bits<16> opcode, 2489 SDPatternOperator operator, bits<5> bytes> 2490 : InstVRSd<opcode, (outs), (ins VR128:$V1, GR32:$R3, bdaddr12only:$BD2), 2491 mnemonic#"\t$V1, $R3, $BD2", 2492 [(operator VR128:$V1, GR32:$R3, bdaddr12only:$BD2)]> { 2493 let mayStore = 1; 2494 let AccessBytes = bytes; 2495 } 2496 2497 class StoreLengthVSI<string mnemonic, bits<16> opcode, 2498 SDPatternOperator operator, bits<5> bytes> 2499 : InstVSI<opcode, (outs), (ins VR128:$V1, bdaddr12only:$BD2, imm32zx8:$I3), 2500 mnemonic#"\t$V1, $BD2, $I3", 2501 [(operator VR128:$V1, imm32zx8:$I3, bdaddr12only:$BD2)]> { 2502 let mayStore = 1; 2503 let AccessBytes = bytes; 2504 } 2505 2506 class StoreMultipleRS<string mnemonic, bits<8> opcode, RegisterOperand cls, 2507 AddressingMode mode = bdaddr12only> 2508 : InstRSa<opcode, (outs), (ins cls:$R1, cls:$R3, mode:$BD2), 2509 mnemonic#"\t$R1, $R3, $BD2", []> { 2510 let mayStore = 1; 2511 } 2512 2513 class StoreMultipleRSY<string mnemonic, bits<16> opcode, RegisterOperand cls, 2514 AddressingMode mode = bdaddr20only> 2515 : InstRSYa<opcode, (outs), (ins cls:$R1, cls:$R3, mode:$BD2), 2516 mnemonic#"\t$R1, $R3, $BD2", []> { 2517 let mayStore = 1; 2518 } 2519 2520 multiclass StoreMultipleRSPair<string mnemonic, bits<8> rsOpcode, 2521 bits<16> rsyOpcode, RegisterOperand cls> { 2522 let DispKey = mnemonic ## #cls in { 2523 let DispSize = "12" in 2524 def "" : StoreMultipleRS<mnemonic, rsOpcode, cls, bdaddr12pair>; 2525 let DispSize = "20" in 2526 def Y : StoreMultipleRSY<mnemonic#"y", rsyOpcode, cls, bdaddr20pair>; 2527 } 2528 } 2529 2530 class StoreMultipleVRSa<string mnemonic, bits<16> opcode> 2531 : InstVRSa<opcode, (outs), (ins VR128:$V1, VR128:$V3, bdaddr12only:$BD2), 2532 mnemonic#"\t$V1, $V3, $BD2", []> { 2533 let M4 = 0; 2534 let mayStore = 1; 2535 } 2536 2537 // StoreSI* instructions are used to store an integer to memory, but the 2538 // addresses are more restricted than for normal stores. If we are in the 2539 // situation of having to force either the address into a register or the 2540 // constant into a register, it's usually better to do the latter. 2541 // We therefore match the address in the same way as a normal store and 2542 // only use the StoreSI* instruction if the matched address is suitable. 2543 class StoreSI<string mnemonic, bits<8> opcode, SDPatternOperator operator, 2544 Immediate imm> 2545 : InstSI<opcode, (outs), (ins mviaddr12pair:$BD1, imm:$I2), 2546 mnemonic#"\t$BD1, $I2", 2547 [(operator imm:$I2, mviaddr12pair:$BD1)]> { 2548 let mayStore = 1; 2549 } 2550 2551 class StoreSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator, 2552 Immediate imm> 2553 : InstSIY<opcode, (outs), (ins mviaddr20pair:$BD1, imm:$I2), 2554 mnemonic#"\t$BD1, $I2", 2555 [(operator imm:$I2, mviaddr20pair:$BD1)]> { 2556 let mayStore = 1; 2557 } 2558 2559 class StoreSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator, 2560 Immediate imm> 2561 : InstSIL<opcode, (outs), (ins mviaddr12pair:$BD1, imm:$I2), 2562 mnemonic#"\t$BD1, $I2", 2563 [(operator imm:$I2, mviaddr12pair:$BD1)]> { 2564 let mayStore = 1; 2565 } 2566 2567 multiclass StoreSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode, 2568 SDPatternOperator operator, Immediate imm> { 2569 let DispKey = mnemonic in { 2570 let DispSize = "12" in 2571 def "" : StoreSI<mnemonic, siOpcode, operator, imm>; 2572 let DispSize = "20" in 2573 def Y : StoreSIY<mnemonic#"y", siyOpcode, operator, imm>; 2574 } 2575 } 2576 2577 class StoreSSE<string mnemonic, bits<16> opcode> 2578 : InstSSE<opcode, (outs), (ins bdaddr12only:$BD1, bdaddr12only:$BD2), 2579 mnemonic#"\t$BD1, $BD2", []> { 2580 let mayStore = 1; 2581 } 2582 2583 class CondStoreRSY<string mnemonic, bits<16> opcode, 2584 RegisterOperand cls, bits<5> bytes, 2585 AddressingMode mode = bdaddr20only> 2586 : InstRSYb<opcode, (outs), (ins cls:$R1, mode:$BD2, cond4:$valid, cond4:$M3), 2587 mnemonic#"$M3\t$R1, $BD2", []> { 2588 let mayStore = 1; 2589 let AccessBytes = bytes; 2590 let CCMaskLast = 1; 2591 } 2592 2593 // Like CondStoreRSY, but used for the raw assembly form. The condition-code 2594 // mask is the third operand rather than being part of the mnemonic. 2595 class AsmCondStoreRSY<string mnemonic, bits<16> opcode, 2596 RegisterOperand cls, bits<5> bytes, 2597 AddressingMode mode = bdaddr20only> 2598 : InstRSYb<opcode, (outs), (ins cls:$R1, mode:$BD2, imm32zx4:$M3), 2599 mnemonic#"\t$R1, $BD2, $M3", []> { 2600 let mayStore = 1; 2601 let AccessBytes = bytes; 2602 } 2603 2604 // Like CondStoreRSY, but with a fixed CC mask. 2605 class FixedCondStoreRSY<CondVariant V, string mnemonic, bits<16> opcode, 2606 RegisterOperand cls, bits<5> bytes, 2607 AddressingMode mode = bdaddr20only> 2608 : InstRSYb<opcode, (outs), (ins cls:$R1, mode:$BD2), 2609 mnemonic#V.suffix#"\t$R1, $BD2", []> { 2610 let mayStore = 1; 2611 let AccessBytes = bytes; 2612 let isAsmParserOnly = V.alternate; 2613 let M3 = V.ccmask; 2614 } 2615 2616 multiclass CondStoreRSYPair<string mnemonic, bits<16> opcode, 2617 RegisterOperand cls, bits<5> bytes, 2618 AddressingMode mode = bdaddr20only> { 2619 let isCodeGenOnly = 1 in 2620 def "" : CondStoreRSY<mnemonic, opcode, cls, bytes, mode>; 2621 def Asm : AsmCondStoreRSY<mnemonic, opcode, cls, bytes, mode>; 2622 } 2623 2624 class SideEffectUnaryI<string mnemonic, bits<8> opcode, Immediate imm> 2625 : InstI<opcode, (outs), (ins imm:$I1), 2626 mnemonic#"\t$I1", []>; 2627 2628 class SideEffectUnaryRR<string mnemonic, bits<8>opcode, RegisterOperand cls> 2629 : InstRR<opcode, (outs), (ins cls:$R1), 2630 mnemonic#"\t$R1", []> { 2631 let R2 = 0; 2632 } 2633 2634 class SideEffectUnaryRRE<string mnemonic, bits<16> opcode, RegisterOperand cls, 2635 SDPatternOperator operator> 2636 : InstRRE<opcode, (outs), (ins cls:$R1), 2637 mnemonic#"\t$R1", [(operator cls:$R1)]> { 2638 let R2 = 0; 2639 } 2640 2641 class SideEffectUnaryS<string mnemonic, bits<16> opcode, 2642 SDPatternOperator operator, bits<5> bytes, 2643 AddressingMode mode = bdaddr12only> 2644 : InstS<opcode, (outs), (ins mode:$BD2), 2645 mnemonic#"\t$BD2", [(operator mode:$BD2)]> { 2646 let mayLoad = 1; 2647 let AccessBytes = bytes; 2648 } 2649 2650 class SideEffectAddressS<string mnemonic, bits<16> opcode, 2651 SDPatternOperator operator, 2652 AddressingMode mode = bdaddr12only> 2653 : InstS<opcode, (outs), (ins mode:$BD2), 2654 mnemonic#"\t$BD2", [(operator mode:$BD2)]>; 2655 2656 class LoadAddressRX<string mnemonic, bits<8> opcode, 2657 SDPatternOperator operator, AddressingMode mode> 2658 : InstRXa<opcode, (outs GR64:$R1), (ins mode:$XBD2), 2659 mnemonic#"\t$R1, $XBD2", 2660 [(set GR64:$R1, (operator mode:$XBD2))]>; 2661 2662 class LoadAddressRXY<string mnemonic, bits<16> opcode, 2663 SDPatternOperator operator, AddressingMode mode> 2664 : InstRXYa<opcode, (outs GR64:$R1), (ins mode:$XBD2), 2665 mnemonic#"\t$R1, $XBD2", 2666 [(set GR64:$R1, (operator mode:$XBD2))]>; 2667 2668 multiclass LoadAddressRXPair<string mnemonic, bits<8> rxOpcode, 2669 bits<16> rxyOpcode, SDPatternOperator operator> { 2670 let DispKey = mnemonic in { 2671 let DispSize = "12" in 2672 def "" : LoadAddressRX<mnemonic, rxOpcode, operator, laaddr12pair>; 2673 let DispSize = "20" in 2674 def Y : LoadAddressRXY<mnemonic#"y", rxyOpcode, operator, laaddr20pair>; 2675 } 2676 } 2677 2678 class LoadAddressRIL<string mnemonic, bits<12> opcode, 2679 SDPatternOperator operator> 2680 : InstRILb<opcode, (outs GR64:$R1), (ins pcrel32:$RI2), 2681 mnemonic#"\t$R1, $RI2", 2682 [(set GR64:$R1, (operator pcrel32:$RI2))]>; 2683 2684 class UnaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator, 2685 RegisterOperand cls1, RegisterOperand cls2> 2686 : InstRR<opcode, (outs cls1:$R1), (ins cls2:$R2), 2687 mnemonic#"\t$R1, $R2", 2688 [(set cls1:$R1, (operator cls2:$R2))]> { 2689 let OpKey = mnemonic#cls1; 2690 let OpType = "reg"; 2691 } 2692 2693 class UnaryRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator, 2694 RegisterOperand cls1, RegisterOperand cls2> 2695 : InstRRE<opcode, (outs cls1:$R1), (ins cls2:$R2), 2696 mnemonic#"\t$R1, $R2", 2697 [(set cls1:$R1, (operator cls2:$R2))]> { 2698 let OpKey = mnemonic#cls1; 2699 let OpType = "reg"; 2700 } 2701 2702 class UnaryTiedRRE<string mnemonic, bits<16> opcode, RegisterOperand cls> 2703 : InstRRE<opcode, (outs cls:$R1), (ins cls:$R1src), 2704 mnemonic#"\t$R1", []> { 2705 let Constraints = "$R1 = $R1src"; 2706 let DisableEncoding = "$R1src"; 2707 let R2 = 0; 2708 } 2709 2710 class UnaryMemRRFc<string mnemonic, bits<16> opcode, 2711 RegisterOperand cls1, RegisterOperand cls2> 2712 : InstRRFc<opcode, (outs cls2:$R2, cls1:$R1), (ins cls1:$R1src), 2713 mnemonic#"\t$R1, $R2", []> { 2714 let Constraints = "$R1 = $R1src"; 2715 let DisableEncoding = "$R1src"; 2716 let M3 = 0; 2717 } 2718 2719 class UnaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator, 2720 RegisterOperand cls, Immediate imm> 2721 : InstRIa<opcode, (outs cls:$R1), (ins imm:$I2), 2722 mnemonic#"\t$R1, $I2", 2723 [(set cls:$R1, (operator imm:$I2))]>; 2724 2725 class UnaryRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator, 2726 RegisterOperand cls, Immediate imm> 2727 : InstRILa<opcode, (outs cls:$R1), (ins imm:$I2), 2728 mnemonic#"\t$R1, $I2", 2729 [(set cls:$R1, (operator imm:$I2))]>; 2730 2731 class UnaryRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator, 2732 RegisterOperand cls> 2733 : InstRILb<opcode, (outs cls:$R1), (ins pcrel32:$RI2), 2734 mnemonic#"\t$R1, $RI2", 2735 [(set cls:$R1, (operator pcrel32:$RI2))]> { 2736 let mayLoad = 1; 2737 // We want PC-relative addresses to be tried ahead of BD and BDX addresses. 2738 // However, BDXs have two extra operands and are therefore 6 units more 2739 // complex. 2740 let AddedComplexity = 7; 2741 } 2742 2743 class CondUnaryRSY<string mnemonic, bits<16> opcode, 2744 SDPatternOperator operator, RegisterOperand cls, 2745 bits<5> bytes, AddressingMode mode = bdaddr20only> 2746 : InstRSYb<opcode, (outs cls:$R1), 2747 (ins cls:$R1src, mode:$BD2, cond4:$valid, cond4:$M3), 2748 mnemonic#"$M3\t$R1, $BD2", 2749 [(set cls:$R1, 2750 (z_select_ccmask (operator bdaddr20only:$BD2), cls:$R1src, 2751 cond4:$valid, cond4:$M3))]> { 2752 let Constraints = "$R1 = $R1src"; 2753 let DisableEncoding = "$R1src"; 2754 let mayLoad = 1; 2755 let AccessBytes = bytes; 2756 let CCMaskLast = 1; 2757 } 2758 2759 // Like CondUnaryRSY, but used for the raw assembly form. The condition-code 2760 // mask is the third operand rather than being part of the mnemonic. 2761 class AsmCondUnaryRSY<string mnemonic, bits<16> opcode, 2762 RegisterOperand cls, bits<5> bytes, 2763 AddressingMode mode = bdaddr20only> 2764 : InstRSYb<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$BD2, imm32zx4:$M3), 2765 mnemonic#"\t$R1, $BD2, $M3", []> { 2766 let mayLoad = 1; 2767 let AccessBytes = bytes; 2768 let Constraints = "$R1 = $R1src"; 2769 let DisableEncoding = "$R1src"; 2770 } 2771 2772 // Like CondUnaryRSY, but with a fixed CC mask. 2773 class FixedCondUnaryRSY<CondVariant V, string mnemonic, bits<16> opcode, 2774 RegisterOperand cls, bits<5> bytes, 2775 AddressingMode mode = bdaddr20only> 2776 : InstRSYb<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$BD2), 2777 mnemonic#V.suffix#"\t$R1, $BD2", []> { 2778 let Constraints = "$R1 = $R1src"; 2779 let DisableEncoding = "$R1src"; 2780 let mayLoad = 1; 2781 let AccessBytes = bytes; 2782 let isAsmParserOnly = V.alternate; 2783 let M3 = V.ccmask; 2784 } 2785 2786 multiclass CondUnaryRSYPair<string mnemonic, bits<16> opcode, 2787 SDPatternOperator operator, 2788 RegisterOperand cls, bits<5> bytes, 2789 AddressingMode mode = bdaddr20only> { 2790 let isCodeGenOnly = 1 in 2791 def "" : CondUnaryRSY<mnemonic, opcode, operator, cls, bytes, mode>; 2792 def Asm : AsmCondUnaryRSY<mnemonic, opcode, cls, bytes, mode>; 2793 } 2794 2795 class UnaryRX<string mnemonic, bits<8> opcode, SDPatternOperator operator, 2796 RegisterOperand cls, bits<5> bytes, 2797 AddressingMode mode = bdxaddr12only> 2798 : InstRXa<opcode, (outs cls:$R1), (ins mode:$XBD2), 2799 mnemonic#"\t$R1, $XBD2", 2800 [(set cls:$R1, (operator mode:$XBD2))]> { 2801 let OpKey = mnemonic#"r"#cls; 2802 let OpType = "mem"; 2803 let mayLoad = 1; 2804 let AccessBytes = bytes; 2805 } 2806 2807 class UnaryRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator, 2808 RegisterOperand cls, bits<5> bytes> 2809 : InstRXE<opcode, (outs cls:$R1), (ins bdxaddr12only:$XBD2), 2810 mnemonic#"\t$R1, $XBD2", 2811 [(set cls:$R1, (operator bdxaddr12only:$XBD2))]> { 2812 let OpKey = mnemonic#"r"#cls; 2813 let OpType = "mem"; 2814 let mayLoad = 1; 2815 let AccessBytes = bytes; 2816 let M3 = 0; 2817 } 2818 2819 class UnaryRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator, 2820 RegisterOperand cls, bits<5> bytes, 2821 AddressingMode mode = bdxaddr20only> 2822 : InstRXYa<opcode, (outs cls:$R1), (ins mode:$XBD2), 2823 mnemonic#"\t$R1, $XBD2", 2824 [(set cls:$R1, (operator mode:$XBD2))]> { 2825 let OpKey = mnemonic#"r"#cls; 2826 let OpType = "mem"; 2827 let mayLoad = 1; 2828 let AccessBytes = bytes; 2829 } 2830 2831 multiclass UnaryRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode, 2832 SDPatternOperator operator, RegisterOperand cls, 2833 bits<5> bytes> { 2834 let DispKey = mnemonic ## #cls in { 2835 let DispSize = "12" in 2836 def "" : UnaryRX<mnemonic, rxOpcode, operator, cls, bytes, bdxaddr12pair>; 2837 let DispSize = "20" in 2838 def Y : UnaryRXY<mnemonic#"y", rxyOpcode, operator, cls, bytes, 2839 bdxaddr20pair>; 2840 } 2841 } 2842 2843 class UnaryVRIa<string mnemonic, bits<16> opcode, SDPatternOperator operator, 2844 TypedReg tr, Immediate imm, bits<4> type = 0> 2845 : InstVRIa<opcode, (outs tr.op:$V1), (ins imm:$I2), 2846 mnemonic#"\t$V1, $I2", 2847 [(set (tr.vt tr.op:$V1), (operator imm:$I2))]> { 2848 let M3 = type; 2849 } 2850 2851 class UnaryVRIaGeneric<string mnemonic, bits<16> opcode, Immediate imm> 2852 : InstVRIa<opcode, (outs VR128:$V1), (ins imm:$I2, imm32zx4:$M3), 2853 mnemonic#"\t$V1, $I2, $M3", []>; 2854 2855 class UnaryVRRa<string mnemonic, bits<16> opcode, SDPatternOperator operator, 2856 TypedReg tr1, TypedReg tr2, bits<4> type = 0, bits<4> m4 = 0, 2857 bits<4> m5 = 0> 2858 : InstVRRa<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2), 2859 mnemonic#"\t$V1, $V2", 2860 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2)))]> { 2861 let M3 = type; 2862 let M4 = m4; 2863 let M5 = m5; 2864 } 2865 2866 class UnaryVRRaGeneric<string mnemonic, bits<16> opcode, bits<4> m4 = 0, 2867 bits<4> m5 = 0> 2868 : InstVRRa<opcode, (outs VR128:$V1), (ins VR128:$V2, imm32zx4:$M3), 2869 mnemonic#"\t$V1, $V2, $M3", []> { 2870 let M4 = m4; 2871 let M5 = m5; 2872 } 2873 2874 class UnaryVRRaFloatGeneric<string mnemonic, bits<16> opcode, bits<4> m5 = 0> 2875 : InstVRRa<opcode, (outs VR128:$V1), 2876 (ins VR128:$V2, imm32zx4:$M3, imm32zx4:$M4), 2877 mnemonic#"\t$V1, $V2, $M3, $M4", []> { 2878 let M5 = m5; 2879 } 2880 2881 // Declare a pair of instructions, one which sets CC and one which doesn't. 2882 // The CC-setting form ends with "S" and sets the low bit of M5. 2883 // The form that does not set CC has an extra operand to optionally allow 2884 // specifying arbitrary M5 values in assembler. 2885 multiclass UnaryExtraVRRaSPair<string mnemonic, bits<16> opcode, 2886 SDPatternOperator operator, 2887 SDPatternOperator operator_cc, 2888 TypedReg tr1, TypedReg tr2, bits<4> type> { 2889 let M3 = type, M4 = 0 in 2890 def "" : InstVRRa<opcode, (outs tr1.op:$V1), 2891 (ins tr2.op:$V2, imm32zx4:$M5), 2892 mnemonic#"\t$V1, $V2, $M5", []>; 2893 def : Pat<(tr1.vt (operator (tr2.vt tr2.op:$V2))), 2894 (!cast<Instruction>(NAME) tr2.op:$V2, 0)>; 2895 def : InstAlias<mnemonic#"\t$V1, $V2", 2896 (!cast<Instruction>(NAME) tr1.op:$V1, tr2.op:$V2, 0)>; 2897 let Defs = [CC] in 2898 def S : UnaryVRRa<mnemonic##"s", opcode, operator_cc, tr1, tr2, 2899 type, 0, 1>; 2900 } 2901 2902 multiclass UnaryExtraVRRaSPairGeneric<string mnemonic, bits<16> opcode> { 2903 let M4 = 0 in 2904 def "" : InstVRRa<opcode, (outs VR128:$V1), 2905 (ins VR128:$V2, imm32zx4:$M3, imm32zx4:$M5), 2906 mnemonic#"\t$V1, $V2, $M3, $M5", []>; 2907 def : InstAlias<mnemonic#"\t$V1, $V2, $M3", 2908 (!cast<Instruction>(NAME) VR128:$V1, VR128:$V2, 2909 imm32zx4:$M3, 0)>; 2910 } 2911 2912 class UnaryVRX<string mnemonic, bits<16> opcode, SDPatternOperator operator, 2913 TypedReg tr, bits<5> bytes, bits<4> type = 0> 2914 : InstVRX<opcode, (outs tr.op:$V1), (ins bdxaddr12only:$XBD2), 2915 mnemonic#"\t$V1, $XBD2", 2916 [(set (tr.vt tr.op:$V1), (operator bdxaddr12only:$XBD2))]> { 2917 let M3 = type; 2918 let mayLoad = 1; 2919 let AccessBytes = bytes; 2920 } 2921 2922 class UnaryVRXGeneric<string mnemonic, bits<16> opcode> 2923 : InstVRX<opcode, (outs VR128:$V1), (ins bdxaddr12only:$XBD2, imm32zx4:$M3), 2924 mnemonic#"\t$V1, $XBD2, $M3", []> { 2925 let mayLoad = 1; 2926 } 2927 2928 class SideEffectBinaryRX<string mnemonic, bits<8> opcode, 2929 RegisterOperand cls> 2930 : InstRXa<opcode, (outs), (ins cls:$R1, bdxaddr12only:$XBD2), 2931 mnemonic##"\t$R1, $XBD2", []>; 2932 2933 class SideEffectBinaryRXY<string mnemonic, bits<16> opcode, 2934 RegisterOperand cls> 2935 : InstRXYa<opcode, (outs), (ins cls:$R1, bdxaddr20only:$XBD2), 2936 mnemonic##"\t$R1, $XBD2", []>; 2937 2938 class SideEffectBinaryRILPC<string mnemonic, bits<12> opcode, 2939 RegisterOperand cls> 2940 : InstRILb<opcode, (outs), (ins cls:$R1, pcrel32:$RI2), 2941 mnemonic##"\t$R1, $RI2", []> { 2942 // We want PC-relative addresses to be tried ahead of BD and BDX addresses. 2943 // However, BDXs have two extra operands and are therefore 6 units more 2944 // complex. 2945 let AddedComplexity = 7; 2946 } 2947 2948 class SideEffectBinaryRRE<string mnemonic, bits<16> opcode, 2949 RegisterOperand cls1, RegisterOperand cls2> 2950 : InstRRE<opcode, (outs), (ins cls1:$R1, cls2:$R2), 2951 mnemonic#"\t$R1, $R2", []>; 2952 2953 class SideEffectBinaryRRFa<string mnemonic, bits<16> opcode, 2954 RegisterOperand cls1, RegisterOperand cls2> 2955 : InstRRFa<opcode, (outs), (ins cls1:$R1, cls2:$R2), 2956 mnemonic#"\t$R1, $R2", []> { 2957 let R3 = 0; 2958 let M4 = 0; 2959 } 2960 2961 class SideEffectBinaryRRFc<string mnemonic, bits<16> opcode, 2962 RegisterOperand cls1, RegisterOperand cls2> 2963 : InstRRFc<opcode, (outs), (ins cls1:$R1, cls2:$R2), 2964 mnemonic#"\t$R1, $R2", []> { 2965 let M3 = 0; 2966 } 2967 2968 class SideEffectBinaryIE<string mnemonic, bits<16> opcode, 2969 Immediate imm1, Immediate imm2> 2970 : InstIE<opcode, (outs), (ins imm1:$I1, imm2:$I2), 2971 mnemonic#"\t$I1, $I2", []>; 2972 2973 class SideEffectBinarySI<string mnemonic, bits<8> opcode, Operand imm> 2974 : InstSI<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2), 2975 mnemonic#"\t$BD1, $I2", []>; 2976 2977 class SideEffectBinarySIL<string mnemonic, bits<16> opcode, 2978 SDPatternOperator operator, Immediate imm> 2979 : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2), 2980 mnemonic#"\t$BD1, $I2", [(operator bdaddr12only:$BD1, imm:$I2)]>; 2981 2982 class SideEffectBinarySSa<string mnemonic, bits<8> opcode> 2983 : InstSSa<opcode, (outs), (ins bdladdr12onlylen8:$BDL1, bdaddr12only:$BD2), 2984 mnemonic##"\t$BDL1, $BD2", []>; 2985 2986 class SideEffectBinarySSb<string mnemonic, bits<8> opcode> 2987 : InstSSb<opcode, 2988 (outs), (ins bdladdr12onlylen4:$BDL1, bdladdr12onlylen4:$BDL2), 2989 mnemonic##"\t$BDL1, $BDL2", []>; 2990 2991 class SideEffectBinarySSf<string mnemonic, bits<8> opcode> 2992 : InstSSf<opcode, (outs), (ins bdaddr12only:$BD1, bdladdr12onlylen8:$BDL2), 2993 mnemonic##"\t$BD1, $BDL2", []>; 2994 2995 class SideEffectBinarySSE<string mnemonic, bits<16> opcode> 2996 : InstSSE<opcode, (outs), (ins bdaddr12only:$BD1, bdaddr12only:$BD2), 2997 mnemonic#"\t$BD1, $BD2", []>; 2998 2999 class SideEffectBinaryMemMemRR<string mnemonic, bits<8> opcode, 3000 RegisterOperand cls1, RegisterOperand cls2> 3001 : InstRR<opcode, (outs cls1:$R1, cls2:$R2), (ins cls1:$R1src, cls2:$R2src), 3002 mnemonic#"\t$R1, $R2", []> { 3003 let Constraints = "$R1 = $R1src, $R2 = $R2src"; 3004 let DisableEncoding = "$R1src, $R2src"; 3005 } 3006 3007 class SideEffectBinaryMemRRE<string mnemonic, bits<16> opcode, 3008 RegisterOperand cls1, RegisterOperand cls2> 3009 : InstRRE<opcode, (outs cls2:$R2), (ins cls1:$R1, cls2:$R2src), 3010 mnemonic#"\t$R1, $R2", []> { 3011 let Constraints = "$R2 = $R2src"; 3012 let DisableEncoding = "$R2src"; 3013 } 3014 3015 class SideEffectBinaryMemMemRRE<string mnemonic, bits<16> opcode, 3016 RegisterOperand cls1, RegisterOperand cls2> 3017 : InstRRE<opcode, (outs cls1:$R1, cls2:$R2), (ins cls1:$R1src, cls2:$R2src), 3018 mnemonic#"\t$R1, $R2", []> { 3019 let Constraints = "$R1 = $R1src, $R2 = $R2src"; 3020 let DisableEncoding = "$R1src, $R2src"; 3021 } 3022 3023 class SideEffectBinaryMemMemRRFc<string mnemonic, bits<16> opcode, 3024 RegisterOperand cls1, RegisterOperand cls2> 3025 : InstRRFc<opcode, (outs cls1:$R1, cls2:$R2), (ins cls1:$R1src, cls2:$R2src), 3026 mnemonic#"\t$R1, $R2", []> { 3027 let Constraints = "$R1 = $R1src, $R2 = $R2src"; 3028 let DisableEncoding = "$R1src, $R2src"; 3029 let M3 = 0; 3030 } 3031 3032 class BinaryRR<string mnemonic, bits<8> opcode, SDPatternOperator operator, 3033 RegisterOperand cls1, RegisterOperand cls2> 3034 : InstRR<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2), 3035 mnemonic#"\t$R1, $R2", 3036 [(set cls1:$R1, (operator cls1:$R1src, cls2:$R2))]> { 3037 let OpKey = mnemonic#cls1; 3038 let OpType = "reg"; 3039 let Constraints = "$R1 = $R1src"; 3040 let DisableEncoding = "$R1src"; 3041 } 3042 3043 class BinaryRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3044 RegisterOperand cls1, RegisterOperand cls2> 3045 : InstRRE<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2), 3046 mnemonic#"\t$R1, $R2", 3047 [(set cls1:$R1, (operator cls1:$R1src, cls2:$R2))]> { 3048 let OpKey = mnemonic#cls1; 3049 let OpType = "reg"; 3050 let Constraints = "$R1 = $R1src"; 3051 let DisableEncoding = "$R1src"; 3052 } 3053 3054 class BinaryRRD<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3055 RegisterOperand cls1, RegisterOperand cls2> 3056 : InstRRD<opcode, (outs cls1:$R1), (ins cls2:$R3, cls2:$R2), 3057 mnemonic#"\t$R1, $R3, $R2", 3058 [(set cls1:$R1, (operator cls2:$R3, cls2:$R2))]> { 3059 let OpKey = mnemonic#cls; 3060 let OpType = "reg"; 3061 } 3062 3063 class BinaryRRFa<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3064 RegisterOperand cls1, RegisterOperand cls2, 3065 RegisterOperand cls3> 3066 : InstRRFa<opcode, (outs cls1:$R1), (ins cls2:$R2, cls3:$R3), 3067 mnemonic#"\t$R1, $R2, $R3", 3068 [(set cls1:$R1, (operator cls2:$R2, cls3:$R3))]> { 3069 let M4 = 0; 3070 } 3071 3072 multiclass BinaryRRAndK<string mnemonic, bits<8> opcode1, bits<16> opcode2, 3073 SDPatternOperator operator, RegisterOperand cls1, 3074 RegisterOperand cls2> { 3075 let NumOpsKey = mnemonic in { 3076 let NumOpsValue = "3" in 3077 def K : BinaryRRFa<mnemonic#"k", opcode2, null_frag, cls1, cls1, cls2>, 3078 Requires<[FeatureDistinctOps]>; 3079 let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in 3080 def "" : BinaryRR<mnemonic, opcode1, operator, cls1, cls2>; 3081 } 3082 } 3083 3084 multiclass BinaryRREAndK<string mnemonic, bits<16> opcode1, bits<16> opcode2, 3085 SDPatternOperator operator, RegisterOperand cls1, 3086 RegisterOperand cls2> { 3087 let NumOpsKey = mnemonic in { 3088 let NumOpsValue = "3" in 3089 def K : BinaryRRFa<mnemonic#"k", opcode2, null_frag, cls1, cls1, cls2>, 3090 Requires<[FeatureDistinctOps]>; 3091 let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in 3092 def "" : BinaryRRE<mnemonic, opcode1, operator, cls1, cls2>; 3093 } 3094 } 3095 3096 class BinaryRRFb<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3097 RegisterOperand cls1, RegisterOperand cls2, 3098 RegisterOperand cls3> 3099 : InstRRFb<opcode, (outs cls1:$R1), (ins cls2:$R2, cls3:$R3), 3100 mnemonic#"\t$R1, $R3, $R2", 3101 [(set cls1:$R1, (operator cls2:$R2, cls3:$R3))]> { 3102 let M4 = 0; 3103 } 3104 3105 class BinaryMemRRFc<string mnemonic, bits<16> opcode, 3106 RegisterOperand cls1, RegisterOperand cls2, Immediate imm> 3107 : InstRRFc<opcode, (outs cls2:$R2, cls1:$R1), (ins cls1:$R1src, imm:$M3), 3108 mnemonic#"\t$R1, $R2, $M3", []> { 3109 let Constraints = "$R1 = $R1src"; 3110 let DisableEncoding = "$R1src"; 3111 } 3112 3113 multiclass BinaryMemRRFcOpt<string mnemonic, bits<16> opcode, 3114 RegisterOperand cls1, RegisterOperand cls2> { 3115 def "" : BinaryMemRRFc<mnemonic, opcode, cls1, cls2, imm32zx4>; 3116 def Opt : UnaryMemRRFc<mnemonic, opcode, cls1, cls2>; 3117 } 3118 3119 class BinaryRRFd<string mnemonic, bits<16> opcode, RegisterOperand cls1, 3120 RegisterOperand cls2> 3121 : InstRRFd<opcode, (outs cls1:$R1), (ins cls2:$R2, imm32zx4:$M4), 3122 mnemonic#"\t$R1, $R2, $M4", []>; 3123 3124 class BinaryRRFe<string mnemonic, bits<16> opcode, RegisterOperand cls1, 3125 RegisterOperand cls2> 3126 : InstRRFe<opcode, (outs cls1:$R1), (ins imm32zx4:$M3, cls2:$R2), 3127 mnemonic#"\t$R1, $M3, $R2", []> { 3128 let M4 = 0; 3129 } 3130 3131 class CondBinaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1, 3132 RegisterOperand cls2> 3133 : InstRRFc<opcode, (outs cls1:$R1), 3134 (ins cls1:$R1src, cls2:$R2, cond4:$valid, cond4:$M3), 3135 mnemonic#"$M3\t$R1, $R2", 3136 [(set cls1:$R1, (z_select_ccmask cls2:$R2, cls1:$R1src, 3137 cond4:$valid, cond4:$M3))]> { 3138 let Constraints = "$R1 = $R1src"; 3139 let DisableEncoding = "$R1src"; 3140 let CCMaskLast = 1; 3141 } 3142 3143 // Like CondBinaryRRF, but used for the raw assembly form. The condition-code 3144 // mask is the third operand rather than being part of the mnemonic. 3145 class AsmCondBinaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1, 3146 RegisterOperand cls2> 3147 : InstRRFc<opcode, (outs cls1:$R1), 3148 (ins cls1:$R1src, cls2:$R2, imm32zx4:$M3), 3149 mnemonic#"\t$R1, $R2, $M3", []> { 3150 let Constraints = "$R1 = $R1src"; 3151 let DisableEncoding = "$R1src"; 3152 } 3153 3154 // Like CondBinaryRRF, but with a fixed CC mask. 3155 class FixedCondBinaryRRF<CondVariant V, string mnemonic, bits<16> opcode, 3156 RegisterOperand cls1, RegisterOperand cls2> 3157 : InstRRFc<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2), 3158 mnemonic#V.suffix#"\t$R1, $R2", []> { 3159 let Constraints = "$R1 = $R1src"; 3160 let DisableEncoding = "$R1src"; 3161 let isAsmParserOnly = V.alternate; 3162 let M3 = V.ccmask; 3163 } 3164 3165 multiclass CondBinaryRRFPair<string mnemonic, bits<16> opcode, 3166 RegisterOperand cls1, RegisterOperand cls2> { 3167 let isCodeGenOnly = 1 in 3168 def "" : CondBinaryRRF<mnemonic, opcode, cls1, cls2>; 3169 def Asm : AsmCondBinaryRRF<mnemonic, opcode, cls1, cls2>; 3170 } 3171 3172 class BinaryRI<string mnemonic, bits<12> opcode, SDPatternOperator operator, 3173 RegisterOperand cls, Immediate imm> 3174 : InstRIa<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2), 3175 mnemonic#"\t$R1, $I2", 3176 [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> { 3177 let Constraints = "$R1 = $R1src"; 3178 let DisableEncoding = "$R1src"; 3179 } 3180 3181 class BinaryRIE<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3182 RegisterOperand cls, Immediate imm> 3183 : InstRIEd<opcode, (outs cls:$R1), (ins cls:$R3, imm:$I2), 3184 mnemonic#"\t$R1, $R3, $I2", 3185 [(set cls:$R1, (operator cls:$R3, imm:$I2))]>; 3186 3187 multiclass BinaryRIAndK<string mnemonic, bits<12> opcode1, bits<16> opcode2, 3188 SDPatternOperator operator, RegisterOperand cls, 3189 Immediate imm> { 3190 let NumOpsKey = mnemonic in { 3191 let NumOpsValue = "3" in 3192 def K : BinaryRIE<mnemonic##"k", opcode2, null_frag, cls, imm>, 3193 Requires<[FeatureDistinctOps]>; 3194 let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in 3195 def "" : BinaryRI<mnemonic, opcode1, operator, cls, imm>; 3196 } 3197 } 3198 3199 class CondBinaryRIE<string mnemonic, bits<16> opcode, RegisterOperand cls, 3200 Immediate imm> 3201 : InstRIEg<opcode, (outs cls:$R1), 3202 (ins cls:$R1src, imm:$I2, cond4:$valid, cond4:$M3), 3203 mnemonic#"$M3\t$R1, $I2", 3204 [(set cls:$R1, (z_select_ccmask imm:$I2, cls:$R1src, 3205 cond4:$valid, cond4:$M3))]> { 3206 let Constraints = "$R1 = $R1src"; 3207 let DisableEncoding = "$R1src"; 3208 let CCMaskLast = 1; 3209 } 3210 3211 // Like CondBinaryRIE, but used for the raw assembly form. The condition-code 3212 // mask is the third operand rather than being part of the mnemonic. 3213 class AsmCondBinaryRIE<string mnemonic, bits<16> opcode, RegisterOperand cls, 3214 Immediate imm> 3215 : InstRIEg<opcode, (outs cls:$R1), 3216 (ins cls:$R1src, imm:$I2, imm32zx4:$M3), 3217 mnemonic#"\t$R1, $I2, $M3", []> { 3218 let Constraints = "$R1 = $R1src"; 3219 let DisableEncoding = "$R1src"; 3220 } 3221 3222 // Like CondBinaryRIE, but with a fixed CC mask. 3223 class FixedCondBinaryRIE<CondVariant V, string mnemonic, bits<16> opcode, 3224 RegisterOperand cls, Immediate imm> 3225 : InstRIEg<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2), 3226 mnemonic#V.suffix#"\t$R1, $I2", []> { 3227 let Constraints = "$R1 = $R1src"; 3228 let DisableEncoding = "$R1src"; 3229 let isAsmParserOnly = V.alternate; 3230 let M3 = V.ccmask; 3231 } 3232 3233 multiclass CondBinaryRIEPair<string mnemonic, bits<16> opcode, 3234 RegisterOperand cls, Immediate imm> { 3235 let isCodeGenOnly = 1 in 3236 def "" : CondBinaryRIE<mnemonic, opcode, cls, imm>; 3237 def Asm : AsmCondBinaryRIE<mnemonic, opcode, cls, imm>; 3238 } 3239 3240 class BinaryRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator, 3241 RegisterOperand cls, Immediate imm> 3242 : InstRILa<opcode, (outs cls:$R1), (ins cls:$R1src, imm:$I2), 3243 mnemonic#"\t$R1, $I2", 3244 [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> { 3245 let Constraints = "$R1 = $R1src"; 3246 let DisableEncoding = "$R1src"; 3247 } 3248 3249 class BinaryRS<string mnemonic, bits<8> opcode, SDPatternOperator operator, 3250 RegisterOperand cls> 3251 : InstRSa<opcode, (outs cls:$R1), (ins cls:$R1src, shift12only:$BD2), 3252 mnemonic#"\t$R1, $BD2", 3253 [(set cls:$R1, (operator cls:$R1src, shift12only:$BD2))]> { 3254 let R3 = 0; 3255 let Constraints = "$R1 = $R1src"; 3256 let DisableEncoding = "$R1src"; 3257 } 3258 3259 class BinaryRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3260 RegisterOperand cls> 3261 : InstRSYa<opcode, (outs cls:$R1), (ins cls:$R3, shift20only:$BD2), 3262 mnemonic#"\t$R1, $R3, $BD2", 3263 [(set cls:$R1, (operator cls:$R3, shift20only:$BD2))]>; 3264 3265 multiclass BinaryRSAndK<string mnemonic, bits<8> opcode1, bits<16> opcode2, 3266 SDPatternOperator operator, RegisterOperand cls> { 3267 let NumOpsKey = mnemonic in { 3268 let NumOpsValue = "3" in 3269 def K : BinaryRSY<mnemonic##"k", opcode2, null_frag, cls>, 3270 Requires<[FeatureDistinctOps]>; 3271 let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in 3272 def "" : BinaryRS<mnemonic, opcode1, operator, cls>; 3273 } 3274 } 3275 3276 class BinaryRSL<string mnemonic, bits<16> opcode, RegisterOperand cls> 3277 : InstRSLb<opcode, (outs cls:$R1), 3278 (ins bdladdr12onlylen8:$BDL2, imm32zx4:$M3), 3279 mnemonic#"\t$R1, $BDL2, $M3", []> { 3280 let mayLoad = 1; 3281 } 3282 3283 class BinaryRX<string mnemonic, bits<8> opcode, SDPatternOperator operator, 3284 RegisterOperand cls, SDPatternOperator load, bits<5> bytes, 3285 AddressingMode mode = bdxaddr12only> 3286 : InstRXa<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$XBD2), 3287 mnemonic#"\t$R1, $XBD2", 3288 [(set cls:$R1, (operator cls:$R1src, (load mode:$XBD2)))]> { 3289 let OpKey = mnemonic#"r"#cls; 3290 let OpType = "mem"; 3291 let Constraints = "$R1 = $R1src"; 3292 let DisableEncoding = "$R1src"; 3293 let mayLoad = 1; 3294 let AccessBytes = bytes; 3295 } 3296 3297 class BinaryRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3298 RegisterOperand cls, SDPatternOperator load, bits<5> bytes> 3299 : InstRXE<opcode, (outs cls:$R1), (ins cls:$R1src, bdxaddr12only:$XBD2), 3300 mnemonic#"\t$R1, $XBD2", 3301 [(set cls:$R1, (operator cls:$R1src, 3302 (load bdxaddr12only:$XBD2)))]> { 3303 let OpKey = mnemonic#"r"#cls; 3304 let OpType = "mem"; 3305 let Constraints = "$R1 = $R1src"; 3306 let DisableEncoding = "$R1src"; 3307 let mayLoad = 1; 3308 let AccessBytes = bytes; 3309 let M3 = 0; 3310 } 3311 3312 class BinaryRXF<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3313 RegisterOperand cls1, RegisterOperand cls2, 3314 SDPatternOperator load, bits<5> bytes> 3315 : InstRXF<opcode, (outs cls1:$R1), (ins cls2:$R3, bdxaddr12only:$XBD2), 3316 mnemonic#"\t$R1, $R3, $XBD2", 3317 [(set cls1:$R1, (operator cls2:$R3, (load bdxaddr12only:$XBD2)))]> { 3318 let OpKey = mnemonic#"r"#cls; 3319 let OpType = "mem"; 3320 let mayLoad = 1; 3321 let AccessBytes = bytes; 3322 } 3323 3324 class BinaryRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3325 RegisterOperand cls, SDPatternOperator load, bits<5> bytes, 3326 AddressingMode mode = bdxaddr20only> 3327 : InstRXYa<opcode, (outs cls:$R1), (ins cls:$R1src, mode:$XBD2), 3328 mnemonic#"\t$R1, $XBD2", 3329 [(set cls:$R1, (operator cls:$R1src, (load mode:$XBD2)))]> { 3330 let OpKey = mnemonic#"r"#cls; 3331 let OpType = "mem"; 3332 let Constraints = "$R1 = $R1src"; 3333 let DisableEncoding = "$R1src"; 3334 let mayLoad = 1; 3335 let AccessBytes = bytes; 3336 } 3337 3338 multiclass BinaryRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode, 3339 SDPatternOperator operator, RegisterOperand cls, 3340 SDPatternOperator load, bits<5> bytes> { 3341 let DispKey = mnemonic ## #cls in { 3342 let DispSize = "12" in 3343 def "" : BinaryRX<mnemonic, rxOpcode, operator, cls, load, bytes, 3344 bdxaddr12pair>; 3345 let DispSize = "20" in 3346 def Y : BinaryRXY<mnemonic#"y", rxyOpcode, operator, cls, load, bytes, 3347 bdxaddr20pair>; 3348 } 3349 } 3350 3351 class BinarySI<string mnemonic, bits<8> opcode, SDPatternOperator operator, 3352 Operand imm, AddressingMode mode = bdaddr12only> 3353 : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2), 3354 mnemonic#"\t$BD1, $I2", 3355 [(store (operator (load mode:$BD1), imm:$I2), mode:$BD1)]> { 3356 let mayLoad = 1; 3357 let mayStore = 1; 3358 } 3359 3360 class BinarySIY<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3361 Operand imm, AddressingMode mode = bdaddr20only> 3362 : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2), 3363 mnemonic#"\t$BD1, $I2", 3364 [(store (operator (load mode:$BD1), imm:$I2), mode:$BD1)]> { 3365 let mayLoad = 1; 3366 let mayStore = 1; 3367 } 3368 3369 multiclass BinarySIPair<string mnemonic, bits<8> siOpcode, 3370 bits<16> siyOpcode, SDPatternOperator operator, 3371 Operand imm> { 3372 let DispKey = mnemonic ## #cls in { 3373 let DispSize = "12" in 3374 def "" : BinarySI<mnemonic, siOpcode, operator, imm, bdaddr12pair>; 3375 let DispSize = "20" in 3376 def Y : BinarySIY<mnemonic#"y", siyOpcode, operator, imm, bdaddr20pair>; 3377 } 3378 } 3379 3380 class BinarySSF<string mnemonic, bits<12> opcode, RegisterOperand cls> 3381 : InstSSF<opcode, (outs cls:$R3), (ins bdaddr12pair:$BD1, bdaddr12pair:$BD2), 3382 mnemonic#"\t$R3, $BD1, $BD2", []> { 3383 let mayLoad = 1; 3384 } 3385 3386 class BinaryVRIb<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3387 TypedReg tr, bits<4> type> 3388 : InstVRIb<opcode, (outs tr.op:$V1), (ins imm32zx8:$I2, imm32zx8:$I3), 3389 mnemonic#"\t$V1, $I2, $I3", 3390 [(set (tr.vt tr.op:$V1), (operator imm32zx8:$I2, imm32zx8:$I3))]> { 3391 let M4 = type; 3392 } 3393 3394 class BinaryVRIbGeneric<string mnemonic, bits<16> opcode> 3395 : InstVRIb<opcode, (outs VR128:$V1), 3396 (ins imm32zx8:$I2, imm32zx8:$I3, imm32zx4:$M4), 3397 mnemonic#"\t$V1, $I2, $I3, $M4", []>; 3398 3399 class BinaryVRIc<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3400 TypedReg tr1, TypedReg tr2, bits<4> type> 3401 : InstVRIc<opcode, (outs tr1.op:$V1), (ins tr2.op:$V3, imm32zx16:$I2), 3402 mnemonic#"\t$V1, $V3, $I2", 3403 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V3), 3404 imm32zx16:$I2))]> { 3405 let M4 = type; 3406 } 3407 3408 class BinaryVRIcGeneric<string mnemonic, bits<16> opcode> 3409 : InstVRIc<opcode, (outs VR128:$V1), 3410 (ins VR128:$V3, imm32zx16:$I2, imm32zx4:$M4), 3411 mnemonic#"\t$V1, $V3, $I2, $M4", []>; 3412 3413 class BinaryVRIe<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3414 TypedReg tr1, TypedReg tr2, bits<4> type, bits<4> m5> 3415 : InstVRIe<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, imm32zx12:$I3), 3416 mnemonic#"\t$V1, $V2, $I3", 3417 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), 3418 imm32zx12:$I3))]> { 3419 let M4 = type; 3420 let M5 = m5; 3421 } 3422 3423 class BinaryVRIeFloatGeneric<string mnemonic, bits<16> opcode> 3424 : InstVRIe<opcode, (outs VR128:$V1), 3425 (ins VR128:$V2, imm32zx12:$I3, imm32zx4:$M4, imm32zx4:$M5), 3426 mnemonic#"\t$V1, $V2, $I3, $M4, $M5", []>; 3427 3428 class BinaryVRIh<string mnemonic, bits<16> opcode> 3429 : InstVRIh<opcode, (outs VR128:$V1), 3430 (ins imm32zx16:$I2, imm32zx4:$I3), 3431 mnemonic#"\t$V1, $I2, $I3", []>; 3432 3433 class BinaryVRRa<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3434 TypedReg tr1, TypedReg tr2, bits<4> type = 0, bits<4> m4 = 0> 3435 : InstVRRa<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, imm32zx4:$M5), 3436 mnemonic#"\t$V1, $V2, $M5", 3437 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), 3438 imm32zx12:$M5))]> { 3439 let M3 = type; 3440 let M4 = m4; 3441 } 3442 3443 class BinaryVRRaFloatGeneric<string mnemonic, bits<16> opcode> 3444 : InstVRRa<opcode, (outs VR128:$V1), 3445 (ins VR128:$V2, imm32zx4:$M3, imm32zx4:$M4, imm32zx4:$M5), 3446 mnemonic#"\t$V1, $V2, $M3, $M4, $M5", []>; 3447 3448 class BinaryVRRb<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3449 TypedReg tr1, TypedReg tr2, bits<4> type = 0, 3450 bits<4> modifier = 0> 3451 : InstVRRb<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, tr2.op:$V3), 3452 mnemonic#"\t$V1, $V2, $V3", 3453 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), 3454 (tr2.vt tr2.op:$V3)))]> { 3455 let M4 = type; 3456 let M5 = modifier; 3457 } 3458 3459 // Declare a pair of instructions, one which sets CC and one which doesn't. 3460 // The CC-setting form ends with "S" and sets the low bit of M5. 3461 multiclass BinaryVRRbSPair<string mnemonic, bits<16> opcode, 3462 SDPatternOperator operator, 3463 SDPatternOperator operator_cc, TypedReg tr1, 3464 TypedReg tr2, bits<4> type, bits<4> modifier = 0> { 3465 def "" : BinaryVRRb<mnemonic, opcode, operator, tr1, tr2, type, 3466 !and (modifier, 14)>; 3467 let Defs = [CC] in 3468 def S : BinaryVRRb<mnemonic##"s", opcode, operator_cc, tr1, tr2, type, 3469 !add (!and (modifier, 14), 1)>; 3470 } 3471 3472 class BinaryVRRbSPairGeneric<string mnemonic, bits<16> opcode> 3473 : InstVRRb<opcode, (outs VR128:$V1), 3474 (ins VR128:$V2, VR128:$V3, imm32zx4:$M4, imm32zx4:$M5), 3475 mnemonic#"\t$V1, $V2, $V3, $M4, $M5", []>; 3476 3477 // Declare a pair of instructions, one which sets CC and one which doesn't. 3478 // The CC-setting form ends with "S" and sets the low bit of M5. 3479 // The form that does not set CC has an extra operand to optionally allow 3480 // specifying arbitrary M5 values in assembler. 3481 multiclass BinaryExtraVRRbSPair<string mnemonic, bits<16> opcode, 3482 SDPatternOperator operator, 3483 SDPatternOperator operator_cc, 3484 TypedReg tr1, TypedReg tr2, bits<4> type> { 3485 let M4 = type in 3486 def "" : InstVRRb<opcode, (outs tr1.op:$V1), 3487 (ins tr2.op:$V2, tr2.op:$V3, imm32zx4:$M5), 3488 mnemonic#"\t$V1, $V2, $V3, $M5", []>; 3489 def : Pat<(tr1.vt (operator (tr2.vt tr2.op:$V2), (tr2.vt tr2.op:$V3))), 3490 (!cast<Instruction>(NAME) tr2.op:$V2, tr2.op:$V3, 0)>; 3491 def : InstAlias<mnemonic#"\t$V1, $V2, $V3", 3492 (!cast<Instruction>(NAME) tr1.op:$V1, tr2.op:$V2, 3493 tr2.op:$V3, 0)>; 3494 let Defs = [CC] in 3495 def S : BinaryVRRb<mnemonic##"s", opcode, operator_cc, tr1, tr2, type, 1>; 3496 } 3497 3498 multiclass BinaryExtraVRRbSPairGeneric<string mnemonic, bits<16> opcode> { 3499 def "" : InstVRRb<opcode, (outs VR128:$V1), 3500 (ins VR128:$V2, VR128:$V3, imm32zx4:$M4, imm32zx4:$M5), 3501 mnemonic#"\t$V1, $V2, $V3, $M4, $M5", []>; 3502 def : InstAlias<mnemonic#"\t$V1, $V2, $V3, $M4", 3503 (!cast<Instruction>(NAME) VR128:$V1, VR128:$V2, VR128:$V3, 3504 imm32zx4:$M4, 0)>; 3505 } 3506 3507 class BinaryVRRc<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3508 TypedReg tr1, TypedReg tr2, bits<4> type = 0, bits<4> m5 = 0, 3509 bits<4> m6 = 0> 3510 : InstVRRc<opcode, (outs tr1.op:$V1), (ins tr2.op:$V2, tr2.op:$V3), 3511 mnemonic#"\t$V1, $V2, $V3", 3512 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), 3513 (tr2.vt tr2.op:$V3)))]> { 3514 let M4 = type; 3515 let M5 = m5; 3516 let M6 = m6; 3517 } 3518 3519 class BinaryVRRcGeneric<string mnemonic, bits<16> opcode, bits<4> m5 = 0, 3520 bits<4> m6 = 0> 3521 : InstVRRc<opcode, (outs VR128:$V1), 3522 (ins VR128:$V2, VR128:$V3, imm32zx4:$M4), 3523 mnemonic#"\t$V1, $V2, $V3, $M4", []> { 3524 let M5 = m5; 3525 let M6 = m6; 3526 } 3527 3528 class BinaryVRRcFloatGeneric<string mnemonic, bits<16> opcode, bits<4> m6 = 0> 3529 : InstVRRc<opcode, (outs VR128:$V1), 3530 (ins VR128:$V2, VR128:$V3, imm32zx4:$M4, imm32zx4:$M5), 3531 mnemonic#"\t$V1, $V2, $V3, $M4, $M5", []> { 3532 let M6 = m6; 3533 } 3534 3535 // Declare a pair of instructions, one which sets CC and one which doesn't. 3536 // The CC-setting form ends with "S" and sets the low bit of M5. 3537 multiclass BinaryVRRcSPair<string mnemonic, bits<16> opcode, 3538 SDPatternOperator operator, 3539 SDPatternOperator operator_cc, TypedReg tr1, 3540 TypedReg tr2, bits<4> type, bits<4> m5, 3541 bits<4> modifier = 0> { 3542 def "" : BinaryVRRc<mnemonic, opcode, operator, tr1, tr2, type, 3543 m5, !and (modifier, 14)>; 3544 let Defs = [CC] in 3545 def S : BinaryVRRc<mnemonic##"s", opcode, operator_cc, tr1, tr2, type, 3546 m5, !add (!and (modifier, 14), 1)>; 3547 } 3548 3549 class BinaryVRRcSPairFloatGeneric<string mnemonic, bits<16> opcode> 3550 : InstVRRc<opcode, (outs VR128:$V1), 3551 (ins VR128:$V2, VR128:$V3, imm32zx4:$M4, imm32zx4:$M5, 3552 imm32zx4:$M6), 3553 mnemonic#"\t$V1, $V2, $V3, $M4, $M5, $M6", []>; 3554 3555 class BinaryVRRf<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3556 TypedReg tr> 3557 : InstVRRf<opcode, (outs tr.op:$V1), (ins GR64:$R2, GR64:$R3), 3558 mnemonic#"\t$V1, $R2, $R3", 3559 [(set (tr.vt tr.op:$V1), (operator GR64:$R2, GR64:$R3))]>; 3560 3561 class BinaryVRRi<string mnemonic, bits<16> opcode, RegisterOperand cls> 3562 : InstVRRi<opcode, (outs cls:$R1), (ins VR128:$V2, imm32zx4:$M3), 3563 mnemonic#"\t$R1, $V2, $M3", []>; 3564 3565 class BinaryVRSa<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3566 TypedReg tr1, TypedReg tr2, bits<4> type> 3567 : InstVRSa<opcode, (outs tr1.op:$V1), (ins tr2.op:$V3, shift12only:$BD2), 3568 mnemonic#"\t$V1, $V3, $BD2", 3569 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V3), 3570 shift12only:$BD2))]> { 3571 let M4 = type; 3572 } 3573 3574 class BinaryVRSaGeneric<string mnemonic, bits<16> opcode> 3575 : InstVRSa<opcode, (outs VR128:$V1), 3576 (ins VR128:$V3, shift12only:$BD2, imm32zx4:$M4), 3577 mnemonic#"\t$V1, $V3, $BD2, $M4", []>; 3578 3579 class BinaryVRSb<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3580 bits<5> bytes> 3581 : InstVRSb<opcode, (outs VR128:$V1), (ins GR32:$R3, bdaddr12only:$BD2), 3582 mnemonic#"\t$V1, $R3, $BD2", 3583 [(set VR128:$V1, (operator GR32:$R3, bdaddr12only:$BD2))]> { 3584 let M4 = 0; 3585 let mayLoad = 1; 3586 let AccessBytes = bytes; 3587 } 3588 3589 class BinaryVRSc<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3590 TypedReg tr, bits<4> type> 3591 : InstVRSc<opcode, (outs GR64:$R1), (ins tr.op:$V3, shift12only:$BD2), 3592 mnemonic#"\t$R1, $V3, $BD2", 3593 [(set GR64:$R1, (operator (tr.vt tr.op:$V3), shift12only:$BD2))]> { 3594 let M4 = type; 3595 } 3596 3597 class BinaryVRScGeneric<string mnemonic, bits<16> opcode> 3598 : InstVRSc<opcode, (outs GR64:$R1), 3599 (ins VR128:$V3, shift12only:$BD2, imm32zx4: $M4), 3600 mnemonic#"\t$R1, $V3, $BD2, $M4", []>; 3601 3602 class BinaryVRSd<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3603 bits<5> bytes> 3604 : InstVRSd<opcode, (outs VR128:$V1), (ins GR32:$R3, bdaddr12only:$BD2), 3605 mnemonic#"\t$V1, $R3, $BD2", 3606 [(set VR128:$V1, (operator GR32:$R3, bdaddr12only:$BD2))]> { 3607 let mayLoad = 1; 3608 let AccessBytes = bytes; 3609 } 3610 3611 class BinaryVRX<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3612 TypedReg tr, bits<5> bytes> 3613 : InstVRX<opcode, (outs VR128:$V1), (ins bdxaddr12only:$XBD2, imm32zx4:$M3), 3614 mnemonic#"\t$V1, $XBD2, $M3", 3615 [(set (tr.vt tr.op:$V1), (operator bdxaddr12only:$XBD2, 3616 imm32zx4:$M3))]> { 3617 let mayLoad = 1; 3618 let AccessBytes = bytes; 3619 } 3620 3621 class StoreBinaryRS<string mnemonic, bits<8> opcode, RegisterOperand cls, 3622 bits<5> bytes, AddressingMode mode = bdaddr12only> 3623 : InstRSb<opcode, (outs), (ins cls:$R1, imm32zx4:$M3, mode:$BD2), 3624 mnemonic#"\t$R1, $M3, $BD2", []> { 3625 let mayStore = 1; 3626 let AccessBytes = bytes; 3627 } 3628 3629 class StoreBinaryRSY<string mnemonic, bits<16> opcode, RegisterOperand cls, 3630 bits<5> bytes, AddressingMode mode = bdaddr20only> 3631 : InstRSYb<opcode, (outs), (ins cls:$R1, imm32zx4:$M3, mode:$BD2), 3632 mnemonic#"\t$R1, $M3, $BD2", []> { 3633 let mayStore = 1; 3634 let AccessBytes = bytes; 3635 } 3636 3637 multiclass StoreBinaryRSPair<string mnemonic, bits<8> rsOpcode, 3638 bits<16> rsyOpcode, RegisterOperand cls, 3639 bits<5> bytes> { 3640 let DispKey = mnemonic ## #cls in { 3641 let DispSize = "12" in 3642 def "" : StoreBinaryRS<mnemonic, rsOpcode, cls, bytes, bdaddr12pair>; 3643 let DispSize = "20" in 3644 def Y : StoreBinaryRSY<mnemonic#"y", rsyOpcode, cls, bytes, 3645 bdaddr20pair>; 3646 } 3647 } 3648 3649 class StoreBinaryRSL<string mnemonic, bits<16> opcode, RegisterOperand cls> 3650 : InstRSLb<opcode, (outs), 3651 (ins cls:$R1, bdladdr12onlylen8:$BDL2, imm32zx4:$M3), 3652 mnemonic#"\t$R1, $BDL2, $M3", []> { 3653 let mayStore = 1; 3654 } 3655 3656 class BinaryVSI<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3657 bits<5> bytes> 3658 : InstVSI<opcode, (outs VR128:$V1), (ins bdaddr12only:$BD2, imm32zx8:$I3), 3659 mnemonic#"\t$V1, $BD2, $I3", 3660 [(set VR128:$V1, (operator imm32zx8:$I3, bdaddr12only:$BD2))]> { 3661 let mayLoad = 1; 3662 let AccessBytes = bytes; 3663 } 3664 3665 class StoreBinaryVRV<string mnemonic, bits<16> opcode, bits<5> bytes, 3666 Immediate index> 3667 : InstVRV<opcode, (outs), (ins VR128:$V1, bdvaddr12only:$VBD2, index:$M3), 3668 mnemonic#"\t$V1, $VBD2, $M3", []> { 3669 let mayStore = 1; 3670 let AccessBytes = bytes; 3671 } 3672 3673 class StoreBinaryVRX<string mnemonic, bits<16> opcode, 3674 SDPatternOperator operator, TypedReg tr, bits<5> bytes, 3675 Immediate index> 3676 : InstVRX<opcode, (outs), (ins tr.op:$V1, bdxaddr12only:$XBD2, index:$M3), 3677 mnemonic#"\t$V1, $XBD2, $M3", 3678 [(operator (tr.vt tr.op:$V1), bdxaddr12only:$XBD2, index:$M3)]> { 3679 let mayStore = 1; 3680 let AccessBytes = bytes; 3681 } 3682 3683 class MemoryBinarySSd<string mnemonic, bits<8> opcode, 3684 RegisterOperand cls> 3685 : InstSSd<opcode, (outs), 3686 (ins bdraddr12only:$RBD1, bdaddr12only:$BD2, cls:$R3), 3687 mnemonic#"\t$RBD1, $BD2, $R3", []>; 3688 3689 class CompareRR<string mnemonic, bits<8> opcode, SDPatternOperator operator, 3690 RegisterOperand cls1, RegisterOperand cls2> 3691 : InstRR<opcode, (outs), (ins cls1:$R1, cls2:$R2), 3692 mnemonic#"\t$R1, $R2", 3693 [(set CC, (operator cls1:$R1, cls2:$R2))]> { 3694 let OpKey = mnemonic#cls1; 3695 let OpType = "reg"; 3696 let isCompare = 1; 3697 } 3698 3699 class CompareRRE<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3700 RegisterOperand cls1, RegisterOperand cls2> 3701 : InstRRE<opcode, (outs), (ins cls1:$R1, cls2:$R2), 3702 mnemonic#"\t$R1, $R2", 3703 [(set CC, (operator cls1:$R1, cls2:$R2))]> { 3704 let OpKey = mnemonic#cls1; 3705 let OpType = "reg"; 3706 let isCompare = 1; 3707 } 3708 3709 class CompareRI<string mnemonic, bits<12> opcode, SDPatternOperator operator, 3710 RegisterOperand cls, Immediate imm> 3711 : InstRIa<opcode, (outs), (ins cls:$R1, imm:$I2), 3712 mnemonic#"\t$R1, $I2", 3713 [(set CC, (operator cls:$R1, imm:$I2))]> { 3714 let isCompare = 1; 3715 } 3716 3717 class CompareRIL<string mnemonic, bits<12> opcode, SDPatternOperator operator, 3718 RegisterOperand cls, Immediate imm> 3719 : InstRILa<opcode, (outs), (ins cls:$R1, imm:$I2), 3720 mnemonic#"\t$R1, $I2", 3721 [(set CC, (operator cls:$R1, imm:$I2))]> { 3722 let isCompare = 1; 3723 } 3724 3725 class CompareRILPC<string mnemonic, bits<12> opcode, SDPatternOperator operator, 3726 RegisterOperand cls, SDPatternOperator load> 3727 : InstRILb<opcode, (outs), (ins cls:$R1, pcrel32:$RI2), 3728 mnemonic#"\t$R1, $RI2", 3729 [(set CC, (operator cls:$R1, (load pcrel32:$RI2)))]> { 3730 let isCompare = 1; 3731 let mayLoad = 1; 3732 // We want PC-relative addresses to be tried ahead of BD and BDX addresses. 3733 // However, BDXs have two extra operands and are therefore 6 units more 3734 // complex. 3735 let AddedComplexity = 7; 3736 } 3737 3738 class CompareRX<string mnemonic, bits<8> opcode, SDPatternOperator operator, 3739 RegisterOperand cls, SDPatternOperator load, bits<5> bytes, 3740 AddressingMode mode = bdxaddr12only> 3741 : InstRXa<opcode, (outs), (ins cls:$R1, mode:$XBD2), 3742 mnemonic#"\t$R1, $XBD2", 3743 [(set CC, (operator cls:$R1, (load mode:$XBD2)))]> { 3744 let OpKey = mnemonic#"r"#cls; 3745 let OpType = "mem"; 3746 let isCompare = 1; 3747 let mayLoad = 1; 3748 let AccessBytes = bytes; 3749 } 3750 3751 class CompareRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3752 RegisterOperand cls, SDPatternOperator load, bits<5> bytes> 3753 : InstRXE<opcode, (outs), (ins cls:$R1, bdxaddr12only:$XBD2), 3754 mnemonic#"\t$R1, $XBD2", 3755 [(set CC, (operator cls:$R1, (load bdxaddr12only:$XBD2)))]> { 3756 let OpKey = mnemonic#"r"#cls; 3757 let OpType = "mem"; 3758 let isCompare = 1; 3759 let mayLoad = 1; 3760 let AccessBytes = bytes; 3761 let M3 = 0; 3762 } 3763 3764 class CompareRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3765 RegisterOperand cls, SDPatternOperator load, bits<5> bytes, 3766 AddressingMode mode = bdxaddr20only> 3767 : InstRXYa<opcode, (outs), (ins cls:$R1, mode:$XBD2), 3768 mnemonic#"\t$R1, $XBD2", 3769 [(set CC, (operator cls:$R1, (load mode:$XBD2)))]> { 3770 let OpKey = mnemonic#"r"#cls; 3771 let OpType = "mem"; 3772 let isCompare = 1; 3773 let mayLoad = 1; 3774 let AccessBytes = bytes; 3775 } 3776 3777 multiclass CompareRXPair<string mnemonic, bits<8> rxOpcode, bits<16> rxyOpcode, 3778 SDPatternOperator operator, RegisterOperand cls, 3779 SDPatternOperator load, bits<5> bytes> { 3780 let DispKey = mnemonic ## #cls in { 3781 let DispSize = "12" in 3782 def "" : CompareRX<mnemonic, rxOpcode, operator, cls, 3783 load, bytes, bdxaddr12pair>; 3784 let DispSize = "20" in 3785 def Y : CompareRXY<mnemonic#"y", rxyOpcode, operator, cls, 3786 load, bytes, bdxaddr20pair>; 3787 } 3788 } 3789 3790 class CompareRS<string mnemonic, bits<8> opcode, RegisterOperand cls, 3791 bits<5> bytes, AddressingMode mode = bdaddr12only> 3792 : InstRSb<opcode, (outs), (ins cls:$R1, imm32zx4:$M3, mode:$BD2), 3793 mnemonic#"\t$R1, $M3, $BD2", []> { 3794 let mayLoad = 1; 3795 let AccessBytes = bytes; 3796 } 3797 3798 class CompareRSY<string mnemonic, bits<16> opcode, RegisterOperand cls, 3799 bits<5> bytes, AddressingMode mode = bdaddr20only> 3800 : InstRSYb<opcode, (outs), (ins cls:$R1, imm32zx4:$M3, mode:$BD2), 3801 mnemonic#"\t$R1, $M3, $BD2", []> { 3802 let mayLoad = 1; 3803 let AccessBytes = bytes; 3804 } 3805 3806 multiclass CompareRSPair<string mnemonic, bits<8> rsOpcode, bits<16> rsyOpcode, 3807 RegisterOperand cls, bits<5> bytes> { 3808 let DispKey = mnemonic ## #cls in { 3809 let DispSize = "12" in 3810 def "" : CompareRS<mnemonic, rsOpcode, cls, bytes, bdaddr12pair>; 3811 let DispSize = "20" in 3812 def Y : CompareRSY<mnemonic#"y", rsyOpcode, cls, bytes, bdaddr20pair>; 3813 } 3814 } 3815 3816 class CompareSSb<string mnemonic, bits<8> opcode> 3817 : InstSSb<opcode, 3818 (outs), (ins bdladdr12onlylen4:$BDL1, bdladdr12onlylen4:$BDL2), 3819 mnemonic##"\t$BDL1, $BDL2", []> { 3820 let isCompare = 1; 3821 let mayLoad = 1; 3822 } 3823 3824 class CompareSI<string mnemonic, bits<8> opcode, SDPatternOperator operator, 3825 SDPatternOperator load, Immediate imm, 3826 AddressingMode mode = bdaddr12only> 3827 : InstSI<opcode, (outs), (ins mode:$BD1, imm:$I2), 3828 mnemonic#"\t$BD1, $I2", 3829 [(set CC, (operator (load mode:$BD1), imm:$I2))]> { 3830 let isCompare = 1; 3831 let mayLoad = 1; 3832 } 3833 3834 class CompareSIL<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3835 SDPatternOperator load, Immediate imm> 3836 : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2), 3837 mnemonic#"\t$BD1, $I2", 3838 [(set CC, (operator (load bdaddr12only:$BD1), imm:$I2))]> { 3839 let isCompare = 1; 3840 let mayLoad = 1; 3841 } 3842 3843 class CompareSIY<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3844 SDPatternOperator load, Immediate imm, 3845 AddressingMode mode = bdaddr20only> 3846 : InstSIY<opcode, (outs), (ins mode:$BD1, imm:$I2), 3847 mnemonic#"\t$BD1, $I2", 3848 [(set CC, (operator (load mode:$BD1), imm:$I2))]> { 3849 let isCompare = 1; 3850 let mayLoad = 1; 3851 } 3852 3853 multiclass CompareSIPair<string mnemonic, bits<8> siOpcode, bits<16> siyOpcode, 3854 SDPatternOperator operator, SDPatternOperator load, 3855 Immediate imm> { 3856 let DispKey = mnemonic in { 3857 let DispSize = "12" in 3858 def "" : CompareSI<mnemonic, siOpcode, operator, load, imm, bdaddr12pair>; 3859 let DispSize = "20" in 3860 def Y : CompareSIY<mnemonic#"y", siyOpcode, operator, load, imm, 3861 bdaddr20pair>; 3862 } 3863 } 3864 3865 class CompareVRRa<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3866 TypedReg tr, bits<4> type> 3867 : InstVRRa<opcode, (outs), (ins tr.op:$V1, tr.op:$V2), 3868 mnemonic#"\t$V1, $V2", 3869 [(set CC, (operator (tr.vt tr.op:$V1), (tr.vt tr.op:$V2)))]> { 3870 let isCompare = 1; 3871 let M3 = type; 3872 let M4 = 0; 3873 let M5 = 0; 3874 } 3875 3876 class CompareVRRaGeneric<string mnemonic, bits<16> opcode> 3877 : InstVRRa<opcode, (outs), (ins VR128:$V1, VR128:$V2, imm32zx4:$M3), 3878 mnemonic#"\t$V1, $V2, $M3", []> { 3879 let isCompare = 1; 3880 let M4 = 0; 3881 let M5 = 0; 3882 } 3883 3884 class CompareVRRaFloatGeneric<string mnemonic, bits<16> opcode> 3885 : InstVRRa<opcode, (outs), 3886 (ins VR64:$V1, VR64:$V2, imm32zx4:$M3, imm32zx4:$M4), 3887 mnemonic#"\t$V1, $V2, $M3, $M4", []> { 3888 let isCompare = 1; 3889 let M5 = 0; 3890 } 3891 3892 class CompareVRRh<string mnemonic, bits<16> opcode> 3893 : InstVRRh<opcode, (outs), (ins VR128:$V1, VR128:$V2, imm32zx4:$M3), 3894 mnemonic#"\t$V1, $V2, $M3", []> { 3895 let isCompare = 1; 3896 } 3897 3898 class TestInherentS<string mnemonic, bits<16> opcode, 3899 SDPatternOperator operator> 3900 : InstS<opcode, (outs), (ins), mnemonic, [(set CC, (operator))]> { 3901 let BD2 = 0; 3902 } 3903 3904 class TestRXE<string mnemonic, bits<16> opcode, SDPatternOperator operator, 3905 RegisterOperand cls> 3906 : InstRXE<opcode, (outs), (ins cls:$R1, bdxaddr12only:$XBD2), 3907 mnemonic#"\t$R1, $XBD2", 3908 [(set CC, (operator cls:$R1, bdxaddr12only:$XBD2))]> { 3909 let M3 = 0; 3910 } 3911 3912 class TestBinarySIL<string mnemonic, bits<16> opcode, 3913 SDPatternOperator operator, Immediate imm> 3914 : InstSIL<opcode, (outs), (ins bdaddr12only:$BD1, imm:$I2), 3915 mnemonic#"\t$BD1, $I2", 3916 [(set CC, (operator bdaddr12only:$BD1, imm:$I2))]>; 3917 3918 class TestRSL<string mnemonic, bits<16> opcode> 3919 : InstRSLa<opcode, (outs), (ins bdladdr12onlylen4:$BDL1), 3920 mnemonic#"\t$BDL1", []> { 3921 let mayLoad = 1; 3922 } 3923 3924 class TestVRRg<string mnemonic, bits<16> opcode> 3925 : InstVRRg<opcode, (outs), (ins VR128:$V1), 3926 mnemonic#"\t$V1", []>; 3927 3928 class SideEffectTernarySSc<string mnemonic, bits<8> opcode> 3929 : InstSSc<opcode, (outs), (ins bdladdr12onlylen4:$BDL1, 3930 shift12only:$BD2, imm32zx4:$I3), 3931 mnemonic##"\t$BDL1, $BD2, $I3", []>; 3932 3933 class SideEffectTernaryRRFa<string mnemonic, bits<16> opcode, 3934 RegisterOperand cls1, RegisterOperand cls2, 3935 RegisterOperand cls3> 3936 : InstRRFa<opcode, (outs), (ins cls1:$R1, cls2:$R2, cls3:$R3), 3937 mnemonic#"\t$R1, $R2, $R3", []> { 3938 let M4 = 0; 3939 } 3940 3941 class SideEffectTernaryRRFb<string mnemonic, bits<16> opcode, 3942 RegisterOperand cls1, RegisterOperand cls2, 3943 RegisterOperand cls3> 3944 : InstRRFb<opcode, (outs), (ins cls1:$R1, cls2:$R2, cls3:$R3), 3945 mnemonic#"\t$R1, $R3, $R2", []> { 3946 let M4 = 0; 3947 } 3948 3949 class SideEffectTernaryMemMemMemRRFb<string mnemonic, bits<16> opcode, 3950 RegisterOperand cls1, 3951 RegisterOperand cls2, 3952 RegisterOperand cls3> 3953 : InstRRFb<opcode, (outs cls1:$R1, cls2:$R2, cls3:$R3), 3954 (ins cls1:$R1src, cls2:$R2src, cls3:$R3src), 3955 mnemonic#"\t$R1, $R3, $R2", []> { 3956 let Constraints = "$R1 = $R1src, $R2 = $R2src, $R3 = $R3src"; 3957 let DisableEncoding = "$R1src, $R2src, $R3src"; 3958 let M4 = 0; 3959 } 3960 3961 class SideEffectTernaryRRFc<string mnemonic, bits<16> opcode, 3962 RegisterOperand cls1, RegisterOperand cls2, 3963 Immediate imm> 3964 : InstRRFc<opcode, (outs), (ins cls1:$R1, cls2:$R2, imm:$M3), 3965 mnemonic#"\t$R1, $R2, $M3", []>; 3966 3967 multiclass SideEffectTernaryRRFcOpt<string mnemonic, bits<16> opcode, 3968 RegisterOperand cls1, 3969 RegisterOperand cls2> { 3970 def "" : SideEffectTernaryRRFc<mnemonic, opcode, cls1, cls2, imm32zx4>; 3971 def Opt : SideEffectBinaryRRFc<mnemonic, opcode, cls1, cls2>; 3972 } 3973 3974 class SideEffectTernaryMemMemRRFc<string mnemonic, bits<16> opcode, 3975 RegisterOperand cls1, RegisterOperand cls2, 3976 Immediate imm> 3977 : InstRRFc<opcode, (outs cls1:$R1, cls2:$R2), 3978 (ins cls1:$R1src, cls2:$R2src, imm:$M3), 3979 mnemonic#"\t$R1, $R2, $M3", []> { 3980 let Constraints = "$R1 = $R1src, $R2 = $R2src"; 3981 let DisableEncoding = "$R1src, $R2src"; 3982 } 3983 3984 multiclass SideEffectTernaryMemMemRRFcOpt<string mnemonic, bits<16> opcode, 3985 RegisterOperand cls1, 3986 RegisterOperand cls2> { 3987 def "" : SideEffectTernaryMemMemRRFc<mnemonic, opcode, cls1, cls2, imm32zx4>; 3988 def Opt : SideEffectBinaryMemMemRRFc<mnemonic, opcode, cls1, cls2>; 3989 } 3990 3991 class SideEffectTernarySSF<string mnemonic, bits<12> opcode, 3992 RegisterOperand cls> 3993 : InstSSF<opcode, (outs), 3994 (ins bdaddr12only:$BD1, bdaddr12only:$BD2, cls:$R3), 3995 mnemonic#"\t$BD1, $BD2, $R3", []>; 3996 3997 class TernaryRRFa<string mnemonic, bits<16> opcode, 3998 RegisterOperand cls1, RegisterOperand cls2, 3999 RegisterOperand cls3> 4000 : InstRRFa<opcode, (outs cls1:$R1), (ins cls2:$R2, cls3:$R3, imm32zx4:$M4), 4001 mnemonic#"\t$R1, $R2, $R3, $M4", []>; 4002 4003 class TernaryRRFb<string mnemonic, bits<16> opcode, 4004 RegisterOperand cls1, RegisterOperand cls2, 4005 RegisterOperand cls3> 4006 : InstRRFb<opcode, (outs cls1:$R1, cls3:$R3), 4007 (ins cls1:$R1src, cls2:$R2, imm32zx4:$M4), 4008 mnemonic#"\t$R1, $R3, $R2, $M4", []> { 4009 let Constraints = "$R1 = $R1src"; 4010 let DisableEncoding = "$R1src"; 4011 } 4012 4013 class TernaryRRFe<string mnemonic, bits<16> opcode, RegisterOperand cls1, 4014 RegisterOperand cls2> 4015 : InstRRFe<opcode, (outs cls1:$R1), 4016 (ins imm32zx4:$M3, cls2:$R2, imm32zx4:$M4), 4017 mnemonic#"\t$R1, $M3, $R2, $M4", []>; 4018 4019 class TernaryRRD<string mnemonic, bits<16> opcode, SDPatternOperator operator, 4020 RegisterOperand cls1, RegisterOperand cls2> 4021 : InstRRD<opcode, (outs cls1:$R1), (ins cls2:$R1src, cls2:$R3, cls2:$R2), 4022 mnemonic#"\t$R1, $R3, $R2", 4023 [(set cls1:$R1, (operator cls2:$R1src, cls2:$R3, cls2:$R2))]> { 4024 let OpKey = mnemonic#cls; 4025 let OpType = "reg"; 4026 let Constraints = "$R1 = $R1src"; 4027 let DisableEncoding = "$R1src"; 4028 } 4029 4030 class TernaryRS<string mnemonic, bits<8> opcode, RegisterOperand cls, 4031 bits<5> bytes, AddressingMode mode = bdaddr12only> 4032 : InstRSb<opcode, (outs cls:$R1), 4033 (ins cls:$R1src, imm32zx4:$M3, mode:$BD2), 4034 mnemonic#"\t$R1, $M3, $BD2", []> { 4035 4036 let Constraints = "$R1 = $R1src"; 4037 let DisableEncoding = "$R1src"; 4038 let mayLoad = 1; 4039 let AccessBytes = bytes; 4040 } 4041 4042 class TernaryRSY<string mnemonic, bits<16> opcode, RegisterOperand cls, 4043 bits<5> bytes, AddressingMode mode = bdaddr20only> 4044 : InstRSYb<opcode, (outs cls:$R1), 4045 (ins cls:$R1src, imm32zx4:$M3, mode:$BD2), 4046 mnemonic#"\t$R1, $M3, $BD2", []> { 4047 4048 let Constraints = "$R1 = $R1src"; 4049 let DisableEncoding = "$R1src"; 4050 let mayLoad = 1; 4051 let AccessBytes = bytes; 4052 } 4053 4054 multiclass TernaryRSPair<string mnemonic, bits<8> rsOpcode, bits<16> rsyOpcode, 4055 RegisterOperand cls, bits<5> bytes> { 4056 let DispKey = mnemonic ## #cls in { 4057 let DispSize = "12" in 4058 def "" : TernaryRS<mnemonic, rsOpcode, cls, bytes, bdaddr12pair>; 4059 let DispSize = "20" in 4060 def Y : TernaryRSY<mnemonic#"y", rsyOpcode, cls, bytes, bdaddr20pair>; 4061 } 4062 } 4063 4064 class SideEffectTernaryRS<string mnemonic, bits<8> opcode, 4065 RegisterOperand cls1, RegisterOperand cls2> 4066 : InstRSa<opcode, (outs), 4067 (ins cls1:$R1, cls2:$R3, bdaddr12only:$BD2), 4068 mnemonic#"\t$R1, $R3, $BD2", []>; 4069 4070 class SideEffectTernaryRSY<string mnemonic, bits<16> opcode, 4071 RegisterOperand cls1, RegisterOperand cls2> 4072 : InstRSYa<opcode, (outs), 4073 (ins cls1:$R1, cls2:$R3, bdaddr20only:$BD2), 4074 mnemonic#"\t$R1, $R3, $BD2", []>; 4075 4076 class SideEffectTernaryMemMemRS<string mnemonic, bits<8> opcode, 4077 RegisterOperand cls1, RegisterOperand cls2> 4078 : InstRSa<opcode, (outs cls1:$R1, cls2:$R3), 4079 (ins cls1:$R1src, cls2:$R3src, shift12only:$BD2), 4080 mnemonic#"\t$R1, $R3, $BD2", []> { 4081 let Constraints = "$R1 = $R1src, $R3 = $R3src"; 4082 let DisableEncoding = "$R1src, $R3src"; 4083 } 4084 4085 class SideEffectTernaryMemMemRSY<string mnemonic, bits<16> opcode, 4086 RegisterOperand cls1, RegisterOperand cls2> 4087 : InstRSYa<opcode, (outs cls1:$R1, cls2:$R3), 4088 (ins cls1:$R1src, cls2:$R3src, shift20only:$BD2), 4089 mnemonic#"\t$R1, $R3, $BD2", []> { 4090 let Constraints = "$R1 = $R1src, $R3 = $R3src"; 4091 let DisableEncoding = "$R1src, $R3src"; 4092 } 4093 4094 class TernaryRXF<string mnemonic, bits<16> opcode, SDPatternOperator operator, 4095 RegisterOperand cls1, RegisterOperand cls2, 4096 SDPatternOperator load, bits<5> bytes> 4097 : InstRXF<opcode, (outs cls1:$R1), 4098 (ins cls2:$R1src, cls2:$R3, bdxaddr12only:$XBD2), 4099 mnemonic#"\t$R1, $R3, $XBD2", 4100 [(set cls1:$R1, (operator cls2:$R1src, cls2:$R3, 4101 (load bdxaddr12only:$XBD2)))]> { 4102 let OpKey = mnemonic#"r"#cls; 4103 let OpType = "mem"; 4104 let Constraints = "$R1 = $R1src"; 4105 let DisableEncoding = "$R1src"; 4106 let mayLoad = 1; 4107 let AccessBytes = bytes; 4108 } 4109 4110 class TernaryVRIa<string mnemonic, bits<16> opcode, SDPatternOperator operator, 4111 TypedReg tr1, TypedReg tr2, Immediate imm, Immediate index> 4112 : InstVRIa<opcode, (outs tr1.op:$V1), (ins tr2.op:$V1src, imm:$I2, index:$M3), 4113 mnemonic#"\t$V1, $I2, $M3", 4114 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V1src), 4115 imm:$I2, index:$M3))]> { 4116 let Constraints = "$V1 = $V1src"; 4117 let DisableEncoding = "$V1src"; 4118 } 4119 4120 class TernaryVRId<string mnemonic, bits<16> opcode, SDPatternOperator operator, 4121 TypedReg tr1, TypedReg tr2, bits<4> type> 4122 : InstVRId<opcode, (outs tr1.op:$V1), 4123 (ins tr2.op:$V2, tr2.op:$V3, imm32zx8:$I4), 4124 mnemonic#"\t$V1, $V2, $V3, $I4", 4125 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), 4126 (tr2.vt tr2.op:$V3), 4127 imm32zx8:$I4))]> { 4128 let M5 = type; 4129 } 4130 4131 class TernaryVRIi<string mnemonic, bits<16> opcode, RegisterOperand cls> 4132 : InstVRIi<opcode, (outs VR128:$V1), 4133 (ins cls:$R2, imm32zx8:$I3, imm32zx4:$M4), 4134 mnemonic#"\t$V1, $R2, $I3, $M4", []>; 4135 4136 class TernaryVRRa<string mnemonic, bits<16> opcode, SDPatternOperator operator, 4137 TypedReg tr1, TypedReg tr2, bits<4> type, bits<4> m4or> 4138 : InstVRRa<opcode, (outs tr1.op:$V1), 4139 (ins tr2.op:$V2, imm32zx4:$M4, imm32zx4:$M5), 4140 mnemonic#"\t$V1, $V2, $M4, $M5", 4141 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), 4142 imm32zx4:$M4, 4143 imm32zx4:$M5))], 4144 m4or> { 4145 let M3 = type; 4146 } 4147 4148 class TernaryVRRaFloatGeneric<string mnemonic, bits<16> opcode> 4149 : InstVRRa<opcode, (outs VR128:$V1), 4150 (ins VR128:$V2, imm32zx4:$M3, imm32zx4:$M4, imm32zx4:$M5), 4151 mnemonic#"\t$V1, $V2, $M3, $M4, $M5", []>; 4152 4153 class TernaryVRRb<string mnemonic, bits<16> opcode, SDPatternOperator operator, 4154 TypedReg tr1, TypedReg tr2, bits<4> type, 4155 SDPatternOperator m5mask, bits<4> m5or> 4156 : InstVRRb<opcode, (outs tr1.op:$V1), 4157 (ins tr2.op:$V2, tr2.op:$V3, m5mask:$M5), 4158 mnemonic#"\t$V1, $V2, $V3, $M5", 4159 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), 4160 (tr2.vt tr2.op:$V3), 4161 m5mask:$M5))], 4162 m5or> { 4163 let M4 = type; 4164 } 4165 4166 // Declare a pair of instructions, one which sets CC and one which doesn't. 4167 // The CC-setting form ends with "S" and sets the low bit of M5. 4168 // Also create aliases to make use of M5 operand optional in assembler. 4169 multiclass TernaryOptVRRbSPair<string mnemonic, bits<16> opcode, 4170 SDPatternOperator operator, 4171 SDPatternOperator operator_cc, 4172 TypedReg tr1, TypedReg tr2, bits<4> type, 4173 bits<4> modifier = 0> { 4174 def "" : TernaryVRRb<mnemonic, opcode, operator, tr1, tr2, type, 4175 imm32zx4even, !and (modifier, 14)>; 4176 def : InstAlias<mnemonic#"\t$V1, $V2, $V3", 4177 (!cast<Instruction>(NAME) tr1.op:$V1, tr2.op:$V2, 4178 tr2.op:$V3, 0)>; 4179 let Defs = [CC] in 4180 def S : TernaryVRRb<mnemonic##"s", opcode, operator_cc, tr1, tr2, type, 4181 imm32zx4even, !add(!and (modifier, 14), 1)>; 4182 def : InstAlias<mnemonic#"s\t$V1, $V2, $V3", 4183 (!cast<Instruction>(NAME#"S") tr1.op:$V1, tr2.op:$V2, 4184 tr2.op:$V3, 0)>; 4185 } 4186 4187 multiclass TernaryOptVRRbSPairGeneric<string mnemonic, bits<16> opcode> { 4188 def "" : InstVRRb<opcode, (outs VR128:$V1), 4189 (ins VR128:$V2, VR128:$V3, imm32zx4:$M4, imm32zx4:$M5), 4190 mnemonic#"\t$V1, $V2, $V3, $M4, $M5", []>; 4191 def : InstAlias<mnemonic#"\t$V1, $V2, $V3, $M4", 4192 (!cast<Instruction>(NAME) VR128:$V1, VR128:$V2, VR128:$V3, 4193 imm32zx4:$M4, 0)>; 4194 } 4195 4196 class TernaryVRRc<string mnemonic, bits<16> opcode, SDPatternOperator operator, 4197 TypedReg tr1, TypedReg tr2> 4198 : InstVRRc<opcode, (outs tr1.op:$V1), 4199 (ins tr2.op:$V2, tr2.op:$V3, imm32zx4:$M4), 4200 mnemonic#"\t$V1, $V2, $V3, $M4", 4201 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), 4202 (tr2.vt tr2.op:$V3), 4203 imm32zx4:$M4))]> { 4204 let M5 = 0; 4205 let M6 = 0; 4206 } 4207 4208 class TernaryVRRcFloat<string mnemonic, bits<16> opcode, 4209 SDPatternOperator operator, TypedReg tr1, TypedReg tr2, 4210 bits<4> type = 0, bits<4> m5 = 0> 4211 : InstVRRc<opcode, (outs tr1.op:$V1), 4212 (ins tr2.op:$V2, tr2.op:$V3, imm32zx4:$M6), 4213 mnemonic#"\t$V1, $V2, $V3, $M6", 4214 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), 4215 (tr2.vt tr2.op:$V3), 4216 imm32zx4:$M6))]> { 4217 let M4 = type; 4218 let M5 = m5; 4219 } 4220 4221 class TernaryVRRcFloatGeneric<string mnemonic, bits<16> opcode> 4222 : InstVRRc<opcode, (outs VR128:$V1), 4223 (ins VR128:$V2, VR128:$V3, imm32zx4:$M4, imm32zx4:$M5, 4224 imm32zx4:$M6), 4225 mnemonic#"\t$V1, $V2, $V3, $M4, $M5, $M6", []>; 4226 4227 class TernaryVRRd<string mnemonic, bits<16> opcode, SDPatternOperator operator, 4228 TypedReg tr1, TypedReg tr2, bits<4> type = 0> 4229 : InstVRRd<opcode, (outs tr1.op:$V1), 4230 (ins tr2.op:$V2, tr2.op:$V3, tr1.op:$V4), 4231 mnemonic#"\t$V1, $V2, $V3, $V4", 4232 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), 4233 (tr2.vt tr2.op:$V3), 4234 (tr1.vt tr1.op:$V4)))]> { 4235 let M5 = type; 4236 let M6 = 0; 4237 } 4238 4239 class TernaryVRRdGeneric<string mnemonic, bits<16> opcode> 4240 : InstVRRd<opcode, (outs VR128:$V1), 4241 (ins VR128:$V2, VR128:$V3, VR128:$V4, imm32zx4:$M5), 4242 mnemonic#"\t$V1, $V2, $V3, $V4, $M5", []> { 4243 let M6 = 0; 4244 } 4245 4246 class TernaryVRRe<string mnemonic, bits<16> opcode, SDPatternOperator operator, 4247 TypedReg tr1, TypedReg tr2, bits<4> m5 = 0, bits<4> type = 0> 4248 : InstVRRe<opcode, (outs tr1.op:$V1), 4249 (ins tr2.op:$V2, tr2.op:$V3, tr1.op:$V4), 4250 mnemonic#"\t$V1, $V2, $V3, $V4", 4251 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), 4252 (tr2.vt tr2.op:$V3), 4253 (tr1.vt tr1.op:$V4)))]> { 4254 let M5 = m5; 4255 let M6 = type; 4256 } 4257 4258 class TernaryVRReFloatGeneric<string mnemonic, bits<16> opcode> 4259 : InstVRRe<opcode, (outs VR128:$V1), 4260 (ins VR128:$V2, VR128:$V3, VR128:$V4, imm32zx4:$M5, imm32zx4:$M6), 4261 mnemonic#"\t$V1, $V2, $V3, $V4, $M5, $M6", []>; 4262 4263 class TernaryVRSb<string mnemonic, bits<16> opcode, SDPatternOperator operator, 4264 TypedReg tr1, TypedReg tr2, RegisterOperand cls, bits<4> type> 4265 : InstVRSb<opcode, (outs tr1.op:$V1), 4266 (ins tr2.op:$V1src, cls:$R3, shift12only:$BD2), 4267 mnemonic#"\t$V1, $R3, $BD2", 4268 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V1src), 4269 cls:$R3, 4270 shift12only:$BD2))]> { 4271 let Constraints = "$V1 = $V1src"; 4272 let DisableEncoding = "$V1src"; 4273 let M4 = type; 4274 } 4275 4276 class TernaryVRSbGeneric<string mnemonic, bits<16> opcode> 4277 : InstVRSb<opcode, (outs VR128:$V1), 4278 (ins VR128:$V1src, GR64:$R3, shift12only:$BD2, imm32zx4:$M4), 4279 mnemonic#"\t$V1, $R3, $BD2, $M4", []> { 4280 let Constraints = "$V1 = $V1src"; 4281 let DisableEncoding = "$V1src"; 4282 } 4283 4284 class TernaryVRV<string mnemonic, bits<16> opcode, bits<5> bytes, 4285 Immediate index> 4286 : InstVRV<opcode, (outs VR128:$V1), 4287 (ins VR128:$V1src, bdvaddr12only:$VBD2, index:$M3), 4288 mnemonic#"\t$V1, $VBD2, $M3", []> { 4289 let Constraints = "$V1 = $V1src"; 4290 let DisableEncoding = "$V1src"; 4291 let mayLoad = 1; 4292 let AccessBytes = bytes; 4293 } 4294 4295 class TernaryVRX<string mnemonic, bits<16> opcode, SDPatternOperator operator, 4296 TypedReg tr1, TypedReg tr2, bits<5> bytes, Immediate index> 4297 : InstVRX<opcode, (outs tr1.op:$V1), 4298 (ins tr2.op:$V1src, bdxaddr12only:$XBD2, index:$M3), 4299 mnemonic#"\t$V1, $XBD2, $M3", 4300 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V1src), 4301 bdxaddr12only:$XBD2, 4302 index:$M3))]> { 4303 let Constraints = "$V1 = $V1src"; 4304 let DisableEncoding = "$V1src"; 4305 let mayLoad = 1; 4306 let AccessBytes = bytes; 4307 } 4308 4309 class QuaternaryVRId<string mnemonic, bits<16> opcode, SDPatternOperator operator, 4310 TypedReg tr1, TypedReg tr2, bits<4> type> 4311 : InstVRId<opcode, (outs tr1.op:$V1), 4312 (ins tr2.op:$V1src, tr2.op:$V2, tr2.op:$V3, imm32zx8:$I4), 4313 mnemonic#"\t$V1, $V2, $V3, $I4", 4314 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V1src), 4315 (tr2.vt tr2.op:$V2), 4316 (tr2.vt tr2.op:$V3), 4317 imm32zx8:$I4))]> { 4318 let Constraints = "$V1 = $V1src"; 4319 let DisableEncoding = "$V1src"; 4320 let M5 = type; 4321 } 4322 4323 class QuaternaryVRIdGeneric<string mnemonic, bits<16> opcode> 4324 : InstVRId<opcode, (outs VR128:$V1), 4325 (ins VR128:$V1src, VR128:$V2, VR128:$V3, 4326 imm32zx8:$I4, imm32zx4:$M5), 4327 mnemonic#"\t$V1, $V2, $V3, $I4, $M5", []> { 4328 let Constraints = "$V1 = $V1src"; 4329 let DisableEncoding = "$V1src"; 4330 } 4331 4332 class QuaternaryVRIf<string mnemonic, bits<16> opcode> 4333 : InstVRIf<opcode, (outs VR128:$V1), 4334 (ins VR128:$V2, VR128:$V3, 4335 imm32zx8:$I4, imm32zx4:$M5), 4336 mnemonic#"\t$V1, $V2, $V3, $I4, $M5", []>; 4337 4338 class QuaternaryVRIg<string mnemonic, bits<16> opcode> 4339 : InstVRIg<opcode, (outs VR128:$V1), 4340 (ins VR128:$V2, imm32zx8:$I3, 4341 imm32zx8:$I4, imm32zx4:$M5), 4342 mnemonic#"\t$V1, $V2, $I3, $I4, $M5", []>; 4343 4344 class QuaternaryVRRd<string mnemonic, bits<16> opcode, 4345 SDPatternOperator operator, TypedReg tr1, TypedReg tr2, 4346 TypedReg tr3, TypedReg tr4, bits<4> type, 4347 SDPatternOperator m6mask = imm32zx4, bits<4> m6or = 0> 4348 : InstVRRd<opcode, (outs tr1.op:$V1), 4349 (ins tr2.op:$V2, tr3.op:$V3, tr4.op:$V4, m6mask:$M6), 4350 mnemonic#"\t$V1, $V2, $V3, $V4, $M6", 4351 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2), 4352 (tr3.vt tr3.op:$V3), 4353 (tr4.vt tr4.op:$V4), 4354 m6mask:$M6))], 4355 m6or> { 4356 let M5 = type; 4357 } 4358 4359 class QuaternaryVRRdGeneric<string mnemonic, bits<16> opcode> 4360 : InstVRRd<opcode, (outs VR128:$V1), 4361 (ins VR128:$V2, VR128:$V3, VR128:$V4, imm32zx4:$M5, imm32zx4:$M6), 4362 mnemonic#"\t$V1, $V2, $V3, $V4, $M5, $M6", []>; 4363 4364 // Declare a pair of instructions, one which sets CC and one which doesn't. 4365 // The CC-setting form ends with "S" and sets the low bit of M6. 4366 // Also create aliases to make use of M6 operand optional in assembler. 4367 multiclass QuaternaryOptVRRdSPair<string mnemonic, bits<16> opcode, 4368 SDPatternOperator operator, 4369 SDPatternOperator operator_cc, 4370 TypedReg tr1, TypedReg tr2, bits<4> type, 4371 bits<4> modifier = 0> { 4372 def "" : QuaternaryVRRd<mnemonic, opcode, operator, 4373 tr1, tr2, tr2, tr2, type, 4374 imm32zx4even, !and (modifier, 14)>; 4375 def : InstAlias<mnemonic#"\t$V1, $V2, $V3, $V4", 4376 (!cast<Instruction>(NAME) tr1.op:$V1, tr2.op:$V2, 4377 tr2.op:$V3, tr2.op:$V4, 0)>; 4378 let Defs = [CC] in 4379 def S : QuaternaryVRRd<mnemonic##"s", opcode, operator_cc, 4380 tr1, tr2, tr2, tr2, type, 4381 imm32zx4even, !add (!and (modifier, 14), 1)>; 4382 def : InstAlias<mnemonic#"s\t$V1, $V2, $V3, $V4", 4383 (!cast<Instruction>(NAME#"S") tr1.op:$V1, tr2.op:$V2, 4384 tr2.op:$V3, tr2.op:$V4, 0)>; 4385 } 4386 4387 multiclass QuaternaryOptVRRdSPairGeneric<string mnemonic, bits<16> opcode> { 4388 def "" : QuaternaryVRRdGeneric<mnemonic, opcode>; 4389 def : InstAlias<mnemonic#"\t$V1, $V2, $V3, $V4, $M5", 4390 (!cast<Instruction>(NAME) VR128:$V1, VR128:$V2, VR128:$V3, 4391 VR128:$V4, imm32zx4:$M5, 0)>; 4392 } 4393 4394 class SideEffectQuaternaryRRFa<string mnemonic, bits<16> opcode, 4395 RegisterOperand cls1, RegisterOperand cls2, 4396 RegisterOperand cls3> 4397 : InstRRFa<opcode, (outs), (ins cls1:$R1, cls2:$R2, cls3:$R3, imm32zx4:$M4), 4398 mnemonic#"\t$R1, $R2, $R3, $M4", []>; 4399 4400 multiclass SideEffectQuaternaryRRFaOptOpt<string mnemonic, bits<16> opcode, 4401 RegisterOperand cls1, 4402 RegisterOperand cls2, 4403 RegisterOperand cls3> { 4404 def "" : SideEffectQuaternaryRRFa<mnemonic, opcode, cls1, cls2, cls3>; 4405 def Opt : SideEffectTernaryRRFa<mnemonic, opcode, cls1, cls2, cls3>; 4406 def OptOpt : SideEffectBinaryRRFa<mnemonic, opcode, cls1, cls2>; 4407 } 4408 4409 class SideEffectQuaternaryRRFb<string mnemonic, bits<16> opcode, 4410 RegisterOperand cls1, RegisterOperand cls2, 4411 RegisterOperand cls3> 4412 : InstRRFb<opcode, (outs), (ins cls1:$R1, cls2:$R2, cls3:$R3, imm32zx4:$M4), 4413 mnemonic#"\t$R1, $R3, $R2, $M4", []>; 4414 4415 multiclass SideEffectQuaternaryRRFbOpt<string mnemonic, bits<16> opcode, 4416 RegisterOperand cls1, 4417 RegisterOperand cls2, 4418 RegisterOperand cls3> { 4419 def "" : SideEffectQuaternaryRRFb<mnemonic, opcode, cls1, cls2, cls3>; 4420 def Opt : SideEffectTernaryRRFb<mnemonic, opcode, cls1, cls2, cls3>; 4421 } 4422 4423 class SideEffectQuaternarySSe<string mnemonic, bits<8> opcode, 4424 RegisterOperand cls> 4425 : InstSSe<opcode, (outs), 4426 (ins cls:$R1, bdaddr12only:$BD2, cls:$R3, bdaddr12only:$BD4), 4427 mnemonic#"\t$R1, $BD2, $R3, $BD4", []>; 4428 4429 class LoadAndOpRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator, 4430 RegisterOperand cls, AddressingMode mode = bdaddr20only> 4431 : InstRSYa<opcode, (outs cls:$R1), (ins cls:$R3, mode:$BD2), 4432 mnemonic#"\t$R1, $R3, $BD2", 4433 [(set cls:$R1, (operator mode:$BD2, cls:$R3))]> { 4434 let mayLoad = 1; 4435 let mayStore = 1; 4436 } 4437 4438 class CmpSwapRRE<string mnemonic, bits<16> opcode, 4439 RegisterOperand cls1, RegisterOperand cls2> 4440 : InstRRE<opcode, (outs cls1:$R1), (ins cls1:$R1src, cls2:$R2), 4441 mnemonic#"\t$R1, $R2", []> { 4442 let Constraints = "$R1 = $R1src"; 4443 let DisableEncoding = "$R1src"; 4444 let mayLoad = 1; 4445 let mayStore = 1; 4446 } 4447 4448 class CmpSwapRS<string mnemonic, bits<8> opcode, SDPatternOperator operator, 4449 RegisterOperand cls, AddressingMode mode = bdaddr12only> 4450 : InstRSa<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, mode:$BD2), 4451 mnemonic#"\t$R1, $R3, $BD2", 4452 [(set cls:$R1, (operator mode:$BD2, cls:$R1src, cls:$R3))]> { 4453 let Constraints = "$R1 = $R1src"; 4454 let DisableEncoding = "$R1src"; 4455 let mayLoad = 1; 4456 let mayStore = 1; 4457 } 4458 4459 class CmpSwapRSY<string mnemonic, bits<16> opcode, SDPatternOperator operator, 4460 RegisterOperand cls, AddressingMode mode = bdaddr20only> 4461 : InstRSYa<opcode, (outs cls:$R1), (ins cls:$R1src, cls:$R3, mode:$BD2), 4462 mnemonic#"\t$R1, $R3, $BD2", 4463 [(set cls:$R1, (operator mode:$BD2, cls:$R1src, cls:$R3))]> { 4464 let Constraints = "$R1 = $R1src"; 4465 let DisableEncoding = "$R1src"; 4466 let mayLoad = 1; 4467 let mayStore = 1; 4468 } 4469 4470 multiclass CmpSwapRSPair<string mnemonic, bits<8> rsOpcode, bits<16> rsyOpcode, 4471 SDPatternOperator operator, RegisterOperand cls> { 4472 let DispKey = mnemonic ## #cls in { 4473 let DispSize = "12" in 4474 def "" : CmpSwapRS<mnemonic, rsOpcode, operator, cls, bdaddr12pair>; 4475 let DispSize = "20" in 4476 def Y : CmpSwapRSY<mnemonic#"y", rsyOpcode, operator, cls, bdaddr20pair>; 4477 } 4478 } 4479 4480 class RotateSelectRIEf<string mnemonic, bits<16> opcode, RegisterOperand cls1, 4481 RegisterOperand cls2> 4482 : InstRIEf<opcode, (outs cls1:$R1), 4483 (ins cls1:$R1src, cls2:$R2, imm32zx8:$I3, imm32zx8:$I4, 4484 imm32zx6:$I5), 4485 mnemonic#"\t$R1, $R2, $I3, $I4, $I5", []> { 4486 let Constraints = "$R1 = $R1src"; 4487 let DisableEncoding = "$R1src"; 4488 } 4489 4490 class PrefetchRXY<string mnemonic, bits<16> opcode, SDPatternOperator operator> 4491 : InstRXYb<opcode, (outs), (ins imm32zx4:$M1, bdxaddr20only:$XBD2), 4492 mnemonic##"\t$M1, $XBD2", 4493 [(operator imm32zx4:$M1, bdxaddr20only:$XBD2)]>; 4494 4495 class PrefetchRILPC<string mnemonic, bits<12> opcode, 4496 SDPatternOperator operator> 4497 : InstRILc<opcode, (outs), (ins imm32zx4:$M1, pcrel32:$RI2), 4498 mnemonic##"\t$M1, $RI2", 4499 [(operator imm32zx4:$M1, pcrel32:$RI2)]> { 4500 // We want PC-relative addresses to be tried ahead of BD and BDX addresses. 4501 // However, BDXs have two extra operands and are therefore 6 units more 4502 // complex. 4503 let AddedComplexity = 7; 4504 } 4505 4506 class BranchPreloadSMI<string mnemonic, bits<8> opcode> 4507 : InstSMI<opcode, (outs), 4508 (ins imm32zx4:$M1, brtarget16bpp:$RI2, bdxaddr12only:$BD3), 4509 mnemonic#"\t$M1, $RI2, $BD3", []>; 4510 4511 class BranchPreloadMII<string mnemonic, bits<8> opcode> 4512 : InstMII<opcode, (outs), 4513 (ins imm32zx4:$M1, brtarget12bpp:$RI2, brtarget24bpp:$RI3), 4514 mnemonic#"\t$M1, $RI2, $RI3", []>; 4515 4516 // A floating-point load-and test operation. Create both a normal unary 4517 // operation and one that acts as a comparison against zero. 4518 // Note that the comparison against zero operation is not available if we 4519 // have vector support, since load-and-test instructions will partially 4520 // clobber the target (vector) register. 4521 multiclass LoadAndTestRRE<string mnemonic, bits<16> opcode, 4522 RegisterOperand cls> { 4523 def "" : UnaryRRE<mnemonic, opcode, null_frag, cls, cls>; 4524 let isCodeGenOnly = 1, Predicates = [FeatureNoVector] in 4525 def Compare : CompareRRE<mnemonic, opcode, null_frag, cls, cls>; 4526 } 4527 4528 //===----------------------------------------------------------------------===// 4529 // Pseudo instructions 4530 //===----------------------------------------------------------------------===// 4531 // 4532 // Convenience instructions that get lowered to real instructions 4533 // by either SystemZTargetLowering::EmitInstrWithCustomInserter() 4534 // or SystemZInstrInfo::expandPostRAPseudo(). 4535 // 4536 //===----------------------------------------------------------------------===// 4537 4538 class Pseudo<dag outs, dag ins, list<dag> pattern> 4539 : InstSystemZ<0, outs, ins, "", pattern> { 4540 let isPseudo = 1; 4541 let isCodeGenOnly = 1; 4542 } 4543 4544 // Like UnaryRI, but expanded after RA depending on the choice of register. 4545 class UnaryRIPseudo<SDPatternOperator operator, RegisterOperand cls, 4546 Immediate imm> 4547 : Pseudo<(outs cls:$R1), (ins imm:$I2), 4548 [(set cls:$R1, (operator imm:$I2))]>; 4549 4550 // Like UnaryRXY, but expanded after RA depending on the choice of register. 4551 class UnaryRXYPseudo<string key, SDPatternOperator operator, 4552 RegisterOperand cls, bits<5> bytes, 4553 AddressingMode mode = bdxaddr20only> 4554 : Pseudo<(outs cls:$R1), (ins mode:$XBD2), 4555 [(set cls:$R1, (operator mode:$XBD2))]> { 4556 let OpKey = key#"r"#cls; 4557 let OpType = "mem"; 4558 let mayLoad = 1; 4559 let Has20BitOffset = 1; 4560 let HasIndex = 1; 4561 let AccessBytes = bytes; 4562 } 4563 4564 // Like UnaryRR, but expanded after RA depending on the choice of registers. 4565 class UnaryRRPseudo<string key, SDPatternOperator operator, 4566 RegisterOperand cls1, RegisterOperand cls2> 4567 : Pseudo<(outs cls1:$R1), (ins cls2:$R2), 4568 [(set cls1:$R1, (operator cls2:$R2))]> { 4569 let OpKey = key#cls1; 4570 let OpType = "reg"; 4571 } 4572 4573 // Like BinaryRI, but expanded after RA depending on the choice of register. 4574 class BinaryRIPseudo<SDPatternOperator operator, RegisterOperand cls, 4575 Immediate imm> 4576 : Pseudo<(outs cls:$R1), (ins cls:$R1src, imm:$I2), 4577 [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> { 4578 let Constraints = "$R1 = $R1src"; 4579 } 4580 4581 // Like BinaryRIE, but expanded after RA depending on the choice of register. 4582 class BinaryRIEPseudo<SDPatternOperator operator, RegisterOperand cls, 4583 Immediate imm> 4584 : Pseudo<(outs cls:$R1), (ins cls:$R3, imm:$I2), 4585 [(set cls:$R1, (operator cls:$R3, imm:$I2))]>; 4586 4587 // Like BinaryRIAndK, but expanded after RA depending on the choice of register. 4588 multiclass BinaryRIAndKPseudo<string key, SDPatternOperator operator, 4589 RegisterOperand cls, Immediate imm> { 4590 let NumOpsKey = key in { 4591 let NumOpsValue = "3" in 4592 def K : BinaryRIEPseudo<null_frag, cls, imm>, 4593 Requires<[FeatureHighWord, FeatureDistinctOps]>; 4594 let NumOpsValue = "2", isConvertibleToThreeAddress = 1 in 4595 def "" : BinaryRIPseudo<operator, cls, imm>, 4596 Requires<[FeatureHighWord]>; 4597 } 4598 } 4599 4600 // Like CompareRI, but expanded after RA depending on the choice of register. 4601 class CompareRIPseudo<SDPatternOperator operator, RegisterOperand cls, 4602 Immediate imm> 4603 : Pseudo<(outs), (ins cls:$R1, imm:$I2), 4604 [(set CC, (operator cls:$R1, imm:$I2))]> { 4605 let isCompare = 1; 4606 } 4607 4608 // Like CompareRXY, but expanded after RA depending on the choice of register. 4609 class CompareRXYPseudo<SDPatternOperator operator, RegisterOperand cls, 4610 SDPatternOperator load, bits<5> bytes, 4611 AddressingMode mode = bdxaddr20only> 4612 : Pseudo<(outs), (ins cls:$R1, mode:$XBD2), 4613 [(set CC, (operator cls:$R1, (load mode:$XBD2)))]> { 4614 let mayLoad = 1; 4615 let Has20BitOffset = 1; 4616 let HasIndex = 1; 4617 let AccessBytes = bytes; 4618 } 4619 4620 // Like TestBinarySIL, but expanded later. 4621 class TestBinarySILPseudo<SDPatternOperator operator, Immediate imm> 4622 : Pseudo<(outs), (ins bdaddr12only:$BD1, imm:$I2), 4623 [(set CC, (operator bdaddr12only:$BD1, imm:$I2))]>; 4624 4625 // Like CondBinaryRRF, but expanded after RA depending on the choice of 4626 // register. 4627 class CondBinaryRRFPseudo<RegisterOperand cls1, RegisterOperand cls2> 4628 : Pseudo<(outs cls1:$R1), 4629 (ins cls1:$R1src, cls2:$R2, cond4:$valid, cond4:$M3), 4630 [(set cls1:$R1, (z_select_ccmask cls2:$R2, cls1:$R1src, 4631 cond4:$valid, cond4:$M3))]> { 4632 let Constraints = "$R1 = $R1src"; 4633 let DisableEncoding = "$R1src"; 4634 let CCMaskLast = 1; 4635 } 4636 4637 // Like CondBinaryRIE, but expanded after RA depending on the choice of 4638 // register. 4639 class CondBinaryRIEPseudo<RegisterOperand cls, Immediate imm> 4640 : Pseudo<(outs cls:$R1), 4641 (ins cls:$R1src, imm:$I2, cond4:$valid, cond4:$M3), 4642 [(set cls:$R1, (z_select_ccmask imm:$I2, cls:$R1src, 4643 cond4:$valid, cond4:$M3))]> { 4644 let Constraints = "$R1 = $R1src"; 4645 let DisableEncoding = "$R1src"; 4646 let CCMaskLast = 1; 4647 } 4648 4649 // Like CondUnaryRSY, but expanded after RA depending on the choice of 4650 // register. 4651 class CondUnaryRSYPseudo<SDPatternOperator operator, RegisterOperand cls, 4652 bits<5> bytes, AddressingMode mode = bdaddr20only> 4653 : Pseudo<(outs cls:$R1), 4654 (ins cls:$R1src, mode:$BD2, cond4:$valid, cond4:$R3), 4655 [(set cls:$R1, 4656 (z_select_ccmask (operator mode:$BD2), cls:$R1src, 4657 cond4:$valid, cond4:$R3))]> { 4658 let Constraints = "$R1 = $R1src"; 4659 let DisableEncoding = "$R1src"; 4660 let mayLoad = 1; 4661 let AccessBytes = bytes; 4662 let CCMaskLast = 1; 4663 } 4664 4665 // Like CondStoreRSY, but expanded after RA depending on the choice of 4666 // register. 4667 class CondStoreRSYPseudo<RegisterOperand cls, bits<5> bytes, 4668 AddressingMode mode = bdaddr20only> 4669 : Pseudo<(outs), (ins cls:$R1, mode:$BD2, cond4:$valid, cond4:$R3), []> { 4670 let mayStore = 1; 4671 let AccessBytes = bytes; 4672 let CCMaskLast = 1; 4673 } 4674 4675 // Like StoreRXY, but expanded after RA depending on the choice of register. 4676 class StoreRXYPseudo<SDPatternOperator operator, RegisterOperand cls, 4677 bits<5> bytes, AddressingMode mode = bdxaddr20only> 4678 : Pseudo<(outs), (ins cls:$R1, mode:$XBD2), 4679 [(operator cls:$R1, mode:$XBD2)]> { 4680 let mayStore = 1; 4681 let Has20BitOffset = 1; 4682 let HasIndex = 1; 4683 let AccessBytes = bytes; 4684 } 4685 4686 // Like RotateSelectRIEf, but expanded after RA depending on the choice 4687 // of registers. 4688 class RotateSelectRIEfPseudo<RegisterOperand cls1, RegisterOperand cls2> 4689 : Pseudo<(outs cls1:$R1), 4690 (ins cls1:$R1src, cls2:$R2, imm32zx8:$I3, imm32zx8:$I4, 4691 imm32zx6:$I5), 4692 []> { 4693 let Constraints = "$R1 = $R1src"; 4694 let DisableEncoding = "$R1src"; 4695 } 4696 4697 // Implements "$dst = $cc & (8 >> CC) ? $src1 : $src2", where CC is 4698 // the value of the PSW's 2-bit condition code field. 4699 class SelectWrapper<ValueType vt, RegisterOperand cls> 4700 : Pseudo<(outs cls:$dst), 4701 (ins cls:$src1, cls:$src2, imm32zx4:$valid, imm32zx4:$cc), 4702 [(set (vt cls:$dst), (z_select_ccmask cls:$src1, cls:$src2, 4703 imm32zx4:$valid, imm32zx4:$cc))]> { 4704 let usesCustomInserter = 1; 4705 let hasNoSchedulingInfo = 1; 4706 let Uses = [CC]; 4707 } 4708 4709 // Stores $new to $addr if $cc is true ("" case) or false (Inv case). 4710 multiclass CondStores<RegisterOperand cls, SDPatternOperator store, 4711 SDPatternOperator load, AddressingMode mode> { 4712 let Uses = [CC], usesCustomInserter = 1, hasNoSchedulingInfo = 1, 4713 mayLoad = 1, mayStore = 1 in { 4714 def "" : Pseudo<(outs), 4715 (ins cls:$new, mode:$addr, imm32zx4:$valid, imm32zx4:$cc), 4716 [(store (z_select_ccmask cls:$new, (load mode:$addr), 4717 imm32zx4:$valid, imm32zx4:$cc), 4718 mode:$addr)]>; 4719 def Inv : Pseudo<(outs), 4720 (ins cls:$new, mode:$addr, imm32zx4:$valid, imm32zx4:$cc), 4721 [(store (z_select_ccmask (load mode:$addr), cls:$new, 4722 imm32zx4:$valid, imm32zx4:$cc), 4723 mode:$addr)]>; 4724 } 4725 } 4726 4727 // OPERATOR is ATOMIC_SWAP or an ATOMIC_LOAD_* operation. PAT and OPERAND 4728 // describe the second (non-memory) operand. 4729 class AtomicLoadBinary<SDPatternOperator operator, RegisterOperand cls, 4730 dag pat, DAGOperand operand> 4731 : Pseudo<(outs cls:$dst), (ins bdaddr20only:$ptr, operand:$src2), 4732 [(set cls:$dst, (operator bdaddr20only:$ptr, pat))]> { 4733 let Defs = [CC]; 4734 let Has20BitOffset = 1; 4735 let mayLoad = 1; 4736 let mayStore = 1; 4737 let usesCustomInserter = 1; 4738 let hasNoSchedulingInfo = 1; 4739 } 4740 4741 // Specializations of AtomicLoadWBinary. 4742 class AtomicLoadBinaryReg32<SDPatternOperator operator> 4743 : AtomicLoadBinary<operator, GR32, (i32 GR32:$src2), GR32>; 4744 class AtomicLoadBinaryImm32<SDPatternOperator operator, Immediate imm> 4745 : AtomicLoadBinary<operator, GR32, (i32 imm:$src2), imm>; 4746 class AtomicLoadBinaryReg64<SDPatternOperator operator> 4747 : AtomicLoadBinary<operator, GR64, (i64 GR64:$src2), GR64>; 4748 class AtomicLoadBinaryImm64<SDPatternOperator operator, Immediate imm> 4749 : AtomicLoadBinary<operator, GR64, (i64 imm:$src2), imm>; 4750 4751 // OPERATOR is ATOMIC_SWAPW or an ATOMIC_LOADW_* operation. PAT and OPERAND 4752 // describe the second (non-memory) operand. 4753 class AtomicLoadWBinary<SDPatternOperator operator, dag pat, 4754 DAGOperand operand> 4755 : Pseudo<(outs GR32:$dst), 4756 (ins bdaddr20only:$ptr, operand:$src2, ADDR32:$bitshift, 4757 ADDR32:$negbitshift, uimm32:$bitsize), 4758 [(set GR32:$dst, (operator bdaddr20only:$ptr, pat, ADDR32:$bitshift, 4759 ADDR32:$negbitshift, uimm32:$bitsize))]> { 4760 let Defs = [CC]; 4761 let Has20BitOffset = 1; 4762 let mayLoad = 1; 4763 let mayStore = 1; 4764 let usesCustomInserter = 1; 4765 let hasNoSchedulingInfo = 1; 4766 } 4767 4768 // Specializations of AtomicLoadWBinary. 4769 class AtomicLoadWBinaryReg<SDPatternOperator operator> 4770 : AtomicLoadWBinary<operator, (i32 GR32:$src2), GR32>; 4771 class AtomicLoadWBinaryImm<SDPatternOperator operator, Immediate imm> 4772 : AtomicLoadWBinary<operator, (i32 imm:$src2), imm>; 4773 4774 // Define an instruction that operates on two fixed-length blocks of memory, 4775 // and associated pseudo instructions for operating on blocks of any size. 4776 // The Sequence form uses a straight-line sequence of instructions and 4777 // the Loop form uses a loop of length-256 instructions followed by 4778 // another instruction to handle the excess. 4779 multiclass MemorySS<string mnemonic, bits<8> opcode, 4780 SDPatternOperator sequence, SDPatternOperator loop> { 4781 def "" : SideEffectBinarySSa<mnemonic, opcode>; 4782 let usesCustomInserter = 1, hasNoSchedulingInfo = 1, Defs = [CC] in { 4783 def Sequence : Pseudo<(outs), (ins bdaddr12only:$dest, bdaddr12only:$src, 4784 imm64:$length), 4785 [(sequence bdaddr12only:$dest, bdaddr12only:$src, 4786 imm64:$length)]>; 4787 def Loop : Pseudo<(outs), (ins bdaddr12only:$dest, bdaddr12only:$src, 4788 imm64:$length, GR64:$count256), 4789 [(loop bdaddr12only:$dest, bdaddr12only:$src, 4790 imm64:$length, GR64:$count256)]>; 4791 } 4792 } 4793 4794 // The same, but setting a CC result as comparion operator. 4795 multiclass CompareMemorySS<string mnemonic, bits<8> opcode, 4796 SDPatternOperator sequence, SDPatternOperator loop> { 4797 def "" : SideEffectBinarySSa<mnemonic, opcode>; 4798 let usesCustomInserter = 1, hasNoSchedulingInfo = 1 in { 4799 def Sequence : Pseudo<(outs), (ins bdaddr12only:$dest, bdaddr12only:$src, 4800 imm64:$length), 4801 [(set CC, (sequence bdaddr12only:$dest, bdaddr12only:$src, 4802 imm64:$length))]>; 4803 def Loop : Pseudo<(outs), (ins bdaddr12only:$dest, bdaddr12only:$src, 4804 imm64:$length, GR64:$count256), 4805 [(set CC, (loop bdaddr12only:$dest, bdaddr12only:$src, 4806 imm64:$length, GR64:$count256))]>; 4807 } 4808 } 4809 4810 // Define an instruction that operates on two strings, both terminated 4811 // by the character in R0. The instruction processes a CPU-determinated 4812 // number of bytes at a time and sets CC to 3 if the instruction needs 4813 // to be repeated. Also define a pseudo instruction that represents 4814 // the full loop (the main instruction plus the branch on CC==3). 4815 multiclass StringRRE<string mnemonic, bits<16> opcode, 4816 SDPatternOperator operator> { 4817 let Uses = [R0L] in 4818 def "" : SideEffectBinaryMemMemRRE<mnemonic, opcode, GR64, GR64>; 4819 let usesCustomInserter = 1, hasNoSchedulingInfo = 1 in 4820 def Loop : Pseudo<(outs GR64:$end), 4821 (ins GR64:$start1, GR64:$start2, GR32:$char), 4822 [(set GR64:$end, (operator GR64:$start1, GR64:$start2, 4823 GR32:$char))]>; 4824 } 4825 4826 // A pseudo instruction that is a direct alias of a real instruction. 4827 // These aliases are used in cases where a particular register operand is 4828 // fixed or where the same instruction is used with different register sizes. 4829 // The size parameter is the size in bytes of the associated real instruction. 4830 class Alias<int size, dag outs, dag ins, list<dag> pattern> 4831 : InstSystemZ<size, outs, ins, "", pattern> { 4832 let isPseudo = 1; 4833 let isCodeGenOnly = 1; 4834 } 4835 4836 class UnaryAliasVRS<RegisterOperand cls1, RegisterOperand cls2> 4837 : Alias<6, (outs cls1:$src1), (ins cls2:$src2), []>; 4838 4839 // An alias of a UnaryVRR*, but with different register sizes. 4840 class UnaryAliasVRR<SDPatternOperator operator, TypedReg tr1, TypedReg tr2> 4841 : Alias<6, (outs tr1.op:$V1), (ins tr2.op:$V2), 4842 [(set (tr1.vt tr1.op:$V1), (operator (tr2.vt tr2.op:$V2)))]>; 4843 4844 // An alias of a UnaryVRX, but with different register sizes. 4845 class UnaryAliasVRX<SDPatternOperator operator, TypedReg tr, 4846 AddressingMode mode = bdxaddr12only> 4847 : Alias<6, (outs tr.op:$V1), (ins mode:$XBD2), 4848 [(set (tr.vt tr.op:$V1), (operator mode:$XBD2))]>; 4849 4850 // An alias of a StoreVRX, but with different register sizes. 4851 class StoreAliasVRX<SDPatternOperator operator, TypedReg tr, 4852 AddressingMode mode = bdxaddr12only> 4853 : Alias<6, (outs), (ins tr.op:$V1, mode:$XBD2), 4854 [(operator (tr.vt tr.op:$V1), mode:$XBD2)]>; 4855 4856 // An alias of a BinaryRI, but with different register sizes. 4857 class BinaryAliasRI<SDPatternOperator operator, RegisterOperand cls, 4858 Immediate imm> 4859 : Alias<4, (outs cls:$R1), (ins cls:$R1src, imm:$I2), 4860 [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> { 4861 let Constraints = "$R1 = $R1src"; 4862 } 4863 4864 // An alias of a BinaryRIL, but with different register sizes. 4865 class BinaryAliasRIL<SDPatternOperator operator, RegisterOperand cls, 4866 Immediate imm> 4867 : Alias<6, (outs cls:$R1), (ins cls:$R1src, imm:$I2), 4868 [(set cls:$R1, (operator cls:$R1src, imm:$I2))]> { 4869 let Constraints = "$R1 = $R1src"; 4870 } 4871 4872 // An alias of a BinaryVRRf, but with different register sizes. 4873 class BinaryAliasVRRf<RegisterOperand cls> 4874 : Alias<6, (outs VR128:$V1), (ins cls:$R2, cls:$R3), []>; 4875 4876 // An alias of a CompareRI, but with different register sizes. 4877 class CompareAliasRI<SDPatternOperator operator, RegisterOperand cls, 4878 Immediate imm> 4879 : Alias<4, (outs), (ins cls:$R1, imm:$I2), 4880 [(set CC, (operator cls:$R1, imm:$I2))]> { 4881 let isCompare = 1; 4882 } 4883 4884 // An alias of a RotateSelectRIEf, but with different register sizes. 4885 class RotateSelectAliasRIEf<RegisterOperand cls1, RegisterOperand cls2> 4886 : Alias<6, (outs cls1:$R1), 4887 (ins cls1:$R1src, cls2:$R2, imm32zx8:$I3, imm32zx8:$I4, 4888 imm32zx6:$I5), []> { 4889 let Constraints = "$R1 = $R1src"; 4890 } 4891