xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/AMDGPU/VOPCInstructions.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
15ffd83dbSDimitry Andric//===-- VOPCInstructions.td - Vector Instruction Definitions --------------===//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
100b57cec5SDimitry Andric// Encodings
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andricclass VOPCe <bits<8> op> : Enc32 {
140b57cec5SDimitry Andric  bits<9> src0;
150b57cec5SDimitry Andric  bits<8> src1;
160b57cec5SDimitry Andric
170b57cec5SDimitry Andric  let Inst{8-0} = src0;
180b57cec5SDimitry Andric  let Inst{16-9} = src1;
190b57cec5SDimitry Andric  let Inst{24-17} = op;
200b57cec5SDimitry Andric  let Inst{31-25} = 0x3e;
210b57cec5SDimitry Andric}
220b57cec5SDimitry Andric
230b57cec5SDimitry Andricclass VOPC_SDWAe <bits<8> op, VOPProfile P> : VOP_SDWAe <P> {
240b57cec5SDimitry Andric  bits<8> src1;
250b57cec5SDimitry Andric
260b57cec5SDimitry Andric  let Inst{8-0}   = 0xf9; // sdwa
270b57cec5SDimitry Andric  let Inst{16-9}  = !if(P.HasSrc1, src1{7-0}, 0);
280b57cec5SDimitry Andric  let Inst{24-17} = op;
290b57cec5SDimitry Andric  let Inst{31-25} = 0x3e; // encoding
300b57cec5SDimitry Andric}
310b57cec5SDimitry Andric
320b57cec5SDimitry Andricclass VOPC_SDWA9e <bits<8> op, VOPProfile P> : VOP_SDWA9Be <P> {
330b57cec5SDimitry Andric  bits<9> src1;
340b57cec5SDimitry Andric
350b57cec5SDimitry Andric  let Inst{8-0}   = 0xf9; // sdwa
360b57cec5SDimitry Andric  let Inst{16-9}  = !if(P.HasSrc1, src1{7-0}, 0);
370b57cec5SDimitry Andric  let Inst{24-17} = op;
380b57cec5SDimitry Andric  let Inst{31-25} = 0x3e; // encoding
390b57cec5SDimitry Andric  let Inst{63}    = !if(P.HasSrc1, src1{8}, 0); // src1_sgpr
400b57cec5SDimitry Andric}
410b57cec5SDimitry Andric
420b57cec5SDimitry Andric
430b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
440b57cec5SDimitry Andric// VOPC classes
450b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
460b57cec5SDimitry Andric
470b57cec5SDimitry Andric// VOPC instructions are a special case because for the 32-bit
480b57cec5SDimitry Andric// encoding, we want to display the implicit vcc write as if it were
490b57cec5SDimitry Andric// an explicit $dst.
500b57cec5SDimitry Andricclass VOPC_Profile<list<SchedReadWrite> sched, ValueType vt0, ValueType vt1 = vt0> :
510b57cec5SDimitry Andric  VOPProfile <[i1, vt0, vt1, untyped]> {
5281ad6265SDimitry Andric  // We want to exclude instructions with 64bit operands
5381ad6265SDimitry Andric  let HasExtDPP = getHasVOP3DPP<DstVT, Src0VT, Src1VT, Src2VT>.ret;
540b57cec5SDimitry Andric  let Asm32 = "$src0, $src1";
5581ad6265SDimitry Andric
5681ad6265SDimitry Andric  let AsmDPP = !if (HasModifiers,
5781ad6265SDimitry Andric                    "$src0_modifiers, $src1_modifiers "
5881ad6265SDimitry Andric                    "$dpp_ctrl$row_mask$bank_mask$bound_ctrl",
5981ad6265SDimitry Andric                    "$src0, $src1 $dpp_ctrl$row_mask$bank_mask$bound_ctrl");
6081ad6265SDimitry Andric  let AsmDPP8 = "$src0, $src1 $dpp8$fi";
6181ad6265SDimitry Andric  let AsmDPP16 = AsmDPP#"$fi";
62fcaf7f86SDimitry Andric  // VOPC DPP Instructions do not need an old operand
63fcaf7f86SDimitry Andric  let TieRegDPP = "";
647a6dacacSDimitry Andric  let InsDPP = getInsDPP<VOPDstOperand<Src0DPP.RegClass>, Src0DPP, Src1DPP, Src2DPP,
6581ad6265SDimitry Andric                         NumSrcArgs, HasModifiers, Src0ModDPP, Src1ModDPP,
66fcaf7f86SDimitry Andric                         Src2ModDPP, 0/*HasOld*/>.ret;
677a6dacacSDimitry Andric  let InsDPP16 = getInsDPP16<VOPDstOperand<Src0DPP.RegClass>, Src0DPP, Src1DPP, Src2DPP,
6881ad6265SDimitry Andric                             NumSrcArgs, HasModifiers, Src0ModDPP, Src1ModDPP,
69fcaf7f86SDimitry Andric                             Src2ModDPP, 0/*HasOld*/>.ret;
707a6dacacSDimitry Andric  let InsDPP8 = getInsDPP8<VOPDstOperand<Src0DPP.RegClass>, Src0DPP, Src1DPP, Src2DPP,
7181ad6265SDimitry Andric                           NumSrcArgs, HasModifiers, Src0ModDPP, Src1ModDPP,
72fcaf7f86SDimitry Andric                           Src2ModDPP, 0/*HasOld*/>.ret;
7381ad6265SDimitry Andric
740b57cec5SDimitry Andric  // The destination for 32-bit encoding is implicit.
750b57cec5SDimitry Andric  let HasDst32 = 0;
76fe6060f1SDimitry Andric  // VOPC disallows dst_sel and dst_unused as they have no effect on destination
77fe6060f1SDimitry Andric  let EmitDstSel = 0;
780b57cec5SDimitry Andric  let Outs64 = (outs VOPDstS64orS32:$sdst);
7981ad6265SDimitry Andric  let OutsVOP3DPP = Outs64;
8081ad6265SDimitry Andric  let OutsVOP3DPP8 = Outs64;
81fcaf7f86SDimitry Andric  let InsVOP3DPP = getInsVOP3DPP<InsVOP3Base, Src0VOP3DPP, NumSrcArgs, 0/*HasOld*/>.ret;
82fcaf7f86SDimitry Andric  let InsVOP3DPP16 = getInsVOP3DPP16<InsVOP3Base, Src0VOP3DPP, NumSrcArgs, 0/*HasOld*/>.ret;
83fcaf7f86SDimitry Andric  let InsVOP3DPP8 = getInsVOP3DPP8<InsVOP3Base, Src0VOP3DPP, NumSrcArgs, 0/*HasOld*/>.ret;
840b57cec5SDimitry Andric  list<SchedReadWrite> Schedule = sched;
850b57cec5SDimitry Andric}
860b57cec5SDimitry Andric
87bdd1243dSDimitry Andricmulticlass VOPC_Profile_t16<list<SchedReadWrite> sched, ValueType vt0, ValueType vt1 = vt0> {
88bdd1243dSDimitry Andric  def NAME : VOPC_Profile<sched, vt0, vt1>;
89bdd1243dSDimitry Andric  def _t16 : VOPC_Profile<sched, vt0, vt1> {
90bdd1243dSDimitry Andric    let IsTrue16 = 1;
917a6dacacSDimitry Andric    let Src1RC32 = getVregSrcForVT<Src1VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
927a6dacacSDimitry Andric    let Src0DPP = getVregSrcForVT<Src0VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
937a6dacacSDimitry Andric    let Src1DPP = getVregSrcForVT<Src1VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
947a6dacacSDimitry Andric    let Src2DPP = getVregSrcForVT<Src2VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
95bdd1243dSDimitry Andric    let Src0ModDPP = getSrcModDPP_t16<Src0VT>.ret;
96bdd1243dSDimitry Andric    let Src1ModDPP = getSrcModDPP_t16<Src1VT>.ret;
97bdd1243dSDimitry Andric    let Src2ModDPP = getSrcModDPP_t16<Src2VT>.ret;
98bdd1243dSDimitry Andric  }
99bdd1243dSDimitry Andric}
100bdd1243dSDimitry Andric
1010b57cec5SDimitry Andricclass VOPC_NoSdst_Profile<list<SchedReadWrite> sched, ValueType vt0,
1020b57cec5SDimitry Andric                          ValueType vt1 = vt0> :
1030b57cec5SDimitry Andric  VOPC_Profile<sched, vt0, vt1> {
1040b57cec5SDimitry Andric  let Outs64 = (outs );
10581ad6265SDimitry Andric  let OutsVOP3DPP = Outs64;
10681ad6265SDimitry Andric  let OutsVOP3DPP8 = Outs64;
1070b57cec5SDimitry Andric  let OutsSDWA = (outs );
1080b57cec5SDimitry Andric  let InsSDWA = (ins Src0ModSDWA:$src0_modifiers, Src0SDWA:$src0,
1090b57cec5SDimitry Andric                     Src1ModSDWA:$src1_modifiers, Src1SDWA:$src1,
1100b57cec5SDimitry Andric                     src0_sel:$src0_sel, src1_sel:$src1_sel);
1117a6dacacSDimitry Andric  let AsmVOP3Base = !if(Src0VT.isFP, "$src0_modifiers, $src1_modifiers$clamp",
1120b57cec5SDimitry Andric                                     "$src0, $src1");
1130b57cec5SDimitry Andric  let AsmSDWA9 = "$src0_modifiers, $src1_modifiers $src0_sel $src1_sel";
1140b57cec5SDimitry Andric  let EmitDst = 0;
1150b57cec5SDimitry Andric}
1160b57cec5SDimitry Andric
117bdd1243dSDimitry Andricmulticlass VOPC_NoSdst_Profile_t16<list<SchedReadWrite> sched, ValueType vt0, ValueType vt1 = vt0> {
118bdd1243dSDimitry Andric  def NAME : VOPC_NoSdst_Profile<sched, vt0, vt1>;
119bdd1243dSDimitry Andric  def _t16 : VOPC_NoSdst_Profile<sched, vt0, vt1> {
120bdd1243dSDimitry Andric    let IsTrue16 = 1;
1217a6dacacSDimitry Andric    let Src1RC32 = getVregSrcForVT<Src1VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
1227a6dacacSDimitry Andric    let Src0DPP = getVregSrcForVT<Src0VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
1237a6dacacSDimitry Andric    let Src1DPP = getVregSrcForVT<Src1VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
1247a6dacacSDimitry Andric    let Src2DPP = getVregSrcForVT<Src2VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
125bdd1243dSDimitry Andric    let Src0ModDPP = getSrcModDPP_t16<Src0VT>.ret;
126bdd1243dSDimitry Andric    let Src1ModDPP = getSrcModDPP_t16<Src1VT>.ret;
127bdd1243dSDimitry Andric    let Src2ModDPP = getSrcModDPP_t16<Src2VT>.ret;
128bdd1243dSDimitry Andric  }
129bdd1243dSDimitry Andric}
130bdd1243dSDimitry Andric
1310b57cec5SDimitry Andricclass VOPC_Pseudo <string opName, VOPC_Profile P, list<dag> pattern=[],
1320b57cec5SDimitry Andric                   bit DefVcc = 1> :
1330b57cec5SDimitry Andric  InstSI<(outs), P.Ins32, "", pattern>,
1340b57cec5SDimitry Andric  VOP <opName>,
1350b57cec5SDimitry Andric  SIMCInstr<opName#"_e32", SIEncodingFamily.NONE> {
1360b57cec5SDimitry Andric
1370b57cec5SDimitry Andric  let isPseudo = 1;
1380b57cec5SDimitry Andric  let isCodeGenOnly = 1;
1390b57cec5SDimitry Andric  let UseNamedOperandTable = 1;
1400b57cec5SDimitry Andric
1410b57cec5SDimitry Andric  string Mnemonic = opName;
1420b57cec5SDimitry Andric  string AsmOperands = P.Asm32;
1430b57cec5SDimitry Andric
1440b57cec5SDimitry Andric  let Size = 4;
1450b57cec5SDimitry Andric  let mayLoad = 0;
1460b57cec5SDimitry Andric  let mayStore = 0;
1470b57cec5SDimitry Andric  let hasSideEffects = 0;
1480b57cec5SDimitry Andric
1497a6dacacSDimitry Andric  let ReadsModeReg = P.Src0VT.isFP;
1505ffd83dbSDimitry Andric
1510b57cec5SDimitry Andric  let VALU = 1;
1520b57cec5SDimitry Andric  let VOPC = 1;
1535ffd83dbSDimitry Andric  let Uses = !if(ReadsModeReg, [MODE, EXEC], [EXEC]);
1540b57cec5SDimitry Andric  let Defs = !if(DefVcc, [VCC], []);
1550b57cec5SDimitry Andric
1560b57cec5SDimitry Andric  VOPProfile Pfl = P;
1570b57cec5SDimitry Andric}
1580b57cec5SDimitry Andric
15981ad6265SDimitry Andricclass VOPC_Real <VOPC_Pseudo ps, int EncodingFamily, string asm_name = ps.PseudoInstr> :
16081ad6265SDimitry Andric  InstSI <ps.OutOperandList, ps.InOperandList, asm_name # " " # ps.AsmOperands, []>,
1610b57cec5SDimitry Andric  SIMCInstr <ps.PseudoInstr, EncodingFamily> {
1620b57cec5SDimitry Andric
163fe6060f1SDimitry Andric  let VALU = 1;
164fe6060f1SDimitry Andric  let VOPC = 1;
1650b57cec5SDimitry Andric  let isPseudo = 0;
1660b57cec5SDimitry Andric  let isCodeGenOnly = 0;
1670b57cec5SDimitry Andric
1680b57cec5SDimitry Andric  let Constraints     = ps.Constraints;
1690b57cec5SDimitry Andric  let DisableEncoding = ps.DisableEncoding;
1700b57cec5SDimitry Andric
1710b57cec5SDimitry Andric  // copy relevant pseudo op flags
1720b57cec5SDimitry Andric  let SubtargetPredicate = ps.SubtargetPredicate;
1730b57cec5SDimitry Andric  let AsmMatchConverter  = ps.AsmMatchConverter;
1740b57cec5SDimitry Andric  let Constraints        = ps.Constraints;
1750b57cec5SDimitry Andric  let DisableEncoding    = ps.DisableEncoding;
1760b57cec5SDimitry Andric  let TSFlags            = ps.TSFlags;
1770b57cec5SDimitry Andric  let UseNamedOperandTable = ps.UseNamedOperandTable;
1780b57cec5SDimitry Andric  let Uses                 = ps.Uses;
1790b57cec5SDimitry Andric  let Defs                 = ps.Defs;
180fe6060f1SDimitry Andric  let SchedRW              = ps.SchedRW;
181fe6060f1SDimitry Andric  let mayLoad              = ps.mayLoad;
182fe6060f1SDimitry Andric  let mayStore             = ps.mayStore;
1830b57cec5SDimitry Andric}
1840b57cec5SDimitry Andric
1850b57cec5SDimitry Andricclass VOPC_SDWA_Pseudo <string OpName, VOPProfile P, list<dag> pattern=[]> :
1860b57cec5SDimitry Andric  VOP_SDWA_Pseudo <OpName, P, pattern> {
1870b57cec5SDimitry Andric  let AsmMatchConverter = "cvtSdwaVOPC";
1880b57cec5SDimitry Andric}
1890b57cec5SDimitry Andric
1900b57cec5SDimitry Andric// This class is used only with VOPC instructions. Use $sdst for out operand
1910b57cec5SDimitry Andricclass VOPCInstAlias <VOP3_Pseudo ps, Instruction inst,
19281ad6265SDimitry Andric                     string Asm32 = ps.Pfl.Asm32, string real_name = ps.OpName,
19381ad6265SDimitry Andric                     VOPProfile p = ps.Pfl> :
19481ad6265SDimitry Andric  InstAlias <real_name#" "#Asm32, (inst)>, PredicateControl {
1950b57cec5SDimitry Andric
1960b57cec5SDimitry Andric  field bit isCompare;
1970b57cec5SDimitry Andric  field bit isCommutable;
1980b57cec5SDimitry Andric
1990b57cec5SDimitry Andric  let ResultInst =
2000b57cec5SDimitry Andric    !if (p.HasDst32,
2010b57cec5SDimitry Andric      !if (!eq(p.NumSrcArgs, 0),
2020b57cec5SDimitry Andric        // 1 dst, 0 src
2030b57cec5SDimitry Andric        (inst p.DstRC:$sdst),
2040b57cec5SDimitry Andric      !if (!eq(p.NumSrcArgs, 1),
2050b57cec5SDimitry Andric        // 1 dst, 1 src
2060b57cec5SDimitry Andric        (inst p.DstRC:$sdst, p.Src0RC32:$src0),
2070b57cec5SDimitry Andric      !if (!eq(p.NumSrcArgs, 2),
2080b57cec5SDimitry Andric        // 1 dst, 2 src
2090b57cec5SDimitry Andric        (inst p.DstRC:$sdst, p.Src0RC32:$src0, p.Src1RC32:$src1),
2100b57cec5SDimitry Andric      // else - unreachable
2110b57cec5SDimitry Andric        (inst)))),
2120b57cec5SDimitry Andric    // else
2130b57cec5SDimitry Andric      !if (!eq(p.NumSrcArgs, 2),
2140b57cec5SDimitry Andric        // 0 dst, 2 src
2150b57cec5SDimitry Andric        (inst p.Src0RC32:$src0, p.Src1RC32:$src1),
2160b57cec5SDimitry Andric      !if (!eq(p.NumSrcArgs, 1),
2170b57cec5SDimitry Andric        // 0 dst, 1 src
2180b57cec5SDimitry Andric        (inst p.Src0RC32:$src1),
2190b57cec5SDimitry Andric      // else
2200b57cec5SDimitry Andric        // 0 dst, 0 src
2210b57cec5SDimitry Andric        (inst))));
2220b57cec5SDimitry Andric
2230b57cec5SDimitry Andric  let AsmVariantName = AMDGPUAsmVariants.Default;
2240b57cec5SDimitry Andric  let SubtargetPredicate = AssemblerPredicate;
225*0fca6ea1SDimitry Andric
226*0fca6ea1SDimitry Andric  string DecoderNamespace; // dummy
2270b57cec5SDimitry Andric}
2280b57cec5SDimitry Andric
229bdd1243dSDimitry Andricmulticlass VOPCInstAliases <string old_name, string Arch, string real_name = old_name, string mnemonic_from = real_name> {
23081ad6265SDimitry Andric  def : VOPCInstAlias <!cast<VOP3_Pseudo>(old_name#"_e64"),
23181ad6265SDimitry Andric                       !cast<Instruction>(real_name#"_e32_"#Arch),
23281ad6265SDimitry Andric                       !cast<VOP3_Pseudo>(old_name#"_e64").Pfl.Asm32,
233bdd1243dSDimitry Andric                       mnemonic_from>;
2340b57cec5SDimitry Andric  let WaveSizePredicate = isWave32 in {
23581ad6265SDimitry Andric    def : VOPCInstAlias <!cast<VOP3_Pseudo>(old_name#"_e64"),
23681ad6265SDimitry Andric                         !cast<Instruction>(real_name#"_e32_"#Arch),
23781ad6265SDimitry Andric                         "vcc_lo, "#!cast<VOP3_Pseudo>(old_name#"_e64").Pfl.Asm32,
238bdd1243dSDimitry Andric                         mnemonic_from>;
2390b57cec5SDimitry Andric  }
2400b57cec5SDimitry Andric  let WaveSizePredicate = isWave64 in {
24181ad6265SDimitry Andric    def : VOPCInstAlias <!cast<VOP3_Pseudo>(old_name#"_e64"),
24281ad6265SDimitry Andric                         !cast<Instruction>(real_name#"_e32_"#Arch),
24381ad6265SDimitry Andric                         "vcc, "#!cast<VOP3_Pseudo>(old_name#"_e64").Pfl.Asm32,
244bdd1243dSDimitry Andric                         mnemonic_from>;
2450b57cec5SDimitry Andric  }
2460b57cec5SDimitry Andric}
2470b57cec5SDimitry Andric
248bdd1243dSDimitry Andricmulticlass VOPCXInstAliases <string old_name, string Arch, string real_name = old_name, string mnemonic_from = real_name> {
24981ad6265SDimitry Andric  def : VOPCInstAlias <!cast<VOP3_Pseudo>(old_name#"_e64"),
25081ad6265SDimitry Andric                       !cast<Instruction>(real_name#"_e32_"#Arch),
25181ad6265SDimitry Andric                       !cast<VOP3_Pseudo>(old_name#"_e64").Pfl.Asm32,
252bdd1243dSDimitry Andric                       mnemonic_from>;
2530b57cec5SDimitry Andric}
2540b57cec5SDimitry Andric
2558bcb0991SDimitry Andricclass getVOPCPat64 <SDPatternOperator cond, VOPProfile P> : LetDummies {
2560b57cec5SDimitry Andric  list<dag> ret = !if(P.HasModifiers,
2570b57cec5SDimitry Andric      [(set i1:$sdst,
2580b57cec5SDimitry Andric        (setcc (P.Src0VT
2590b57cec5SDimitry Andric                  !if(P.HasOMod,
2600b57cec5SDimitry Andric                    (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, i1:$clamp, i32:$omod),
2610b57cec5SDimitry Andric                    (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, i1:$clamp))),
2620b57cec5SDimitry Andric               (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers)),
2630b57cec5SDimitry Andric               cond))],
2640b57cec5SDimitry Andric      [(set i1:$sdst, (setcc P.Src0VT:$src0, P.Src1VT:$src1, cond))]);
2650b57cec5SDimitry Andric}
2660b57cec5SDimitry Andric
2670b57cec5SDimitry Andricclass VCMPXNoSDstTable <bit has_sdst, string Name> {
2680b57cec5SDimitry Andric  bit HasSDst = has_sdst;
2690b57cec5SDimitry Andric  string NoSDstOp = Name;
2700b57cec5SDimitry Andric}
2710b57cec5SDimitry Andric
27281ad6265SDimitry Andricclass VCMPVCMPXTable <string Name> {
27381ad6265SDimitry Andric  bit IsVCMPX = 0;
27481ad6265SDimitry Andric  string VCMPOp = Name;
27581ad6265SDimitry Andric}
27681ad6265SDimitry Andric
2770b57cec5SDimitry Andricmulticlass VOPC_Pseudos <string opName,
2780b57cec5SDimitry Andric                         VOPC_Profile P,
2798bcb0991SDimitry Andric                         SDPatternOperator cond = COND_NULL,
2800b57cec5SDimitry Andric                         string revOp = opName,
2810b57cec5SDimitry Andric                         bit DefExec = 0> {
2820b57cec5SDimitry Andric
2830b57cec5SDimitry Andric  def _e32 : VOPC_Pseudo <opName, P>,
2840b57cec5SDimitry Andric             Commutable_REV<revOp#"_e32", !eq(revOp, opName)>,
28581ad6265SDimitry Andric             VCMPXNoSDstTable<1, opName#"_e32">,
28681ad6265SDimitry Andric             VCMPVCMPXTable<opName#"_e32"> {
2870b57cec5SDimitry Andric    let Defs = !if(DefExec, [VCC, EXEC], [VCC]);
2880b57cec5SDimitry Andric    let SchedRW = P.Schedule;
2890b57cec5SDimitry Andric    let isConvergent = DefExec;
2900b57cec5SDimitry Andric    let isCompare = 1;
2910b57cec5SDimitry Andric    let isCommutable = 1;
2920b57cec5SDimitry Andric  }
2930b57cec5SDimitry Andric
2940b57cec5SDimitry Andric  def _e64 : VOP3_Pseudo<opName, P, getVOPCPat64<cond, P>.ret>,
2950b57cec5SDimitry Andric    Commutable_REV<revOp#"_e64", !eq(revOp, opName)>,
29681ad6265SDimitry Andric    VCMPXNoSDstTable<1, opName#"_e64">,
29781ad6265SDimitry Andric    VCMPVCMPXTable<opName#"_e64"> {
2980b57cec5SDimitry Andric    let Defs = !if(DefExec, [EXEC], []);
2990b57cec5SDimitry Andric    let SchedRW = P.Schedule;
3000b57cec5SDimitry Andric    let isCompare = 1;
3010b57cec5SDimitry Andric    let isCommutable = 1;
3020b57cec5SDimitry Andric  }
3030b57cec5SDimitry Andric
30406c3fb27SDimitry Andric  if P.HasExtSDWA then
3050b57cec5SDimitry Andric  def _sdwa : VOPC_SDWA_Pseudo <opName, P> {
306e8d8bef9SDimitry Andric    let Defs = !if(DefExec, [EXEC], []);
3070b57cec5SDimitry Andric    let SchedRW = P.Schedule;
3080b57cec5SDimitry Andric    let isConvergent = DefExec;
3090b57cec5SDimitry Andric    let isCompare = 1;
3100b57cec5SDimitry Andric  }
31181ad6265SDimitry Andric
31281ad6265SDimitry Andric  let SubtargetPredicate = isGFX11Plus in {
31381ad6265SDimitry Andric  if P.HasExtDPP then
31481ad6265SDimitry Andric      def _e32_dpp : VOP_DPP_Pseudo<opName, P> {
31581ad6265SDimitry Andric        let Defs = !if(DefExec, [VCC, EXEC], [VCC]);
31681ad6265SDimitry Andric        let SchedRW = P.Schedule;
31781ad6265SDimitry Andric        let isConvergent = DefExec;
31881ad6265SDimitry Andric        let isCompare = 1;
31981ad6265SDimitry Andric        let VOPC = 1;
32081ad6265SDimitry Andric        let Constraints = "";
32181ad6265SDimitry Andric      }
32281ad6265SDimitry Andric  if P.HasExtVOP3DPP then
32381ad6265SDimitry Andric      def _e64_dpp : VOP3_DPP_Pseudo<opName, P> {
32481ad6265SDimitry Andric        let Defs = !if(DefExec, [EXEC], []);
32581ad6265SDimitry Andric        let SchedRW = P.Schedule;
32681ad6265SDimitry Andric        let isCompare = 1;
327fcaf7f86SDimitry Andric        let Constraints = "";
32881ad6265SDimitry Andric    }
32981ad6265SDimitry Andric  } // end SubtargetPredicate = isGFX11Plus
33081ad6265SDimitry Andric
3310b57cec5SDimitry Andric}
3320b57cec5SDimitry Andric
3330b57cec5SDimitry Andriclet SubtargetPredicate = HasSdstCMPX in {
3340b57cec5SDimitry Andricmulticlass VOPCX_Pseudos <string opName,
3350b57cec5SDimitry Andric                          VOPC_Profile P, VOPC_Profile P_NoSDst,
3368bcb0991SDimitry Andric                          SDPatternOperator cond = COND_NULL,
3370b57cec5SDimitry Andric                          string revOp = opName> :
3380b57cec5SDimitry Andric           VOPC_Pseudos <opName, P, cond, revOp, 1> {
3390b57cec5SDimitry Andric
3400b57cec5SDimitry Andric  def _nosdst_e32 : VOPC_Pseudo <opName#"_nosdst", P_NoSDst, [], 0>,
3410b57cec5SDimitry Andric             Commutable_REV<revOp#"_nosdst_e32", !eq(revOp, opName)>,
34281ad6265SDimitry Andric             VCMPXNoSDstTable<0, opName#"_e32">,
34381ad6265SDimitry Andric             VCMPVCMPXTable<!subst("v_cmpx", "v_cmp", opName#"_e32")> {
3440b57cec5SDimitry Andric    let Defs = [EXEC];
3450b57cec5SDimitry Andric    let SchedRW = P_NoSDst.Schedule;
3460b57cec5SDimitry Andric    let isConvergent = 1;
3470b57cec5SDimitry Andric    let isCompare = 1;
3480b57cec5SDimitry Andric    let isCommutable = 1;
3490b57cec5SDimitry Andric    let SubtargetPredicate = HasNoSdstCMPX;
35081ad6265SDimitry Andric    let IsVCMPX = 1;
3510b57cec5SDimitry Andric  }
3520b57cec5SDimitry Andric
3530b57cec5SDimitry Andric  def _nosdst_e64 : VOP3_Pseudo<opName#"_nosdst", P_NoSDst>,
3540b57cec5SDimitry Andric    Commutable_REV<revOp#"_nosdst_e64", !eq(revOp, opName)>,
35581ad6265SDimitry Andric    VCMPXNoSDstTable<0, opName#"_e64">,
35681ad6265SDimitry Andric    VCMPVCMPXTable<!subst("v_cmpx", "v_cmp", opName#"_e64")> {
3570b57cec5SDimitry Andric    let Defs = [EXEC];
3580b57cec5SDimitry Andric    let SchedRW = P_NoSDst.Schedule;
3590b57cec5SDimitry Andric    let isCompare = 1;
3600b57cec5SDimitry Andric    let isCommutable = 1;
3610b57cec5SDimitry Andric    let SubtargetPredicate = HasNoSdstCMPX;
36281ad6265SDimitry Andric    let IsVCMPX = 1;
3630b57cec5SDimitry Andric  }
3640b57cec5SDimitry Andric
36506c3fb27SDimitry Andric  if P_NoSDst.HasExtSDWA then
3660b57cec5SDimitry Andric  def _nosdst_sdwa : VOPC_SDWA_Pseudo <opName#"_nosdst", P_NoSDst> {
3670b57cec5SDimitry Andric    let Defs = [EXEC];
3680b57cec5SDimitry Andric    let SchedRW = P_NoSDst.Schedule;
3690b57cec5SDimitry Andric    let isConvergent = 1;
3700b57cec5SDimitry Andric    let isCompare = 1;
3710b57cec5SDimitry Andric    let SubtargetPredicate = HasNoSdstCMPX;
3720b57cec5SDimitry Andric  }
37381ad6265SDimitry Andric
37481ad6265SDimitry Andric  let SubtargetPredicate = isGFX11Plus in {
37581ad6265SDimitry Andric  if P.HasExtDPP then
37681ad6265SDimitry Andric      def _nosdst_e32_dpp : VOP_DPP_Pseudo<opName#"_nosdst", P_NoSDst> {
37781ad6265SDimitry Andric        let Defs = [EXEC];
37881ad6265SDimitry Andric        let SchedRW = P_NoSDst.Schedule;
37981ad6265SDimitry Andric        let isConvergent = 1;
38081ad6265SDimitry Andric        let isCompare = 1;
38181ad6265SDimitry Andric        let VOPC = 1;
38281ad6265SDimitry Andric        let Constraints = "";
38381ad6265SDimitry Andric      }
38481ad6265SDimitry Andric  if P.HasExtVOP3DPP then
38581ad6265SDimitry Andric      def _nosdst_e64_dpp : VOP3_DPP_Pseudo<opName#"_nosdst", P_NoSDst> {
38681ad6265SDimitry Andric        let Defs = [EXEC];
38781ad6265SDimitry Andric        let SchedRW = P_NoSDst.Schedule;
38881ad6265SDimitry Andric        let isCompare = 1;
38981ad6265SDimitry Andric        let Constraints = "";
39081ad6265SDimitry Andric    }
39181ad6265SDimitry Andric  } // end SubtargetPredicate = isGFX11Plus
3920b57cec5SDimitry Andric}
3930b57cec5SDimitry Andric} // End SubtargetPredicate = HasSdstCMPX
3940b57cec5SDimitry Andric
395bdd1243dSDimitry Andricdefm VOPC_I1_F16_F16 : VOPC_Profile_t16<[Write32Bit], f16>;
3960b57cec5SDimitry Andricdef VOPC_I1_F32_F32 : VOPC_Profile<[Write32Bit], f32>;
3970b57cec5SDimitry Andricdef VOPC_I1_F64_F64 : VOPC_Profile<[WriteDoubleAdd], f64>;
398bdd1243dSDimitry Andricdefm VOPC_I1_I16_I16 : VOPC_Profile_t16<[Write32Bit], i16>;
3990b57cec5SDimitry Andricdef VOPC_I1_I32_I32 : VOPC_Profile<[Write32Bit], i32>;
4000b57cec5SDimitry Andricdef VOPC_I1_I64_I64 : VOPC_Profile<[Write64Bit], i64>;
4010b57cec5SDimitry Andric
402bdd1243dSDimitry Andricdefm VOPC_F16_F16 : VOPC_NoSdst_Profile_t16<[Write32Bit], f16>;
4030b57cec5SDimitry Andricdef VOPC_F32_F32 : VOPC_NoSdst_Profile<[Write32Bit], f32>;
4040b57cec5SDimitry Andricdef VOPC_F64_F64 : VOPC_NoSdst_Profile<[Write64Bit], f64>;
405bdd1243dSDimitry Andricdefm VOPC_I16_I16 : VOPC_NoSdst_Profile_t16<[Write32Bit], i16>;
4060b57cec5SDimitry Andricdef VOPC_I32_I32 : VOPC_NoSdst_Profile<[Write32Bit], i32>;
4070b57cec5SDimitry Andricdef VOPC_I64_I64 : VOPC_NoSdst_Profile<[Write64Bit], i64>;
4080b57cec5SDimitry Andric
4098bcb0991SDimitry Andricmulticlass VOPC_F16 <string opName, SDPatternOperator cond = COND_NULL,
410bdd1243dSDimitry Andric                     string revOp = opName> {
411*0fca6ea1SDimitry Andric  let OtherPredicates = [Has16BitInsts], True16Predicate = NotHasTrue16BitInsts in {
412bdd1243dSDimitry Andric    defm NAME : VOPC_Pseudos <opName, VOPC_I1_F16_F16, cond, revOp, 0>;
413bdd1243dSDimitry Andric  }
414bdd1243dSDimitry Andric  let OtherPredicates = [HasTrue16BitInsts] in {
415bdd1243dSDimitry Andric    defm _t16 : VOPC_Pseudos <opName#"_t16", VOPC_I1_F16_F16_t16, cond, revOp#"_t16", 0>;
416bdd1243dSDimitry Andric  }
417bdd1243dSDimitry Andric}
4180b57cec5SDimitry Andric
4198bcb0991SDimitry Andricmulticlass VOPC_F32 <string opName, SDPatternOperator cond = COND_NULL, string revOp = opName> :
4200b57cec5SDimitry Andric  VOPC_Pseudos <opName, VOPC_I1_F32_F32, cond, revOp, 0>;
4210b57cec5SDimitry Andric
4228bcb0991SDimitry Andricmulticlass VOPC_F64 <string opName, SDPatternOperator cond = COND_NULL, string revOp = opName> :
4230b57cec5SDimitry Andric  VOPC_Pseudos <opName, VOPC_I1_F64_F64, cond, revOp, 0>;
4240b57cec5SDimitry Andric
425bdd1243dSDimitry Andricmulticlass VOPC_I16 <string opName, SDPatternOperator cond = COND_NULL,
426bdd1243dSDimitry Andric                     string revOp = opName> {
427*0fca6ea1SDimitry Andric  let OtherPredicates = [Has16BitInsts], True16Predicate = NotHasTrue16BitInsts in {
428bdd1243dSDimitry Andric    defm NAME : VOPC_Pseudos <opName, VOPC_I1_I16_I16, cond, revOp, 0>;
429bdd1243dSDimitry Andric  }
430bdd1243dSDimitry Andric  let OtherPredicates = [HasTrue16BitInsts] in {
431bdd1243dSDimitry Andric    defm _t16 : VOPC_Pseudos <opName#"_t16", VOPC_I1_I16_I16_t16, cond, revOp#"_t16", 0>;
432bdd1243dSDimitry Andric  }
433bdd1243dSDimitry Andric}
4340b57cec5SDimitry Andric
4358bcb0991SDimitry Andricmulticlass VOPC_I32 <string opName, SDPatternOperator cond = COND_NULL, string revOp = opName> :
4360b57cec5SDimitry Andric  VOPC_Pseudos <opName, VOPC_I1_I32_I32, cond, revOp, 0>;
4370b57cec5SDimitry Andric
438*0fca6ea1SDimitry Andriclet IsInvalidSingleUseConsumer = 1 in {
4398bcb0991SDimitry Andric  multiclass VOPC_I64 <string opName, SDPatternOperator cond = COND_NULL, string revOp = opName> :
4400b57cec5SDimitry Andric    VOPC_Pseudos <opName, VOPC_I1_I64_I64, cond, revOp, 0>;
441*0fca6ea1SDimitry Andric}
4420b57cec5SDimitry Andric
443bdd1243dSDimitry Andricmulticlass VOPCX_F16<string opName, string revOp = opName> {
444*0fca6ea1SDimitry Andric  let OtherPredicates = [Has16BitInsts], True16Predicate = NotHasTrue16BitInsts in {
445bdd1243dSDimitry Andric    defm NAME : VOPCX_Pseudos <opName, VOPC_I1_F16_F16, VOPC_F16_F16, COND_NULL, revOp>;
446bdd1243dSDimitry Andric  }
447bdd1243dSDimitry Andric  let OtherPredicates = [HasTrue16BitInsts] in {
448bdd1243dSDimitry Andric    defm _t16 : VOPCX_Pseudos <opName#"_t16", VOPC_I1_F16_F16_t16, VOPC_F16_F16_t16, COND_NULL, revOp#"_t16">;
449bdd1243dSDimitry Andric  }
450bdd1243dSDimitry Andric}
4510b57cec5SDimitry Andric
4520b57cec5SDimitry Andricmulticlass VOPCX_F32 <string opName, string revOp = opName> :
4530b57cec5SDimitry Andric  VOPCX_Pseudos <opName, VOPC_I1_F32_F32, VOPC_F32_F32, COND_NULL, revOp>;
4540b57cec5SDimitry Andric
4550b57cec5SDimitry Andricmulticlass VOPCX_F64 <string opName, string revOp = opName> :
4560b57cec5SDimitry Andric  VOPCX_Pseudos <opName, VOPC_I1_F64_F64, VOPC_F64_F64, COND_NULL, revOp>;
4570b57cec5SDimitry Andric
458bdd1243dSDimitry Andricmulticlass VOPCX_I16<string opName, string revOp = opName> {
459*0fca6ea1SDimitry Andric  let OtherPredicates = [Has16BitInsts], True16Predicate = NotHasTrue16BitInsts in {
460bdd1243dSDimitry Andric    defm NAME : VOPCX_Pseudos <opName, VOPC_I1_I16_I16, VOPC_I16_I16, COND_NULL, revOp>;
461bdd1243dSDimitry Andric  }
462bdd1243dSDimitry Andric  let OtherPredicates = [HasTrue16BitInsts] in {
463bdd1243dSDimitry Andric    defm _t16 : VOPCX_Pseudos <opName#"_t16", VOPC_I1_I16_I16_t16, VOPC_I16_I16_t16, COND_NULL, revOp#"_t16">;
464bdd1243dSDimitry Andric  }
465bdd1243dSDimitry Andric}
4660b57cec5SDimitry Andric
4670b57cec5SDimitry Andricmulticlass VOPCX_I32 <string opName, string revOp = opName> :
4680b57cec5SDimitry Andric  VOPCX_Pseudos <opName, VOPC_I1_I32_I32, VOPC_I32_I32, COND_NULL, revOp>;
4690b57cec5SDimitry Andric
470*0fca6ea1SDimitry Andriclet IsInvalidSingleUseConsumer = 1 in {
4710b57cec5SDimitry Andric  multiclass VOPCX_I64 <string opName, string revOp = opName> :
4720b57cec5SDimitry Andric    VOPCX_Pseudos <opName, VOPC_I1_I64_I64, VOPC_I64_I64, COND_NULL, revOp>;
473*0fca6ea1SDimitry Andric}
4740b57cec5SDimitry Andric
4750b57cec5SDimitry Andric
4760b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4770b57cec5SDimitry Andric// Compare instructions
4780b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
4790b57cec5SDimitry Andric
4800b57cec5SDimitry Andricdefm V_CMP_F_F32 : VOPC_F32 <"v_cmp_f_f32">;
4810b57cec5SDimitry Andricdefm V_CMP_LT_F32 : VOPC_F32 <"v_cmp_lt_f32", COND_OLT, "v_cmp_gt_f32">;
4820b57cec5SDimitry Andricdefm V_CMP_EQ_F32 : VOPC_F32 <"v_cmp_eq_f32", COND_OEQ>;
4830b57cec5SDimitry Andricdefm V_CMP_LE_F32 : VOPC_F32 <"v_cmp_le_f32", COND_OLE, "v_cmp_ge_f32">;
4840b57cec5SDimitry Andricdefm V_CMP_GT_F32 : VOPC_F32 <"v_cmp_gt_f32", COND_OGT>;
4850b57cec5SDimitry Andricdefm V_CMP_LG_F32 : VOPC_F32 <"v_cmp_lg_f32", COND_ONE>;
4860b57cec5SDimitry Andricdefm V_CMP_GE_F32 : VOPC_F32 <"v_cmp_ge_f32", COND_OGE>;
4870b57cec5SDimitry Andricdefm V_CMP_O_F32 : VOPC_F32 <"v_cmp_o_f32", COND_O>;
4880b57cec5SDimitry Andricdefm V_CMP_U_F32 : VOPC_F32 <"v_cmp_u_f32", COND_UO>;
4890b57cec5SDimitry Andricdefm V_CMP_NGE_F32 : VOPC_F32 <"v_cmp_nge_f32",  COND_ULT, "v_cmp_nle_f32">;
4900b57cec5SDimitry Andricdefm V_CMP_NLG_F32 : VOPC_F32 <"v_cmp_nlg_f32", COND_UEQ>;
4910b57cec5SDimitry Andricdefm V_CMP_NGT_F32 : VOPC_F32 <"v_cmp_ngt_f32", COND_ULE, "v_cmp_nlt_f32">;
4920b57cec5SDimitry Andricdefm V_CMP_NLE_F32 : VOPC_F32 <"v_cmp_nle_f32", COND_UGT>;
4930b57cec5SDimitry Andricdefm V_CMP_NEQ_F32 : VOPC_F32 <"v_cmp_neq_f32", COND_UNE>;
4940b57cec5SDimitry Andricdefm V_CMP_NLT_F32 : VOPC_F32 <"v_cmp_nlt_f32", COND_UGE>;
4950b57cec5SDimitry Andricdefm V_CMP_TRU_F32 : VOPC_F32 <"v_cmp_tru_f32">;
4960b57cec5SDimitry Andric
4970b57cec5SDimitry Andricdefm V_CMPX_F_F32 : VOPCX_F32 <"v_cmpx_f_f32">;
4980b57cec5SDimitry Andricdefm V_CMPX_LT_F32 : VOPCX_F32 <"v_cmpx_lt_f32", "v_cmpx_gt_f32">;
4990b57cec5SDimitry Andricdefm V_CMPX_EQ_F32 : VOPCX_F32 <"v_cmpx_eq_f32">;
5000b57cec5SDimitry Andricdefm V_CMPX_LE_F32 : VOPCX_F32 <"v_cmpx_le_f32", "v_cmpx_ge_f32">;
5010b57cec5SDimitry Andricdefm V_CMPX_GT_F32 : VOPCX_F32 <"v_cmpx_gt_f32">;
5020b57cec5SDimitry Andricdefm V_CMPX_LG_F32 : VOPCX_F32 <"v_cmpx_lg_f32">;
5030b57cec5SDimitry Andricdefm V_CMPX_GE_F32 : VOPCX_F32 <"v_cmpx_ge_f32">;
5040b57cec5SDimitry Andricdefm V_CMPX_O_F32 : VOPCX_F32 <"v_cmpx_o_f32">;
5050b57cec5SDimitry Andricdefm V_CMPX_U_F32 : VOPCX_F32 <"v_cmpx_u_f32">;
5060b57cec5SDimitry Andricdefm V_CMPX_NGE_F32 : VOPCX_F32 <"v_cmpx_nge_f32", "v_cmpx_nle_f32">;
5070b57cec5SDimitry Andricdefm V_CMPX_NLG_F32 : VOPCX_F32 <"v_cmpx_nlg_f32">;
5080b57cec5SDimitry Andricdefm V_CMPX_NGT_F32 : VOPCX_F32 <"v_cmpx_ngt_f32", "v_cmpx_nlt_f32">;
5090b57cec5SDimitry Andricdefm V_CMPX_NLE_F32 : VOPCX_F32 <"v_cmpx_nle_f32">;
5100b57cec5SDimitry Andricdefm V_CMPX_NEQ_F32 : VOPCX_F32 <"v_cmpx_neq_f32">;
5110b57cec5SDimitry Andricdefm V_CMPX_NLT_F32 : VOPCX_F32 <"v_cmpx_nlt_f32">;
5120b57cec5SDimitry Andricdefm V_CMPX_TRU_F32 : VOPCX_F32 <"v_cmpx_tru_f32">;
5130b57cec5SDimitry Andric
5140b57cec5SDimitry Andricdefm V_CMP_F_F64 : VOPC_F64 <"v_cmp_f_f64">;
5150b57cec5SDimitry Andricdefm V_CMP_LT_F64 : VOPC_F64 <"v_cmp_lt_f64", COND_OLT, "v_cmp_gt_f64">;
5160b57cec5SDimitry Andricdefm V_CMP_EQ_F64 : VOPC_F64 <"v_cmp_eq_f64", COND_OEQ>;
5170b57cec5SDimitry Andricdefm V_CMP_LE_F64 : VOPC_F64 <"v_cmp_le_f64", COND_OLE, "v_cmp_ge_f64">;
5180b57cec5SDimitry Andricdefm V_CMP_GT_F64 : VOPC_F64 <"v_cmp_gt_f64", COND_OGT>;
5190b57cec5SDimitry Andricdefm V_CMP_LG_F64 : VOPC_F64 <"v_cmp_lg_f64", COND_ONE>;
5200b57cec5SDimitry Andricdefm V_CMP_GE_F64 : VOPC_F64 <"v_cmp_ge_f64", COND_OGE>;
5210b57cec5SDimitry Andricdefm V_CMP_O_F64 : VOPC_F64 <"v_cmp_o_f64", COND_O>;
5220b57cec5SDimitry Andricdefm V_CMP_U_F64 : VOPC_F64 <"v_cmp_u_f64", COND_UO>;
5230b57cec5SDimitry Andricdefm V_CMP_NGE_F64 : VOPC_F64 <"v_cmp_nge_f64", COND_ULT, "v_cmp_nle_f64">;
5240b57cec5SDimitry Andricdefm V_CMP_NLG_F64 : VOPC_F64 <"v_cmp_nlg_f64", COND_UEQ>;
5250b57cec5SDimitry Andricdefm V_CMP_NGT_F64 : VOPC_F64 <"v_cmp_ngt_f64", COND_ULE, "v_cmp_nlt_f64">;
5260b57cec5SDimitry Andricdefm V_CMP_NLE_F64 : VOPC_F64 <"v_cmp_nle_f64", COND_UGT>;
5270b57cec5SDimitry Andricdefm V_CMP_NEQ_F64 : VOPC_F64 <"v_cmp_neq_f64", COND_UNE>;
5280b57cec5SDimitry Andricdefm V_CMP_NLT_F64 : VOPC_F64 <"v_cmp_nlt_f64", COND_UGE>;
5290b57cec5SDimitry Andricdefm V_CMP_TRU_F64 : VOPC_F64 <"v_cmp_tru_f64">;
5300b57cec5SDimitry Andric
5310b57cec5SDimitry Andricdefm V_CMPX_F_F64 : VOPCX_F64 <"v_cmpx_f_f64">;
5320b57cec5SDimitry Andricdefm V_CMPX_LT_F64 : VOPCX_F64 <"v_cmpx_lt_f64", "v_cmpx_gt_f64">;
5330b57cec5SDimitry Andricdefm V_CMPX_EQ_F64 : VOPCX_F64 <"v_cmpx_eq_f64">;
5340b57cec5SDimitry Andricdefm V_CMPX_LE_F64 : VOPCX_F64 <"v_cmpx_le_f64", "v_cmpx_ge_f64">;
5350b57cec5SDimitry Andricdefm V_CMPX_GT_F64 : VOPCX_F64 <"v_cmpx_gt_f64">;
5360b57cec5SDimitry Andricdefm V_CMPX_LG_F64 : VOPCX_F64 <"v_cmpx_lg_f64">;
5370b57cec5SDimitry Andricdefm V_CMPX_GE_F64 : VOPCX_F64 <"v_cmpx_ge_f64">;
5380b57cec5SDimitry Andricdefm V_CMPX_O_F64 : VOPCX_F64 <"v_cmpx_o_f64">;
5390b57cec5SDimitry Andricdefm V_CMPX_U_F64 : VOPCX_F64 <"v_cmpx_u_f64">;
5400b57cec5SDimitry Andricdefm V_CMPX_NGE_F64 : VOPCX_F64 <"v_cmpx_nge_f64", "v_cmpx_nle_f64">;
5410b57cec5SDimitry Andricdefm V_CMPX_NLG_F64 : VOPCX_F64 <"v_cmpx_nlg_f64">;
5420b57cec5SDimitry Andricdefm V_CMPX_NGT_F64 : VOPCX_F64 <"v_cmpx_ngt_f64", "v_cmpx_nlt_f64">;
5430b57cec5SDimitry Andricdefm V_CMPX_NLE_F64 : VOPCX_F64 <"v_cmpx_nle_f64">;
5440b57cec5SDimitry Andricdefm V_CMPX_NEQ_F64 : VOPCX_F64 <"v_cmpx_neq_f64">;
5450b57cec5SDimitry Andricdefm V_CMPX_NLT_F64 : VOPCX_F64 <"v_cmpx_nlt_f64">;
5460b57cec5SDimitry Andricdefm V_CMPX_TRU_F64 : VOPCX_F64 <"v_cmpx_tru_f64">;
5470b57cec5SDimitry Andric
5480b57cec5SDimitry Andriclet SubtargetPredicate = isGFX6GFX7 in {
5490b57cec5SDimitry Andric
5500b57cec5SDimitry Andricdefm V_CMPS_F_F32 : VOPC_F32 <"v_cmps_f_f32">;
5510b57cec5SDimitry Andricdefm V_CMPS_LT_F32 : VOPC_F32 <"v_cmps_lt_f32", COND_NULL, "v_cmps_gt_f32">;
5520b57cec5SDimitry Andricdefm V_CMPS_EQ_F32 : VOPC_F32 <"v_cmps_eq_f32">;
5530b57cec5SDimitry Andricdefm V_CMPS_LE_F32 : VOPC_F32 <"v_cmps_le_f32", COND_NULL, "v_cmps_ge_f32">;
5540b57cec5SDimitry Andricdefm V_CMPS_GT_F32 : VOPC_F32 <"v_cmps_gt_f32">;
5550b57cec5SDimitry Andricdefm V_CMPS_LG_F32 : VOPC_F32 <"v_cmps_lg_f32">;
5560b57cec5SDimitry Andricdefm V_CMPS_GE_F32 : VOPC_F32 <"v_cmps_ge_f32">;
5570b57cec5SDimitry Andricdefm V_CMPS_O_F32 : VOPC_F32 <"v_cmps_o_f32">;
5580b57cec5SDimitry Andricdefm V_CMPS_U_F32 : VOPC_F32 <"v_cmps_u_f32">;
5590b57cec5SDimitry Andricdefm V_CMPS_NGE_F32 : VOPC_F32 <"v_cmps_nge_f32", COND_NULL, "v_cmps_nle_f32">;
5600b57cec5SDimitry Andricdefm V_CMPS_NLG_F32 : VOPC_F32 <"v_cmps_nlg_f32">;
5610b57cec5SDimitry Andricdefm V_CMPS_NGT_F32 : VOPC_F32 <"v_cmps_ngt_f32", COND_NULL, "v_cmps_nlt_f32">;
5620b57cec5SDimitry Andricdefm V_CMPS_NLE_F32 : VOPC_F32 <"v_cmps_nle_f32">;
5630b57cec5SDimitry Andricdefm V_CMPS_NEQ_F32 : VOPC_F32 <"v_cmps_neq_f32">;
5640b57cec5SDimitry Andricdefm V_CMPS_NLT_F32 : VOPC_F32 <"v_cmps_nlt_f32">;
5650b57cec5SDimitry Andricdefm V_CMPS_TRU_F32 : VOPC_F32 <"v_cmps_tru_f32">;
5660b57cec5SDimitry Andric
5670b57cec5SDimitry Andricdefm V_CMPSX_F_F32 : VOPCX_F32 <"v_cmpsx_f_f32">;
5680b57cec5SDimitry Andricdefm V_CMPSX_LT_F32 : VOPCX_F32 <"v_cmpsx_lt_f32", "v_cmpsx_gt_f32">;
5690b57cec5SDimitry Andricdefm V_CMPSX_EQ_F32 : VOPCX_F32 <"v_cmpsx_eq_f32">;
5700b57cec5SDimitry Andricdefm V_CMPSX_LE_F32 : VOPCX_F32 <"v_cmpsx_le_f32", "v_cmpsx_ge_f32">;
5710b57cec5SDimitry Andricdefm V_CMPSX_GT_F32 : VOPCX_F32 <"v_cmpsx_gt_f32">;
5720b57cec5SDimitry Andricdefm V_CMPSX_LG_F32 : VOPCX_F32 <"v_cmpsx_lg_f32">;
5730b57cec5SDimitry Andricdefm V_CMPSX_GE_F32 : VOPCX_F32 <"v_cmpsx_ge_f32">;
5740b57cec5SDimitry Andricdefm V_CMPSX_O_F32 : VOPCX_F32 <"v_cmpsx_o_f32">;
5750b57cec5SDimitry Andricdefm V_CMPSX_U_F32 : VOPCX_F32 <"v_cmpsx_u_f32">;
5760b57cec5SDimitry Andricdefm V_CMPSX_NGE_F32 : VOPCX_F32 <"v_cmpsx_nge_f32", "v_cmpsx_nle_f32">;
5770b57cec5SDimitry Andricdefm V_CMPSX_NLG_F32 : VOPCX_F32 <"v_cmpsx_nlg_f32">;
5780b57cec5SDimitry Andricdefm V_CMPSX_NGT_F32 : VOPCX_F32 <"v_cmpsx_ngt_f32", "v_cmpsx_nlt_f32">;
5790b57cec5SDimitry Andricdefm V_CMPSX_NLE_F32 : VOPCX_F32 <"v_cmpsx_nle_f32">;
5800b57cec5SDimitry Andricdefm V_CMPSX_NEQ_F32 : VOPCX_F32 <"v_cmpsx_neq_f32">;
5810b57cec5SDimitry Andricdefm V_CMPSX_NLT_F32 : VOPCX_F32 <"v_cmpsx_nlt_f32">;
5820b57cec5SDimitry Andricdefm V_CMPSX_TRU_F32 : VOPCX_F32 <"v_cmpsx_tru_f32">;
5830b57cec5SDimitry Andric
5840b57cec5SDimitry Andricdefm V_CMPS_F_F64 : VOPC_F64 <"v_cmps_f_f64">;
5850b57cec5SDimitry Andricdefm V_CMPS_LT_F64 : VOPC_F64 <"v_cmps_lt_f64", COND_NULL, "v_cmps_gt_f64">;
5860b57cec5SDimitry Andricdefm V_CMPS_EQ_F64 : VOPC_F64 <"v_cmps_eq_f64">;
5870b57cec5SDimitry Andricdefm V_CMPS_LE_F64 : VOPC_F64 <"v_cmps_le_f64", COND_NULL, "v_cmps_ge_f64">;
5880b57cec5SDimitry Andricdefm V_CMPS_GT_F64 : VOPC_F64 <"v_cmps_gt_f64">;
5890b57cec5SDimitry Andricdefm V_CMPS_LG_F64 : VOPC_F64 <"v_cmps_lg_f64">;
5900b57cec5SDimitry Andricdefm V_CMPS_GE_F64 : VOPC_F64 <"v_cmps_ge_f64">;
5910b57cec5SDimitry Andricdefm V_CMPS_O_F64 : VOPC_F64 <"v_cmps_o_f64">;
5920b57cec5SDimitry Andricdefm V_CMPS_U_F64 : VOPC_F64 <"v_cmps_u_f64">;
5930b57cec5SDimitry Andricdefm V_CMPS_NGE_F64 : VOPC_F64 <"v_cmps_nge_f64", COND_NULL, "v_cmps_nle_f64">;
5940b57cec5SDimitry Andricdefm V_CMPS_NLG_F64 : VOPC_F64 <"v_cmps_nlg_f64">;
5950b57cec5SDimitry Andricdefm V_CMPS_NGT_F64 : VOPC_F64 <"v_cmps_ngt_f64", COND_NULL, "v_cmps_nlt_f64">;
5960b57cec5SDimitry Andricdefm V_CMPS_NLE_F64 : VOPC_F64 <"v_cmps_nle_f64">;
5970b57cec5SDimitry Andricdefm V_CMPS_NEQ_F64 : VOPC_F64 <"v_cmps_neq_f64">;
5980b57cec5SDimitry Andricdefm V_CMPS_NLT_F64 : VOPC_F64 <"v_cmps_nlt_f64">;
5990b57cec5SDimitry Andricdefm V_CMPS_TRU_F64 : VOPC_F64 <"v_cmps_tru_f64">;
6000b57cec5SDimitry Andric
6010b57cec5SDimitry Andricdefm V_CMPSX_F_F64 : VOPCX_F64 <"v_cmpsx_f_f64">;
6020b57cec5SDimitry Andricdefm V_CMPSX_LT_F64 : VOPCX_F64 <"v_cmpsx_lt_f64", "v_cmpsx_gt_f64">;
6030b57cec5SDimitry Andricdefm V_CMPSX_EQ_F64 : VOPCX_F64 <"v_cmpsx_eq_f64">;
6040b57cec5SDimitry Andricdefm V_CMPSX_LE_F64 : VOPCX_F64 <"v_cmpsx_le_f64", "v_cmpsx_ge_f64">;
6050b57cec5SDimitry Andricdefm V_CMPSX_GT_F64 : VOPCX_F64 <"v_cmpsx_gt_f64">;
6060b57cec5SDimitry Andricdefm V_CMPSX_LG_F64 : VOPCX_F64 <"v_cmpsx_lg_f64">;
6070b57cec5SDimitry Andricdefm V_CMPSX_GE_F64 : VOPCX_F64 <"v_cmpsx_ge_f64">;
6080b57cec5SDimitry Andricdefm V_CMPSX_O_F64 : VOPCX_F64 <"v_cmpsx_o_f64">;
6090b57cec5SDimitry Andricdefm V_CMPSX_U_F64 : VOPCX_F64 <"v_cmpsx_u_f64">;
6100b57cec5SDimitry Andricdefm V_CMPSX_NGE_F64 : VOPCX_F64 <"v_cmpsx_nge_f64", "v_cmpsx_nle_f64">;
6110b57cec5SDimitry Andricdefm V_CMPSX_NLG_F64 : VOPCX_F64 <"v_cmpsx_nlg_f64">;
6120b57cec5SDimitry Andricdefm V_CMPSX_NGT_F64 : VOPCX_F64 <"v_cmpsx_ngt_f64", "v_cmpsx_nlt_f64">;
6130b57cec5SDimitry Andricdefm V_CMPSX_NLE_F64 : VOPCX_F64 <"v_cmpsx_nle_f64">;
6140b57cec5SDimitry Andricdefm V_CMPSX_NEQ_F64 : VOPCX_F64 <"v_cmpsx_neq_f64">;
6150b57cec5SDimitry Andricdefm V_CMPSX_NLT_F64 : VOPCX_F64 <"v_cmpsx_nlt_f64">;
6160b57cec5SDimitry Andricdefm V_CMPSX_TRU_F64 : VOPCX_F64 <"v_cmpsx_tru_f64">;
6170b57cec5SDimitry Andric
6180b57cec5SDimitry Andric} // End SubtargetPredicate = isGFX6GFX7
6190b57cec5SDimitry Andric
6200b57cec5SDimitry Andriclet SubtargetPredicate = Has16BitInsts in {
6210b57cec5SDimitry Andric
6220b57cec5SDimitry Andricdefm V_CMP_F_F16    : VOPC_F16 <"v_cmp_f_f16">;
6230b57cec5SDimitry Andricdefm V_CMP_LT_F16   : VOPC_F16 <"v_cmp_lt_f16", COND_OLT, "v_cmp_gt_f16">;
6240b57cec5SDimitry Andricdefm V_CMP_EQ_F16   : VOPC_F16 <"v_cmp_eq_f16", COND_OEQ>;
6250b57cec5SDimitry Andricdefm V_CMP_LE_F16   : VOPC_F16 <"v_cmp_le_f16", COND_OLE, "v_cmp_ge_f16">;
6260b57cec5SDimitry Andricdefm V_CMP_GT_F16   : VOPC_F16 <"v_cmp_gt_f16", COND_OGT>;
6270b57cec5SDimitry Andricdefm V_CMP_LG_F16   : VOPC_F16 <"v_cmp_lg_f16", COND_ONE>;
6280b57cec5SDimitry Andricdefm V_CMP_GE_F16   : VOPC_F16 <"v_cmp_ge_f16", COND_OGE>;
6290b57cec5SDimitry Andricdefm V_CMP_O_F16    : VOPC_F16 <"v_cmp_o_f16", COND_O>;
6300b57cec5SDimitry Andricdefm V_CMP_U_F16    : VOPC_F16 <"v_cmp_u_f16", COND_UO>;
6310b57cec5SDimitry Andricdefm V_CMP_NGE_F16  : VOPC_F16 <"v_cmp_nge_f16", COND_ULT, "v_cmp_nle_f16">;
6320b57cec5SDimitry Andricdefm V_CMP_NLG_F16  : VOPC_F16 <"v_cmp_nlg_f16", COND_UEQ>;
6330b57cec5SDimitry Andricdefm V_CMP_NGT_F16  : VOPC_F16 <"v_cmp_ngt_f16", COND_ULE, "v_cmp_nlt_f16">;
6340b57cec5SDimitry Andricdefm V_CMP_NLE_F16  : VOPC_F16 <"v_cmp_nle_f16", COND_UGT>;
6350b57cec5SDimitry Andricdefm V_CMP_NEQ_F16  : VOPC_F16 <"v_cmp_neq_f16", COND_UNE>;
6360b57cec5SDimitry Andricdefm V_CMP_NLT_F16  : VOPC_F16 <"v_cmp_nlt_f16", COND_UGE>;
6370b57cec5SDimitry Andricdefm V_CMP_TRU_F16  : VOPC_F16 <"v_cmp_tru_f16">;
6380b57cec5SDimitry Andric
6390b57cec5SDimitry Andricdefm V_CMPX_F_F16   : VOPCX_F16 <"v_cmpx_f_f16">;
6400b57cec5SDimitry Andricdefm V_CMPX_LT_F16  : VOPCX_F16 <"v_cmpx_lt_f16", "v_cmpx_gt_f16">;
6410b57cec5SDimitry Andricdefm V_CMPX_EQ_F16  : VOPCX_F16 <"v_cmpx_eq_f16">;
6420b57cec5SDimitry Andricdefm V_CMPX_LE_F16  : VOPCX_F16 <"v_cmpx_le_f16", "v_cmpx_ge_f16">;
6430b57cec5SDimitry Andricdefm V_CMPX_GT_F16  : VOPCX_F16 <"v_cmpx_gt_f16">;
6440b57cec5SDimitry Andricdefm V_CMPX_LG_F16  : VOPCX_F16 <"v_cmpx_lg_f16">;
6450b57cec5SDimitry Andricdefm V_CMPX_GE_F16  : VOPCX_F16 <"v_cmpx_ge_f16">;
6460b57cec5SDimitry Andricdefm V_CMPX_O_F16   : VOPCX_F16 <"v_cmpx_o_f16">;
6470b57cec5SDimitry Andricdefm V_CMPX_U_F16   : VOPCX_F16 <"v_cmpx_u_f16">;
6480b57cec5SDimitry Andricdefm V_CMPX_NGE_F16 : VOPCX_F16 <"v_cmpx_nge_f16", "v_cmpx_nle_f16">;
6490b57cec5SDimitry Andricdefm V_CMPX_NLG_F16 : VOPCX_F16 <"v_cmpx_nlg_f16">;
6500b57cec5SDimitry Andricdefm V_CMPX_NGT_F16 : VOPCX_F16 <"v_cmpx_ngt_f16", "v_cmpx_nlt_f16">;
6510b57cec5SDimitry Andricdefm V_CMPX_NLE_F16 : VOPCX_F16 <"v_cmpx_nle_f16">;
6520b57cec5SDimitry Andricdefm V_CMPX_NEQ_F16 : VOPCX_F16 <"v_cmpx_neq_f16">;
6530b57cec5SDimitry Andricdefm V_CMPX_NLT_F16 : VOPCX_F16 <"v_cmpx_nlt_f16">;
6540b57cec5SDimitry Andricdefm V_CMPX_TRU_F16 : VOPCX_F16 <"v_cmpx_tru_f16">;
6550b57cec5SDimitry Andric
6560b57cec5SDimitry Andricdefm V_CMP_F_I16 : VOPC_I16 <"v_cmp_f_i16">;
6570b57cec5SDimitry Andricdefm V_CMP_LT_I16 : VOPC_I16 <"v_cmp_lt_i16", COND_SLT, "v_cmp_gt_i16">;
6580b57cec5SDimitry Andricdefm V_CMP_EQ_I16 : VOPC_I16 <"v_cmp_eq_i16">;
6590b57cec5SDimitry Andricdefm V_CMP_LE_I16 : VOPC_I16 <"v_cmp_le_i16", COND_SLE, "v_cmp_ge_i16">;
6600b57cec5SDimitry Andricdefm V_CMP_GT_I16 : VOPC_I16 <"v_cmp_gt_i16", COND_SGT>;
6610b57cec5SDimitry Andricdefm V_CMP_NE_I16 : VOPC_I16 <"v_cmp_ne_i16">;
6620b57cec5SDimitry Andricdefm V_CMP_GE_I16 : VOPC_I16 <"v_cmp_ge_i16", COND_SGE>;
6630b57cec5SDimitry Andricdefm V_CMP_T_I16 : VOPC_I16 <"v_cmp_t_i16">;
6640b57cec5SDimitry Andric
6650b57cec5SDimitry Andricdefm V_CMP_F_U16 : VOPC_I16 <"v_cmp_f_u16">;
6660b57cec5SDimitry Andricdefm V_CMP_LT_U16 : VOPC_I16 <"v_cmp_lt_u16", COND_ULT, "v_cmp_gt_u16">;
6670b57cec5SDimitry Andricdefm V_CMP_EQ_U16 : VOPC_I16 <"v_cmp_eq_u16", COND_EQ>;
6680b57cec5SDimitry Andricdefm V_CMP_LE_U16 : VOPC_I16 <"v_cmp_le_u16", COND_ULE, "v_cmp_ge_u16">;
6690b57cec5SDimitry Andricdefm V_CMP_GT_U16 : VOPC_I16 <"v_cmp_gt_u16", COND_UGT>;
6700b57cec5SDimitry Andricdefm V_CMP_NE_U16 : VOPC_I16 <"v_cmp_ne_u16", COND_NE>;
6710b57cec5SDimitry Andricdefm V_CMP_GE_U16 : VOPC_I16 <"v_cmp_ge_u16", COND_UGE>;
6720b57cec5SDimitry Andricdefm V_CMP_T_U16 : VOPC_I16 <"v_cmp_t_u16">;
6730b57cec5SDimitry Andric
6740b57cec5SDimitry Andricdefm V_CMPX_F_I16 : VOPCX_I16 <"v_cmpx_f_i16">;
6750b57cec5SDimitry Andricdefm V_CMPX_LT_I16 : VOPCX_I16 <"v_cmpx_lt_i16", "v_cmpx_gt_i16">;
6760b57cec5SDimitry Andricdefm V_CMPX_EQ_I16 : VOPCX_I16 <"v_cmpx_eq_i16">;
6770b57cec5SDimitry Andricdefm V_CMPX_LE_I16 : VOPCX_I16 <"v_cmpx_le_i16", "v_cmpx_ge_i16">;
6780b57cec5SDimitry Andricdefm V_CMPX_GT_I16 : VOPCX_I16 <"v_cmpx_gt_i16">;
6790b57cec5SDimitry Andricdefm V_CMPX_NE_I16 : VOPCX_I16 <"v_cmpx_ne_i16">;
6800b57cec5SDimitry Andricdefm V_CMPX_GE_I16 : VOPCX_I16 <"v_cmpx_ge_i16">;
6810b57cec5SDimitry Andricdefm V_CMPX_T_I16 : VOPCX_I16 <"v_cmpx_t_i16">;
6820b57cec5SDimitry Andric
683bdd1243dSDimitry Andricdefm V_CMPX_F_U16 : VOPCX_I16 <"v_cmpx_f_u16">;
6840b57cec5SDimitry Andricdefm V_CMPX_LT_U16 : VOPCX_I16 <"v_cmpx_lt_u16", "v_cmpx_gt_u16">;
6850b57cec5SDimitry Andricdefm V_CMPX_EQ_U16 : VOPCX_I16 <"v_cmpx_eq_u16">;
6860b57cec5SDimitry Andricdefm V_CMPX_LE_U16 : VOPCX_I16 <"v_cmpx_le_u16", "v_cmpx_ge_u16">;
6870b57cec5SDimitry Andricdefm V_CMPX_GT_U16 : VOPCX_I16 <"v_cmpx_gt_u16">;
6880b57cec5SDimitry Andricdefm V_CMPX_NE_U16 : VOPCX_I16 <"v_cmpx_ne_u16">;
6890b57cec5SDimitry Andricdefm V_CMPX_GE_U16 : VOPCX_I16 <"v_cmpx_ge_u16">;
6900b57cec5SDimitry Andricdefm V_CMPX_T_U16 : VOPCX_I16 <"v_cmpx_t_u16">;
6910b57cec5SDimitry Andric
6920b57cec5SDimitry Andric} // End SubtargetPredicate = Has16BitInsts
6930b57cec5SDimitry Andric
6940b57cec5SDimitry Andricdefm V_CMP_F_I32 : VOPC_I32 <"v_cmp_f_i32">;
6950b57cec5SDimitry Andricdefm V_CMP_LT_I32 : VOPC_I32 <"v_cmp_lt_i32", COND_SLT, "v_cmp_gt_i32">;
6960b57cec5SDimitry Andricdefm V_CMP_EQ_I32 : VOPC_I32 <"v_cmp_eq_i32">;
6970b57cec5SDimitry Andricdefm V_CMP_LE_I32 : VOPC_I32 <"v_cmp_le_i32", COND_SLE, "v_cmp_ge_i32">;
6980b57cec5SDimitry Andricdefm V_CMP_GT_I32 : VOPC_I32 <"v_cmp_gt_i32", COND_SGT>;
6990b57cec5SDimitry Andricdefm V_CMP_NE_I32 : VOPC_I32 <"v_cmp_ne_i32">;
7000b57cec5SDimitry Andricdefm V_CMP_GE_I32 : VOPC_I32 <"v_cmp_ge_i32", COND_SGE>;
7010b57cec5SDimitry Andricdefm V_CMP_T_I32 : VOPC_I32 <"v_cmp_t_i32">;
7020b57cec5SDimitry Andric
7030b57cec5SDimitry Andricdefm V_CMPX_F_I32 : VOPCX_I32 <"v_cmpx_f_i32">;
7040b57cec5SDimitry Andricdefm V_CMPX_LT_I32 : VOPCX_I32 <"v_cmpx_lt_i32", "v_cmpx_gt_i32">;
7050b57cec5SDimitry Andricdefm V_CMPX_EQ_I32 : VOPCX_I32 <"v_cmpx_eq_i32">;
7060b57cec5SDimitry Andricdefm V_CMPX_LE_I32 : VOPCX_I32 <"v_cmpx_le_i32", "v_cmpx_ge_i32">;
7070b57cec5SDimitry Andricdefm V_CMPX_GT_I32 : VOPCX_I32 <"v_cmpx_gt_i32">;
7080b57cec5SDimitry Andricdefm V_CMPX_NE_I32 : VOPCX_I32 <"v_cmpx_ne_i32">;
7090b57cec5SDimitry Andricdefm V_CMPX_GE_I32 : VOPCX_I32 <"v_cmpx_ge_i32">;
7100b57cec5SDimitry Andricdefm V_CMPX_T_I32 : VOPCX_I32 <"v_cmpx_t_i32">;
7110b57cec5SDimitry Andric
7120b57cec5SDimitry Andricdefm V_CMP_F_I64 : VOPC_I64 <"v_cmp_f_i64">;
7130b57cec5SDimitry Andricdefm V_CMP_LT_I64 : VOPC_I64 <"v_cmp_lt_i64", COND_SLT, "v_cmp_gt_i64">;
7140b57cec5SDimitry Andricdefm V_CMP_EQ_I64 : VOPC_I64 <"v_cmp_eq_i64">;
7150b57cec5SDimitry Andricdefm V_CMP_LE_I64 : VOPC_I64 <"v_cmp_le_i64", COND_SLE, "v_cmp_ge_i64">;
7160b57cec5SDimitry Andricdefm V_CMP_GT_I64 : VOPC_I64 <"v_cmp_gt_i64", COND_SGT>;
7170b57cec5SDimitry Andricdefm V_CMP_NE_I64 : VOPC_I64 <"v_cmp_ne_i64">;
7180b57cec5SDimitry Andricdefm V_CMP_GE_I64 : VOPC_I64 <"v_cmp_ge_i64", COND_SGE>;
7190b57cec5SDimitry Andricdefm V_CMP_T_I64 : VOPC_I64 <"v_cmp_t_i64">;
7200b57cec5SDimitry Andric
7210b57cec5SDimitry Andricdefm V_CMPX_F_I64 : VOPCX_I64 <"v_cmpx_f_i64">;
7220b57cec5SDimitry Andricdefm V_CMPX_LT_I64 : VOPCX_I64 <"v_cmpx_lt_i64", "v_cmpx_gt_i64">;
7230b57cec5SDimitry Andricdefm V_CMPX_EQ_I64 : VOPCX_I64 <"v_cmpx_eq_i64">;
7240b57cec5SDimitry Andricdefm V_CMPX_LE_I64 : VOPCX_I64 <"v_cmpx_le_i64", "v_cmpx_ge_i64">;
7250b57cec5SDimitry Andricdefm V_CMPX_GT_I64 : VOPCX_I64 <"v_cmpx_gt_i64">;
7260b57cec5SDimitry Andricdefm V_CMPX_NE_I64 : VOPCX_I64 <"v_cmpx_ne_i64">;
7270b57cec5SDimitry Andricdefm V_CMPX_GE_I64 : VOPCX_I64 <"v_cmpx_ge_i64">;
7280b57cec5SDimitry Andricdefm V_CMPX_T_I64 : VOPCX_I64 <"v_cmpx_t_i64">;
7290b57cec5SDimitry Andric
7300b57cec5SDimitry Andricdefm V_CMP_F_U32 : VOPC_I32 <"v_cmp_f_u32">;
7310b57cec5SDimitry Andricdefm V_CMP_LT_U32 : VOPC_I32 <"v_cmp_lt_u32", COND_ULT, "v_cmp_gt_u32">;
7320b57cec5SDimitry Andricdefm V_CMP_EQ_U32 : VOPC_I32 <"v_cmp_eq_u32", COND_EQ>;
7330b57cec5SDimitry Andricdefm V_CMP_LE_U32 : VOPC_I32 <"v_cmp_le_u32", COND_ULE, "v_cmp_ge_u32">;
7340b57cec5SDimitry Andricdefm V_CMP_GT_U32 : VOPC_I32 <"v_cmp_gt_u32", COND_UGT>;
7350b57cec5SDimitry Andricdefm V_CMP_NE_U32 : VOPC_I32 <"v_cmp_ne_u32", COND_NE>;
7360b57cec5SDimitry Andricdefm V_CMP_GE_U32 : VOPC_I32 <"v_cmp_ge_u32", COND_UGE>;
7370b57cec5SDimitry Andricdefm V_CMP_T_U32 : VOPC_I32 <"v_cmp_t_u32">;
7380b57cec5SDimitry Andric
7390b57cec5SDimitry Andricdefm V_CMPX_F_U32 : VOPCX_I32 <"v_cmpx_f_u32">;
7400b57cec5SDimitry Andricdefm V_CMPX_LT_U32 : VOPCX_I32 <"v_cmpx_lt_u32", "v_cmpx_gt_u32">;
7410b57cec5SDimitry Andricdefm V_CMPX_EQ_U32 : VOPCX_I32 <"v_cmpx_eq_u32">;
7420b57cec5SDimitry Andricdefm V_CMPX_LE_U32 : VOPCX_I32 <"v_cmpx_le_u32", "v_cmpx_le_u32">;
7430b57cec5SDimitry Andricdefm V_CMPX_GT_U32 : VOPCX_I32 <"v_cmpx_gt_u32">;
7440b57cec5SDimitry Andricdefm V_CMPX_NE_U32 : VOPCX_I32 <"v_cmpx_ne_u32">;
7450b57cec5SDimitry Andricdefm V_CMPX_GE_U32 : VOPCX_I32 <"v_cmpx_ge_u32">;
7460b57cec5SDimitry Andricdefm V_CMPX_T_U32 : VOPCX_I32 <"v_cmpx_t_u32">;
7470b57cec5SDimitry Andric
7480b57cec5SDimitry Andricdefm V_CMP_F_U64 : VOPC_I64 <"v_cmp_f_u64">;
7490b57cec5SDimitry Andricdefm V_CMP_LT_U64 : VOPC_I64 <"v_cmp_lt_u64", COND_ULT, "v_cmp_gt_u64">;
7500b57cec5SDimitry Andricdefm V_CMP_EQ_U64 : VOPC_I64 <"v_cmp_eq_u64", COND_EQ>;
7510b57cec5SDimitry Andricdefm V_CMP_LE_U64 : VOPC_I64 <"v_cmp_le_u64", COND_ULE, "v_cmp_ge_u64">;
7520b57cec5SDimitry Andricdefm V_CMP_GT_U64 : VOPC_I64 <"v_cmp_gt_u64", COND_UGT>;
7530b57cec5SDimitry Andricdefm V_CMP_NE_U64 : VOPC_I64 <"v_cmp_ne_u64", COND_NE>;
7540b57cec5SDimitry Andricdefm V_CMP_GE_U64 : VOPC_I64 <"v_cmp_ge_u64", COND_UGE>;
7550b57cec5SDimitry Andricdefm V_CMP_T_U64 : VOPC_I64 <"v_cmp_t_u64">;
7560b57cec5SDimitry Andric
7570b57cec5SDimitry Andricdefm V_CMPX_F_U64 : VOPCX_I64 <"v_cmpx_f_u64">;
7580b57cec5SDimitry Andricdefm V_CMPX_LT_U64 : VOPCX_I64 <"v_cmpx_lt_u64", "v_cmpx_gt_u64">;
7590b57cec5SDimitry Andricdefm V_CMPX_EQ_U64 : VOPCX_I64 <"v_cmpx_eq_u64">;
7600b57cec5SDimitry Andricdefm V_CMPX_LE_U64 : VOPCX_I64 <"v_cmpx_le_u64", "v_cmpx_ge_u64">;
7610b57cec5SDimitry Andricdefm V_CMPX_GT_U64 : VOPCX_I64 <"v_cmpx_gt_u64">;
7620b57cec5SDimitry Andricdefm V_CMPX_NE_U64 : VOPCX_I64 <"v_cmpx_ne_u64">;
7630b57cec5SDimitry Andricdefm V_CMPX_GE_U64 : VOPCX_I64 <"v_cmpx_ge_u64">;
7640b57cec5SDimitry Andricdefm V_CMPX_T_U64 : VOPCX_I64 <"v_cmpx_t_u64">;
7650b57cec5SDimitry Andric
7660b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
7670b57cec5SDimitry Andric// Class instructions
7680b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
7690b57cec5SDimitry Andric
770bdd1243dSDimitry Andricclass VOPC_Class_Profile<list<SchedReadWrite> sched, ValueType src0VT, ValueType src1VT = i32> :
771bdd1243dSDimitry Andric  VOPC_Profile<sched, src0VT, src1VT> {
77281ad6265SDimitry Andric  let AsmDPP = "$src0_modifiers, $src1 $dpp_ctrl$row_mask$bank_mask$bound_ctrl";
77381ad6265SDimitry Andric  let AsmDPP16 = AsmDPP#"$fi";
774*0fca6ea1SDimitry Andric    let InsDPP = (ins Src0ModDPP:$src0_modifiers, Src0DPP:$src0, Src1DPP:$src1, dpp_ctrl:$dpp_ctrl, DppRowMask:$row_mask, DppBankMask:$bank_mask, DppBoundCtrl:$bound_ctrl);
775*0fca6ea1SDimitry Andric  let InsDPP16 = !con(InsDPP, (ins Dpp16FI:$fi));
77681ad6265SDimitry Andric  // DPP8 forbids modifiers and can inherit from VOPC_Profile
77781ad6265SDimitry Andric
7780b57cec5SDimitry Andric  let Ins64 = (ins Src0Mod:$src0_modifiers, Src0RC64:$src0, Src1RC64:$src1);
779*0fca6ea1SDimitry Andric  dag InsPartVOP3DPP = (ins FPVRegInputMods:$src0_modifiers, VGPRSrc_32:$src0, VCSrc_b32:$src1);
78081ad6265SDimitry Andric  let InsVOP3Base = !con(InsPartVOP3DPP, !if(HasOpSel, (ins op_sel0:$op_sel),
78181ad6265SDimitry Andric                                                       (ins)));
782bdd1243dSDimitry Andric  let AsmVOP3Base = "$sdst, $src0_modifiers, $src1";
7830b57cec5SDimitry Andric
7840b57cec5SDimitry Andric  let InsSDWA = (ins Src0ModSDWA:$src0_modifiers, Src0SDWA:$src0,
7850b57cec5SDimitry Andric                     Src1ModSDWA:$src1_modifiers, Src1SDWA:$src1,
786*0fca6ea1SDimitry Andric                     Clamp:$clamp, src0_sel:$src0_sel, src1_sel:$src1_sel);
7870b57cec5SDimitry Andric
7880b57cec5SDimitry Andric  let AsmSDWA = " vcc, $src0_modifiers, $src1_modifiers$clamp $src0_sel $src1_sel";
7890b57cec5SDimitry Andric  let HasSrc1Mods = 0;
7900b57cec5SDimitry Andric  let HasClamp = 0;
7910b57cec5SDimitry Andric  let HasOMod = 0;
7920b57cec5SDimitry Andric}
7930b57cec5SDimitry Andric
794bdd1243dSDimitry Andricmulticlass VOPC_Class_Profile_t16<list<SchedReadWrite> sched> {
795bdd1243dSDimitry Andric  def NAME : VOPC_Class_Profile<sched, f16>;
796bdd1243dSDimitry Andric  def _t16 : VOPC_Class_Profile<sched, f16, i16> {
797bdd1243dSDimitry Andric    let IsTrue16 = 1;
7987a6dacacSDimitry Andric    let Src1RC32 = getVregSrcForVT<Src1VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
799bdd1243dSDimitry Andric    let Src1RC64 = VSrc_b32;
8007a6dacacSDimitry Andric    let Src0DPP = getVregSrcForVT<Src0VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
8017a6dacacSDimitry Andric    let Src1DPP = getVregSrcForVT<Src1VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
8027a6dacacSDimitry Andric    let Src2DPP = getVregSrcForVT<Src2VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
803bdd1243dSDimitry Andric    let Src0ModDPP = getSrcModDPP_t16<Src0VT>.ret;
804bdd1243dSDimitry Andric    let Src1ModDPP = getSrcModDPP_t16<Src1VT>.ret;
805bdd1243dSDimitry Andric    let Src2ModDPP = getSrcModDPP_t16<Src2VT>.ret;
806bdd1243dSDimitry Andric  }
807bdd1243dSDimitry Andric}
808bdd1243dSDimitry Andric
809bdd1243dSDimitry Andricclass VOPC_Class_NoSdst_Profile<list<SchedReadWrite> sched, ValueType src0VT, ValueType src1VT = i32> :
810bdd1243dSDimitry Andric  VOPC_Class_Profile<sched, src0VT, src1VT> {
8110b57cec5SDimitry Andric  let Outs64 = (outs );
8120b57cec5SDimitry Andric  let OutsSDWA = (outs );
8130b57cec5SDimitry Andric  let InsSDWA = (ins Src0ModSDWA:$src0_modifiers, Src0SDWA:$src0,
8140b57cec5SDimitry Andric                     Src1ModSDWA:$src1_modifiers, Src1SDWA:$src1,
8150b57cec5SDimitry Andric                     src0_sel:$src0_sel, src1_sel:$src1_sel);
816bdd1243dSDimitry Andric  let AsmVOP3Base = "$src0_modifiers, $src1";
8170b57cec5SDimitry Andric  let AsmSDWA9 = "$src0_modifiers, $src1_modifiers $src0_sel $src1_sel";
8180b57cec5SDimitry Andric  let EmitDst = 0;
8190b57cec5SDimitry Andric}
8200b57cec5SDimitry Andric
821bdd1243dSDimitry Andricmulticlass VOPC_Class_NoSdst_Profile_t16<list<SchedReadWrite> sched> {
822bdd1243dSDimitry Andric  def NAME : VOPC_Class_NoSdst_Profile<sched, f16>;
823bdd1243dSDimitry Andric  def _t16 : VOPC_Class_NoSdst_Profile<sched, f16, i16> {
824bdd1243dSDimitry Andric    let IsTrue16 = 1;
8257a6dacacSDimitry Andric    let Src1RC32 = getVregSrcForVT<Src1VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
826bdd1243dSDimitry Andric    let Src1RC64 = VSrc_b32;
8277a6dacacSDimitry Andric    let Src0DPP = getVregSrcForVT<Src0VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
8287a6dacacSDimitry Andric    let Src1DPP = getVregSrcForVT<Src1VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
8297a6dacacSDimitry Andric    let Src2DPP = getVregSrcForVT<Src2VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
830bdd1243dSDimitry Andric    let Src0ModDPP = getSrcModDPP_t16<Src0VT>.ret;
831bdd1243dSDimitry Andric    let Src1ModDPP = getSrcModDPP_t16<Src1VT>.ret;
832bdd1243dSDimitry Andric    let Src2ModDPP = getSrcModDPP_t16<Src2VT>.ret;
833bdd1243dSDimitry Andric  }
834bdd1243dSDimitry Andric}
835bdd1243dSDimitry Andric
8360b57cec5SDimitry Andricclass getVOPCClassPat64 <VOPProfile P> {
8370b57cec5SDimitry Andric  list<dag> ret =
8380b57cec5SDimitry Andric    [(set i1:$sdst,
8390b57cec5SDimitry Andric      (AMDGPUfp_class
84006c3fb27SDimitry Andric        (P.Src0VT (VOP3ModsNonCanonicalizing P.Src0VT:$src0, i32:$src0_modifiers)),
841bdd1243dSDimitry Andric        i32:$src1))];
8420b57cec5SDimitry Andric}
8430b57cec5SDimitry Andric
844bdd1243dSDimitry Andric
8450b57cec5SDimitry Andric// Special case for class instructions which only have modifiers on
8460b57cec5SDimitry Andric// the 1st source operand.
8470b57cec5SDimitry Andricmulticlass VOPC_Class_Pseudos <string opName, VOPC_Profile p, bit DefExec,
8480b57cec5SDimitry Andric                               bit DefVcc = 1> {
8490b57cec5SDimitry Andric  def _e32 : VOPC_Pseudo <opName, p>,
8500b57cec5SDimitry Andric             VCMPXNoSDstTable<1, opName#"_e32"> {
8510b57cec5SDimitry Andric    let Defs = !if(DefExec, !if(DefVcc, [VCC, EXEC], [EXEC]),
8520b57cec5SDimitry Andric                            !if(DefVcc, [VCC], []));
8530b57cec5SDimitry Andric    let SchedRW = p.Schedule;
8540b57cec5SDimitry Andric    let isConvergent = DefExec;
8550b57cec5SDimitry Andric  }
8560b57cec5SDimitry Andric
8570b57cec5SDimitry Andric  def _e64 : VOP3_Pseudo<opName, p, getVOPCClassPat64<p>.ret>,
8580b57cec5SDimitry Andric             VCMPXNoSDstTable<1, opName#"_e64"> {
8590b57cec5SDimitry Andric    let Defs = !if(DefExec, [EXEC], []);
8600b57cec5SDimitry Andric    let SchedRW = p.Schedule;
8610b57cec5SDimitry Andric  }
8620b57cec5SDimitry Andric
86306c3fb27SDimitry Andric  if p.HasExtSDWA then
8640b57cec5SDimitry Andric  def _sdwa : VOPC_SDWA_Pseudo <opName, p> {
8650b57cec5SDimitry Andric    let Defs = !if(DefExec, !if(DefVcc, [VCC, EXEC], [EXEC]),
8660b57cec5SDimitry Andric                            !if(DefVcc, [VCC], []));
8670b57cec5SDimitry Andric    let SchedRW = p.Schedule;
8680b57cec5SDimitry Andric    let isConvergent = DefExec;
8690b57cec5SDimitry Andric  }
87081ad6265SDimitry Andric
87181ad6265SDimitry Andric  let SubtargetPredicate = isGFX11Plus in {
87281ad6265SDimitry Andric  if p.HasExtDPP then
87381ad6265SDimitry Andric      def _e32_dpp : VOP_DPP_Pseudo<opName, p> {
87481ad6265SDimitry Andric        let Defs = !if(DefExec, !if(DefVcc, [VCC, EXEC], [EXEC]),
87581ad6265SDimitry Andric                                !if(DefVcc, [VCC], []));
87681ad6265SDimitry Andric        let SchedRW = p.Schedule;
87781ad6265SDimitry Andric        let isConvergent = DefExec;
87881ad6265SDimitry Andric        let VOPC = 1;
87981ad6265SDimitry Andric        let Constraints = "";
88081ad6265SDimitry Andric      }
88181ad6265SDimitry Andric  if p.HasExtVOP3DPP then
88281ad6265SDimitry Andric      def _e64_dpp : VOP3_DPP_Pseudo<opName, p> {
88381ad6265SDimitry Andric        let Defs = !if(DefExec, [EXEC], []);
88481ad6265SDimitry Andric        let SchedRW = p.Schedule;
885fcaf7f86SDimitry Andric        let Constraints = "";
88681ad6265SDimitry Andric    }
88781ad6265SDimitry Andric  } // end SubtargetPredicate = isGFX11Plus
8880b57cec5SDimitry Andric}
8890b57cec5SDimitry Andric
8900b57cec5SDimitry Andriclet SubtargetPredicate = HasSdstCMPX in {
8910b57cec5SDimitry Andricmulticlass VOPCX_Class_Pseudos <string opName,
8920b57cec5SDimitry Andric                                VOPC_Profile P,
8930b57cec5SDimitry Andric                                VOPC_Profile P_NoSDst> :
8940b57cec5SDimitry Andric           VOPC_Class_Pseudos <opName, P, 1, 1> {
8950b57cec5SDimitry Andric
8960b57cec5SDimitry Andric  def _nosdst_e32 : VOPC_Pseudo <opName#"_nosdst", P_NoSDst, [], 0>,
8970b57cec5SDimitry Andric                    VCMPXNoSDstTable<0, opName#"_e32"> {
8980b57cec5SDimitry Andric    let Defs = [EXEC];
8990b57cec5SDimitry Andric    let SchedRW = P_NoSDst.Schedule;
9000b57cec5SDimitry Andric    let isConvergent = 1;
9010b57cec5SDimitry Andric    let SubtargetPredicate = HasNoSdstCMPX;
9020b57cec5SDimitry Andric  }
9030b57cec5SDimitry Andric
9040b57cec5SDimitry Andric  def _nosdst_e64 : VOP3_Pseudo<opName#"_nosdst", P_NoSDst>,
9050b57cec5SDimitry Andric                    VCMPXNoSDstTable<0, opName#"_e64"> {
9060b57cec5SDimitry Andric    let Defs = [EXEC];
9070b57cec5SDimitry Andric    let SchedRW = P_NoSDst.Schedule;
9080b57cec5SDimitry Andric    let SubtargetPredicate = HasNoSdstCMPX;
9090b57cec5SDimitry Andric  }
9100b57cec5SDimitry Andric
91106c3fb27SDimitry Andric  if P_NoSDst.HasExtSDWA then
9120b57cec5SDimitry Andric  def _nosdst_sdwa : VOPC_SDWA_Pseudo <opName#"_nosdst", P_NoSDst> {
9130b57cec5SDimitry Andric    let Defs = [EXEC];
9140b57cec5SDimitry Andric    let SchedRW = P_NoSDst.Schedule;
9150b57cec5SDimitry Andric    let isConvergent = 1;
9160b57cec5SDimitry Andric    let SubtargetPredicate = HasNoSdstCMPX;
9170b57cec5SDimitry Andric  }
91881ad6265SDimitry Andric
91981ad6265SDimitry Andric  let SubtargetPredicate = isGFX11Plus in {
92081ad6265SDimitry Andric  if P.HasExtDPP then
92181ad6265SDimitry Andric      def _nosdst_e32_dpp : VOP_DPP_Pseudo<opName#"_nosdst", P_NoSDst> {
92281ad6265SDimitry Andric        let Defs = [EXEC];
92381ad6265SDimitry Andric        let SchedRW = P_NoSDst.Schedule;
92481ad6265SDimitry Andric        let isConvergent = 1;
92581ad6265SDimitry Andric        let VOPC = 1;
92681ad6265SDimitry Andric        let Constraints = "";
92781ad6265SDimitry Andric      }
92881ad6265SDimitry Andric  if P.HasExtVOP3DPP then
92981ad6265SDimitry Andric      def _nosdst_e64_dpp : VOP3_DPP_Pseudo<opName#"_nosdst", P_NoSDst> {
93081ad6265SDimitry Andric        let Defs = [EXEC];
93181ad6265SDimitry Andric        let SchedRW = P_NoSDst.Schedule;
93281ad6265SDimitry Andric        let Constraints = "";
93381ad6265SDimitry Andric    }
93481ad6265SDimitry Andric  } // end SubtargetPredicate = isGFX11Plus
9350b57cec5SDimitry Andric}
9360b57cec5SDimitry Andric} // End SubtargetPredicate = HasSdstCMPX
9370b57cec5SDimitry Andric
938bdd1243dSDimitry Andricdefm VOPC_I1_F16_I16 : VOPC_Class_Profile_t16<[Write32Bit]>;
9390b57cec5SDimitry Andricdef VOPC_I1_F32_I32 : VOPC_Class_Profile<[Write32Bit], f32>;
9400b57cec5SDimitry Andricdef VOPC_I1_F64_I32 : VOPC_Class_Profile<[WriteDoubleAdd], f64>;
9410b57cec5SDimitry Andric
942bdd1243dSDimitry Andricdefm VOPC_F16_I16 : VOPC_Class_NoSdst_Profile_t16<[Write32Bit]>;
9430b57cec5SDimitry Andricdef VOPC_F32_I32 : VOPC_Class_NoSdst_Profile<[Write32Bit], f32>;
9440b57cec5SDimitry Andricdef VOPC_F64_I32 : VOPC_Class_NoSdst_Profile<[Write64Bit], f64>;
9450b57cec5SDimitry Andric
946bdd1243dSDimitry Andricmulticlass VOPC_CLASS_F16 <string opName> {
947*0fca6ea1SDimitry Andric  let OtherPredicates = [Has16BitInsts], True16Predicate = NotHasTrue16BitInsts in {
948bdd1243dSDimitry Andric    defm NAME : VOPC_Class_Pseudos <opName, VOPC_I1_F16_I16, 0>;
949bdd1243dSDimitry Andric  }
950bdd1243dSDimitry Andric  let OtherPredicates = [HasTrue16BitInsts] in {
951bdd1243dSDimitry Andric    defm _t16 : VOPC_Class_Pseudos <opName#"_t16", VOPC_I1_F16_I16_t16, 0>;
952bdd1243dSDimitry Andric  }
953bdd1243dSDimitry Andric}
9540b57cec5SDimitry Andric
955bdd1243dSDimitry Andricmulticlass VOPCX_CLASS_F16 <string opName> {
956*0fca6ea1SDimitry Andric  let OtherPredicates = [Has16BitInsts], True16Predicate = NotHasTrue16BitInsts in {
957bdd1243dSDimitry Andric    defm NAME : VOPCX_Class_Pseudos <opName, VOPC_I1_F16_I16, VOPC_F16_I16>;
958bdd1243dSDimitry Andric  }
959bdd1243dSDimitry Andric  let OtherPredicates = [HasTrue16BitInsts] in {
960bdd1243dSDimitry Andric    defm _t16 : VOPCX_Class_Pseudos <opName#"_t16", VOPC_I1_F16_I16_t16, VOPC_F16_I16_t16>;
961bdd1243dSDimitry Andric  }
962bdd1243dSDimitry Andric}
9630b57cec5SDimitry Andric
9640b57cec5SDimitry Andricmulticlass VOPC_CLASS_F32 <string opName> :
9650b57cec5SDimitry Andric  VOPC_Class_Pseudos <opName, VOPC_I1_F32_I32, 0>;
9660b57cec5SDimitry Andric
9670b57cec5SDimitry Andricmulticlass VOPCX_CLASS_F32 <string opName> :
9680b57cec5SDimitry Andric  VOPCX_Class_Pseudos <opName, VOPC_I1_F32_I32, VOPC_F32_I32>;
9690b57cec5SDimitry Andric
9700b57cec5SDimitry Andricmulticlass VOPC_CLASS_F64 <string opName> :
9710b57cec5SDimitry Andric  VOPC_Class_Pseudos <opName, VOPC_I1_F64_I32, 0>;
9720b57cec5SDimitry Andric
9730b57cec5SDimitry Andricmulticlass VOPCX_CLASS_F64 <string opName> :
9740b57cec5SDimitry Andric  VOPCX_Class_Pseudos <opName, VOPC_I1_F64_I32, VOPC_F64_I32>;
9750b57cec5SDimitry Andric
9765ffd83dbSDimitry Andric// cmp_class ignores the FP mode and faithfully reports the unmodified
9775ffd83dbSDimitry Andric// source value.
9785ffd83dbSDimitry Andriclet ReadsModeReg = 0, mayRaiseFPException = 0 in {
9790b57cec5SDimitry Andricdefm V_CMP_CLASS_F32 : VOPC_CLASS_F32 <"v_cmp_class_f32">;
9800b57cec5SDimitry Andricdefm V_CMPX_CLASS_F32 : VOPCX_CLASS_F32 <"v_cmpx_class_f32">;
9810b57cec5SDimitry Andricdefm V_CMP_CLASS_F64 : VOPC_CLASS_F64 <"v_cmp_class_f64">;
9820b57cec5SDimitry Andricdefm V_CMPX_CLASS_F64 : VOPCX_CLASS_F64 <"v_cmpx_class_f64">;
9838bcb0991SDimitry Andric
9840b57cec5SDimitry Andricdefm V_CMP_CLASS_F16  : VOPC_CLASS_F16 <"v_cmp_class_f16">;
9850b57cec5SDimitry Andricdefm V_CMPX_CLASS_F16 : VOPCX_CLASS_F16 <"v_cmpx_class_f16">;
9865ffd83dbSDimitry Andric} // End ReadsModeReg = 0, mayRaiseFPException = 0
9870b57cec5SDimitry Andric
9880b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
9890b57cec5SDimitry Andric// V_ICMPIntrinsic Pattern.
9900b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
9910b57cec5SDimitry Andric
9920b57cec5SDimitry Andric// We need to use COPY_TO_REGCLASS to w/a the problem when ReplaceAllUsesWith()
9930b57cec5SDimitry Andric// complaints it cannot replace i1 <-> i64/i32 if node was not morphed in place.
994fe6060f1SDimitry Andricmulticlass ICMP_Pattern <PatFrags cond, Instruction inst, ValueType vt> {
9950b57cec5SDimitry Andric  let WaveSizePredicate = isWave64 in
9960b57cec5SDimitry Andric  def : GCNPat <
9970b57cec5SDimitry Andric    (i64 (AMDGPUsetcc vt:$src0, vt:$src1, cond)),
9980b57cec5SDimitry Andric    (i64 (COPY_TO_REGCLASS (inst $src0, $src1), SReg_64))
9990b57cec5SDimitry Andric  >;
10000b57cec5SDimitry Andric
100106c3fb27SDimitry Andric  let WaveSizePredicate = isWave32 in {
10020b57cec5SDimitry Andric    def : GCNPat <
10030b57cec5SDimitry Andric      (i32 (AMDGPUsetcc vt:$src0, vt:$src1, cond)),
10040b57cec5SDimitry Andric      (i32 (COPY_TO_REGCLASS (inst $src0, $src1), SReg_32))
10050b57cec5SDimitry Andric    >;
100606c3fb27SDimitry Andric
100706c3fb27SDimitry Andric    // Support codegen of i64 setcc in wave32 mode.
100806c3fb27SDimitry Andric    def : GCNPat <
100906c3fb27SDimitry Andric      (i64 (AMDGPUsetcc vt:$src0, vt:$src1, cond)),
101006c3fb27SDimitry Andric      (i64 (REG_SEQUENCE SReg_64, (inst $src0, $src1), sub0, (S_MOV_B32 (i32 0)), sub1))
101106c3fb27SDimitry Andric    >;
101206c3fb27SDimitry Andric  }
10130b57cec5SDimitry Andric}
10140b57cec5SDimitry Andric
10150b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_EQ, V_CMP_EQ_U32_e64, i32>;
10160b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_NE, V_CMP_NE_U32_e64, i32>;
10170b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_UGT, V_CMP_GT_U32_e64, i32>;
10180b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_UGE, V_CMP_GE_U32_e64, i32>;
10190b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_ULT, V_CMP_LT_U32_e64, i32>;
10200b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_ULE, V_CMP_LE_U32_e64, i32>;
10210b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_SGT, V_CMP_GT_I32_e64, i32>;
10220b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_SGE, V_CMP_GE_I32_e64, i32>;
10230b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_SLT, V_CMP_LT_I32_e64, i32>;
10240b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_SLE, V_CMP_LE_I32_e64, i32>;
10250b57cec5SDimitry Andric
10260b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_EQ, V_CMP_EQ_U64_e64, i64>;
10270b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_NE, V_CMP_NE_U64_e64, i64>;
10280b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_UGT, V_CMP_GT_U64_e64, i64>;
10290b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_UGE, V_CMP_GE_U64_e64, i64>;
10300b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_ULT, V_CMP_LT_U64_e64, i64>;
10310b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_ULE, V_CMP_LE_U64_e64, i64>;
10320b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_SGT, V_CMP_GT_I64_e64, i64>;
10330b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_SGE, V_CMP_GE_I64_e64, i64>;
10340b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_SLT, V_CMP_LT_I64_e64, i64>;
10350b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_SLE, V_CMP_LE_I64_e64, i64>;
10360b57cec5SDimitry Andric
1037bdd1243dSDimitry Andriclet OtherPredicates = [HasTrue16BitInsts] in {
1038bdd1243dSDimitry Andricdefm : ICMP_Pattern <COND_EQ, V_CMP_EQ_U16_t16_e64, i16>;
1039bdd1243dSDimitry Andricdefm : ICMP_Pattern <COND_NE, V_CMP_NE_U16_t16_e64, i16>;
1040bdd1243dSDimitry Andricdefm : ICMP_Pattern <COND_UGT, V_CMP_GT_U16_t16_e64, i16>;
1041bdd1243dSDimitry Andricdefm : ICMP_Pattern <COND_UGE, V_CMP_GE_U16_t16_e64, i16>;
1042bdd1243dSDimitry Andricdefm : ICMP_Pattern <COND_ULT, V_CMP_LT_U16_t16_e64, i16>;
1043bdd1243dSDimitry Andricdefm : ICMP_Pattern <COND_ULE, V_CMP_LE_U16_t16_e64, i16>;
1044bdd1243dSDimitry Andricdefm : ICMP_Pattern <COND_SGT, V_CMP_GT_I16_t16_e64, i16>;
1045bdd1243dSDimitry Andricdefm : ICMP_Pattern <COND_SGE, V_CMP_GE_I16_t16_e64, i16>;
1046bdd1243dSDimitry Andricdefm : ICMP_Pattern <COND_SLT, V_CMP_LT_I16_t16_e64, i16>;
1047bdd1243dSDimitry Andricdefm : ICMP_Pattern <COND_SLE, V_CMP_LE_I16_t16_e64, i16>;
1048bdd1243dSDimitry Andric} // End OtherPredicates = [HasTrue16BitInsts]
1049bdd1243dSDimitry Andric
1050bdd1243dSDimitry Andriclet OtherPredicates = [NotHasTrue16BitInsts] in {
10510b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_EQ, V_CMP_EQ_U16_e64, i16>;
10520b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_NE, V_CMP_NE_U16_e64, i16>;
10530b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_UGT, V_CMP_GT_U16_e64, i16>;
10540b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_UGE, V_CMP_GE_U16_e64, i16>;
10550b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_ULT, V_CMP_LT_U16_e64, i16>;
10560b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_ULE, V_CMP_LE_U16_e64, i16>;
10570b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_SGT, V_CMP_GT_I16_e64, i16>;
10580b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_SGE, V_CMP_GE_I16_e64, i16>;
10590b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_SLT, V_CMP_LT_I16_e64, i16>;
10600b57cec5SDimitry Andricdefm : ICMP_Pattern <COND_SLE, V_CMP_LE_I16_e64, i16>;
1061bdd1243dSDimitry Andric} // End OtherPredicates = [NotHasTrue16BitInsts]
10620b57cec5SDimitry Andric
1063fe6060f1SDimitry Andricmulticlass FCMP_Pattern <PatFrags cond, Instruction inst, ValueType vt> {
10640b57cec5SDimitry Andric  let WaveSizePredicate = isWave64 in
10650b57cec5SDimitry Andric  def : GCNPat <
10660b57cec5SDimitry Andric    (i64 (AMDGPUsetcc (vt (VOP3Mods vt:$src0, i32:$src0_modifiers)),
10670b57cec5SDimitry Andric                 (vt (VOP3Mods vt:$src1, i32:$src1_modifiers)), cond)),
10680b57cec5SDimitry Andric    (i64 (COPY_TO_REGCLASS (inst $src0_modifiers, $src0, $src1_modifiers, $src1,
10690b57cec5SDimitry Andric                           DSTCLAMP.NONE), SReg_64))
10700b57cec5SDimitry Andric  >;
10710b57cec5SDimitry Andric
107206c3fb27SDimitry Andric  let WaveSizePredicate = isWave32 in {
10730b57cec5SDimitry Andric    def : GCNPat <
10740b57cec5SDimitry Andric      (i32 (AMDGPUsetcc (vt (VOP3Mods vt:$src0, i32:$src0_modifiers)),
10750b57cec5SDimitry Andric                        (vt (VOP3Mods vt:$src1, i32:$src1_modifiers)), cond)),
10760b57cec5SDimitry Andric      (i32 (COPY_TO_REGCLASS (inst $src0_modifiers, $src0, $src1_modifiers, $src1,
10770b57cec5SDimitry Andric                              DSTCLAMP.NONE), SReg_32))
10780b57cec5SDimitry Andric    >;
107906c3fb27SDimitry Andric
108006c3fb27SDimitry Andric    def : GCNPat <
108106c3fb27SDimitry Andric      (i64 (AMDGPUsetcc (vt (VOP3Mods vt:$src0, i32:$src0_modifiers)),
108206c3fb27SDimitry Andric                        (vt (VOP3Mods vt:$src1, i32:$src1_modifiers)), cond)),
108306c3fb27SDimitry Andric      (i64 (REG_SEQUENCE SReg_64, (inst $src0_modifiers, $src0, $src1_modifiers, $src1,
108406c3fb27SDimitry Andric                                   DSTCLAMP.NONE), sub0,
108506c3fb27SDimitry Andric                                  (S_MOV_B32 (i32 0)), sub1))
108606c3fb27SDimitry Andric    >;
108706c3fb27SDimitry Andric  }
10880b57cec5SDimitry Andric}
10890b57cec5SDimitry Andric
10905f757f3fSDimitry Andricdefm : FCMP_Pattern <COND_O, V_CMP_O_F32_e64, f32>;
10915f757f3fSDimitry Andricdefm : FCMP_Pattern <COND_UO, V_CMP_U_F32_e64, f32>;
10920b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_OEQ, V_CMP_EQ_F32_e64, f32>;
10930b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_ONE, V_CMP_NEQ_F32_e64, f32>;
10940b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_OGT, V_CMP_GT_F32_e64, f32>;
10950b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_OGE, V_CMP_GE_F32_e64, f32>;
10960b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_OLT, V_CMP_LT_F32_e64, f32>;
10970b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_OLE, V_CMP_LE_F32_e64, f32>;
10980b57cec5SDimitry Andric
10995f757f3fSDimitry Andricdefm : FCMP_Pattern <COND_O, V_CMP_O_F64_e64, f64>;
11005f757f3fSDimitry Andricdefm : FCMP_Pattern <COND_UO, V_CMP_U_F64_e64, f64>;
11010b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_OEQ, V_CMP_EQ_F64_e64, f64>;
11020b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_ONE, V_CMP_NEQ_F64_e64, f64>;
11030b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_OGT, V_CMP_GT_F64_e64, f64>;
11040b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_OGE, V_CMP_GE_F64_e64, f64>;
11050b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_OLT, V_CMP_LT_F64_e64, f64>;
11060b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_OLE, V_CMP_LE_F64_e64, f64>;
11070b57cec5SDimitry Andric
11080b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_UEQ, V_CMP_NLG_F32_e64, f32>;
11090b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_UNE, V_CMP_NEQ_F32_e64, f32>;
11100b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_UGT, V_CMP_NLE_F32_e64, f32>;
11110b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_UGE, V_CMP_NLT_F32_e64, f32>;
11120b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_ULT, V_CMP_NGE_F32_e64, f32>;
11130b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_ULE, V_CMP_NGT_F32_e64, f32>;
11140b57cec5SDimitry Andric
11150b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_UEQ, V_CMP_NLG_F64_e64, f64>;
11160b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_UNE, V_CMP_NEQ_F64_e64, f64>;
11170b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_UGT, V_CMP_NLE_F64_e64, f64>;
11180b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_UGE, V_CMP_NLT_F64_e64, f64>;
11190b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_ULT, V_CMP_NGE_F64_e64, f64>;
11200b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_ULE, V_CMP_NGT_F64_e64, f64>;
11210b57cec5SDimitry Andric
1122bdd1243dSDimitry Andriclet OtherPredicates = [HasTrue16BitInsts] in {
11235f757f3fSDimitry Andricdefm : FCMP_Pattern <COND_O, V_CMP_O_F16_t16_e64, f16>;
11245f757f3fSDimitry Andricdefm : FCMP_Pattern <COND_UO, V_CMP_U_F16_t16_e64, f16>;
1125bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_OEQ, V_CMP_EQ_F16_t16_e64, f16>;
1126bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_ONE, V_CMP_NEQ_F16_t16_e64, f16>;
1127bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_OGT, V_CMP_GT_F16_t16_e64, f16>;
1128bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_OGE, V_CMP_GE_F16_t16_e64, f16>;
1129bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_OLT, V_CMP_LT_F16_t16_e64, f16>;
1130bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_OLE, V_CMP_LE_F16_t16_e64, f16>;
1131bdd1243dSDimitry Andric
1132bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_UEQ, V_CMP_NLG_F16_t16_e64, f16>;
1133bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_UNE, V_CMP_NEQ_F16_t16_e64, f16>;
1134bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_UGT, V_CMP_NLE_F16_t16_e64, f16>;
1135bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_UGE, V_CMP_NLT_F16_t16_e64, f16>;
1136bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_ULT, V_CMP_NGE_F16_t16_e64, f16>;
1137bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_ULE, V_CMP_NGT_F16_t16_e64, f16>;
1138bdd1243dSDimitry Andric} // End OtherPredicates = [HasTrue16BitInsts]
1139bdd1243dSDimitry Andric
1140bdd1243dSDimitry Andriclet OtherPredicates = [NotHasTrue16BitInsts] in {
11415f757f3fSDimitry Andricdefm : FCMP_Pattern <COND_O, V_CMP_O_F16_e64, f16>;
11425f757f3fSDimitry Andricdefm : FCMP_Pattern <COND_UO, V_CMP_U_F16_e64, f16>;
1143bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_OEQ, V_CMP_EQ_F16_e64, f16>;
1144bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_ONE, V_CMP_NEQ_F16_e64, f16>;
1145bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_OGT, V_CMP_GT_F16_e64, f16>;
1146bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_OGE, V_CMP_GE_F16_e64, f16>;
1147bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_OLT, V_CMP_LT_F16_e64, f16>;
1148bdd1243dSDimitry Andricdefm : FCMP_Pattern <COND_OLE, V_CMP_LE_F16_e64, f16>;
1149bdd1243dSDimitry Andric
11500b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_UEQ, V_CMP_NLG_F16_e64, f16>;
11510b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_UNE, V_CMP_NEQ_F16_e64, f16>;
11520b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_UGT, V_CMP_NLE_F16_e64, f16>;
11530b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_UGE, V_CMP_NLT_F16_e64, f16>;
11540b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_ULT, V_CMP_NGE_F16_e64, f16>;
11550b57cec5SDimitry Andricdefm : FCMP_Pattern <COND_ULE, V_CMP_NGT_F16_e64, f16>;
1156bdd1243dSDimitry Andric} // End OtherPredicates = [NotHasTrue16BitInsts]
11570b57cec5SDimitry Andric
11580b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
115981ad6265SDimitry Andric// DPP Encodings
116081ad6265SDimitry Andric//===----------------------------------------------------------------------===//
116181ad6265SDimitry Andric
116281ad6265SDimitry Andric// VOPC32
116381ad6265SDimitry Andric
116481ad6265SDimitry Andricclass VOPC_DPPe_Common<bits<8> op> : Enc64 {
116581ad6265SDimitry Andric  bits<8> src1;
116681ad6265SDimitry Andric  let Inst{16-9} = src1;
116781ad6265SDimitry Andric  let Inst{24-17} = op;
116881ad6265SDimitry Andric  let Inst{31-25} = 0x3e;
116981ad6265SDimitry Andric}
117081ad6265SDimitry Andric
117181ad6265SDimitry Andricclass VOPC_DPP_Base<bits<8> op, string OpName, VOPProfile P>
117281ad6265SDimitry Andric    : VOP_DPP_Base<OpName, P, P.InsDPP16, " " #P.AsmDPP16>,
117381ad6265SDimitry Andric      VOPC_DPPe_Common<op> {
1174*0fca6ea1SDimitry Andric  Instruction Opcode = !cast<Instruction>(NAME);
1175*0fca6ea1SDimitry Andric
117681ad6265SDimitry Andric  bits<2> src0_modifiers;
117781ad6265SDimitry Andric  bits<8> src0;
117881ad6265SDimitry Andric  bits<2> src1_modifiers;
117981ad6265SDimitry Andric  bits<9> dpp_ctrl;
118081ad6265SDimitry Andric  bits<1> bound_ctrl;
118181ad6265SDimitry Andric  bits<4> bank_mask;
118281ad6265SDimitry Andric  bits<4> row_mask;
118381ad6265SDimitry Andric  bit fi;
118481ad6265SDimitry Andric
118581ad6265SDimitry Andric  let Inst{8-0} = 0xfa;
118681ad6265SDimitry Andric
118781ad6265SDimitry Andric  let Inst{39-32} = !if (P.HasSrc0, src0{7-0}, 0);
118881ad6265SDimitry Andric  let Inst{48-40} = dpp_ctrl;
118981ad6265SDimitry Andric  let Inst{50} = fi;
119081ad6265SDimitry Andric  let Inst{51} = bound_ctrl;
119181ad6265SDimitry Andric  let Inst{52} = !if (P.HasSrc0Mods, src0_modifiers{0}, 0); // src0_neg
119281ad6265SDimitry Andric  let Inst{53} = !if (P.HasSrc0Mods, src0_modifiers{1}, 0); // src0_abs
119381ad6265SDimitry Andric  let Inst{54} = !if (P.HasSrc1Mods, src1_modifiers{0}, 0); // src1_neg
119481ad6265SDimitry Andric  let Inst{55} = !if (P.HasSrc1Mods, src1_modifiers{1}, 0); // src1_abs
119581ad6265SDimitry Andric  let Inst{59-56} = bank_mask;
119681ad6265SDimitry Andric  let Inst{63-60} = row_mask;
119781ad6265SDimitry Andric
119881ad6265SDimitry Andric  let AsmMatchConverter = "cvtDPP";
119981ad6265SDimitry Andric  let VOPC = 1;
120081ad6265SDimitry Andric}
120181ad6265SDimitry Andric
120281ad6265SDimitry Andricclass VOPC_DPP8_Base<bits<8> op, string OpName, VOPProfile P>
120381ad6265SDimitry Andric    : VOP_DPP8_Base<OpName, P, P.InsDPP8, " " #P.AsmDPP8>,
120481ad6265SDimitry Andric      VOPC_DPPe_Common<op> {
1205*0fca6ea1SDimitry Andric  Instruction Opcode = !cast<Instruction>(NAME);
1206*0fca6ea1SDimitry Andric
120781ad6265SDimitry Andric  bits<8> src0;
120881ad6265SDimitry Andric  bits<24> dpp8;
120981ad6265SDimitry Andric  bits<9> fi;
121081ad6265SDimitry Andric
121181ad6265SDimitry Andric  let Inst{8-0} = fi;
121281ad6265SDimitry Andric
121381ad6265SDimitry Andric  let Inst{39-32} = !if (P.HasSrc0, src0{7-0}, 0);
121481ad6265SDimitry Andric  let Inst{63-40} = dpp8{23-0};
121581ad6265SDimitry Andric
121681ad6265SDimitry Andric  let AsmMatchConverter = "cvtDPP8";
121781ad6265SDimitry Andric  let VOPC = 1;
121881ad6265SDimitry Andric}
121981ad6265SDimitry Andric
122081ad6265SDimitry Andricclass VOPC_DPP16<bits<8> op, VOP_DPP_Pseudo ps, string opName = ps.OpName>
122181ad6265SDimitry Andric    : VOPC_DPP_Base<op, opName, ps.Pfl> {
122281ad6265SDimitry Andric  let AssemblerPredicate = HasDPP16;
122381ad6265SDimitry Andric  let SubtargetPredicate = HasDPP16;
122481ad6265SDimitry Andric  let hasSideEffects = ps.hasSideEffects;
122581ad6265SDimitry Andric  let Defs = ps.Defs;
122681ad6265SDimitry Andric  let SchedRW = ps.SchedRW;
122781ad6265SDimitry Andric  let Uses = ps.Uses;
122881ad6265SDimitry Andric  let OtherPredicates = ps.OtherPredicates;
122981ad6265SDimitry Andric  let Constraints = ps.Constraints;
123081ad6265SDimitry Andric}
123181ad6265SDimitry Andric
123281ad6265SDimitry Andricclass VOPC_DPP16_SIMC<bits<8> op, VOP_DPP_Pseudo ps, int subtarget,
123381ad6265SDimitry Andric                      string opName = ps.OpName>
123481ad6265SDimitry Andric    : VOPC_DPP16<op, ps, opName>, SIMCInstr<ps.PseudoInstr, subtarget>;
123581ad6265SDimitry Andric
123681ad6265SDimitry Andricclass VOPC_DPP8<bits<8> op, VOPC_Pseudo ps, string opName = ps.OpName>
123781ad6265SDimitry Andric    : VOPC_DPP8_Base<op, opName, ps.Pfl> {
123881ad6265SDimitry Andric  // Note ps is the non-dpp pseudo
123981ad6265SDimitry Andric  let hasSideEffects = ps.hasSideEffects;
124081ad6265SDimitry Andric  let Defs = ps.Defs;
124181ad6265SDimitry Andric  let SchedRW = ps.SchedRW;
124281ad6265SDimitry Andric  let Uses = ps.Uses;
124381ad6265SDimitry Andric  let OtherPredicates = ps.OtherPredicates;
124481ad6265SDimitry Andric  let Constraints = "";
124581ad6265SDimitry Andric}
124681ad6265SDimitry Andric
124781ad6265SDimitry Andric// VOPC64
124881ad6265SDimitry Andric
124981ad6265SDimitry Andricclass VOPC64_DPP_Base<bits<10> op, string OpName, VOPProfile P>
125081ad6265SDimitry Andric    : VOP3_DPP_Base<OpName, P, 1>, VOP3_DPPe_Common<op, P> {
125181ad6265SDimitry Andric  Instruction Opcode = !cast<Instruction>(NAME);
125281ad6265SDimitry Andric
125381ad6265SDimitry Andric  bits<8> src0;
125481ad6265SDimitry Andric  bits<9> dpp_ctrl;
125581ad6265SDimitry Andric  bits<1> bound_ctrl;
125681ad6265SDimitry Andric  bits<4> bank_mask;
125781ad6265SDimitry Andric  bits<4> row_mask;
125881ad6265SDimitry Andric  bit     fi;
125981ad6265SDimitry Andric
126081ad6265SDimitry Andric  let Inst{40-32} = 0xfa;
126181ad6265SDimitry Andric  let Inst{71-64} = !if(P.HasSrc0, src0{7-0}, 0);
126281ad6265SDimitry Andric  let Inst{80-72} = dpp_ctrl;
126381ad6265SDimitry Andric  let Inst{82}    = fi;
126481ad6265SDimitry Andric  let Inst{83}    = bound_ctrl;
126581ad6265SDimitry Andric  // Inst{87-84} ignored by hw
126681ad6265SDimitry Andric  let Inst{91-88} = bank_mask;
126781ad6265SDimitry Andric  let Inst{95-92} = row_mask;
126881ad6265SDimitry Andric}
126981ad6265SDimitry Andric
127081ad6265SDimitry Andricclass VOPC64_DPP16<bits<10> op, VOP_DPP_Pseudo ps, string opName = ps.OpName>
127181ad6265SDimitry Andric    : VOPC64_DPP_Base<op, opName, ps.Pfl> {
127281ad6265SDimitry Andric  let AssemblerPredicate = HasDPP16;
127381ad6265SDimitry Andric  let SubtargetPredicate = HasDPP16;
127481ad6265SDimitry Andric  let hasSideEffects = ps.hasSideEffects;
127581ad6265SDimitry Andric  let Defs = ps.Defs;
127681ad6265SDimitry Andric  let SchedRW = ps.SchedRW;
127781ad6265SDimitry Andric  let Uses = ps.Uses;
127881ad6265SDimitry Andric  let OtherPredicates = ps.OtherPredicates;
127981ad6265SDimitry Andric  let Constraints = ps.Constraints;
128081ad6265SDimitry Andric}
128181ad6265SDimitry Andric
128281ad6265SDimitry Andricclass VOPC64_DPP16_Dst<bits<10> op, VOP_DPP_Pseudo ps,
128381ad6265SDimitry Andric                       string opName = ps.OpName>
128481ad6265SDimitry Andric    : VOPC64_DPP16<op, ps, opName> {
128581ad6265SDimitry Andric  bits<8> sdst;
128681ad6265SDimitry Andric  let Inst{7-0} = sdst;
128781ad6265SDimitry Andric}
128881ad6265SDimitry Andric
128981ad6265SDimitry Andricclass VOPC64_DPP16_NoDst<bits<10> op, VOP_DPP_Pseudo ps,
129081ad6265SDimitry Andric                         string opName = ps.OpName>
129181ad6265SDimitry Andric    : VOPC64_DPP16<op, ps, opName> {
129281ad6265SDimitry Andric  let Inst{7-0} = ? ;
129381ad6265SDimitry Andric}
129481ad6265SDimitry Andric
129581ad6265SDimitry Andricclass VOPC64_DPP8_Base<bits<10> op, string OpName, VOPProfile P>
129681ad6265SDimitry Andric    : VOP3_DPP8_Base<OpName, P>, VOP3_DPPe_Common<op, P> {
129781ad6265SDimitry Andric  Instruction Opcode = !cast<Instruction>(NAME);
129881ad6265SDimitry Andric
129981ad6265SDimitry Andric  bits<8> src0;
130081ad6265SDimitry Andric  bits<24> dpp8;
130181ad6265SDimitry Andric  bits<9> fi;
130281ad6265SDimitry Andric
130381ad6265SDimitry Andric  let Inst{40-32} = fi;
130481ad6265SDimitry Andric  let Inst{71-64} = !if(P.HasSrc0, src0{7-0}, 0);
130581ad6265SDimitry Andric  let Inst{95-72} = dpp8{23-0};
130681ad6265SDimitry Andric}
130781ad6265SDimitry Andric
130881ad6265SDimitry Andricclass VOPC64_DPP8<bits<10> op, VOP_Pseudo ps, string opName = ps.OpName>
130981ad6265SDimitry Andric    : VOPC64_DPP8_Base<op, opName, ps.Pfl> {
131081ad6265SDimitry Andric  // Note ps is the non-dpp pseudo
131181ad6265SDimitry Andric  let hasSideEffects = ps.hasSideEffects;
131281ad6265SDimitry Andric  let Defs = ps.Defs;
131381ad6265SDimitry Andric  let SchedRW = ps.SchedRW;
131481ad6265SDimitry Andric  let Uses = ps.Uses;
131581ad6265SDimitry Andric  let OtherPredicates = ps.OtherPredicates;
131681ad6265SDimitry Andric}
131781ad6265SDimitry Andric
131881ad6265SDimitry Andricclass VOPC64_DPP8_Dst<bits<10> op, VOP_Pseudo ps, string opName = ps.OpName>
131981ad6265SDimitry Andric    : VOPC64_DPP8<op, ps, opName> {
132081ad6265SDimitry Andric  bits<8> sdst;
132181ad6265SDimitry Andric  let Inst{7-0} = sdst;
1322fcaf7f86SDimitry Andric  let Constraints = "";
132381ad6265SDimitry Andric}
132481ad6265SDimitry Andric
132581ad6265SDimitry Andricclass VOPC64_DPP8_NoDst<bits<10> op, VOP_Pseudo ps, string opName = ps.OpName>
132681ad6265SDimitry Andric    : VOPC64_DPP8<op, ps, opName> {
132781ad6265SDimitry Andric  let Inst{7-0} = ? ;
132881ad6265SDimitry Andric  let Constraints = "";
132981ad6265SDimitry Andric}
133081ad6265SDimitry Andric
133181ad6265SDimitry Andric//===----------------------------------------------------------------------===//
13320b57cec5SDimitry Andric// Target-specific instruction encodings.
13330b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
13340b57cec5SDimitry Andric
13350b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
13365f757f3fSDimitry Andric// GFX11, GFX12
133781ad6265SDimitry Andric//===----------------------------------------------------------------------===//
133881ad6265SDimitry Andric
13395f757f3fSDimitry Andricmulticlass VOPC_Real_Base<GFXGen Gen, bits<9> op> {
1340*0fca6ea1SDimitry Andric  let AssemblerPredicate = Gen.AssemblerPredicate, DecoderNamespace = Gen.DecoderNamespace in {
134181ad6265SDimitry Andric    defvar ps32 = !cast<VOPC_Pseudo>(NAME#"_e32");
134281ad6265SDimitry Andric    defvar ps64 = !cast<VOP3_Pseudo>(NAME#"_e64");
13435f757f3fSDimitry Andric    def _e32#Gen.Suffix : VOPC_Real<ps32, Gen.Subtarget>,
134481ad6265SDimitry Andric                          VOPCe<op{7-0}>;
13455f757f3fSDimitry Andric    def _e64#Gen.Suffix : VOP3_Real<ps64, Gen.Subtarget>,
13465f757f3fSDimitry Andric                          VOP3a_gfx11_gfx12<{0, op}, ps64.Pfl> {
134781ad6265SDimitry Andric      // Encoding used for VOPC instructions encoded as VOP3 differs from
134881ad6265SDimitry Andric      // VOP3e by destination name (sdst) as VOPC doesn't have vector dst.
134981ad6265SDimitry Andric      bits<8> sdst;
135081ad6265SDimitry Andric      let Inst{7-0} = sdst;
135181ad6265SDimitry Andric    }
135281ad6265SDimitry Andric
13535f757f3fSDimitry Andric    defm : VOPCInstAliases<NAME, !substr(Gen.Suffix,1)>;
135481ad6265SDimitry Andric
135506c3fb27SDimitry Andric    if ps32.Pfl.HasExtDPP then {
135681ad6265SDimitry Andric      defvar psDPP = !cast<VOP_DPP_Pseudo>(NAME #"_e32" #"_dpp");
135781ad6265SDimitry Andric      defvar AsmDPP = ps32.Pfl.AsmDPP16;
13585f757f3fSDimitry Andric      def _e32_dpp#Gen.Suffix : VOPC_DPP16_SIMC<op{7-0}, psDPP, Gen.Subtarget>;
13595f757f3fSDimitry Andric      def _e32_dpp_w32#Gen.Suffix : VOPC_DPP16<op{7-0}, psDPP> {
136081ad6265SDimitry Andric        let AsmString = psDPP.OpName # " vcc_lo, " # AsmDPP;
136181ad6265SDimitry Andric        let isAsmParserOnly = 1;
136281ad6265SDimitry Andric        let WaveSizePredicate = isWave32;
136381ad6265SDimitry Andric      }
13645f757f3fSDimitry Andric      def _e32_dpp_w64#Gen.Suffix : VOPC_DPP16<op{7-0}, psDPP> {
136581ad6265SDimitry Andric        let AsmString = psDPP.OpName # " vcc, " # AsmDPP;
136681ad6265SDimitry Andric        let isAsmParserOnly = 1;
136781ad6265SDimitry Andric        let WaveSizePredicate = isWave64;
136881ad6265SDimitry Andric      }
136981ad6265SDimitry Andric      defvar AsmDPP8 = ps32.Pfl.AsmDPP8;
13705f757f3fSDimitry Andric      def _e32_dpp8#Gen.Suffix : VOPC_DPP8<op{7-0}, ps32>;
13715f757f3fSDimitry Andric      def _e32_dpp8_w32#Gen.Suffix : VOPC_DPP8<op{7-0}, ps32> {
137281ad6265SDimitry Andric        let AsmString = ps32.OpName # " vcc_lo, " # AsmDPP8;
137381ad6265SDimitry Andric        let isAsmParserOnly = 1;
137481ad6265SDimitry Andric        let WaveSizePredicate = isWave32;
137581ad6265SDimitry Andric      }
13765f757f3fSDimitry Andric      def _e32_dpp8_w64#Gen.Suffix : VOPC_DPP8<op{7-0}, ps32> {
137781ad6265SDimitry Andric        let AsmString = ps32.OpName # " vcc, " # AsmDPP8;
137881ad6265SDimitry Andric        let isAsmParserOnly = 1;
137981ad6265SDimitry Andric        let WaveSizePredicate = isWave64;
138081ad6265SDimitry Andric      }
138181ad6265SDimitry Andric    }
138206c3fb27SDimitry Andric    if ps64.Pfl.HasExtVOP3DPP then {
138381ad6265SDimitry Andric      defvar psDPP = !cast<VOP_DPP_Pseudo>(NAME #"_e64" #"_dpp");
13845f757f3fSDimitry Andric      def _e64_dpp#Gen.Suffix : VOPC64_DPP16_Dst<{0, op}, psDPP>,
13855f757f3fSDimitry Andric                                SIMCInstr<psDPP.PseudoInstr, Gen.Subtarget>;
13865f757f3fSDimitry Andric      def _e64_dpp8#Gen.Suffix : VOPC64_DPP8_Dst<{0, op}, ps64>;
138781ad6265SDimitry Andric    }
1388*0fca6ea1SDimitry Andric  } // AssemblerPredicate = Gen.AssemblerPredicate, DecoderNamespace = Gen.DecoderNamespace
138981ad6265SDimitry Andric}
139081ad6265SDimitry Andric
13915f757f3fSDimitry Andricmulticlass VOPC_Real_with_name<GFXGen Gen, bits<9> op, string OpName,
1392bdd1243dSDimitry Andric                               string asm_name, string pseudo_mnemonic = ""> {
139381ad6265SDimitry Andric  defvar ps32 = !cast<VOPC_Pseudo>(OpName#"_e32");
139481ad6265SDimitry Andric  defvar ps64 = !cast<VOP3_Pseudo>(OpName#"_e64");
1395*0fca6ea1SDimitry Andric  let AssemblerPredicate = Gen.AssemblerPredicate in {
1396*0fca6ea1SDimitry Andric    def : AMDGPUMnemonicAlias<!if(!empty(pseudo_mnemonic), ps32.Mnemonic,
1397*0fca6ea1SDimitry Andric                                                     pseudo_mnemonic),
1398*0fca6ea1SDimitry Andric                              asm_name, ps32.AsmVariantName>;
1399*0fca6ea1SDimitry Andric    def : AMDGPUMnemonicAlias<!if(!empty(pseudo_mnemonic), ps64.Mnemonic,
1400*0fca6ea1SDimitry Andric                                                     pseudo_mnemonic),
1401*0fca6ea1SDimitry Andric                              asm_name, ps64.AsmVariantName>;
1402*0fca6ea1SDimitry Andric
14035f757f3fSDimitry Andric    let DecoderNamespace = Gen.DecoderNamespace in {
14045f757f3fSDimitry Andric      def _e32#Gen.Suffix :
140581ad6265SDimitry Andric        // 32 and 64 bit forms of the instruction have _e32 and _e64
140681ad6265SDimitry Andric        // respectively appended to their assembly mnemonic.
140781ad6265SDimitry Andric        // _e64 is printed as part of the VOPDstS64orS32 operand, whereas
140881ad6265SDimitry Andric        // the destination-less 32bit forms add it to the asmString here.
14095f757f3fSDimitry Andric        VOPC_Real<ps32, Gen.Subtarget, asm_name#"_e32">,
1410*0fca6ea1SDimitry Andric        VOPCe<op{7-0}>;
14115f757f3fSDimitry Andric      def _e64#Gen.Suffix :
1412*0fca6ea1SDimitry Andric            VOP3_Real_Gen<ps64, Gen, asm_name>,
1413*0fca6ea1SDimitry Andric            VOP3a_gfx11_gfx12<{0, op}, ps64.Pfl> {
141481ad6265SDimitry Andric        // Encoding used for VOPC instructions encoded as VOP3 differs from
141581ad6265SDimitry Andric        // VOP3e by destination name (sdst) as VOPC doesn't have vector dst.
141681ad6265SDimitry Andric        bits<8> sdst;
141781ad6265SDimitry Andric        let Inst{7-0} = sdst;
141881ad6265SDimitry Andric      }
141981ad6265SDimitry Andric
14205f757f3fSDimitry Andric      defm : VOPCInstAliases<OpName, !substr(Gen.Suffix, 1), NAME, asm_name>;
142181ad6265SDimitry Andric
142206c3fb27SDimitry Andric      if ps32.Pfl.HasExtDPP then {
142381ad6265SDimitry Andric        defvar psDPP = !cast<VOP_DPP_Pseudo>(OpName #"_e32" #"_dpp");
142481ad6265SDimitry Andric        defvar AsmDPP = ps32.Pfl.AsmDPP16;
14255f757f3fSDimitry Andric        def _e32_dpp#Gen.Suffix : VOPC_DPP16_SIMC<op{7-0}, psDPP,
14265f757f3fSDimitry Andric                                                  Gen.Subtarget, asm_name>;
14275f757f3fSDimitry Andric        def _e32_dpp_w32#Gen.Suffix
142881ad6265SDimitry Andric            : VOPC_DPP16<op{7-0}, psDPP, asm_name> {
142981ad6265SDimitry Andric          let AsmString = asm_name # " vcc_lo, " # AsmDPP;
143081ad6265SDimitry Andric          let isAsmParserOnly = 1;
143181ad6265SDimitry Andric          let WaveSizePredicate = isWave32;
143281ad6265SDimitry Andric        }
14335f757f3fSDimitry Andric        def _e32_dpp_w64#Gen.Suffix
143481ad6265SDimitry Andric            : VOPC_DPP16<op{7-0}, psDPP, asm_name> {
143581ad6265SDimitry Andric          let AsmString = asm_name # " vcc, " # AsmDPP;
143681ad6265SDimitry Andric          let isAsmParserOnly = 1;
143781ad6265SDimitry Andric          let WaveSizePredicate = isWave64;
143881ad6265SDimitry Andric        }
143981ad6265SDimitry Andric        defvar AsmDPP8 = ps32.Pfl.AsmDPP8;
14405f757f3fSDimitry Andric        def _e32_dpp8#Gen.Suffix : VOPC_DPP8<op{7-0}, ps32, asm_name>;
14415f757f3fSDimitry Andric        def _e32_dpp8_w32#Gen.Suffix
144281ad6265SDimitry Andric            : VOPC_DPP8<op{7-0}, ps32, asm_name> {
144381ad6265SDimitry Andric          let AsmString = asm_name # " vcc_lo, " # AsmDPP8;
144481ad6265SDimitry Andric          let isAsmParserOnly = 1;
144581ad6265SDimitry Andric          let WaveSizePredicate = isWave32;
144681ad6265SDimitry Andric        }
14475f757f3fSDimitry Andric        def _e32_dpp8_w64#Gen.Suffix
144881ad6265SDimitry Andric            : VOPC_DPP8<op{7-0}, ps32, asm_name> {
144981ad6265SDimitry Andric          let AsmString = asm_name # " vcc, " # AsmDPP8;
145081ad6265SDimitry Andric          let isAsmParserOnly = 1;
145181ad6265SDimitry Andric          let WaveSizePredicate = isWave64;
145281ad6265SDimitry Andric        }
145381ad6265SDimitry Andric      }
145481ad6265SDimitry Andric
145506c3fb27SDimitry Andric      if ps64.Pfl.HasExtVOP3DPP then {
145681ad6265SDimitry Andric        defvar psDPP = !cast<VOP_DPP_Pseudo>(OpName #"_e64" #"_dpp");
14575f757f3fSDimitry Andric        def _e64_dpp#Gen.Suffix : VOPC64_DPP16_Dst<{0, op}, psDPP, asm_name>,
14585f757f3fSDimitry Andric                                  SIMCInstr<psDPP.PseudoInstr, Gen.Subtarget>;
14595f757f3fSDimitry Andric        def _e64_dpp8#Gen.Suffix : VOPC64_DPP8_Dst<{0, op}, ps64, asm_name>;
1460*0fca6ea1SDimitry Andric      } // end if ps64.Pfl.HasExtVOP3DPP
1461*0fca6ea1SDimitry Andric    } // End DecoderNamespace
1462*0fca6ea1SDimitry Andric  } // End AssemblerPredicate
146381ad6265SDimitry Andric}
146481ad6265SDimitry Andric
14655f757f3fSDimitry Andricmulticlass VOPC_Real_t16<GFXGen Gen, bits<9> op, string asm_name,
14665f757f3fSDimitry Andric                         string OpName = NAME, string pseudo_mnemonic = ""> :
14675f757f3fSDimitry Andric  VOPC_Real_with_name<Gen, op, OpName, asm_name, pseudo_mnemonic>;
1468bdd1243dSDimitry Andric
14695f757f3fSDimitry Andricmulticlass VOPCX_Real<GFXGen Gen, bits<9> op> {
1470*0fca6ea1SDimitry Andric  let AssemblerPredicate = Gen.AssemblerPredicate, DecoderNamespace = Gen.DecoderNamespace in {
147181ad6265SDimitry Andric    defvar ps32 = !cast<VOPC_Pseudo>(NAME#"_nosdst_e32");
147281ad6265SDimitry Andric    defvar ps64 = !cast<VOP3_Pseudo>(NAME#"_nosdst_e64");
14735f757f3fSDimitry Andric    def _e32#Gen.Suffix :
14745f757f3fSDimitry Andric      VOPC_Real<ps32, Gen.Subtarget>,
147581ad6265SDimitry Andric      VOPCe<op{7-0}> {
147681ad6265SDimitry Andric        let AsmString = !subst("_nosdst", "", ps32.PseudoInstr)
147781ad6265SDimitry Andric                        # " " # ps32.AsmOperands;
147881ad6265SDimitry Andric    }
14795f757f3fSDimitry Andric    def _e64#Gen.Suffix :
14805f757f3fSDimitry Andric      VOP3_Real<ps64, Gen.Subtarget>,
14815f757f3fSDimitry Andric      VOP3a_gfx11_gfx12<{0, op}, ps64.Pfl> {
148281ad6265SDimitry Andric        let Inst{7-0} = ?; // sdst
148381ad6265SDimitry Andric        let AsmString = !subst("_nosdst", "", ps64.Mnemonic)
148481ad6265SDimitry Andric                        # "{_e64} " # ps64.AsmOperands;
148581ad6265SDimitry Andric    }
148681ad6265SDimitry Andric
14875f757f3fSDimitry Andric    defm : VOPCXInstAliases<NAME, !substr(Gen.Suffix, 1)>;
148881ad6265SDimitry Andric
148906c3fb27SDimitry Andric    if ps32.Pfl.HasExtDPP then {
149081ad6265SDimitry Andric      defvar psDPP = !cast<VOP_DPP_Pseudo>(NAME #"_nosdst_e32" #"_dpp");
149181ad6265SDimitry Andric      defvar AsmDPP = ps32.Pfl.AsmDPP16;
14925f757f3fSDimitry Andric      def _e32_dpp#Gen.Suffix
14935f757f3fSDimitry Andric          : VOPC_DPP16_SIMC<op{7-0}, psDPP, Gen.Subtarget> {
149481ad6265SDimitry Andric        let AsmString = !subst("_nosdst", "", psDPP.OpName) # " " # AsmDPP;
149581ad6265SDimitry Andric      }
149681ad6265SDimitry Andric      defvar AsmDPP8 = ps32.Pfl.AsmDPP8;
14975f757f3fSDimitry Andric      def _e32_dpp8#Gen.Suffix : VOPC_DPP8<op{7-0}, ps32> {
149881ad6265SDimitry Andric        let AsmString = !subst("_nosdst", "", ps32.OpName) # " " # AsmDPP8;
149981ad6265SDimitry Andric      }
150081ad6265SDimitry Andric    }
150181ad6265SDimitry Andric
150206c3fb27SDimitry Andric    if ps64.Pfl.HasExtVOP3DPP then {
150381ad6265SDimitry Andric      defvar psDPP = !cast<VOP_DPP_Pseudo>(NAME #"_nosdst_e64" #"_dpp");
150481ad6265SDimitry Andric      defvar AsmDPP = ps64.Pfl.AsmVOP3DPP16;
15055f757f3fSDimitry Andric      def _e64_dpp#Gen.Suffix
150681ad6265SDimitry Andric          : VOPC64_DPP16_NoDst<{0, op}, psDPP>,
15075f757f3fSDimitry Andric            SIMCInstr<psDPP.PseudoInstr, Gen.Subtarget> {
150881ad6265SDimitry Andric        let AsmString = !subst("_nosdst", "", psDPP.OpName)
150981ad6265SDimitry Andric                        # "{_e64_dpp} " # AsmDPP;
151081ad6265SDimitry Andric      }
151181ad6265SDimitry Andric      defvar AsmDPP8 = ps64.Pfl.AsmVOP3DPP8;
15125f757f3fSDimitry Andric      def _e64_dpp8#Gen.Suffix : VOPC64_DPP8_NoDst<{0, op}, ps64> {
151381ad6265SDimitry Andric        let AsmString = !subst("_nosdst", "", ps64.OpName)
151481ad6265SDimitry Andric                        # "{_e64_dpp} " # AsmDPP8;
151581ad6265SDimitry Andric      }
151681ad6265SDimitry Andric    }
1517*0fca6ea1SDimitry Andric  } // End AssemblerPredicate = Gen.AssemblerPredicate, DecoderNamespace = Gen.DecoderNamespace
151881ad6265SDimitry Andric}
151981ad6265SDimitry Andric
15205f757f3fSDimitry Andricmulticlass VOPCX_Real_with_name<GFXGen Gen, bits<9> op, string OpName,
1521bdd1243dSDimitry Andric      string asm_name, string pseudo_mnemonic = ""> {
152281ad6265SDimitry Andric  defvar ps32 = !cast<VOPC_Pseudo>(OpName#"_nosdst_e32");
152381ad6265SDimitry Andric  defvar ps64 = !cast<VOP3_Pseudo>(OpName#"_nosdst_e64");
1524*0fca6ea1SDimitry Andric  let AssemblerPredicate = Gen.AssemblerPredicate in {
1525*0fca6ea1SDimitry Andric    def : AMDGPUMnemonicAlias<!if(!empty(pseudo_mnemonic), !subst("_nosdst", "", ps32.Mnemonic),
1526*0fca6ea1SDimitry Andric                                                     pseudo_mnemonic),
1527*0fca6ea1SDimitry Andric                              asm_name, ps32.AsmVariantName>;
1528*0fca6ea1SDimitry Andric    def : AMDGPUMnemonicAlias<!if(!empty(pseudo_mnemonic), !subst("_nosdst", "", ps64.Mnemonic),
1529*0fca6ea1SDimitry Andric                                                     pseudo_mnemonic),
1530*0fca6ea1SDimitry Andric                              asm_name, ps64.AsmVariantName>;
1531*0fca6ea1SDimitry Andric
15325f757f3fSDimitry Andric    let DecoderNamespace = Gen.DecoderNamespace in {
15335f757f3fSDimitry Andric      def _e32#Gen.Suffix
15345f757f3fSDimitry Andric          : VOPC_Real<ps32, Gen.Subtarget, asm_name>,
153581ad6265SDimitry Andric            VOPCe<op{7-0}> {
153681ad6265SDimitry Andric        let AsmString = asm_name # "{_e32} " # ps32.AsmOperands;
153781ad6265SDimitry Andric      }
15385f757f3fSDimitry Andric      def _e64#Gen.Suffix
1539*0fca6ea1SDimitry Andric          : VOP3_Real_Gen<ps64, Gen, asm_name>,
15405f757f3fSDimitry Andric            VOP3a_gfx11_gfx12<{0, op}, ps64.Pfl> {
154181ad6265SDimitry Andric        let Inst{7-0} = ? ; // sdst
154281ad6265SDimitry Andric        let AsmString = asm_name # "{_e64} " # ps64.AsmOperands;
154381ad6265SDimitry Andric      }
154481ad6265SDimitry Andric
15455f757f3fSDimitry Andric      defm : VOPCXInstAliases<OpName, !substr(Gen.Suffix, 1), NAME, asm_name>;
154681ad6265SDimitry Andric
154706c3fb27SDimitry Andric      if ps32.Pfl.HasExtDPP then {
154881ad6265SDimitry Andric        defvar psDPP = !cast<VOP_DPP_Pseudo>(OpName#"_nosdst_e32"#"_dpp");
15495f757f3fSDimitry Andric        def _e32_dpp#Gen.Suffix : VOPC_DPP16_SIMC<op{7-0}, psDPP,
15505f757f3fSDimitry Andric                                              Gen.Subtarget, asm_name>;
15515f757f3fSDimitry Andric        def _e32_dpp8#Gen.Suffix : VOPC_DPP8<op{7-0}, ps32, asm_name>;
155281ad6265SDimitry Andric      }
155306c3fb27SDimitry Andric      if ps64.Pfl.HasExtVOP3DPP then {
155481ad6265SDimitry Andric        defvar psDPP = !cast<VOP_DPP_Pseudo>(OpName#"_nosdst_e64"#"_dpp");
155581ad6265SDimitry Andric        defvar AsmDPP = ps64.Pfl.AsmVOP3DPP16;
15565f757f3fSDimitry Andric        def _e64_dpp#Gen.Suffix
155781ad6265SDimitry Andric            : VOPC64_DPP16_NoDst<{0, op}, psDPP, asm_name>,
15585f757f3fSDimitry Andric              SIMCInstr<psDPP.PseudoInstr, Gen.Subtarget> {
155981ad6265SDimitry Andric          let AsmString = asm_name # "{_e64_dpp} " # AsmDPP;
156081ad6265SDimitry Andric        }
156181ad6265SDimitry Andric        defvar AsmDPP8 = ps64.Pfl.AsmVOP3DPP8;
15625f757f3fSDimitry Andric        def _e64_dpp8#Gen.Suffix : VOPC64_DPP8_NoDst<{0, op}, ps64, asm_name> {
156381ad6265SDimitry Andric          let AsmString = asm_name # "{_e64_dpp} " # AsmDPP8;
156481ad6265SDimitry Andric        }
1565*0fca6ea1SDimitry Andric      } // End if ps64.Pfl.HasExtVOP3DPP
1566*0fca6ea1SDimitry Andric    } // End DecoderNamespace
1567*0fca6ea1SDimitry Andric  } // End AssemblerPredicate
156881ad6265SDimitry Andric}
1569bdd1243dSDimitry Andric
15705f757f3fSDimitry Andricmulticlass VOPCX_Real_t16<GFXGen Gen, bits<9> op, string asm_name,
15715f757f3fSDimitry Andric      string OpName = NAME, string pseudo_mnemonic = ""> :
15725f757f3fSDimitry Andric  VOPCX_Real_with_name<Gen, op, OpName, asm_name, pseudo_mnemonic>;
15735f757f3fSDimitry Andric
15745f757f3fSDimitry Andricmulticlass VOPC_Real_gfx11<bits<9> op> : VOPC_Real_Base<GFX11Gen, op>;
15755f757f3fSDimitry Andric
15765f757f3fSDimitry Andricmulticlass VOPC_Real_with_name_gfx11<bits<9> op, string OpName, string asm_name,
15775f757f3fSDimitry Andric                                     string pseudo_mnemonic = "">
15785f757f3fSDimitry Andric  : VOPC_Real_with_name<GFX11Gen, op, OpName, asm_name, pseudo_mnemonic>;
15795f757f3fSDimitry Andric
15805f757f3fSDimitry Andricmulticlass VOPCX_Real_gfx11<bits<9> op> : VOPCX_Real<GFX11Gen, op>;
15815f757f3fSDimitry Andric
15825f757f3fSDimitry Andricmulticlass VOPCX_Real_with_name_gfx11<bits<9> op, string OpName,
15835f757f3fSDimitry Andric    string asm_name, string pseudo_mnemonic = ""> :
15845f757f3fSDimitry Andric  VOPCX_Real_with_name<GFX11Gen, op, OpName, asm_name, pseudo_mnemonic>;
15855f757f3fSDimitry Andric
15865f757f3fSDimitry Andricmulticlass VOPC_Real_gfx11_gfx12<bits<9> op> :
15875f757f3fSDimitry Andric  VOPC_Real_Base<GFX11Gen, op>, VOPC_Real_Base<GFX12Gen, op>;
15885f757f3fSDimitry Andric
15895f757f3fSDimitry Andricmulticlass VOPCX_Real_gfx11_gfx12<bits<9> op> :
15905f757f3fSDimitry Andric  VOPCX_Real<GFX11Gen, op>, VOPCX_Real<GFX12Gen, op>;
15915f757f3fSDimitry Andric
15925f757f3fSDimitry Andricmulticlass VOPC_Real_t16_gfx11<bits <9> op, string asm_name,
15935f757f3fSDimitry Andric    string OpName = NAME, string pseudo_mnemonic = ""> :
15945f757f3fSDimitry Andric  VOPC_Real_t16<GFX11Gen, op, asm_name, OpName, pseudo_mnemonic>;
15955f757f3fSDimitry Andric
15965f757f3fSDimitry Andricmulticlass VOPC_Real_t16_gfx11_gfx12<bits <9> op, string asm_name,
15975f757f3fSDimitry Andric    string OpName = NAME, string pseudo_mnemonic = ""> :
15985f757f3fSDimitry Andric  VOPC_Real_t16<GFX11Gen, op, asm_name, OpName, pseudo_mnemonic>,
15995f757f3fSDimitry Andric  VOPC_Real_t16<GFX12Gen, op, asm_name, OpName, pseudo_mnemonic>;
16005f757f3fSDimitry Andric
1601bdd1243dSDimitry Andricmulticlass VOPCX_Real_t16_gfx11<bits<9> op, string asm_name,
16025f757f3fSDimitry Andric    string OpName = NAME, string pseudo_mnemonic = ""> :
16035f757f3fSDimitry Andric  VOPCX_Real_t16<GFX11Gen, op, asm_name, OpName, pseudo_mnemonic>;
1604bdd1243dSDimitry Andric
16055f757f3fSDimitry Andricmulticlass VOPCX_Real_t16_gfx11_gfx12<bits<9> op, string asm_name,
16065f757f3fSDimitry Andric    string OpName = NAME, string pseudo_mnemonic = ""> :
16075f757f3fSDimitry Andric  VOPCX_Real_t16<GFX11Gen, op, asm_name, OpName, pseudo_mnemonic>,
16085f757f3fSDimitry Andric  VOPCX_Real_t16<GFX12Gen, op, asm_name, OpName, pseudo_mnemonic>;
160981ad6265SDimitry Andric
1610bdd1243dSDimitry Andricdefm V_CMP_F_F16_t16      : VOPC_Real_t16_gfx11<0x000, "v_cmp_f_f16">;
16115f757f3fSDimitry Andricdefm V_CMP_LT_F16_t16     : VOPC_Real_t16_gfx11_gfx12<0x001, "v_cmp_lt_f16">;
16125f757f3fSDimitry Andricdefm V_CMP_EQ_F16_t16     : VOPC_Real_t16_gfx11_gfx12<0x002, "v_cmp_eq_f16">;
16135f757f3fSDimitry Andricdefm V_CMP_LE_F16_t16     : VOPC_Real_t16_gfx11_gfx12<0x003, "v_cmp_le_f16">;
16145f757f3fSDimitry Andricdefm V_CMP_GT_F16_t16     : VOPC_Real_t16_gfx11_gfx12<0x004, "v_cmp_gt_f16">;
16155f757f3fSDimitry Andricdefm V_CMP_LG_F16_t16     : VOPC_Real_t16_gfx11_gfx12<0x005, "v_cmp_lg_f16">;
16165f757f3fSDimitry Andricdefm V_CMP_GE_F16_t16     : VOPC_Real_t16_gfx11_gfx12<0x006, "v_cmp_ge_f16">;
16175f757f3fSDimitry Andricdefm V_CMP_O_F16_t16      : VOPC_Real_t16_gfx11_gfx12<0x007, "v_cmp_o_f16">;
16185f757f3fSDimitry Andricdefm V_CMP_U_F16_t16      : VOPC_Real_t16_gfx11_gfx12<0x008, "v_cmp_u_f16">;
16195f757f3fSDimitry Andricdefm V_CMP_NGE_F16_t16    : VOPC_Real_t16_gfx11_gfx12<0x009, "v_cmp_nge_f16">;
16205f757f3fSDimitry Andricdefm V_CMP_NLG_F16_t16    : VOPC_Real_t16_gfx11_gfx12<0x00a, "v_cmp_nlg_f16">;
16215f757f3fSDimitry Andricdefm V_CMP_NGT_F16_t16    : VOPC_Real_t16_gfx11_gfx12<0x00b, "v_cmp_ngt_f16">;
16225f757f3fSDimitry Andricdefm V_CMP_NLE_F16_t16    : VOPC_Real_t16_gfx11_gfx12<0x00c, "v_cmp_nle_f16">;
16235f757f3fSDimitry Andricdefm V_CMP_NEQ_F16_t16    : VOPC_Real_t16_gfx11_gfx12<0x00d, "v_cmp_neq_f16">;
16245f757f3fSDimitry Andricdefm V_CMP_NLT_F16_t16    : VOPC_Real_t16_gfx11_gfx12<0x00e, "v_cmp_nlt_f16">;
1625bdd1243dSDimitry Andricdefm V_CMP_T_F16_t16      : VOPC_Real_with_name_gfx11<0x00f, "V_CMP_TRU_F16_t16", "v_cmp_t_f16", "v_cmp_tru_f16">;
162681ad6265SDimitry Andricdefm V_CMP_F_F32      : VOPC_Real_gfx11<0x010>;
16275f757f3fSDimitry Andricdefm V_CMP_LT_F32     : VOPC_Real_gfx11_gfx12<0x011>;
16285f757f3fSDimitry Andricdefm V_CMP_EQ_F32     : VOPC_Real_gfx11_gfx12<0x012>;
16295f757f3fSDimitry Andricdefm V_CMP_LE_F32     : VOPC_Real_gfx11_gfx12<0x013>;
16305f757f3fSDimitry Andricdefm V_CMP_GT_F32     : VOPC_Real_gfx11_gfx12<0x014>;
16315f757f3fSDimitry Andricdefm V_CMP_LG_F32     : VOPC_Real_gfx11_gfx12<0x015>;
16325f757f3fSDimitry Andricdefm V_CMP_GE_F32     : VOPC_Real_gfx11_gfx12<0x016>;
16335f757f3fSDimitry Andricdefm V_CMP_O_F32      : VOPC_Real_gfx11_gfx12<0x017>;
16345f757f3fSDimitry Andricdefm V_CMP_U_F32      : VOPC_Real_gfx11_gfx12<0x018>;
16355f757f3fSDimitry Andricdefm V_CMP_NGE_F32    : VOPC_Real_gfx11_gfx12<0x019>;
16365f757f3fSDimitry Andricdefm V_CMP_NLG_F32    : VOPC_Real_gfx11_gfx12<0x01a>;
16375f757f3fSDimitry Andricdefm V_CMP_NGT_F32    : VOPC_Real_gfx11_gfx12<0x01b>;
16385f757f3fSDimitry Andricdefm V_CMP_NLE_F32    : VOPC_Real_gfx11_gfx12<0x01c>;
16395f757f3fSDimitry Andricdefm V_CMP_NEQ_F32    : VOPC_Real_gfx11_gfx12<0x01d>;
16405f757f3fSDimitry Andricdefm V_CMP_NLT_F32    : VOPC_Real_gfx11_gfx12<0x01e>;
164181ad6265SDimitry Andricdefm V_CMP_T_F32      : VOPC_Real_with_name_gfx11<0x01f, "V_CMP_TRU_F32", "v_cmp_t_f32">;
164281ad6265SDimitry Andricdefm V_CMP_T_F64      : VOPC_Real_with_name_gfx11<0x02f, "V_CMP_TRU_F64", "v_cmp_t_f64">;
16435f757f3fSDimitry Andricdefm V_CMP_LT_I16_t16     : VOPC_Real_t16_gfx11_gfx12<0x031, "v_cmp_lt_i16">;
16445f757f3fSDimitry Andricdefm V_CMP_EQ_I16_t16     : VOPC_Real_t16_gfx11_gfx12<0x032, "v_cmp_eq_i16">;
16455f757f3fSDimitry Andricdefm V_CMP_LE_I16_t16     : VOPC_Real_t16_gfx11_gfx12<0x033, "v_cmp_le_i16">;
16465f757f3fSDimitry Andricdefm V_CMP_GT_I16_t16     : VOPC_Real_t16_gfx11_gfx12<0x034, "v_cmp_gt_i16">;
16475f757f3fSDimitry Andricdefm V_CMP_NE_I16_t16     : VOPC_Real_t16_gfx11_gfx12<0x035, "v_cmp_ne_i16">;
16485f757f3fSDimitry Andricdefm V_CMP_GE_I16_t16     : VOPC_Real_t16_gfx11_gfx12<0x036, "v_cmp_ge_i16">;
16495f757f3fSDimitry Andricdefm V_CMP_LT_U16_t16     : VOPC_Real_t16_gfx11_gfx12<0x039, "v_cmp_lt_u16">;
16505f757f3fSDimitry Andricdefm V_CMP_EQ_U16_t16     : VOPC_Real_t16_gfx11_gfx12<0x03a, "v_cmp_eq_u16">;
16515f757f3fSDimitry Andricdefm V_CMP_LE_U16_t16     : VOPC_Real_t16_gfx11_gfx12<0x03b, "v_cmp_le_u16">;
16525f757f3fSDimitry Andricdefm V_CMP_GT_U16_t16     : VOPC_Real_t16_gfx11_gfx12<0x03c, "v_cmp_gt_u16">;
16535f757f3fSDimitry Andricdefm V_CMP_NE_U16_t16     : VOPC_Real_t16_gfx11_gfx12<0x03d, "v_cmp_ne_u16">;
16545f757f3fSDimitry Andricdefm V_CMP_GE_U16_t16     : VOPC_Real_t16_gfx11_gfx12<0x03e, "v_cmp_ge_u16">;
165581ad6265SDimitry Andricdefm V_CMP_F_I32      : VOPC_Real_gfx11<0x040>;
16565f757f3fSDimitry Andricdefm V_CMP_LT_I32     : VOPC_Real_gfx11_gfx12<0x041>;
16575f757f3fSDimitry Andricdefm V_CMP_EQ_I32     : VOPC_Real_gfx11_gfx12<0x042>;
16585f757f3fSDimitry Andricdefm V_CMP_LE_I32     : VOPC_Real_gfx11_gfx12<0x043>;
16595f757f3fSDimitry Andricdefm V_CMP_GT_I32     : VOPC_Real_gfx11_gfx12<0x044>;
16605f757f3fSDimitry Andricdefm V_CMP_NE_I32     : VOPC_Real_gfx11_gfx12<0x045>;
16615f757f3fSDimitry Andricdefm V_CMP_GE_I32     : VOPC_Real_gfx11_gfx12<0x046>;
166281ad6265SDimitry Andricdefm V_CMP_T_I32      : VOPC_Real_gfx11<0x047>;
166381ad6265SDimitry Andricdefm V_CMP_F_U32      : VOPC_Real_gfx11<0x048>;
16645f757f3fSDimitry Andricdefm V_CMP_LT_U32     : VOPC_Real_gfx11_gfx12<0x049>;
16655f757f3fSDimitry Andricdefm V_CMP_EQ_U32     : VOPC_Real_gfx11_gfx12<0x04a>;
16665f757f3fSDimitry Andricdefm V_CMP_LE_U32     : VOPC_Real_gfx11_gfx12<0x04b>;
16675f757f3fSDimitry Andricdefm V_CMP_GT_U32     : VOPC_Real_gfx11_gfx12<0x04c>;
16685f757f3fSDimitry Andricdefm V_CMP_NE_U32     : VOPC_Real_gfx11_gfx12<0x04d>;
16695f757f3fSDimitry Andricdefm V_CMP_GE_U32     : VOPC_Real_gfx11_gfx12<0x04e>;
167081ad6265SDimitry Andricdefm V_CMP_T_U32      : VOPC_Real_gfx11<0x04f>;
167181ad6265SDimitry Andric
167281ad6265SDimitry Andricdefm V_CMP_F_I64      : VOPC_Real_gfx11<0x050>;
16735f757f3fSDimitry Andricdefm V_CMP_LT_I64     : VOPC_Real_gfx11_gfx12<0x051>;
16745f757f3fSDimitry Andricdefm V_CMP_EQ_I64     : VOPC_Real_gfx11_gfx12<0x052>;
16755f757f3fSDimitry Andricdefm V_CMP_LE_I64     : VOPC_Real_gfx11_gfx12<0x053>;
16765f757f3fSDimitry Andricdefm V_CMP_GT_I64     : VOPC_Real_gfx11_gfx12<0x054>;
16775f757f3fSDimitry Andricdefm V_CMP_NE_I64     : VOPC_Real_gfx11_gfx12<0x055>;
16785f757f3fSDimitry Andricdefm V_CMP_GE_I64     : VOPC_Real_gfx11_gfx12<0x056>;
167981ad6265SDimitry Andricdefm V_CMP_T_I64      : VOPC_Real_gfx11<0x057>;
168081ad6265SDimitry Andricdefm V_CMP_F_U64      : VOPC_Real_gfx11<0x058>;
16815f757f3fSDimitry Andricdefm V_CMP_LT_U64     : VOPC_Real_gfx11_gfx12<0x059>;
16825f757f3fSDimitry Andricdefm V_CMP_EQ_U64     : VOPC_Real_gfx11_gfx12<0x05a>;
16835f757f3fSDimitry Andricdefm V_CMP_LE_U64     : VOPC_Real_gfx11_gfx12<0x05b>;
16845f757f3fSDimitry Andricdefm V_CMP_GT_U64     : VOPC_Real_gfx11_gfx12<0x05c>;
16855f757f3fSDimitry Andricdefm V_CMP_NE_U64     : VOPC_Real_gfx11_gfx12<0x05d>;
16865f757f3fSDimitry Andricdefm V_CMP_GE_U64     : VOPC_Real_gfx11_gfx12<0x05e>;
168781ad6265SDimitry Andricdefm V_CMP_T_U64      : VOPC_Real_gfx11<0x05f>;
168881ad6265SDimitry Andric
16895f757f3fSDimitry Andricdefm V_CMP_CLASS_F16_t16 : VOPC_Real_t16_gfx11_gfx12<0x07d, "v_cmp_class_f16">;
16905f757f3fSDimitry Andricdefm V_CMP_CLASS_F32     : VOPC_Real_gfx11_gfx12<0x07e>;
16915f757f3fSDimitry Andricdefm V_CMP_CLASS_F64     : VOPC_Real_gfx11_gfx12<0x07f>;
169281ad6265SDimitry Andric
1693bdd1243dSDimitry Andricdefm V_CMPX_F_F16_t16     : VOPCX_Real_t16_gfx11<0x080, "v_cmpx_f_f16">;
16945f757f3fSDimitry Andricdefm V_CMPX_LT_F16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x081, "v_cmpx_lt_f16">;
16955f757f3fSDimitry Andricdefm V_CMPX_EQ_F16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x082, "v_cmpx_eq_f16">;
16965f757f3fSDimitry Andricdefm V_CMPX_LE_F16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x083, "v_cmpx_le_f16">;
16975f757f3fSDimitry Andricdefm V_CMPX_GT_F16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x084, "v_cmpx_gt_f16">;
16985f757f3fSDimitry Andricdefm V_CMPX_LG_F16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x085, "v_cmpx_lg_f16">;
16995f757f3fSDimitry Andricdefm V_CMPX_GE_F16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x086, "v_cmpx_ge_f16">;
17005f757f3fSDimitry Andricdefm V_CMPX_O_F16_t16     : VOPCX_Real_t16_gfx11_gfx12<0x087, "v_cmpx_o_f16">;
17015f757f3fSDimitry Andricdefm V_CMPX_U_F16_t16     : VOPCX_Real_t16_gfx11_gfx12<0x088, "v_cmpx_u_f16">;
17025f757f3fSDimitry Andricdefm V_CMPX_NGE_F16_t16   : VOPCX_Real_t16_gfx11_gfx12<0x089, "v_cmpx_nge_f16">;
17035f757f3fSDimitry Andricdefm V_CMPX_NLG_F16_t16   : VOPCX_Real_t16_gfx11_gfx12<0x08a, "v_cmpx_nlg_f16">;
17045f757f3fSDimitry Andricdefm V_CMPX_NGT_F16_t16   : VOPCX_Real_t16_gfx11_gfx12<0x08b, "v_cmpx_ngt_f16">;
17055f757f3fSDimitry Andricdefm V_CMPX_NLE_F16_t16   : VOPCX_Real_t16_gfx11_gfx12<0x08c, "v_cmpx_nle_f16">;
17065f757f3fSDimitry Andricdefm V_CMPX_NEQ_F16_t16   : VOPCX_Real_t16_gfx11_gfx12<0x08d, "v_cmpx_neq_f16">;
17075f757f3fSDimitry Andricdefm V_CMPX_NLT_F16_t16   : VOPCX_Real_t16_gfx11_gfx12<0x08e, "v_cmpx_nlt_f16">;
1708bdd1243dSDimitry Andricdefm V_CMPX_T_F16_t16     : VOPCX_Real_with_name_gfx11<0x08f, "V_CMPX_TRU_F16_t16", "v_cmpx_t_f16", "v_cmpx_tru_f16">;
170981ad6265SDimitry Andricdefm V_CMPX_F_F32     : VOPCX_Real_gfx11<0x090>;
17105f757f3fSDimitry Andricdefm V_CMPX_LT_F32    : VOPCX_Real_gfx11_gfx12<0x091>;
17115f757f3fSDimitry Andricdefm V_CMPX_EQ_F32    : VOPCX_Real_gfx11_gfx12<0x092>;
17125f757f3fSDimitry Andricdefm V_CMPX_LE_F32    : VOPCX_Real_gfx11_gfx12<0x093>;
17135f757f3fSDimitry Andricdefm V_CMPX_GT_F32    : VOPCX_Real_gfx11_gfx12<0x094>;
17145f757f3fSDimitry Andricdefm V_CMPX_LG_F32    : VOPCX_Real_gfx11_gfx12<0x095>;
17155f757f3fSDimitry Andricdefm V_CMPX_GE_F32    : VOPCX_Real_gfx11_gfx12<0x096>;
17165f757f3fSDimitry Andricdefm V_CMPX_O_F32     : VOPCX_Real_gfx11_gfx12<0x097>;
17175f757f3fSDimitry Andricdefm V_CMPX_U_F32     : VOPCX_Real_gfx11_gfx12<0x098>;
17185f757f3fSDimitry Andricdefm V_CMPX_NGE_F32   : VOPCX_Real_gfx11_gfx12<0x099>;
17195f757f3fSDimitry Andricdefm V_CMPX_NLG_F32   : VOPCX_Real_gfx11_gfx12<0x09a>;
17205f757f3fSDimitry Andricdefm V_CMPX_NGT_F32   : VOPCX_Real_gfx11_gfx12<0x09b>;
17215f757f3fSDimitry Andricdefm V_CMPX_NLE_F32   : VOPCX_Real_gfx11_gfx12<0x09c>;
17225f757f3fSDimitry Andricdefm V_CMPX_NEQ_F32   : VOPCX_Real_gfx11_gfx12<0x09d>;
17235f757f3fSDimitry Andricdefm V_CMPX_NLT_F32   : VOPCX_Real_gfx11_gfx12<0x09e>;
172481ad6265SDimitry Andricdefm V_CMPX_T_F32     : VOPCX_Real_with_name_gfx11<0x09f, "V_CMPX_TRU_F32", "v_cmpx_t_f32">;
172581ad6265SDimitry Andric
172681ad6265SDimitry Andricdefm V_CMPX_F_F64     : VOPCX_Real_gfx11<0x0a0>;
17275f757f3fSDimitry Andricdefm V_CMPX_LT_F64    : VOPCX_Real_gfx11_gfx12<0x0a1>;
17285f757f3fSDimitry Andricdefm V_CMPX_EQ_F64    : VOPCX_Real_gfx11_gfx12<0x0a2>;
17295f757f3fSDimitry Andricdefm V_CMPX_LE_F64    : VOPCX_Real_gfx11_gfx12<0x0a3>;
17305f757f3fSDimitry Andricdefm V_CMPX_GT_F64    : VOPCX_Real_gfx11_gfx12<0x0a4>;
17315f757f3fSDimitry Andricdefm V_CMPX_LG_F64    : VOPCX_Real_gfx11_gfx12<0x0a5>;
17325f757f3fSDimitry Andricdefm V_CMPX_GE_F64    : VOPCX_Real_gfx11_gfx12<0x0a6>;
17335f757f3fSDimitry Andricdefm V_CMPX_O_F64     : VOPCX_Real_gfx11_gfx12<0x0a7>;
17345f757f3fSDimitry Andricdefm V_CMPX_U_F64     : VOPCX_Real_gfx11_gfx12<0x0a8>;
17355f757f3fSDimitry Andricdefm V_CMPX_NGE_F64   : VOPCX_Real_gfx11_gfx12<0x0a9>;
17365f757f3fSDimitry Andricdefm V_CMPX_NLG_F64   : VOPCX_Real_gfx11_gfx12<0x0aa>;
17375f757f3fSDimitry Andricdefm V_CMPX_NGT_F64   : VOPCX_Real_gfx11_gfx12<0x0ab>;
17385f757f3fSDimitry Andricdefm V_CMPX_NLE_F64   : VOPCX_Real_gfx11_gfx12<0x0ac>;
17395f757f3fSDimitry Andricdefm V_CMPX_NEQ_F64   : VOPCX_Real_gfx11_gfx12<0x0ad>;
17405f757f3fSDimitry Andricdefm V_CMPX_NLT_F64   : VOPCX_Real_gfx11_gfx12<0x0ae>;
174181ad6265SDimitry Andricdefm V_CMPX_T_F64     : VOPCX_Real_with_name_gfx11<0x0af, "V_CMPX_TRU_F64", "v_cmpx_t_f64">;
174281ad6265SDimitry Andric
17435f757f3fSDimitry Andricdefm V_CMPX_LT_I16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x0b1, "v_cmpx_lt_i16">;
17445f757f3fSDimitry Andricdefm V_CMPX_EQ_I16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x0b2, "v_cmpx_eq_i16">;
17455f757f3fSDimitry Andricdefm V_CMPX_LE_I16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x0b3, "v_cmpx_le_i16">;
17465f757f3fSDimitry Andricdefm V_CMPX_GT_I16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x0b4, "v_cmpx_gt_i16">;
17475f757f3fSDimitry Andricdefm V_CMPX_NE_I16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x0b5, "v_cmpx_ne_i16">;
17485f757f3fSDimitry Andricdefm V_CMPX_GE_I16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x0b6, "v_cmpx_ge_i16">;
17495f757f3fSDimitry Andricdefm V_CMPX_LT_U16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x0b9, "v_cmpx_lt_u16">;
17505f757f3fSDimitry Andricdefm V_CMPX_EQ_U16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x0ba, "v_cmpx_eq_u16">;
17515f757f3fSDimitry Andricdefm V_CMPX_LE_U16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x0bb, "v_cmpx_le_u16">;
17525f757f3fSDimitry Andricdefm V_CMPX_GT_U16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x0bc, "v_cmpx_gt_u16">;
17535f757f3fSDimitry Andricdefm V_CMPX_NE_U16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x0bd, "v_cmpx_ne_u16">;
17545f757f3fSDimitry Andricdefm V_CMPX_GE_U16_t16    : VOPCX_Real_t16_gfx11_gfx12<0x0be, "v_cmpx_ge_u16">;
175581ad6265SDimitry Andricdefm V_CMPX_F_I32     : VOPCX_Real_gfx11<0x0c0>;
17565f757f3fSDimitry Andricdefm V_CMPX_LT_I32    : VOPCX_Real_gfx11_gfx12<0x0c1>;
17575f757f3fSDimitry Andricdefm V_CMPX_EQ_I32    : VOPCX_Real_gfx11_gfx12<0x0c2>;
17585f757f3fSDimitry Andricdefm V_CMPX_LE_I32    : VOPCX_Real_gfx11_gfx12<0x0c3>;
17595f757f3fSDimitry Andricdefm V_CMPX_GT_I32    : VOPCX_Real_gfx11_gfx12<0x0c4>;
17605f757f3fSDimitry Andricdefm V_CMPX_NE_I32    : VOPCX_Real_gfx11_gfx12<0x0c5>;
17615f757f3fSDimitry Andricdefm V_CMPX_GE_I32    : VOPCX_Real_gfx11_gfx12<0x0c6>;
176281ad6265SDimitry Andricdefm V_CMPX_T_I32     : VOPCX_Real_gfx11<0x0c7>;
176381ad6265SDimitry Andricdefm V_CMPX_F_U32     : VOPCX_Real_gfx11<0x0c8>;
17645f757f3fSDimitry Andricdefm V_CMPX_LT_U32    : VOPCX_Real_gfx11_gfx12<0x0c9>;
17655f757f3fSDimitry Andricdefm V_CMPX_EQ_U32    : VOPCX_Real_gfx11_gfx12<0x0ca>;
17665f757f3fSDimitry Andricdefm V_CMPX_LE_U32    : VOPCX_Real_gfx11_gfx12<0x0cb>;
17675f757f3fSDimitry Andricdefm V_CMPX_GT_U32    : VOPCX_Real_gfx11_gfx12<0x0cc>;
17685f757f3fSDimitry Andricdefm V_CMPX_NE_U32    : VOPCX_Real_gfx11_gfx12<0x0cd>;
17695f757f3fSDimitry Andricdefm V_CMPX_GE_U32    : VOPCX_Real_gfx11_gfx12<0x0ce>;
177081ad6265SDimitry Andricdefm V_CMPX_T_U32     : VOPCX_Real_gfx11<0x0cf>;
177181ad6265SDimitry Andric
177281ad6265SDimitry Andricdefm V_CMPX_F_I64     : VOPCX_Real_gfx11<0x0d0>;
17735f757f3fSDimitry Andricdefm V_CMPX_LT_I64    : VOPCX_Real_gfx11_gfx12<0x0d1>;
17745f757f3fSDimitry Andricdefm V_CMPX_EQ_I64    : VOPCX_Real_gfx11_gfx12<0x0d2>;
17755f757f3fSDimitry Andricdefm V_CMPX_LE_I64    : VOPCX_Real_gfx11_gfx12<0x0d3>;
17765f757f3fSDimitry Andricdefm V_CMPX_GT_I64    : VOPCX_Real_gfx11_gfx12<0x0d4>;
17775f757f3fSDimitry Andricdefm V_CMPX_NE_I64    : VOPCX_Real_gfx11_gfx12<0x0d5>;
17785f757f3fSDimitry Andricdefm V_CMPX_GE_I64    : VOPCX_Real_gfx11_gfx12<0x0d6>;
177981ad6265SDimitry Andricdefm V_CMPX_T_I64     : VOPCX_Real_gfx11<0x0d7>;
178081ad6265SDimitry Andricdefm V_CMPX_F_U64     : VOPCX_Real_gfx11<0x0d8>;
17815f757f3fSDimitry Andricdefm V_CMPX_LT_U64    : VOPCX_Real_gfx11_gfx12<0x0d9>;
17825f757f3fSDimitry Andricdefm V_CMPX_EQ_U64    : VOPCX_Real_gfx11_gfx12<0x0da>;
17835f757f3fSDimitry Andricdefm V_CMPX_LE_U64    : VOPCX_Real_gfx11_gfx12<0x0db>;
17845f757f3fSDimitry Andricdefm V_CMPX_GT_U64    : VOPCX_Real_gfx11_gfx12<0x0dc>;
17855f757f3fSDimitry Andricdefm V_CMPX_NE_U64    : VOPCX_Real_gfx11_gfx12<0x0dd>;
17865f757f3fSDimitry Andricdefm V_CMPX_GE_U64    : VOPCX_Real_gfx11_gfx12<0x0de>;
178781ad6265SDimitry Andricdefm V_CMPX_T_U64     : VOPCX_Real_gfx11<0x0df>;
17885f757f3fSDimitry Andricdefm V_CMPX_CLASS_F16_t16 : VOPCX_Real_t16_gfx11_gfx12<0x0fd, "v_cmpx_class_f16">;
17895f757f3fSDimitry Andricdefm V_CMPX_CLASS_F32     : VOPCX_Real_gfx11_gfx12<0x0fe>;
17905f757f3fSDimitry Andricdefm V_CMPX_CLASS_F64     : VOPCX_Real_gfx11_gfx12<0x0ff>;
179181ad6265SDimitry Andric
179281ad6265SDimitry Andric//===----------------------------------------------------------------------===//
17930b57cec5SDimitry Andric// GFX10.
17940b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
17950b57cec5SDimitry Andric
1796*0fca6ea1SDimitry Andriclet AssemblerPredicate = isGFX10Only, DecoderNamespace = "GFX10" in {
17970b57cec5SDimitry Andric  multiclass VOPC_Real_gfx10<bits<9> op> {
17980b57cec5SDimitry Andric    def _e32_gfx10 :
17990b57cec5SDimitry Andric      VOPC_Real<!cast<VOPC_Pseudo>(NAME#"_e32"), SIEncodingFamily.GFX10>,
18000b57cec5SDimitry Andric      VOPCe<op{7-0}>;
18010b57cec5SDimitry Andric    def _e64_gfx10 :
18020b57cec5SDimitry Andric      VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.GFX10>,
18030b57cec5SDimitry Andric      VOP3a_gfx10<{0, op}, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl> {
18040b57cec5SDimitry Andric      // Encoding used for VOPC instructions encoded as VOP3 differs from
18050b57cec5SDimitry Andric      // VOP3e by destination name (sdst) as VOPC doesn't have vector dst.
18060b57cec5SDimitry Andric      bits<8> sdst;
18070b57cec5SDimitry Andric      let Inst{7-0} = sdst;
18080b57cec5SDimitry Andric    }
18090b57cec5SDimitry Andric
181006c3fb27SDimitry Andric    if !cast<VOPC_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA9 then
18110b57cec5SDimitry Andric    def _sdwa_gfx10 :
18120b57cec5SDimitry Andric      VOP_SDWA10_Real<!cast<VOPC_SDWA_Pseudo>(NAME#"_sdwa")>,
18130b57cec5SDimitry Andric      VOPC_SDWA9e<op{7-0}, !cast<VOPC_SDWA_Pseudo>(NAME#"_sdwa").Pfl>;
18140b57cec5SDimitry Andric
18150b57cec5SDimitry Andric    defm : VOPCInstAliases<NAME, "gfx10">;
18160b57cec5SDimitry Andric  }
18170b57cec5SDimitry Andric
18180b57cec5SDimitry Andric  multiclass VOPCX_Real_gfx10<bits<9> op> {
18190b57cec5SDimitry Andric    def _e32_gfx10 :
18200b57cec5SDimitry Andric      VOPC_Real<!cast<VOPC_Pseudo>(NAME#"_nosdst_e32"), SIEncodingFamily.GFX10>,
18210b57cec5SDimitry Andric      VOPCe<op{7-0}> {
18220b57cec5SDimitry Andric        let AsmString = !subst("_nosdst", "", !cast<VOPC_Pseudo>(NAME#"_nosdst_e32").PseudoInstr)
18230b57cec5SDimitry Andric                        # " " # !cast<VOPC_Pseudo>(NAME#"_nosdst_e32").AsmOperands;
18240b57cec5SDimitry Andric    }
18250b57cec5SDimitry Andric
18260b57cec5SDimitry Andric    def _e64_gfx10 :
18270b57cec5SDimitry Andric      VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_nosdst_e64"), SIEncodingFamily.GFX10>,
18280b57cec5SDimitry Andric      VOP3a_gfx10<{0, op}, !cast<VOP3_Pseudo>(NAME#"_nosdst_e64").Pfl> {
18290b57cec5SDimitry Andric        let Inst{7-0} = ?; // sdst
18300b57cec5SDimitry Andric        let AsmString = !subst("_nosdst", "", !cast<VOP3_Pseudo>(NAME#"_nosdst_e64").Mnemonic)
18310b57cec5SDimitry Andric                        # "{_e64} " # !cast<VOP3_Pseudo>(NAME#"_nosdst_e64").AsmOperands;
18320b57cec5SDimitry Andric    }
18330b57cec5SDimitry Andric
183406c3fb27SDimitry Andric    if !cast<VOPC_Pseudo>(NAME#"_nosdst_e32").Pfl.HasExtSDWA9 then
18350b57cec5SDimitry Andric    def _sdwa_gfx10 :
18360b57cec5SDimitry Andric      VOP_SDWA10_Real<!cast<VOPC_SDWA_Pseudo>(NAME#"_nosdst_sdwa")>,
18370b57cec5SDimitry Andric      VOPC_SDWA9e<op{7-0}, !cast<VOPC_SDWA_Pseudo>(NAME#"_nosdst_sdwa").Pfl> {
18380b57cec5SDimitry Andric        let AsmString = !subst("_nosdst", "", !cast<VOPC_SDWA_Pseudo>(NAME#"_nosdst_sdwa").Mnemonic)
18390b57cec5SDimitry Andric                        # "{_sdwa} " # !cast<VOPC_SDWA_Pseudo>(NAME#"_nosdst_sdwa").AsmOperands9;
18400b57cec5SDimitry Andric      }
18410b57cec5SDimitry Andric
18420b57cec5SDimitry Andric    defm : VOPCXInstAliases<NAME, "gfx10">;
18430b57cec5SDimitry Andric  }
1844*0fca6ea1SDimitry Andric} // End AssemblerPredicate = isGFX10Only, DecoderNamespace = "GFX10"
18450b57cec5SDimitry Andric
18460b57cec5SDimitry Andricdefm V_CMP_LT_I16     : VOPC_Real_gfx10<0x089>;
18470b57cec5SDimitry Andricdefm V_CMP_EQ_I16     : VOPC_Real_gfx10<0x08a>;
18480b57cec5SDimitry Andricdefm V_CMP_LE_I16     : VOPC_Real_gfx10<0x08b>;
18490b57cec5SDimitry Andricdefm V_CMP_GT_I16     : VOPC_Real_gfx10<0x08c>;
18500b57cec5SDimitry Andricdefm V_CMP_NE_I16     : VOPC_Real_gfx10<0x08d>;
18510b57cec5SDimitry Andricdefm V_CMP_GE_I16     : VOPC_Real_gfx10<0x08e>;
18520b57cec5SDimitry Andricdefm V_CMP_CLASS_F16  : VOPC_Real_gfx10<0x08f>;
18530b57cec5SDimitry Andricdefm V_CMPX_LT_I16    : VOPCX_Real_gfx10<0x099>;
18540b57cec5SDimitry Andricdefm V_CMPX_EQ_I16    : VOPCX_Real_gfx10<0x09a>;
18550b57cec5SDimitry Andricdefm V_CMPX_LE_I16    : VOPCX_Real_gfx10<0x09b>;
18560b57cec5SDimitry Andricdefm V_CMPX_GT_I16    : VOPCX_Real_gfx10<0x09c>;
18570b57cec5SDimitry Andricdefm V_CMPX_NE_I16    : VOPCX_Real_gfx10<0x09d>;
18580b57cec5SDimitry Andricdefm V_CMPX_GE_I16    : VOPCX_Real_gfx10<0x09e>;
18590b57cec5SDimitry Andricdefm V_CMPX_CLASS_F16 : VOPCX_Real_gfx10<0x09f>;
18600b57cec5SDimitry Andricdefm V_CMP_LT_U16     : VOPC_Real_gfx10<0x0a9>;
18610b57cec5SDimitry Andricdefm V_CMP_EQ_U16     : VOPC_Real_gfx10<0x0aa>;
18620b57cec5SDimitry Andricdefm V_CMP_LE_U16     : VOPC_Real_gfx10<0x0ab>;
18630b57cec5SDimitry Andricdefm V_CMP_GT_U16     : VOPC_Real_gfx10<0x0ac>;
18640b57cec5SDimitry Andricdefm V_CMP_NE_U16     : VOPC_Real_gfx10<0x0ad>;
18650b57cec5SDimitry Andricdefm V_CMP_GE_U16     : VOPC_Real_gfx10<0x0ae>;
18660b57cec5SDimitry Andricdefm V_CMPX_LT_U16    : VOPCX_Real_gfx10<0x0b9>;
18670b57cec5SDimitry Andricdefm V_CMPX_EQ_U16    : VOPCX_Real_gfx10<0x0ba>;
18680b57cec5SDimitry Andricdefm V_CMPX_LE_U16    : VOPCX_Real_gfx10<0x0bb>;
18690b57cec5SDimitry Andricdefm V_CMPX_GT_U16    : VOPCX_Real_gfx10<0x0bc>;
18700b57cec5SDimitry Andricdefm V_CMPX_NE_U16    : VOPCX_Real_gfx10<0x0bd>;
18710b57cec5SDimitry Andricdefm V_CMPX_GE_U16    : VOPCX_Real_gfx10<0x0be>;
18720b57cec5SDimitry Andricdefm V_CMP_F_F16      : VOPC_Real_gfx10<0x0c8>;
18730b57cec5SDimitry Andricdefm V_CMP_LT_F16     : VOPC_Real_gfx10<0x0c9>;
18740b57cec5SDimitry Andricdefm V_CMP_EQ_F16     : VOPC_Real_gfx10<0x0ca>;
18750b57cec5SDimitry Andricdefm V_CMP_LE_F16     : VOPC_Real_gfx10<0x0cb>;
18760b57cec5SDimitry Andricdefm V_CMP_GT_F16     : VOPC_Real_gfx10<0x0cc>;
18770b57cec5SDimitry Andricdefm V_CMP_LG_F16     : VOPC_Real_gfx10<0x0cd>;
18780b57cec5SDimitry Andricdefm V_CMP_GE_F16     : VOPC_Real_gfx10<0x0ce>;
18790b57cec5SDimitry Andricdefm V_CMP_O_F16      : VOPC_Real_gfx10<0x0cf>;
18800b57cec5SDimitry Andricdefm V_CMPX_F_F16     : VOPCX_Real_gfx10<0x0d8>;
18810b57cec5SDimitry Andricdefm V_CMPX_LT_F16    : VOPCX_Real_gfx10<0x0d9>;
18820b57cec5SDimitry Andricdefm V_CMPX_EQ_F16    : VOPCX_Real_gfx10<0x0da>;
18830b57cec5SDimitry Andricdefm V_CMPX_LE_F16    : VOPCX_Real_gfx10<0x0db>;
18840b57cec5SDimitry Andricdefm V_CMPX_GT_F16    : VOPCX_Real_gfx10<0x0dc>;
18850b57cec5SDimitry Andricdefm V_CMPX_LG_F16    : VOPCX_Real_gfx10<0x0dd>;
18860b57cec5SDimitry Andricdefm V_CMPX_GE_F16    : VOPCX_Real_gfx10<0x0de>;
18870b57cec5SDimitry Andricdefm V_CMPX_O_F16     : VOPCX_Real_gfx10<0x0df>;
18880b57cec5SDimitry Andricdefm V_CMP_U_F16      : VOPC_Real_gfx10<0x0e8>;
18890b57cec5SDimitry Andricdefm V_CMP_NGE_F16    : VOPC_Real_gfx10<0x0e9>;
18900b57cec5SDimitry Andricdefm V_CMP_NLG_F16    : VOPC_Real_gfx10<0x0ea>;
18910b57cec5SDimitry Andricdefm V_CMP_NGT_F16    : VOPC_Real_gfx10<0x0eb>;
18920b57cec5SDimitry Andricdefm V_CMP_NLE_F16    : VOPC_Real_gfx10<0x0ec>;
18930b57cec5SDimitry Andricdefm V_CMP_NEQ_F16    : VOPC_Real_gfx10<0x0ed>;
18940b57cec5SDimitry Andricdefm V_CMP_NLT_F16    : VOPC_Real_gfx10<0x0ee>;
18950b57cec5SDimitry Andricdefm V_CMP_TRU_F16    : VOPC_Real_gfx10<0x0ef>;
18960b57cec5SDimitry Andricdefm V_CMPX_U_F16     : VOPCX_Real_gfx10<0x0f8>;
18970b57cec5SDimitry Andricdefm V_CMPX_NGE_F16   : VOPCX_Real_gfx10<0x0f9>;
18980b57cec5SDimitry Andricdefm V_CMPX_NLG_F16   : VOPCX_Real_gfx10<0x0fa>;
18990b57cec5SDimitry Andricdefm V_CMPX_NGT_F16   : VOPCX_Real_gfx10<0x0fb>;
19000b57cec5SDimitry Andricdefm V_CMPX_NLE_F16   : VOPCX_Real_gfx10<0x0fc>;
19010b57cec5SDimitry Andricdefm V_CMPX_NEQ_F16   : VOPCX_Real_gfx10<0x0fd>;
19020b57cec5SDimitry Andricdefm V_CMPX_NLT_F16   : VOPCX_Real_gfx10<0x0fe>;
19030b57cec5SDimitry Andricdefm V_CMPX_TRU_F16   : VOPCX_Real_gfx10<0x0ff>;
19040b57cec5SDimitry Andric
19050b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
19060b57cec5SDimitry Andric// GFX6, GFX7, GFX10.
19070b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
19080b57cec5SDimitry Andric
1909*0fca6ea1SDimitry Andriclet AssemblerPredicate = isGFX6GFX7, DecoderNamespace = "GFX6GFX7" in {
19100b57cec5SDimitry Andric  multiclass VOPC_Real_gfx6_gfx7<bits<9> op> {
19110b57cec5SDimitry Andric    def _e32_gfx6_gfx7 :
19120b57cec5SDimitry Andric      VOPC_Real<!cast<VOPC_Pseudo>(NAME#"_e32"), SIEncodingFamily.SI>,
19130b57cec5SDimitry Andric      VOPCe<op{7-0}>;
19140b57cec5SDimitry Andric    def _e64_gfx6_gfx7 :
19150b57cec5SDimitry Andric      VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.SI>,
19160b57cec5SDimitry Andric      VOP3a_gfx6_gfx7<op, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl> {
19170b57cec5SDimitry Andric      // Encoding used for VOPC instructions encoded as VOP3 differs from
19180b57cec5SDimitry Andric      // VOP3e by destination name (sdst) as VOPC doesn't have vector dst.
19190b57cec5SDimitry Andric      bits<8> sdst;
19200b57cec5SDimitry Andric      let Inst{7-0} = sdst;
19210b57cec5SDimitry Andric    }
19220b57cec5SDimitry Andric
19230b57cec5SDimitry Andric    defm : VOPCInstAliases<NAME, "gfx6_gfx7">;
19240b57cec5SDimitry Andric  }
1925*0fca6ea1SDimitry Andric} // End AssemblerPredicate = isGFX6GFX7, DecoderNamespace = "GFX6GFX7"
19260b57cec5SDimitry Andric
19270b57cec5SDimitry Andricmulticlass VOPC_Real_gfx6_gfx7_gfx10<bits<9> op> :
19280b57cec5SDimitry Andric  VOPC_Real_gfx6_gfx7<op>, VOPC_Real_gfx10<op>;
19290b57cec5SDimitry Andric
19300b57cec5SDimitry Andricmulticlass VOPCX_Real_gfx6_gfx7<bits<9> op> :
19310b57cec5SDimitry Andric  VOPC_Real_gfx6_gfx7<op>;
19320b57cec5SDimitry Andric
19330b57cec5SDimitry Andricmulticlass VOPCX_Real_gfx6_gfx7_gfx10 <bits<9> op> :
19340b57cec5SDimitry Andric  VOPC_Real_gfx6_gfx7<op>, VOPCX_Real_gfx10<op>;
19350b57cec5SDimitry Andric
193681ad6265SDimitry Andricmulticlass VOPC_Real_gfx6_gfx7_gfx10_gfx11<bits<9> op> :
19375f757f3fSDimitry Andric  VOPC_Real_gfx6_gfx7_gfx10<op>, VOPC_Real_Base<GFX11Gen, op>;
193881ad6265SDimitry Andric
193981ad6265SDimitry Andricmulticlass VOPCX_Real_gfx6_gfx7_gfx10_gfx11<bits<9> op> :
19405f757f3fSDimitry Andric  VOPCX_Real_gfx6_gfx7_gfx10<op>, VOPCX_Real<GFX11Gen, op>;
19415f757f3fSDimitry Andric
19425f757f3fSDimitry Andricmulticlass VOPC_Real_gfx6_gfx7_gfx10_gfx11_gfx12<bits<9> op> :
19435f757f3fSDimitry Andric  VOPC_Real_gfx6_gfx7_gfx10_gfx11<op>, VOPC_Real_Base<GFX12Gen, op>;
194481ad6265SDimitry Andric
19450b57cec5SDimitry Andricdefm V_CMP_F_F32      : VOPC_Real_gfx6_gfx7_gfx10<0x000>;
19460b57cec5SDimitry Andricdefm V_CMP_LT_F32     : VOPC_Real_gfx6_gfx7_gfx10<0x001>;
19470b57cec5SDimitry Andricdefm V_CMP_EQ_F32     : VOPC_Real_gfx6_gfx7_gfx10<0x002>;
19480b57cec5SDimitry Andricdefm V_CMP_LE_F32     : VOPC_Real_gfx6_gfx7_gfx10<0x003>;
19490b57cec5SDimitry Andricdefm V_CMP_GT_F32     : VOPC_Real_gfx6_gfx7_gfx10<0x004>;
19500b57cec5SDimitry Andricdefm V_CMP_LG_F32     : VOPC_Real_gfx6_gfx7_gfx10<0x005>;
19510b57cec5SDimitry Andricdefm V_CMP_GE_F32     : VOPC_Real_gfx6_gfx7_gfx10<0x006>;
19520b57cec5SDimitry Andricdefm V_CMP_O_F32      : VOPC_Real_gfx6_gfx7_gfx10<0x007>;
19530b57cec5SDimitry Andricdefm V_CMP_U_F32      : VOPC_Real_gfx6_gfx7_gfx10<0x008>;
19540b57cec5SDimitry Andricdefm V_CMP_NGE_F32    : VOPC_Real_gfx6_gfx7_gfx10<0x009>;
19550b57cec5SDimitry Andricdefm V_CMP_NLG_F32    : VOPC_Real_gfx6_gfx7_gfx10<0x00a>;
19560b57cec5SDimitry Andricdefm V_CMP_NGT_F32    : VOPC_Real_gfx6_gfx7_gfx10<0x00b>;
19570b57cec5SDimitry Andricdefm V_CMP_NLE_F32    : VOPC_Real_gfx6_gfx7_gfx10<0x00c>;
19580b57cec5SDimitry Andricdefm V_CMP_NEQ_F32    : VOPC_Real_gfx6_gfx7_gfx10<0x00d>;
19590b57cec5SDimitry Andricdefm V_CMP_NLT_F32    : VOPC_Real_gfx6_gfx7_gfx10<0x00e>;
19600b57cec5SDimitry Andricdefm V_CMP_TRU_F32    : VOPC_Real_gfx6_gfx7_gfx10<0x00f>;
19610b57cec5SDimitry Andricdefm V_CMPX_F_F32     : VOPCX_Real_gfx6_gfx7_gfx10<0x010>;
19620b57cec5SDimitry Andricdefm V_CMPX_LT_F32    : VOPCX_Real_gfx6_gfx7_gfx10<0x011>;
19630b57cec5SDimitry Andricdefm V_CMPX_EQ_F32    : VOPCX_Real_gfx6_gfx7_gfx10<0x012>;
19640b57cec5SDimitry Andricdefm V_CMPX_LE_F32    : VOPCX_Real_gfx6_gfx7_gfx10<0x013>;
19650b57cec5SDimitry Andricdefm V_CMPX_GT_F32    : VOPCX_Real_gfx6_gfx7_gfx10<0x014>;
19660b57cec5SDimitry Andricdefm V_CMPX_LG_F32    : VOPCX_Real_gfx6_gfx7_gfx10<0x015>;
19670b57cec5SDimitry Andricdefm V_CMPX_GE_F32    : VOPCX_Real_gfx6_gfx7_gfx10<0x016>;
19680b57cec5SDimitry Andricdefm V_CMPX_O_F32     : VOPCX_Real_gfx6_gfx7_gfx10<0x017>;
19690b57cec5SDimitry Andricdefm V_CMPX_U_F32     : VOPCX_Real_gfx6_gfx7_gfx10<0x018>;
19700b57cec5SDimitry Andricdefm V_CMPX_NGE_F32   : VOPCX_Real_gfx6_gfx7_gfx10<0x019>;
19710b57cec5SDimitry Andricdefm V_CMPX_NLG_F32   : VOPCX_Real_gfx6_gfx7_gfx10<0x01a>;
19720b57cec5SDimitry Andricdefm V_CMPX_NGT_F32   : VOPCX_Real_gfx6_gfx7_gfx10<0x01b>;
19730b57cec5SDimitry Andricdefm V_CMPX_NLE_F32   : VOPCX_Real_gfx6_gfx7_gfx10<0x01c>;
19740b57cec5SDimitry Andricdefm V_CMPX_NEQ_F32   : VOPCX_Real_gfx6_gfx7_gfx10<0x01d>;
19750b57cec5SDimitry Andricdefm V_CMPX_NLT_F32   : VOPCX_Real_gfx6_gfx7_gfx10<0x01e>;
19760b57cec5SDimitry Andricdefm V_CMPX_TRU_F32   : VOPCX_Real_gfx6_gfx7_gfx10<0x01f>;
197781ad6265SDimitry Andricdefm V_CMP_F_F64      : VOPC_Real_gfx6_gfx7_gfx10_gfx11<0x020>;
19785f757f3fSDimitry Andricdefm V_CMP_LT_F64     : VOPC_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x021>;
19795f757f3fSDimitry Andricdefm V_CMP_EQ_F64     : VOPC_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x022>;
19805f757f3fSDimitry Andricdefm V_CMP_LE_F64     : VOPC_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x023>;
19815f757f3fSDimitry Andricdefm V_CMP_GT_F64     : VOPC_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x024>;
19825f757f3fSDimitry Andricdefm V_CMP_LG_F64     : VOPC_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x025>;
19835f757f3fSDimitry Andricdefm V_CMP_GE_F64     : VOPC_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x026>;
19845f757f3fSDimitry Andricdefm V_CMP_O_F64      : VOPC_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x027>;
19855f757f3fSDimitry Andricdefm V_CMP_U_F64      : VOPC_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x028>;
19865f757f3fSDimitry Andricdefm V_CMP_NGE_F64    : VOPC_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x029>;
19875f757f3fSDimitry Andricdefm V_CMP_NLG_F64    : VOPC_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x02a>;
19885f757f3fSDimitry Andricdefm V_CMP_NGT_F64    : VOPC_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x02b>;
19895f757f3fSDimitry Andricdefm V_CMP_NLE_F64    : VOPC_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x02c>;
19905f757f3fSDimitry Andricdefm V_CMP_NEQ_F64    : VOPC_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x02d>;
19915f757f3fSDimitry Andricdefm V_CMP_NLT_F64    : VOPC_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x02e>;
19920b57cec5SDimitry Andricdefm V_CMP_TRU_F64    : VOPC_Real_gfx6_gfx7_gfx10<0x02f>;
19930b57cec5SDimitry Andricdefm V_CMPX_F_F64     : VOPCX_Real_gfx6_gfx7_gfx10<0x030>;
19940b57cec5SDimitry Andricdefm V_CMPX_LT_F64    : VOPCX_Real_gfx6_gfx7_gfx10<0x031>;
19950b57cec5SDimitry Andricdefm V_CMPX_EQ_F64    : VOPCX_Real_gfx6_gfx7_gfx10<0x032>;
19960b57cec5SDimitry Andricdefm V_CMPX_LE_F64    : VOPCX_Real_gfx6_gfx7_gfx10<0x033>;
19970b57cec5SDimitry Andricdefm V_CMPX_GT_F64    : VOPCX_Real_gfx6_gfx7_gfx10<0x034>;
19980b57cec5SDimitry Andricdefm V_CMPX_LG_F64    : VOPCX_Real_gfx6_gfx7_gfx10<0x035>;
19990b57cec5SDimitry Andricdefm V_CMPX_GE_F64    : VOPCX_Real_gfx6_gfx7_gfx10<0x036>;
20000b57cec5SDimitry Andricdefm V_CMPX_O_F64     : VOPCX_Real_gfx6_gfx7_gfx10<0x037>;
20010b57cec5SDimitry Andricdefm V_CMPX_U_F64     : VOPCX_Real_gfx6_gfx7_gfx10<0x038>;
20020b57cec5SDimitry Andricdefm V_CMPX_NGE_F64   : VOPCX_Real_gfx6_gfx7_gfx10<0x039>;
20030b57cec5SDimitry Andricdefm V_CMPX_NLG_F64   : VOPCX_Real_gfx6_gfx7_gfx10<0x03a>;
20040b57cec5SDimitry Andricdefm V_CMPX_NGT_F64   : VOPCX_Real_gfx6_gfx7_gfx10<0x03b>;
20050b57cec5SDimitry Andricdefm V_CMPX_NLE_F64   : VOPCX_Real_gfx6_gfx7_gfx10<0x03c>;
20060b57cec5SDimitry Andricdefm V_CMPX_NEQ_F64   : VOPCX_Real_gfx6_gfx7_gfx10<0x03d>;
20070b57cec5SDimitry Andricdefm V_CMPX_NLT_F64   : VOPCX_Real_gfx6_gfx7_gfx10<0x03e>;
20080b57cec5SDimitry Andricdefm V_CMPX_TRU_F64   : VOPCX_Real_gfx6_gfx7_gfx10<0x03f>;
20090b57cec5SDimitry Andricdefm V_CMPS_F_F32     : VOPC_Real_gfx6_gfx7<0x040>;
20100b57cec5SDimitry Andricdefm V_CMPS_LT_F32    : VOPC_Real_gfx6_gfx7<0x041>;
20110b57cec5SDimitry Andricdefm V_CMPS_EQ_F32    : VOPC_Real_gfx6_gfx7<0x042>;
20120b57cec5SDimitry Andricdefm V_CMPS_LE_F32    : VOPC_Real_gfx6_gfx7<0x043>;
20130b57cec5SDimitry Andricdefm V_CMPS_GT_F32    : VOPC_Real_gfx6_gfx7<0x044>;
20140b57cec5SDimitry Andricdefm V_CMPS_LG_F32    : VOPC_Real_gfx6_gfx7<0x045>;
20150b57cec5SDimitry Andricdefm V_CMPS_GE_F32    : VOPC_Real_gfx6_gfx7<0x046>;
20160b57cec5SDimitry Andricdefm V_CMPS_O_F32     : VOPC_Real_gfx6_gfx7<0x047>;
20170b57cec5SDimitry Andricdefm V_CMPS_U_F32     : VOPC_Real_gfx6_gfx7<0x048>;
20180b57cec5SDimitry Andricdefm V_CMPS_NGE_F32   : VOPC_Real_gfx6_gfx7<0x049>;
20190b57cec5SDimitry Andricdefm V_CMPS_NLG_F32   : VOPC_Real_gfx6_gfx7<0x04a>;
20200b57cec5SDimitry Andricdefm V_CMPS_NGT_F32   : VOPC_Real_gfx6_gfx7<0x04b>;
20210b57cec5SDimitry Andricdefm V_CMPS_NLE_F32   : VOPC_Real_gfx6_gfx7<0x04c>;
20220b57cec5SDimitry Andricdefm V_CMPS_NEQ_F32   : VOPC_Real_gfx6_gfx7<0x04d>;
20230b57cec5SDimitry Andricdefm V_CMPS_NLT_F32   : VOPC_Real_gfx6_gfx7<0x04e>;
20240b57cec5SDimitry Andricdefm V_CMPS_TRU_F32   : VOPC_Real_gfx6_gfx7<0x04f>;
20250b57cec5SDimitry Andricdefm V_CMPSX_F_F32    : VOPCX_Real_gfx6_gfx7<0x050>;
20260b57cec5SDimitry Andricdefm V_CMPSX_LT_F32   : VOPCX_Real_gfx6_gfx7<0x051>;
20270b57cec5SDimitry Andricdefm V_CMPSX_EQ_F32   : VOPCX_Real_gfx6_gfx7<0x052>;
20280b57cec5SDimitry Andricdefm V_CMPSX_LE_F32   : VOPCX_Real_gfx6_gfx7<0x053>;
20290b57cec5SDimitry Andricdefm V_CMPSX_GT_F32   : VOPCX_Real_gfx6_gfx7<0x054>;
20300b57cec5SDimitry Andricdefm V_CMPSX_LG_F32   : VOPCX_Real_gfx6_gfx7<0x055>;
20310b57cec5SDimitry Andricdefm V_CMPSX_GE_F32   : VOPCX_Real_gfx6_gfx7<0x056>;
20320b57cec5SDimitry Andricdefm V_CMPSX_O_F32    : VOPCX_Real_gfx6_gfx7<0x057>;
20330b57cec5SDimitry Andricdefm V_CMPSX_U_F32    : VOPCX_Real_gfx6_gfx7<0x058>;
20340b57cec5SDimitry Andricdefm V_CMPSX_NGE_F32  : VOPCX_Real_gfx6_gfx7<0x059>;
20350b57cec5SDimitry Andricdefm V_CMPSX_NLG_F32  : VOPCX_Real_gfx6_gfx7<0x05a>;
20360b57cec5SDimitry Andricdefm V_CMPSX_NGT_F32  : VOPCX_Real_gfx6_gfx7<0x05b>;
20370b57cec5SDimitry Andricdefm V_CMPSX_NLE_F32  : VOPCX_Real_gfx6_gfx7<0x05c>;
20380b57cec5SDimitry Andricdefm V_CMPSX_NEQ_F32  : VOPCX_Real_gfx6_gfx7<0x05d>;
20390b57cec5SDimitry Andricdefm V_CMPSX_NLT_F32  : VOPCX_Real_gfx6_gfx7<0x05e>;
20400b57cec5SDimitry Andricdefm V_CMPSX_TRU_F32  : VOPCX_Real_gfx6_gfx7<0x05f>;
20410b57cec5SDimitry Andricdefm V_CMPS_F_F64     : VOPC_Real_gfx6_gfx7<0x060>;
20420b57cec5SDimitry Andricdefm V_CMPS_LT_F64    : VOPC_Real_gfx6_gfx7<0x061>;
20430b57cec5SDimitry Andricdefm V_CMPS_EQ_F64    : VOPC_Real_gfx6_gfx7<0x062>;
20440b57cec5SDimitry Andricdefm V_CMPS_LE_F64    : VOPC_Real_gfx6_gfx7<0x063>;
20450b57cec5SDimitry Andricdefm V_CMPS_GT_F64    : VOPC_Real_gfx6_gfx7<0x064>;
20460b57cec5SDimitry Andricdefm V_CMPS_LG_F64    : VOPC_Real_gfx6_gfx7<0x065>;
20470b57cec5SDimitry Andricdefm V_CMPS_GE_F64    : VOPC_Real_gfx6_gfx7<0x066>;
20480b57cec5SDimitry Andricdefm V_CMPS_O_F64     : VOPC_Real_gfx6_gfx7<0x067>;
20490b57cec5SDimitry Andricdefm V_CMPS_U_F64     : VOPC_Real_gfx6_gfx7<0x068>;
20500b57cec5SDimitry Andricdefm V_CMPS_NGE_F64   : VOPC_Real_gfx6_gfx7<0x069>;
20510b57cec5SDimitry Andricdefm V_CMPS_NLG_F64   : VOPC_Real_gfx6_gfx7<0x06a>;
20520b57cec5SDimitry Andricdefm V_CMPS_NGT_F64   : VOPC_Real_gfx6_gfx7<0x06b>;
20530b57cec5SDimitry Andricdefm V_CMPS_NLE_F64   : VOPC_Real_gfx6_gfx7<0x06c>;
20540b57cec5SDimitry Andricdefm V_CMPS_NEQ_F64   : VOPC_Real_gfx6_gfx7<0x06d>;
20550b57cec5SDimitry Andricdefm V_CMPS_NLT_F64   : VOPC_Real_gfx6_gfx7<0x06e>;
20560b57cec5SDimitry Andricdefm V_CMPS_TRU_F64   : VOPC_Real_gfx6_gfx7<0x06f>;
20570b57cec5SDimitry Andricdefm V_CMPSX_F_F64    : VOPCX_Real_gfx6_gfx7<0x070>;
20580b57cec5SDimitry Andricdefm V_CMPSX_LT_F64   : VOPCX_Real_gfx6_gfx7<0x071>;
20590b57cec5SDimitry Andricdefm V_CMPSX_EQ_F64   : VOPCX_Real_gfx6_gfx7<0x072>;
20600b57cec5SDimitry Andricdefm V_CMPSX_LE_F64   : VOPCX_Real_gfx6_gfx7<0x073>;
20610b57cec5SDimitry Andricdefm V_CMPSX_GT_F64   : VOPCX_Real_gfx6_gfx7<0x074>;
20620b57cec5SDimitry Andricdefm V_CMPSX_LG_F64   : VOPCX_Real_gfx6_gfx7<0x075>;
20630b57cec5SDimitry Andricdefm V_CMPSX_GE_F64   : VOPCX_Real_gfx6_gfx7<0x076>;
20640b57cec5SDimitry Andricdefm V_CMPSX_O_F64    : VOPCX_Real_gfx6_gfx7<0x077>;
20650b57cec5SDimitry Andricdefm V_CMPSX_U_F64    : VOPCX_Real_gfx6_gfx7<0x078>;
20660b57cec5SDimitry Andricdefm V_CMPSX_NGE_F64  : VOPCX_Real_gfx6_gfx7<0x079>;
20670b57cec5SDimitry Andricdefm V_CMPSX_NLG_F64  : VOPCX_Real_gfx6_gfx7<0x07a>;
20680b57cec5SDimitry Andricdefm V_CMPSX_NGT_F64  : VOPCX_Real_gfx6_gfx7<0x07b>;
20690b57cec5SDimitry Andricdefm V_CMPSX_NLE_F64  : VOPCX_Real_gfx6_gfx7<0x07c>;
20700b57cec5SDimitry Andricdefm V_CMPSX_NEQ_F64  : VOPCX_Real_gfx6_gfx7<0x07d>;
20710b57cec5SDimitry Andricdefm V_CMPSX_NLT_F64  : VOPCX_Real_gfx6_gfx7<0x07e>;
20720b57cec5SDimitry Andricdefm V_CMPSX_TRU_F64  : VOPCX_Real_gfx6_gfx7<0x07f>;
20730b57cec5SDimitry Andricdefm V_CMP_F_I32      : VOPC_Real_gfx6_gfx7_gfx10<0x080>;
20740b57cec5SDimitry Andricdefm V_CMP_LT_I32     : VOPC_Real_gfx6_gfx7_gfx10<0x081>;
20750b57cec5SDimitry Andricdefm V_CMP_EQ_I32     : VOPC_Real_gfx6_gfx7_gfx10<0x082>;
20760b57cec5SDimitry Andricdefm V_CMP_LE_I32     : VOPC_Real_gfx6_gfx7_gfx10<0x083>;
20770b57cec5SDimitry Andricdefm V_CMP_GT_I32     : VOPC_Real_gfx6_gfx7_gfx10<0x084>;
20780b57cec5SDimitry Andricdefm V_CMP_NE_I32     : VOPC_Real_gfx6_gfx7_gfx10<0x085>;
20790b57cec5SDimitry Andricdefm V_CMP_GE_I32     : VOPC_Real_gfx6_gfx7_gfx10<0x086>;
20800b57cec5SDimitry Andricdefm V_CMP_T_I32      : VOPC_Real_gfx6_gfx7_gfx10<0x087>;
20810b57cec5SDimitry Andricdefm V_CMP_CLASS_F32  : VOPC_Real_gfx6_gfx7_gfx10<0x088>;
20820b57cec5SDimitry Andricdefm V_CMPX_F_I32     : VOPCX_Real_gfx6_gfx7_gfx10<0x090>;
20830b57cec5SDimitry Andricdefm V_CMPX_LT_I32    : VOPCX_Real_gfx6_gfx7_gfx10<0x091>;
20840b57cec5SDimitry Andricdefm V_CMPX_EQ_I32    : VOPCX_Real_gfx6_gfx7_gfx10<0x092>;
20850b57cec5SDimitry Andricdefm V_CMPX_LE_I32    : VOPCX_Real_gfx6_gfx7_gfx10<0x093>;
20860b57cec5SDimitry Andricdefm V_CMPX_GT_I32    : VOPCX_Real_gfx6_gfx7_gfx10<0x094>;
20870b57cec5SDimitry Andricdefm V_CMPX_NE_I32    : VOPCX_Real_gfx6_gfx7_gfx10<0x095>;
20880b57cec5SDimitry Andricdefm V_CMPX_GE_I32    : VOPCX_Real_gfx6_gfx7_gfx10<0x096>;
20890b57cec5SDimitry Andricdefm V_CMPX_T_I32     : VOPCX_Real_gfx6_gfx7_gfx10<0x097>;
20900b57cec5SDimitry Andricdefm V_CMPX_CLASS_F32 : VOPCX_Real_gfx6_gfx7_gfx10<0x098>;
20910b57cec5SDimitry Andricdefm V_CMP_F_I64      : VOPC_Real_gfx6_gfx7_gfx10<0x0a0>;
20920b57cec5SDimitry Andricdefm V_CMP_LT_I64     : VOPC_Real_gfx6_gfx7_gfx10<0x0a1>;
20930b57cec5SDimitry Andricdefm V_CMP_EQ_I64     : VOPC_Real_gfx6_gfx7_gfx10<0x0a2>;
20940b57cec5SDimitry Andricdefm V_CMP_LE_I64     : VOPC_Real_gfx6_gfx7_gfx10<0x0a3>;
20950b57cec5SDimitry Andricdefm V_CMP_GT_I64     : VOPC_Real_gfx6_gfx7_gfx10<0x0a4>;
20960b57cec5SDimitry Andricdefm V_CMP_NE_I64     : VOPC_Real_gfx6_gfx7_gfx10<0x0a5>;
20970b57cec5SDimitry Andricdefm V_CMP_GE_I64     : VOPC_Real_gfx6_gfx7_gfx10<0x0a6>;
20980b57cec5SDimitry Andricdefm V_CMP_T_I64      : VOPC_Real_gfx6_gfx7_gfx10<0x0a7>;
20990b57cec5SDimitry Andricdefm V_CMP_CLASS_F64  : VOPC_Real_gfx6_gfx7_gfx10<0x0a8>;
21000b57cec5SDimitry Andricdefm V_CMPX_F_I64     : VOPCX_Real_gfx6_gfx7_gfx10<0x0b0>;
21010b57cec5SDimitry Andricdefm V_CMPX_LT_I64    : VOPCX_Real_gfx6_gfx7_gfx10<0x0b1>;
21020b57cec5SDimitry Andricdefm V_CMPX_EQ_I64    : VOPCX_Real_gfx6_gfx7_gfx10<0x0b2>;
21030b57cec5SDimitry Andricdefm V_CMPX_LE_I64    : VOPCX_Real_gfx6_gfx7_gfx10<0x0b3>;
21040b57cec5SDimitry Andricdefm V_CMPX_GT_I64    : VOPCX_Real_gfx6_gfx7_gfx10<0x0b4>;
21050b57cec5SDimitry Andricdefm V_CMPX_NE_I64    : VOPCX_Real_gfx6_gfx7_gfx10<0x0b5>;
21060b57cec5SDimitry Andricdefm V_CMPX_GE_I64    : VOPCX_Real_gfx6_gfx7_gfx10<0x0b6>;
21070b57cec5SDimitry Andricdefm V_CMPX_T_I64     : VOPCX_Real_gfx6_gfx7_gfx10<0x0b7>;
21080b57cec5SDimitry Andricdefm V_CMPX_CLASS_F64 : VOPCX_Real_gfx6_gfx7_gfx10<0x0b8>;
21090b57cec5SDimitry Andricdefm V_CMP_F_U32      : VOPC_Real_gfx6_gfx7_gfx10<0x0c0>;
21100b57cec5SDimitry Andricdefm V_CMP_LT_U32     : VOPC_Real_gfx6_gfx7_gfx10<0x0c1>;
21110b57cec5SDimitry Andricdefm V_CMP_EQ_U32     : VOPC_Real_gfx6_gfx7_gfx10<0x0c2>;
21120b57cec5SDimitry Andricdefm V_CMP_LE_U32     : VOPC_Real_gfx6_gfx7_gfx10<0x0c3>;
21130b57cec5SDimitry Andricdefm V_CMP_GT_U32     : VOPC_Real_gfx6_gfx7_gfx10<0x0c4>;
21140b57cec5SDimitry Andricdefm V_CMP_NE_U32     : VOPC_Real_gfx6_gfx7_gfx10<0x0c5>;
21150b57cec5SDimitry Andricdefm V_CMP_GE_U32     : VOPC_Real_gfx6_gfx7_gfx10<0x0c6>;
21160b57cec5SDimitry Andricdefm V_CMP_T_U32      : VOPC_Real_gfx6_gfx7_gfx10<0x0c7>;
21170b57cec5SDimitry Andricdefm V_CMPX_F_U32     : VOPCX_Real_gfx6_gfx7_gfx10<0x0d0>;
21180b57cec5SDimitry Andricdefm V_CMPX_LT_U32    : VOPCX_Real_gfx6_gfx7_gfx10<0x0d1>;
21190b57cec5SDimitry Andricdefm V_CMPX_EQ_U32    : VOPCX_Real_gfx6_gfx7_gfx10<0x0d2>;
21200b57cec5SDimitry Andricdefm V_CMPX_LE_U32    : VOPCX_Real_gfx6_gfx7_gfx10<0x0d3>;
21210b57cec5SDimitry Andricdefm V_CMPX_GT_U32    : VOPCX_Real_gfx6_gfx7_gfx10<0x0d4>;
21220b57cec5SDimitry Andricdefm V_CMPX_NE_U32    : VOPCX_Real_gfx6_gfx7_gfx10<0x0d5>;
21230b57cec5SDimitry Andricdefm V_CMPX_GE_U32    : VOPCX_Real_gfx6_gfx7_gfx10<0x0d6>;
21240b57cec5SDimitry Andricdefm V_CMPX_T_U32     : VOPCX_Real_gfx6_gfx7_gfx10<0x0d7>;
21250b57cec5SDimitry Andricdefm V_CMP_F_U64      : VOPC_Real_gfx6_gfx7_gfx10<0x0e0>;
21260b57cec5SDimitry Andricdefm V_CMP_LT_U64     : VOPC_Real_gfx6_gfx7_gfx10<0x0e1>;
21270b57cec5SDimitry Andricdefm V_CMP_EQ_U64     : VOPC_Real_gfx6_gfx7_gfx10<0x0e2>;
21280b57cec5SDimitry Andricdefm V_CMP_LE_U64     : VOPC_Real_gfx6_gfx7_gfx10<0x0e3>;
21290b57cec5SDimitry Andricdefm V_CMP_GT_U64     : VOPC_Real_gfx6_gfx7_gfx10<0x0e4>;
21300b57cec5SDimitry Andricdefm V_CMP_NE_U64     : VOPC_Real_gfx6_gfx7_gfx10<0x0e5>;
21310b57cec5SDimitry Andricdefm V_CMP_GE_U64     : VOPC_Real_gfx6_gfx7_gfx10<0x0e6>;
21320b57cec5SDimitry Andricdefm V_CMP_T_U64      : VOPC_Real_gfx6_gfx7_gfx10<0x0e7>;
21330b57cec5SDimitry Andricdefm V_CMPX_F_U64     : VOPCX_Real_gfx6_gfx7_gfx10<0x0f0>;
21340b57cec5SDimitry Andricdefm V_CMPX_LT_U64    : VOPCX_Real_gfx6_gfx7_gfx10<0x0f1>;
21350b57cec5SDimitry Andricdefm V_CMPX_EQ_U64    : VOPCX_Real_gfx6_gfx7_gfx10<0x0f2>;
21360b57cec5SDimitry Andricdefm V_CMPX_LE_U64    : VOPCX_Real_gfx6_gfx7_gfx10<0x0f3>;
21370b57cec5SDimitry Andricdefm V_CMPX_GT_U64    : VOPCX_Real_gfx6_gfx7_gfx10<0x0f4>;
21380b57cec5SDimitry Andricdefm V_CMPX_NE_U64    : VOPCX_Real_gfx6_gfx7_gfx10<0x0f5>;
21390b57cec5SDimitry Andricdefm V_CMPX_GE_U64    : VOPCX_Real_gfx6_gfx7_gfx10<0x0f6>;
21400b57cec5SDimitry Andricdefm V_CMPX_T_U64     : VOPCX_Real_gfx6_gfx7_gfx10<0x0f7>;
21410b57cec5SDimitry Andric
21420b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
21430b57cec5SDimitry Andric// GFX8, GFX9 (VI).
21440b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
21450b57cec5SDimitry Andric
21460b57cec5SDimitry Andricmulticlass VOPC_Real_vi <bits<10> op> {
2147480093f4SDimitry Andric  let AssemblerPredicate = isGFX8GFX9, DecoderNamespace = "GFX8" in {
21480b57cec5SDimitry Andric    def _e32_vi :
21490b57cec5SDimitry Andric      VOPC_Real<!cast<VOPC_Pseudo>(NAME#"_e32"), SIEncodingFamily.VI>,
21500b57cec5SDimitry Andric      VOPCe<op{7-0}>;
21510b57cec5SDimitry Andric
21520b57cec5SDimitry Andric    def _e64_vi :
21530b57cec5SDimitry Andric      VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.VI>,
21540b57cec5SDimitry Andric      VOP3a_vi <op, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl> {
21550b57cec5SDimitry Andric      // Encoding used for VOPC instructions encoded as VOP3
21560b57cec5SDimitry Andric      // Differs from VOP3e by destination name (sdst) as VOPC doesn't have vector dst
21570b57cec5SDimitry Andric      bits<8> sdst;
21580b57cec5SDimitry Andric      let Inst{7-0} = sdst;
21590b57cec5SDimitry Andric    }
21600b57cec5SDimitry Andric  }
21610b57cec5SDimitry Andric
216206c3fb27SDimitry Andric  if !cast<VOPC_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA then
21630b57cec5SDimitry Andric  def _sdwa_vi :
21640b57cec5SDimitry Andric    VOP_SDWA_Real <!cast<VOPC_SDWA_Pseudo>(NAME#"_sdwa")>,
21650b57cec5SDimitry Andric    VOPC_SDWAe <op{7-0}, !cast<VOPC_SDWA_Pseudo>(NAME#"_sdwa").Pfl>;
21660b57cec5SDimitry Andric
216706c3fb27SDimitry Andric  if !cast<VOPC_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA9 then
21680b57cec5SDimitry Andric  def _sdwa_gfx9 :
21690b57cec5SDimitry Andric    VOP_SDWA9_Real <!cast<VOPC_SDWA_Pseudo>(NAME#"_sdwa")>,
21700b57cec5SDimitry Andric    VOPC_SDWA9e <op{7-0}, !cast<VOPC_SDWA_Pseudo>(NAME#"_sdwa").Pfl>;
21710b57cec5SDimitry Andric
21720b57cec5SDimitry Andric  let AssemblerPredicate = isGFX8GFX9 in {
21730b57cec5SDimitry Andric    defm : VOPCInstAliases<NAME, "vi">;
21740b57cec5SDimitry Andric  }
21750b57cec5SDimitry Andric}
21760b57cec5SDimitry Andric
21770b57cec5SDimitry Andricdefm V_CMP_CLASS_F32  : VOPC_Real_vi <0x10>;
21780b57cec5SDimitry Andricdefm V_CMPX_CLASS_F32 : VOPC_Real_vi <0x11>;
21790b57cec5SDimitry Andricdefm V_CMP_CLASS_F64  : VOPC_Real_vi <0x12>;
21800b57cec5SDimitry Andricdefm V_CMPX_CLASS_F64 : VOPC_Real_vi <0x13>;
21810b57cec5SDimitry Andricdefm V_CMP_CLASS_F16  : VOPC_Real_vi <0x14>;
21820b57cec5SDimitry Andricdefm V_CMPX_CLASS_F16 : VOPC_Real_vi <0x15>;
21830b57cec5SDimitry Andric
21840b57cec5SDimitry Andricdefm V_CMP_F_F16      : VOPC_Real_vi <0x20>;
21850b57cec5SDimitry Andricdefm V_CMP_LT_F16     : VOPC_Real_vi <0x21>;
21860b57cec5SDimitry Andricdefm V_CMP_EQ_F16     : VOPC_Real_vi <0x22>;
21870b57cec5SDimitry Andricdefm V_CMP_LE_F16     : VOPC_Real_vi <0x23>;
21880b57cec5SDimitry Andricdefm V_CMP_GT_F16     : VOPC_Real_vi <0x24>;
21890b57cec5SDimitry Andricdefm V_CMP_LG_F16     : VOPC_Real_vi <0x25>;
21900b57cec5SDimitry Andricdefm V_CMP_GE_F16     : VOPC_Real_vi <0x26>;
21910b57cec5SDimitry Andricdefm V_CMP_O_F16      : VOPC_Real_vi <0x27>;
21920b57cec5SDimitry Andricdefm V_CMP_U_F16      : VOPC_Real_vi <0x28>;
21930b57cec5SDimitry Andricdefm V_CMP_NGE_F16    : VOPC_Real_vi <0x29>;
21940b57cec5SDimitry Andricdefm V_CMP_NLG_F16    : VOPC_Real_vi <0x2a>;
21950b57cec5SDimitry Andricdefm V_CMP_NGT_F16    : VOPC_Real_vi <0x2b>;
21960b57cec5SDimitry Andricdefm V_CMP_NLE_F16    : VOPC_Real_vi <0x2c>;
21970b57cec5SDimitry Andricdefm V_CMP_NEQ_F16    : VOPC_Real_vi <0x2d>;
21980b57cec5SDimitry Andricdefm V_CMP_NLT_F16    : VOPC_Real_vi <0x2e>;
21990b57cec5SDimitry Andricdefm V_CMP_TRU_F16    : VOPC_Real_vi <0x2f>;
22000b57cec5SDimitry Andric
22010b57cec5SDimitry Andricdefm V_CMPX_F_F16     : VOPC_Real_vi <0x30>;
22020b57cec5SDimitry Andricdefm V_CMPX_LT_F16    : VOPC_Real_vi <0x31>;
22030b57cec5SDimitry Andricdefm V_CMPX_EQ_F16    : VOPC_Real_vi <0x32>;
22040b57cec5SDimitry Andricdefm V_CMPX_LE_F16    : VOPC_Real_vi <0x33>;
22050b57cec5SDimitry Andricdefm V_CMPX_GT_F16    : VOPC_Real_vi <0x34>;
22060b57cec5SDimitry Andricdefm V_CMPX_LG_F16    : VOPC_Real_vi <0x35>;
22070b57cec5SDimitry Andricdefm V_CMPX_GE_F16    : VOPC_Real_vi <0x36>;
22080b57cec5SDimitry Andricdefm V_CMPX_O_F16     : VOPC_Real_vi <0x37>;
22090b57cec5SDimitry Andricdefm V_CMPX_U_F16     : VOPC_Real_vi <0x38>;
22100b57cec5SDimitry Andricdefm V_CMPX_NGE_F16   : VOPC_Real_vi <0x39>;
22110b57cec5SDimitry Andricdefm V_CMPX_NLG_F16   : VOPC_Real_vi <0x3a>;
22120b57cec5SDimitry Andricdefm V_CMPX_NGT_F16   : VOPC_Real_vi <0x3b>;
22130b57cec5SDimitry Andricdefm V_CMPX_NLE_F16   : VOPC_Real_vi <0x3c>;
22140b57cec5SDimitry Andricdefm V_CMPX_NEQ_F16   : VOPC_Real_vi <0x3d>;
22150b57cec5SDimitry Andricdefm V_CMPX_NLT_F16   : VOPC_Real_vi <0x3e>;
22160b57cec5SDimitry Andricdefm V_CMPX_TRU_F16   : VOPC_Real_vi <0x3f>;
22170b57cec5SDimitry Andric
22180b57cec5SDimitry Andricdefm V_CMP_F_F32      : VOPC_Real_vi <0x40>;
22190b57cec5SDimitry Andricdefm V_CMP_LT_F32     : VOPC_Real_vi <0x41>;
22200b57cec5SDimitry Andricdefm V_CMP_EQ_F32     : VOPC_Real_vi <0x42>;
22210b57cec5SDimitry Andricdefm V_CMP_LE_F32     : VOPC_Real_vi <0x43>;
22220b57cec5SDimitry Andricdefm V_CMP_GT_F32     : VOPC_Real_vi <0x44>;
22230b57cec5SDimitry Andricdefm V_CMP_LG_F32     : VOPC_Real_vi <0x45>;
22240b57cec5SDimitry Andricdefm V_CMP_GE_F32     : VOPC_Real_vi <0x46>;
22250b57cec5SDimitry Andricdefm V_CMP_O_F32      : VOPC_Real_vi <0x47>;
22260b57cec5SDimitry Andricdefm V_CMP_U_F32      : VOPC_Real_vi <0x48>;
22270b57cec5SDimitry Andricdefm V_CMP_NGE_F32    : VOPC_Real_vi <0x49>;
22280b57cec5SDimitry Andricdefm V_CMP_NLG_F32    : VOPC_Real_vi <0x4a>;
22290b57cec5SDimitry Andricdefm V_CMP_NGT_F32    : VOPC_Real_vi <0x4b>;
22300b57cec5SDimitry Andricdefm V_CMP_NLE_F32    : VOPC_Real_vi <0x4c>;
22310b57cec5SDimitry Andricdefm V_CMP_NEQ_F32    : VOPC_Real_vi <0x4d>;
22320b57cec5SDimitry Andricdefm V_CMP_NLT_F32    : VOPC_Real_vi <0x4e>;
22330b57cec5SDimitry Andricdefm V_CMP_TRU_F32    : VOPC_Real_vi <0x4f>;
22340b57cec5SDimitry Andric
22350b57cec5SDimitry Andricdefm V_CMPX_F_F32     : VOPC_Real_vi <0x50>;
22360b57cec5SDimitry Andricdefm V_CMPX_LT_F32    : VOPC_Real_vi <0x51>;
22370b57cec5SDimitry Andricdefm V_CMPX_EQ_F32    : VOPC_Real_vi <0x52>;
22380b57cec5SDimitry Andricdefm V_CMPX_LE_F32    : VOPC_Real_vi <0x53>;
22390b57cec5SDimitry Andricdefm V_CMPX_GT_F32    : VOPC_Real_vi <0x54>;
22400b57cec5SDimitry Andricdefm V_CMPX_LG_F32    : VOPC_Real_vi <0x55>;
22410b57cec5SDimitry Andricdefm V_CMPX_GE_F32    : VOPC_Real_vi <0x56>;
22420b57cec5SDimitry Andricdefm V_CMPX_O_F32     : VOPC_Real_vi <0x57>;
22430b57cec5SDimitry Andricdefm V_CMPX_U_F32     : VOPC_Real_vi <0x58>;
22440b57cec5SDimitry Andricdefm V_CMPX_NGE_F32   : VOPC_Real_vi <0x59>;
22450b57cec5SDimitry Andricdefm V_CMPX_NLG_F32   : VOPC_Real_vi <0x5a>;
22460b57cec5SDimitry Andricdefm V_CMPX_NGT_F32   : VOPC_Real_vi <0x5b>;
22470b57cec5SDimitry Andricdefm V_CMPX_NLE_F32   : VOPC_Real_vi <0x5c>;
22480b57cec5SDimitry Andricdefm V_CMPX_NEQ_F32   : VOPC_Real_vi <0x5d>;
22490b57cec5SDimitry Andricdefm V_CMPX_NLT_F32   : VOPC_Real_vi <0x5e>;
22500b57cec5SDimitry Andricdefm V_CMPX_TRU_F32   : VOPC_Real_vi <0x5f>;
22510b57cec5SDimitry Andric
22520b57cec5SDimitry Andricdefm V_CMP_F_F64      : VOPC_Real_vi <0x60>;
22530b57cec5SDimitry Andricdefm V_CMP_LT_F64     : VOPC_Real_vi <0x61>;
22540b57cec5SDimitry Andricdefm V_CMP_EQ_F64     : VOPC_Real_vi <0x62>;
22550b57cec5SDimitry Andricdefm V_CMP_LE_F64     : VOPC_Real_vi <0x63>;
22560b57cec5SDimitry Andricdefm V_CMP_GT_F64     : VOPC_Real_vi <0x64>;
22570b57cec5SDimitry Andricdefm V_CMP_LG_F64     : VOPC_Real_vi <0x65>;
22580b57cec5SDimitry Andricdefm V_CMP_GE_F64     : VOPC_Real_vi <0x66>;
22590b57cec5SDimitry Andricdefm V_CMP_O_F64      : VOPC_Real_vi <0x67>;
22600b57cec5SDimitry Andricdefm V_CMP_U_F64      : VOPC_Real_vi <0x68>;
22610b57cec5SDimitry Andricdefm V_CMP_NGE_F64    : VOPC_Real_vi <0x69>;
22620b57cec5SDimitry Andricdefm V_CMP_NLG_F64    : VOPC_Real_vi <0x6a>;
22630b57cec5SDimitry Andricdefm V_CMP_NGT_F64    : VOPC_Real_vi <0x6b>;
22640b57cec5SDimitry Andricdefm V_CMP_NLE_F64    : VOPC_Real_vi <0x6c>;
22650b57cec5SDimitry Andricdefm V_CMP_NEQ_F64    : VOPC_Real_vi <0x6d>;
22660b57cec5SDimitry Andricdefm V_CMP_NLT_F64    : VOPC_Real_vi <0x6e>;
22670b57cec5SDimitry Andricdefm V_CMP_TRU_F64    : VOPC_Real_vi <0x6f>;
22680b57cec5SDimitry Andric
22690b57cec5SDimitry Andricdefm V_CMPX_F_F64     : VOPC_Real_vi <0x70>;
22700b57cec5SDimitry Andricdefm V_CMPX_LT_F64    : VOPC_Real_vi <0x71>;
22710b57cec5SDimitry Andricdefm V_CMPX_EQ_F64    : VOPC_Real_vi <0x72>;
22720b57cec5SDimitry Andricdefm V_CMPX_LE_F64    : VOPC_Real_vi <0x73>;
22730b57cec5SDimitry Andricdefm V_CMPX_GT_F64    : VOPC_Real_vi <0x74>;
22740b57cec5SDimitry Andricdefm V_CMPX_LG_F64    : VOPC_Real_vi <0x75>;
22750b57cec5SDimitry Andricdefm V_CMPX_GE_F64    : VOPC_Real_vi <0x76>;
22760b57cec5SDimitry Andricdefm V_CMPX_O_F64     : VOPC_Real_vi <0x77>;
22770b57cec5SDimitry Andricdefm V_CMPX_U_F64     : VOPC_Real_vi <0x78>;
22780b57cec5SDimitry Andricdefm V_CMPX_NGE_F64   : VOPC_Real_vi <0x79>;
22790b57cec5SDimitry Andricdefm V_CMPX_NLG_F64   : VOPC_Real_vi <0x7a>;
22800b57cec5SDimitry Andricdefm V_CMPX_NGT_F64   : VOPC_Real_vi <0x7b>;
22810b57cec5SDimitry Andricdefm V_CMPX_NLE_F64   : VOPC_Real_vi <0x7c>;
22820b57cec5SDimitry Andricdefm V_CMPX_NEQ_F64   : VOPC_Real_vi <0x7d>;
22830b57cec5SDimitry Andricdefm V_CMPX_NLT_F64   : VOPC_Real_vi <0x7e>;
22840b57cec5SDimitry Andricdefm V_CMPX_TRU_F64   : VOPC_Real_vi <0x7f>;
22850b57cec5SDimitry Andric
22860b57cec5SDimitry Andricdefm V_CMP_F_I16      : VOPC_Real_vi <0xa0>;
22870b57cec5SDimitry Andricdefm V_CMP_LT_I16     : VOPC_Real_vi <0xa1>;
22880b57cec5SDimitry Andricdefm V_CMP_EQ_I16     : VOPC_Real_vi <0xa2>;
22890b57cec5SDimitry Andricdefm V_CMP_LE_I16     : VOPC_Real_vi <0xa3>;
22900b57cec5SDimitry Andricdefm V_CMP_GT_I16     : VOPC_Real_vi <0xa4>;
22910b57cec5SDimitry Andricdefm V_CMP_NE_I16     : VOPC_Real_vi <0xa5>;
22920b57cec5SDimitry Andricdefm V_CMP_GE_I16     : VOPC_Real_vi <0xa6>;
22930b57cec5SDimitry Andricdefm V_CMP_T_I16      : VOPC_Real_vi <0xa7>;
22940b57cec5SDimitry Andric
22950b57cec5SDimitry Andricdefm V_CMP_F_U16      : VOPC_Real_vi <0xa8>;
22960b57cec5SDimitry Andricdefm V_CMP_LT_U16     : VOPC_Real_vi <0xa9>;
22970b57cec5SDimitry Andricdefm V_CMP_EQ_U16     : VOPC_Real_vi <0xaa>;
22980b57cec5SDimitry Andricdefm V_CMP_LE_U16     : VOPC_Real_vi <0xab>;
22990b57cec5SDimitry Andricdefm V_CMP_GT_U16     : VOPC_Real_vi <0xac>;
23000b57cec5SDimitry Andricdefm V_CMP_NE_U16     : VOPC_Real_vi <0xad>;
23010b57cec5SDimitry Andricdefm V_CMP_GE_U16     : VOPC_Real_vi <0xae>;
23020b57cec5SDimitry Andricdefm V_CMP_T_U16      : VOPC_Real_vi <0xaf>;
23030b57cec5SDimitry Andric
23040b57cec5SDimitry Andricdefm V_CMPX_F_I16 : VOPC_Real_vi <0xb0>;
23050b57cec5SDimitry Andricdefm V_CMPX_LT_I16 : VOPC_Real_vi <0xb1>;
23060b57cec5SDimitry Andricdefm V_CMPX_EQ_I16 : VOPC_Real_vi <0xb2>;
23070b57cec5SDimitry Andricdefm V_CMPX_LE_I16 : VOPC_Real_vi <0xb3>;
23080b57cec5SDimitry Andricdefm V_CMPX_GT_I16 : VOPC_Real_vi <0xb4>;
23090b57cec5SDimitry Andricdefm V_CMPX_NE_I16 : VOPC_Real_vi <0xb5>;
23100b57cec5SDimitry Andricdefm V_CMPX_GE_I16 : VOPC_Real_vi <0xb6>;
23110b57cec5SDimitry Andricdefm V_CMPX_T_I16 : VOPC_Real_vi <0xb7>;
23120b57cec5SDimitry Andric
23130b57cec5SDimitry Andricdefm V_CMPX_F_U16 : VOPC_Real_vi <0xb8>;
23140b57cec5SDimitry Andricdefm V_CMPX_LT_U16 : VOPC_Real_vi <0xb9>;
23150b57cec5SDimitry Andricdefm V_CMPX_EQ_U16 : VOPC_Real_vi <0xba>;
23160b57cec5SDimitry Andricdefm V_CMPX_LE_U16 : VOPC_Real_vi <0xbb>;
23170b57cec5SDimitry Andricdefm V_CMPX_GT_U16 : VOPC_Real_vi <0xbc>;
23180b57cec5SDimitry Andricdefm V_CMPX_NE_U16 : VOPC_Real_vi <0xbd>;
23190b57cec5SDimitry Andricdefm V_CMPX_GE_U16 : VOPC_Real_vi <0xbe>;
23200b57cec5SDimitry Andricdefm V_CMPX_T_U16 : VOPC_Real_vi <0xbf>;
23210b57cec5SDimitry Andric
23220b57cec5SDimitry Andricdefm V_CMP_F_I32      : VOPC_Real_vi <0xc0>;
23230b57cec5SDimitry Andricdefm V_CMP_LT_I32     : VOPC_Real_vi <0xc1>;
23240b57cec5SDimitry Andricdefm V_CMP_EQ_I32     : VOPC_Real_vi <0xc2>;
23250b57cec5SDimitry Andricdefm V_CMP_LE_I32     : VOPC_Real_vi <0xc3>;
23260b57cec5SDimitry Andricdefm V_CMP_GT_I32     : VOPC_Real_vi <0xc4>;
23270b57cec5SDimitry Andricdefm V_CMP_NE_I32     : VOPC_Real_vi <0xc5>;
23280b57cec5SDimitry Andricdefm V_CMP_GE_I32     : VOPC_Real_vi <0xc6>;
23290b57cec5SDimitry Andricdefm V_CMP_T_I32      : VOPC_Real_vi <0xc7>;
23300b57cec5SDimitry Andric
23310b57cec5SDimitry Andricdefm V_CMPX_F_I32     : VOPC_Real_vi <0xd0>;
23320b57cec5SDimitry Andricdefm V_CMPX_LT_I32    : VOPC_Real_vi <0xd1>;
23330b57cec5SDimitry Andricdefm V_CMPX_EQ_I32    : VOPC_Real_vi <0xd2>;
23340b57cec5SDimitry Andricdefm V_CMPX_LE_I32    : VOPC_Real_vi <0xd3>;
23350b57cec5SDimitry Andricdefm V_CMPX_GT_I32    : VOPC_Real_vi <0xd4>;
23360b57cec5SDimitry Andricdefm V_CMPX_NE_I32    : VOPC_Real_vi <0xd5>;
23370b57cec5SDimitry Andricdefm V_CMPX_GE_I32    : VOPC_Real_vi <0xd6>;
23380b57cec5SDimitry Andricdefm V_CMPX_T_I32     : VOPC_Real_vi <0xd7>;
23390b57cec5SDimitry Andric
23400b57cec5SDimitry Andricdefm V_CMP_F_I64      : VOPC_Real_vi <0xe0>;
23410b57cec5SDimitry Andricdefm V_CMP_LT_I64     : VOPC_Real_vi <0xe1>;
23420b57cec5SDimitry Andricdefm V_CMP_EQ_I64     : VOPC_Real_vi <0xe2>;
23430b57cec5SDimitry Andricdefm V_CMP_LE_I64     : VOPC_Real_vi <0xe3>;
23440b57cec5SDimitry Andricdefm V_CMP_GT_I64     : VOPC_Real_vi <0xe4>;
23450b57cec5SDimitry Andricdefm V_CMP_NE_I64     : VOPC_Real_vi <0xe5>;
23460b57cec5SDimitry Andricdefm V_CMP_GE_I64     : VOPC_Real_vi <0xe6>;
23470b57cec5SDimitry Andricdefm V_CMP_T_I64      : VOPC_Real_vi <0xe7>;
23480b57cec5SDimitry Andric
23490b57cec5SDimitry Andricdefm V_CMPX_F_I64     : VOPC_Real_vi <0xf0>;
23500b57cec5SDimitry Andricdefm V_CMPX_LT_I64    : VOPC_Real_vi <0xf1>;
23510b57cec5SDimitry Andricdefm V_CMPX_EQ_I64    : VOPC_Real_vi <0xf2>;
23520b57cec5SDimitry Andricdefm V_CMPX_LE_I64    : VOPC_Real_vi <0xf3>;
23530b57cec5SDimitry Andricdefm V_CMPX_GT_I64    : VOPC_Real_vi <0xf4>;
23540b57cec5SDimitry Andricdefm V_CMPX_NE_I64    : VOPC_Real_vi <0xf5>;
23550b57cec5SDimitry Andricdefm V_CMPX_GE_I64    : VOPC_Real_vi <0xf6>;
23560b57cec5SDimitry Andricdefm V_CMPX_T_I64     : VOPC_Real_vi <0xf7>;
23570b57cec5SDimitry Andric
23580b57cec5SDimitry Andricdefm V_CMP_F_U32      : VOPC_Real_vi <0xc8>;
23590b57cec5SDimitry Andricdefm V_CMP_LT_U32     : VOPC_Real_vi <0xc9>;
23600b57cec5SDimitry Andricdefm V_CMP_EQ_U32     : VOPC_Real_vi <0xca>;
23610b57cec5SDimitry Andricdefm V_CMP_LE_U32     : VOPC_Real_vi <0xcb>;
23620b57cec5SDimitry Andricdefm V_CMP_GT_U32     : VOPC_Real_vi <0xcc>;
23630b57cec5SDimitry Andricdefm V_CMP_NE_U32     : VOPC_Real_vi <0xcd>;
23640b57cec5SDimitry Andricdefm V_CMP_GE_U32     : VOPC_Real_vi <0xce>;
23650b57cec5SDimitry Andricdefm V_CMP_T_U32      : VOPC_Real_vi <0xcf>;
23660b57cec5SDimitry Andric
23670b57cec5SDimitry Andricdefm V_CMPX_F_U32     : VOPC_Real_vi <0xd8>;
23680b57cec5SDimitry Andricdefm V_CMPX_LT_U32    : VOPC_Real_vi <0xd9>;
23690b57cec5SDimitry Andricdefm V_CMPX_EQ_U32    : VOPC_Real_vi <0xda>;
23700b57cec5SDimitry Andricdefm V_CMPX_LE_U32    : VOPC_Real_vi <0xdb>;
23710b57cec5SDimitry Andricdefm V_CMPX_GT_U32    : VOPC_Real_vi <0xdc>;
23720b57cec5SDimitry Andricdefm V_CMPX_NE_U32    : VOPC_Real_vi <0xdd>;
23730b57cec5SDimitry Andricdefm V_CMPX_GE_U32    : VOPC_Real_vi <0xde>;
23740b57cec5SDimitry Andricdefm V_CMPX_T_U32     : VOPC_Real_vi <0xdf>;
23750b57cec5SDimitry Andric
23760b57cec5SDimitry Andricdefm V_CMP_F_U64      : VOPC_Real_vi <0xe8>;
23770b57cec5SDimitry Andricdefm V_CMP_LT_U64     : VOPC_Real_vi <0xe9>;
23780b57cec5SDimitry Andricdefm V_CMP_EQ_U64     : VOPC_Real_vi <0xea>;
23790b57cec5SDimitry Andricdefm V_CMP_LE_U64     : VOPC_Real_vi <0xeb>;
23800b57cec5SDimitry Andricdefm V_CMP_GT_U64     : VOPC_Real_vi <0xec>;
23810b57cec5SDimitry Andricdefm V_CMP_NE_U64     : VOPC_Real_vi <0xed>;
23820b57cec5SDimitry Andricdefm V_CMP_GE_U64     : VOPC_Real_vi <0xee>;
23830b57cec5SDimitry Andricdefm V_CMP_T_U64      : VOPC_Real_vi <0xef>;
23840b57cec5SDimitry Andric
23850b57cec5SDimitry Andricdefm V_CMPX_F_U64     : VOPC_Real_vi <0xf8>;
23860b57cec5SDimitry Andricdefm V_CMPX_LT_U64    : VOPC_Real_vi <0xf9>;
23870b57cec5SDimitry Andricdefm V_CMPX_EQ_U64    : VOPC_Real_vi <0xfa>;
23880b57cec5SDimitry Andricdefm V_CMPX_LE_U64    : VOPC_Real_vi <0xfb>;
23890b57cec5SDimitry Andricdefm V_CMPX_GT_U64    : VOPC_Real_vi <0xfc>;
23900b57cec5SDimitry Andricdefm V_CMPX_NE_U64    : VOPC_Real_vi <0xfd>;
23910b57cec5SDimitry Andricdefm V_CMPX_GE_U64    : VOPC_Real_vi <0xfe>;
23920b57cec5SDimitry Andricdefm V_CMPX_T_U64     : VOPC_Real_vi <0xff>;
2393