@@ -331,6 +331,25 @@ multiclass reg_cond_alias<string rcond, int condVal> {
331331 Requires<[Is64Bit]>;
332332}
333333
334+ // Instruction aliases for compare-and-branch.
335+ multiclass cwb_cond_alias<string cond, int condVal> {
336+ def : InstAlias<"cwb" # cond # " $rs1, $rs2, $imm",
337+ (CWBCONDrr cbtarget:$imm, condVal, IntRegs:$rs1, IntRegs:$rs2)>,
338+ Requires<[HasOSA2011]>;
339+ def : InstAlias<"cwb" # cond # " $rs1, $simm5, $imm",
340+ (CWBCONDri cbtarget:$imm, condVal, IntRegs:$rs1, simm5Op:$simm5)>,
341+ Requires<[HasOSA2011]>;
342+ }
343+
344+ multiclass cxb_cond_alias<string cond, int condVal> {
345+ def : InstAlias<"cxb" # cond # " $rs1, $rs2, $imm",
346+ (CXBCONDrr cbtarget:$imm, condVal, IntRegs:$rs1, IntRegs:$rs2)>,
347+ Requires<[HasOSA2011]>;
348+ def : InstAlias<"cxb" # cond # " $rs1, $simm5, $imm",
349+ (CXBCONDri cbtarget:$imm, condVal, IntRegs:$rs1, simm5Op:$simm5)>,
350+ Requires<[HasOSA2011]>;
351+ }
352+
334353defm : int_cond_alias<"a", 0b1000>;
335354defm : int_cond_alias<"n", 0b0000>;
336355defm : int_cond_alias<"ne", 0b1001>;
@@ -408,6 +427,44 @@ defm : reg_cond_alias<"ne", 0b101>;
408427defm : reg_cond_alias<"gz", 0b110>;
409428defm : reg_cond_alias<"gez", 0b111>;
410429
430+ defm : cwb_cond_alias<"ne", 0b1001>;
431+ defm : cwb_cond_alias<"e", 0b0001>;
432+ defm : cwb_cond_alias<"g", 0b1010>;
433+ defm : cwb_cond_alias<"le", 0b0010>;
434+ defm : cwb_cond_alias<"ge", 0b1011>;
435+ defm : cwb_cond_alias<"l", 0b0011>;
436+ defm : cwb_cond_alias<"gu", 0b1100>;
437+ defm : cwb_cond_alias<"leu", 0b0100>;
438+ defm : cwb_cond_alias<"cc", 0b1101>;
439+ defm : cwb_cond_alias<"cs", 0b0101>;
440+ defm : cwb_cond_alias<"pos", 0b1110>;
441+ defm : cwb_cond_alias<"neg", 0b0110>;
442+ defm : cwb_cond_alias<"vc", 0b1111>;
443+ defm : cwb_cond_alias<"vs", 0b0111>;
444+ let EmitPriority = 0 in {
445+ defm : cwb_cond_alias<"geu", 0b1101>; // same as cc
446+ defm : cwb_cond_alias<"lu", 0b0101>; // same as cs
447+ }
448+
449+ defm : cxb_cond_alias<"ne", 0b1001>;
450+ defm : cxb_cond_alias<"e", 0b0001>;
451+ defm : cxb_cond_alias<"g", 0b1010>;
452+ defm : cxb_cond_alias<"le", 0b0010>;
453+ defm : cxb_cond_alias<"ge", 0b1011>;
454+ defm : cxb_cond_alias<"l", 0b0011>;
455+ defm : cxb_cond_alias<"gu", 0b1100>;
456+ defm : cxb_cond_alias<"leu", 0b0100>;
457+ defm : cxb_cond_alias<"cc", 0b1101>;
458+ defm : cxb_cond_alias<"cs", 0b0101>;
459+ defm : cxb_cond_alias<"pos", 0b1110>;
460+ defm : cxb_cond_alias<"neg", 0b0110>;
461+ defm : cxb_cond_alias<"vc", 0b1111>;
462+ defm : cxb_cond_alias<"vs", 0b0111>;
463+ let EmitPriority = 0 in {
464+ defm : cxb_cond_alias<"geu", 0b1101>; // same as cc
465+ defm : cxb_cond_alias<"lu", 0b0101>; // same as cs
466+ }
467+
411468// Section A.3 Synthetic Instructions
412469
413470// Most are marked as Emit=0, so that they are not used for disassembly. This is
@@ -665,3 +722,9 @@ def : InstAlias<"signx $rs1, $rd", (SRArr IntRegs:$rd, IntRegs:$rs1, G0), 0>, Re
665722
666723// sir -> sir 0
667724def : InstAlias<"sir", (SIR 0), 0>;
725+
726+ // pause reg_or_imm -> wrasr %g0, reg_or_imm, %asr27
727+ let Predicates = [HasOSA2011] in {
728+ def : InstAlias<"pause $rs2", (WRASRrr ASR27, G0, IntRegs:$rs2), 1>;
729+ def : InstAlias<"pause $simm13", (WRASRri ASR27, G0, simm13Op:$simm13), 1>;
730+ } // Predicates = [HasOSA2011]
0 commit comments