@@ -286,11 +286,11 @@ multiclass cp_cond_alias<string cond, int condVal> {
286286
287287 // cb<cond> $imm
288288 def : InstAlias<!strconcat(!strconcat("cb", cond), " $imm"),
289- (CBCOND brtarget:$imm, condVal), 0>;
289+ (CPBCOND brtarget:$imm, condVal), 0>;
290290
291291 // cb<cond>,a $imm
292292 def : InstAlias<!strconcat(!strconcat("cb", cond), ",a $imm"),
293- (CBCONDA brtarget:$imm, condVal), 0>;
293+ (CPBCONDA brtarget:$imm, condVal), 0>;
294294}
295295
296296// Instruction aliases for register conditional branches and moves.
@@ -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<!strconcat(!strconcat("cwb", cond), " $rs1, $rs2, $imm"),
337+ (CWBCONDrr cbtarget:$imm, condVal, IntRegs:$rs1, IntRegs:$rs2)>,
338+ Requires<[HasOSA2011]>;
339+ def : InstAlias<!strconcat(!strconcat("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<!strconcat(!strconcat("cxb", cond), " $rs1, $rs2, $imm"),
346+ (CXBCONDrr cbtarget:$imm, condVal, IntRegs:$rs1, IntRegs:$rs2)>,
347+ Requires<[HasOSA2011]>;
348+ def : InstAlias<!strconcat(!strconcat("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,46 @@ 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+ {
446+ defm : cwb_cond_alias<"geu", 0b1101>; // same as cc
447+ defm : cwb_cond_alias<"lu", 0b0101>; // same as cs
448+ }
449+
450+ defm : cxb_cond_alias<"ne", 0b1001>;
451+ defm : cxb_cond_alias<"e", 0b0001>;
452+ defm : cxb_cond_alias<"g", 0b1010>;
453+ defm : cxb_cond_alias<"le", 0b0010>;
454+ defm : cxb_cond_alias<"ge", 0b1011>;
455+ defm : cxb_cond_alias<"l", 0b0011>;
456+ defm : cxb_cond_alias<"gu", 0b1100>;
457+ defm : cxb_cond_alias<"leu", 0b0100>;
458+ defm : cxb_cond_alias<"cc", 0b1101>;
459+ defm : cxb_cond_alias<"cs", 0b0101>;
460+ defm : cxb_cond_alias<"pos", 0b1110>;
461+ defm : cxb_cond_alias<"neg", 0b0110>;
462+ defm : cxb_cond_alias<"vc", 0b1111>;
463+ defm : cxb_cond_alias<"vs", 0b0111>;
464+ let EmitPriority = 0 in
465+ {
466+ defm : cxb_cond_alias<"geu", 0b1101>; // same as cc
467+ defm : cxb_cond_alias<"lu", 0b0101>; // same as cs
468+ }
469+
411470// Section A.3 Synthetic Instructions
412471
413472// Most are marked as Emit=0, so that they are not used for disassembly. This is
@@ -665,3 +724,9 @@ def : InstAlias<"signx $rs1, $rd", (SRArr IntRegs:$rd, IntRegs:$rs1, G0), 0>, Re
665724
666725// sir -> sir 0
667726def : InstAlias<"sir", (SIR 0), 0>;
727+
728+ // pause reg_or_imm -> wrasr %g0, reg_or_imm, %asr27
729+ let Predicates = [HasOSA2011] in {
730+ def : InstAlias<"pause $rs2", (WRASRrr ASR27, G0, IntRegs:$rs2), 1>;
731+ def : InstAlias<"pause $simm13", (WRASRri ASR27, G0, simm13Op:$simm13), 1>;
732+ } // Predicates = [HasOSA2011]
0 commit comments