1*9880d681SAndroid Build Coastguard Worker//===-- VIInstrFormats.td - VI Instruction Encodings ----------------------===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// VI Instruction format definitions. 11*9880d681SAndroid Build Coastguard Worker// 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerclass DSe_vi <bits<8> op> : Enc64 { 15*9880d681SAndroid Build Coastguard Worker bits<8> vdst; 16*9880d681SAndroid Build Coastguard Worker bits<1> gds; 17*9880d681SAndroid Build Coastguard Worker bits<8> addr; 18*9880d681SAndroid Build Coastguard Worker bits<8> data0; 19*9880d681SAndroid Build Coastguard Worker bits<8> data1; 20*9880d681SAndroid Build Coastguard Worker bits<8> offset0; 21*9880d681SAndroid Build Coastguard Worker bits<8> offset1; 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker let Inst{7-0} = offset0; 24*9880d681SAndroid Build Coastguard Worker let Inst{15-8} = offset1; 25*9880d681SAndroid Build Coastguard Worker let Inst{16} = gds; 26*9880d681SAndroid Build Coastguard Worker let Inst{24-17} = op; 27*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = 0x36; //encoding 28*9880d681SAndroid Build Coastguard Worker let Inst{39-32} = addr; 29*9880d681SAndroid Build Coastguard Worker let Inst{47-40} = data0; 30*9880d681SAndroid Build Coastguard Worker let Inst{55-48} = data1; 31*9880d681SAndroid Build Coastguard Worker let Inst{63-56} = vdst; 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerclass MUBUFe_vi <bits<7> op> : Enc64 { 35*9880d681SAndroid Build Coastguard Worker bits<12> offset; 36*9880d681SAndroid Build Coastguard Worker bits<1> offen; 37*9880d681SAndroid Build Coastguard Worker bits<1> idxen; 38*9880d681SAndroid Build Coastguard Worker bits<1> glc; 39*9880d681SAndroid Build Coastguard Worker bits<1> lds; 40*9880d681SAndroid Build Coastguard Worker bits<8> vaddr; 41*9880d681SAndroid Build Coastguard Worker bits<8> vdata; 42*9880d681SAndroid Build Coastguard Worker bits<7> srsrc; 43*9880d681SAndroid Build Coastguard Worker bits<1> slc; 44*9880d681SAndroid Build Coastguard Worker bits<1> tfe; 45*9880d681SAndroid Build Coastguard Worker bits<8> soffset; 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker let Inst{11-0} = offset; 48*9880d681SAndroid Build Coastguard Worker let Inst{12} = offen; 49*9880d681SAndroid Build Coastguard Worker let Inst{13} = idxen; 50*9880d681SAndroid Build Coastguard Worker let Inst{14} = glc; 51*9880d681SAndroid Build Coastguard Worker let Inst{16} = lds; 52*9880d681SAndroid Build Coastguard Worker let Inst{17} = slc; 53*9880d681SAndroid Build Coastguard Worker let Inst{24-18} = op; 54*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = 0x38; //encoding 55*9880d681SAndroid Build Coastguard Worker let Inst{39-32} = vaddr; 56*9880d681SAndroid Build Coastguard Worker let Inst{47-40} = vdata; 57*9880d681SAndroid Build Coastguard Worker let Inst{52-48} = srsrc{6-2}; 58*9880d681SAndroid Build Coastguard Worker let Inst{55} = tfe; 59*9880d681SAndroid Build Coastguard Worker let Inst{63-56} = soffset; 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerclass MTBUFe_vi <bits<4> op> : Enc64 { 63*9880d681SAndroid Build Coastguard Worker bits<12> offset; 64*9880d681SAndroid Build Coastguard Worker bits<1> offen; 65*9880d681SAndroid Build Coastguard Worker bits<1> idxen; 66*9880d681SAndroid Build Coastguard Worker bits<1> glc; 67*9880d681SAndroid Build Coastguard Worker bits<4> dfmt; 68*9880d681SAndroid Build Coastguard Worker bits<3> nfmt; 69*9880d681SAndroid Build Coastguard Worker bits<8> vaddr; 70*9880d681SAndroid Build Coastguard Worker bits<8> vdata; 71*9880d681SAndroid Build Coastguard Worker bits<7> srsrc; 72*9880d681SAndroid Build Coastguard Worker bits<1> slc; 73*9880d681SAndroid Build Coastguard Worker bits<1> tfe; 74*9880d681SAndroid Build Coastguard Worker bits<8> soffset; 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker let Inst{11-0} = offset; 77*9880d681SAndroid Build Coastguard Worker let Inst{12} = offen; 78*9880d681SAndroid Build Coastguard Worker let Inst{13} = idxen; 79*9880d681SAndroid Build Coastguard Worker let Inst{14} = glc; 80*9880d681SAndroid Build Coastguard Worker let Inst{18-15} = op; 81*9880d681SAndroid Build Coastguard Worker let Inst{22-19} = dfmt; 82*9880d681SAndroid Build Coastguard Worker let Inst{25-23} = nfmt; 83*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = 0x3a; //encoding 84*9880d681SAndroid Build Coastguard Worker let Inst{39-32} = vaddr; 85*9880d681SAndroid Build Coastguard Worker let Inst{47-40} = vdata; 86*9880d681SAndroid Build Coastguard Worker let Inst{52-48} = srsrc{6-2}; 87*9880d681SAndroid Build Coastguard Worker let Inst{54} = slc; 88*9880d681SAndroid Build Coastguard Worker let Inst{55} = tfe; 89*9880d681SAndroid Build Coastguard Worker let Inst{63-56} = soffset; 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerclass SMEMe_vi <bits<8> op, bit imm> : Enc64 { 93*9880d681SAndroid Build Coastguard Worker bits<7> sbase; 94*9880d681SAndroid Build Coastguard Worker bits<7> sdst; 95*9880d681SAndroid Build Coastguard Worker bits<1> glc; 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker let Inst{5-0} = sbase{6-1}; 98*9880d681SAndroid Build Coastguard Worker let Inst{12-6} = sdst; 99*9880d681SAndroid Build Coastguard Worker let Inst{16} = glc; 100*9880d681SAndroid Build Coastguard Worker let Inst{17} = imm; 101*9880d681SAndroid Build Coastguard Worker let Inst{25-18} = op; 102*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = 0x30; //encoding 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerclass SMEM_IMMe_vi <bits<8> op> : SMEMe_vi<op, 1> { 106*9880d681SAndroid Build Coastguard Worker bits<20> offset; 107*9880d681SAndroid Build Coastguard Worker let Inst{51-32} = offset; 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workerclass SMEM_SOFFe_vi <bits<8> op> : SMEMe_vi<op, 0> { 111*9880d681SAndroid Build Coastguard Worker bits<20> soff; 112*9880d681SAndroid Build Coastguard Worker let Inst{51-32} = soff; 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerclass VOP3a_vi <bits<10> op> : Enc64 { 116*9880d681SAndroid Build Coastguard Worker bits<2> src0_modifiers; 117*9880d681SAndroid Build Coastguard Worker bits<9> src0; 118*9880d681SAndroid Build Coastguard Worker bits<2> src1_modifiers; 119*9880d681SAndroid Build Coastguard Worker bits<9> src1; 120*9880d681SAndroid Build Coastguard Worker bits<2> src2_modifiers; 121*9880d681SAndroid Build Coastguard Worker bits<9> src2; 122*9880d681SAndroid Build Coastguard Worker bits<1> clamp; 123*9880d681SAndroid Build Coastguard Worker bits<2> omod; 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker let Inst{8} = src0_modifiers{1}; 126*9880d681SAndroid Build Coastguard Worker let Inst{9} = src1_modifiers{1}; 127*9880d681SAndroid Build Coastguard Worker let Inst{10} = src2_modifiers{1}; 128*9880d681SAndroid Build Coastguard Worker let Inst{15} = clamp; 129*9880d681SAndroid Build Coastguard Worker let Inst{25-16} = op; 130*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = 0x34; //encoding 131*9880d681SAndroid Build Coastguard Worker let Inst{40-32} = src0; 132*9880d681SAndroid Build Coastguard Worker let Inst{49-41} = src1; 133*9880d681SAndroid Build Coastguard Worker let Inst{58-50} = src2; 134*9880d681SAndroid Build Coastguard Worker let Inst{60-59} = omod; 135*9880d681SAndroid Build Coastguard Worker let Inst{61} = src0_modifiers{0}; 136*9880d681SAndroid Build Coastguard Worker let Inst{62} = src1_modifiers{0}; 137*9880d681SAndroid Build Coastguard Worker let Inst{63} = src2_modifiers{0}; 138*9880d681SAndroid Build Coastguard Worker} 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerclass VOP3e_vi <bits<10> op> : VOP3a_vi <op> { 141*9880d681SAndroid Build Coastguard Worker bits<8> vdst; 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker let Inst{7-0} = vdst; 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker// Encoding used for VOPC instructions encoded as VOP3 147*9880d681SAndroid Build Coastguard Worker// Differs from VOP3e by destination name (sdst) as VOPC doesn't have vector dst 148*9880d681SAndroid Build Coastguard Workerclass VOP3ce_vi <bits<10> op> : VOP3a_vi <op> { 149*9880d681SAndroid Build Coastguard Worker bits<8> sdst; 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker let Inst{7-0} = sdst; 152*9880d681SAndroid Build Coastguard Worker} 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Workerclass VOP3be_vi <bits<10> op> : Enc64 { 155*9880d681SAndroid Build Coastguard Worker bits<8> vdst; 156*9880d681SAndroid Build Coastguard Worker bits<2> src0_modifiers; 157*9880d681SAndroid Build Coastguard Worker bits<9> src0; 158*9880d681SAndroid Build Coastguard Worker bits<2> src1_modifiers; 159*9880d681SAndroid Build Coastguard Worker bits<9> src1; 160*9880d681SAndroid Build Coastguard Worker bits<2> src2_modifiers; 161*9880d681SAndroid Build Coastguard Worker bits<9> src2; 162*9880d681SAndroid Build Coastguard Worker bits<7> sdst; 163*9880d681SAndroid Build Coastguard Worker bits<2> omod; 164*9880d681SAndroid Build Coastguard Worker bits<1> clamp; 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker let Inst{7-0} = vdst; 167*9880d681SAndroid Build Coastguard Worker let Inst{14-8} = sdst; 168*9880d681SAndroid Build Coastguard Worker let Inst{15} = clamp; 169*9880d681SAndroid Build Coastguard Worker let Inst{25-16} = op; 170*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = 0x34; //encoding 171*9880d681SAndroid Build Coastguard Worker let Inst{40-32} = src0; 172*9880d681SAndroid Build Coastguard Worker let Inst{49-41} = src1; 173*9880d681SAndroid Build Coastguard Worker let Inst{58-50} = src2; 174*9880d681SAndroid Build Coastguard Worker let Inst{60-59} = omod; 175*9880d681SAndroid Build Coastguard Worker let Inst{61} = src0_modifiers{0}; 176*9880d681SAndroid Build Coastguard Worker let Inst{62} = src1_modifiers{0}; 177*9880d681SAndroid Build Coastguard Worker let Inst{63} = src2_modifiers{0}; 178*9880d681SAndroid Build Coastguard Worker} 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Workerclass VOP_DPP <dag outs, dag ins, string asm, list<dag> pattern, bit HasMods = 0> : 181*9880d681SAndroid Build Coastguard Worker VOPAnyCommon <outs, ins, asm, pattern> { 182*9880d681SAndroid Build Coastguard Worker let DPP = 1; 183*9880d681SAndroid Build Coastguard Worker let Size = 8; 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker let AsmMatchConverter = !if(!eq(HasMods,1), "cvtDPP", ""); 186*9880d681SAndroid Build Coastguard Worker} 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Workerclass VOP_DPPe : Enc64 { 189*9880d681SAndroid Build Coastguard Worker bits<2> src0_modifiers; 190*9880d681SAndroid Build Coastguard Worker bits<8> src0; 191*9880d681SAndroid Build Coastguard Worker bits<2> src1_modifiers; 192*9880d681SAndroid Build Coastguard Worker bits<9> dpp_ctrl; 193*9880d681SAndroid Build Coastguard Worker bits<1> bound_ctrl; 194*9880d681SAndroid Build Coastguard Worker bits<4> bank_mask; 195*9880d681SAndroid Build Coastguard Worker bits<4> row_mask; 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Worker let Inst{39-32} = src0; 198*9880d681SAndroid Build Coastguard Worker let Inst{48-40} = dpp_ctrl; 199*9880d681SAndroid Build Coastguard Worker let Inst{51} = bound_ctrl; 200*9880d681SAndroid Build Coastguard Worker let Inst{52} = src0_modifiers{0}; // src0_neg 201*9880d681SAndroid Build Coastguard Worker let Inst{53} = src0_modifiers{1}; // src0_abs 202*9880d681SAndroid Build Coastguard Worker let Inst{54} = src1_modifiers{0}; // src1_neg 203*9880d681SAndroid Build Coastguard Worker let Inst{55} = src1_modifiers{1}; // src1_abs 204*9880d681SAndroid Build Coastguard Worker let Inst{59-56} = bank_mask; 205*9880d681SAndroid Build Coastguard Worker let Inst{63-60} = row_mask; 206*9880d681SAndroid Build Coastguard Worker} 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Workerclass VOP1_DPPe <bits<8> op> : VOP_DPPe { 209*9880d681SAndroid Build Coastguard Worker bits<8> vdst; 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Worker let Inst{8-0} = 0xfa; // dpp 212*9880d681SAndroid Build Coastguard Worker let Inst{16-9} = op; 213*9880d681SAndroid Build Coastguard Worker let Inst{24-17} = vdst; 214*9880d681SAndroid Build Coastguard Worker let Inst{31-25} = 0x3f; //encoding 215*9880d681SAndroid Build Coastguard Worker} 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Workerclass VOP2_DPPe <bits<6> op> : VOP_DPPe { 218*9880d681SAndroid Build Coastguard Worker bits<8> vdst; 219*9880d681SAndroid Build Coastguard Worker bits<8> src1; 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Worker let Inst{8-0} = 0xfa; //dpp 222*9880d681SAndroid Build Coastguard Worker let Inst{16-9} = src1; 223*9880d681SAndroid Build Coastguard Worker let Inst{24-17} = vdst; 224*9880d681SAndroid Build Coastguard Worker let Inst{30-25} = op; 225*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0x0; //encoding 226*9880d681SAndroid Build Coastguard Worker} 227*9880d681SAndroid Build Coastguard Worker 228*9880d681SAndroid Build Coastguard Workerclass VOP_SDWA <dag outs, dag ins, string asm, list<dag> pattern, bit HasMods = 0> : 229*9880d681SAndroid Build Coastguard Worker VOPAnyCommon <outs, ins, asm, pattern> { 230*9880d681SAndroid Build Coastguard Worker let SDWA = 1; 231*9880d681SAndroid Build Coastguard Worker let Size = 8; 232*9880d681SAndroid Build Coastguard Worker} 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Workerclass VOP_SDWAe : Enc64 { 235*9880d681SAndroid Build Coastguard Worker bits<8> src0; 236*9880d681SAndroid Build Coastguard Worker bits<3> src0_sel; 237*9880d681SAndroid Build Coastguard Worker bits<2> src0_fmodifiers; // {abs,neg} 238*9880d681SAndroid Build Coastguard Worker bits<1> src0_imodifiers; // sext 239*9880d681SAndroid Build Coastguard Worker bits<3> src1_sel; 240*9880d681SAndroid Build Coastguard Worker bits<2> src1_fmodifiers; 241*9880d681SAndroid Build Coastguard Worker bits<1> src1_imodifiers; 242*9880d681SAndroid Build Coastguard Worker bits<3> dst_sel; 243*9880d681SAndroid Build Coastguard Worker bits<2> dst_unused; 244*9880d681SAndroid Build Coastguard Worker bits<1> clamp; 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Worker let Inst{39-32} = src0; 247*9880d681SAndroid Build Coastguard Worker let Inst{42-40} = dst_sel; 248*9880d681SAndroid Build Coastguard Worker let Inst{44-43} = dst_unused; 249*9880d681SAndroid Build Coastguard Worker let Inst{45} = clamp; 250*9880d681SAndroid Build Coastguard Worker let Inst{50-48} = src0_sel; 251*9880d681SAndroid Build Coastguard Worker let Inst{53-52} = src0_fmodifiers; 252*9880d681SAndroid Build Coastguard Worker let Inst{51} = src0_imodifiers; 253*9880d681SAndroid Build Coastguard Worker let Inst{58-56} = src1_sel; 254*9880d681SAndroid Build Coastguard Worker let Inst{61-60} = src1_fmodifiers; 255*9880d681SAndroid Build Coastguard Worker let Inst{59} = src1_imodifiers; 256*9880d681SAndroid Build Coastguard Worker} 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Workerclass VOP1_SDWAe <bits<8> op> : VOP_SDWAe { 259*9880d681SAndroid Build Coastguard Worker bits<8> vdst; 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Worker let Inst{8-0} = 0xf9; // sdwa 262*9880d681SAndroid Build Coastguard Worker let Inst{16-9} = op; 263*9880d681SAndroid Build Coastguard Worker let Inst{24-17} = vdst; 264*9880d681SAndroid Build Coastguard Worker let Inst{31-25} = 0x3f; // encoding 265*9880d681SAndroid Build Coastguard Worker} 266*9880d681SAndroid Build Coastguard Worker 267*9880d681SAndroid Build Coastguard Workerclass VOP2_SDWAe <bits<6> op> : VOP_SDWAe { 268*9880d681SAndroid Build Coastguard Worker bits<8> vdst; 269*9880d681SAndroid Build Coastguard Worker bits<8> src1; 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker let Inst{8-0} = 0xf9; // sdwa 272*9880d681SAndroid Build Coastguard Worker let Inst{16-9} = src1; 273*9880d681SAndroid Build Coastguard Worker let Inst{24-17} = vdst; 274*9880d681SAndroid Build Coastguard Worker let Inst{30-25} = op; 275*9880d681SAndroid Build Coastguard Worker let Inst{31} = 0x0; // encoding 276*9880d681SAndroid Build Coastguard Worker} 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Workerclass VOPC_SDWAe <bits<8> op> : VOP_SDWAe { 279*9880d681SAndroid Build Coastguard Worker bits<8> src1; 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker let Inst{8-0} = 0xf9; // sdwa 282*9880d681SAndroid Build Coastguard Worker let Inst{16-9} = src1; 283*9880d681SAndroid Build Coastguard Worker let Inst{24-17} = op; 284*9880d681SAndroid Build Coastguard Worker let Inst{31-25} = 0x3e; // encoding 285*9880d681SAndroid Build Coastguard Worker 286*9880d681SAndroid Build Coastguard Worker // VOPC disallows dst_sel and dst_unused as they have no effect on destination 287*9880d681SAndroid Build Coastguard Worker let Inst{42-40} = 0x6; 288*9880d681SAndroid Build Coastguard Worker let Inst{44-43} = 0x2; 289*9880d681SAndroid Build Coastguard Worker} 290*9880d681SAndroid Build Coastguard Worker 291*9880d681SAndroid Build Coastguard Workerclass EXPe_vi : EXPe { 292*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = 0x31; //encoding 293*9880d681SAndroid Build Coastguard Worker} 294*9880d681SAndroid Build Coastguard Worker 295*9880d681SAndroid Build Coastguard Workerclass VINTRPe_vi <bits<2> op> : VINTRPe <op> { 296*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = 0x35; // encoding 297*9880d681SAndroid Build Coastguard Worker} 298