1*da58b97aSjoerg//===-- VOP2Instructions.td - Vector Instruction Definitions --------------===// 206f32e7eSjoerg// 306f32e7eSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 406f32e7eSjoerg// See https://llvm.org/LICENSE.txt for license information. 506f32e7eSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 606f32e7eSjoerg// 706f32e7eSjoerg//===----------------------------------------------------------------------===// 806f32e7eSjoerg 906f32e7eSjoerg//===----------------------------------------------------------------------===// 1006f32e7eSjoerg// VOP2 Classes 1106f32e7eSjoerg//===----------------------------------------------------------------------===// 1206f32e7eSjoerg 1306f32e7eSjoergclass VOP2e <bits<6> op, VOPProfile P> : Enc32 { 1406f32e7eSjoerg bits<8> vdst; 1506f32e7eSjoerg bits<9> src0; 1606f32e7eSjoerg bits<8> src1; 1706f32e7eSjoerg 1806f32e7eSjoerg let Inst{8-0} = !if(P.HasSrc0, src0, 0); 1906f32e7eSjoerg let Inst{16-9} = !if(P.HasSrc1, src1, 0); 2006f32e7eSjoerg let Inst{24-17} = !if(P.EmitDst, vdst, 0); 2106f32e7eSjoerg let Inst{30-25} = op; 2206f32e7eSjoerg let Inst{31} = 0x0; //encoding 2306f32e7eSjoerg} 2406f32e7eSjoerg 2506f32e7eSjoergclass VOP2_MADKe <bits<6> op, VOPProfile P> : Enc64 { 2606f32e7eSjoerg bits<8> vdst; 2706f32e7eSjoerg bits<9> src0; 2806f32e7eSjoerg bits<8> src1; 2906f32e7eSjoerg bits<32> imm; 3006f32e7eSjoerg 3106f32e7eSjoerg let Inst{8-0} = !if(P.HasSrc0, src0, 0); 3206f32e7eSjoerg let Inst{16-9} = !if(P.HasSrc1, src1, 0); 3306f32e7eSjoerg let Inst{24-17} = !if(P.EmitDst, vdst, 0); 3406f32e7eSjoerg let Inst{30-25} = op; 3506f32e7eSjoerg let Inst{31} = 0x0; // encoding 3606f32e7eSjoerg let Inst{63-32} = imm; 3706f32e7eSjoerg} 3806f32e7eSjoerg 3906f32e7eSjoergclass VOP2_SDWAe <bits<6> op, VOPProfile P> : VOP_SDWAe <P> { 4006f32e7eSjoerg bits<8> vdst; 4106f32e7eSjoerg bits<8> src1; 4206f32e7eSjoerg 4306f32e7eSjoerg let Inst{8-0} = 0xf9; // sdwa 4406f32e7eSjoerg let Inst{16-9} = !if(P.HasSrc1, src1{7-0}, 0); 4506f32e7eSjoerg let Inst{24-17} = !if(P.EmitDst, vdst{7-0}, 0); 4606f32e7eSjoerg let Inst{30-25} = op; 4706f32e7eSjoerg let Inst{31} = 0x0; // encoding 4806f32e7eSjoerg} 4906f32e7eSjoerg 5006f32e7eSjoergclass VOP2_SDWA9Ae <bits<6> op, VOPProfile P> : VOP_SDWA9Ae <P> { 5106f32e7eSjoerg bits<8> vdst; 5206f32e7eSjoerg bits<9> src1; 5306f32e7eSjoerg 5406f32e7eSjoerg let Inst{8-0} = 0xf9; // sdwa 5506f32e7eSjoerg let Inst{16-9} = !if(P.HasSrc1, src1{7-0}, 0); 5606f32e7eSjoerg let Inst{24-17} = !if(P.EmitDst, vdst{7-0}, 0); 5706f32e7eSjoerg let Inst{30-25} = op; 5806f32e7eSjoerg let Inst{31} = 0x0; // encoding 5906f32e7eSjoerg let Inst{63} = !if(P.HasSrc1, src1{8}, 0); // src1_sgpr 6006f32e7eSjoerg} 6106f32e7eSjoerg 6206f32e7eSjoergclass VOP2_Pseudo <string opName, VOPProfile P, list<dag> pattern=[], string suffix = "_e32"> : 6306f32e7eSjoerg VOP_Pseudo <opName, suffix, P, P.Outs32, P.Ins32, "", pattern> { 6406f32e7eSjoerg 6506f32e7eSjoerg let AsmOperands = P.Asm32; 6606f32e7eSjoerg 6706f32e7eSjoerg let Size = 4; 6806f32e7eSjoerg let mayLoad = 0; 6906f32e7eSjoerg let mayStore = 0; 7006f32e7eSjoerg let hasSideEffects = 0; 7106f32e7eSjoerg 72*da58b97aSjoerg let ReadsModeReg = !or(isFloatType<P.DstVT>.ret, isFloatType<P.Src0VT>.ret); 73*da58b97aSjoerg 74*da58b97aSjoerg let mayRaiseFPException = ReadsModeReg; 75*da58b97aSjoerg 7606f32e7eSjoerg let VOP2 = 1; 7706f32e7eSjoerg let VALU = 1; 78*da58b97aSjoerg let Uses = !if(ReadsModeReg, [MODE, EXEC], [EXEC]); 7906f32e7eSjoerg 8006f32e7eSjoerg let AsmVariantName = AMDGPUAsmVariants.Default; 8106f32e7eSjoerg} 8206f32e7eSjoerg 8306f32e7eSjoergclass VOP2_Real <VOP2_Pseudo ps, int EncodingFamily> : 84*da58b97aSjoerg VOP_Real <ps>, 8506f32e7eSjoerg InstSI <ps.OutOperandList, ps.InOperandList, ps.Mnemonic # ps.AsmOperands, []>, 8606f32e7eSjoerg SIMCInstr <ps.PseudoInstr, EncodingFamily> { 8706f32e7eSjoerg 8806f32e7eSjoerg let isPseudo = 0; 8906f32e7eSjoerg let isCodeGenOnly = 0; 9006f32e7eSjoerg 9106f32e7eSjoerg let Constraints = ps.Constraints; 9206f32e7eSjoerg let DisableEncoding = ps.DisableEncoding; 9306f32e7eSjoerg 9406f32e7eSjoerg // copy relevant pseudo op flags 9506f32e7eSjoerg let SubtargetPredicate = ps.SubtargetPredicate; 96*da58b97aSjoerg let OtherPredicates = ps.OtherPredicates; 9706f32e7eSjoerg let AsmMatchConverter = ps.AsmMatchConverter; 9806f32e7eSjoerg let AsmVariantName = ps.AsmVariantName; 9906f32e7eSjoerg let Constraints = ps.Constraints; 10006f32e7eSjoerg let DisableEncoding = ps.DisableEncoding; 10106f32e7eSjoerg let TSFlags = ps.TSFlags; 10206f32e7eSjoerg let UseNamedOperandTable = ps.UseNamedOperandTable; 10306f32e7eSjoerg let Uses = ps.Uses; 10406f32e7eSjoerg let Defs = ps.Defs; 105*da58b97aSjoerg let SchedRW = ps.SchedRW; 10606f32e7eSjoerg} 10706f32e7eSjoerg 10806f32e7eSjoergclass VOP2_SDWA_Pseudo <string OpName, VOPProfile P, list<dag> pattern=[]> : 10906f32e7eSjoerg VOP_SDWA_Pseudo <OpName, P, pattern> { 11006f32e7eSjoerg let AsmMatchConverter = "cvtSdwaVOP2"; 11106f32e7eSjoerg} 11206f32e7eSjoerg 11306f32e7eSjoergclass VOP2_DPP_Pseudo <string OpName, VOPProfile P, list<dag> pattern=[]> : 11406f32e7eSjoerg VOP_DPP_Pseudo <OpName, P, pattern> { 11506f32e7eSjoerg} 11606f32e7eSjoerg 11706f32e7eSjoerg 11806f32e7eSjoergclass getVOP2Pat64 <SDPatternOperator node, VOPProfile P> : LetDummies { 11906f32e7eSjoerg list<dag> ret = !if(P.HasModifiers, 12006f32e7eSjoerg [(set P.DstVT:$vdst, 12106f32e7eSjoerg (node (P.Src0VT 12206f32e7eSjoerg !if(P.HasOMod, 12306f32e7eSjoerg (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, i1:$clamp, i32:$omod), 12406f32e7eSjoerg (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, i1:$clamp))), 12506f32e7eSjoerg (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers))))], 12606f32e7eSjoerg [(set P.DstVT:$vdst, (node P.Src0VT:$src0, P.Src1VT:$src1))]); 12706f32e7eSjoerg} 12806f32e7eSjoerg 12906f32e7eSjoergmulticlass VOP2Inst_e32<string opName, 13006f32e7eSjoerg VOPProfile P, 13106f32e7eSjoerg SDPatternOperator node = null_frag, 13206f32e7eSjoerg string revOp = opName, 13306f32e7eSjoerg bit GFX9Renamed = 0> { 13406f32e7eSjoerg let renamedInGFX9 = GFX9Renamed in { 13506f32e7eSjoerg def _e32 : VOP2_Pseudo <opName, P, VOPPatOrNull<node,P>.ret>, 13606f32e7eSjoerg Commutable_REV<revOp#"_e32", !eq(revOp, opName)>; 13706f32e7eSjoerg } // End renamedInGFX9 = GFX9Renamed 13806f32e7eSjoerg} 13906f32e7eSjoerg 14006f32e7eSjoergmulticlass VOP2Inst_e64<string opName, 14106f32e7eSjoerg VOPProfile P, 14206f32e7eSjoerg SDPatternOperator node = null_frag, 14306f32e7eSjoerg string revOp = opName, 14406f32e7eSjoerg bit GFX9Renamed = 0> { 14506f32e7eSjoerg let renamedInGFX9 = GFX9Renamed in { 14606f32e7eSjoerg def _e64 : VOP3_Pseudo <opName, P, getVOP2Pat64<node, P>.ret>, 14706f32e7eSjoerg Commutable_REV<revOp#"_e64", !eq(revOp, opName)>; 14806f32e7eSjoerg } // End renamedInGFX9 = GFX9Renamed 14906f32e7eSjoerg} 15006f32e7eSjoerg 15106f32e7eSjoergmulticlass VOP2Inst_sdwa<string opName, 15206f32e7eSjoerg VOPProfile P, 15306f32e7eSjoerg SDPatternOperator node = null_frag, 15406f32e7eSjoerg string revOp = opName, 15506f32e7eSjoerg bit GFX9Renamed = 0> { 15606f32e7eSjoerg let renamedInGFX9 = GFX9Renamed in { 15706f32e7eSjoerg foreach _ = BoolToList<P.HasExtSDWA>.ret in 15806f32e7eSjoerg def _sdwa : VOP2_SDWA_Pseudo <opName, P>; 15906f32e7eSjoerg } // End renamedInGFX9 = GFX9Renamed 16006f32e7eSjoerg} 16106f32e7eSjoerg 16206f32e7eSjoergmulticlass VOP2Inst<string opName, 16306f32e7eSjoerg VOPProfile P, 16406f32e7eSjoerg SDPatternOperator node = null_frag, 16506f32e7eSjoerg string revOp = opName, 16606f32e7eSjoerg bit GFX9Renamed = 0> : 16706f32e7eSjoerg VOP2Inst_e32<opName, P, node, revOp, GFX9Renamed>, 16806f32e7eSjoerg VOP2Inst_e64<opName, P, node, revOp, GFX9Renamed>, 16906f32e7eSjoerg VOP2Inst_sdwa<opName, P, node, revOp, GFX9Renamed> { 17006f32e7eSjoerg let renamedInGFX9 = GFX9Renamed in { 17106f32e7eSjoerg foreach _ = BoolToList<P.HasExtDPP>.ret in 17206f32e7eSjoerg def _dpp : VOP2_DPP_Pseudo <opName, P>; 17306f32e7eSjoerg } 17406f32e7eSjoerg} 17506f32e7eSjoerg 17606f32e7eSjoergmulticlass VOP2bInst <string opName, 17706f32e7eSjoerg VOPProfile P, 17806f32e7eSjoerg SDPatternOperator node = null_frag, 17906f32e7eSjoerg string revOp = opName, 18006f32e7eSjoerg bit GFX9Renamed = 0, 18106f32e7eSjoerg bit useSGPRInput = !eq(P.NumSrcArgs, 3)> { 18206f32e7eSjoerg let renamedInGFX9 = GFX9Renamed in { 18306f32e7eSjoerg let SchedRW = [Write32Bit, WriteSALU] in { 18406f32e7eSjoerg let Uses = !if(useSGPRInput, [VCC, EXEC], [EXEC]), Defs = [VCC] in { 18506f32e7eSjoerg def _e32 : VOP2_Pseudo <opName, P, VOPPatOrNull<node,P>.ret>, 18606f32e7eSjoerg Commutable_REV<revOp#"_e32", !eq(revOp, opName)> { 18706f32e7eSjoerg let usesCustomInserter = !eq(P.NumSrcArgs, 2); 18806f32e7eSjoerg } 18906f32e7eSjoerg 19006f32e7eSjoerg foreach _ = BoolToList<P.HasExtSDWA>.ret in 19106f32e7eSjoerg def _sdwa : VOP2_SDWA_Pseudo <opName, P> { 19206f32e7eSjoerg let AsmMatchConverter = "cvtSdwaVOP2b"; 19306f32e7eSjoerg } 19406f32e7eSjoerg foreach _ = BoolToList<P.HasExtDPP>.ret in 19506f32e7eSjoerg def _dpp : VOP2_DPP_Pseudo <opName, P>; 19606f32e7eSjoerg } 19706f32e7eSjoerg 19806f32e7eSjoerg def _e64 : VOP3_Pseudo <opName, P, getVOP2Pat64<node, P>.ret>, 19906f32e7eSjoerg Commutable_REV<revOp#"_e64", !eq(revOp, opName)>; 20006f32e7eSjoerg } 20106f32e7eSjoerg } 20206f32e7eSjoerg} 20306f32e7eSjoerg 20406f32e7eSjoergclass VOP2bInstAlias <VOP2_Pseudo ps, Instruction inst, 20506f32e7eSjoerg string OpName, string opnd> : 20606f32e7eSjoerg InstAlias <OpName#" "#!subst("vcc", opnd, ps.Pfl.Asm32), 20706f32e7eSjoerg (inst ps.Pfl.DstRC:$vdst, ps.Pfl.Src0RC32:$src0, 20806f32e7eSjoerg ps.Pfl.Src1RC32:$src1)>, 20906f32e7eSjoerg PredicateControl { 21006f32e7eSjoerg} 21106f32e7eSjoerg 21206f32e7eSjoergmulticlass VOP2bInstAliases<VOP2_Pseudo ps, VOP2_Real inst, string OpName> { 21306f32e7eSjoerg let WaveSizePredicate = isWave32 in { 21406f32e7eSjoerg def : VOP2bInstAlias<ps, inst, OpName, "vcc_lo">; 21506f32e7eSjoerg } 21606f32e7eSjoerg let WaveSizePredicate = isWave64 in { 21706f32e7eSjoerg def : VOP2bInstAlias<ps, inst, OpName, "vcc">; 21806f32e7eSjoerg } 21906f32e7eSjoerg} 22006f32e7eSjoerg 22106f32e7eSjoergmulticlass VOP2eInst <string opName, 22206f32e7eSjoerg VOPProfile P, 22306f32e7eSjoerg SDPatternOperator node = null_frag, 22406f32e7eSjoerg string revOp = opName, 22506f32e7eSjoerg bit useSGPRInput = !eq(P.NumSrcArgs, 3)> { 22606f32e7eSjoerg 22706f32e7eSjoerg let SchedRW = [Write32Bit] in { 22806f32e7eSjoerg let Uses = !if(useSGPRInput, [VCC, EXEC], [EXEC]) in { 22906f32e7eSjoerg def _e32 : VOP2_Pseudo <opName, P>, 23006f32e7eSjoerg Commutable_REV<revOp#"_e32", !eq(revOp, opName)>; 23106f32e7eSjoerg 23206f32e7eSjoerg foreach _ = BoolToList<P.HasExtSDWA>.ret in 23306f32e7eSjoerg def _sdwa : VOP2_SDWA_Pseudo <opName, P> { 23406f32e7eSjoerg let AsmMatchConverter = "cvtSdwaVOP2e"; 23506f32e7eSjoerg } 23606f32e7eSjoerg 23706f32e7eSjoerg foreach _ = BoolToList<P.HasExtDPP>.ret in 23806f32e7eSjoerg def _dpp : VOP2_DPP_Pseudo <opName, P>; 23906f32e7eSjoerg } 24006f32e7eSjoerg 24106f32e7eSjoerg def _e64 : VOP3_Pseudo <opName, P, getVOP2Pat64<node, P>.ret>, 24206f32e7eSjoerg Commutable_REV<revOp#"_e64", !eq(revOp, opName)>; 24306f32e7eSjoerg } 24406f32e7eSjoerg} 24506f32e7eSjoerg 246*da58b97aSjoergclass VOP2eInstAlias <VOP2_Pseudo ps, Instruction inst, string opnd = ""> : 24706f32e7eSjoerg InstAlias <ps.OpName#" "#ps.Pfl.Asm32#", "#opnd, 24806f32e7eSjoerg (inst ps.Pfl.DstRC:$vdst, ps.Pfl.Src0RC32:$src0, 249*da58b97aSjoerg ps.Pfl.Src1RC32:$src1)>, PredicateControl; 250*da58b97aSjoerg 251*da58b97aSjoergclass VOP2e64InstAlias <VOP3_Pseudo ps, Instruction inst> : 252*da58b97aSjoerg InstAlias <ps.OpName#" "#ps.Pfl.Asm64, 253*da58b97aSjoerg (inst ps.Pfl.DstRC:$vdst, VOPDstS64orS32:$sdst, 254*da58b97aSjoerg ps.Pfl.Src0RC32:$src0, ps.Pfl.Src1RC32:$src1, clampmod:$clamp)>, 255*da58b97aSjoerg PredicateControl; 25606f32e7eSjoerg 25706f32e7eSjoergmulticlass VOP2eInstAliases<VOP2_Pseudo ps, VOP2_Real inst> { 25806f32e7eSjoerg let WaveSizePredicate = isWave32 in { 25906f32e7eSjoerg def : VOP2eInstAlias<ps, inst, "vcc_lo">; 26006f32e7eSjoerg } 26106f32e7eSjoerg let WaveSizePredicate = isWave64 in { 26206f32e7eSjoerg def : VOP2eInstAlias<ps, inst, "vcc">; 26306f32e7eSjoerg } 26406f32e7eSjoerg} 26506f32e7eSjoerg 26606f32e7eSjoergclass VOP_MADAK <ValueType vt> : VOPProfile <[vt, vt, vt, vt]> { 26706f32e7eSjoerg field Operand ImmOpType = !if(!eq(vt.Size, 32), f32kimm, f16kimm); 26806f32e7eSjoerg field dag Ins32 = !if(!eq(vt.Size, 32), 26906f32e7eSjoerg (ins VCSrc_f32:$src0, VGPR_32:$src1, ImmOpType:$imm), 27006f32e7eSjoerg (ins VCSrc_f16:$src0, VGPR_32:$src1, ImmOpType:$imm)); 27106f32e7eSjoerg field bit HasExt = 0; 272*da58b97aSjoerg let IsSingle = 1; 27306f32e7eSjoerg 27406f32e7eSjoerg field string Asm32 = "$vdst, $src0, $src1, $imm"; 27506f32e7eSjoerg} 27606f32e7eSjoerg 27706f32e7eSjoergdef VOP_MADAK_F16 : VOP_MADAK <f16>; 27806f32e7eSjoergdef VOP_MADAK_F32 : VOP_MADAK <f32>; 27906f32e7eSjoerg 28006f32e7eSjoergclass VOP_MADMK <ValueType vt> : VOPProfile <[vt, vt, vt, vt]> { 28106f32e7eSjoerg field Operand ImmOpType = !if(!eq(vt.Size, 32), f32kimm, f16kimm); 28206f32e7eSjoerg field dag Ins32 = (ins VCSrc_f32:$src0, ImmOpType:$imm, VGPR_32:$src1); 28306f32e7eSjoerg field bit HasExt = 0; 284*da58b97aSjoerg let IsSingle = 1; 28506f32e7eSjoerg 28606f32e7eSjoerg field string Asm32 = "$vdst, $src0, $imm, $src1"; 28706f32e7eSjoerg} 28806f32e7eSjoerg 28906f32e7eSjoergdef VOP_MADMK_F16 : VOP_MADMK <f16>; 29006f32e7eSjoergdef VOP_MADMK_F32 : VOP_MADMK <f32>; 29106f32e7eSjoerg 292*da58b97aSjoergclass getRegisterOperandForVT<ValueType VT> { 293*da58b97aSjoerg RegisterOperand ret = RegisterOperand<getVregSrcForVT<VT>.ret>; 294*da58b97aSjoerg} 295*da58b97aSjoerg 29606f32e7eSjoerg// FIXME: Remove src2_modifiers. It isn't used, so is wasting memory 29706f32e7eSjoerg// and processing time but it makes it easier to convert to mad. 29806f32e7eSjoergclass VOP_MAC <ValueType vt0, ValueType vt1=vt0> : VOPProfile <[vt0, vt1, vt1, vt0]> { 299*da58b97aSjoerg let Ins32 = (ins Src0RC32:$src0, Src1RC32:$src1, getVregSrcForVT<Src2VT>.ret:$src2); 300*da58b97aSjoerg let Ins64 = getIns64<Src0RC64, Src1RC64, getRegisterOperandForVT<Src2VT>.ret, 3, 30106f32e7eSjoerg 0, HasModifiers, HasModifiers, HasOMod, 30206f32e7eSjoerg Src0Mod, Src1Mod, Src2Mod>.ret; 30306f32e7eSjoerg let InsDPP = (ins Src0ModDPP:$src0_modifiers, Src0DPP:$src0, 30406f32e7eSjoerg Src1ModDPP:$src1_modifiers, Src1DPP:$src1, 305*da58b97aSjoerg getVregSrcForVT<Src2VT>.ret:$src2, // stub argument 30606f32e7eSjoerg dpp_ctrl:$dpp_ctrl, row_mask:$row_mask, 30706f32e7eSjoerg bank_mask:$bank_mask, bound_ctrl:$bound_ctrl); 30806f32e7eSjoerg let InsDPP16 = !con(InsDPP, (ins FI:$fi)); 30906f32e7eSjoerg let InsDPP8 = (ins Src0ModDPP:$src0_modifiers, Src0DPP:$src0, 31006f32e7eSjoerg Src1ModDPP:$src1_modifiers, Src1DPP:$src1, 311*da58b97aSjoerg getVregSrcForVT<Src2VT>.ret:$src2, // stub argument 31206f32e7eSjoerg dpp8:$dpp8, FI:$fi); 31306f32e7eSjoerg let InsSDWA = (ins Src0ModSDWA:$src0_modifiers, Src0SDWA:$src0, 31406f32e7eSjoerg Src1ModSDWA:$src1_modifiers, Src1SDWA:$src1, 315*da58b97aSjoerg getVregSrcForVT<Src2VT>.ret:$src2, // stub argument 31606f32e7eSjoerg clampmod:$clamp, omod:$omod, 31706f32e7eSjoerg dst_sel:$dst_sel, dst_unused:$dst_unused, 31806f32e7eSjoerg src0_sel:$src0_sel, src1_sel:$src1_sel); 31906f32e7eSjoerg let Asm32 = getAsm32<1, 2, vt0>.ret; 32006f32e7eSjoerg let Asm64 = getAsm64<1, 2, 0, HasModifiers, HasOMod, vt0>.ret; 32106f32e7eSjoerg let AsmDPP = getAsmDPP<1, 2, HasModifiers, vt0>.ret; 32206f32e7eSjoerg let AsmDPP16 = getAsmDPP16<1, 2, HasModifiers, vt0>.ret; 32306f32e7eSjoerg let AsmDPP8 = getAsmDPP8<1, 2, 0, vt0>.ret; 32406f32e7eSjoerg let AsmSDWA = getAsmSDWA<1, 2, vt0>.ret; 32506f32e7eSjoerg let AsmSDWA9 = getAsmSDWA9<1, 1, 2, vt0>.ret; 32606f32e7eSjoerg let HasSrc2 = 0; 32706f32e7eSjoerg let HasSrc2Mods = 0; 32806f32e7eSjoerg 32906f32e7eSjoerg let HasExt = 1; 33006f32e7eSjoerg let HasExtDPP = 1; 33106f32e7eSjoerg let HasExtSDWA = 1; 33206f32e7eSjoerg let HasExtSDWA9 = 0; 33306f32e7eSjoerg let TieRegDPP = "$src2"; 33406f32e7eSjoerg} 33506f32e7eSjoerg 33606f32e7eSjoergdef VOP_MAC_F16 : VOP_MAC <f16>; 33706f32e7eSjoergdef VOP_MAC_F32 : VOP_MAC <f32>; 338*da58b97aSjoerglet HasExtDPP = 0 in 339*da58b97aSjoergdef VOP_MAC_LEGACY_F32 : VOP_MAC <f32>; 340*da58b97aSjoerglet HasExtSDWA = 0, HasExt64BitDPP = 1 in 341*da58b97aSjoergdef VOP_MAC_F64 : VOP_MAC <f64>; 34206f32e7eSjoerg 34306f32e7eSjoergclass VOP_DOT_ACC<ValueType vt0, ValueType vt1> : VOP_MAC<vt0, vt1> { 34406f32e7eSjoerg let HasClamp = 0; 34506f32e7eSjoerg let HasExtSDWA = 0; 34606f32e7eSjoerg let HasOpSel = 0; 34706f32e7eSjoerg let IsPacked = 0; 34806f32e7eSjoerg} 34906f32e7eSjoerg 35006f32e7eSjoergdef VOP_DOT_ACC_F32_V2F16 : VOP_DOT_ACC<f32, v2f16> { 35106f32e7eSjoerg let Src0ModDPP = FPVRegInputMods; 35206f32e7eSjoerg let Src1ModDPP = FPVRegInputMods; 35306f32e7eSjoerg} 354*da58b97aSjoerg 355*da58b97aSjoergdef VOP_DOT_ACC_I32_I32 : VOP_DOT_ACC<i32, i32> { 356*da58b97aSjoerg let HasSrc0Mods = 1; 357*da58b97aSjoerg let HasSrc1Mods = 1; 358*da58b97aSjoerg} 35906f32e7eSjoerg 36006f32e7eSjoerg// Write out to vcc or arbitrary SGPR. 36106f32e7eSjoergdef VOP2b_I32_I1_I32_I32 : VOPProfile<[i32, i32, i32, untyped], 0, /*EnableClamp=*/1> { 36206f32e7eSjoerg let Asm32 = "$vdst, vcc, $src0, $src1"; 36306f32e7eSjoerg let Asm64 = "$vdst, $sdst, $src0, $src1$clamp"; 36406f32e7eSjoerg let AsmSDWA = "$vdst, vcc, $src0_modifiers, $src1_modifiers$clamp $dst_sel $dst_unused $src0_sel $src1_sel"; 36506f32e7eSjoerg let AsmSDWA9 = "$vdst, vcc, $src0_modifiers, $src1_modifiers$clamp $dst_sel $dst_unused $src0_sel $src1_sel"; 36606f32e7eSjoerg let AsmDPP = "$vdst, vcc, $src0, $src1 $dpp_ctrl$row_mask$bank_mask$bound_ctrl"; 36706f32e7eSjoerg let AsmDPP8 = "$vdst, vcc, $src0, $src1 $dpp8$fi"; 36806f32e7eSjoerg let AsmDPP16 = AsmDPP#"$fi"; 36906f32e7eSjoerg let Outs32 = (outs DstRC:$vdst); 37006f32e7eSjoerg let Outs64 = (outs DstRC:$vdst, VOPDstS64orS32:$sdst); 37106f32e7eSjoerg} 37206f32e7eSjoerg 37306f32e7eSjoerg// Write out to vcc or arbitrary SGPR and read in from vcc or 37406f32e7eSjoerg// arbitrary SGPR. 37506f32e7eSjoergdef VOP2b_I32_I1_I32_I32_I1 : VOPProfile<[i32, i32, i32, i1], 0, /*EnableClamp=*/1> { 37606f32e7eSjoerg let Asm32 = "$vdst, vcc, $src0, $src1, vcc"; 37706f32e7eSjoerg let Asm64 = "$vdst, $sdst, $src0, $src1, $src2$clamp"; 37806f32e7eSjoerg let AsmSDWA = "$vdst, vcc, $src0_modifiers, $src1_modifiers, vcc$clamp $dst_sel $dst_unused $src0_sel $src1_sel"; 37906f32e7eSjoerg let AsmSDWA9 = "$vdst, vcc, $src0_modifiers, $src1_modifiers, vcc$clamp $dst_sel $dst_unused $src0_sel $src1_sel"; 38006f32e7eSjoerg let AsmDPP = "$vdst, vcc, $src0, $src1, vcc $dpp_ctrl$row_mask$bank_mask$bound_ctrl"; 38106f32e7eSjoerg let AsmDPP8 = "$vdst, vcc, $src0, $src1, vcc $dpp8$fi"; 38206f32e7eSjoerg let AsmDPP16 = AsmDPP#"$fi"; 38306f32e7eSjoerg let Outs32 = (outs DstRC:$vdst); 38406f32e7eSjoerg let Outs64 = (outs DstRC:$vdst, VOPDstS64orS32:$sdst); 38506f32e7eSjoerg 38606f32e7eSjoerg // Suppress src2 implied by type since the 32-bit encoding uses an 38706f32e7eSjoerg // implicit VCC use. 38806f32e7eSjoerg let Ins32 = (ins Src0RC32:$src0, Src1RC32:$src1); 38906f32e7eSjoerg 39006f32e7eSjoerg let InsSDWA = (ins Src0ModSDWA:$src0_modifiers, Src0SDWA:$src0, 39106f32e7eSjoerg Src1ModSDWA:$src1_modifiers, Src1SDWA:$src1, 39206f32e7eSjoerg clampmod:$clamp, 39306f32e7eSjoerg dst_sel:$dst_sel, dst_unused:$dst_unused, 39406f32e7eSjoerg src0_sel:$src0_sel, src1_sel:$src1_sel); 39506f32e7eSjoerg 39606f32e7eSjoerg let InsDPP = (ins DstRCDPP:$old, 39706f32e7eSjoerg Src0DPP:$src0, 39806f32e7eSjoerg Src1DPP:$src1, 39906f32e7eSjoerg dpp_ctrl:$dpp_ctrl, row_mask:$row_mask, 40006f32e7eSjoerg bank_mask:$bank_mask, bound_ctrl:$bound_ctrl); 40106f32e7eSjoerg let InsDPP16 = !con(InsDPP, (ins FI:$fi)); 40206f32e7eSjoerg 40306f32e7eSjoerg let HasExt = 1; 40406f32e7eSjoerg let HasExtDPP = 1; 40506f32e7eSjoerg let HasExtSDWA = 1; 40606f32e7eSjoerg let HasExtSDWA9 = 1; 40706f32e7eSjoerg} 40806f32e7eSjoerg 40906f32e7eSjoerg// Read in from vcc or arbitrary SGPR. 41006f32e7eSjoergdef VOP2e_I32_I32_I32_I1 : VOPProfile<[i32, i32, i32, i1], /*EnableF32SrcMods=*/1> { 41106f32e7eSjoerg let Asm32 = "$vdst, $src0, $src1"; 41206f32e7eSjoerg let Asm64 = "$vdst, $src0_modifiers, $src1_modifiers, $src2"; 41306f32e7eSjoerg let AsmSDWA = "$vdst, $src0_modifiers, $src1_modifiers, vcc$clamp $dst_sel $dst_unused $src0_sel $src1_sel"; 41406f32e7eSjoerg let AsmSDWA9 = "$vdst, $src0_modifiers, $src1_modifiers, vcc$clamp $dst_sel $dst_unused $src0_sel $src1_sel"; 41506f32e7eSjoerg let AsmDPP = "$vdst, $src0, $src1, vcc $dpp_ctrl$row_mask$bank_mask$bound_ctrl"; 41606f32e7eSjoerg let AsmDPP8 = "$vdst, $src0, $src1, vcc $dpp8$fi"; 41706f32e7eSjoerg let AsmDPP16 = AsmDPP#"$fi"; 41806f32e7eSjoerg 41906f32e7eSjoerg let Outs32 = (outs DstRC:$vdst); 42006f32e7eSjoerg let Outs64 = (outs DstRC:$vdst); 42106f32e7eSjoerg 42206f32e7eSjoerg // Suppress src2 implied by type since the 32-bit encoding uses an 42306f32e7eSjoerg // implicit VCC use. 42406f32e7eSjoerg let Ins32 = (ins Src0RC32:$src0, Src1RC32:$src1); 42506f32e7eSjoerg 42606f32e7eSjoerg let InsSDWA = (ins Src0ModSDWA:$src0_modifiers, Src0SDWA:$src0, 42706f32e7eSjoerg Src1ModSDWA:$src1_modifiers, Src1SDWA:$src1, 42806f32e7eSjoerg clampmod:$clamp, 42906f32e7eSjoerg dst_sel:$dst_sel, dst_unused:$dst_unused, 43006f32e7eSjoerg src0_sel:$src0_sel, src1_sel:$src1_sel); 43106f32e7eSjoerg 43206f32e7eSjoerg let InsDPP = (ins DstRCDPP:$old, 43306f32e7eSjoerg Src0ModDPP:$src0_modifiers, Src0DPP:$src0, 43406f32e7eSjoerg Src1ModDPP:$src1_modifiers, Src1DPP:$src1, 43506f32e7eSjoerg dpp_ctrl:$dpp_ctrl, row_mask:$row_mask, 43606f32e7eSjoerg bank_mask:$bank_mask, bound_ctrl:$bound_ctrl); 43706f32e7eSjoerg let InsDPP16 = !con(InsDPP, (ins FI:$fi)); 43806f32e7eSjoerg 43906f32e7eSjoerg let HasExt = 1; 44006f32e7eSjoerg let HasExtDPP = 1; 44106f32e7eSjoerg let HasExtSDWA = 1; 44206f32e7eSjoerg let HasExtSDWA9 = 1; 44306f32e7eSjoerg} 44406f32e7eSjoerg 44506f32e7eSjoergdef VOP_READLANE : VOPProfile<[i32, i32, i32]> { 44606f32e7eSjoerg let Outs32 = (outs SReg_32:$vdst); 44706f32e7eSjoerg let Outs64 = Outs32; 44806f32e7eSjoerg let Ins32 = (ins VRegOrLds_32:$src0, SCSrc_b32:$src1); 44906f32e7eSjoerg let Ins64 = Ins32; 45006f32e7eSjoerg let Asm32 = " $vdst, $src0, $src1"; 45106f32e7eSjoerg let Asm64 = Asm32; 45206f32e7eSjoerg 45306f32e7eSjoerg let HasExt = 0; 45406f32e7eSjoerg let HasExtDPP = 0; 455*da58b97aSjoerg let HasExt64BitDPP = 0; 45606f32e7eSjoerg let HasExtSDWA = 0; 45706f32e7eSjoerg let HasExtSDWA9 = 0; 45806f32e7eSjoerg} 45906f32e7eSjoerg 46006f32e7eSjoergdef VOP_WRITELANE : VOPProfile<[i32, i32, i32, i32]> { 46106f32e7eSjoerg let Outs32 = (outs VGPR_32:$vdst); 46206f32e7eSjoerg let Outs64 = Outs32; 46306f32e7eSjoerg let Ins32 = (ins SCSrc_b32:$src0, SCSrc_b32:$src1, VGPR_32:$vdst_in); 46406f32e7eSjoerg let Ins64 = Ins32; 46506f32e7eSjoerg let Asm32 = " $vdst, $src0, $src1"; 46606f32e7eSjoerg let Asm64 = Asm32; 46706f32e7eSjoerg let HasSrc2 = 0; 46806f32e7eSjoerg let HasSrc2Mods = 0; 46906f32e7eSjoerg 47006f32e7eSjoerg let HasExt = 0; 47106f32e7eSjoerg let HasExtDPP = 0; 472*da58b97aSjoerg let HasExt64BitDPP = 0; 47306f32e7eSjoerg let HasExtSDWA = 0; 47406f32e7eSjoerg let HasExtSDWA9 = 0; 47506f32e7eSjoerg} 47606f32e7eSjoerg 47706f32e7eSjoerg//===----------------------------------------------------------------------===// 47806f32e7eSjoerg// VOP2 Instructions 47906f32e7eSjoerg//===----------------------------------------------------------------------===// 48006f32e7eSjoerg 48106f32e7eSjoergdefm V_CNDMASK_B32 : VOP2eInst <"v_cndmask_b32", VOP2e_I32_I32_I32_I1>; 482*da58b97aSjoerglet SubtargetPredicate = HasMadMacF32Insts in 48306f32e7eSjoergdef V_MADMK_F32 : VOP2_Pseudo <"v_madmk_f32", VOP_MADMK_F32, []>; 48406f32e7eSjoerg 48506f32e7eSjoerglet isCommutable = 1 in { 486*da58b97aSjoergdefm V_ADD_F32 : VOP2Inst <"v_add_f32", VOP_F32_F32_F32, any_fadd>; 487*da58b97aSjoergdefm V_SUB_F32 : VOP2Inst <"v_sub_f32", VOP_F32_F32_F32, any_fsub>; 48806f32e7eSjoergdefm V_SUBREV_F32 : VOP2Inst <"v_subrev_f32", VOP_F32_F32_F32, null_frag, "v_sub_f32">; 48906f32e7eSjoergdefm V_MUL_LEGACY_F32 : VOP2Inst <"v_mul_legacy_f32", VOP_F32_F32_F32, AMDGPUfmul_legacy>; 490*da58b97aSjoergdefm V_MUL_F32 : VOP2Inst <"v_mul_f32", VOP_F32_F32_F32, any_fmul>; 491*da58b97aSjoergdefm V_MUL_I32_I24 : VOP2Inst <"v_mul_i32_i24", VOP_I32_I32_I32_ARITH, AMDGPUmul_i24>; 49206f32e7eSjoergdefm V_MUL_HI_I32_I24 : VOP2Inst <"v_mul_hi_i32_i24", VOP_PAT_GEN<VOP_I32_I32_I32, 2>, AMDGPUmulhi_i24>; 493*da58b97aSjoergdefm V_MUL_U32_U24 : VOP2Inst <"v_mul_u32_u24", VOP_I32_I32_I32_ARITH, AMDGPUmul_u24>; 49406f32e7eSjoergdefm V_MUL_HI_U32_U24 : VOP2Inst <"v_mul_hi_u32_u24", VOP_PAT_GEN<VOP_I32_I32_I32, 2>, AMDGPUmulhi_u24>; 49506f32e7eSjoergdefm V_MIN_F32 : VOP2Inst <"v_min_f32", VOP_F32_F32_F32, fminnum_like>; 49606f32e7eSjoergdefm V_MAX_F32 : VOP2Inst <"v_max_f32", VOP_F32_F32_F32, fmaxnum_like>; 49706f32e7eSjoergdefm V_MIN_I32 : VOP2Inst <"v_min_i32", VOP_PAT_GEN<VOP_I32_I32_I32>, smin>; 49806f32e7eSjoergdefm V_MAX_I32 : VOP2Inst <"v_max_i32", VOP_PAT_GEN<VOP_I32_I32_I32>, smax>; 49906f32e7eSjoergdefm V_MIN_U32 : VOP2Inst <"v_min_u32", VOP_PAT_GEN<VOP_I32_I32_I32>, umin>; 50006f32e7eSjoergdefm V_MAX_U32 : VOP2Inst <"v_max_u32", VOP_PAT_GEN<VOP_I32_I32_I32>, umax>; 50106f32e7eSjoergdefm V_LSHRREV_B32 : VOP2Inst <"v_lshrrev_b32", VOP_I32_I32_I32, lshr_rev, "v_lshr_b32">; 50206f32e7eSjoergdefm V_ASHRREV_I32 : VOP2Inst <"v_ashrrev_i32", VOP_I32_I32_I32, ashr_rev, "v_ashr_i32">; 50306f32e7eSjoergdefm V_LSHLREV_B32 : VOP2Inst <"v_lshlrev_b32", VOP_I32_I32_I32, lshl_rev, "v_lshl_b32">; 50406f32e7eSjoergdefm V_AND_B32 : VOP2Inst <"v_and_b32", VOP_PAT_GEN<VOP_I32_I32_I32>, and>; 50506f32e7eSjoergdefm V_OR_B32 : VOP2Inst <"v_or_b32", VOP_PAT_GEN<VOP_I32_I32_I32>, or>; 50606f32e7eSjoergdefm V_XOR_B32 : VOP2Inst <"v_xor_b32", VOP_PAT_GEN<VOP_I32_I32_I32>, xor>; 50706f32e7eSjoerg 508*da58b97aSjoerglet mayRaiseFPException = 0 in { 509*da58b97aSjoerglet OtherPredicates = [HasMadMacF32Insts] in { 51006f32e7eSjoerglet Constraints = "$vdst = $src2", DisableEncoding="$src2", 51106f32e7eSjoerg isConvertibleToThreeAddress = 1 in { 51206f32e7eSjoergdefm V_MAC_F32 : VOP2Inst <"v_mac_f32", VOP_MAC_F32>; 513*da58b97aSjoerg 514*da58b97aSjoerglet SubtargetPredicate = isGFX6GFX7GFX10 in 515*da58b97aSjoergdefm V_MAC_LEGACY_F32 : VOP2Inst <"v_mac_legacy_f32", VOP_MAC_LEGACY_F32>; 516*da58b97aSjoerg} // End Constraints = "$vdst = $src2", DisableEncoding="$src2", 517*da58b97aSjoerg // isConvertibleToThreeAddress = 1 51806f32e7eSjoerg 51906f32e7eSjoergdef V_MADAK_F32 : VOP2_Pseudo <"v_madak_f32", VOP_MADAK_F32, []>; 520*da58b97aSjoerg} // End OtherPredicates = [HasMadMacF32Insts] 521*da58b97aSjoerg} // End mayRaiseFPException = 0 52206f32e7eSjoerg 52306f32e7eSjoerg// No patterns so that the scalar instructions are always selected. 52406f32e7eSjoerg// The scalar versions will be replaced with vector when needed later. 525*da58b97aSjoergdefm V_ADD_CO_U32 : VOP2bInst <"v_add_co_u32", VOP2b_I32_I1_I32_I32, null_frag, "v_add_co_u32", 1>; 526*da58b97aSjoergdefm V_SUB_CO_U32 : VOP2bInst <"v_sub_co_u32", VOP2b_I32_I1_I32_I32, null_frag, "v_sub_co_u32", 1>; 527*da58b97aSjoergdefm V_SUBREV_CO_U32 : VOP2bInst <"v_subrev_co_u32", VOP2b_I32_I1_I32_I32, null_frag, "v_sub_co_u32", 1>; 52806f32e7eSjoergdefm V_ADDC_U32 : VOP2bInst <"v_addc_u32", VOP2b_I32_I1_I32_I32_I1, null_frag, "v_addc_u32", 1>; 52906f32e7eSjoergdefm V_SUBB_U32 : VOP2bInst <"v_subb_u32", VOP2b_I32_I1_I32_I32_I1, null_frag, "v_subb_u32", 1>; 53006f32e7eSjoergdefm V_SUBBREV_U32 : VOP2bInst <"v_subbrev_u32", VOP2b_I32_I1_I32_I32_I1, null_frag, "v_subb_u32", 1>; 53106f32e7eSjoerg 53206f32e7eSjoerg 53306f32e7eSjoerglet SubtargetPredicate = HasAddNoCarryInsts in { 53406f32e7eSjoergdefm V_ADD_U32 : VOP2Inst <"v_add_u32", VOP_I32_I32_I32_ARITH, null_frag, "v_add_u32", 1>; 53506f32e7eSjoergdefm V_SUB_U32 : VOP2Inst <"v_sub_u32", VOP_I32_I32_I32_ARITH, null_frag, "v_sub_u32", 1>; 53606f32e7eSjoergdefm V_SUBREV_U32 : VOP2Inst <"v_subrev_u32", VOP_I32_I32_I32_ARITH, null_frag, "v_sub_u32", 1>; 53706f32e7eSjoerg} 53806f32e7eSjoerg 53906f32e7eSjoerg} // End isCommutable = 1 54006f32e7eSjoerg 54106f32e7eSjoerg// These are special and do not read the exec mask. 54206f32e7eSjoerglet isConvergent = 1, Uses = []<Register> in { 54306f32e7eSjoergdef V_READLANE_B32 : VOP2_Pseudo<"v_readlane_b32", VOP_READLANE, 54406f32e7eSjoerg [(set i32:$vdst, (int_amdgcn_readlane i32:$src0, i32:$src1))]>; 54506f32e7eSjoerg 54606f32e7eSjoerglet Constraints = "$vdst = $vdst_in", DisableEncoding="$vdst_in" in { 54706f32e7eSjoergdef V_WRITELANE_B32 : VOP2_Pseudo<"v_writelane_b32", VOP_WRITELANE, 54806f32e7eSjoerg [(set i32:$vdst, (int_amdgcn_writelane i32:$src0, i32:$src1, i32:$vdst_in))]>; 54906f32e7eSjoerg} // End $vdst = $vdst_in, DisableEncoding $vdst_in 55006f32e7eSjoerg} // End isConvergent = 1 55106f32e7eSjoerg 55206f32e7eSjoergdefm V_BFM_B32 : VOP2Inst <"v_bfm_b32", VOP_NO_EXT<VOP_I32_I32_I32>>; 55306f32e7eSjoergdefm V_BCNT_U32_B32 : VOP2Inst <"v_bcnt_u32_b32", VOP_NO_EXT<VOP_I32_I32_I32>, add_ctpop>; 55406f32e7eSjoergdefm V_MBCNT_LO_U32_B32 : VOP2Inst <"v_mbcnt_lo_u32_b32", VOP_NO_EXT<VOP_I32_I32_I32>, int_amdgcn_mbcnt_lo>; 55506f32e7eSjoergdefm V_MBCNT_HI_U32_B32 : VOP2Inst <"v_mbcnt_hi_u32_b32", VOP_NO_EXT<VOP_I32_I32_I32>, int_amdgcn_mbcnt_hi>; 55606f32e7eSjoergdefm V_LDEXP_F32 : VOP2Inst <"v_ldexp_f32", VOP_NO_EXT<VOP_F32_F32_I32>, AMDGPUldexp>; 55706f32e7eSjoergdefm V_CVT_PKACCUM_U8_F32 : VOP2Inst <"v_cvt_pkaccum_u8_f32", VOP_NO_EXT<VOP_I32_F32_I32>>; // TODO: set "Uses = dst" 558*da58b97aSjoerg 559*da58b97aSjoerglet ReadsModeReg = 0, mayRaiseFPException = 0 in { 56006f32e7eSjoergdefm V_CVT_PKNORM_I16_F32 : VOP2Inst <"v_cvt_pknorm_i16_f32", VOP_NO_EXT<VOP_V2I16_F32_F32>, AMDGPUpknorm_i16_f32>; 56106f32e7eSjoergdefm V_CVT_PKNORM_U16_F32 : VOP2Inst <"v_cvt_pknorm_u16_f32", VOP_NO_EXT<VOP_V2I16_F32_F32>, AMDGPUpknorm_u16_f32>; 562*da58b97aSjoerg} 563*da58b97aSjoerg 56406f32e7eSjoergdefm V_CVT_PKRTZ_F16_F32 : VOP2Inst <"v_cvt_pkrtz_f16_f32", VOP_NO_EXT<VOP_V2F16_F32_F32>, AMDGPUpkrtz_f16_f32>; 56506f32e7eSjoergdefm V_CVT_PK_U16_U32 : VOP2Inst <"v_cvt_pk_u16_u32", VOP_NO_EXT<VOP_V2I16_I32_I32>, AMDGPUpk_u16_u32>; 56606f32e7eSjoergdefm V_CVT_PK_I16_I32 : VOP2Inst <"v_cvt_pk_i16_i32", VOP_NO_EXT<VOP_V2I16_I32_I32>, AMDGPUpk_i16_i32>; 56706f32e7eSjoerg 56806f32e7eSjoerg 56906f32e7eSjoerglet SubtargetPredicate = isGFX6GFX7 in { 57006f32e7eSjoergdefm V_MIN_LEGACY_F32 : VOP2Inst <"v_min_legacy_f32", VOP_F32_F32_F32, AMDGPUfmin_legacy>; 57106f32e7eSjoergdefm V_MAX_LEGACY_F32 : VOP2Inst <"v_max_legacy_f32", VOP_F32_F32_F32, AMDGPUfmax_legacy>; 57206f32e7eSjoerg} // End SubtargetPredicate = isGFX6GFX7 57306f32e7eSjoerg 57406f32e7eSjoerglet isCommutable = 1 in { 575*da58b97aSjoerglet SubtargetPredicate = isGFX6GFX7 in { 576*da58b97aSjoergdefm V_LSHR_B32 : VOP2Inst <"v_lshr_b32", VOP_PAT_GEN<VOP_I32_I32_I32>, srl>; 577*da58b97aSjoergdefm V_ASHR_I32 : VOP2Inst <"v_ashr_i32", VOP_PAT_GEN<VOP_I32_I32_I32>, sra>; 578*da58b97aSjoergdefm V_LSHL_B32 : VOP2Inst <"v_lshl_b32", VOP_PAT_GEN<VOP_I32_I32_I32>, shl>; 579*da58b97aSjoerg} // End SubtargetPredicate = isGFX6GFX7 58006f32e7eSjoerg} // End isCommutable = 1 581*da58b97aSjoerg 58206f32e7eSjoerg 58306f32e7eSjoergclass DivergentBinOp<SDPatternOperator Op, VOP_Pseudo Inst> : 58406f32e7eSjoerg GCNPat< 58506f32e7eSjoerg (getDivergentFrag<Op>.ret Inst.Pfl.Src0VT:$src0, Inst.Pfl.Src1VT:$src1), 58606f32e7eSjoerg !if(!cast<Commutable_REV>(Inst).IsOrig, 58706f32e7eSjoerg (Inst $src0, $src1), 58806f32e7eSjoerg (Inst $src1, $src0) 58906f32e7eSjoerg ) 59006f32e7eSjoerg >; 59106f32e7eSjoerg 59206f32e7eSjoergclass DivergentClampingBinOp<SDPatternOperator Op, VOP_Pseudo Inst> : 59306f32e7eSjoerg GCNPat< 59406f32e7eSjoerg (getDivergentFrag<Op>.ret Inst.Pfl.Src0VT:$src0, Inst.Pfl.Src1VT:$src1), 59506f32e7eSjoerg !if(!cast<Commutable_REV>(Inst).IsOrig, 59606f32e7eSjoerg (Inst $src0, $src1, 0), 59706f32e7eSjoerg (Inst $src1, $src0, 0) 59806f32e7eSjoerg ) 59906f32e7eSjoerg >; 60006f32e7eSjoerg 60106f32e7eSjoergdef : DivergentBinOp<srl, V_LSHRREV_B32_e64>; 60206f32e7eSjoergdef : DivergentBinOp<sra, V_ASHRREV_I32_e64>; 60306f32e7eSjoergdef : DivergentBinOp<shl, V_LSHLREV_B32_e64>; 60406f32e7eSjoerg 60506f32e7eSjoerglet SubtargetPredicate = HasAddNoCarryInsts in { 60606f32e7eSjoerg def : DivergentClampingBinOp<add, V_ADD_U32_e64>; 60706f32e7eSjoerg def : DivergentClampingBinOp<sub, V_SUB_U32_e64>; 60806f32e7eSjoerg} 60906f32e7eSjoerg 61006f32e7eSjoerglet SubtargetPredicate = isGFX6GFX7GFX8GFX9, Predicates = [isGFX6GFX7GFX8GFX9] in { 611*da58b97aSjoergdef : DivergentClampingBinOp<add, V_ADD_CO_U32_e64>; 612*da58b97aSjoergdef : DivergentClampingBinOp<sub, V_SUB_CO_U32_e64>; 61306f32e7eSjoerg} 61406f32e7eSjoerg 61506f32e7eSjoergdef : DivergentBinOp<adde, V_ADDC_U32_e32>; 61606f32e7eSjoergdef : DivergentBinOp<sube, V_SUBB_U32_e32>; 61706f32e7eSjoerg 61806f32e7eSjoergclass divergent_i64_BinOp <SDPatternOperator Op, Instruction Inst> : 61906f32e7eSjoerg GCNPat< 62006f32e7eSjoerg (getDivergentFrag<Op>.ret i64:$src0, i64:$src1), 62106f32e7eSjoerg (REG_SEQUENCE VReg_64, 62206f32e7eSjoerg (Inst 62306f32e7eSjoerg (i32 (EXTRACT_SUBREG $src0, sub0)), 62406f32e7eSjoerg (i32 (EXTRACT_SUBREG $src1, sub0)) 62506f32e7eSjoerg ), sub0, 62606f32e7eSjoerg (Inst 62706f32e7eSjoerg (i32 (EXTRACT_SUBREG $src0, sub1)), 62806f32e7eSjoerg (i32 (EXTRACT_SUBREG $src1, sub1)) 62906f32e7eSjoerg ), sub1 63006f32e7eSjoerg ) 63106f32e7eSjoerg >; 63206f32e7eSjoerg 63306f32e7eSjoergdef : divergent_i64_BinOp <and, V_AND_B32_e32>; 63406f32e7eSjoergdef : divergent_i64_BinOp <or, V_OR_B32_e32>; 63506f32e7eSjoergdef : divergent_i64_BinOp <xor, V_XOR_B32_e32>; 63606f32e7eSjoerg 63706f32e7eSjoerglet SubtargetPredicate = Has16BitInsts in { 63806f32e7eSjoerg 63906f32e7eSjoerglet FPDPRounding = 1 in { 64006f32e7eSjoergdef V_MADMK_F16 : VOP2_Pseudo <"v_madmk_f16", VOP_MADMK_F16, [], "">; 64106f32e7eSjoergdefm V_LDEXP_F16 : VOP2Inst <"v_ldexp_f16", VOP_F16_F16_I32, AMDGPUldexp>; 64206f32e7eSjoerg} // End FPDPRounding = 1 64306f32e7eSjoerg 64406f32e7eSjoergdefm V_LSHLREV_B16 : VOP2Inst <"v_lshlrev_b16", VOP_I16_I16_I16, lshl_rev>; 64506f32e7eSjoergdefm V_LSHRREV_B16 : VOP2Inst <"v_lshrrev_b16", VOP_I16_I16_I16, lshr_rev>; 64606f32e7eSjoergdefm V_ASHRREV_I16 : VOP2Inst <"v_ashrrev_i16", VOP_I16_I16_I16, ashr_rev>; 64706f32e7eSjoerg 64806f32e7eSjoerglet isCommutable = 1 in { 64906f32e7eSjoerglet FPDPRounding = 1 in { 650*da58b97aSjoergdefm V_ADD_F16 : VOP2Inst <"v_add_f16", VOP_F16_F16_F16, any_fadd>; 651*da58b97aSjoergdefm V_SUB_F16 : VOP2Inst <"v_sub_f16", VOP_F16_F16_F16, any_fsub>; 65206f32e7eSjoergdefm V_SUBREV_F16 : VOP2Inst <"v_subrev_f16", VOP_F16_F16_F16, null_frag, "v_sub_f16">; 653*da58b97aSjoergdefm V_MUL_F16 : VOP2Inst <"v_mul_f16", VOP_F16_F16_F16, any_fmul>; 654*da58b97aSjoerg 655*da58b97aSjoerglet mayRaiseFPException = 0 in { 65606f32e7eSjoergdef V_MADAK_F16 : VOP2_Pseudo <"v_madak_f16", VOP_MADAK_F16, [], "">; 657*da58b97aSjoerg} 658*da58b97aSjoerg 65906f32e7eSjoerg} // End FPDPRounding = 1 660*da58b97aSjoergdefm V_ADD_U16 : VOP2Inst <"v_add_u16", VOP_I16_I16_I16_ARITH, add>; 661*da58b97aSjoergdefm V_SUB_U16 : VOP2Inst <"v_sub_u16" , VOP_I16_I16_I16_ARITH, sub>; 662*da58b97aSjoergdefm V_SUBREV_U16 : VOP2Inst <"v_subrev_u16", VOP_I16_I16_I16_ARITH, null_frag, "v_sub_u16">; 66306f32e7eSjoergdefm V_MUL_LO_U16 : VOP2Inst <"v_mul_lo_u16", VOP_I16_I16_I16, mul>; 66406f32e7eSjoergdefm V_MAX_F16 : VOP2Inst <"v_max_f16", VOP_F16_F16_F16, fmaxnum_like>; 66506f32e7eSjoergdefm V_MIN_F16 : VOP2Inst <"v_min_f16", VOP_F16_F16_F16, fminnum_like>; 66606f32e7eSjoergdefm V_MAX_U16 : VOP2Inst <"v_max_u16", VOP_I16_I16_I16, umax>; 66706f32e7eSjoergdefm V_MAX_I16 : VOP2Inst <"v_max_i16", VOP_I16_I16_I16, smax>; 66806f32e7eSjoergdefm V_MIN_U16 : VOP2Inst <"v_min_u16", VOP_I16_I16_I16, umin>; 66906f32e7eSjoergdefm V_MIN_I16 : VOP2Inst <"v_min_i16", VOP_I16_I16_I16, smin>; 67006f32e7eSjoerg 67106f32e7eSjoerglet Constraints = "$vdst = $src2", DisableEncoding="$src2", 67206f32e7eSjoerg isConvertibleToThreeAddress = 1 in { 67306f32e7eSjoergdefm V_MAC_F16 : VOP2Inst <"v_mac_f16", VOP_MAC_F16>; 67406f32e7eSjoerg} 67506f32e7eSjoerg} // End isCommutable = 1 67606f32e7eSjoerg 67706f32e7eSjoerg} // End SubtargetPredicate = Has16BitInsts 67806f32e7eSjoerg 67906f32e7eSjoerglet SubtargetPredicate = HasDLInsts in { 68006f32e7eSjoerg 681*da58b97aSjoergdefm V_XNOR_B32 : VOP2Inst <"v_xnor_b32", VOP_I32_I32_I32, xnor>; 68206f32e7eSjoerg 68306f32e7eSjoerglet Constraints = "$vdst = $src2", 68406f32e7eSjoerg DisableEncoding = "$src2", 68506f32e7eSjoerg isConvertibleToThreeAddress = 1, 686*da58b97aSjoerg isCommutable = 1 in 68706f32e7eSjoergdefm V_FMAC_F32 : VOP2Inst <"v_fmac_f32", VOP_MAC_F32>; 68806f32e7eSjoerg 68906f32e7eSjoerg} // End SubtargetPredicate = HasDLInsts 69006f32e7eSjoerg 691*da58b97aSjoerglet SubtargetPredicate = HasFmaLegacy32 in { 692*da58b97aSjoerg 693*da58b97aSjoerglet Constraints = "$vdst = $src2", 694*da58b97aSjoerg DisableEncoding = "$src2", 695*da58b97aSjoerg isConvertibleToThreeAddress = 1, 696*da58b97aSjoerg isCommutable = 1 in 697*da58b97aSjoergdefm V_FMAC_LEGACY_F32 : VOP2Inst <"v_fmac_legacy_f32", VOP_MAC_LEGACY_F32>; 698*da58b97aSjoerg 699*da58b97aSjoerg} // End SubtargetPredicate = HasFmaLegacy32 700*da58b97aSjoerg 701*da58b97aSjoerglet SubtargetPredicate = isGFX90APlus, 702*da58b97aSjoerg Constraints = "$vdst = $src2", 703*da58b97aSjoerg DisableEncoding="$src2", 704*da58b97aSjoerg isConvertibleToThreeAddress = 1, 705*da58b97aSjoerg isCommutable = 1, 706*da58b97aSjoerg SchedRW = [WriteDoubleAdd] in 707*da58b97aSjoergdefm V_FMAC_F64 : VOP2Inst <"v_fmac_f64", VOP_MAC_F64>; 708*da58b97aSjoerg 70906f32e7eSjoerglet Constraints = "$vdst = $src2", 71006f32e7eSjoerg DisableEncoding="$src2", 71106f32e7eSjoerg isConvertibleToThreeAddress = 1, 71206f32e7eSjoerg isCommutable = 1, 71306f32e7eSjoerg IsDOT = 1 in { 71406f32e7eSjoerg let SubtargetPredicate = HasDot5Insts in 71506f32e7eSjoerg defm V_DOT2C_F32_F16 : VOP2Inst<"v_dot2c_f32_f16", VOP_DOT_ACC_F32_V2F16>; 71606f32e7eSjoerg let SubtargetPredicate = HasDot6Insts in 71706f32e7eSjoerg defm V_DOT4C_I32_I8 : VOP2Inst<"v_dot4c_i32_i8", VOP_DOT_ACC_I32_I32>; 71806f32e7eSjoerg 71906f32e7eSjoerg let SubtargetPredicate = HasDot4Insts in 72006f32e7eSjoerg defm V_DOT2C_I32_I16 : VOP2Inst<"v_dot2c_i32_i16", VOP_DOT_ACC_I32_I32>; 72106f32e7eSjoerg let SubtargetPredicate = HasDot3Insts in 72206f32e7eSjoerg defm V_DOT8C_I32_I4 : VOP2Inst<"v_dot8c_i32_i4", VOP_DOT_ACC_I32_I32>; 72306f32e7eSjoerg} 72406f32e7eSjoerg 72506f32e7eSjoerglet AddedComplexity = 30 in { 72606f32e7eSjoerg def : GCNPat< 72706f32e7eSjoerg (f32 (AMDGPUfdot2 v2f16:$src0, v2f16:$src1, f32:$src2, (i1 DSTCLAMP.NONE))), 72806f32e7eSjoerg (f32 (V_DOT2C_F32_F16_e32 $src0, $src1, $src2)) 72906f32e7eSjoerg > { 73006f32e7eSjoerg let SubtargetPredicate = HasDot5Insts; 73106f32e7eSjoerg } 73206f32e7eSjoerg def : GCNPat< 73306f32e7eSjoerg (i32 (int_amdgcn_sdot4 i32:$src0, i32:$src1, i32:$src2, (i1 DSTCLAMP.NONE))), 73406f32e7eSjoerg (i32 (V_DOT4C_I32_I8_e32 $src0, $src1, $src2)) 73506f32e7eSjoerg > { 73606f32e7eSjoerg let SubtargetPredicate = HasDot6Insts; 73706f32e7eSjoerg } 73806f32e7eSjoerg def : GCNPat< 73906f32e7eSjoerg (i32 (int_amdgcn_sdot2 v2i16:$src0, v2i16:$src1, i32:$src2, (i1 DSTCLAMP.NONE))), 74006f32e7eSjoerg (i32 (V_DOT2C_I32_I16_e32 $src0, $src1, $src2)) 74106f32e7eSjoerg > { 74206f32e7eSjoerg let SubtargetPredicate = HasDot4Insts; 74306f32e7eSjoerg } 74406f32e7eSjoerg def : GCNPat< 74506f32e7eSjoerg (i32 (int_amdgcn_sdot8 i32:$src0, i32:$src1, i32:$src2, (i1 DSTCLAMP.NONE))), 74606f32e7eSjoerg (i32 (V_DOT8C_I32_I4_e32 $src0, $src1, $src2)) 74706f32e7eSjoerg > { 74806f32e7eSjoerg let SubtargetPredicate = HasDot3Insts; 74906f32e7eSjoerg } 75006f32e7eSjoerg} // End AddedComplexity = 30 75106f32e7eSjoerg 752*da58b97aSjoerglet SubtargetPredicate = HasFmaakFmamkF32Insts in { 753*da58b97aSjoergdef V_FMAMK_F32 : VOP2_Pseudo<"v_fmamk_f32", VOP_MADMK_F32, [], "">; 754*da58b97aSjoerg 755*da58b97aSjoerglet isCommutable = 1 in 756*da58b97aSjoergdef V_FMAAK_F32 : VOP2_Pseudo<"v_fmaak_f32", VOP_MADAK_F32, [], "">; 757*da58b97aSjoerg} 758*da58b97aSjoerg 75906f32e7eSjoerglet SubtargetPredicate = isGFX10Plus in { 76006f32e7eSjoerg 761*da58b97aSjoerglet FPDPRounding = 1 in { 76206f32e7eSjoergdef V_FMAMK_F16 : VOP2_Pseudo <"v_fmamk_f16", VOP_MADMK_F16, [], "">; 76306f32e7eSjoerg 764*da58b97aSjoerglet isCommutable = 1 in 76506f32e7eSjoergdef V_FMAAK_F16 : VOP2_Pseudo <"v_fmaak_f16", VOP_MADAK_F16, [], "">; 766*da58b97aSjoerg} // End FPDPRounding = 1 76706f32e7eSjoerg 76806f32e7eSjoerglet Constraints = "$vdst = $src2", 76906f32e7eSjoerg DisableEncoding="$src2", 77006f32e7eSjoerg isConvertibleToThreeAddress = 1, 77106f32e7eSjoerg isCommutable = 1 in { 77206f32e7eSjoergdefm V_FMAC_F16 : VOP2Inst <"v_fmac_f16", VOP_MAC_F16>; 77306f32e7eSjoerg} 77406f32e7eSjoerg 77506f32e7eSjoerg} // End SubtargetPredicate = isGFX10Plus 77606f32e7eSjoerg 77706f32e7eSjoerglet SubtargetPredicate = HasPkFmacF16Inst in { 77806f32e7eSjoergdefm V_PK_FMAC_F16 : VOP2Inst<"v_pk_fmac_f16", VOP_V2F16_V2F16_V2F16>; 77906f32e7eSjoerg} // End SubtargetPredicate = HasPkFmacF16Inst 78006f32e7eSjoerg 78106f32e7eSjoerg// Note: 16-bit instructions produce a 0 result in the high 16-bits 78206f32e7eSjoerg// on GFX8 and GFX9 and preserve high 16 bits on GFX10+ 78306f32e7eSjoergmulticlass Arithmetic_i16_0Hi_Pats <SDPatternOperator op, Instruction inst> { 78406f32e7eSjoerg 78506f32e7eSjoergdef : GCNPat< 78606f32e7eSjoerg (i32 (zext (op i16:$src0, i16:$src1))), 787*da58b97aSjoerg (inst VSrc_b16:$src0, VSrc_b16:$src1) 78806f32e7eSjoerg>; 78906f32e7eSjoerg 79006f32e7eSjoergdef : GCNPat< 79106f32e7eSjoerg (i64 (zext (op i16:$src0, i16:$src1))), 79206f32e7eSjoerg (REG_SEQUENCE VReg_64, 79306f32e7eSjoerg (inst $src0, $src1), sub0, 79406f32e7eSjoerg (V_MOV_B32_e32 (i32 0)), sub1) 79506f32e7eSjoerg>; 79606f32e7eSjoerg} 79706f32e7eSjoerg 79806f32e7eSjoergclass ZExt_i16_i1_Pat <SDNode ext> : GCNPat < 79906f32e7eSjoerg (i16 (ext i1:$src)), 80006f32e7eSjoerg (V_CNDMASK_B32_e64 (i32 0/*src0mod*/), (i32 0/*src0*/), 80106f32e7eSjoerg (i32 0/*src1mod*/), (i32 1/*src1*/), 80206f32e7eSjoerg $src) 80306f32e7eSjoerg>; 80406f32e7eSjoerg 80506f32e7eSjoergforeach vt = [i16, v2i16] in { 80606f32e7eSjoergdef : GCNPat < 80706f32e7eSjoerg (and vt:$src0, vt:$src1), 80806f32e7eSjoerg (V_AND_B32_e64 VSrc_b32:$src0, VSrc_b32:$src1) 80906f32e7eSjoerg>; 81006f32e7eSjoerg 81106f32e7eSjoergdef : GCNPat < 81206f32e7eSjoerg (or vt:$src0, vt:$src1), 81306f32e7eSjoerg (V_OR_B32_e64 VSrc_b32:$src0, VSrc_b32:$src1) 81406f32e7eSjoerg>; 81506f32e7eSjoerg 81606f32e7eSjoergdef : GCNPat < 81706f32e7eSjoerg (xor vt:$src0, vt:$src1), 81806f32e7eSjoerg (V_XOR_B32_e64 VSrc_b32:$src0, VSrc_b32:$src1) 81906f32e7eSjoerg>; 82006f32e7eSjoerg} 82106f32e7eSjoerg 82206f32e7eSjoerglet Predicates = [Has16BitInsts] in { 82306f32e7eSjoerg 824*da58b97aSjoerg// Undo sub x, c -> add x, -c canonicalization since c is more likely 825*da58b97aSjoerg// an inline immediate than -c. 826*da58b97aSjoerg// TODO: Also do for 64-bit. 827*da58b97aSjoergdef : GCNPat< 828*da58b97aSjoerg (add i16:$src0, (i16 NegSubInlineIntConst16:$src1)), 829*da58b97aSjoerg (V_SUB_U16_e64 VSrc_b16:$src0, NegSubInlineIntConst16:$src1) 830*da58b97aSjoerg>; 831*da58b97aSjoerg 832*da58b97aSjoerg 83306f32e7eSjoerglet Predicates = [Has16BitInsts, isGFX7GFX8GFX9] in { 834*da58b97aSjoerg 835*da58b97aSjoergdef : GCNPat< 836*da58b97aSjoerg (i32 (zext (add i16:$src0, (i16 NegSubInlineIntConst16:$src1)))), 837*da58b97aSjoerg (V_SUB_U16_e64 VSrc_b16:$src0, NegSubInlineIntConst16:$src1) 838*da58b97aSjoerg>; 839*da58b97aSjoerg 84006f32e7eSjoergdefm : Arithmetic_i16_0Hi_Pats<add, V_ADD_U16_e64>; 84106f32e7eSjoergdefm : Arithmetic_i16_0Hi_Pats<mul, V_MUL_LO_U16_e64>; 84206f32e7eSjoergdefm : Arithmetic_i16_0Hi_Pats<sub, V_SUB_U16_e64>; 84306f32e7eSjoergdefm : Arithmetic_i16_0Hi_Pats<smin, V_MIN_I16_e64>; 84406f32e7eSjoergdefm : Arithmetic_i16_0Hi_Pats<smax, V_MAX_I16_e64>; 84506f32e7eSjoergdefm : Arithmetic_i16_0Hi_Pats<umin, V_MIN_U16_e64>; 84606f32e7eSjoergdefm : Arithmetic_i16_0Hi_Pats<umax, V_MAX_U16_e64>; 84706f32e7eSjoergdefm : Arithmetic_i16_0Hi_Pats<lshl_rev, V_LSHLREV_B16_e64>; 84806f32e7eSjoergdefm : Arithmetic_i16_0Hi_Pats<lshr_rev, V_LSHRREV_B16_e64>; 84906f32e7eSjoergdefm : Arithmetic_i16_0Hi_Pats<ashr_rev, V_ASHRREV_I16_e64>; 850*da58b97aSjoerg} // End Predicates = [Has16BitInsts, isGFX7GFX8GFX9] 85106f32e7eSjoerg 85206f32e7eSjoergdef : ZExt_i16_i1_Pat<zext>; 85306f32e7eSjoergdef : ZExt_i16_i1_Pat<anyext>; 85406f32e7eSjoerg 85506f32e7eSjoergdef : GCNPat < 85606f32e7eSjoerg (i16 (sext i1:$src)), 85706f32e7eSjoerg (V_CNDMASK_B32_e64 /*src0mod*/(i32 0), /*src0*/(i32 0), 85806f32e7eSjoerg /*src1mod*/(i32 0), /*src1*/(i32 -1), $src) 85906f32e7eSjoerg>; 86006f32e7eSjoerg 861*da58b97aSjoerg} // End Predicates = [Has16BitInsts] 86206f32e7eSjoerg 86306f32e7eSjoerg 864*da58b97aSjoerglet SubtargetPredicate = HasIntClamp in { 865*da58b97aSjoerg// Set clamp bit for saturation. 866*da58b97aSjoergdef : VOPBinOpClampPat<uaddsat, V_ADD_CO_U32_e64, i32>; 867*da58b97aSjoergdef : VOPBinOpClampPat<usubsat, V_SUB_CO_U32_e64, i32>; 868*da58b97aSjoerg} 869*da58b97aSjoerg 870*da58b97aSjoerglet SubtargetPredicate = HasAddNoCarryInsts, OtherPredicates = [HasIntClamp] in { 871*da58b97aSjoerglet AddedComplexity = 1 in { // Prefer over form with carry-out. 872*da58b97aSjoergdef : VOPBinOpClampPat<uaddsat, V_ADD_U32_e64, i32>; 873*da58b97aSjoergdef : VOPBinOpClampPat<usubsat, V_SUB_U32_e64, i32>; 874*da58b97aSjoerg} 875*da58b97aSjoerg} 876*da58b97aSjoerg 877*da58b97aSjoerglet SubtargetPredicate = Has16BitInsts, OtherPredicates = [HasIntClamp] in { 878*da58b97aSjoergdef : VOPBinOpClampPat<uaddsat, V_ADD_U16_e64, i16>; 879*da58b97aSjoergdef : VOPBinOpClampPat<usubsat, V_SUB_U16_e64, i16>; 880*da58b97aSjoerg} 88106f32e7eSjoerg 88206f32e7eSjoerg//===----------------------------------------------------------------------===// 88306f32e7eSjoerg// Target-specific instruction encodings. 88406f32e7eSjoerg//===----------------------------------------------------------------------===// 88506f32e7eSjoerg 88606f32e7eSjoergclass VOP2_DPP<bits<6> op, VOP2_DPP_Pseudo ps, 88706f32e7eSjoerg string opName = ps.OpName, VOPProfile p = ps.Pfl, 88806f32e7eSjoerg bit IsDPP16 = 0> : 88906f32e7eSjoerg VOP_DPP<opName, p, IsDPP16> { 89006f32e7eSjoerg let hasSideEffects = ps.hasSideEffects; 89106f32e7eSjoerg let Defs = ps.Defs; 89206f32e7eSjoerg let SchedRW = ps.SchedRW; 89306f32e7eSjoerg let Uses = ps.Uses; 89406f32e7eSjoerg 89506f32e7eSjoerg bits<8> vdst; 89606f32e7eSjoerg bits<8> src1; 89706f32e7eSjoerg let Inst{8-0} = 0xfa; 89806f32e7eSjoerg let Inst{16-9} = !if(p.HasSrc1, src1{7-0}, 0); 89906f32e7eSjoerg let Inst{24-17} = !if(p.EmitDst, vdst{7-0}, 0); 90006f32e7eSjoerg let Inst{30-25} = op; 90106f32e7eSjoerg let Inst{31} = 0x0; 90206f32e7eSjoerg} 90306f32e7eSjoerg 90406f32e7eSjoergclass Base_VOP2_DPP16<bits<6> op, VOP2_DPP_Pseudo ps, 90506f32e7eSjoerg string opName = ps.OpName, VOPProfile p = ps.Pfl> : 90606f32e7eSjoerg VOP2_DPP<op, ps, opName, p, 1> { 907*da58b97aSjoerg let AssemblerPredicate = HasDPP16; 90806f32e7eSjoerg let SubtargetPredicate = HasDPP16; 909*da58b97aSjoerg let OtherPredicates = ps.OtherPredicates; 91006f32e7eSjoerg} 91106f32e7eSjoerg 91206f32e7eSjoergclass VOP2_DPP16<bits<6> op, VOP2_DPP_Pseudo ps, 91306f32e7eSjoerg string opName = ps.OpName, VOPProfile p = ps.Pfl> : 91406f32e7eSjoerg Base_VOP2_DPP16<op, ps, opName, p>, 91506f32e7eSjoerg SIMCInstr <ps.PseudoInstr, SIEncodingFamily.GFX10>; 91606f32e7eSjoerg 91706f32e7eSjoergclass VOP2_DPP8<bits<6> op, VOP2_Pseudo ps, 91806f32e7eSjoerg string opName = ps.OpName, VOPProfile p = ps.Pfl> : 91906f32e7eSjoerg VOP_DPP8<ps.OpName, p> { 92006f32e7eSjoerg let hasSideEffects = ps.hasSideEffects; 92106f32e7eSjoerg let Defs = ps.Defs; 92206f32e7eSjoerg let SchedRW = ps.SchedRW; 92306f32e7eSjoerg let Uses = ps.Uses; 92406f32e7eSjoerg 92506f32e7eSjoerg bits<8> vdst; 92606f32e7eSjoerg bits<8> src1; 92706f32e7eSjoerg 92806f32e7eSjoerg let Inst{8-0} = fi; 92906f32e7eSjoerg let Inst{16-9} = !if(p.HasSrc1, src1{7-0}, 0); 93006f32e7eSjoerg let Inst{24-17} = !if(p.EmitDst, vdst{7-0}, 0); 93106f32e7eSjoerg let Inst{30-25} = op; 93206f32e7eSjoerg let Inst{31} = 0x0; 93306f32e7eSjoerg 934*da58b97aSjoerg let OtherPredicates = ps.OtherPredicates; 93506f32e7eSjoerg} 93606f32e7eSjoerg 93706f32e7eSjoerg//===----------------------------------------------------------------------===// 93806f32e7eSjoerg// GFX10. 93906f32e7eSjoerg//===----------------------------------------------------------------------===// 94006f32e7eSjoerg 94106f32e7eSjoerglet AssemblerPredicate = isGFX10Plus, DecoderNamespace = "GFX10" in { 94206f32e7eSjoerg //===------------------------------- VOP2 -------------------------------===// 94306f32e7eSjoerg multiclass VOP2Only_Real_MADK_gfx10<bits<6> op> { 94406f32e7eSjoerg def _gfx10 : 94506f32e7eSjoerg VOP2_Real<!cast<VOP2_Pseudo>(NAME), SIEncodingFamily.GFX10>, 94606f32e7eSjoerg VOP2_MADKe<op{5-0}, !cast<VOP2_Pseudo>(NAME).Pfl>; 94706f32e7eSjoerg } 94806f32e7eSjoerg multiclass VOP2Only_Real_MADK_gfx10_with_name<bits<6> op, string opName, 94906f32e7eSjoerg string asmName> { 95006f32e7eSjoerg def _gfx10 : 95106f32e7eSjoerg VOP2_Real<!cast<VOP2_Pseudo>(opName), SIEncodingFamily.GFX10>, 95206f32e7eSjoerg VOP2_MADKe<op{5-0}, !cast<VOP2_Pseudo>(opName).Pfl> { 95306f32e7eSjoerg VOP2_Pseudo ps = !cast<VOP2_Pseudo>(opName); 95406f32e7eSjoerg let AsmString = asmName # ps.AsmOperands; 95506f32e7eSjoerg } 95606f32e7eSjoerg } 95706f32e7eSjoerg multiclass VOP2_Real_e32_gfx10<bits<6> op> { 95806f32e7eSjoerg def _e32_gfx10 : 95906f32e7eSjoerg VOP2_Real<!cast<VOP2_Pseudo>(NAME#"_e32"), SIEncodingFamily.GFX10>, 96006f32e7eSjoerg VOP2e<op{5-0}, !cast<VOP2_Pseudo>(NAME#"_e32").Pfl>; 96106f32e7eSjoerg } 96206f32e7eSjoerg multiclass VOP2_Real_e64_gfx10<bits<6> op> { 96306f32e7eSjoerg def _e64_gfx10 : 96406f32e7eSjoerg VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.GFX10>, 96506f32e7eSjoerg VOP3e_gfx10<{0, 1, 0, 0, op{5-0}}, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 96606f32e7eSjoerg } 96706f32e7eSjoerg multiclass VOP2_Real_sdwa_gfx10<bits<6> op> { 96806f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA9>.ret in 96906f32e7eSjoerg def _sdwa_gfx10 : 97006f32e7eSjoerg VOP_SDWA10_Real<!cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa")>, 97106f32e7eSjoerg VOP2_SDWA9Ae<op{5-0}, !cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa").Pfl> { 97206f32e7eSjoerg let DecoderNamespace = "SDWA10"; 97306f32e7eSjoerg } 97406f32e7eSjoerg } 97506f32e7eSjoerg multiclass VOP2_Real_dpp_gfx10<bits<6> op> { 97606f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtDPP>.ret in 97706f32e7eSjoerg def _dpp_gfx10 : VOP2_DPP16<op, !cast<VOP2_DPP_Pseudo>(NAME#"_dpp")> { 97806f32e7eSjoerg let DecoderNamespace = "SDWA10"; 97906f32e7eSjoerg } 98006f32e7eSjoerg } 98106f32e7eSjoerg multiclass VOP2_Real_dpp8_gfx10<bits<6> op> { 98206f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtDPP>.ret in 98306f32e7eSjoerg def _dpp8_gfx10 : VOP2_DPP8<op, !cast<VOP2_Pseudo>(NAME#"_e32")> { 98406f32e7eSjoerg let DecoderNamespace = "DPP8"; 98506f32e7eSjoerg } 98606f32e7eSjoerg } 98706f32e7eSjoerg 98806f32e7eSjoerg //===------------------------- VOP2 (with name) -------------------------===// 98906f32e7eSjoerg multiclass VOP2_Real_e32_gfx10_with_name<bits<6> op, string opName, 99006f32e7eSjoerg string asmName> { 99106f32e7eSjoerg def _e32_gfx10 : 99206f32e7eSjoerg VOP2_Real<!cast<VOP2_Pseudo>(opName#"_e32"), SIEncodingFamily.GFX10>, 99306f32e7eSjoerg VOP2e<op{5-0}, !cast<VOP2_Pseudo>(opName#"_e32").Pfl> { 99406f32e7eSjoerg VOP2_Pseudo ps = !cast<VOP2_Pseudo>(opName#"_e32"); 99506f32e7eSjoerg let AsmString = asmName # ps.AsmOperands; 99606f32e7eSjoerg } 99706f32e7eSjoerg } 99806f32e7eSjoerg multiclass VOP2_Real_e64_gfx10_with_name<bits<6> op, string opName, 99906f32e7eSjoerg string asmName> { 100006f32e7eSjoerg def _e64_gfx10 : 100106f32e7eSjoerg VOP3_Real<!cast<VOP3_Pseudo>(opName#"_e64"), SIEncodingFamily.GFX10>, 100206f32e7eSjoerg VOP3e_gfx10<{0, 1, 0, 0, op{5-0}}, 100306f32e7eSjoerg !cast<VOP3_Pseudo>(opName#"_e64").Pfl> { 100406f32e7eSjoerg VOP3_Pseudo ps = !cast<VOP3_Pseudo>(opName#"_e64"); 100506f32e7eSjoerg let AsmString = asmName # ps.AsmOperands; 100606f32e7eSjoerg } 100706f32e7eSjoerg } 100806f32e7eSjoerg let DecoderNamespace = "SDWA10" in { 100906f32e7eSjoerg multiclass VOP2_Real_sdwa_gfx10_with_name<bits<6> op, string opName, 101006f32e7eSjoerg string asmName> { 101106f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtSDWA9>.ret in 101206f32e7eSjoerg def _sdwa_gfx10 : 101306f32e7eSjoerg VOP_SDWA10_Real<!cast<VOP2_SDWA_Pseudo>(opName#"_sdwa")>, 101406f32e7eSjoerg VOP2_SDWA9Ae<op{5-0}, !cast<VOP2_SDWA_Pseudo>(opName#"_sdwa").Pfl> { 101506f32e7eSjoerg VOP2_SDWA_Pseudo ps = !cast<VOP2_SDWA_Pseudo>(opName#"_sdwa"); 101606f32e7eSjoerg let AsmString = asmName # ps.AsmOperands; 101706f32e7eSjoerg } 101806f32e7eSjoerg } 101906f32e7eSjoerg multiclass VOP2_Real_dpp_gfx10_with_name<bits<6> op, string opName, 102006f32e7eSjoerg string asmName> { 102106f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtDPP>.ret in 102206f32e7eSjoerg def _dpp_gfx10 : VOP2_DPP16<op, !cast<VOP2_DPP_Pseudo>(opName#"_dpp")> { 102306f32e7eSjoerg VOP2_Pseudo ps = !cast<VOP2_Pseudo>(opName#"_e32"); 102406f32e7eSjoerg let AsmString = asmName # ps.Pfl.AsmDPP16; 102506f32e7eSjoerg } 102606f32e7eSjoerg } 102706f32e7eSjoerg multiclass VOP2_Real_dpp8_gfx10_with_name<bits<6> op, string opName, 102806f32e7eSjoerg string asmName> { 102906f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtDPP>.ret in 103006f32e7eSjoerg def _dpp8_gfx10 : VOP2_DPP8<op, !cast<VOP2_Pseudo>(opName#"_e32")> { 103106f32e7eSjoerg VOP2_Pseudo ps = !cast<VOP2_Pseudo>(opName#"_e32"); 103206f32e7eSjoerg let AsmString = asmName # ps.Pfl.AsmDPP8; 103306f32e7eSjoerg let DecoderNamespace = "DPP8"; 103406f32e7eSjoerg } 103506f32e7eSjoerg } 103606f32e7eSjoerg } // End DecoderNamespace = "SDWA10" 103706f32e7eSjoerg 103806f32e7eSjoerg //===------------------------------ VOP2be ------------------------------===// 103906f32e7eSjoerg multiclass VOP2be_Real_e32_gfx10<bits<6> op, string opName, string asmName> { 104006f32e7eSjoerg def _e32_gfx10 : 104106f32e7eSjoerg VOP2_Real<!cast<VOP2_Pseudo>(opName#"_e32"), SIEncodingFamily.GFX10>, 104206f32e7eSjoerg VOP2e<op{5-0}, !cast<VOP2_Pseudo>(opName#"_e32").Pfl> { 104306f32e7eSjoerg VOP2_Pseudo Ps = !cast<VOP2_Pseudo>(opName#"_e32"); 104406f32e7eSjoerg let AsmString = asmName # !subst(", vcc", "", Ps.AsmOperands); 104506f32e7eSjoerg } 104606f32e7eSjoerg } 104706f32e7eSjoerg multiclass VOP2be_Real_e64_gfx10<bits<6> op, string opName, string asmName> { 104806f32e7eSjoerg def _e64_gfx10 : 104906f32e7eSjoerg VOP3_Real<!cast<VOP3_Pseudo>(opName#"_e64"), SIEncodingFamily.GFX10>, 105006f32e7eSjoerg VOP3be_gfx10<{0, 1, 0, 0, op{5-0}}, 105106f32e7eSjoerg !cast<VOP3_Pseudo>(opName#"_e64").Pfl> { 105206f32e7eSjoerg VOP3_Pseudo Ps = !cast<VOP3_Pseudo>(opName#"_e64"); 105306f32e7eSjoerg let AsmString = asmName # Ps.AsmOperands; 105406f32e7eSjoerg } 105506f32e7eSjoerg } 105606f32e7eSjoerg multiclass VOP2be_Real_sdwa_gfx10<bits<6> op, string opName, string asmName> { 105706f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtSDWA9>.ret in 105806f32e7eSjoerg def _sdwa_gfx10 : 105906f32e7eSjoerg VOP_SDWA10_Real<!cast<VOP2_SDWA_Pseudo>(opName#"_sdwa")>, 106006f32e7eSjoerg VOP2_SDWA9Ae<op{5-0}, !cast<VOP2_SDWA_Pseudo>(opName#"_sdwa").Pfl> { 106106f32e7eSjoerg VOP2_SDWA_Pseudo Ps = !cast<VOP2_SDWA_Pseudo>(opName#"_sdwa"); 106206f32e7eSjoerg let AsmString = asmName # !subst(", vcc", "", Ps.AsmOperands); 106306f32e7eSjoerg let DecoderNamespace = "SDWA10"; 106406f32e7eSjoerg } 106506f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtSDWA9>.ret in 106606f32e7eSjoerg def _sdwa_w32_gfx10 : 106706f32e7eSjoerg Base_VOP_SDWA10_Real<!cast<VOP2_SDWA_Pseudo>(opName#"_sdwa")>, 106806f32e7eSjoerg VOP2_SDWA9Ae<op{5-0}, !cast<VOP2_SDWA_Pseudo>(opName#"_sdwa").Pfl> { 106906f32e7eSjoerg VOP2_SDWA_Pseudo Ps = !cast<VOP2_SDWA_Pseudo>(opName#"_sdwa"); 107006f32e7eSjoerg let AsmString = asmName # !subst("vcc", "vcc_lo", Ps.AsmOperands); 107106f32e7eSjoerg let isAsmParserOnly = 1; 107206f32e7eSjoerg let DecoderNamespace = "SDWA10"; 107306f32e7eSjoerg let WaveSizePredicate = isWave32; 107406f32e7eSjoerg } 107506f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtSDWA9>.ret in 107606f32e7eSjoerg def _sdwa_w64_gfx10 : 107706f32e7eSjoerg Base_VOP_SDWA10_Real<!cast<VOP2_SDWA_Pseudo>(opName#"_sdwa")>, 107806f32e7eSjoerg VOP2_SDWA9Ae<op{5-0}, !cast<VOP2_SDWA_Pseudo>(opName#"_sdwa").Pfl> { 107906f32e7eSjoerg VOP2_SDWA_Pseudo Ps = !cast<VOP2_SDWA_Pseudo>(opName#"_sdwa"); 108006f32e7eSjoerg let AsmString = asmName # Ps.AsmOperands; 108106f32e7eSjoerg let isAsmParserOnly = 1; 108206f32e7eSjoerg let DecoderNamespace = "SDWA10"; 108306f32e7eSjoerg let WaveSizePredicate = isWave64; 108406f32e7eSjoerg } 108506f32e7eSjoerg } 108606f32e7eSjoerg multiclass VOP2be_Real_dpp_gfx10<bits<6> op, string opName, string asmName> { 108706f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtDPP>.ret in 108806f32e7eSjoerg def _dpp_gfx10 : 108906f32e7eSjoerg VOP2_DPP16<op, !cast<VOP2_DPP_Pseudo>(opName#"_dpp"), asmName> { 109006f32e7eSjoerg string AsmDPP = !cast<VOP2_Pseudo>(opName#"_e32").Pfl.AsmDPP16; 109106f32e7eSjoerg let AsmString = asmName # !subst(", vcc", "", AsmDPP); 109206f32e7eSjoerg let DecoderNamespace = "SDWA10"; 109306f32e7eSjoerg } 109406f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtDPP>.ret in 109506f32e7eSjoerg def _dpp_w32_gfx10 : 109606f32e7eSjoerg Base_VOP2_DPP16<op, !cast<VOP2_DPP_Pseudo>(opName#"_dpp"), asmName> { 109706f32e7eSjoerg string AsmDPP = !cast<VOP2_Pseudo>(opName#"_e32").Pfl.AsmDPP16; 109806f32e7eSjoerg let AsmString = asmName # !subst("vcc", "vcc_lo", AsmDPP); 109906f32e7eSjoerg let isAsmParserOnly = 1; 110006f32e7eSjoerg let WaveSizePredicate = isWave32; 110106f32e7eSjoerg } 110206f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtDPP>.ret in 110306f32e7eSjoerg def _dpp_w64_gfx10 : 110406f32e7eSjoerg Base_VOP2_DPP16<op, !cast<VOP2_DPP_Pseudo>(opName#"_dpp"), asmName> { 110506f32e7eSjoerg string AsmDPP = !cast<VOP2_Pseudo>(opName#"_e32").Pfl.AsmDPP16; 110606f32e7eSjoerg let AsmString = asmName # AsmDPP; 110706f32e7eSjoerg let isAsmParserOnly = 1; 110806f32e7eSjoerg let WaveSizePredicate = isWave64; 110906f32e7eSjoerg } 111006f32e7eSjoerg } 111106f32e7eSjoerg multiclass VOP2be_Real_dpp8_gfx10<bits<6> op, string opName, string asmName> { 111206f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtDPP>.ret in 111306f32e7eSjoerg def _dpp8_gfx10 : 111406f32e7eSjoerg VOP2_DPP8<op, !cast<VOP2_Pseudo>(opName#"_e32"), asmName> { 111506f32e7eSjoerg string AsmDPP8 = !cast<VOP2_Pseudo>(opName#"_e32").Pfl.AsmDPP8; 111606f32e7eSjoerg let AsmString = asmName # !subst(", vcc", "", AsmDPP8); 111706f32e7eSjoerg let DecoderNamespace = "DPP8"; 111806f32e7eSjoerg } 111906f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtDPP>.ret in 112006f32e7eSjoerg def _dpp8_w32_gfx10 : 112106f32e7eSjoerg VOP2_DPP8<op, !cast<VOP2_Pseudo>(opName#"_e32"), asmName> { 112206f32e7eSjoerg string AsmDPP8 = !cast<VOP2_Pseudo>(opName#"_e32").Pfl.AsmDPP8; 112306f32e7eSjoerg let AsmString = asmName # !subst("vcc", "vcc_lo", AsmDPP8); 112406f32e7eSjoerg let isAsmParserOnly = 1; 112506f32e7eSjoerg let WaveSizePredicate = isWave32; 112606f32e7eSjoerg } 112706f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtDPP>.ret in 112806f32e7eSjoerg def _dpp8_w64_gfx10 : 112906f32e7eSjoerg VOP2_DPP8<op, !cast<VOP2_Pseudo>(opName#"_e32"), asmName> { 113006f32e7eSjoerg string AsmDPP8 = !cast<VOP2_Pseudo>(opName#"_e32").Pfl.AsmDPP8; 113106f32e7eSjoerg let AsmString = asmName # AsmDPP8; 113206f32e7eSjoerg let isAsmParserOnly = 1; 113306f32e7eSjoerg let WaveSizePredicate = isWave64; 113406f32e7eSjoerg } 113506f32e7eSjoerg } 113606f32e7eSjoerg 113706f32e7eSjoerg //===----------------------------- VOP3Only -----------------------------===// 113806f32e7eSjoerg multiclass VOP3Only_Real_gfx10<bits<10> op> { 113906f32e7eSjoerg def _e64_gfx10 : 114006f32e7eSjoerg VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.GFX10>, 1141*da58b97aSjoerg VOP3e_gfx10<op, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl> { 1142*da58b97aSjoerg let IsSingle = 1; 1143*da58b97aSjoerg } 114406f32e7eSjoerg } 114506f32e7eSjoerg 114606f32e7eSjoerg //===---------------------------- VOP3beOnly ----------------------------===// 1147*da58b97aSjoerg multiclass VOP3beOnly_Real_gfx10<bits<10> op> { 114806f32e7eSjoerg def _e64_gfx10 : 1149*da58b97aSjoerg VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.GFX10>, 1150*da58b97aSjoerg VOP3be_gfx10<op, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl> { 1151*da58b97aSjoerg let IsSingle = 1; 115206f32e7eSjoerg } 115306f32e7eSjoerg } 115406f32e7eSjoerg} // End AssemblerPredicate = isGFX10Plus, DecoderNamespace = "GFX10" 115506f32e7eSjoerg 115606f32e7eSjoergmulticlass VOP2be_Real_gfx10<bits<6> op, string opName, string asmName> : 115706f32e7eSjoerg VOP2be_Real_e32_gfx10<op, opName, asmName>, 115806f32e7eSjoerg VOP2be_Real_e64_gfx10<op, opName, asmName>, 115906f32e7eSjoerg VOP2be_Real_sdwa_gfx10<op, opName, asmName>, 116006f32e7eSjoerg VOP2be_Real_dpp_gfx10<op, opName, asmName>, 116106f32e7eSjoerg VOP2be_Real_dpp8_gfx10<op, opName, asmName>; 116206f32e7eSjoerg 116306f32e7eSjoergmulticlass VOP2e_Real_gfx10<bits<6> op, string opName, string asmName> : 116406f32e7eSjoerg VOP2_Real_e32_gfx10<op>, 116506f32e7eSjoerg VOP2_Real_e64_gfx10<op>, 116606f32e7eSjoerg VOP2be_Real_sdwa_gfx10<op, opName, asmName>, 116706f32e7eSjoerg VOP2be_Real_dpp_gfx10<op, opName, asmName>, 116806f32e7eSjoerg VOP2be_Real_dpp8_gfx10<op, opName, asmName>; 116906f32e7eSjoerg 117006f32e7eSjoergmulticlass VOP2_Real_gfx10<bits<6> op> : 117106f32e7eSjoerg VOP2_Real_e32_gfx10<op>, VOP2_Real_e64_gfx10<op>, 117206f32e7eSjoerg VOP2_Real_sdwa_gfx10<op>, VOP2_Real_dpp_gfx10<op>, VOP2_Real_dpp8_gfx10<op>; 117306f32e7eSjoerg 117406f32e7eSjoergmulticlass VOP2_Real_gfx10_with_name<bits<6> op, string opName, 117506f32e7eSjoerg string asmName> : 117606f32e7eSjoerg VOP2_Real_e32_gfx10_with_name<op, opName, asmName>, 117706f32e7eSjoerg VOP2_Real_e64_gfx10_with_name<op, opName, asmName>, 117806f32e7eSjoerg VOP2_Real_sdwa_gfx10_with_name<op, opName, asmName>, 117906f32e7eSjoerg VOP2_Real_dpp_gfx10_with_name<op, opName, asmName>, 118006f32e7eSjoerg VOP2_Real_dpp8_gfx10_with_name<op, opName, asmName>; 118106f32e7eSjoerg 1182*da58b97aSjoerg// NB: Same opcode as v_mac_legacy_f32 1183*da58b97aSjoerglet DecoderNamespace = "GFX10_B" in 1184*da58b97aSjoergdefm V_FMAC_LEGACY_F32 : VOP2_Real_gfx10<0x006>; 1185*da58b97aSjoerg 118606f32e7eSjoergdefm V_XNOR_B32 : VOP2_Real_gfx10<0x01e>; 118706f32e7eSjoergdefm V_FMAC_F32 : VOP2_Real_gfx10<0x02b>; 118806f32e7eSjoergdefm V_FMAMK_F32 : VOP2Only_Real_MADK_gfx10<0x02c>; 118906f32e7eSjoergdefm V_FMAAK_F32 : VOP2Only_Real_MADK_gfx10<0x02d>; 119006f32e7eSjoergdefm V_ADD_F16 : VOP2_Real_gfx10<0x032>; 119106f32e7eSjoergdefm V_SUB_F16 : VOP2_Real_gfx10<0x033>; 119206f32e7eSjoergdefm V_SUBREV_F16 : VOP2_Real_gfx10<0x034>; 119306f32e7eSjoergdefm V_MUL_F16 : VOP2_Real_gfx10<0x035>; 119406f32e7eSjoergdefm V_FMAC_F16 : VOP2_Real_gfx10<0x036>; 119506f32e7eSjoergdefm V_FMAMK_F16 : VOP2Only_Real_MADK_gfx10<0x037>; 119606f32e7eSjoergdefm V_FMAAK_F16 : VOP2Only_Real_MADK_gfx10<0x038>; 119706f32e7eSjoergdefm V_MAX_F16 : VOP2_Real_gfx10<0x039>; 119806f32e7eSjoergdefm V_MIN_F16 : VOP2_Real_gfx10<0x03a>; 119906f32e7eSjoergdefm V_LDEXP_F16 : VOP2_Real_gfx10<0x03b>; 1200*da58b97aSjoerg 1201*da58b97aSjoerglet IsSingle = 1 in { 120206f32e7eSjoergdefm V_PK_FMAC_F16 : VOP2_Real_e32_gfx10<0x03c>; 1203*da58b97aSjoerg} 120406f32e7eSjoerg 120506f32e7eSjoerg// VOP2 no carry-in, carry-out. 120606f32e7eSjoergdefm V_ADD_NC_U32 : 120706f32e7eSjoerg VOP2_Real_gfx10_with_name<0x025, "V_ADD_U32", "v_add_nc_u32">; 120806f32e7eSjoergdefm V_SUB_NC_U32 : 120906f32e7eSjoerg VOP2_Real_gfx10_with_name<0x026, "V_SUB_U32", "v_sub_nc_u32">; 121006f32e7eSjoergdefm V_SUBREV_NC_U32 : 121106f32e7eSjoerg VOP2_Real_gfx10_with_name<0x027, "V_SUBREV_U32", "v_subrev_nc_u32">; 121206f32e7eSjoerg 121306f32e7eSjoerg// VOP2 carry-in, carry-out. 121406f32e7eSjoergdefm V_ADD_CO_CI_U32 : 121506f32e7eSjoerg VOP2be_Real_gfx10<0x028, "V_ADDC_U32", "v_add_co_ci_u32">; 121606f32e7eSjoergdefm V_SUB_CO_CI_U32 : 121706f32e7eSjoerg VOP2be_Real_gfx10<0x029, "V_SUBB_U32", "v_sub_co_ci_u32">; 121806f32e7eSjoergdefm V_SUBREV_CO_CI_U32 : 121906f32e7eSjoerg VOP2be_Real_gfx10<0x02a, "V_SUBBREV_U32", "v_subrev_co_ci_u32">; 122006f32e7eSjoerg 122106f32e7eSjoergdefm V_CNDMASK_B32 : 122206f32e7eSjoerg VOP2e_Real_gfx10<0x001, "V_CNDMASK_B32", "v_cndmask_b32">; 122306f32e7eSjoerg 122406f32e7eSjoerg// VOP3 only. 122506f32e7eSjoergdefm V_BFM_B32 : VOP3Only_Real_gfx10<0x363>; 122606f32e7eSjoergdefm V_BCNT_U32_B32 : VOP3Only_Real_gfx10<0x364>; 122706f32e7eSjoergdefm V_MBCNT_LO_U32_B32 : VOP3Only_Real_gfx10<0x365>; 122806f32e7eSjoergdefm V_MBCNT_HI_U32_B32 : VOP3Only_Real_gfx10<0x366>; 122906f32e7eSjoergdefm V_LDEXP_F32 : VOP3Only_Real_gfx10<0x362>; 123006f32e7eSjoergdefm V_CVT_PKNORM_I16_F32 : VOP3Only_Real_gfx10<0x368>; 123106f32e7eSjoergdefm V_CVT_PKNORM_U16_F32 : VOP3Only_Real_gfx10<0x369>; 123206f32e7eSjoergdefm V_CVT_PK_U16_U32 : VOP3Only_Real_gfx10<0x36a>; 123306f32e7eSjoergdefm V_CVT_PK_I16_I32 : VOP3Only_Real_gfx10<0x36b>; 123406f32e7eSjoerg 1235*da58b97aSjoerg// VOP3 carry-out. 1236*da58b97aSjoergdefm V_ADD_CO_U32 : VOP3beOnly_Real_gfx10<0x30f>; 1237*da58b97aSjoergdefm V_SUB_CO_U32 : VOP3beOnly_Real_gfx10<0x310>; 1238*da58b97aSjoergdefm V_SUBREV_CO_U32 : VOP3beOnly_Real_gfx10<0x319>; 123906f32e7eSjoerg 124006f32e7eSjoerglet SubtargetPredicate = isGFX10Plus in { 124106f32e7eSjoerg defm : VOP2eInstAliases<V_CNDMASK_B32_e32, V_CNDMASK_B32_e32_gfx10>; 124206f32e7eSjoerg 124306f32e7eSjoerg defm : VOP2bInstAliases< 124406f32e7eSjoerg V_ADDC_U32_e32, V_ADD_CO_CI_U32_e32_gfx10, "v_add_co_ci_u32">; 124506f32e7eSjoerg defm : VOP2bInstAliases< 124606f32e7eSjoerg V_SUBB_U32_e32, V_SUB_CO_CI_U32_e32_gfx10, "v_sub_co_ci_u32">; 124706f32e7eSjoerg defm : VOP2bInstAliases< 124806f32e7eSjoerg V_SUBBREV_U32_e32, V_SUBREV_CO_CI_U32_e32_gfx10, "v_subrev_co_ci_u32">; 124906f32e7eSjoerg} // End SubtargetPredicate = isGFX10Plus 125006f32e7eSjoerg 125106f32e7eSjoerg//===----------------------------------------------------------------------===// 125206f32e7eSjoerg// GFX6, GFX7, GFX10. 125306f32e7eSjoerg//===----------------------------------------------------------------------===// 125406f32e7eSjoerg 125506f32e7eSjoergclass VOP2_DPPe <bits<6> op, VOP2_DPP_Pseudo ps, VOPProfile P = ps.Pfl> : 125606f32e7eSjoerg VOP_DPPe <P> { 125706f32e7eSjoerg bits<8> vdst; 125806f32e7eSjoerg bits<8> src1; 125906f32e7eSjoerg let Inst{8-0} = 0xfa; //dpp 126006f32e7eSjoerg let Inst{16-9} = !if(P.HasSrc1, src1{7-0}, 0); 126106f32e7eSjoerg let Inst{24-17} = !if(P.EmitDst, vdst{7-0}, 0); 126206f32e7eSjoerg let Inst{30-25} = op; 126306f32e7eSjoerg let Inst{31} = 0x0; //encoding 126406f32e7eSjoerg} 126506f32e7eSjoerg 126606f32e7eSjoerglet AssemblerPredicate = isGFX6GFX7, DecoderNamespace = "GFX6GFX7" in { 1267*da58b97aSjoerg multiclass VOP2_Lane_Real_gfx6_gfx7<bits<6> op> { 126806f32e7eSjoerg def _gfx6_gfx7 : 126906f32e7eSjoerg VOP2_Real<!cast<VOP2_Pseudo>(NAME), SIEncodingFamily.SI>, 127006f32e7eSjoerg VOP2e<op{5-0}, !cast<VOP2_Pseudo>(NAME).Pfl>; 127106f32e7eSjoerg } 127206f32e7eSjoerg multiclass VOP2Only_Real_MADK_gfx6_gfx7<bits<6> op> { 127306f32e7eSjoerg def _gfx6_gfx7 : 127406f32e7eSjoerg VOP2_Real<!cast<VOP2_Pseudo>(NAME), SIEncodingFamily.SI>, 127506f32e7eSjoerg VOP2_MADKe<op{5-0}, !cast<VOP2_Pseudo>(NAME).Pfl>; 127606f32e7eSjoerg } 1277*da58b97aSjoerg multiclass VOP2_Real_e32_gfx6_gfx7<bits<6> op, string PseudoName = NAME> { 127806f32e7eSjoerg def _e32_gfx6_gfx7 : 1279*da58b97aSjoerg VOP2_Real<!cast<VOP2_Pseudo>(PseudoName#"_e32"), SIEncodingFamily.SI>, 1280*da58b97aSjoerg VOP2e<op{5-0}, !cast<VOP2_Pseudo>(PseudoName#"_e32").Pfl>; 128106f32e7eSjoerg } 1282*da58b97aSjoerg multiclass VOP2_Real_e64_gfx6_gfx7<bits<6> op, string PseudoName = NAME> { 128306f32e7eSjoerg def _e64_gfx6_gfx7 : 1284*da58b97aSjoerg VOP3_Real<!cast<VOP3_Pseudo>(PseudoName#"_e64"), SIEncodingFamily.SI>, 1285*da58b97aSjoerg VOP3e_gfx6_gfx7<{1, 0, 0, op{5-0}}, !cast<VOP3_Pseudo>(PseudoName#"_e64").Pfl>; 128606f32e7eSjoerg } 1287*da58b97aSjoerg multiclass VOP2be_Real_e64_gfx6_gfx7<bits<6> op, string PseudoName = NAME> { 128806f32e7eSjoerg def _e64_gfx6_gfx7 : 1289*da58b97aSjoerg VOP3_Real<!cast<VOP3_Pseudo>(PseudoName#"_e64"), SIEncodingFamily.SI>, 1290*da58b97aSjoerg VOP3be_gfx6_gfx7<{1, 0, 0, op{5-0}}, !cast<VOP3_Pseudo>(PseudoName#"_e64").Pfl>; 129106f32e7eSjoerg } 129206f32e7eSjoerg} // End AssemblerPredicate = isGFX6GFX7, DecoderNamespace = "GFX6GFX7" 129306f32e7eSjoerg 129406f32e7eSjoergmulticlass VOP2Only_Real_MADK_gfx6_gfx7_gfx10<bits<6> op> : 129506f32e7eSjoerg VOP2Only_Real_MADK_gfx6_gfx7<op>, VOP2Only_Real_MADK_gfx10<op>; 129606f32e7eSjoerg 129706f32e7eSjoergmulticlass VOP2_Real_gfx6_gfx7<bits<6> op> : 129806f32e7eSjoerg VOP2_Real_e32_gfx6_gfx7<op>, VOP2_Real_e64_gfx6_gfx7<op>; 129906f32e7eSjoerg 130006f32e7eSjoergmulticlass VOP2_Real_gfx6_gfx7_gfx10<bits<6> op> : 130106f32e7eSjoerg VOP2_Real_gfx6_gfx7<op>, VOP2_Real_gfx10<op>; 130206f32e7eSjoerg 130306f32e7eSjoergmulticlass VOP2be_Real_gfx6_gfx7<bits<6> op> : 130406f32e7eSjoerg VOP2_Real_e32_gfx6_gfx7<op>, VOP2be_Real_e64_gfx6_gfx7<op>; 130506f32e7eSjoerg 1306*da58b97aSjoergmulticlass VOP2be_Real_gfx6_gfx7_with_name<bits<6> op, 1307*da58b97aSjoerg string PseudoName, string asmName> { 1308*da58b97aSjoerg defvar ps32 = !cast<VOP2_Pseudo>(PseudoName#"_e32"); 1309*da58b97aSjoerg defvar ps64 = !cast<VOP3_Pseudo>(PseudoName#"_e64"); 1310*da58b97aSjoerg 1311*da58b97aSjoerg let AsmString = asmName # ps32.AsmOperands in { 1312*da58b97aSjoerg defm "" : VOP2_Real_e32_gfx6_gfx7<op, PseudoName>; 1313*da58b97aSjoerg } 1314*da58b97aSjoerg 1315*da58b97aSjoerg let AsmString = asmName # ps64.AsmOperands in { 1316*da58b97aSjoerg defm "" : VOP2be_Real_e64_gfx6_gfx7<op, PseudoName>; 1317*da58b97aSjoerg } 1318*da58b97aSjoerg} 1319*da58b97aSjoerg 132006f32e7eSjoergdefm V_CNDMASK_B32 : VOP2_Real_gfx6_gfx7<0x000>; 132106f32e7eSjoergdefm V_MIN_LEGACY_F32 : VOP2_Real_gfx6_gfx7<0x00d>; 132206f32e7eSjoergdefm V_MAX_LEGACY_F32 : VOP2_Real_gfx6_gfx7<0x00e>; 132306f32e7eSjoergdefm V_LSHR_B32 : VOP2_Real_gfx6_gfx7<0x015>; 132406f32e7eSjoergdefm V_ASHR_I32 : VOP2_Real_gfx6_gfx7<0x017>; 132506f32e7eSjoergdefm V_LSHL_B32 : VOP2_Real_gfx6_gfx7<0x019>; 132606f32e7eSjoergdefm V_BFM_B32 : VOP2_Real_gfx6_gfx7<0x01e>; 132706f32e7eSjoergdefm V_BCNT_U32_B32 : VOP2_Real_gfx6_gfx7<0x022>; 132806f32e7eSjoergdefm V_MBCNT_LO_U32_B32 : VOP2_Real_gfx6_gfx7<0x023>; 132906f32e7eSjoergdefm V_MBCNT_HI_U32_B32 : VOP2_Real_gfx6_gfx7<0x024>; 133006f32e7eSjoergdefm V_LDEXP_F32 : VOP2_Real_gfx6_gfx7<0x02b>; 133106f32e7eSjoergdefm V_CVT_PKACCUM_U8_F32 : VOP2_Real_gfx6_gfx7<0x02c>; 133206f32e7eSjoergdefm V_CVT_PKNORM_I16_F32 : VOP2_Real_gfx6_gfx7<0x02d>; 133306f32e7eSjoergdefm V_CVT_PKNORM_U16_F32 : VOP2_Real_gfx6_gfx7<0x02e>; 133406f32e7eSjoergdefm V_CVT_PK_U16_U32 : VOP2_Real_gfx6_gfx7<0x030>; 133506f32e7eSjoergdefm V_CVT_PK_I16_I32 : VOP2_Real_gfx6_gfx7<0x031>; 1336*da58b97aSjoerg 1337*da58b97aSjoerg// V_ADD_I32, V_SUB_I32, and V_SUBREV_I32 where renamed to *_U32 in 1338*da58b97aSjoerg// VI, but the VI instructions behave the same as the SI versions. 1339*da58b97aSjoergdefm V_ADD_I32 : VOP2be_Real_gfx6_gfx7_with_name<0x025, "V_ADD_CO_U32", "v_add_i32">; 1340*da58b97aSjoergdefm V_SUB_I32 : VOP2be_Real_gfx6_gfx7_with_name<0x026, "V_SUB_CO_U32", "v_sub_i32">; 1341*da58b97aSjoergdefm V_SUBREV_I32 : VOP2be_Real_gfx6_gfx7_with_name<0x027, "V_SUBREV_CO_U32", "v_subrev_i32">; 134206f32e7eSjoergdefm V_ADDC_U32 : VOP2be_Real_gfx6_gfx7<0x028>; 134306f32e7eSjoergdefm V_SUBB_U32 : VOP2be_Real_gfx6_gfx7<0x029>; 134406f32e7eSjoergdefm V_SUBBREV_U32 : VOP2be_Real_gfx6_gfx7<0x02a>; 134506f32e7eSjoerg 1346*da58b97aSjoergdefm V_READLANE_B32 : VOP2_Lane_Real_gfx6_gfx7<0x001>; 134706f32e7eSjoerg 1348*da58b97aSjoerglet InOperandList = (ins SSrcOrLds_b32:$src0, SCSrc_b32:$src1, VGPR_32:$vdst_in) in { 1349*da58b97aSjoerg defm V_WRITELANE_B32 : VOP2_Lane_Real_gfx6_gfx7<0x002>; 1350*da58b97aSjoerg} // End InOperandList = (ins SSrcOrLds_b32:$src0, SCSrc_b32:$src1, VGPR_32:$vdst_in) 135106f32e7eSjoerg 135206f32e7eSjoerglet SubtargetPredicate = isGFX6GFX7 in { 135306f32e7eSjoerg defm : VOP2eInstAliases<V_CNDMASK_B32_e32, V_CNDMASK_B32_e32_gfx6_gfx7>; 1354*da58b97aSjoerg defm : VOP2eInstAliases<V_ADD_CO_U32_e32, V_ADD_I32_e32_gfx6_gfx7>; 1355*da58b97aSjoerg defm : VOP2eInstAliases<V_SUB_CO_U32_e32, V_SUB_I32_e32_gfx6_gfx7>; 1356*da58b97aSjoerg defm : VOP2eInstAliases<V_SUBREV_CO_U32_e32, V_SUBREV_I32_e32_gfx6_gfx7>; 1357*da58b97aSjoerg 1358*da58b97aSjoerg def : VOP2e64InstAlias<V_ADD_CO_U32_e64, V_ADD_I32_e64_gfx6_gfx7>; 1359*da58b97aSjoerg def : VOP2e64InstAlias<V_SUB_CO_U32_e64, V_SUB_I32_e64_gfx6_gfx7>; 1360*da58b97aSjoerg def : VOP2e64InstAlias<V_SUBREV_CO_U32_e64, V_SUBREV_I32_e64_gfx6_gfx7>; 136106f32e7eSjoerg} // End SubtargetPredicate = isGFX6GFX7 136206f32e7eSjoerg 136306f32e7eSjoergdefm V_ADD_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x003>; 136406f32e7eSjoergdefm V_SUB_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x004>; 136506f32e7eSjoergdefm V_SUBREV_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x005>; 136606f32e7eSjoergdefm V_MAC_LEGACY_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x006>; 136706f32e7eSjoergdefm V_MUL_LEGACY_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x007>; 136806f32e7eSjoergdefm V_MUL_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x008>; 136906f32e7eSjoergdefm V_MUL_I32_I24 : VOP2_Real_gfx6_gfx7_gfx10<0x009>; 137006f32e7eSjoergdefm V_MUL_HI_I32_I24 : VOP2_Real_gfx6_gfx7_gfx10<0x00a>; 137106f32e7eSjoergdefm V_MUL_U32_U24 : VOP2_Real_gfx6_gfx7_gfx10<0x00b>; 137206f32e7eSjoergdefm V_MUL_HI_U32_U24 : VOP2_Real_gfx6_gfx7_gfx10<0x00c>; 137306f32e7eSjoergdefm V_MIN_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x00f>; 137406f32e7eSjoergdefm V_MAX_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x010>; 137506f32e7eSjoergdefm V_MIN_I32 : VOP2_Real_gfx6_gfx7_gfx10<0x011>; 137606f32e7eSjoergdefm V_MAX_I32 : VOP2_Real_gfx6_gfx7_gfx10<0x012>; 137706f32e7eSjoergdefm V_MIN_U32 : VOP2_Real_gfx6_gfx7_gfx10<0x013>; 137806f32e7eSjoergdefm V_MAX_U32 : VOP2_Real_gfx6_gfx7_gfx10<0x014>; 137906f32e7eSjoergdefm V_LSHRREV_B32 : VOP2_Real_gfx6_gfx7_gfx10<0x016>; 138006f32e7eSjoergdefm V_ASHRREV_I32 : VOP2_Real_gfx6_gfx7_gfx10<0x018>; 138106f32e7eSjoergdefm V_LSHLREV_B32 : VOP2_Real_gfx6_gfx7_gfx10<0x01a>; 138206f32e7eSjoergdefm V_AND_B32 : VOP2_Real_gfx6_gfx7_gfx10<0x01b>; 138306f32e7eSjoergdefm V_OR_B32 : VOP2_Real_gfx6_gfx7_gfx10<0x01c>; 138406f32e7eSjoergdefm V_XOR_B32 : VOP2_Real_gfx6_gfx7_gfx10<0x01d>; 138506f32e7eSjoergdefm V_MAC_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x01f>; 138606f32e7eSjoergdefm V_CVT_PKRTZ_F16_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x02f>; 138706f32e7eSjoergdefm V_MADMK_F32 : VOP2Only_Real_MADK_gfx6_gfx7_gfx10<0x020>; 138806f32e7eSjoergdefm V_MADAK_F32 : VOP2Only_Real_MADK_gfx6_gfx7_gfx10<0x021>; 138906f32e7eSjoerg 139006f32e7eSjoerg//===----------------------------------------------------------------------===// 139106f32e7eSjoerg// GFX8, GFX9 (VI). 139206f32e7eSjoerg//===----------------------------------------------------------------------===// 139306f32e7eSjoerg 1394*da58b97aSjoerglet AssemblerPredicate = isGFX8GFX9, DecoderNamespace = "GFX8" in { 139506f32e7eSjoerg 139606f32e7eSjoergmulticlass VOP2_Real_MADK_vi <bits<6> op> { 139706f32e7eSjoerg def _vi : VOP2_Real<!cast<VOP2_Pseudo>(NAME), SIEncodingFamily.VI>, 139806f32e7eSjoerg VOP2_MADKe<op{5-0}, !cast<VOP2_Pseudo>(NAME).Pfl>; 139906f32e7eSjoerg} 140006f32e7eSjoerg 140106f32e7eSjoergmulticlass VOP2_Real_e32_vi <bits<6> op> { 140206f32e7eSjoerg def _e32_vi : 140306f32e7eSjoerg VOP2_Real<!cast<VOP2_Pseudo>(NAME#"_e32"), SIEncodingFamily.VI>, 140406f32e7eSjoerg VOP2e<op{5-0}, !cast<VOP2_Pseudo>(NAME#"_e32").Pfl>; 140506f32e7eSjoerg} 140606f32e7eSjoerg 140706f32e7eSjoergmulticlass VOP2_Real_e64_vi <bits<10> op> { 140806f32e7eSjoerg def _e64_vi : 140906f32e7eSjoerg VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.VI>, 141006f32e7eSjoerg VOP3e_vi <op, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 141106f32e7eSjoerg} 141206f32e7eSjoerg 141306f32e7eSjoergmulticlass VOP2_Real_e64only_vi <bits<10> op> { 141406f32e7eSjoerg def _e64_vi : 141506f32e7eSjoerg VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.VI>, 141606f32e7eSjoerg VOP3e_vi <op, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl> { 1417*da58b97aSjoerg let IsSingle = 1; 141806f32e7eSjoerg } 141906f32e7eSjoerg} 142006f32e7eSjoerg 142106f32e7eSjoergmulticlass Base_VOP2_Real_e32e64_vi <bits<6> op> : 142206f32e7eSjoerg VOP2_Real_e32_vi<op>, 142306f32e7eSjoerg VOP2_Real_e64_vi<{0, 1, 0, 0, op{5-0}}>; 142406f32e7eSjoerg 1425*da58b97aSjoerg} // End AssemblerPredicate = isGFX8GFX9, DecoderNamespace = "GFX8" 142606f32e7eSjoerg 142706f32e7eSjoergmulticlass VOP2_SDWA_Real <bits<6> op> { 142806f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA>.ret in 142906f32e7eSjoerg def _sdwa_vi : 143006f32e7eSjoerg VOP_SDWA_Real <!cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa")>, 143106f32e7eSjoerg VOP2_SDWAe <op{5-0}, !cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa").Pfl>; 143206f32e7eSjoerg} 143306f32e7eSjoerg 143406f32e7eSjoergmulticlass VOP2_SDWA9_Real <bits<6> op> { 143506f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA9>.ret in 143606f32e7eSjoerg def _sdwa_gfx9 : 143706f32e7eSjoerg VOP_SDWA9_Real <!cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa")>, 143806f32e7eSjoerg VOP2_SDWA9Ae <op{5-0}, !cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa").Pfl>; 143906f32e7eSjoerg} 144006f32e7eSjoerg 1441*da58b97aSjoerglet AssemblerPredicate = isGFX8Only in { 144206f32e7eSjoerg 144306f32e7eSjoergmulticlass VOP2be_Real_e32e64_vi_only <bits<6> op, string OpName, string AsmName> { 144406f32e7eSjoerg def _e32_vi : 144506f32e7eSjoerg VOP2_Real<!cast<VOP2_Pseudo>(OpName#"_e32"), SIEncodingFamily.VI>, 144606f32e7eSjoerg VOP2e<op{5-0}, !cast<VOP2_Pseudo>(OpName#"_e32").Pfl> { 144706f32e7eSjoerg VOP2_Pseudo ps = !cast<VOP2_Pseudo>(OpName#"_e32"); 144806f32e7eSjoerg let AsmString = AsmName # ps.AsmOperands; 144906f32e7eSjoerg let DecoderNamespace = "GFX8"; 145006f32e7eSjoerg } 145106f32e7eSjoerg def _e64_vi : 145206f32e7eSjoerg VOP3_Real<!cast<VOP3_Pseudo>(OpName#"_e64"), SIEncodingFamily.VI>, 145306f32e7eSjoerg VOP3be_vi <{0, 1, 0, 0, op{5-0}}, !cast<VOP3_Pseudo>(OpName#"_e64").Pfl> { 145406f32e7eSjoerg VOP3_Pseudo ps = !cast<VOP3_Pseudo>(OpName#"_e64"); 145506f32e7eSjoerg let AsmString = AsmName # ps.AsmOperands; 145606f32e7eSjoerg let DecoderNamespace = "GFX8"; 145706f32e7eSjoerg } 145806f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(OpName#"_e32").Pfl.HasExtSDWA>.ret in 145906f32e7eSjoerg def _sdwa_vi : 146006f32e7eSjoerg VOP_SDWA_Real <!cast<VOP2_SDWA_Pseudo>(OpName#"_sdwa")>, 146106f32e7eSjoerg VOP2_SDWAe <op{5-0}, !cast<VOP2_SDWA_Pseudo>(OpName#"_sdwa").Pfl> { 146206f32e7eSjoerg VOP2_SDWA_Pseudo ps = !cast<VOP2_SDWA_Pseudo>(OpName#"_sdwa"); 146306f32e7eSjoerg let AsmString = AsmName # ps.AsmOperands; 146406f32e7eSjoerg } 146506f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(OpName#"_e32").Pfl.HasExtDPP>.ret in 146606f32e7eSjoerg def _dpp_vi : 146706f32e7eSjoerg VOP_DPP_Real<!cast<VOP2_DPP_Pseudo>(OpName#"_dpp"), SIEncodingFamily.VI>, 146806f32e7eSjoerg VOP2_DPPe<op, !cast<VOP2_DPP_Pseudo>(OpName#"_dpp")> { 146906f32e7eSjoerg VOP2_DPP_Pseudo ps = !cast<VOP2_DPP_Pseudo>(OpName#"_dpp"); 147006f32e7eSjoerg let AsmString = AsmName # ps.AsmOperands; 147106f32e7eSjoerg } 147206f32e7eSjoerg} 147306f32e7eSjoerg} 147406f32e7eSjoerg 1475*da58b97aSjoerglet AssemblerPredicate = isGFX9Only in { 147606f32e7eSjoerg 147706f32e7eSjoergmulticlass VOP2be_Real_e32e64_gfx9 <bits<6> op, string OpName, string AsmName> { 147806f32e7eSjoerg def _e32_gfx9 : 147906f32e7eSjoerg VOP2_Real<!cast<VOP2_Pseudo>(OpName#"_e32"), SIEncodingFamily.GFX9>, 148006f32e7eSjoerg VOP2e<op{5-0}, !cast<VOP2_Pseudo>(OpName#"_e32").Pfl> { 148106f32e7eSjoerg VOP2_Pseudo ps = !cast<VOP2_Pseudo>(OpName#"_e32"); 148206f32e7eSjoerg let AsmString = AsmName # ps.AsmOperands; 148306f32e7eSjoerg let DecoderNamespace = "GFX9"; 148406f32e7eSjoerg } 148506f32e7eSjoerg def _e64_gfx9 : 148606f32e7eSjoerg VOP3_Real<!cast<VOP3_Pseudo>(OpName#"_e64"), SIEncodingFamily.GFX9>, 148706f32e7eSjoerg VOP3be_vi <{0, 1, 0, 0, op{5-0}}, !cast<VOP3_Pseudo>(OpName#"_e64").Pfl> { 148806f32e7eSjoerg VOP3_Pseudo ps = !cast<VOP3_Pseudo>(OpName#"_e64"); 148906f32e7eSjoerg let AsmString = AsmName # ps.AsmOperands; 149006f32e7eSjoerg let DecoderNamespace = "GFX9"; 149106f32e7eSjoerg } 149206f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(OpName#"_e32").Pfl.HasExtSDWA9>.ret in 149306f32e7eSjoerg def _sdwa_gfx9 : 149406f32e7eSjoerg VOP_SDWA9_Real <!cast<VOP2_SDWA_Pseudo>(OpName#"_sdwa")>, 149506f32e7eSjoerg VOP2_SDWA9Ae <op{5-0}, !cast<VOP2_SDWA_Pseudo>(OpName#"_sdwa").Pfl> { 149606f32e7eSjoerg VOP2_SDWA_Pseudo ps = !cast<VOP2_SDWA_Pseudo>(OpName#"_sdwa"); 149706f32e7eSjoerg let AsmString = AsmName # ps.AsmOperands; 149806f32e7eSjoerg } 149906f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(OpName#"_e32").Pfl.HasExtDPP>.ret in 150006f32e7eSjoerg def _dpp_gfx9 : 150106f32e7eSjoerg VOP_DPP_Real<!cast<VOP2_DPP_Pseudo>(OpName#"_dpp"), SIEncodingFamily.GFX9>, 150206f32e7eSjoerg VOP2_DPPe<op, !cast<VOP2_DPP_Pseudo>(OpName#"_dpp")> { 150306f32e7eSjoerg VOP2_DPP_Pseudo ps = !cast<VOP2_DPP_Pseudo>(OpName#"_dpp"); 150406f32e7eSjoerg let AsmString = AsmName # ps.AsmOperands; 150506f32e7eSjoerg let DecoderNamespace = "SDWA9"; 150606f32e7eSjoerg } 150706f32e7eSjoerg} 150806f32e7eSjoerg 150906f32e7eSjoergmulticlass VOP2_Real_e32e64_gfx9 <bits<6> op> { 151006f32e7eSjoerg def _e32_gfx9 : 151106f32e7eSjoerg VOP2_Real<!cast<VOP2_Pseudo>(NAME#"_e32"), SIEncodingFamily.GFX9>, 151206f32e7eSjoerg VOP2e<op{5-0}, !cast<VOP2_Pseudo>(NAME#"_e32").Pfl>{ 151306f32e7eSjoerg let DecoderNamespace = "GFX9"; 151406f32e7eSjoerg } 151506f32e7eSjoerg def _e64_gfx9 : 151606f32e7eSjoerg VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.GFX9>, 151706f32e7eSjoerg VOP3e_vi <{0, 1, 0, 0, op{5-0}}, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl> { 151806f32e7eSjoerg let DecoderNamespace = "GFX9"; 151906f32e7eSjoerg } 152006f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA9>.ret in 152106f32e7eSjoerg def _sdwa_gfx9 : 152206f32e7eSjoerg VOP_SDWA9_Real <!cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa")>, 152306f32e7eSjoerg VOP2_SDWA9Ae <op{5-0}, !cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa").Pfl> { 152406f32e7eSjoerg } 152506f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtDPP>.ret in 152606f32e7eSjoerg def _dpp_gfx9 : 152706f32e7eSjoerg VOP_DPP_Real<!cast<VOP2_DPP_Pseudo>(NAME#"_dpp"), SIEncodingFamily.GFX9>, 152806f32e7eSjoerg VOP2_DPPe<op, !cast<VOP2_DPP_Pseudo>(NAME#"_dpp")> { 152906f32e7eSjoerg let DecoderNamespace = "SDWA9"; 153006f32e7eSjoerg } 153106f32e7eSjoerg} 153206f32e7eSjoerg 1533*da58b97aSjoerg} // AssemblerPredicate = isGFX9Only 153406f32e7eSjoerg 153506f32e7eSjoergmulticlass VOP2_Real_e32e64_vi <bits<6> op> : 153606f32e7eSjoerg Base_VOP2_Real_e32e64_vi<op>, VOP2_SDWA_Real<op>, VOP2_SDWA9_Real<op> { 153706f32e7eSjoerg 153806f32e7eSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtDPP>.ret in 153906f32e7eSjoerg def _dpp_vi : 154006f32e7eSjoerg VOP_DPP_Real<!cast<VOP2_DPP_Pseudo>(NAME#"_dpp"), SIEncodingFamily.VI>, 154106f32e7eSjoerg VOP2_DPPe<op, !cast<VOP2_DPP_Pseudo>(NAME#"_dpp")>; 154206f32e7eSjoerg} 154306f32e7eSjoerg 154406f32e7eSjoergdefm V_CNDMASK_B32 : VOP2_Real_e32e64_vi <0x0>; 154506f32e7eSjoergdefm V_ADD_F32 : VOP2_Real_e32e64_vi <0x1>; 154606f32e7eSjoergdefm V_SUB_F32 : VOP2_Real_e32e64_vi <0x2>; 154706f32e7eSjoergdefm V_SUBREV_F32 : VOP2_Real_e32e64_vi <0x3>; 1548*da58b97aSjoerglet AssemblerPredicate = isGCN3ExcludingGFX90A in 154906f32e7eSjoergdefm V_MUL_LEGACY_F32 : VOP2_Real_e32e64_vi <0x4>; 155006f32e7eSjoergdefm V_MUL_F32 : VOP2_Real_e32e64_vi <0x5>; 155106f32e7eSjoergdefm V_MUL_I32_I24 : VOP2_Real_e32e64_vi <0x6>; 155206f32e7eSjoergdefm V_MUL_HI_I32_I24 : VOP2_Real_e32e64_vi <0x7>; 155306f32e7eSjoergdefm V_MUL_U32_U24 : VOP2_Real_e32e64_vi <0x8>; 155406f32e7eSjoergdefm V_MUL_HI_U32_U24 : VOP2_Real_e32e64_vi <0x9>; 155506f32e7eSjoergdefm V_MIN_F32 : VOP2_Real_e32e64_vi <0xa>; 155606f32e7eSjoergdefm V_MAX_F32 : VOP2_Real_e32e64_vi <0xb>; 155706f32e7eSjoergdefm V_MIN_I32 : VOP2_Real_e32e64_vi <0xc>; 155806f32e7eSjoergdefm V_MAX_I32 : VOP2_Real_e32e64_vi <0xd>; 155906f32e7eSjoergdefm V_MIN_U32 : VOP2_Real_e32e64_vi <0xe>; 156006f32e7eSjoergdefm V_MAX_U32 : VOP2_Real_e32e64_vi <0xf>; 156106f32e7eSjoergdefm V_LSHRREV_B32 : VOP2_Real_e32e64_vi <0x10>; 156206f32e7eSjoergdefm V_ASHRREV_I32 : VOP2_Real_e32e64_vi <0x11>; 156306f32e7eSjoergdefm V_LSHLREV_B32 : VOP2_Real_e32e64_vi <0x12>; 156406f32e7eSjoergdefm V_AND_B32 : VOP2_Real_e32e64_vi <0x13>; 156506f32e7eSjoergdefm V_OR_B32 : VOP2_Real_e32e64_vi <0x14>; 156606f32e7eSjoergdefm V_XOR_B32 : VOP2_Real_e32e64_vi <0x15>; 156706f32e7eSjoergdefm V_MAC_F32 : VOP2_Real_e32e64_vi <0x16>; 156806f32e7eSjoergdefm V_MADMK_F32 : VOP2_Real_MADK_vi <0x17>; 156906f32e7eSjoergdefm V_MADAK_F32 : VOP2_Real_MADK_vi <0x18>; 157006f32e7eSjoerg 1571*da58b97aSjoergdefm V_ADD_U32 : VOP2be_Real_e32e64_vi_only <0x19, "V_ADD_CO_U32", "v_add_u32">; 1572*da58b97aSjoergdefm V_SUB_U32 : VOP2be_Real_e32e64_vi_only <0x1a, "V_SUB_CO_U32", "v_sub_u32">; 1573*da58b97aSjoergdefm V_SUBREV_U32 : VOP2be_Real_e32e64_vi_only <0x1b, "V_SUBREV_CO_U32", "v_subrev_u32">; 157406f32e7eSjoergdefm V_ADDC_U32 : VOP2be_Real_e32e64_vi_only <0x1c, "V_ADDC_U32", "v_addc_u32">; 157506f32e7eSjoergdefm V_SUBB_U32 : VOP2be_Real_e32e64_vi_only <0x1d, "V_SUBB_U32", "v_subb_u32">; 157606f32e7eSjoergdefm V_SUBBREV_U32 : VOP2be_Real_e32e64_vi_only <0x1e, "V_SUBBREV_U32", "v_subbrev_u32">; 157706f32e7eSjoerg 1578*da58b97aSjoergdefm V_ADD_CO_U32 : VOP2be_Real_e32e64_gfx9 <0x19, "V_ADD_CO_U32", "v_add_co_u32">; 1579*da58b97aSjoergdefm V_SUB_CO_U32 : VOP2be_Real_e32e64_gfx9 <0x1a, "V_SUB_CO_U32", "v_sub_co_u32">; 1580*da58b97aSjoergdefm V_SUBREV_CO_U32 : VOP2be_Real_e32e64_gfx9 <0x1b, "V_SUBREV_CO_U32", "v_subrev_co_u32">; 158106f32e7eSjoergdefm V_ADDC_CO_U32 : VOP2be_Real_e32e64_gfx9 <0x1c, "V_ADDC_U32", "v_addc_co_u32">; 158206f32e7eSjoergdefm V_SUBB_CO_U32 : VOP2be_Real_e32e64_gfx9 <0x1d, "V_SUBB_U32", "v_subb_co_u32">; 158306f32e7eSjoergdefm V_SUBBREV_CO_U32 : VOP2be_Real_e32e64_gfx9 <0x1e, "V_SUBBREV_U32", "v_subbrev_co_u32">; 158406f32e7eSjoerg 158506f32e7eSjoergdefm V_ADD_U32 : VOP2_Real_e32e64_gfx9 <0x34>; 158606f32e7eSjoergdefm V_SUB_U32 : VOP2_Real_e32e64_gfx9 <0x35>; 158706f32e7eSjoergdefm V_SUBREV_U32 : VOP2_Real_e32e64_gfx9 <0x36>; 158806f32e7eSjoerg 158906f32e7eSjoergdefm V_BFM_B32 : VOP2_Real_e64only_vi <0x293>; 159006f32e7eSjoergdefm V_BCNT_U32_B32 : VOP2_Real_e64only_vi <0x28b>; 159106f32e7eSjoergdefm V_MBCNT_LO_U32_B32 : VOP2_Real_e64only_vi <0x28c>; 159206f32e7eSjoergdefm V_MBCNT_HI_U32_B32 : VOP2_Real_e64only_vi <0x28d>; 159306f32e7eSjoergdefm V_LDEXP_F32 : VOP2_Real_e64only_vi <0x288>; 159406f32e7eSjoergdefm V_CVT_PKACCUM_U8_F32 : VOP2_Real_e64only_vi <0x1f0>; 159506f32e7eSjoergdefm V_CVT_PKNORM_I16_F32 : VOP2_Real_e64only_vi <0x294>; 159606f32e7eSjoergdefm V_CVT_PKNORM_U16_F32 : VOP2_Real_e64only_vi <0x295>; 159706f32e7eSjoergdefm V_CVT_PKRTZ_F16_F32 : VOP2_Real_e64only_vi <0x296>; 159806f32e7eSjoergdefm V_CVT_PK_U16_U32 : VOP2_Real_e64only_vi <0x297>; 159906f32e7eSjoergdefm V_CVT_PK_I16_I32 : VOP2_Real_e64only_vi <0x298>; 160006f32e7eSjoerg 160106f32e7eSjoergdefm V_ADD_F16 : VOP2_Real_e32e64_vi <0x1f>; 160206f32e7eSjoergdefm V_SUB_F16 : VOP2_Real_e32e64_vi <0x20>; 160306f32e7eSjoergdefm V_SUBREV_F16 : VOP2_Real_e32e64_vi <0x21>; 160406f32e7eSjoergdefm V_MUL_F16 : VOP2_Real_e32e64_vi <0x22>; 160506f32e7eSjoergdefm V_MAC_F16 : VOP2_Real_e32e64_vi <0x23>; 160606f32e7eSjoergdefm V_MADMK_F16 : VOP2_Real_MADK_vi <0x24>; 160706f32e7eSjoergdefm V_MADAK_F16 : VOP2_Real_MADK_vi <0x25>; 160806f32e7eSjoergdefm V_ADD_U16 : VOP2_Real_e32e64_vi <0x26>; 160906f32e7eSjoergdefm V_SUB_U16 : VOP2_Real_e32e64_vi <0x27>; 161006f32e7eSjoergdefm V_SUBREV_U16 : VOP2_Real_e32e64_vi <0x28>; 161106f32e7eSjoergdefm V_MUL_LO_U16 : VOP2_Real_e32e64_vi <0x29>; 161206f32e7eSjoergdefm V_LSHLREV_B16 : VOP2_Real_e32e64_vi <0x2a>; 161306f32e7eSjoergdefm V_LSHRREV_B16 : VOP2_Real_e32e64_vi <0x2b>; 161406f32e7eSjoergdefm V_ASHRREV_I16 : VOP2_Real_e32e64_vi <0x2c>; 161506f32e7eSjoergdefm V_MAX_F16 : VOP2_Real_e32e64_vi <0x2d>; 161606f32e7eSjoergdefm V_MIN_F16 : VOP2_Real_e32e64_vi <0x2e>; 161706f32e7eSjoergdefm V_MAX_U16 : VOP2_Real_e32e64_vi <0x2f>; 161806f32e7eSjoergdefm V_MAX_I16 : VOP2_Real_e32e64_vi <0x30>; 161906f32e7eSjoergdefm V_MIN_U16 : VOP2_Real_e32e64_vi <0x31>; 162006f32e7eSjoergdefm V_MIN_I16 : VOP2_Real_e32e64_vi <0x32>; 162106f32e7eSjoergdefm V_LDEXP_F16 : VOP2_Real_e32e64_vi <0x33>; 162206f32e7eSjoerg 162306f32e7eSjoerglet SubtargetPredicate = isGFX8GFX9 in { 162406f32e7eSjoerg 162506f32e7eSjoerg// Aliases to simplify matching of floating-point instructions that 162606f32e7eSjoerg// are VOP2 on SI and VOP3 on VI. 162706f32e7eSjoergclass SI2_VI3Alias <string name, VOP3_Real inst> : InstAlias < 162806f32e7eSjoerg name#" $dst, $src0, $src1", 162906f32e7eSjoerg !if(inst.Pfl.HasOMod, 163006f32e7eSjoerg (inst VGPR_32:$dst, 0, VCSrc_f32:$src0, 0, VCSrc_f32:$src1, 0, 0), 163106f32e7eSjoerg (inst VGPR_32:$dst, 0, VCSrc_f32:$src0, 0, VCSrc_f32:$src1, 0)) 163206f32e7eSjoerg>, PredicateControl { 163306f32e7eSjoerg let UseInstAsmMatchConverter = 0; 163406f32e7eSjoerg let AsmVariantName = AMDGPUAsmVariants.VOP3; 163506f32e7eSjoerg} 163606f32e7eSjoerg 163706f32e7eSjoergdef : SI2_VI3Alias <"v_ldexp_f32", V_LDEXP_F32_e64_vi>; 163806f32e7eSjoergdef : SI2_VI3Alias <"v_cvt_pkaccum_u8_f32", V_CVT_PKACCUM_U8_F32_e64_vi>; 163906f32e7eSjoergdef : SI2_VI3Alias <"v_cvt_pknorm_i16_f32", V_CVT_PKNORM_I16_F32_e64_vi>; 164006f32e7eSjoergdef : SI2_VI3Alias <"v_cvt_pknorm_u16_f32", V_CVT_PKNORM_U16_F32_e64_vi>; 164106f32e7eSjoergdef : SI2_VI3Alias <"v_cvt_pkrtz_f16_f32", V_CVT_PKRTZ_F16_F32_e64_vi>; 164206f32e7eSjoerg 164306f32e7eSjoergdefm : VOP2eInstAliases<V_CNDMASK_B32_e32, V_CNDMASK_B32_e32_vi>; 164406f32e7eSjoerg 164506f32e7eSjoerg} // End SubtargetPredicate = isGFX8GFX9 164606f32e7eSjoerg 164706f32e7eSjoerglet SubtargetPredicate = isGFX9Only in { 164806f32e7eSjoerg 1649*da58b97aSjoergdefm : VOP2bInstAliases<V_ADD_U32_e32, V_ADD_CO_U32_e32_gfx9, "v_add_co_u32">; 165006f32e7eSjoergdefm : VOP2bInstAliases<V_ADDC_U32_e32, V_ADDC_CO_U32_e32_gfx9, "v_addc_co_u32">; 1651*da58b97aSjoergdefm : VOP2bInstAliases<V_SUB_U32_e32, V_SUB_CO_U32_e32_gfx9, "v_sub_co_u32">; 165206f32e7eSjoergdefm : VOP2bInstAliases<V_SUBB_U32_e32, V_SUBB_CO_U32_e32_gfx9, "v_subb_co_u32">; 1653*da58b97aSjoergdefm : VOP2bInstAliases<V_SUBREV_U32_e32, V_SUBREV_CO_U32_e32_gfx9, "v_subrev_co_u32">; 165406f32e7eSjoergdefm : VOP2bInstAliases<V_SUBBREV_U32_e32, V_SUBBREV_CO_U32_e32_gfx9, "v_subbrev_co_u32">; 165506f32e7eSjoerg 165606f32e7eSjoerg} // End SubtargetPredicate = isGFX9Only 165706f32e7eSjoerg 165806f32e7eSjoerglet SubtargetPredicate = HasDLInsts in { 165906f32e7eSjoerg 166006f32e7eSjoergdefm V_FMAC_F32 : VOP2_Real_e32e64_vi <0x3b>; 166106f32e7eSjoergdefm V_XNOR_B32 : VOP2_Real_e32e64_vi <0x3d>; 166206f32e7eSjoerg 166306f32e7eSjoerg} // End SubtargetPredicate = HasDLInsts 166406f32e7eSjoerg 1665*da58b97aSjoerglet AssemblerPredicate = isGFX90APlus, DecoderNamespace = "GFX90A" in { 1666*da58b97aSjoerg multiclass VOP2_Real_e32_gfx90a <bits<6> op> { 1667*da58b97aSjoerg def _e32_gfx90a : 1668*da58b97aSjoerg VOP2_Real<!cast<VOP2_Pseudo>(NAME#"_e32"), SIEncodingFamily.GFX90A>, 1669*da58b97aSjoerg VOP2e<op{5-0}, !cast<VOP2_Pseudo>(NAME#"_e32").Pfl>; 1670*da58b97aSjoerg } 1671*da58b97aSjoerg 1672*da58b97aSjoerg multiclass VOP2_Real_e64_gfx90a <bits<10> op> { 1673*da58b97aSjoerg def _e64_gfx90a : 1674*da58b97aSjoerg VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.GFX90A>, 1675*da58b97aSjoerg VOP3e_vi <op, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 1676*da58b97aSjoerg } 1677*da58b97aSjoerg 1678*da58b97aSjoerg multiclass Base_VOP2_Real_e32e64_gfx90a <bits<6> op> : 1679*da58b97aSjoerg VOP2_Real_e32_gfx90a<op>, 1680*da58b97aSjoerg VOP2_Real_e64_gfx90a<{0, 1, 0, 0, op{5-0}}>; 1681*da58b97aSjoerg 1682*da58b97aSjoerg multiclass VOP2_Real_e32e64_gfx90a <bits<6> op> : 1683*da58b97aSjoerg Base_VOP2_Real_e32e64_gfx90a<op> { 1684*da58b97aSjoerg 1685*da58b97aSjoerg foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtDPP>.ret in 1686*da58b97aSjoerg def _dpp_gfx90a : 1687*da58b97aSjoerg VOP_DPP_Real<!cast<VOP2_DPP_Pseudo>(NAME#"_dpp"), SIEncodingFamily.GFX90A>, 1688*da58b97aSjoerg VOP2_DPPe<op, !cast<VOP2_DPP_Pseudo>(NAME#"_dpp")> { 1689*da58b97aSjoerg let DecoderNamespace = "SDWA9"; 1690*da58b97aSjoerg } 1691*da58b97aSjoerg } 1692*da58b97aSjoerg} // End AssemblerPredicate = isGFX90APlus, DecoderNamespace = "GFX90A" 1693*da58b97aSjoerg 1694*da58b97aSjoerglet SubtargetPredicate = isGFX90APlus in { 1695*da58b97aSjoerg defm V_FMAC_F64 : VOP2_Real_e32e64_gfx90a <0x4>; 1696*da58b97aSjoerg let IsSingle = 1 in { 1697*da58b97aSjoerg defm V_MUL_LEGACY_F32 : VOP2_Real_e64_gfx90a <0x2a1>; 1698*da58b97aSjoerg } 1699*da58b97aSjoerg} // End SubtargetPredicate = isGFX90APlus 1700*da58b97aSjoerg 170106f32e7eSjoergmulticlass VOP2_Real_DOT_ACC_gfx9<bits<6> op> : VOP2_Real_e32_vi<op> { 170206f32e7eSjoerg def _dpp_vi : VOP2_DPP<op, !cast<VOP2_DPP_Pseudo>(NAME#"_dpp")>; 170306f32e7eSjoerg} 170406f32e7eSjoerg 170506f32e7eSjoergmulticlass VOP2_Real_DOT_ACC_gfx10<bits<6> op> : 170606f32e7eSjoerg VOP2_Real_e32_gfx10<op>, 170706f32e7eSjoerg VOP2_Real_dpp_gfx10<op>, 170806f32e7eSjoerg VOP2_Real_dpp8_gfx10<op>; 170906f32e7eSjoerg 171006f32e7eSjoerglet SubtargetPredicate = HasDot5Insts in { 171106f32e7eSjoerg defm V_DOT2C_F32_F16 : VOP2_Real_DOT_ACC_gfx9<0x37>; 171206f32e7eSjoerg // NB: Opcode conflicts with V_DOT8C_I32_I4 171306f32e7eSjoerg // This opcode exists in gfx 10.1* only 171406f32e7eSjoerg defm V_DOT2C_F32_F16 : VOP2_Real_DOT_ACC_gfx10<0x02>; 171506f32e7eSjoerg} 171606f32e7eSjoerg 171706f32e7eSjoerglet SubtargetPredicate = HasDot6Insts in { 171806f32e7eSjoerg defm V_DOT4C_I32_I8 : VOP2_Real_DOT_ACC_gfx9<0x39>; 171906f32e7eSjoerg defm V_DOT4C_I32_I8 : VOP2_Real_DOT_ACC_gfx10<0x0d>; 172006f32e7eSjoerg} 172106f32e7eSjoerg 172206f32e7eSjoerglet SubtargetPredicate = HasDot4Insts in { 172306f32e7eSjoerg defm V_DOT2C_I32_I16 : VOP2_Real_DOT_ACC_gfx9<0x38>; 172406f32e7eSjoerg} 172506f32e7eSjoerglet SubtargetPredicate = HasDot3Insts in { 172606f32e7eSjoerg defm V_DOT8C_I32_I4 : VOP2_Real_DOT_ACC_gfx9<0x3a>; 172706f32e7eSjoerg} 172806f32e7eSjoerg 172906f32e7eSjoerglet SubtargetPredicate = HasPkFmacF16Inst in { 173006f32e7eSjoergdefm V_PK_FMAC_F16 : VOP2_Real_e32_vi<0x3c>; 173106f32e7eSjoerg} // End SubtargetPredicate = HasPkFmacF16Inst 1732*da58b97aSjoerg 1733*da58b97aSjoerglet SubtargetPredicate = HasDot3Insts in { 1734*da58b97aSjoerg // NB: Opcode conflicts with V_DOT2C_F32_F16 1735*da58b97aSjoerg let DecoderNamespace = "GFX10_B" in 1736*da58b97aSjoerg defm V_DOT8C_I32_I4 : VOP2_Real_DOT_ACC_gfx10<0x02>; 1737*da58b97aSjoerg} 1738