1*9880d681SAndroid Build Coastguard Worker//===-- SIInstrInfo.td - SI Instruction Infos -------------*- tablegen -*--===// 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 Workerdef isCI : Predicate<"Subtarget->getGeneration() " 10*9880d681SAndroid Build Coastguard Worker ">= SISubtarget::SEA_ISLANDS">; 11*9880d681SAndroid Build Coastguard Workerdef isCIOnly : Predicate<"Subtarget->getGeneration() ==" 12*9880d681SAndroid Build Coastguard Worker "SISubtarget::SEA_ISLANDS">, 13*9880d681SAndroid Build Coastguard Worker AssemblerPredicate <"FeatureSeaIslands">; 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdef DisableInst : Predicate <"false">, AssemblerPredicate<"FeatureDisable">; 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerclass vop { 18*9880d681SAndroid Build Coastguard Worker field bits<9> SI3; 19*9880d681SAndroid Build Coastguard Worker field bits<10> VI3; 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerclass vopc <bits<8> si, bits<8> vi = !add(0x40, si)> : vop { 23*9880d681SAndroid Build Coastguard Worker field bits<8> SI = si; 24*9880d681SAndroid Build Coastguard Worker field bits<8> VI = vi; 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker field bits<9> SI3 = {0, si{7-0}}; 27*9880d681SAndroid Build Coastguard Worker field bits<10> VI3 = {0, 0, vi{7-0}}; 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerclass vop1 <bits<8> si, bits<8> vi = si> : vop { 31*9880d681SAndroid Build Coastguard Worker field bits<8> SI = si; 32*9880d681SAndroid Build Coastguard Worker field bits<8> VI = vi; 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker field bits<9> SI3 = {1, 1, si{6-0}}; 35*9880d681SAndroid Build Coastguard Worker field bits<10> VI3 = !add(0x140, vi); 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerclass vop2 <bits<6> si, bits<6> vi = si> : vop { 39*9880d681SAndroid Build Coastguard Worker field bits<6> SI = si; 40*9880d681SAndroid Build Coastguard Worker field bits<6> VI = vi; 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker field bits<9> SI3 = {1, 0, 0, si{5-0}}; 43*9880d681SAndroid Build Coastguard Worker field bits<10> VI3 = {0, 1, 0, 0, vi{5-0}}; 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker// Specify a VOP2 opcode for SI and VOP3 opcode for VI 47*9880d681SAndroid Build Coastguard Worker// that doesn't have VOP2 encoding on VI 48*9880d681SAndroid Build Coastguard Workerclass vop23 <bits<6> si, bits<10> vi> : vop2 <si> { 49*9880d681SAndroid Build Coastguard Worker let VI3 = vi; 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerclass vop3 <bits<9> si, bits<10> vi = {0, si}> : vop { 53*9880d681SAndroid Build Coastguard Worker let SI3 = si; 54*9880d681SAndroid Build Coastguard Worker let VI3 = vi; 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerclass sop1 <bits<8> si, bits<8> vi = si> { 58*9880d681SAndroid Build Coastguard Worker field bits<8> SI = si; 59*9880d681SAndroid Build Coastguard Worker field bits<8> VI = vi; 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerclass sop2 <bits<7> si, bits<7> vi = si> { 63*9880d681SAndroid Build Coastguard Worker field bits<7> SI = si; 64*9880d681SAndroid Build Coastguard Worker field bits<7> VI = vi; 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerclass sopk <bits<5> si, bits<5> vi = si> { 68*9880d681SAndroid Build Coastguard Worker field bits<5> SI = si; 69*9880d681SAndroid Build Coastguard Worker field bits<5> VI = vi; 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerclass dsop <bits<8> si, bits<8> vi = si> { 73*9880d681SAndroid Build Coastguard Worker field bits<8> SI = si; 74*9880d681SAndroid Build Coastguard Worker field bits<8> VI = vi; 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker// Specify an SMRD opcode for SI and SMEM opcode for VI 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker// FIXME: This should really be bits<5> si, Tablegen crashes if 80*9880d681SAndroid Build Coastguard Worker// parameter default value is other parameter with different bit size 81*9880d681SAndroid Build Coastguard Workerclass smrd<bits<8> si, bits<8> vi = si> { 82*9880d681SAndroid Build Coastguard Worker field bits<5> SI = si{4-0}; 83*9880d681SAndroid Build Coastguard Worker field bits<8> VI = vi; 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker// Execpt for the NONE field, this must be kept in sync with the 87*9880d681SAndroid Build Coastguard Worker// SIEncodingFamily enum in AMDGPUInstrInfo.cpp 88*9880d681SAndroid Build Coastguard Workerdef SIEncodingFamily { 89*9880d681SAndroid Build Coastguard Worker int NONE = -1; 90*9880d681SAndroid Build Coastguard Worker int SI = 0; 91*9880d681SAndroid Build Coastguard Worker int VI = 1; 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 95*9880d681SAndroid Build Coastguard Worker// SI DAG Nodes 96*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerdef SIload_constant : SDNode<"AMDGPUISD::LOAD_CONSTANT", 99*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisVT<0, f32>, SDTCisVT<1, v4i32>, SDTCisVT<2, i32>]>, 100*9880d681SAndroid Build Coastguard Worker [SDNPMayLoad, SDNPMemOperand] 101*9880d681SAndroid Build Coastguard Worker>; 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerdef SIatomic_inc : SDNode<"AMDGPUISD::ATOMIC_INC", SDTAtomic2, 104*9880d681SAndroid Build Coastguard Worker [SDNPMayLoad, SDNPMayStore, SDNPMemOperand, SDNPHasChain] 105*9880d681SAndroid Build Coastguard Worker>; 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerdef SIatomic_dec : SDNode<"AMDGPUISD::ATOMIC_DEC", SDTAtomic2, 108*9880d681SAndroid Build Coastguard Worker [SDNPMayLoad, SDNPMayStore, SDNPMemOperand, SDNPHasChain] 109*9880d681SAndroid Build Coastguard Worker>; 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerdef SItbuffer_store : SDNode<"AMDGPUISD::TBUFFER_STORE_FORMAT", 112*9880d681SAndroid Build Coastguard Worker SDTypeProfile<0, 13, 113*9880d681SAndroid Build Coastguard Worker [SDTCisVT<0, v4i32>, // rsrc(SGPR) 114*9880d681SAndroid Build Coastguard Worker SDTCisVT<1, iAny>, // vdata(VGPR) 115*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, i32>, // num_channels(imm) 116*9880d681SAndroid Build Coastguard Worker SDTCisVT<3, i32>, // vaddr(VGPR) 117*9880d681SAndroid Build Coastguard Worker SDTCisVT<4, i32>, // soffset(SGPR) 118*9880d681SAndroid Build Coastguard Worker SDTCisVT<5, i32>, // inst_offset(imm) 119*9880d681SAndroid Build Coastguard Worker SDTCisVT<6, i32>, // dfmt(imm) 120*9880d681SAndroid Build Coastguard Worker SDTCisVT<7, i32>, // nfmt(imm) 121*9880d681SAndroid Build Coastguard Worker SDTCisVT<8, i32>, // offen(imm) 122*9880d681SAndroid Build Coastguard Worker SDTCisVT<9, i32>, // idxen(imm) 123*9880d681SAndroid Build Coastguard Worker SDTCisVT<10, i32>, // glc(imm) 124*9880d681SAndroid Build Coastguard Worker SDTCisVT<11, i32>, // slc(imm) 125*9880d681SAndroid Build Coastguard Worker SDTCisVT<12, i32> // tfe(imm) 126*9880d681SAndroid Build Coastguard Worker ]>, 127*9880d681SAndroid Build Coastguard Worker [SDNPMayStore, SDNPMemOperand, SDNPHasChain] 128*9880d681SAndroid Build Coastguard Worker>; 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Workerdef SIload_input : SDNode<"AMDGPUISD::LOAD_INPUT", 131*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCisVT<0, v4f32>, SDTCisVT<1, v4i32>, SDTCisVT<2, i16>, 132*9880d681SAndroid Build Coastguard Worker SDTCisVT<3, i32>]> 133*9880d681SAndroid Build Coastguard Worker>; 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Workerclass SDSample<string opcode> : SDNode <opcode, 136*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 4, [SDTCisVT<0, v4f32>, SDTCisVT<2, v8i32>, 137*9880d681SAndroid Build Coastguard Worker SDTCisVT<3, v4i32>, SDTCisVT<4, i32>]> 138*9880d681SAndroid Build Coastguard Worker>; 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerdef SIsample : SDSample<"AMDGPUISD::SAMPLE">; 141*9880d681SAndroid Build Coastguard Workerdef SIsampleb : SDSample<"AMDGPUISD::SAMPLEB">; 142*9880d681SAndroid Build Coastguard Workerdef SIsampled : SDSample<"AMDGPUISD::SAMPLED">; 143*9880d681SAndroid Build Coastguard Workerdef SIsamplel : SDSample<"AMDGPUISD::SAMPLEL">; 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerdef SIpc_add_rel_offset : SDNode<"AMDGPUISD::PC_ADD_REL_OFFSET", 146*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 1, [SDTCisVT<0, iPTR>, SDTCisSameAs<0,1>]> 147*9880d681SAndroid Build Coastguard Worker>; 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 150*9880d681SAndroid Build Coastguard Worker// PatFrags for FLAT instructions 151*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Workerclass flat_ld <SDPatternOperator ld> : PatFrag<(ops node:$ptr), 154*9880d681SAndroid Build Coastguard Worker (ld node:$ptr), [{ 155*9880d681SAndroid Build Coastguard Worker const MemSDNode *LD = cast<MemSDNode>(N); 156*9880d681SAndroid Build Coastguard Worker return LD->getAddressSpace() == AMDGPUAS::FLAT_ADDRESS || 157*9880d681SAndroid Build Coastguard Worker LD->getAddressSpace() == AMDGPUAS::GLOBAL_ADDRESS || 158*9880d681SAndroid Build Coastguard Worker LD->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS; 159*9880d681SAndroid Build Coastguard Worker}]>; 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerdef flat_load : flat_ld <load>; 162*9880d681SAndroid Build Coastguard Workerdef atomic_flat_load : flat_ld<atomic_load>; 163*9880d681SAndroid Build Coastguard Workerdef flat_az_extloadi8 : flat_ld <az_extloadi8>; 164*9880d681SAndroid Build Coastguard Workerdef flat_sextloadi8 : flat_ld <sextloadi8>; 165*9880d681SAndroid Build Coastguard Workerdef flat_az_extloadi16 : flat_ld <az_extloadi16>; 166*9880d681SAndroid Build Coastguard Workerdef flat_sextloadi16 : flat_ld <sextloadi16>; 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerclass flat_st <SDPatternOperator st> : PatFrag<(ops node:$val, node:$ptr), 169*9880d681SAndroid Build Coastguard Worker (st node:$val, node:$ptr), [{ 170*9880d681SAndroid Build Coastguard Worker const MemSDNode *ST = cast<MemSDNode>(N); 171*9880d681SAndroid Build Coastguard Worker return ST->getAddressSpace() == AMDGPUAS::FLAT_ADDRESS || 172*9880d681SAndroid Build Coastguard Worker ST->getAddressSpace() == AMDGPUAS::GLOBAL_ADDRESS; 173*9880d681SAndroid Build Coastguard Worker}]>; 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerdef flat_store: flat_st <store>; 176*9880d681SAndroid Build Coastguard Workerdef atomic_flat_store: flat_st <atomic_store>; 177*9880d681SAndroid Build Coastguard Workerdef flat_truncstorei8 : flat_st <truncstorei8>; 178*9880d681SAndroid Build Coastguard Workerdef flat_truncstorei16 : flat_st <truncstorei16>; 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Workerclass MubufLoad <SDPatternOperator op> : PatFrag < 181*9880d681SAndroid Build Coastguard Worker (ops node:$ptr), (op node:$ptr), [{ 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker const MemSDNode *LD = cast<MemSDNode>(N); 184*9880d681SAndroid Build Coastguard Worker return LD->getAddressSpace() == AMDGPUAS::GLOBAL_ADDRESS || 185*9880d681SAndroid Build Coastguard Worker LD->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS; 186*9880d681SAndroid Build Coastguard Worker}]>; 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Workerdef mubuf_load : MubufLoad <load>; 189*9880d681SAndroid Build Coastguard Workerdef mubuf_az_extloadi8 : MubufLoad <az_extloadi8>; 190*9880d681SAndroid Build Coastguard Workerdef mubuf_sextloadi8 : MubufLoad <sextloadi8>; 191*9880d681SAndroid Build Coastguard Workerdef mubuf_az_extloadi16 : MubufLoad <az_extloadi16>; 192*9880d681SAndroid Build Coastguard Workerdef mubuf_sextloadi16 : MubufLoad <sextloadi16>; 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdef mubuf_load_atomic : MubufLoad <atomic_load>; 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Workerdef smrd_load : PatFrag <(ops node:$ptr), (load node:$ptr), [{ 197*9880d681SAndroid Build Coastguard Worker auto Ld = cast<LoadSDNode>(N); 198*9880d681SAndroid Build Coastguard Worker return Ld->getAlignment() >= 4 && 199*9880d681SAndroid Build Coastguard Worker Ld->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS && 200*9880d681SAndroid Build Coastguard Worker static_cast<const SITargetLowering *>(getTargetLowering())->isMemOpUniform(N); 201*9880d681SAndroid Build Coastguard Worker}]>; 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 204*9880d681SAndroid Build Coastguard Worker// PatFrags for global memory operations 205*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Workerdef atomic_inc_global : global_binary_atomic_op<SIatomic_inc>; 208*9880d681SAndroid Build Coastguard Workerdef atomic_dec_global : global_binary_atomic_op<SIatomic_dec>; 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Workerdef atomic_inc_flat : flat_binary_atomic_op<SIatomic_inc>; 211*9880d681SAndroid Build Coastguard Workerdef atomic_dec_flat : flat_binary_atomic_op<SIatomic_dec>; 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 214*9880d681SAndroid Build Coastguard Worker// SDNodes and PatFrag for local loads and stores to enable s_mov_b32 m0, -1 215*9880d681SAndroid Build Coastguard Worker// to be glued to the memory instructions. 216*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Workerdef SIld_local : SDNode <"ISD::LOAD", SDTLoad, 219*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPMayLoad, SDNPMemOperand, SDNPInGlue] 220*9880d681SAndroid Build Coastguard Worker>; 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerdef si_ld_local : PatFrag <(ops node:$ptr), (SIld_local node:$ptr), [{ 223*9880d681SAndroid Build Coastguard Worker return cast<LoadSDNode>(N)->getAddressSpace() == AMDGPUAS::LOCAL_ADDRESS; 224*9880d681SAndroid Build Coastguard Worker}]>; 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Workerdef si_load_local : PatFrag <(ops node:$ptr), (si_ld_local node:$ptr), [{ 227*9880d681SAndroid Build Coastguard Worker return cast<LoadSDNode>(N)->getAddressingMode() == ISD::UNINDEXED && 228*9880d681SAndroid Build Coastguard Worker cast<LoadSDNode>(N)->getExtensionType() == ISD::NON_EXTLOAD; 229*9880d681SAndroid Build Coastguard Worker}]>; 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Workerdef si_load_local_align8 : Aligned8Bytes < 232*9880d681SAndroid Build Coastguard Worker (ops node:$ptr), (si_load_local node:$ptr) 233*9880d681SAndroid Build Coastguard Worker>; 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Workerdef si_sextload_local : PatFrag <(ops node:$ptr), (si_ld_local node:$ptr), [{ 236*9880d681SAndroid Build Coastguard Worker return cast<LoadSDNode>(N)->getExtensionType() == ISD::SEXTLOAD; 237*9880d681SAndroid Build Coastguard Worker}]>; 238*9880d681SAndroid Build Coastguard Workerdef si_az_extload_local : AZExtLoadBase <si_ld_local>; 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Workermulticlass SIExtLoadLocal <PatFrag ld_node> { 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Worker def _i8 : PatFrag <(ops node:$ptr), (ld_node node:$ptr), 243*9880d681SAndroid Build Coastguard Worker [{return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8;}] 244*9880d681SAndroid Build Coastguard Worker >; 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Worker def _i16 : PatFrag <(ops node:$ptr), (ld_node node:$ptr), 247*9880d681SAndroid Build Coastguard Worker [{return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16;}] 248*9880d681SAndroid Build Coastguard Worker >; 249*9880d681SAndroid Build Coastguard Worker} 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Workerdefm si_sextload_local : SIExtLoadLocal <si_sextload_local>; 252*9880d681SAndroid Build Coastguard Workerdefm si_az_extload_local : SIExtLoadLocal <si_az_extload_local>; 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Workerdef SIst_local : SDNode <"ISD::STORE", SDTStore, 255*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPMayStore, SDNPMemOperand, SDNPInGlue] 256*9880d681SAndroid Build Coastguard Worker>; 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Workerdef si_st_local : PatFrag < 259*9880d681SAndroid Build Coastguard Worker (ops node:$val, node:$ptr), (SIst_local node:$val, node:$ptr), [{ 260*9880d681SAndroid Build Coastguard Worker return cast<StoreSDNode>(N)->getAddressSpace() == AMDGPUAS::LOCAL_ADDRESS; 261*9880d681SAndroid Build Coastguard Worker}]>; 262*9880d681SAndroid Build Coastguard Worker 263*9880d681SAndroid Build Coastguard Workerdef si_store_local : PatFrag < 264*9880d681SAndroid Build Coastguard Worker (ops node:$val, node:$ptr), (si_st_local node:$val, node:$ptr), [{ 265*9880d681SAndroid Build Coastguard Worker return cast<StoreSDNode>(N)->getAddressingMode() == ISD::UNINDEXED && 266*9880d681SAndroid Build Coastguard Worker !cast<StoreSDNode>(N)->isTruncatingStore(); 267*9880d681SAndroid Build Coastguard Worker}]>; 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Workerdef si_store_local_align8 : Aligned8Bytes < 270*9880d681SAndroid Build Coastguard Worker (ops node:$val, node:$ptr), (si_store_local node:$val, node:$ptr) 271*9880d681SAndroid Build Coastguard Worker>; 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Workerdef si_truncstore_local : PatFrag < 274*9880d681SAndroid Build Coastguard Worker (ops node:$val, node:$ptr), (si_st_local node:$val, node:$ptr), [{ 275*9880d681SAndroid Build Coastguard Worker return cast<StoreSDNode>(N)->isTruncatingStore(); 276*9880d681SAndroid Build Coastguard Worker}]>; 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Workerdef si_truncstore_local_i8 : PatFrag < 279*9880d681SAndroid Build Coastguard Worker (ops node:$val, node:$ptr), (si_truncstore_local node:$val, node:$ptr), [{ 280*9880d681SAndroid Build Coastguard Worker return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i8; 281*9880d681SAndroid Build Coastguard Worker}]>; 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Workerdef si_truncstore_local_i16 : PatFrag < 284*9880d681SAndroid Build Coastguard Worker (ops node:$val, node:$ptr), (si_truncstore_local node:$val, node:$ptr), [{ 285*9880d681SAndroid Build Coastguard Worker return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i16; 286*9880d681SAndroid Build Coastguard Worker}]>; 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Workerdef si_setcc_uniform : PatFrag < 289*9880d681SAndroid Build Coastguard Worker (ops node:$lhs, node:$rhs, node:$cond), 290*9880d681SAndroid Build Coastguard Worker (setcc node:$lhs, node:$rhs, node:$cond), [{ 291*9880d681SAndroid Build Coastguard Worker for (SDNode *Use : N->uses()) { 292*9880d681SAndroid Build Coastguard Worker if (Use->isMachineOpcode() || Use->getOpcode() != ISD::CopyToReg) 293*9880d681SAndroid Build Coastguard Worker return false; 294*9880d681SAndroid Build Coastguard Worker 295*9880d681SAndroid Build Coastguard Worker unsigned Reg = cast<RegisterSDNode>(Use->getOperand(1))->getReg(); 296*9880d681SAndroid Build Coastguard Worker if (Reg != AMDGPU::SCC) 297*9880d681SAndroid Build Coastguard Worker return false; 298*9880d681SAndroid Build Coastguard Worker } 299*9880d681SAndroid Build Coastguard Worker return true; 300*9880d681SAndroid Build Coastguard Worker}]>; 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Workerdef si_uniform_br : PatFrag < 303*9880d681SAndroid Build Coastguard Worker (ops node:$cond, node:$bb), (brcond node:$cond, node:$bb), [{ 304*9880d681SAndroid Build Coastguard Worker return isUniformBr(N); 305*9880d681SAndroid Build Coastguard Worker}]>; 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Workerdef si_uniform_br_scc : PatFrag < 308*9880d681SAndroid Build Coastguard Worker (ops node:$cond, node:$bb), (si_uniform_br node:$cond, node:$bb), [{ 309*9880d681SAndroid Build Coastguard Worker return isCBranchSCC(N); 310*9880d681SAndroid Build Coastguard Worker}]>; 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Workermulticlass SIAtomicM0Glue2 <string op_name, bit is_amdgpu = 0> { 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Worker def _glue : SDNode < 315*9880d681SAndroid Build Coastguard Worker !if(is_amdgpu, "AMDGPUISD", "ISD")#"::ATOMIC_"#op_name, SDTAtomic2, 316*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPMayStore, SDNPMayLoad, SDNPMemOperand, SDNPInGlue] 317*9880d681SAndroid Build Coastguard Worker >; 318*9880d681SAndroid Build Coastguard Worker 319*9880d681SAndroid Build Coastguard Worker def _local : local_binary_atomic_op <!cast<SDNode>(NAME#"_glue")>; 320*9880d681SAndroid Build Coastguard Worker} 321*9880d681SAndroid Build Coastguard Worker 322*9880d681SAndroid Build Coastguard Workerdefm si_atomic_load_add : SIAtomicM0Glue2 <"LOAD_ADD">; 323*9880d681SAndroid Build Coastguard Workerdefm si_atomic_load_sub : SIAtomicM0Glue2 <"LOAD_SUB">; 324*9880d681SAndroid Build Coastguard Workerdefm si_atomic_inc : SIAtomicM0Glue2 <"INC", 1>; 325*9880d681SAndroid Build Coastguard Workerdefm si_atomic_dec : SIAtomicM0Glue2 <"DEC", 1>; 326*9880d681SAndroid Build Coastguard Workerdefm si_atomic_load_and : SIAtomicM0Glue2 <"LOAD_AND">; 327*9880d681SAndroid Build Coastguard Workerdefm si_atomic_load_min : SIAtomicM0Glue2 <"LOAD_MIN">; 328*9880d681SAndroid Build Coastguard Workerdefm si_atomic_load_max : SIAtomicM0Glue2 <"LOAD_MAX">; 329*9880d681SAndroid Build Coastguard Workerdefm si_atomic_load_or : SIAtomicM0Glue2 <"LOAD_OR">; 330*9880d681SAndroid Build Coastguard Workerdefm si_atomic_load_xor : SIAtomicM0Glue2 <"LOAD_XOR">; 331*9880d681SAndroid Build Coastguard Workerdefm si_atomic_load_umin : SIAtomicM0Glue2 <"LOAD_UMIN">; 332*9880d681SAndroid Build Coastguard Workerdefm si_atomic_load_umax : SIAtomicM0Glue2 <"LOAD_UMAX">; 333*9880d681SAndroid Build Coastguard Workerdefm si_atomic_swap : SIAtomicM0Glue2 <"SWAP">; 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Workerdef si_atomic_cmp_swap_glue : SDNode <"ISD::ATOMIC_CMP_SWAP", SDTAtomic3, 336*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPMayStore, SDNPMayLoad, SDNPMemOperand, SDNPInGlue] 337*9880d681SAndroid Build Coastguard Worker>; 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Workerdefm si_atomic_cmp_swap : AtomicCmpSwapLocal <si_atomic_cmp_swap_glue>; 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Worker// Transformation function, extract the lower 32bit of a 64bit immediate 342*9880d681SAndroid Build Coastguard Workerdef LO32 : SDNodeXForm<imm, [{ 343*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(N->getZExtValue() & 0xffffffff, SDLoc(N), 344*9880d681SAndroid Build Coastguard Worker MVT::i32); 345*9880d681SAndroid Build Coastguard Worker}]>; 346*9880d681SAndroid Build Coastguard Worker 347*9880d681SAndroid Build Coastguard Workerdef LO32f : SDNodeXForm<fpimm, [{ 348*9880d681SAndroid Build Coastguard Worker APInt V = N->getValueAPF().bitcastToAPInt().trunc(32); 349*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstantFP(APFloat(APFloat::IEEEsingle, V), MVT::f32); 350*9880d681SAndroid Build Coastguard Worker}]>; 351*9880d681SAndroid Build Coastguard Worker 352*9880d681SAndroid Build Coastguard Worker// Transformation function, extract the upper 32bit of a 64bit immediate 353*9880d681SAndroid Build Coastguard Workerdef HI32 : SDNodeXForm<imm, [{ 354*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(N->getZExtValue() >> 32, SDLoc(N), MVT::i32); 355*9880d681SAndroid Build Coastguard Worker}]>; 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Workerdef HI32f : SDNodeXForm<fpimm, [{ 358*9880d681SAndroid Build Coastguard Worker APInt V = N->getValueAPF().bitcastToAPInt().lshr(32).trunc(32); 359*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstantFP(APFloat(APFloat::IEEEsingle, V), SDLoc(N), 360*9880d681SAndroid Build Coastguard Worker MVT::f32); 361*9880d681SAndroid Build Coastguard Worker}]>; 362*9880d681SAndroid Build Coastguard Worker 363*9880d681SAndroid Build Coastguard Workerdef IMM8bitDWORD : PatLeaf <(imm), 364*9880d681SAndroid Build Coastguard Worker [{return (N->getZExtValue() & ~0x3FC) == 0;}] 365*9880d681SAndroid Build Coastguard Worker>; 366*9880d681SAndroid Build Coastguard Worker 367*9880d681SAndroid Build Coastguard Workerdef as_dword_i32imm : SDNodeXForm<imm, [{ 368*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(N->getZExtValue() >> 2, SDLoc(N), MVT::i32); 369*9880d681SAndroid Build Coastguard Worker}]>; 370*9880d681SAndroid Build Coastguard Worker 371*9880d681SAndroid Build Coastguard Workerdef as_i1imm : SDNodeXForm<imm, [{ 372*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(N->getZExtValue(), SDLoc(N), MVT::i1); 373*9880d681SAndroid Build Coastguard Worker}]>; 374*9880d681SAndroid Build Coastguard Worker 375*9880d681SAndroid Build Coastguard Workerdef as_i8imm : SDNodeXForm<imm, [{ 376*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(N->getZExtValue(), SDLoc(N), MVT::i8); 377*9880d681SAndroid Build Coastguard Worker}]>; 378*9880d681SAndroid Build Coastguard Worker 379*9880d681SAndroid Build Coastguard Workerdef as_i16imm : SDNodeXForm<imm, [{ 380*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(N->getSExtValue(), SDLoc(N), MVT::i16); 381*9880d681SAndroid Build Coastguard Worker}]>; 382*9880d681SAndroid Build Coastguard Worker 383*9880d681SAndroid Build Coastguard Workerdef as_i32imm: SDNodeXForm<imm, [{ 384*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(N->getSExtValue(), SDLoc(N), MVT::i32); 385*9880d681SAndroid Build Coastguard Worker}]>; 386*9880d681SAndroid Build Coastguard Worker 387*9880d681SAndroid Build Coastguard Workerdef as_i64imm: SDNodeXForm<imm, [{ 388*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(N->getSExtValue(), SDLoc(N), MVT::i64); 389*9880d681SAndroid Build Coastguard Worker}]>; 390*9880d681SAndroid Build Coastguard Worker 391*9880d681SAndroid Build Coastguard Worker// Copied from the AArch64 backend: 392*9880d681SAndroid Build Coastguard Workerdef bitcast_fpimm_to_i32 : SDNodeXForm<fpimm, [{ 393*9880d681SAndroid Build Coastguard Workerreturn CurDAG->getTargetConstant( 394*9880d681SAndroid Build Coastguard Worker N->getValueAPF().bitcastToAPInt().getZExtValue(), SDLoc(N), MVT::i32); 395*9880d681SAndroid Build Coastguard Worker}]>; 396*9880d681SAndroid Build Coastguard Worker 397*9880d681SAndroid Build Coastguard Worker// Copied from the AArch64 backend: 398*9880d681SAndroid Build Coastguard Workerdef bitcast_fpimm_to_i64 : SDNodeXForm<fpimm, [{ 399*9880d681SAndroid Build Coastguard Workerreturn CurDAG->getTargetConstant( 400*9880d681SAndroid Build Coastguard Worker N->getValueAPF().bitcastToAPInt().getZExtValue(), SDLoc(N), MVT::i64); 401*9880d681SAndroid Build Coastguard Worker}]>; 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard Workerdef IMM8bit : PatLeaf <(imm), 404*9880d681SAndroid Build Coastguard Worker [{return isUInt<8>(N->getZExtValue());}] 405*9880d681SAndroid Build Coastguard Worker>; 406*9880d681SAndroid Build Coastguard Worker 407*9880d681SAndroid Build Coastguard Workerdef IMM12bit : PatLeaf <(imm), 408*9880d681SAndroid Build Coastguard Worker [{return isUInt<12>(N->getZExtValue());}] 409*9880d681SAndroid Build Coastguard Worker>; 410*9880d681SAndroid Build Coastguard Worker 411*9880d681SAndroid Build Coastguard Workerdef IMM16bit : PatLeaf <(imm), 412*9880d681SAndroid Build Coastguard Worker [{return isUInt<16>(N->getZExtValue());}] 413*9880d681SAndroid Build Coastguard Worker>; 414*9880d681SAndroid Build Coastguard Worker 415*9880d681SAndroid Build Coastguard Workerdef SIMM16bit : PatLeaf <(imm), 416*9880d681SAndroid Build Coastguard Worker [{return isInt<16>(N->getSExtValue());}] 417*9880d681SAndroid Build Coastguard Worker>; 418*9880d681SAndroid Build Coastguard Worker 419*9880d681SAndroid Build Coastguard Workerdef IMM20bit : PatLeaf <(imm), 420*9880d681SAndroid Build Coastguard Worker [{return isUInt<20>(N->getZExtValue());}] 421*9880d681SAndroid Build Coastguard Worker>; 422*9880d681SAndroid Build Coastguard Worker 423*9880d681SAndroid Build Coastguard Workerdef IMM32bit : PatLeaf <(imm), 424*9880d681SAndroid Build Coastguard Worker [{return isUInt<32>(N->getZExtValue());}] 425*9880d681SAndroid Build Coastguard Worker>; 426*9880d681SAndroid Build Coastguard Worker 427*9880d681SAndroid Build Coastguard Workerdef mubuf_vaddr_offset : PatFrag< 428*9880d681SAndroid Build Coastguard Worker (ops node:$ptr, node:$offset, node:$imm_offset), 429*9880d681SAndroid Build Coastguard Worker (add (add node:$ptr, node:$offset), node:$imm_offset) 430*9880d681SAndroid Build Coastguard Worker>; 431*9880d681SAndroid Build Coastguard Worker 432*9880d681SAndroid Build Coastguard Workerclass InlineImm <ValueType vt> : PatLeaf <(vt imm), [{ 433*9880d681SAndroid Build Coastguard Worker return isInlineImmediate(N); 434*9880d681SAndroid Build Coastguard Worker}]>; 435*9880d681SAndroid Build Coastguard Worker 436*9880d681SAndroid Build Coastguard Workerclass InlineFPImm <ValueType vt> : PatLeaf <(vt fpimm), [{ 437*9880d681SAndroid Build Coastguard Worker return isInlineImmediate(N); 438*9880d681SAndroid Build Coastguard Worker}]>; 439*9880d681SAndroid Build Coastguard Worker 440*9880d681SAndroid Build Coastguard Workerclass SGPRImm <dag frag> : PatLeaf<frag, [{ 441*9880d681SAndroid Build Coastguard Worker if (Subtarget->getGeneration() < SISubtarget::SOUTHERN_ISLANDS) { 442*9880d681SAndroid Build Coastguard Worker return false; 443*9880d681SAndroid Build Coastguard Worker } 444*9880d681SAndroid Build Coastguard Worker const SIRegisterInfo *SIRI = 445*9880d681SAndroid Build Coastguard Worker static_cast<const SIRegisterInfo *>(Subtarget->getRegisterInfo()); 446*9880d681SAndroid Build Coastguard Worker for (SDNode::use_iterator U = N->use_begin(), E = SDNode::use_end(); 447*9880d681SAndroid Build Coastguard Worker U != E; ++U) { 448*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass *RC = getOperandRegClass(*U, U.getOperandNo()); 449*9880d681SAndroid Build Coastguard Worker if (RC && SIRI->isSGPRClass(RC)) 450*9880d681SAndroid Build Coastguard Worker return true; 451*9880d681SAndroid Build Coastguard Worker } 452*9880d681SAndroid Build Coastguard Worker return false; 453*9880d681SAndroid Build Coastguard Worker}]>; 454*9880d681SAndroid Build Coastguard Worker 455*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 456*9880d681SAndroid Build Coastguard Worker// Custom Operands 457*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 458*9880d681SAndroid Build Coastguard Worker 459*9880d681SAndroid Build Coastguard Workerdef FRAMEri32 : Operand<iPTR> { 460*9880d681SAndroid Build Coastguard Worker let MIOperandInfo = (ops i32:$ptr, i32imm:$index); 461*9880d681SAndroid Build Coastguard Worker} 462*9880d681SAndroid Build Coastguard Worker 463*9880d681SAndroid Build Coastguard Workerdef SoppBrTarget : AsmOperandClass { 464*9880d681SAndroid Build Coastguard Worker let Name = "SoppBrTarget"; 465*9880d681SAndroid Build Coastguard Worker let ParserMethod = "parseSOppBrTarget"; 466*9880d681SAndroid Build Coastguard Worker} 467*9880d681SAndroid Build Coastguard Worker 468*9880d681SAndroid Build Coastguard Workerdef sopp_brtarget : Operand<OtherVT> { 469*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getSOPPBrEncoding"; 470*9880d681SAndroid Build Coastguard Worker let OperandType = "OPERAND_PCREL"; 471*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = SoppBrTarget; 472*9880d681SAndroid Build Coastguard Worker} 473*9880d681SAndroid Build Coastguard Worker 474*9880d681SAndroid Build Coastguard Workerdef si_ga : Operand<iPTR>; 475*9880d681SAndroid Build Coastguard Worker 476*9880d681SAndroid Build Coastguard Workerdef InterpSlot : Operand<i32> { 477*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printInterpSlot"; 478*9880d681SAndroid Build Coastguard Worker} 479*9880d681SAndroid Build Coastguard Worker 480*9880d681SAndroid Build Coastguard Workerdef SendMsgMatchClass : AsmOperandClass { 481*9880d681SAndroid Build Coastguard Worker let Name = "SendMsg"; 482*9880d681SAndroid Build Coastguard Worker let PredicateMethod = "isSendMsg"; 483*9880d681SAndroid Build Coastguard Worker let ParserMethod = "parseSendMsgOp"; 484*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands"; 485*9880d681SAndroid Build Coastguard Worker} 486*9880d681SAndroid Build Coastguard Worker 487*9880d681SAndroid Build Coastguard Workerdef SendMsgImm : Operand<i32> { 488*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printSendMsg"; 489*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = SendMsgMatchClass; 490*9880d681SAndroid Build Coastguard Worker} 491*9880d681SAndroid Build Coastguard Worker 492*9880d681SAndroid Build Coastguard Workerdef SWaitMatchClass : AsmOperandClass { 493*9880d681SAndroid Build Coastguard Worker let Name = "SWaitCnt"; 494*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands"; 495*9880d681SAndroid Build Coastguard Worker let ParserMethod = "parseSWaitCntOps"; 496*9880d681SAndroid Build Coastguard Worker} 497*9880d681SAndroid Build Coastguard Worker 498*9880d681SAndroid Build Coastguard Workerdef WAIT_FLAG : Operand <i32> { 499*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = SWaitMatchClass; 500*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printWaitFlag"; 501*9880d681SAndroid Build Coastguard Worker} 502*9880d681SAndroid Build Coastguard Worker 503*9880d681SAndroid Build Coastguard Workerinclude "SIInstrFormats.td" 504*9880d681SAndroid Build Coastguard Workerinclude "VIInstrFormats.td" 505*9880d681SAndroid Build Coastguard Worker 506*9880d681SAndroid Build Coastguard Workerclass NamedMatchClass<string CName, bit Optional = 1> : AsmOperandClass { 507*9880d681SAndroid Build Coastguard Worker let Name = "Imm"#CName; 508*9880d681SAndroid Build Coastguard Worker let PredicateMethod = "is"#CName; 509*9880d681SAndroid Build Coastguard Worker let ParserMethod = !if(Optional, "parseOptionalOperand", "parse"#CName); 510*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands"; 511*9880d681SAndroid Build Coastguard Worker let IsOptional = Optional; 512*9880d681SAndroid Build Coastguard Worker let DefaultMethod = !if(Optional, "default"#CName, ?); 513*9880d681SAndroid Build Coastguard Worker} 514*9880d681SAndroid Build Coastguard Worker 515*9880d681SAndroid Build Coastguard Workerclass NamedOperandBit<string Name, AsmOperandClass MatchClass> : Operand<i1> { 516*9880d681SAndroid Build Coastguard Worker let PrintMethod = "print"#Name; 517*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MatchClass; 518*9880d681SAndroid Build Coastguard Worker} 519*9880d681SAndroid Build Coastguard Worker 520*9880d681SAndroid Build Coastguard Workerclass NamedOperandU8<string Name, AsmOperandClass MatchClass> : Operand<i8> { 521*9880d681SAndroid Build Coastguard Worker let PrintMethod = "print"#Name; 522*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MatchClass; 523*9880d681SAndroid Build Coastguard Worker} 524*9880d681SAndroid Build Coastguard Worker 525*9880d681SAndroid Build Coastguard Workerclass NamedOperandU16<string Name, AsmOperandClass MatchClass> : Operand<i16> { 526*9880d681SAndroid Build Coastguard Worker let PrintMethod = "print"#Name; 527*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MatchClass; 528*9880d681SAndroid Build Coastguard Worker} 529*9880d681SAndroid Build Coastguard Worker 530*9880d681SAndroid Build Coastguard Workerclass NamedOperandU32<string Name, AsmOperandClass MatchClass> : Operand<i32> { 531*9880d681SAndroid Build Coastguard Worker let PrintMethod = "print"#Name; 532*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MatchClass; 533*9880d681SAndroid Build Coastguard Worker} 534*9880d681SAndroid Build Coastguard Worker 535*9880d681SAndroid Build Coastguard Workerlet OperandType = "OPERAND_IMMEDIATE" in { 536*9880d681SAndroid Build Coastguard Worker 537*9880d681SAndroid Build Coastguard Workerdef offen : NamedOperandBit<"Offen", NamedMatchClass<"Offen">>; 538*9880d681SAndroid Build Coastguard Workerdef idxen : NamedOperandBit<"Idxen", NamedMatchClass<"Idxen">>; 539*9880d681SAndroid Build Coastguard Workerdef addr64 : NamedOperandBit<"Addr64", NamedMatchClass<"Addr64">>; 540*9880d681SAndroid Build Coastguard Worker 541*9880d681SAndroid Build Coastguard Workerdef offset : NamedOperandU16<"Offset", NamedMatchClass<"Offset">>; 542*9880d681SAndroid Build Coastguard Workerdef offset0 : NamedOperandU8<"Offset0", NamedMatchClass<"Offset0">>; 543*9880d681SAndroid Build Coastguard Workerdef offset1 : NamedOperandU8<"Offset1", NamedMatchClass<"Offset1">>; 544*9880d681SAndroid Build Coastguard Worker 545*9880d681SAndroid Build Coastguard Workerdef gds : NamedOperandBit<"GDS", NamedMatchClass<"GDS">>; 546*9880d681SAndroid Build Coastguard Worker 547*9880d681SAndroid Build Coastguard Workerdef omod : NamedOperandU32<"OModSI", NamedMatchClass<"OModSI">>; 548*9880d681SAndroid Build Coastguard Workerdef clampmod : NamedOperandBit<"ClampSI", NamedMatchClass<"ClampSI">>; 549*9880d681SAndroid Build Coastguard Worker 550*9880d681SAndroid Build Coastguard Workerdef smrd_offset : NamedOperandU32<"SMRDOffset", NamedMatchClass<"SMRDOffset">>; 551*9880d681SAndroid Build Coastguard Workerdef smrd_literal_offset : NamedOperandU32<"SMRDLiteralOffset", NamedMatchClass<"SMRDLiteralOffset">>; 552*9880d681SAndroid Build Coastguard Worker 553*9880d681SAndroid Build Coastguard Workerdef glc : NamedOperandBit<"GLC", NamedMatchClass<"GLC">>; 554*9880d681SAndroid Build Coastguard Workerdef slc : NamedOperandBit<"SLC", NamedMatchClass<"SLC">>; 555*9880d681SAndroid Build Coastguard Workerdef tfe : NamedOperandBit<"TFE", NamedMatchClass<"TFE">>; 556*9880d681SAndroid Build Coastguard Workerdef unorm : NamedOperandBit<"UNorm", NamedMatchClass<"UNorm">>; 557*9880d681SAndroid Build Coastguard Workerdef da : NamedOperandBit<"DA", NamedMatchClass<"DA">>; 558*9880d681SAndroid Build Coastguard Workerdef r128 : NamedOperandBit<"R128", NamedMatchClass<"R128">>; 559*9880d681SAndroid Build Coastguard Workerdef lwe : NamedOperandBit<"LWE", NamedMatchClass<"LWE">>; 560*9880d681SAndroid Build Coastguard Worker 561*9880d681SAndroid Build Coastguard Workerdef dmask : NamedOperandU16<"DMask", NamedMatchClass<"DMask">>; 562*9880d681SAndroid Build Coastguard Worker 563*9880d681SAndroid Build Coastguard Workerdef dpp_ctrl : NamedOperandU32<"DPPCtrl", NamedMatchClass<"DPPCtrl", 0>>; 564*9880d681SAndroid Build Coastguard Workerdef row_mask : NamedOperandU32<"RowMask", NamedMatchClass<"RowMask">>; 565*9880d681SAndroid Build Coastguard Workerdef bank_mask : NamedOperandU32<"BankMask", NamedMatchClass<"BankMask">>; 566*9880d681SAndroid Build Coastguard Workerdef bound_ctrl : NamedOperandBit<"BoundCtrl", NamedMatchClass<"BoundCtrl">>; 567*9880d681SAndroid Build Coastguard Worker 568*9880d681SAndroid Build Coastguard Workerdef dst_sel : NamedOperandU32<"SDWADstSel", NamedMatchClass<"SDWADstSel">>; 569*9880d681SAndroid Build Coastguard Workerdef src0_sel : NamedOperandU32<"SDWASrc0Sel", NamedMatchClass<"SDWASrc0Sel">>; 570*9880d681SAndroid Build Coastguard Workerdef src1_sel : NamedOperandU32<"SDWASrc1Sel", NamedMatchClass<"SDWASrc1Sel">>; 571*9880d681SAndroid Build Coastguard Workerdef dst_unused : NamedOperandU32<"SDWADstUnused", NamedMatchClass<"SDWADstUnused">>; 572*9880d681SAndroid Build Coastguard Worker 573*9880d681SAndroid Build Coastguard Workerdef hwreg : NamedOperandU16<"Hwreg", NamedMatchClass<"Hwreg", 0>>; 574*9880d681SAndroid Build Coastguard Worker 575*9880d681SAndroid Build Coastguard Worker} // End OperandType = "OPERAND_IMMEDIATE" 576*9880d681SAndroid Build Coastguard Worker 577*9880d681SAndroid Build Coastguard Worker 578*9880d681SAndroid Build Coastguard Workerdef VOPDstS64 : VOPDstOperand <SReg_64>; 579*9880d681SAndroid Build Coastguard Worker 580*9880d681SAndroid Build Coastguard Workerdef FPInputModsMatchClass : AsmOperandClass { 581*9880d681SAndroid Build Coastguard Worker let Name = "RegOrImmWithFPInputMods"; 582*9880d681SAndroid Build Coastguard Worker let ParserMethod = "parseRegOrImmWithFPInputMods"; 583*9880d681SAndroid Build Coastguard Worker let PredicateMethod = "isRegOrImmWithInputMods"; 584*9880d681SAndroid Build Coastguard Worker} 585*9880d681SAndroid Build Coastguard Worker 586*9880d681SAndroid Build Coastguard Workerdef FPInputMods : Operand <i32> { 587*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printOperandAndFPInputMods"; 588*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = FPInputModsMatchClass; 589*9880d681SAndroid Build Coastguard Worker} 590*9880d681SAndroid Build Coastguard Worker 591*9880d681SAndroid Build Coastguard Workerdef IntInputModsMatchClass : AsmOperandClass { 592*9880d681SAndroid Build Coastguard Worker let Name = "RegOrImmWithIntInputMods"; 593*9880d681SAndroid Build Coastguard Worker let ParserMethod = "parseRegOrImmWithIntInputMods"; 594*9880d681SAndroid Build Coastguard Worker let PredicateMethod = "isRegOrImmWithInputMods"; 595*9880d681SAndroid Build Coastguard Worker} 596*9880d681SAndroid Build Coastguard Worker 597*9880d681SAndroid Build Coastguard Workerdef IntInputMods: Operand <i32> { 598*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printOperandAndIntInputMods"; 599*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = IntInputModsMatchClass; 600*9880d681SAndroid Build Coastguard Worker} 601*9880d681SAndroid Build Coastguard Worker 602*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 603*9880d681SAndroid Build Coastguard Worker// Complex patterns 604*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 605*9880d681SAndroid Build Coastguard Worker 606*9880d681SAndroid Build Coastguard Workerdef DS1Addr1Offset : ComplexPattern<i32, 2, "SelectDS1Addr1Offset">; 607*9880d681SAndroid Build Coastguard Workerdef DS64Bit4ByteAligned : ComplexPattern<i32, 3, "SelectDS64Bit4ByteAligned">; 608*9880d681SAndroid Build Coastguard Worker 609*9880d681SAndroid Build Coastguard Workerdef MUBUFAddr32 : ComplexPattern<i64, 9, "SelectMUBUFAddr32">; 610*9880d681SAndroid Build Coastguard Workerdef MUBUFAddr64 : ComplexPattern<i64, 7, "SelectMUBUFAddr64">; 611*9880d681SAndroid Build Coastguard Workerdef MUBUFAddr64Atomic : ComplexPattern<i64, 5, "SelectMUBUFAddr64">; 612*9880d681SAndroid Build Coastguard Workerdef FLATAtomic : ComplexPattern<i64, 3, "SelectFlat">; 613*9880d681SAndroid Build Coastguard Workerdef MUBUFScratch : ComplexPattern<i64, 4, "SelectMUBUFScratch">; 614*9880d681SAndroid Build Coastguard Workerdef MUBUFOffset : ComplexPattern<i64, 6, "SelectMUBUFOffset">; 615*9880d681SAndroid Build Coastguard Workerdef MUBUFOffsetNoGLC : ComplexPattern<i64, 3, "SelectMUBUFOffset">; 616*9880d681SAndroid Build Coastguard Workerdef MUBUFOffsetAtomic : ComplexPattern<i64, 4, "SelectMUBUFOffset">; 617*9880d681SAndroid Build Coastguard Workerdef MUBUFIntrinsicOffset : ComplexPattern<i32, 2, "SelectMUBUFIntrinsicOffset">; 618*9880d681SAndroid Build Coastguard Workerdef MUBUFIntrinsicVOffset : ComplexPattern<i32, 3, "SelectMUBUFIntrinsicVOffset">; 619*9880d681SAndroid Build Coastguard Worker 620*9880d681SAndroid Build Coastguard Workerdef SMRDImm : ComplexPattern<i64, 2, "SelectSMRDImm">; 621*9880d681SAndroid Build Coastguard Workerdef SMRDImm32 : ComplexPattern<i64, 2, "SelectSMRDImm32">; 622*9880d681SAndroid Build Coastguard Workerdef SMRDSgpr : ComplexPattern<i64, 2, "SelectSMRDSgpr">; 623*9880d681SAndroid Build Coastguard Workerdef SMRDBufferImm : ComplexPattern<i32, 1, "SelectSMRDBufferImm">; 624*9880d681SAndroid Build Coastguard Workerdef SMRDBufferImm32 : ComplexPattern<i32, 1, "SelectSMRDBufferImm32">; 625*9880d681SAndroid Build Coastguard Workerdef SMRDBufferSgpr : ComplexPattern<i32, 1, "SelectSMRDBufferSgpr">; 626*9880d681SAndroid Build Coastguard Worker 627*9880d681SAndroid Build Coastguard Workerdef MOVRELOffset : ComplexPattern<i32, 2, "SelectMOVRELOffset">; 628*9880d681SAndroid Build Coastguard Worker 629*9880d681SAndroid Build Coastguard Workerdef VOP3Mods0 : ComplexPattern<untyped, 4, "SelectVOP3Mods0">; 630*9880d681SAndroid Build Coastguard Workerdef VOP3NoMods0 : ComplexPattern<untyped, 4, "SelectVOP3NoMods0">; 631*9880d681SAndroid Build Coastguard Workerdef VOP3Mods0Clamp : ComplexPattern<untyped, 3, "SelectVOP3Mods0Clamp">; 632*9880d681SAndroid Build Coastguard Workerdef VOP3Mods0Clamp0OMod : ComplexPattern<untyped, 4, "SelectVOP3Mods0Clamp0OMod">; 633*9880d681SAndroid Build Coastguard Workerdef VOP3Mods : ComplexPattern<untyped, 2, "SelectVOP3Mods">; 634*9880d681SAndroid Build Coastguard Workerdef VOP3NoMods : ComplexPattern<untyped, 2, "SelectVOP3NoMods">; 635*9880d681SAndroid Build Coastguard Worker 636*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 637*9880d681SAndroid Build Coastguard Worker// SI assembler operands 638*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 639*9880d681SAndroid Build Coastguard Worker 640*9880d681SAndroid Build Coastguard Workerdef SIOperand { 641*9880d681SAndroid Build Coastguard Worker int ZERO = 0x80; 642*9880d681SAndroid Build Coastguard Worker int VCC = 0x6A; 643*9880d681SAndroid Build Coastguard Worker int FLAT_SCR = 0x68; 644*9880d681SAndroid Build Coastguard Worker} 645*9880d681SAndroid Build Coastguard Worker 646*9880d681SAndroid Build Coastguard Workerdef SRCMODS { 647*9880d681SAndroid Build Coastguard Worker int NONE = 0; 648*9880d681SAndroid Build Coastguard Worker int NEG = 1; 649*9880d681SAndroid Build Coastguard Worker} 650*9880d681SAndroid Build Coastguard Worker 651*9880d681SAndroid Build Coastguard Workerdef DSTCLAMP { 652*9880d681SAndroid Build Coastguard Worker int NONE = 0; 653*9880d681SAndroid Build Coastguard Worker} 654*9880d681SAndroid Build Coastguard Worker 655*9880d681SAndroid Build Coastguard Workerdef DSTOMOD { 656*9880d681SAndroid Build Coastguard Worker int NONE = 0; 657*9880d681SAndroid Build Coastguard Worker} 658*9880d681SAndroid Build Coastguard Worker 659*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 660*9880d681SAndroid Build Coastguard Worker// 661*9880d681SAndroid Build Coastguard Worker// SI Instruction multiclass helpers. 662*9880d681SAndroid Build Coastguard Worker// 663*9880d681SAndroid Build Coastguard Worker// Instructions with _32 take 32-bit operands. 664*9880d681SAndroid Build Coastguard Worker// Instructions with _64 take 64-bit operands. 665*9880d681SAndroid Build Coastguard Worker// 666*9880d681SAndroid Build Coastguard Worker// VOP_* instructions can use either a 32-bit or 64-bit encoding. The 32-bit 667*9880d681SAndroid Build Coastguard Worker// encoding is the standard encoding, but instruction that make use of 668*9880d681SAndroid Build Coastguard Worker// any of the instruction modifiers must use the 64-bit encoding. 669*9880d681SAndroid Build Coastguard Worker// 670*9880d681SAndroid Build Coastguard Worker// Instructions with _e32 use the 32-bit encoding. 671*9880d681SAndroid Build Coastguard Worker// Instructions with _e64 use the 64-bit encoding. 672*9880d681SAndroid Build Coastguard Worker// 673*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 674*9880d681SAndroid Build Coastguard Worker 675*9880d681SAndroid Build Coastguard Workerclass SIMCInstr <string pseudo, int subtarget> { 676*9880d681SAndroid Build Coastguard Worker string PseudoInstr = pseudo; 677*9880d681SAndroid Build Coastguard Worker int Subtarget = subtarget; 678*9880d681SAndroid Build Coastguard Worker} 679*9880d681SAndroid Build Coastguard Worker 680*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 681*9880d681SAndroid Build Coastguard Worker// EXP classes 682*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 683*9880d681SAndroid Build Coastguard Worker 684*9880d681SAndroid Build Coastguard Workerclass EXPCommon : InstSI< 685*9880d681SAndroid Build Coastguard Worker (outs), 686*9880d681SAndroid Build Coastguard Worker (ins i32imm:$en, i32imm:$tgt, i32imm:$compr, i32imm:$done, i32imm:$vm, 687*9880d681SAndroid Build Coastguard Worker VGPR_32:$src0, VGPR_32:$src1, VGPR_32:$src2, VGPR_32:$src3), 688*9880d681SAndroid Build Coastguard Worker "exp $en, $tgt, $compr, $done, $vm, $src0, $src1, $src2, $src3", 689*9880d681SAndroid Build Coastguard Worker [] > { 690*9880d681SAndroid Build Coastguard Worker 691*9880d681SAndroid Build Coastguard Worker let EXP_CNT = 1; 692*9880d681SAndroid Build Coastguard Worker let Uses = [EXEC]; 693*9880d681SAndroid Build Coastguard Worker let SchedRW = [WriteExport]; 694*9880d681SAndroid Build Coastguard Worker} 695*9880d681SAndroid Build Coastguard Worker 696*9880d681SAndroid Build Coastguard Workermulticlass EXP_m { 697*9880d681SAndroid Build Coastguard Worker 698*9880d681SAndroid Build Coastguard Worker let isPseudo = 1, isCodeGenOnly = 1 in { 699*9880d681SAndroid Build Coastguard Worker def "" : EXPCommon, SIMCInstr <"exp", SIEncodingFamily.NONE> ; 700*9880d681SAndroid Build Coastguard Worker } 701*9880d681SAndroid Build Coastguard Worker 702*9880d681SAndroid Build Coastguard Worker def _si : EXPCommon, SIMCInstr <"exp", SIEncodingFamily.SI>, EXPe { 703*9880d681SAndroid Build Coastguard Worker let DecoderNamespace="SICI"; 704*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 705*9880d681SAndroid Build Coastguard Worker } 706*9880d681SAndroid Build Coastguard Worker 707*9880d681SAndroid Build Coastguard Worker def _vi : EXPCommon, SIMCInstr <"exp", SIEncodingFamily.VI>, EXPe_vi { 708*9880d681SAndroid Build Coastguard Worker let DecoderNamespace="VI"; 709*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 710*9880d681SAndroid Build Coastguard Worker } 711*9880d681SAndroid Build Coastguard Worker} 712*9880d681SAndroid Build Coastguard Worker 713*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 714*9880d681SAndroid Build Coastguard Worker// Scalar classes 715*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 716*9880d681SAndroid Build Coastguard Worker 717*9880d681SAndroid Build Coastguard Workerclass SOP1_Pseudo <string opName, dag outs, dag ins, list<dag> pattern> : 718*9880d681SAndroid Build Coastguard Worker SOP1 <outs, ins, "", pattern>, 719*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.NONE> { 720*9880d681SAndroid Build Coastguard Worker let isPseudo = 1; 721*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1; 722*9880d681SAndroid Build Coastguard Worker} 723*9880d681SAndroid Build Coastguard Worker 724*9880d681SAndroid Build Coastguard Workerclass SOP1_Real_si <sop1 op, string opName, dag outs, dag ins, string asm> : 725*9880d681SAndroid Build Coastguard Worker SOP1 <outs, ins, asm, []>, 726*9880d681SAndroid Build Coastguard Worker SOP1e <op.SI>, 727*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.SI> { 728*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 0; 729*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isSICI]; 730*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 731*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 732*9880d681SAndroid Build Coastguard Worker} 733*9880d681SAndroid Build Coastguard Worker 734*9880d681SAndroid Build Coastguard Workerclass SOP1_Real_vi <sop1 op, string opName, dag outs, dag ins, string asm> : 735*9880d681SAndroid Build Coastguard Worker SOP1 <outs, ins, asm, []>, 736*9880d681SAndroid Build Coastguard Worker SOP1e <op.VI>, 737*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.VI> { 738*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 0; 739*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 740*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 741*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 742*9880d681SAndroid Build Coastguard Worker} 743*9880d681SAndroid Build Coastguard Worker 744*9880d681SAndroid Build Coastguard Workermulticlass SOP1_m <sop1 op, string opName, dag outs, dag ins, string asm, 745*9880d681SAndroid Build Coastguard Worker list<dag> pattern> { 746*9880d681SAndroid Build Coastguard Worker 747*9880d681SAndroid Build Coastguard Worker def "" : SOP1_Pseudo <opName, outs, ins, pattern>; 748*9880d681SAndroid Build Coastguard Worker 749*9880d681SAndroid Build Coastguard Worker def _si : SOP1_Real_si <op, opName, outs, ins, asm>; 750*9880d681SAndroid Build Coastguard Worker 751*9880d681SAndroid Build Coastguard Worker def _vi : SOP1_Real_vi <op, opName, outs, ins, asm>; 752*9880d681SAndroid Build Coastguard Worker 753*9880d681SAndroid Build Coastguard Worker} 754*9880d681SAndroid Build Coastguard Worker 755*9880d681SAndroid Build Coastguard Workermulticlass SOP1_32 <sop1 op, string opName, list<dag> pattern> : SOP1_m < 756*9880d681SAndroid Build Coastguard Worker op, opName, (outs SReg_32:$sdst), (ins SSrc_32:$src0), 757*9880d681SAndroid Build Coastguard Worker opName#" $sdst, $src0", pattern 758*9880d681SAndroid Build Coastguard Worker>; 759*9880d681SAndroid Build Coastguard Worker 760*9880d681SAndroid Build Coastguard Workermulticlass SOP1_64 <sop1 op, string opName, list<dag> pattern> : SOP1_m < 761*9880d681SAndroid Build Coastguard Worker op, opName, (outs SReg_64:$sdst), (ins SSrc_64:$src0), 762*9880d681SAndroid Build Coastguard Worker opName#" $sdst, $src0", pattern 763*9880d681SAndroid Build Coastguard Worker>; 764*9880d681SAndroid Build Coastguard Worker 765*9880d681SAndroid Build Coastguard Worker// no input, 64-bit output. 766*9880d681SAndroid Build Coastguard Workermulticlass SOP1_64_0 <sop1 op, string opName, list<dag> pattern> { 767*9880d681SAndroid Build Coastguard Worker def "" : SOP1_Pseudo <opName, (outs SReg_64:$sdst), (ins), pattern>; 768*9880d681SAndroid Build Coastguard Worker 769*9880d681SAndroid Build Coastguard Worker def _si : SOP1_Real_si <op, opName, (outs SReg_64:$sdst), (ins), 770*9880d681SAndroid Build Coastguard Worker opName#" $sdst"> { 771*9880d681SAndroid Build Coastguard Worker let src0 = 0; 772*9880d681SAndroid Build Coastguard Worker } 773*9880d681SAndroid Build Coastguard Worker 774*9880d681SAndroid Build Coastguard Worker def _vi : SOP1_Real_vi <op, opName, (outs SReg_64:$sdst), (ins), 775*9880d681SAndroid Build Coastguard Worker opName#" $sdst"> { 776*9880d681SAndroid Build Coastguard Worker let src0 = 0; 777*9880d681SAndroid Build Coastguard Worker } 778*9880d681SAndroid Build Coastguard Worker} 779*9880d681SAndroid Build Coastguard Worker 780*9880d681SAndroid Build Coastguard Worker// 64-bit input, no output 781*9880d681SAndroid Build Coastguard Workermulticlass SOP1_1 <sop1 op, string opName, list<dag> pattern> { 782*9880d681SAndroid Build Coastguard Worker def "" : SOP1_Pseudo <opName, (outs), (ins SReg_64:$src0), pattern>; 783*9880d681SAndroid Build Coastguard Worker 784*9880d681SAndroid Build Coastguard Worker def _si : SOP1_Real_si <op, opName, (outs), (ins SReg_64:$src0), 785*9880d681SAndroid Build Coastguard Worker opName#" $src0"> { 786*9880d681SAndroid Build Coastguard Worker let sdst = 0; 787*9880d681SAndroid Build Coastguard Worker } 788*9880d681SAndroid Build Coastguard Worker 789*9880d681SAndroid Build Coastguard Worker def _vi : SOP1_Real_vi <op, opName, (outs), (ins SReg_64:$src0), 790*9880d681SAndroid Build Coastguard Worker opName#" $src0"> { 791*9880d681SAndroid Build Coastguard Worker let sdst = 0; 792*9880d681SAndroid Build Coastguard Worker } 793*9880d681SAndroid Build Coastguard Worker} 794*9880d681SAndroid Build Coastguard Worker 795*9880d681SAndroid Build Coastguard Worker// 64-bit input, 32-bit output. 796*9880d681SAndroid Build Coastguard Workermulticlass SOP1_32_64 <sop1 op, string opName, list<dag> pattern> : SOP1_m < 797*9880d681SAndroid Build Coastguard Worker op, opName, (outs SReg_32:$sdst), (ins SSrc_64:$src0), 798*9880d681SAndroid Build Coastguard Worker opName#" $sdst, $src0", pattern 799*9880d681SAndroid Build Coastguard Worker>; 800*9880d681SAndroid Build Coastguard Worker 801*9880d681SAndroid Build Coastguard Worker// 32-bit input, 64-bit output. 802*9880d681SAndroid Build Coastguard Workermulticlass SOP1_64_32 <sop1 op, string opName, list<dag> pattern> : SOP1_m < 803*9880d681SAndroid Build Coastguard Worker op, opName, (outs SReg_64:$sdst), (ins SSrc_32:$src0), 804*9880d681SAndroid Build Coastguard Worker opName#" $sdst, $src0", pattern 805*9880d681SAndroid Build Coastguard Worker>; 806*9880d681SAndroid Build Coastguard Worker 807*9880d681SAndroid Build Coastguard Workerclass SOP2_Pseudo<string opName, dag outs, dag ins, list<dag> pattern> : 808*9880d681SAndroid Build Coastguard Worker SOP2<outs, ins, "", pattern>, 809*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.NONE> { 810*9880d681SAndroid Build Coastguard Worker let isPseudo = 1; 811*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1; 812*9880d681SAndroid Build Coastguard Worker let Size = 4; 813*9880d681SAndroid Build Coastguard Worker 814*9880d681SAndroid Build Coastguard Worker // Pseudo instructions have no encodings, but adding this field here allows 815*9880d681SAndroid Build Coastguard Worker // us to do: 816*9880d681SAndroid Build Coastguard Worker // let sdst = xxx in { 817*9880d681SAndroid Build Coastguard Worker // for multiclasses that include both real and pseudo instructions. 818*9880d681SAndroid Build Coastguard Worker field bits<7> sdst = 0; 819*9880d681SAndroid Build Coastguard Worker} 820*9880d681SAndroid Build Coastguard Worker 821*9880d681SAndroid Build Coastguard Workerclass SOP2_Real_si<sop2 op, string opName, dag outs, dag ins, string asm> : 822*9880d681SAndroid Build Coastguard Worker SOP2<outs, ins, asm, []>, 823*9880d681SAndroid Build Coastguard Worker SOP2e<op.SI>, 824*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.SI> { 825*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isSICI]; 826*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 827*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 828*9880d681SAndroid Build Coastguard Worker} 829*9880d681SAndroid Build Coastguard Worker 830*9880d681SAndroid Build Coastguard Workerclass SOP2_Real_vi<sop2 op, string opName, dag outs, dag ins, string asm> : 831*9880d681SAndroid Build Coastguard Worker SOP2<outs, ins, asm, []>, 832*9880d681SAndroid Build Coastguard Worker SOP2e<op.VI>, 833*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.VI> { 834*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 835*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 836*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 837*9880d681SAndroid Build Coastguard Worker} 838*9880d681SAndroid Build Coastguard Worker 839*9880d681SAndroid Build Coastguard Workermulticlass SOP2_m <sop2 op, string opName, dag outs, dag ins, string asm, 840*9880d681SAndroid Build Coastguard Worker list<dag> pattern> { 841*9880d681SAndroid Build Coastguard Worker 842*9880d681SAndroid Build Coastguard Worker def "" : SOP2_Pseudo <opName, outs, ins, pattern>; 843*9880d681SAndroid Build Coastguard Worker 844*9880d681SAndroid Build Coastguard Worker def _si : SOP2_Real_si <op, opName, outs, ins, asm>; 845*9880d681SAndroid Build Coastguard Worker 846*9880d681SAndroid Build Coastguard Worker def _vi : SOP2_Real_vi <op, opName, outs, ins, asm>; 847*9880d681SAndroid Build Coastguard Worker 848*9880d681SAndroid Build Coastguard Worker} 849*9880d681SAndroid Build Coastguard Worker 850*9880d681SAndroid Build Coastguard Workermulticlass SOP2_32 <sop2 op, string opName, list<dag> pattern> : SOP2_m < 851*9880d681SAndroid Build Coastguard Worker op, opName, (outs SReg_32:$sdst), (ins SSrc_32:$src0, SSrc_32:$src1), 852*9880d681SAndroid Build Coastguard Worker opName#" $sdst, $src0, $src1", pattern 853*9880d681SAndroid Build Coastguard Worker>; 854*9880d681SAndroid Build Coastguard Worker 855*9880d681SAndroid Build Coastguard Workermulticlass SOP2_64 <sop2 op, string opName, list<dag> pattern> : SOP2_m < 856*9880d681SAndroid Build Coastguard Worker op, opName, (outs SReg_64:$sdst), (ins SSrc_64:$src0, SSrc_64:$src1), 857*9880d681SAndroid Build Coastguard Worker opName#" $sdst, $src0, $src1", pattern 858*9880d681SAndroid Build Coastguard Worker>; 859*9880d681SAndroid Build Coastguard Worker 860*9880d681SAndroid Build Coastguard Workermulticlass SOP2_64_32 <sop2 op, string opName, list<dag> pattern> : SOP2_m < 861*9880d681SAndroid Build Coastguard Worker op, opName, (outs SReg_64:$sdst), (ins SSrc_64:$src0, SSrc_32:$src1), 862*9880d681SAndroid Build Coastguard Worker opName#" $sdst, $src0, $src1", pattern 863*9880d681SAndroid Build Coastguard Worker>; 864*9880d681SAndroid Build Coastguard Worker 865*9880d681SAndroid Build Coastguard Workermulticlass SOP2_64_32_32 <sop2 op, string opName, list<dag> pattern> : SOP2_m < 866*9880d681SAndroid Build Coastguard Worker op, opName, (outs SReg_64:$sdst), (ins SSrc_32:$src0, SSrc_32:$src1), 867*9880d681SAndroid Build Coastguard Worker opName#" $sdst, $src0, $src1", pattern 868*9880d681SAndroid Build Coastguard Worker>; 869*9880d681SAndroid Build Coastguard Worker 870*9880d681SAndroid Build Coastguard Workerclass SOPC_Base <bits<7> op, RegisterOperand rc0, RegisterOperand rc1, 871*9880d681SAndroid Build Coastguard Worker string opName, list<dag> pattern = []> : SOPC < 872*9880d681SAndroid Build Coastguard Worker op, (outs), (ins rc0:$src0, rc1:$src1), 873*9880d681SAndroid Build Coastguard Worker opName#" $src0, $src1", pattern > { 874*9880d681SAndroid Build Coastguard Worker let Defs = [SCC]; 875*9880d681SAndroid Build Coastguard Worker} 876*9880d681SAndroid Build Coastguard Workerclass SOPC_Helper <bits<7> op, RegisterOperand rc, ValueType vt, 877*9880d681SAndroid Build Coastguard Worker string opName, PatLeaf cond> : SOPC_Base < 878*9880d681SAndroid Build Coastguard Worker op, rc, rc, opName, 879*9880d681SAndroid Build Coastguard Worker [(set SCC, (si_setcc_uniform vt:$src0, vt:$src1, cond))] > { 880*9880d681SAndroid Build Coastguard Worker} 881*9880d681SAndroid Build Coastguard Worker 882*9880d681SAndroid Build Coastguard Workerclass SOPC_CMP_32<bits<7> op, string opName, PatLeaf cond = COND_NULL> 883*9880d681SAndroid Build Coastguard Worker : SOPC_Helper<op, SSrc_32, i32, opName, cond>; 884*9880d681SAndroid Build Coastguard Worker 885*9880d681SAndroid Build Coastguard Workerclass SOPC_32<bits<7> op, string opName, list<dag> pattern = []> 886*9880d681SAndroid Build Coastguard Worker : SOPC_Base<op, SSrc_32, SSrc_32, opName, pattern>; 887*9880d681SAndroid Build Coastguard Worker 888*9880d681SAndroid Build Coastguard Workerclass SOPC_64_32<bits<7> op, string opName, list<dag> pattern = []> 889*9880d681SAndroid Build Coastguard Worker : SOPC_Base<op, SSrc_64, SSrc_32, opName, pattern>; 890*9880d681SAndroid Build Coastguard Worker 891*9880d681SAndroid Build Coastguard Workerclass SOPK_Pseudo <string opName, dag outs, dag ins, list<dag> pattern> : 892*9880d681SAndroid Build Coastguard Worker SOPK <outs, ins, "", pattern>, 893*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.NONE> { 894*9880d681SAndroid Build Coastguard Worker let isPseudo = 1; 895*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1; 896*9880d681SAndroid Build Coastguard Worker} 897*9880d681SAndroid Build Coastguard Worker 898*9880d681SAndroid Build Coastguard Workerclass SOPK_Real_si <sopk op, string opName, dag outs, dag ins, string asm> : 899*9880d681SAndroid Build Coastguard Worker SOPK <outs, ins, asm, []>, 900*9880d681SAndroid Build Coastguard Worker SOPKe <op.SI>, 901*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.SI> { 902*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isSICI]; 903*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 904*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 905*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 0; 906*9880d681SAndroid Build Coastguard Worker} 907*9880d681SAndroid Build Coastguard Worker 908*9880d681SAndroid Build Coastguard Workerclass SOPK_Real_vi <sopk op, string opName, dag outs, dag ins, string asm> : 909*9880d681SAndroid Build Coastguard Worker SOPK <outs, ins, asm, []>, 910*9880d681SAndroid Build Coastguard Worker SOPKe <op.VI>, 911*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.VI> { 912*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 913*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 914*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 915*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 0; 916*9880d681SAndroid Build Coastguard Worker} 917*9880d681SAndroid Build Coastguard Worker 918*9880d681SAndroid Build Coastguard Workermulticlass SOPK_m <sopk op, string opName, dag outs, dag ins, string opAsm, 919*9880d681SAndroid Build Coastguard Worker string asm = opName#opAsm> { 920*9880d681SAndroid Build Coastguard Worker def "" : SOPK_Pseudo <opName, outs, ins, []>; 921*9880d681SAndroid Build Coastguard Worker 922*9880d681SAndroid Build Coastguard Worker def _si : SOPK_Real_si <op, opName, outs, ins, asm>; 923*9880d681SAndroid Build Coastguard Worker 924*9880d681SAndroid Build Coastguard Worker def _vi : SOPK_Real_vi <op, opName, outs, ins, asm>; 925*9880d681SAndroid Build Coastguard Worker 926*9880d681SAndroid Build Coastguard Worker} 927*9880d681SAndroid Build Coastguard Worker 928*9880d681SAndroid Build Coastguard Workermulticlass SOPK_32 <sopk op, string opName, list<dag> pattern> { 929*9880d681SAndroid Build Coastguard Worker def "" : SOPK_Pseudo <opName, (outs SReg_32:$sdst), (ins u16imm:$simm16), 930*9880d681SAndroid Build Coastguard Worker pattern>; 931*9880d681SAndroid Build Coastguard Worker 932*9880d681SAndroid Build Coastguard Worker def _si : SOPK_Real_si <op, opName, (outs SReg_32:$sdst), (ins u16imm:$simm16), 933*9880d681SAndroid Build Coastguard Worker opName#" $sdst, $simm16">; 934*9880d681SAndroid Build Coastguard Worker 935*9880d681SAndroid Build Coastguard Worker def _vi : SOPK_Real_vi <op, opName, (outs SReg_32:$sdst), (ins u16imm:$simm16), 936*9880d681SAndroid Build Coastguard Worker opName#" $sdst, $simm16">; 937*9880d681SAndroid Build Coastguard Worker} 938*9880d681SAndroid Build Coastguard Worker 939*9880d681SAndroid Build Coastguard Workermulticlass SOPK_SCC <sopk op, string opName, list<dag> pattern> { 940*9880d681SAndroid Build Coastguard Worker def "" : SOPK_Pseudo <opName, (outs), 941*9880d681SAndroid Build Coastguard Worker (ins SReg_32:$src0, u16imm:$src1), pattern> { 942*9880d681SAndroid Build Coastguard Worker let Defs = [SCC]; 943*9880d681SAndroid Build Coastguard Worker } 944*9880d681SAndroid Build Coastguard Worker 945*9880d681SAndroid Build Coastguard Worker 946*9880d681SAndroid Build Coastguard Worker def _si : SOPK_Real_si <op, opName, (outs), 947*9880d681SAndroid Build Coastguard Worker (ins SReg_32:$sdst, u16imm:$simm16), opName#" $sdst, $simm16"> { 948*9880d681SAndroid Build Coastguard Worker let Defs = [SCC]; 949*9880d681SAndroid Build Coastguard Worker } 950*9880d681SAndroid Build Coastguard Worker 951*9880d681SAndroid Build Coastguard Worker def _vi : SOPK_Real_vi <op, opName, (outs), 952*9880d681SAndroid Build Coastguard Worker (ins SReg_32:$sdst, u16imm:$simm16), opName#" $sdst, $simm16"> { 953*9880d681SAndroid Build Coastguard Worker let Defs = [SCC]; 954*9880d681SAndroid Build Coastguard Worker } 955*9880d681SAndroid Build Coastguard Worker} 956*9880d681SAndroid Build Coastguard Worker 957*9880d681SAndroid Build Coastguard Workermulticlass SOPK_32TIE <sopk op, string opName, list<dag> pattern> : SOPK_m < 958*9880d681SAndroid Build Coastguard Worker op, opName, (outs SReg_32:$sdst), (ins SReg_32:$src0, u16imm:$simm16), 959*9880d681SAndroid Build Coastguard Worker " $sdst, $simm16" 960*9880d681SAndroid Build Coastguard Worker>; 961*9880d681SAndroid Build Coastguard Worker 962*9880d681SAndroid Build Coastguard Workermulticlass SOPK_IMM32 <sopk op, string opName, dag outs, dag ins, 963*9880d681SAndroid Build Coastguard Worker string argAsm, string asm = opName#argAsm> { 964*9880d681SAndroid Build Coastguard Worker 965*9880d681SAndroid Build Coastguard Worker def "" : SOPK_Pseudo <opName, outs, ins, []>; 966*9880d681SAndroid Build Coastguard Worker 967*9880d681SAndroid Build Coastguard Worker def _si : SOPK <outs, ins, asm, []>, 968*9880d681SAndroid Build Coastguard Worker SOPK64e <op.SI>, 969*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.SI> { 970*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isSICI]; 971*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 972*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 973*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 0; 974*9880d681SAndroid Build Coastguard Worker } 975*9880d681SAndroid Build Coastguard Worker 976*9880d681SAndroid Build Coastguard Worker def _vi : SOPK <outs, ins, asm, []>, 977*9880d681SAndroid Build Coastguard Worker SOPK64e <op.VI>, 978*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.VI> { 979*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 980*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 981*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 982*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 0; 983*9880d681SAndroid Build Coastguard Worker } 984*9880d681SAndroid Build Coastguard Worker} 985*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 986*9880d681SAndroid Build Coastguard Worker// SMRD classes 987*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 988*9880d681SAndroid Build Coastguard Worker 989*9880d681SAndroid Build Coastguard Workerclass SMRD_Pseudo <string opName, dag outs, dag ins, list<dag> pattern> : 990*9880d681SAndroid Build Coastguard Worker SMRD <outs, ins, "", pattern>, 991*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.NONE> { 992*9880d681SAndroid Build Coastguard Worker let isPseudo = 1; 993*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1; 994*9880d681SAndroid Build Coastguard Worker} 995*9880d681SAndroid Build Coastguard Worker 996*9880d681SAndroid Build Coastguard Workerclass SMRD_IMM_Real_si <bits<5> op, string opName, dag outs, dag ins, 997*9880d681SAndroid Build Coastguard Worker string asm> : 998*9880d681SAndroid Build Coastguard Worker SMRD <outs, ins, asm, []>, 999*9880d681SAndroid Build Coastguard Worker SMRD_IMMe <op>, 1000*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.SI> { 1001*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isSICI]; 1002*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 1003*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 1004*9880d681SAndroid Build Coastguard Worker} 1005*9880d681SAndroid Build Coastguard Worker 1006*9880d681SAndroid Build Coastguard Workerclass SMRD_SOFF_Real_si <bits<5> op, string opName, dag outs, dag ins, 1007*9880d681SAndroid Build Coastguard Worker string asm> : 1008*9880d681SAndroid Build Coastguard Worker SMRD <outs, ins, asm, []>, 1009*9880d681SAndroid Build Coastguard Worker SMRD_SOFFe <op>, 1010*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.SI> { 1011*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isSICI]; 1012*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 1013*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 1014*9880d681SAndroid Build Coastguard Worker} 1015*9880d681SAndroid Build Coastguard Worker 1016*9880d681SAndroid Build Coastguard Worker 1017*9880d681SAndroid Build Coastguard Workerclass SMRD_IMM_Real_vi <bits<8> op, string opName, dag outs, dag ins, 1018*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pattern = []> : 1019*9880d681SAndroid Build Coastguard Worker SMRD <outs, ins, asm, pattern>, 1020*9880d681SAndroid Build Coastguard Worker SMEM_IMMe_vi <op>, 1021*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.VI> { 1022*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 1023*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 1024*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 1025*9880d681SAndroid Build Coastguard Worker} 1026*9880d681SAndroid Build Coastguard Worker 1027*9880d681SAndroid Build Coastguard Workerclass SMRD_SOFF_Real_vi <bits<8> op, string opName, dag outs, dag ins, 1028*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pattern = []> : 1029*9880d681SAndroid Build Coastguard Worker SMRD <outs, ins, asm, pattern>, 1030*9880d681SAndroid Build Coastguard Worker SMEM_SOFFe_vi <op>, 1031*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.VI> { 1032*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 1033*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 1034*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 1035*9880d681SAndroid Build Coastguard Worker} 1036*9880d681SAndroid Build Coastguard Worker 1037*9880d681SAndroid Build Coastguard Worker 1038*9880d681SAndroid Build Coastguard Workermulticlass SMRD_IMM_m <smrd op, string opName, dag outs, dag ins, 1039*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pattern> { 1040*9880d681SAndroid Build Coastguard Worker 1041*9880d681SAndroid Build Coastguard Worker def "" : SMRD_Pseudo <opName, outs, ins, pattern>; 1042*9880d681SAndroid Build Coastguard Worker 1043*9880d681SAndroid Build Coastguard Worker def _si : SMRD_IMM_Real_si <op.SI, opName, outs, ins, asm>; 1044*9880d681SAndroid Build Coastguard Worker 1045*9880d681SAndroid Build Coastguard Worker // glc is only applicable to scalar stores, which are not yet 1046*9880d681SAndroid Build Coastguard Worker // implemented. 1047*9880d681SAndroid Build Coastguard Worker let glc = 0 in { 1048*9880d681SAndroid Build Coastguard Worker def _vi : SMRD_IMM_Real_vi <op.VI, opName, outs, ins, asm>; 1049*9880d681SAndroid Build Coastguard Worker } 1050*9880d681SAndroid Build Coastguard Worker} 1051*9880d681SAndroid Build Coastguard Worker 1052*9880d681SAndroid Build Coastguard Workermulticlass SMRD_SOFF_m <smrd op, string opName, dag outs, dag ins, 1053*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pattern> { 1054*9880d681SAndroid Build Coastguard Worker 1055*9880d681SAndroid Build Coastguard Worker def "" : SMRD_Pseudo <opName, outs, ins, pattern>; 1056*9880d681SAndroid Build Coastguard Worker 1057*9880d681SAndroid Build Coastguard Worker def _si : SMRD_SOFF_Real_si <op.SI, opName, outs, ins, asm>; 1058*9880d681SAndroid Build Coastguard Worker 1059*9880d681SAndroid Build Coastguard Worker // glc is only applicable to scalar stores, which are not yet 1060*9880d681SAndroid Build Coastguard Worker // implemented. 1061*9880d681SAndroid Build Coastguard Worker let glc = 0 in { 1062*9880d681SAndroid Build Coastguard Worker def _vi : SMRD_SOFF_Real_vi <op.VI, opName, outs, ins, asm>; 1063*9880d681SAndroid Build Coastguard Worker } 1064*9880d681SAndroid Build Coastguard Worker} 1065*9880d681SAndroid Build Coastguard Worker 1066*9880d681SAndroid Build Coastguard Workermulticlass SMRD_Special <smrd op, string opName, dag outs, 1067*9880d681SAndroid Build Coastguard Worker int sdst_ = ?, 1068*9880d681SAndroid Build Coastguard Worker string opStr = "", 1069*9880d681SAndroid Build Coastguard Worker list<dag> pattern = []> { 1070*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 1 in { 1071*9880d681SAndroid Build Coastguard Worker def "" : SMRD_Pseudo <opName, outs, (ins), pattern>; 1072*9880d681SAndroid Build Coastguard Worker 1073*9880d681SAndroid Build Coastguard Worker let sbase = 0, soff = 0, sdst = sdst_ in { 1074*9880d681SAndroid Build Coastguard Worker def _si : SMRD_SOFF_Real_si <op.SI, opName, outs, (ins), opName#opStr>; 1075*9880d681SAndroid Build Coastguard Worker 1076*9880d681SAndroid Build Coastguard Worker let glc = 0 in { 1077*9880d681SAndroid Build Coastguard Worker def _vi : SMRD_SOFF_Real_vi <op.VI, opName, outs, (ins), opName#opStr>; 1078*9880d681SAndroid Build Coastguard Worker } 1079*9880d681SAndroid Build Coastguard Worker } 1080*9880d681SAndroid Build Coastguard Worker } 1081*9880d681SAndroid Build Coastguard Worker} 1082*9880d681SAndroid Build Coastguard Worker 1083*9880d681SAndroid Build Coastguard Workermulticlass SMRD_Inval <smrd op, string opName, 1084*9880d681SAndroid Build Coastguard Worker SDPatternOperator node> { 1085*9880d681SAndroid Build Coastguard Worker let mayStore = 1 in { 1086*9880d681SAndroid Build Coastguard Worker defm : SMRD_Special<op, opName, (outs), 0, "", [(node)]>; 1087*9880d681SAndroid Build Coastguard Worker } 1088*9880d681SAndroid Build Coastguard Worker} 1089*9880d681SAndroid Build Coastguard Worker 1090*9880d681SAndroid Build Coastguard Workerclass SMEM_Inval <bits<8> op, string opName, SDPatternOperator node> : 1091*9880d681SAndroid Build Coastguard Worker SMRD_SOFF_Real_vi<op, opName, (outs), (ins), opName, [(node)]> { 1092*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 1; 1093*9880d681SAndroid Build Coastguard Worker let mayStore = 1; 1094*9880d681SAndroid Build Coastguard Worker let sbase = 0; 1095*9880d681SAndroid Build Coastguard Worker let sdst = 0; 1096*9880d681SAndroid Build Coastguard Worker let glc = 0; 1097*9880d681SAndroid Build Coastguard Worker let soff = 0; 1098*9880d681SAndroid Build Coastguard Worker} 1099*9880d681SAndroid Build Coastguard Worker 1100*9880d681SAndroid Build Coastguard Workerclass SMEM_Ret <bits<8> op, string opName, SDPatternOperator node> : 1101*9880d681SAndroid Build Coastguard Worker SMRD_SOFF_Real_vi<op, opName, (outs SReg_64:$sdst), (ins), 1102*9880d681SAndroid Build Coastguard Worker opName#" $sdst", [(set i64:$sdst, (node))]> { 1103*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 1; 1104*9880d681SAndroid Build Coastguard Worker let mayStore = ?; 1105*9880d681SAndroid Build Coastguard Worker let mayLoad = ?; 1106*9880d681SAndroid Build Coastguard Worker let sbase = 0; 1107*9880d681SAndroid Build Coastguard Worker let glc = 0; 1108*9880d681SAndroid Build Coastguard Worker let soff = 0; 1109*9880d681SAndroid Build Coastguard Worker} 1110*9880d681SAndroid Build Coastguard Worker 1111*9880d681SAndroid Build Coastguard Workermulticlass SMRD_Helper <smrd op, string opName, RegisterClass baseClass, 1112*9880d681SAndroid Build Coastguard Worker RegisterClass dstClass> { 1113*9880d681SAndroid Build Coastguard Worker defm _IMM : SMRD_IMM_m < 1114*9880d681SAndroid Build Coastguard Worker op, opName#"_IMM", (outs dstClass:$sdst), 1115*9880d681SAndroid Build Coastguard Worker (ins baseClass:$sbase, smrd_offset:$offset), 1116*9880d681SAndroid Build Coastguard Worker opName#" $sdst, $sbase, $offset", [] 1117*9880d681SAndroid Build Coastguard Worker >; 1118*9880d681SAndroid Build Coastguard Worker 1119*9880d681SAndroid Build Coastguard Worker def _IMM_ci : SMRD < 1120*9880d681SAndroid Build Coastguard Worker (outs dstClass:$sdst), (ins baseClass:$sbase, smrd_literal_offset:$offset), 1121*9880d681SAndroid Build Coastguard Worker opName#" $sdst, $sbase, $offset", []>, SMRD_IMMe_ci <op.SI> { 1122*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isCIOnly]; 1123*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "CI"; 1124*9880d681SAndroid Build Coastguard Worker } 1125*9880d681SAndroid Build Coastguard Worker 1126*9880d681SAndroid Build Coastguard Worker defm _SGPR : SMRD_SOFF_m < 1127*9880d681SAndroid Build Coastguard Worker op, opName#"_SGPR", (outs dstClass:$sdst), 1128*9880d681SAndroid Build Coastguard Worker (ins baseClass:$sbase, SReg_32:$soff), 1129*9880d681SAndroid Build Coastguard Worker opName#" $sdst, $sbase, $soff", [] 1130*9880d681SAndroid Build Coastguard Worker >; 1131*9880d681SAndroid Build Coastguard Worker} 1132*9880d681SAndroid Build Coastguard Worker 1133*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1134*9880d681SAndroid Build Coastguard Worker// Vector ALU classes 1135*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1136*9880d681SAndroid Build Coastguard Worker 1137*9880d681SAndroid Build Coastguard Workerclass getNumSrcArgs<ValueType Src0, ValueType Src1, ValueType Src2> { 1138*9880d681SAndroid Build Coastguard Worker int ret = 1139*9880d681SAndroid Build Coastguard Worker !if (!eq(Src0.Value, untyped.Value), 0, 1140*9880d681SAndroid Build Coastguard Worker !if (!eq(Src1.Value, untyped.Value), 1, // VOP1 1141*9880d681SAndroid Build Coastguard Worker !if (!eq(Src2.Value, untyped.Value), 2, // VOP2 1142*9880d681SAndroid Build Coastguard Worker 3))); // VOP3 1143*9880d681SAndroid Build Coastguard Worker} 1144*9880d681SAndroid Build Coastguard Worker 1145*9880d681SAndroid Build Coastguard Worker// Returns the register class to use for the destination of VOP[123C] 1146*9880d681SAndroid Build Coastguard Worker// instructions for the given VT. 1147*9880d681SAndroid Build Coastguard Workerclass getVALUDstForVT<ValueType VT> { 1148*9880d681SAndroid Build Coastguard Worker RegisterOperand ret = !if(!eq(VT.Size, 32), VOPDstOperand<VGPR_32>, 1149*9880d681SAndroid Build Coastguard Worker !if(!eq(VT.Size, 64), VOPDstOperand<VReg_64>, 1150*9880d681SAndroid Build Coastguard Worker !if(!eq(VT.Size, 16), VOPDstOperand<VGPR_32>, 1151*9880d681SAndroid Build Coastguard Worker VOPDstOperand<SReg_64>))); // else VT == i1 1152*9880d681SAndroid Build Coastguard Worker} 1153*9880d681SAndroid Build Coastguard Worker 1154*9880d681SAndroid Build Coastguard Worker// Returns the register class to use for source 0 of VOP[12C] 1155*9880d681SAndroid Build Coastguard Worker// instructions for the given VT. 1156*9880d681SAndroid Build Coastguard Workerclass getVOPSrc0ForVT<ValueType VT> { 1157*9880d681SAndroid Build Coastguard Worker RegisterOperand ret = !if(!eq(VT.Size, 64), VSrc_64, VSrc_32); 1158*9880d681SAndroid Build Coastguard Worker} 1159*9880d681SAndroid Build Coastguard Worker 1160*9880d681SAndroid Build Coastguard Worker// Returns the vreg register class to use for source operand given VT 1161*9880d681SAndroid Build Coastguard Workerclass getVregSrcForVT<ValueType VT> { 1162*9880d681SAndroid Build Coastguard Worker RegisterClass ret = !if(!eq(VT.Size, 64), VReg_64, VGPR_32); 1163*9880d681SAndroid Build Coastguard Worker} 1164*9880d681SAndroid Build Coastguard Worker 1165*9880d681SAndroid Build Coastguard Worker 1166*9880d681SAndroid Build Coastguard Worker// Returns the register class to use for sources of VOP3 instructions for the 1167*9880d681SAndroid Build Coastguard Worker// given VT. 1168*9880d681SAndroid Build Coastguard Workerclass getVOP3SrcForVT<ValueType VT> { 1169*9880d681SAndroid Build Coastguard Worker RegisterOperand ret = 1170*9880d681SAndroid Build Coastguard Worker !if(!eq(VT.Size, 64), 1171*9880d681SAndroid Build Coastguard Worker VCSrc_64, 1172*9880d681SAndroid Build Coastguard Worker !if(!eq(VT.Value, i1.Value), 1173*9880d681SAndroid Build Coastguard Worker SCSrc_64, 1174*9880d681SAndroid Build Coastguard Worker VCSrc_32 1175*9880d681SAndroid Build Coastguard Worker ) 1176*9880d681SAndroid Build Coastguard Worker ); 1177*9880d681SAndroid Build Coastguard Worker} 1178*9880d681SAndroid Build Coastguard Worker 1179*9880d681SAndroid Build Coastguard Worker// Returns 1 if the source arguments have modifiers, 0 if they do not. 1180*9880d681SAndroid Build Coastguard Worker// XXX - do f16 instructions? 1181*9880d681SAndroid Build Coastguard Workerclass hasModifiers<ValueType SrcVT> { 1182*9880d681SAndroid Build Coastguard Worker bit ret = 1183*9880d681SAndroid Build Coastguard Worker !if(!eq(SrcVT.Value, f32.Value), 1, 1184*9880d681SAndroid Build Coastguard Worker !if(!eq(SrcVT.Value, f64.Value), 1, 1185*9880d681SAndroid Build Coastguard Worker 0)); 1186*9880d681SAndroid Build Coastguard Worker} 1187*9880d681SAndroid Build Coastguard Worker 1188*9880d681SAndroid Build Coastguard Worker// Returns the input arguments for VOP[12C] instructions for the given SrcVT. 1189*9880d681SAndroid Build Coastguard Workerclass getIns32 <RegisterOperand Src0RC, RegisterClass Src1RC, int NumSrcArgs> { 1190*9880d681SAndroid Build Coastguard Worker dag ret = !if(!eq(NumSrcArgs, 1), (ins Src0RC:$src0), // VOP1 1191*9880d681SAndroid Build Coastguard Worker !if(!eq(NumSrcArgs, 2), (ins Src0RC:$src0, Src1RC:$src1), // VOP2 1192*9880d681SAndroid Build Coastguard Worker (ins))); 1193*9880d681SAndroid Build Coastguard Worker} 1194*9880d681SAndroid Build Coastguard Worker 1195*9880d681SAndroid Build Coastguard Worker// Returns the input arguments for VOP3 instructions for the given SrcVT. 1196*9880d681SAndroid Build Coastguard Workerclass getIns64 <RegisterOperand Src0RC, RegisterOperand Src1RC, 1197*9880d681SAndroid Build Coastguard Worker RegisterOperand Src2RC, int NumSrcArgs, 1198*9880d681SAndroid Build Coastguard Worker bit HasModifiers> { 1199*9880d681SAndroid Build Coastguard Worker 1200*9880d681SAndroid Build Coastguard Worker dag ret = 1201*9880d681SAndroid Build Coastguard Worker !if (!eq(NumSrcArgs, 0), 1202*9880d681SAndroid Build Coastguard Worker // VOP1 without input operands (V_NOP, V_CLREXCP) 1203*9880d681SAndroid Build Coastguard Worker (ins), 1204*9880d681SAndroid Build Coastguard Worker /* else */ 1205*9880d681SAndroid Build Coastguard Worker !if (!eq(NumSrcArgs, 1), 1206*9880d681SAndroid Build Coastguard Worker !if (!eq(HasModifiers, 1), 1207*9880d681SAndroid Build Coastguard Worker // VOP1 with modifiers 1208*9880d681SAndroid Build Coastguard Worker (ins FPInputMods:$src0_modifiers, Src0RC:$src0, 1209*9880d681SAndroid Build Coastguard Worker clampmod:$clamp, omod:$omod) 1210*9880d681SAndroid Build Coastguard Worker /* else */, 1211*9880d681SAndroid Build Coastguard Worker // VOP1 without modifiers 1212*9880d681SAndroid Build Coastguard Worker (ins Src0RC:$src0) 1213*9880d681SAndroid Build Coastguard Worker /* endif */ ), 1214*9880d681SAndroid Build Coastguard Worker !if (!eq(NumSrcArgs, 2), 1215*9880d681SAndroid Build Coastguard Worker !if (!eq(HasModifiers, 1), 1216*9880d681SAndroid Build Coastguard Worker // VOP 2 with modifiers 1217*9880d681SAndroid Build Coastguard Worker (ins FPInputMods:$src0_modifiers, Src0RC:$src0, 1218*9880d681SAndroid Build Coastguard Worker FPInputMods:$src1_modifiers, Src1RC:$src1, 1219*9880d681SAndroid Build Coastguard Worker clampmod:$clamp, omod:$omod) 1220*9880d681SAndroid Build Coastguard Worker /* else */, 1221*9880d681SAndroid Build Coastguard Worker // VOP2 without modifiers 1222*9880d681SAndroid Build Coastguard Worker (ins Src0RC:$src0, Src1RC:$src1) 1223*9880d681SAndroid Build Coastguard Worker /* endif */ ) 1224*9880d681SAndroid Build Coastguard Worker /* NumSrcArgs == 3 */, 1225*9880d681SAndroid Build Coastguard Worker !if (!eq(HasModifiers, 1), 1226*9880d681SAndroid Build Coastguard Worker // VOP3 with modifiers 1227*9880d681SAndroid Build Coastguard Worker (ins FPInputMods:$src0_modifiers, Src0RC:$src0, 1228*9880d681SAndroid Build Coastguard Worker FPInputMods:$src1_modifiers, Src1RC:$src1, 1229*9880d681SAndroid Build Coastguard Worker FPInputMods:$src2_modifiers, Src2RC:$src2, 1230*9880d681SAndroid Build Coastguard Worker clampmod:$clamp, omod:$omod) 1231*9880d681SAndroid Build Coastguard Worker /* else */, 1232*9880d681SAndroid Build Coastguard Worker // VOP3 without modifiers 1233*9880d681SAndroid Build Coastguard Worker (ins Src0RC:$src0, Src1RC:$src1, Src2RC:$src2) 1234*9880d681SAndroid Build Coastguard Worker /* endif */ )))); 1235*9880d681SAndroid Build Coastguard Worker} 1236*9880d681SAndroid Build Coastguard Worker 1237*9880d681SAndroid Build Coastguard Workerclass getInsDPP <RegisterClass Src0RC, RegisterClass Src1RC, int NumSrcArgs, 1238*9880d681SAndroid Build Coastguard Worker bit HasModifiers> { 1239*9880d681SAndroid Build Coastguard Worker 1240*9880d681SAndroid Build Coastguard Worker dag ret = !if (!eq(NumSrcArgs, 0), 1241*9880d681SAndroid Build Coastguard Worker // VOP1 without input operands (V_NOP) 1242*9880d681SAndroid Build Coastguard Worker (ins dpp_ctrl:$dpp_ctrl, row_mask:$row_mask, 1243*9880d681SAndroid Build Coastguard Worker bank_mask:$bank_mask, bound_ctrl:$bound_ctrl), 1244*9880d681SAndroid Build Coastguard Worker !if (!eq(NumSrcArgs, 1), 1245*9880d681SAndroid Build Coastguard Worker !if (!eq(HasModifiers, 1), 1246*9880d681SAndroid Build Coastguard Worker // VOP1_DPP with modifiers 1247*9880d681SAndroid Build Coastguard Worker (ins FPInputMods:$src0_modifiers, Src0RC:$src0, 1248*9880d681SAndroid Build Coastguard Worker dpp_ctrl:$dpp_ctrl, row_mask:$row_mask, 1249*9880d681SAndroid Build Coastguard Worker bank_mask:$bank_mask, bound_ctrl:$bound_ctrl) 1250*9880d681SAndroid Build Coastguard Worker /* else */, 1251*9880d681SAndroid Build Coastguard Worker // VOP1_DPP without modifiers 1252*9880d681SAndroid Build Coastguard Worker (ins Src0RC:$src0, dpp_ctrl:$dpp_ctrl, row_mask:$row_mask, 1253*9880d681SAndroid Build Coastguard Worker bank_mask:$bank_mask, bound_ctrl:$bound_ctrl) 1254*9880d681SAndroid Build Coastguard Worker /* endif */) 1255*9880d681SAndroid Build Coastguard Worker /* NumSrcArgs == 2 */, 1256*9880d681SAndroid Build Coastguard Worker !if (!eq(HasModifiers, 1), 1257*9880d681SAndroid Build Coastguard Worker // VOP2_DPP with modifiers 1258*9880d681SAndroid Build Coastguard Worker (ins FPInputMods:$src0_modifiers, Src0RC:$src0, 1259*9880d681SAndroid Build Coastguard Worker FPInputMods:$src1_modifiers, Src1RC:$src1, 1260*9880d681SAndroid Build Coastguard Worker dpp_ctrl:$dpp_ctrl, row_mask:$row_mask, 1261*9880d681SAndroid Build Coastguard Worker bank_mask:$bank_mask, bound_ctrl:$bound_ctrl) 1262*9880d681SAndroid Build Coastguard Worker /* else */, 1263*9880d681SAndroid Build Coastguard Worker // VOP2_DPP without modifiers 1264*9880d681SAndroid Build Coastguard Worker (ins Src0RC:$src0, Src1RC:$src1, dpp_ctrl:$dpp_ctrl, 1265*9880d681SAndroid Build Coastguard Worker row_mask:$row_mask, bank_mask:$bank_mask, 1266*9880d681SAndroid Build Coastguard Worker bound_ctrl:$bound_ctrl) 1267*9880d681SAndroid Build Coastguard Worker /* endif */))); 1268*9880d681SAndroid Build Coastguard Worker} 1269*9880d681SAndroid Build Coastguard Worker 1270*9880d681SAndroid Build Coastguard Workerclass getInsSDWA <RegisterClass Src0RC, RegisterClass Src1RC, int NumSrcArgs, 1271*9880d681SAndroid Build Coastguard Worker bit HasFloatModifiers, ValueType DstVT> { 1272*9880d681SAndroid Build Coastguard Worker 1273*9880d681SAndroid Build Coastguard Worker dag ret = !if(!eq(NumSrcArgs, 0), 1274*9880d681SAndroid Build Coastguard Worker // VOP1 without input operands (V_NOP) 1275*9880d681SAndroid Build Coastguard Worker (ins), 1276*9880d681SAndroid Build Coastguard Worker !if(!eq(NumSrcArgs, 1), 1277*9880d681SAndroid Build Coastguard Worker !if(HasFloatModifiers, 1278*9880d681SAndroid Build Coastguard Worker // VOP1_SDWA with float modifiers 1279*9880d681SAndroid Build Coastguard Worker (ins FPInputMods:$src0_fmodifiers, Src0RC:$src0, 1280*9880d681SAndroid Build Coastguard Worker clampmod:$clamp, dst_sel:$dst_sel, dst_unused:$dst_unused, 1281*9880d681SAndroid Build Coastguard Worker src0_sel:$src0_sel) 1282*9880d681SAndroid Build Coastguard Worker /* else */, 1283*9880d681SAndroid Build Coastguard Worker // VOP1_SDWA with sext modifier 1284*9880d681SAndroid Build Coastguard Worker (ins IntInputMods:$src0_imodifiers, Src0RC:$src0, 1285*9880d681SAndroid Build Coastguard Worker clampmod:$clamp, dst_sel:$dst_sel, dst_unused:$dst_unused, 1286*9880d681SAndroid Build Coastguard Worker src0_sel:$src0_sel) 1287*9880d681SAndroid Build Coastguard Worker /* endif */) 1288*9880d681SAndroid Build Coastguard Worker /* NumSrcArgs == 2 */, 1289*9880d681SAndroid Build Coastguard Worker !if(HasFloatModifiers, 1290*9880d681SAndroid Build Coastguard Worker !if(!eq(DstVT.Size, 1), 1291*9880d681SAndroid Build Coastguard Worker // VOPC_SDWA with float modifiers 1292*9880d681SAndroid Build Coastguard Worker (ins FPInputMods:$src0_fmodifiers, Src0RC:$src0, 1293*9880d681SAndroid Build Coastguard Worker FPInputMods:$src1_fmodifiers, Src1RC:$src1, 1294*9880d681SAndroid Build Coastguard Worker clampmod:$clamp, src0_sel:$src0_sel, src1_sel:$src1_sel), 1295*9880d681SAndroid Build Coastguard Worker // VOP2_SDWA or VOPC_SDWA with float modifiers 1296*9880d681SAndroid Build Coastguard Worker (ins FPInputMods:$src0_fmodifiers, Src0RC:$src0, 1297*9880d681SAndroid Build Coastguard Worker FPInputMods:$src1_fmodifiers, Src1RC:$src1, 1298*9880d681SAndroid Build Coastguard Worker clampmod:$clamp, dst_sel:$dst_sel, dst_unused:$dst_unused, 1299*9880d681SAndroid Build Coastguard Worker src0_sel:$src0_sel, src1_sel:$src1_sel) 1300*9880d681SAndroid Build Coastguard Worker ), 1301*9880d681SAndroid Build Coastguard Worker /* else */ 1302*9880d681SAndroid Build Coastguard Worker !if(!eq(DstVT.Size, 1), 1303*9880d681SAndroid Build Coastguard Worker // VOPC_SDWA with sext modifiers 1304*9880d681SAndroid Build Coastguard Worker (ins IntInputMods:$src0_imodifiers, Src0RC:$src0, 1305*9880d681SAndroid Build Coastguard Worker IntInputMods:$src1_imodifiers, Src1RC:$src1, 1306*9880d681SAndroid Build Coastguard Worker clampmod:$clamp, src0_sel:$src0_sel, src1_sel:$src1_sel), 1307*9880d681SAndroid Build Coastguard Worker // VOP2_SDWA or VOPC_SDWA with sext modifier 1308*9880d681SAndroid Build Coastguard Worker (ins IntInputMods:$src0_imodifiers, Src0RC:$src0, 1309*9880d681SAndroid Build Coastguard Worker IntInputMods:$src1_imodifiers, Src1RC:$src1, 1310*9880d681SAndroid Build Coastguard Worker clampmod:$clamp, dst_sel:$dst_sel, dst_unused:$dst_unused, 1311*9880d681SAndroid Build Coastguard Worker src0_sel:$src0_sel, src1_sel:$src1_sel) 1312*9880d681SAndroid Build Coastguard Worker ) 1313*9880d681SAndroid Build Coastguard Worker /* endif */))); 1314*9880d681SAndroid Build Coastguard Worker} 1315*9880d681SAndroid Build Coastguard Worker 1316*9880d681SAndroid Build Coastguard Worker// Outs for DPP and SDWA 1317*9880d681SAndroid Build Coastguard Workerclass getOutsExt <bit HasDst, ValueType DstVT, RegisterOperand DstRCDPP> { 1318*9880d681SAndroid Build Coastguard Worker dag ret = !if(HasDst, 1319*9880d681SAndroid Build Coastguard Worker !if(!eq(DstVT.Size, 1), 1320*9880d681SAndroid Build Coastguard Worker (outs), // no dst for VOPC, we use "vcc"-token as dst in SDWA VOPC instructions 1321*9880d681SAndroid Build Coastguard Worker (outs DstRCDPP:$vdst)), 1322*9880d681SAndroid Build Coastguard Worker (outs)); // V_NOP 1323*9880d681SAndroid Build Coastguard Worker} 1324*9880d681SAndroid Build Coastguard Worker 1325*9880d681SAndroid Build Coastguard Worker// Returns the assembly string for the inputs and outputs of a VOP[12C] 1326*9880d681SAndroid Build Coastguard Worker// instruction. This does not add the _e32 suffix, so it can be reused 1327*9880d681SAndroid Build Coastguard Worker// by getAsm64. 1328*9880d681SAndroid Build Coastguard Workerclass getAsm32 <bit HasDst, int NumSrcArgs, ValueType DstVT = i32> { 1329*9880d681SAndroid Build Coastguard Worker string dst = !if(!eq(DstVT.Size, 1), "$sdst", "$vdst"); // use $sdst for VOPC 1330*9880d681SAndroid Build Coastguard Worker string src0 = ", $src0"; 1331*9880d681SAndroid Build Coastguard Worker string src1 = ", $src1"; 1332*9880d681SAndroid Build Coastguard Worker string src2 = ", $src2"; 1333*9880d681SAndroid Build Coastguard Worker string ret = !if(HasDst, dst, "") # 1334*9880d681SAndroid Build Coastguard Worker !if(!eq(NumSrcArgs, 1), src0, "") # 1335*9880d681SAndroid Build Coastguard Worker !if(!eq(NumSrcArgs, 2), src0#src1, "") # 1336*9880d681SAndroid Build Coastguard Worker !if(!eq(NumSrcArgs, 3), src0#src1#src2, ""); 1337*9880d681SAndroid Build Coastguard Worker} 1338*9880d681SAndroid Build Coastguard Worker 1339*9880d681SAndroid Build Coastguard Worker// Returns the assembly string for the inputs and outputs of a VOP3 1340*9880d681SAndroid Build Coastguard Worker// instruction. 1341*9880d681SAndroid Build Coastguard Workerclass getAsm64 <bit HasDst, int NumSrcArgs, bit HasModifiers, ValueType DstVT = i32> { 1342*9880d681SAndroid Build Coastguard Worker string dst = !if(!eq(DstVT.Size, 1), "$sdst", "$vdst"); // use $sdst for VOPC 1343*9880d681SAndroid Build Coastguard Worker string src0 = !if(!eq(NumSrcArgs, 1), "$src0_modifiers", "$src0_modifiers,"); 1344*9880d681SAndroid Build Coastguard Worker string src1 = !if(!eq(NumSrcArgs, 1), "", 1345*9880d681SAndroid Build Coastguard Worker !if(!eq(NumSrcArgs, 2), " $src1_modifiers", 1346*9880d681SAndroid Build Coastguard Worker " $src1_modifiers,")); 1347*9880d681SAndroid Build Coastguard Worker string src2 = !if(!eq(NumSrcArgs, 3), " $src2_modifiers", ""); 1348*9880d681SAndroid Build Coastguard Worker string ret = 1349*9880d681SAndroid Build Coastguard Worker !if(!eq(HasModifiers, 0), 1350*9880d681SAndroid Build Coastguard Worker getAsm32<HasDst, NumSrcArgs, DstVT>.ret, 1351*9880d681SAndroid Build Coastguard Worker dst#", "#src0#src1#src2#"$clamp"#"$omod"); 1352*9880d681SAndroid Build Coastguard Worker} 1353*9880d681SAndroid Build Coastguard Worker 1354*9880d681SAndroid Build Coastguard Workerclass getAsmDPP <bit HasDst, int NumSrcArgs, bit HasModifiers, ValueType DstVT = i32> { 1355*9880d681SAndroid Build Coastguard Worker string dst = !if(HasDst, 1356*9880d681SAndroid Build Coastguard Worker !if(!eq(DstVT.Size, 1), 1357*9880d681SAndroid Build Coastguard Worker "$sdst", 1358*9880d681SAndroid Build Coastguard Worker "$vdst"), 1359*9880d681SAndroid Build Coastguard Worker ""); // use $sdst for VOPC 1360*9880d681SAndroid Build Coastguard Worker string src0 = !if(!eq(NumSrcArgs, 1), "$src0_modifiers", "$src0_modifiers,"); 1361*9880d681SAndroid Build Coastguard Worker string src1 = !if(!eq(NumSrcArgs, 1), "", 1362*9880d681SAndroid Build Coastguard Worker !if(!eq(NumSrcArgs, 2), " $src1_modifiers", 1363*9880d681SAndroid Build Coastguard Worker " $src1_modifiers,")); 1364*9880d681SAndroid Build Coastguard Worker string args = !if(!eq(HasModifiers, 0), 1365*9880d681SAndroid Build Coastguard Worker getAsm32<0, NumSrcArgs, DstVT>.ret, 1366*9880d681SAndroid Build Coastguard Worker ", "#src0#src1); 1367*9880d681SAndroid Build Coastguard Worker string ret = dst#args#" $dpp_ctrl$row_mask$bank_mask$bound_ctrl"; 1368*9880d681SAndroid Build Coastguard Worker} 1369*9880d681SAndroid Build Coastguard Worker 1370*9880d681SAndroid Build Coastguard Workerclass getAsmSDWA <bit HasDst, int NumSrcArgs, bit HasFloatModifiers, 1371*9880d681SAndroid Build Coastguard Worker ValueType DstVT = i32> { 1372*9880d681SAndroid Build Coastguard Worker string dst = !if(HasDst, 1373*9880d681SAndroid Build Coastguard Worker !if(!eq(DstVT.Size, 1), 1374*9880d681SAndroid Build Coastguard Worker " vcc", // use vcc token as dst for VOPC instructioins 1375*9880d681SAndroid Build Coastguard Worker "$vdst"), 1376*9880d681SAndroid Build Coastguard Worker ""); 1377*9880d681SAndroid Build Coastguard Worker string src0 = !if(HasFloatModifiers, "$src0_fmodifiers", "$src0_imodifiers"); 1378*9880d681SAndroid Build Coastguard Worker string src1 = !if(HasFloatModifiers, "$src1_fmodifiers", "$src1_imodifiers"); 1379*9880d681SAndroid Build Coastguard Worker string args = !if(!eq(NumSrcArgs, 0), 1380*9880d681SAndroid Build Coastguard Worker "", 1381*9880d681SAndroid Build Coastguard Worker !if(!eq(NumSrcArgs, 1), 1382*9880d681SAndroid Build Coastguard Worker ", "#src0#"$clamp", 1383*9880d681SAndroid Build Coastguard Worker ", "#src0#", "#src1#"$clamp" 1384*9880d681SAndroid Build Coastguard Worker ) 1385*9880d681SAndroid Build Coastguard Worker ); 1386*9880d681SAndroid Build Coastguard Worker string sdwa = !if(!eq(NumSrcArgs, 0), 1387*9880d681SAndroid Build Coastguard Worker "", 1388*9880d681SAndroid Build Coastguard Worker !if(!eq(NumSrcArgs, 1), 1389*9880d681SAndroid Build Coastguard Worker " $dst_sel $dst_unused $src0_sel", 1390*9880d681SAndroid Build Coastguard Worker !if(!eq(DstVT.Size, 1), 1391*9880d681SAndroid Build Coastguard Worker " $src0_sel $src1_sel", // No dst_sel and dst_unused for VOPC 1392*9880d681SAndroid Build Coastguard Worker " $dst_sel $dst_unused $src0_sel $src1_sel" 1393*9880d681SAndroid Build Coastguard Worker ) 1394*9880d681SAndroid Build Coastguard Worker ) 1395*9880d681SAndroid Build Coastguard Worker ); 1396*9880d681SAndroid Build Coastguard Worker string ret = dst#args#sdwa; 1397*9880d681SAndroid Build Coastguard Worker} 1398*9880d681SAndroid Build Coastguard Worker 1399*9880d681SAndroid Build Coastguard Worker// Function that checks if instruction supports DPP and SDWA 1400*9880d681SAndroid Build Coastguard Workerclass getHasExt <int NumSrcArgs, ValueType DstVT = i32, ValueType Src0VT = i32, 1401*9880d681SAndroid Build Coastguard Worker ValueType Src1VT = i32> { 1402*9880d681SAndroid Build Coastguard Worker bit ret = !if(!eq(NumSrcArgs, 3), 1403*9880d681SAndroid Build Coastguard Worker 0, // NumSrcArgs == 3 - No DPP or SDWA for VOP3 1404*9880d681SAndroid Build Coastguard Worker !if(!eq(DstVT.Size, 64), 1405*9880d681SAndroid Build Coastguard Worker 0, // 64-bit dst - No DPP or SDWA for 64-bit operands 1406*9880d681SAndroid Build Coastguard Worker !if(!eq(Src0VT.Size, 64), 1407*9880d681SAndroid Build Coastguard Worker 0, // 64-bit src0 1408*9880d681SAndroid Build Coastguard Worker !if(!eq(Src0VT.Size, 64), 1409*9880d681SAndroid Build Coastguard Worker 0, // 64-bit src2 1410*9880d681SAndroid Build Coastguard Worker 1 1411*9880d681SAndroid Build Coastguard Worker ) 1412*9880d681SAndroid Build Coastguard Worker ) 1413*9880d681SAndroid Build Coastguard Worker ) 1414*9880d681SAndroid Build Coastguard Worker ); 1415*9880d681SAndroid Build Coastguard Worker} 1416*9880d681SAndroid Build Coastguard Worker 1417*9880d681SAndroid Build Coastguard Workerclass VOPProfile <list<ValueType> _ArgVT> { 1418*9880d681SAndroid Build Coastguard Worker 1419*9880d681SAndroid Build Coastguard Worker field list<ValueType> ArgVT = _ArgVT; 1420*9880d681SAndroid Build Coastguard Worker 1421*9880d681SAndroid Build Coastguard Worker field ValueType DstVT = ArgVT[0]; 1422*9880d681SAndroid Build Coastguard Worker field ValueType Src0VT = ArgVT[1]; 1423*9880d681SAndroid Build Coastguard Worker field ValueType Src1VT = ArgVT[2]; 1424*9880d681SAndroid Build Coastguard Worker field ValueType Src2VT = ArgVT[3]; 1425*9880d681SAndroid Build Coastguard Worker field RegisterOperand DstRC = getVALUDstForVT<DstVT>.ret; 1426*9880d681SAndroid Build Coastguard Worker field RegisterOperand DstRCDPP = getVALUDstForVT<DstVT>.ret; 1427*9880d681SAndroid Build Coastguard Worker field RegisterOperand DstRCSDWA = getVALUDstForVT<DstVT>.ret; 1428*9880d681SAndroid Build Coastguard Worker field RegisterOperand Src0RC32 = getVOPSrc0ForVT<Src0VT>.ret; 1429*9880d681SAndroid Build Coastguard Worker field RegisterClass Src1RC32 = getVregSrcForVT<Src1VT>.ret; 1430*9880d681SAndroid Build Coastguard Worker field RegisterOperand Src0RC64 = getVOP3SrcForVT<Src0VT>.ret; 1431*9880d681SAndroid Build Coastguard Worker field RegisterOperand Src1RC64 = getVOP3SrcForVT<Src1VT>.ret; 1432*9880d681SAndroid Build Coastguard Worker field RegisterOperand Src2RC64 = getVOP3SrcForVT<Src2VT>.ret; 1433*9880d681SAndroid Build Coastguard Worker field RegisterClass Src0DPP = getVregSrcForVT<Src0VT>.ret; 1434*9880d681SAndroid Build Coastguard Worker field RegisterClass Src1DPP = getVregSrcForVT<Src1VT>.ret; 1435*9880d681SAndroid Build Coastguard Worker field RegisterClass Src0SDWA = getVregSrcForVT<Src0VT>.ret; 1436*9880d681SAndroid Build Coastguard Worker field RegisterClass Src1SDWA = getVregSrcForVT<Src1VT>.ret; 1437*9880d681SAndroid Build Coastguard Worker 1438*9880d681SAndroid Build Coastguard Worker field bit HasDst = !if(!eq(DstVT.Value, untyped.Value), 0, 1); 1439*9880d681SAndroid Build Coastguard Worker field bit HasDst32 = HasDst; 1440*9880d681SAndroid Build Coastguard Worker field int NumSrcArgs = getNumSrcArgs<Src0VT, Src1VT, Src2VT>.ret; 1441*9880d681SAndroid Build Coastguard Worker field bit HasModifiers = hasModifiers<Src0VT>.ret; 1442*9880d681SAndroid Build Coastguard Worker 1443*9880d681SAndroid Build Coastguard Worker field bit HasExt = getHasExt<NumSrcArgs, DstVT, Src0VT, Src1VT>.ret; 1444*9880d681SAndroid Build Coastguard Worker 1445*9880d681SAndroid Build Coastguard Worker field dag Outs = !if(HasDst,(outs DstRC:$vdst),(outs)); 1446*9880d681SAndroid Build Coastguard Worker 1447*9880d681SAndroid Build Coastguard Worker // VOP3b instructions are a special case with a second explicit 1448*9880d681SAndroid Build Coastguard Worker // output. This is manually overridden for them. 1449*9880d681SAndroid Build Coastguard Worker field dag Outs32 = Outs; 1450*9880d681SAndroid Build Coastguard Worker field dag Outs64 = Outs; 1451*9880d681SAndroid Build Coastguard Worker field dag OutsDPP = getOutsExt<HasDst, DstVT, DstRCDPP>.ret; 1452*9880d681SAndroid Build Coastguard Worker field dag OutsSDWA = getOutsExt<HasDst, DstVT, DstRCDPP>.ret; 1453*9880d681SAndroid Build Coastguard Worker 1454*9880d681SAndroid Build Coastguard Worker field dag Ins32 = getIns32<Src0RC32, Src1RC32, NumSrcArgs>.ret; 1455*9880d681SAndroid Build Coastguard Worker field dag Ins64 = getIns64<Src0RC64, Src1RC64, Src2RC64, NumSrcArgs, 1456*9880d681SAndroid Build Coastguard Worker HasModifiers>.ret; 1457*9880d681SAndroid Build Coastguard Worker field dag InsDPP = getInsDPP<Src0DPP, Src1DPP, NumSrcArgs, HasModifiers>.ret; 1458*9880d681SAndroid Build Coastguard Worker field dag InsSDWA = getInsSDWA<Src0SDWA, Src1SDWA, NumSrcArgs, HasModifiers, DstVT>.ret; 1459*9880d681SAndroid Build Coastguard Worker 1460*9880d681SAndroid Build Coastguard Worker field string Asm32 = getAsm32<HasDst, NumSrcArgs, DstVT>.ret; 1461*9880d681SAndroid Build Coastguard Worker field string Asm64 = getAsm64<HasDst, NumSrcArgs, HasModifiers, DstVT>.ret; 1462*9880d681SAndroid Build Coastguard Worker field string AsmDPP = getAsmDPP<HasDst, NumSrcArgs, HasModifiers, DstVT>.ret; 1463*9880d681SAndroid Build Coastguard Worker field string AsmSDWA = getAsmSDWA<HasDst, NumSrcArgs, HasModifiers, DstVT>.ret; 1464*9880d681SAndroid Build Coastguard Worker} 1465*9880d681SAndroid Build Coastguard Worker 1466*9880d681SAndroid Build Coastguard Workerclass VOP_NO_EXT <VOPProfile p> : VOPProfile <p.ArgVT> { 1467*9880d681SAndroid Build Coastguard Worker let HasExt = 0; 1468*9880d681SAndroid Build Coastguard Worker} 1469*9880d681SAndroid Build Coastguard Worker 1470*9880d681SAndroid Build Coastguard Worker// FIXME: I think these F16/I16 profiles will need to use f16/i16 types in order 1471*9880d681SAndroid Build Coastguard Worker// for the instruction patterns to work. 1472*9880d681SAndroid Build Coastguard Workerdef VOP_F16_F16 : VOPProfile <[f16, f16, untyped, untyped]>; 1473*9880d681SAndroid Build Coastguard Workerdef VOP_F16_I16 : VOPProfile <[f16, i32, untyped, untyped]>; 1474*9880d681SAndroid Build Coastguard Workerdef VOP_I16_F16 : VOPProfile <[i32, f16, untyped, untyped]>; 1475*9880d681SAndroid Build Coastguard Worker 1476*9880d681SAndroid Build Coastguard Workerdef VOP_F16_F16_F16 : VOPProfile <[f16, f16, f16, untyped]>; 1477*9880d681SAndroid Build Coastguard Workerdef VOP_F16_F16_I16 : VOPProfile <[f16, f16, i32, untyped]>; 1478*9880d681SAndroid Build Coastguard Workerdef VOP_I16_I16_I16 : VOPProfile <[i32, i32, i32, untyped]>; 1479*9880d681SAndroid Build Coastguard Worker 1480*9880d681SAndroid Build Coastguard Workerdef VOP_I16_I16_I16_I16 : VOPProfile <[i32, i32, i32, i32, untyped]>; 1481*9880d681SAndroid Build Coastguard Workerdef VOP_F16_F16_F16_F16 : VOPProfile <[f16, f16, f16, f16, untyped]>; 1482*9880d681SAndroid Build Coastguard Worker 1483*9880d681SAndroid Build Coastguard Workerdef VOP_NONE : VOPProfile <[untyped, untyped, untyped, untyped]>; 1484*9880d681SAndroid Build Coastguard Worker 1485*9880d681SAndroid Build Coastguard Workerdef VOP_F32_F32 : VOPProfile <[f32, f32, untyped, untyped]>; 1486*9880d681SAndroid Build Coastguard Workerdef VOP_F32_F64 : VOPProfile <[f32, f64, untyped, untyped]>; 1487*9880d681SAndroid Build Coastguard Workerdef VOP_F32_I32 : VOPProfile <[f32, i32, untyped, untyped]>; 1488*9880d681SAndroid Build Coastguard Workerdef VOP_F64_F32 : VOPProfile <[f64, f32, untyped, untyped]>; 1489*9880d681SAndroid Build Coastguard Workerdef VOP_F64_F64 : VOPProfile <[f64, f64, untyped, untyped]>; 1490*9880d681SAndroid Build Coastguard Workerdef VOP_F64_I32 : VOPProfile <[f64, i32, untyped, untyped]>; 1491*9880d681SAndroid Build Coastguard Workerdef VOP_I32_F32 : VOPProfile <[i32, f32, untyped, untyped]>; 1492*9880d681SAndroid Build Coastguard Workerdef VOP_I32_F64 : VOPProfile <[i32, f64, untyped, untyped]>; 1493*9880d681SAndroid Build Coastguard Workerdef VOP_I32_I32 : VOPProfile <[i32, i32, untyped, untyped]>; 1494*9880d681SAndroid Build Coastguard Worker 1495*9880d681SAndroid Build Coastguard Workerdef VOP_F32_F32_F32 : VOPProfile <[f32, f32, f32, untyped]>; 1496*9880d681SAndroid Build Coastguard Workerdef VOP_F32_F32_I32 : VOPProfile <[f32, f32, i32, untyped]>; 1497*9880d681SAndroid Build Coastguard Workerdef VOP_F64_F64_F64 : VOPProfile <[f64, f64, f64, untyped]>; 1498*9880d681SAndroid Build Coastguard Workerdef VOP_F64_F64_I32 : VOPProfile <[f64, f64, i32, untyped]>; 1499*9880d681SAndroid Build Coastguard Workerdef VOP_I32_F32_F32 : VOPProfile <[i32, f32, f32, untyped]>; 1500*9880d681SAndroid Build Coastguard Workerdef VOP_I32_F32_I32 : VOPProfile <[i32, f32, i32, untyped]>; 1501*9880d681SAndroid Build Coastguard Workerdef VOP_I32_I32_I32 : VOPProfile <[i32, i32, i32, untyped]>; 1502*9880d681SAndroid Build Coastguard Worker 1503*9880d681SAndroid Build Coastguard Worker// Write out to vcc or arbitrary SGPR. 1504*9880d681SAndroid Build Coastguard Workerdef VOP2b_I32_I1_I32_I32 : VOPProfile<[i32, i32, i32, untyped]> { 1505*9880d681SAndroid Build Coastguard Worker let Asm32 = "$vdst, vcc, $src0, $src1"; 1506*9880d681SAndroid Build Coastguard Worker let Asm64 = "$vdst, $sdst, $src0, $src1"; 1507*9880d681SAndroid Build Coastguard Worker let Outs32 = (outs DstRC:$vdst); 1508*9880d681SAndroid Build Coastguard Worker let Outs64 = (outs DstRC:$vdst, SReg_64:$sdst); 1509*9880d681SAndroid Build Coastguard Worker} 1510*9880d681SAndroid Build Coastguard Worker 1511*9880d681SAndroid Build Coastguard Worker// Write out to vcc or arbitrary SGPR and read in from vcc or 1512*9880d681SAndroid Build Coastguard Worker// arbitrary SGPR. 1513*9880d681SAndroid Build Coastguard Workerdef VOP2b_I32_I1_I32_I32_I1 : VOPProfile<[i32, i32, i32, i1]> { 1514*9880d681SAndroid Build Coastguard Worker // We use VCSrc_32 to exclude literal constants, even though the 1515*9880d681SAndroid Build Coastguard Worker // encoding normally allows them since the implicit VCC use means 1516*9880d681SAndroid Build Coastguard Worker // using one would always violate the constant bus 1517*9880d681SAndroid Build Coastguard Worker // restriction. SGPRs are still allowed because it should 1518*9880d681SAndroid Build Coastguard Worker // technically be possible to use VCC again as src0. 1519*9880d681SAndroid Build Coastguard Worker let Src0RC32 = VCSrc_32; 1520*9880d681SAndroid Build Coastguard Worker let Asm32 = "$vdst, vcc, $src0, $src1, vcc"; 1521*9880d681SAndroid Build Coastguard Worker let Asm64 = "$vdst, $sdst, $src0, $src1, $src2"; 1522*9880d681SAndroid Build Coastguard Worker let Outs32 = (outs DstRC:$vdst); 1523*9880d681SAndroid Build Coastguard Worker let Outs64 = (outs DstRC:$vdst, SReg_64:$sdst); 1524*9880d681SAndroid Build Coastguard Worker 1525*9880d681SAndroid Build Coastguard Worker // Suppress src2 implied by type since the 32-bit encoding uses an 1526*9880d681SAndroid Build Coastguard Worker // implicit VCC use. 1527*9880d681SAndroid Build Coastguard Worker let Ins32 = (ins Src0RC32:$src0, Src1RC32:$src1); 1528*9880d681SAndroid Build Coastguard Worker} 1529*9880d681SAndroid Build Coastguard Worker 1530*9880d681SAndroid Build Coastguard Worker// Read in from vcc or arbitrary SGPR 1531*9880d681SAndroid Build Coastguard Workerdef VOP2e_I32_I32_I32_I1 : VOPProfile<[i32, i32, i32, i1]> { 1532*9880d681SAndroid Build Coastguard Worker let Src0RC32 = VCSrc_32; // See comment in def VOP2b_I32_I1_I32_I32_I1 above. 1533*9880d681SAndroid Build Coastguard Worker let Asm32 = "$vdst, $src0, $src1, vcc"; 1534*9880d681SAndroid Build Coastguard Worker let Asm64 = "$vdst, $src0, $src1, $src2"; 1535*9880d681SAndroid Build Coastguard Worker let Outs32 = (outs DstRC:$vdst); 1536*9880d681SAndroid Build Coastguard Worker let Outs64 = (outs DstRC:$vdst); 1537*9880d681SAndroid Build Coastguard Worker 1538*9880d681SAndroid Build Coastguard Worker // Suppress src2 implied by type since the 32-bit encoding uses an 1539*9880d681SAndroid Build Coastguard Worker // implicit VCC use. 1540*9880d681SAndroid Build Coastguard Worker let Ins32 = (ins Src0RC32:$src0, Src1RC32:$src1); 1541*9880d681SAndroid Build Coastguard Worker} 1542*9880d681SAndroid Build Coastguard Worker 1543*9880d681SAndroid Build Coastguard Workerclass VOP3b_Profile<ValueType vt> : VOPProfile<[vt, vt, vt, vt]> { 1544*9880d681SAndroid Build Coastguard Worker let Outs64 = (outs DstRC:$vdst, SReg_64:$sdst); 1545*9880d681SAndroid Build Coastguard Worker let Asm64 = "$vdst, $sdst, $src0_modifiers, $src1_modifiers, $src2_modifiers"#"$clamp"#"$omod"; 1546*9880d681SAndroid Build Coastguard Worker} 1547*9880d681SAndroid Build Coastguard Worker 1548*9880d681SAndroid Build Coastguard Workerdef VOP3b_F32_I1_F32_F32_F32 : VOP3b_Profile<f32> { 1549*9880d681SAndroid Build Coastguard Worker // FIXME: Hack to stop printing _e64 1550*9880d681SAndroid Build Coastguard Worker let DstRC = RegisterOperand<VGPR_32>; 1551*9880d681SAndroid Build Coastguard Worker} 1552*9880d681SAndroid Build Coastguard Worker 1553*9880d681SAndroid Build Coastguard Workerdef VOP3b_F64_I1_F64_F64_F64 : VOP3b_Profile<f64> { 1554*9880d681SAndroid Build Coastguard Worker // FIXME: Hack to stop printing _e64 1555*9880d681SAndroid Build Coastguard Worker let DstRC = RegisterOperand<VReg_64>; 1556*9880d681SAndroid Build Coastguard Worker} 1557*9880d681SAndroid Build Coastguard Worker 1558*9880d681SAndroid Build Coastguard Worker// VOPC instructions are a special case because for the 32-bit 1559*9880d681SAndroid Build Coastguard Worker// encoding, we want to display the implicit vcc write as if it were 1560*9880d681SAndroid Build Coastguard Worker// an explicit $dst. 1561*9880d681SAndroid Build Coastguard Workerclass VOPC_Profile<ValueType vt0, ValueType vt1 = vt0> : VOPProfile <[i1, vt0, vt1, untyped]> { 1562*9880d681SAndroid Build Coastguard Worker let Asm32 = "vcc, $src0, $src1"; 1563*9880d681SAndroid Build Coastguard Worker // The destination for 32-bit encoding is implicit. 1564*9880d681SAndroid Build Coastguard Worker let HasDst32 = 0; 1565*9880d681SAndroid Build Coastguard Worker let Outs64 = (outs DstRC:$sdst); 1566*9880d681SAndroid Build Coastguard Worker} 1567*9880d681SAndroid Build Coastguard Worker 1568*9880d681SAndroid Build Coastguard Workerclass VOPC_Class_Profile<ValueType vt> : VOPC_Profile<vt, i32> { 1569*9880d681SAndroid Build Coastguard Worker let Ins64 = (ins FPInputMods:$src0_modifiers, Src0RC64:$src0, Src1RC64:$src1); 1570*9880d681SAndroid Build Coastguard Worker let Asm64 = "$sdst, $src0_modifiers, $src1"; 1571*9880d681SAndroid Build Coastguard Worker let InsSDWA = (ins FPInputMods:$src0_fmodifiers, Src0RC64:$src0, 1572*9880d681SAndroid Build Coastguard Worker IntInputMods:$src1_imodifiers, Src1RC64:$src1, 1573*9880d681SAndroid Build Coastguard Worker clampmod:$clamp, src0_sel:$src0_sel, src1_sel:$src1_sel); 1574*9880d681SAndroid Build Coastguard Worker let AsmSDWA = " vcc, $src0_fmodifiers, $src1_imodifiers$clamp $src0_sel $src1_sel"; 1575*9880d681SAndroid Build Coastguard Worker 1576*9880d681SAndroid Build Coastguard Worker} 1577*9880d681SAndroid Build Coastguard Worker 1578*9880d681SAndroid Build Coastguard Workerdef VOPC_I1_F32_F32 : VOPC_Profile<f32>; 1579*9880d681SAndroid Build Coastguard Workerdef VOPC_I1_F64_F64 : VOPC_Profile<f64>; 1580*9880d681SAndroid Build Coastguard Workerdef VOPC_I1_I32_I32 : VOPC_Profile<i32>; 1581*9880d681SAndroid Build Coastguard Workerdef VOPC_I1_I64_I64 : VOPC_Profile<i64>; 1582*9880d681SAndroid Build Coastguard Worker 1583*9880d681SAndroid Build Coastguard Workerdef VOPC_I1_F32_I32 : VOPC_Class_Profile<f32>; 1584*9880d681SAndroid Build Coastguard Workerdef VOPC_I1_F64_I32 : VOPC_Class_Profile<f64>; 1585*9880d681SAndroid Build Coastguard Worker 1586*9880d681SAndroid Build Coastguard Workerdef VOP_I64_I64_I32 : VOPProfile <[i64, i64, i32, untyped]>; 1587*9880d681SAndroid Build Coastguard Workerdef VOP_I64_I32_I64 : VOPProfile <[i64, i32, i64, untyped]>; 1588*9880d681SAndroid Build Coastguard Workerdef VOP_I64_I64_I64 : VOPProfile <[i64, i64, i64, untyped]>; 1589*9880d681SAndroid Build Coastguard Worker 1590*9880d681SAndroid Build Coastguard Workerdef VOP_F32_F32_F32_F32 : VOPProfile <[f32, f32, f32, f32]>; 1591*9880d681SAndroid Build Coastguard Workerdef VOP_MADAK : VOPProfile <[f32, f32, f32, f32]> { 1592*9880d681SAndroid Build Coastguard Worker field dag Ins32 = (ins VCSrc_32:$src0, VGPR_32:$src1, u32kimm:$imm); 1593*9880d681SAndroid Build Coastguard Worker field string Asm32 = "$vdst, $src0, $src1, $imm"; 1594*9880d681SAndroid Build Coastguard Worker field bit HasExt = 0; 1595*9880d681SAndroid Build Coastguard Worker} 1596*9880d681SAndroid Build Coastguard Workerdef VOP_MADMK : VOPProfile <[f32, f32, f32, f32]> { 1597*9880d681SAndroid Build Coastguard Worker field dag Ins32 = (ins VCSrc_32:$src0, u32kimm:$imm, VGPR_32:$src1); 1598*9880d681SAndroid Build Coastguard Worker field string Asm32 = "$vdst, $src0, $imm, $src1"; 1599*9880d681SAndroid Build Coastguard Worker field bit HasExt = 0; 1600*9880d681SAndroid Build Coastguard Worker} 1601*9880d681SAndroid Build Coastguard Workerdef VOP_MAC : VOPProfile <[f32, f32, f32, f32]> { 1602*9880d681SAndroid Build Coastguard Worker let Ins32 = (ins Src0RC32:$src0, Src1RC32:$src1, VGPR_32:$src2); 1603*9880d681SAndroid Build Coastguard Worker let Ins64 = getIns64<Src0RC64, Src1RC64, RegisterOperand<VGPR_32>, 3, 1604*9880d681SAndroid Build Coastguard Worker HasModifiers>.ret; 1605*9880d681SAndroid Build Coastguard Worker let InsDPP = (ins FPInputMods:$src0_modifiers, Src0RC32:$src0, 1606*9880d681SAndroid Build Coastguard Worker FPInputMods:$src1_modifiers, Src1RC32:$src1, 1607*9880d681SAndroid Build Coastguard Worker VGPR_32:$src2, // stub argument 1608*9880d681SAndroid Build Coastguard Worker dpp_ctrl:$dpp_ctrl, row_mask:$row_mask, 1609*9880d681SAndroid Build Coastguard Worker bank_mask:$bank_mask, bound_ctrl:$bound_ctrl); 1610*9880d681SAndroid Build Coastguard Worker let InsSDWA = (ins FPInputMods:$src0_fmodifiers, Src0RC32:$src0, 1611*9880d681SAndroid Build Coastguard Worker FPInputMods:$src1_fmodifiers, Src1RC32:$src1, 1612*9880d681SAndroid Build Coastguard Worker VGPR_32:$src2, // stub argument 1613*9880d681SAndroid Build Coastguard Worker clampmod:$clamp, dst_sel:$dst_sel, dst_unused:$dst_unused, 1614*9880d681SAndroid Build Coastguard Worker src0_sel:$src0_sel, src1_sel:$src1_sel); 1615*9880d681SAndroid Build Coastguard Worker let Asm32 = getAsm32<1, 2, f32>.ret; 1616*9880d681SAndroid Build Coastguard Worker let Asm64 = getAsm64<1, 2, HasModifiers, f32>.ret; 1617*9880d681SAndroid Build Coastguard Worker let AsmDPP = getAsmDPP<1, 2, HasModifiers, f32>.ret; 1618*9880d681SAndroid Build Coastguard Worker let AsmSDWA = getAsmSDWA<1, 2, HasModifiers, f32>.ret; 1619*9880d681SAndroid Build Coastguard Worker} 1620*9880d681SAndroid Build Coastguard Workerdef VOP_F64_F64_F64_F64 : VOPProfile <[f64, f64, f64, f64]>; 1621*9880d681SAndroid Build Coastguard Workerdef VOP_I32_I32_I32_I32 : VOPProfile <[i32, i32, i32, i32]>; 1622*9880d681SAndroid Build Coastguard Workerdef VOP_I64_I32_I32_I64 : VOPProfile <[i64, i32, i32, i64]>; 1623*9880d681SAndroid Build Coastguard Worker 1624*9880d681SAndroid Build Coastguard Worker// This class is used only with VOPC instructions. Use $sdst for out operand 1625*9880d681SAndroid Build Coastguard Workerclass SIInstAlias <string asm, Instruction inst, VOPProfile p> : 1626*9880d681SAndroid Build Coastguard Worker InstAlias <asm, (inst)>, PredicateControl { 1627*9880d681SAndroid Build Coastguard Worker 1628*9880d681SAndroid Build Coastguard Worker field bit isCompare; 1629*9880d681SAndroid Build Coastguard Worker field bit isCommutable; 1630*9880d681SAndroid Build Coastguard Worker 1631*9880d681SAndroid Build Coastguard Worker let ResultInst = 1632*9880d681SAndroid Build Coastguard Worker !if (p.HasDst32, 1633*9880d681SAndroid Build Coastguard Worker !if (!eq(p.NumSrcArgs, 0), 1634*9880d681SAndroid Build Coastguard Worker // 1 dst, 0 src 1635*9880d681SAndroid Build Coastguard Worker (inst p.DstRC:$sdst), 1636*9880d681SAndroid Build Coastguard Worker !if (!eq(p.NumSrcArgs, 1), 1637*9880d681SAndroid Build Coastguard Worker // 1 dst, 1 src 1638*9880d681SAndroid Build Coastguard Worker (inst p.DstRC:$sdst, p.Src0RC32:$src0), 1639*9880d681SAndroid Build Coastguard Worker !if (!eq(p.NumSrcArgs, 2), 1640*9880d681SAndroid Build Coastguard Worker // 1 dst, 2 src 1641*9880d681SAndroid Build Coastguard Worker (inst p.DstRC:$sdst, p.Src0RC32:$src0, p.Src1RC32:$src1), 1642*9880d681SAndroid Build Coastguard Worker // else - unreachable 1643*9880d681SAndroid Build Coastguard Worker (inst)))), 1644*9880d681SAndroid Build Coastguard Worker // else 1645*9880d681SAndroid Build Coastguard Worker !if (!eq(p.NumSrcArgs, 2), 1646*9880d681SAndroid Build Coastguard Worker // 0 dst, 2 src 1647*9880d681SAndroid Build Coastguard Worker (inst p.Src0RC32:$src0, p.Src1RC32:$src1), 1648*9880d681SAndroid Build Coastguard Worker !if (!eq(p.NumSrcArgs, 1), 1649*9880d681SAndroid Build Coastguard Worker // 0 dst, 1 src 1650*9880d681SAndroid Build Coastguard Worker (inst p.Src0RC32:$src1), 1651*9880d681SAndroid Build Coastguard Worker // else 1652*9880d681SAndroid Build Coastguard Worker // 0 dst, 0 src 1653*9880d681SAndroid Build Coastguard Worker (inst)))); 1654*9880d681SAndroid Build Coastguard Worker} 1655*9880d681SAndroid Build Coastguard Worker 1656*9880d681SAndroid Build Coastguard Workerclass SIInstAliasSI <string asm, string op_name, VOPProfile p> : 1657*9880d681SAndroid Build Coastguard Worker SIInstAlias <asm, !cast<Instruction>(op_name#"_e32_si"), p> { 1658*9880d681SAndroid Build Coastguard Worker let AssemblerPredicate = SIAssemblerPredicate; 1659*9880d681SAndroid Build Coastguard Worker} 1660*9880d681SAndroid Build Coastguard Worker 1661*9880d681SAndroid Build Coastguard Workerclass SIInstAliasVI <string asm, string op_name, VOPProfile p> : 1662*9880d681SAndroid Build Coastguard Worker SIInstAlias <asm, !cast<Instruction>(op_name#"_e32_vi"), p> { 1663*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 1664*9880d681SAndroid Build Coastguard Worker} 1665*9880d681SAndroid Build Coastguard Worker 1666*9880d681SAndroid Build Coastguard Workermulticlass SIInstAliasBuilder <string asm, VOPProfile p> { 1667*9880d681SAndroid Build Coastguard Worker 1668*9880d681SAndroid Build Coastguard Worker def : SIInstAliasSI <asm, NAME, p>; 1669*9880d681SAndroid Build Coastguard Worker 1670*9880d681SAndroid Build Coastguard Worker def : SIInstAliasVI <asm, NAME, p>; 1671*9880d681SAndroid Build Coastguard Worker} 1672*9880d681SAndroid Build Coastguard Worker 1673*9880d681SAndroid Build Coastguard Workerclass VOP <string opName> { 1674*9880d681SAndroid Build Coastguard Worker string OpName = opName; 1675*9880d681SAndroid Build Coastguard Worker} 1676*9880d681SAndroid Build Coastguard Worker 1677*9880d681SAndroid Build Coastguard Workerclass VOP2_REV <string revOp, bit isOrig> { 1678*9880d681SAndroid Build Coastguard Worker string RevOp = revOp; 1679*9880d681SAndroid Build Coastguard Worker bit IsOrig = isOrig; 1680*9880d681SAndroid Build Coastguard Worker} 1681*9880d681SAndroid Build Coastguard Worker 1682*9880d681SAndroid Build Coastguard Workerclass AtomicNoRet <string noRetOp, bit isRet> { 1683*9880d681SAndroid Build Coastguard Worker string NoRetOp = noRetOp; 1684*9880d681SAndroid Build Coastguard Worker bit IsRet = isRet; 1685*9880d681SAndroid Build Coastguard Worker} 1686*9880d681SAndroid Build Coastguard Worker 1687*9880d681SAndroid Build Coastguard Workerclass VOP1_Pseudo <dag outs, dag ins, list<dag> pattern, string opName> : 1688*9880d681SAndroid Build Coastguard Worker VOP1Common <outs, ins, "", pattern>, 1689*9880d681SAndroid Build Coastguard Worker VOP <opName>, 1690*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName#"_e32", SIEncodingFamily.NONE>, 1691*9880d681SAndroid Build Coastguard Worker MnemonicAlias<opName#"_e32", opName> { 1692*9880d681SAndroid Build Coastguard Worker let isPseudo = 1; 1693*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1; 1694*9880d681SAndroid Build Coastguard Worker 1695*9880d681SAndroid Build Coastguard Worker field bits<8> vdst; 1696*9880d681SAndroid Build Coastguard Worker field bits<9> src0; 1697*9880d681SAndroid Build Coastguard Worker} 1698*9880d681SAndroid Build Coastguard Worker 1699*9880d681SAndroid Build Coastguard Workerclass VOP1_Real_si <string opName, vop1 op, dag outs, dag ins, string asm> : 1700*9880d681SAndroid Build Coastguard Worker VOP1<op.SI, outs, ins, asm, []>, 1701*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName#"_e32", SIEncodingFamily.SI> { 1702*9880d681SAndroid Build Coastguard Worker let AssemblerPredicate = SIAssemblerPredicate; 1703*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 1704*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 1705*9880d681SAndroid Build Coastguard Worker} 1706*9880d681SAndroid Build Coastguard Worker 1707*9880d681SAndroid Build Coastguard Workerclass VOP1_Real_vi <string opName, vop1 op, dag outs, dag ins, string asm> : 1708*9880d681SAndroid Build Coastguard Worker VOP1<op.VI, outs, ins, asm, []>, 1709*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName#"_e32", SIEncodingFamily.VI> { 1710*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 1711*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 1712*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 1713*9880d681SAndroid Build Coastguard Worker} 1714*9880d681SAndroid Build Coastguard Worker 1715*9880d681SAndroid Build Coastguard Workermulticlass VOP1_m <vop1 op, string opName, VOPProfile p, list<dag> pattern, 1716*9880d681SAndroid Build Coastguard Worker string asm = opName#p.Asm32> { 1717*9880d681SAndroid Build Coastguard Worker def "" : VOP1_Pseudo <p.Outs, p.Ins32, pattern, opName>; 1718*9880d681SAndroid Build Coastguard Worker 1719*9880d681SAndroid Build Coastguard Worker def _si : VOP1_Real_si <opName, op, p.Outs, p.Ins32, asm>; 1720*9880d681SAndroid Build Coastguard Worker 1721*9880d681SAndroid Build Coastguard Worker def _vi : VOP1_Real_vi <opName, op, p.Outs, p.Ins32, asm>; 1722*9880d681SAndroid Build Coastguard Worker 1723*9880d681SAndroid Build Coastguard Worker} 1724*9880d681SAndroid Build Coastguard Worker 1725*9880d681SAndroid Build Coastguard Workerclass VOP1_DPP <vop1 op, string opName, VOPProfile p> : 1726*9880d681SAndroid Build Coastguard Worker VOP1_DPPe <op.VI>, 1727*9880d681SAndroid Build Coastguard Worker VOP_DPP <p.OutsDPP, p.InsDPP, opName#p.AsmDPP, [], p.HasModifiers> { 1728*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = !if(p.HasExt, [isVI], [DisableInst]); 1729*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "DPP"; 1730*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 1731*9880d681SAndroid Build Coastguard Worker let src0_modifiers = !if(p.HasModifiers, ?, 0); 1732*9880d681SAndroid Build Coastguard Worker let src1_modifiers = 0; 1733*9880d681SAndroid Build Coastguard Worker} 1734*9880d681SAndroid Build Coastguard Worker 1735*9880d681SAndroid Build Coastguard Workerclass SDWADisableFields <VOPProfile p> { 1736*9880d681SAndroid Build Coastguard Worker bits<8> src0 = !if(!eq(p.NumSrcArgs, 0), 0, ?); 1737*9880d681SAndroid Build Coastguard Worker bits<3> src0_sel = !if(!eq(p.NumSrcArgs, 0), 6, ?); 1738*9880d681SAndroid Build Coastguard Worker bits<2> src0_fmodifiers = !if(!eq(p.NumSrcArgs, 0), 1739*9880d681SAndroid Build Coastguard Worker 0, 1740*9880d681SAndroid Build Coastguard Worker !if(p.HasModifiers, ?, 0)); 1741*9880d681SAndroid Build Coastguard Worker bits<1> src0_imodifiers = !if(!eq(p.NumSrcArgs, 0), 1742*9880d681SAndroid Build Coastguard Worker 0, 1743*9880d681SAndroid Build Coastguard Worker !if(p.HasModifiers, 0, ?)); 1744*9880d681SAndroid Build Coastguard Worker bits<3> src1_sel = !if(!eq(p.NumSrcArgs, 0), 6, 1745*9880d681SAndroid Build Coastguard Worker !if(!eq(p.NumSrcArgs, 1), 6, 1746*9880d681SAndroid Build Coastguard Worker ?)); 1747*9880d681SAndroid Build Coastguard Worker bits<2> src1_fmodifiers = !if(!eq(p.NumSrcArgs, 0), 0, 1748*9880d681SAndroid Build Coastguard Worker !if(!eq(p.NumSrcArgs, 1), 0, 1749*9880d681SAndroid Build Coastguard Worker !if(p.HasModifiers, ?, 0))); 1750*9880d681SAndroid Build Coastguard Worker bits<1> src1_imodifiers = !if(!eq(p.NumSrcArgs, 0), 0, 1751*9880d681SAndroid Build Coastguard Worker !if(!eq(p.NumSrcArgs, 1), 0, 1752*9880d681SAndroid Build Coastguard Worker !if(p.HasModifiers, 0, ?))); 1753*9880d681SAndroid Build Coastguard Worker bits<3> dst_sel = !if(p.HasDst, ?, 6); 1754*9880d681SAndroid Build Coastguard Worker bits<2> dst_unused = !if(p.HasDst, ?, 2); 1755*9880d681SAndroid Build Coastguard Worker bits<1> clamp = !if(!eq(p.NumSrcArgs, 0), 0, ?); 1756*9880d681SAndroid Build Coastguard Worker} 1757*9880d681SAndroid Build Coastguard Worker 1758*9880d681SAndroid Build Coastguard Workerclass VOP1_SDWA <vop1 op, string opName, VOPProfile p> : 1759*9880d681SAndroid Build Coastguard Worker VOP1_SDWAe <op.VI>, 1760*9880d681SAndroid Build Coastguard Worker VOP_SDWA <p.OutsSDWA, p.InsSDWA, opName#p.AsmSDWA, [], p.HasModifiers>, 1761*9880d681SAndroid Build Coastguard Worker SDWADisableFields <p> { 1762*9880d681SAndroid Build Coastguard Worker let AsmMatchConverter = "cvtSdwaVOP1"; 1763*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = !if(p.HasExt, [isVI], [DisableInst]); 1764*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SDWA"; 1765*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 1766*9880d681SAndroid Build Coastguard Worker} 1767*9880d681SAndroid Build Coastguard Worker 1768*9880d681SAndroid Build Coastguard Workermulticlass VOP1SI_m <vop1 op, string opName, VOPProfile p, list<dag> pattern, 1769*9880d681SAndroid Build Coastguard Worker string asm = opName#p.Asm32> { 1770*9880d681SAndroid Build Coastguard Worker 1771*9880d681SAndroid Build Coastguard Worker def "" : VOP1_Pseudo <p.Outs, p.Ins32, pattern, opName>; 1772*9880d681SAndroid Build Coastguard Worker 1773*9880d681SAndroid Build Coastguard Worker def _si : VOP1_Real_si <opName, op, p.Outs, p.Ins32, asm>; 1774*9880d681SAndroid Build Coastguard Worker} 1775*9880d681SAndroid Build Coastguard Worker 1776*9880d681SAndroid Build Coastguard Workerclass VOP2_Pseudo <dag outs, dag ins, list<dag> pattern, string opName> : 1777*9880d681SAndroid Build Coastguard Worker VOP2Common <outs, ins, "", pattern>, 1778*9880d681SAndroid Build Coastguard Worker VOP <opName>, 1779*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName#"_e32", SIEncodingFamily.NONE>, 1780*9880d681SAndroid Build Coastguard Worker MnemonicAlias<opName#"_e32", opName> { 1781*9880d681SAndroid Build Coastguard Worker let isPseudo = 1; 1782*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1; 1783*9880d681SAndroid Build Coastguard Worker} 1784*9880d681SAndroid Build Coastguard Worker 1785*9880d681SAndroid Build Coastguard Workerclass VOP2_Real_si <string opName, vop2 op, dag outs, dag ins, string asm> : 1786*9880d681SAndroid Build Coastguard Worker VOP2 <op.SI, outs, ins, opName#asm, []>, 1787*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName#"_e32", SIEncodingFamily.SI> { 1788*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isSICI]; 1789*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 1790*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 1791*9880d681SAndroid Build Coastguard Worker} 1792*9880d681SAndroid Build Coastguard Worker 1793*9880d681SAndroid Build Coastguard Workerclass VOP2_Real_vi <string opName, vop2 op, dag outs, dag ins, string asm> : 1794*9880d681SAndroid Build Coastguard Worker VOP2 <op.VI, outs, ins, opName#asm, []>, 1795*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName#"_e32", SIEncodingFamily.VI> { 1796*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 1797*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 1798*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 1799*9880d681SAndroid Build Coastguard Worker} 1800*9880d681SAndroid Build Coastguard Worker 1801*9880d681SAndroid Build Coastguard Workermulticlass VOP2SI_m <vop2 op, string opName, VOPProfile p, list<dag> pattern, 1802*9880d681SAndroid Build Coastguard Worker string revOp> { 1803*9880d681SAndroid Build Coastguard Worker 1804*9880d681SAndroid Build Coastguard Worker def "" : VOP2_Pseudo <p.Outs32, p.Ins32, pattern, opName>, 1805*9880d681SAndroid Build Coastguard Worker VOP2_REV<revOp#"_e32", !eq(revOp, opName)>; 1806*9880d681SAndroid Build Coastguard Worker 1807*9880d681SAndroid Build Coastguard Worker def _si : VOP2_Real_si <opName, op, p.Outs32, p.Ins32, p.Asm32>; 1808*9880d681SAndroid Build Coastguard Worker} 1809*9880d681SAndroid Build Coastguard Worker 1810*9880d681SAndroid Build Coastguard Workermulticlass VOP2_m <vop2 op, string opName, VOPProfile p, list <dag> pattern, 1811*9880d681SAndroid Build Coastguard Worker string revOp> { 1812*9880d681SAndroid Build Coastguard Worker 1813*9880d681SAndroid Build Coastguard Worker def "" : VOP2_Pseudo <p.Outs32, p.Ins32, pattern, opName>, 1814*9880d681SAndroid Build Coastguard Worker VOP2_REV<revOp#"_e32", !eq(revOp, opName)>; 1815*9880d681SAndroid Build Coastguard Worker 1816*9880d681SAndroid Build Coastguard Worker def _si : VOP2_Real_si <opName, op, p.Outs32, p.Ins32, p.Asm32>; 1817*9880d681SAndroid Build Coastguard Worker 1818*9880d681SAndroid Build Coastguard Worker def _vi : VOP2_Real_vi <opName, op, p.Outs32, p.Ins32, p.Asm32>; 1819*9880d681SAndroid Build Coastguard Worker 1820*9880d681SAndroid Build Coastguard Worker} 1821*9880d681SAndroid Build Coastguard Worker 1822*9880d681SAndroid Build Coastguard Workerclass VOP2_DPP <vop2 op, string opName, VOPProfile p> : 1823*9880d681SAndroid Build Coastguard Worker VOP2_DPPe <op.VI>, 1824*9880d681SAndroid Build Coastguard Worker VOP_DPP <p.OutsDPP, p.InsDPP, opName#p.AsmDPP, [], p.HasModifiers> { 1825*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = !if(p.HasExt, [isVI], [DisableInst]); 1826*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "DPP"; 1827*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 1828*9880d681SAndroid Build Coastguard Worker let src0_modifiers = !if(p.HasModifiers, ?, 0); 1829*9880d681SAndroid Build Coastguard Worker let src1_modifiers = !if(p.HasModifiers, ?, 0); 1830*9880d681SAndroid Build Coastguard Worker} 1831*9880d681SAndroid Build Coastguard Worker 1832*9880d681SAndroid Build Coastguard Workerclass VOP2_SDWA <vop2 op, string opName, VOPProfile p> : 1833*9880d681SAndroid Build Coastguard Worker VOP2_SDWAe <op.VI>, 1834*9880d681SAndroid Build Coastguard Worker VOP_SDWA <p.OutsSDWA, p.InsSDWA, opName#p.AsmSDWA, [], p.HasModifiers>, 1835*9880d681SAndroid Build Coastguard Worker SDWADisableFields <p> { 1836*9880d681SAndroid Build Coastguard Worker let AsmMatchConverter = "cvtSdwaVOP2"; 1837*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = !if(p.HasExt, [isVI], [DisableInst]); 1838*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SDWA"; 1839*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 1840*9880d681SAndroid Build Coastguard Worker} 1841*9880d681SAndroid Build Coastguard Worker 1842*9880d681SAndroid Build Coastguard Workerclass VOP3DisableFields <bit HasSrc1, bit HasSrc2, bit HasModifiers> { 1843*9880d681SAndroid Build Coastguard Worker 1844*9880d681SAndroid Build Coastguard Worker bits<2> src0_modifiers = !if(HasModifiers, ?, 0); 1845*9880d681SAndroid Build Coastguard Worker bits<2> src1_modifiers = !if(HasModifiers, !if(HasSrc1, ?, 0), 0); 1846*9880d681SAndroid Build Coastguard Worker bits<2> src2_modifiers = !if(HasModifiers, !if(HasSrc2, ?, 0), 0); 1847*9880d681SAndroid Build Coastguard Worker bits<2> omod = !if(HasModifiers, ?, 0); 1848*9880d681SAndroid Build Coastguard Worker bits<1> clamp = !if(HasModifiers, ?, 0); 1849*9880d681SAndroid Build Coastguard Worker bits<9> src1 = !if(HasSrc1, ?, 0); 1850*9880d681SAndroid Build Coastguard Worker bits<9> src2 = !if(HasSrc2, ?, 0); 1851*9880d681SAndroid Build Coastguard Worker} 1852*9880d681SAndroid Build Coastguard Worker 1853*9880d681SAndroid Build Coastguard Workerclass VOP3DisableModFields <bit HasSrc0Mods, 1854*9880d681SAndroid Build Coastguard Worker bit HasSrc1Mods = 0, 1855*9880d681SAndroid Build Coastguard Worker bit HasSrc2Mods = 0, 1856*9880d681SAndroid Build Coastguard Worker bit HasOutputMods = 0> { 1857*9880d681SAndroid Build Coastguard Worker bits<2> src0_modifiers = !if(HasSrc0Mods, ?, 0); 1858*9880d681SAndroid Build Coastguard Worker bits<2> src1_modifiers = !if(HasSrc1Mods, ?, 0); 1859*9880d681SAndroid Build Coastguard Worker bits<2> src2_modifiers = !if(HasSrc2Mods, ?, 0); 1860*9880d681SAndroid Build Coastguard Worker bits<2> omod = !if(HasOutputMods, ?, 0); 1861*9880d681SAndroid Build Coastguard Worker bits<1> clamp = !if(HasOutputMods, ?, 0); 1862*9880d681SAndroid Build Coastguard Worker} 1863*9880d681SAndroid Build Coastguard Worker 1864*9880d681SAndroid Build Coastguard Workerclass VOP3_Pseudo <dag outs, dag ins, list<dag> pattern, string opName, 1865*9880d681SAndroid Build Coastguard Worker bit HasMods = 0, bit VOP3Only = 0> : 1866*9880d681SAndroid Build Coastguard Worker VOP3Common <outs, ins, "", pattern, HasMods, VOP3Only>, 1867*9880d681SAndroid Build Coastguard Worker VOP <opName>, 1868*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName#"_e64", SIEncodingFamily.NONE>, 1869*9880d681SAndroid Build Coastguard Worker MnemonicAlias<opName#"_e64", opName> { 1870*9880d681SAndroid Build Coastguard Worker let isPseudo = 1; 1871*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1; 1872*9880d681SAndroid Build Coastguard Worker 1873*9880d681SAndroid Build Coastguard Worker field bit vdst; 1874*9880d681SAndroid Build Coastguard Worker field bit src0; 1875*9880d681SAndroid Build Coastguard Worker} 1876*9880d681SAndroid Build Coastguard Worker 1877*9880d681SAndroid Build Coastguard Workerclass VOP3_Real_si <bits<9> op, dag outs, dag ins, string asm, string opName, 1878*9880d681SAndroid Build Coastguard Worker bit HasMods = 0, bit VOP3Only = 0> : 1879*9880d681SAndroid Build Coastguard Worker VOP3Common <outs, ins, asm, [], HasMods, VOP3Only>, 1880*9880d681SAndroid Build Coastguard Worker VOP3e <op>, 1881*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName#"_e64", SIEncodingFamily.SI> { 1882*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isSICI]; 1883*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 1884*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 1885*9880d681SAndroid Build Coastguard Worker} 1886*9880d681SAndroid Build Coastguard Worker 1887*9880d681SAndroid Build Coastguard Workerclass VOP3_Real_vi <bits<10> op, dag outs, dag ins, string asm, string opName, 1888*9880d681SAndroid Build Coastguard Worker bit HasMods = 0, bit VOP3Only = 0> : 1889*9880d681SAndroid Build Coastguard Worker VOP3Common <outs, ins, asm, [], HasMods, VOP3Only>, 1890*9880d681SAndroid Build Coastguard Worker VOP3e_vi <op>, 1891*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName#"_e64", SIEncodingFamily.VI> { 1892*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 1893*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 1894*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 1895*9880d681SAndroid Build Coastguard Worker} 1896*9880d681SAndroid Build Coastguard Worker 1897*9880d681SAndroid Build Coastguard Workerclass VOP3_C_Real_si <bits<9> op, dag outs, dag ins, string asm, string opName, 1898*9880d681SAndroid Build Coastguard Worker bit HasMods = 0, bit VOP3Only = 0> : 1899*9880d681SAndroid Build Coastguard Worker VOP3Common <outs, ins, asm, [], HasMods, VOP3Only>, 1900*9880d681SAndroid Build Coastguard Worker VOP3ce <op>, 1901*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName#"_e64", SIEncodingFamily.SI> { 1902*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isSICI]; 1903*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 1904*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 1905*9880d681SAndroid Build Coastguard Worker} 1906*9880d681SAndroid Build Coastguard Worker 1907*9880d681SAndroid Build Coastguard Workerclass VOP3_C_Real_vi <bits<10> op, dag outs, dag ins, string asm, string opName, 1908*9880d681SAndroid Build Coastguard Worker bit HasMods = 0, bit VOP3Only = 0> : 1909*9880d681SAndroid Build Coastguard Worker VOP3Common <outs, ins, asm, [], HasMods, VOP3Only>, 1910*9880d681SAndroid Build Coastguard Worker VOP3ce_vi <op>, 1911*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName#"_e64", SIEncodingFamily.VI> { 1912*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 1913*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 1914*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 1915*9880d681SAndroid Build Coastguard Worker} 1916*9880d681SAndroid Build Coastguard Worker 1917*9880d681SAndroid Build Coastguard Workerclass VOP3b_Real_si <bits<9> op, dag outs, dag ins, string asm, string opName, 1918*9880d681SAndroid Build Coastguard Worker bit HasMods = 0, bit VOP3Only = 0> : 1919*9880d681SAndroid Build Coastguard Worker VOP3Common <outs, ins, asm, [], HasMods, VOP3Only>, 1920*9880d681SAndroid Build Coastguard Worker VOP3be <op>, 1921*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName#"_e64", SIEncodingFamily.SI> { 1922*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isSICI]; 1923*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 1924*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 1925*9880d681SAndroid Build Coastguard Worker} 1926*9880d681SAndroid Build Coastguard Worker 1927*9880d681SAndroid Build Coastguard Workerclass VOP3b_Real_vi <bits<10> op, dag outs, dag ins, string asm, string opName, 1928*9880d681SAndroid Build Coastguard Worker bit HasMods = 0, bit VOP3Only = 0> : 1929*9880d681SAndroid Build Coastguard Worker VOP3Common <outs, ins, asm, [], HasMods, VOP3Only>, 1930*9880d681SAndroid Build Coastguard Worker VOP3be_vi <op>, 1931*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName#"_e64", SIEncodingFamily.VI> { 1932*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 1933*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 1934*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 1935*9880d681SAndroid Build Coastguard Worker} 1936*9880d681SAndroid Build Coastguard Worker 1937*9880d681SAndroid Build Coastguard Workerclass VOP3e_Real_si <bits<9> op, dag outs, dag ins, string asm, string opName, 1938*9880d681SAndroid Build Coastguard Worker bit HasMods = 0, bit VOP3Only = 0> : 1939*9880d681SAndroid Build Coastguard Worker VOP3Common <outs, ins, asm, [], HasMods, VOP3Only>, 1940*9880d681SAndroid Build Coastguard Worker VOP3e <op>, 1941*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName#"_e64", SIEncodingFamily.SI> { 1942*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isSICI]; 1943*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 1944*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 1945*9880d681SAndroid Build Coastguard Worker} 1946*9880d681SAndroid Build Coastguard Worker 1947*9880d681SAndroid Build Coastguard Workerclass VOP3e_Real_vi <bits<10> op, dag outs, dag ins, string asm, string opName, 1948*9880d681SAndroid Build Coastguard Worker bit HasMods = 0, bit VOP3Only = 0> : 1949*9880d681SAndroid Build Coastguard Worker VOP3Common <outs, ins, asm, [], HasMods, VOP3Only>, 1950*9880d681SAndroid Build Coastguard Worker VOP3e_vi <op>, 1951*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName#"_e64", SIEncodingFamily.VI> { 1952*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 1953*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 1954*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 1955*9880d681SAndroid Build Coastguard Worker} 1956*9880d681SAndroid Build Coastguard Worker 1957*9880d681SAndroid Build Coastguard Workermulticlass VOP3_m <vop op, dag outs, dag ins, string asm, list<dag> pattern, 1958*9880d681SAndroid Build Coastguard Worker string opName, int NumSrcArgs, bit HasMods = 1, bit VOP3Only = 0> { 1959*9880d681SAndroid Build Coastguard Worker 1960*9880d681SAndroid Build Coastguard Worker def "" : VOP3_Pseudo <outs, ins, pattern, opName>; 1961*9880d681SAndroid Build Coastguard Worker 1962*9880d681SAndroid Build Coastguard Worker def _si : VOP3_Real_si <op.SI3, outs, ins, asm, opName, HasMods, VOP3Only>, 1963*9880d681SAndroid Build Coastguard Worker VOP3DisableFields<!if(!eq(NumSrcArgs, 1), 0, 1), 1964*9880d681SAndroid Build Coastguard Worker !if(!eq(NumSrcArgs, 2), 0, 1), 1965*9880d681SAndroid Build Coastguard Worker HasMods>; 1966*9880d681SAndroid Build Coastguard Worker def _vi : VOP3_Real_vi <op.VI3, outs, ins, asm, opName, HasMods, VOP3Only>, 1967*9880d681SAndroid Build Coastguard Worker VOP3DisableFields<!if(!eq(NumSrcArgs, 1), 0, 1), 1968*9880d681SAndroid Build Coastguard Worker !if(!eq(NumSrcArgs, 2), 0, 1), 1969*9880d681SAndroid Build Coastguard Worker HasMods>; 1970*9880d681SAndroid Build Coastguard Worker} 1971*9880d681SAndroid Build Coastguard Worker 1972*9880d681SAndroid Build Coastguard Workermulticlass VOP3_1_m <vop op, dag outs, dag ins, string asm, 1973*9880d681SAndroid Build Coastguard Worker list<dag> pattern, string opName, bit HasMods = 1> { 1974*9880d681SAndroid Build Coastguard Worker 1975*9880d681SAndroid Build Coastguard Worker def "" : VOP3_Pseudo <outs, ins, pattern, opName, HasMods>; 1976*9880d681SAndroid Build Coastguard Worker 1977*9880d681SAndroid Build Coastguard Worker def _si : VOP3_Real_si <op.SI3, outs, ins, asm, opName, HasMods>, 1978*9880d681SAndroid Build Coastguard Worker VOP3DisableFields<0, 0, HasMods>; 1979*9880d681SAndroid Build Coastguard Worker 1980*9880d681SAndroid Build Coastguard Worker def _vi : VOP3_Real_vi <op.VI3, outs, ins, asm, opName, HasMods>, 1981*9880d681SAndroid Build Coastguard Worker VOP3DisableFields<0, 0, HasMods>; 1982*9880d681SAndroid Build Coastguard Worker} 1983*9880d681SAndroid Build Coastguard Worker 1984*9880d681SAndroid Build Coastguard Workermulticlass VOP3SI_1_m <vop op, dag outs, dag ins, string asm, 1985*9880d681SAndroid Build Coastguard Worker list<dag> pattern, string opName, bit HasMods = 1> { 1986*9880d681SAndroid Build Coastguard Worker 1987*9880d681SAndroid Build Coastguard Worker def "" : VOP3_Pseudo <outs, ins, pattern, opName, HasMods>; 1988*9880d681SAndroid Build Coastguard Worker 1989*9880d681SAndroid Build Coastguard Worker def _si : VOP3_Real_si <op.SI3, outs, ins, asm, opName, HasMods>, 1990*9880d681SAndroid Build Coastguard Worker VOP3DisableFields<0, 0, HasMods>; 1991*9880d681SAndroid Build Coastguard Worker // No VI instruction. This class is for SI only. 1992*9880d681SAndroid Build Coastguard Worker} 1993*9880d681SAndroid Build Coastguard Worker 1994*9880d681SAndroid Build Coastguard Workermulticlass VOP3_2_m <vop op, dag outs, dag ins, string asm, 1995*9880d681SAndroid Build Coastguard Worker list<dag> pattern, string opName, string revOp, 1996*9880d681SAndroid Build Coastguard Worker bit HasMods = 1> { 1997*9880d681SAndroid Build Coastguard Worker 1998*9880d681SAndroid Build Coastguard Worker def "" : VOP3_Pseudo <outs, ins, pattern, opName, HasMods>, 1999*9880d681SAndroid Build Coastguard Worker VOP2_REV<revOp#"_e64", !eq(revOp, opName)>; 2000*9880d681SAndroid Build Coastguard Worker 2001*9880d681SAndroid Build Coastguard Worker def _si : VOP3_Real_si <op.SI3, outs, ins, asm, opName, HasMods>, 2002*9880d681SAndroid Build Coastguard Worker VOP3DisableFields<1, 0, HasMods>; 2003*9880d681SAndroid Build Coastguard Worker 2004*9880d681SAndroid Build Coastguard Worker def _vi : VOP3_Real_vi <op.VI3, outs, ins, asm, opName, HasMods>, 2005*9880d681SAndroid Build Coastguard Worker VOP3DisableFields<1, 0, HasMods>; 2006*9880d681SAndroid Build Coastguard Worker} 2007*9880d681SAndroid Build Coastguard Worker 2008*9880d681SAndroid Build Coastguard Workermulticlass VOP3SI_2_m <vop op, dag outs, dag ins, string asm, 2009*9880d681SAndroid Build Coastguard Worker list<dag> pattern, string opName, string revOp, 2010*9880d681SAndroid Build Coastguard Worker bit HasMods = 1> { 2011*9880d681SAndroid Build Coastguard Worker 2012*9880d681SAndroid Build Coastguard Worker def "" : VOP3_Pseudo <outs, ins, pattern, opName, HasMods>, 2013*9880d681SAndroid Build Coastguard Worker VOP2_REV<revOp#"_e64", !eq(revOp, opName)>; 2014*9880d681SAndroid Build Coastguard Worker 2015*9880d681SAndroid Build Coastguard Worker def _si : VOP3_Real_si <op.SI3, outs, ins, asm, opName, HasMods>, 2016*9880d681SAndroid Build Coastguard Worker VOP3DisableFields<1, 0, HasMods>; 2017*9880d681SAndroid Build Coastguard Worker 2018*9880d681SAndroid Build Coastguard Worker // No VI instruction. This class is for SI only. 2019*9880d681SAndroid Build Coastguard Worker} 2020*9880d681SAndroid Build Coastguard Worker 2021*9880d681SAndroid Build Coastguard Worker// Two operand VOP3b instruction that may have a 3rd SGPR bool operand 2022*9880d681SAndroid Build Coastguard Worker// instead of an implicit VCC as in the VOP2b format. 2023*9880d681SAndroid Build Coastguard Workermulticlass VOP3b_2_3_m <vop op, dag outs, dag ins, string asm, 2024*9880d681SAndroid Build Coastguard Worker list<dag> pattern, string opName, string revOp, 2025*9880d681SAndroid Build Coastguard Worker bit HasMods = 1, bit useSrc2Input = 0, bit VOP3Only = 0> { 2026*9880d681SAndroid Build Coastguard Worker def "" : VOP3_Pseudo <outs, ins, pattern, opName, HasMods, VOP3Only>; 2027*9880d681SAndroid Build Coastguard Worker 2028*9880d681SAndroid Build Coastguard Worker def _si : VOP3b_Real_si <op.SI3, outs, ins, asm, opName, HasMods, VOP3Only>, 2029*9880d681SAndroid Build Coastguard Worker VOP3DisableFields<1, useSrc2Input, HasMods>; 2030*9880d681SAndroid Build Coastguard Worker 2031*9880d681SAndroid Build Coastguard Worker def _vi : VOP3b_Real_vi <op.VI3, outs, ins, asm, opName, HasMods, VOP3Only>, 2032*9880d681SAndroid Build Coastguard Worker VOP3DisableFields<1, useSrc2Input, HasMods>; 2033*9880d681SAndroid Build Coastguard Worker} 2034*9880d681SAndroid Build Coastguard Worker 2035*9880d681SAndroid Build Coastguard Worker// Same as VOP3b_2_3_m but no 2nd destination (sdst), e.g. v_cndmask_b32. 2036*9880d681SAndroid Build Coastguard Workermulticlass VOP3e_2_3_m <vop op, dag outs, dag ins, string asm, 2037*9880d681SAndroid Build Coastguard Worker list<dag> pattern, string opName, string revOp, 2038*9880d681SAndroid Build Coastguard Worker bit HasMods = 1, bit useSrc2Input = 0, bit VOP3Only = 0> { 2039*9880d681SAndroid Build Coastguard Worker def "" : VOP3_Pseudo <outs, ins, pattern, opName, HasMods, VOP3Only>; 2040*9880d681SAndroid Build Coastguard Worker 2041*9880d681SAndroid Build Coastguard Worker def _si : VOP3e_Real_si <op.SI3, outs, ins, asm, opName, HasMods, VOP3Only>, 2042*9880d681SAndroid Build Coastguard Worker VOP3DisableFields<1, useSrc2Input, HasMods>; 2043*9880d681SAndroid Build Coastguard Worker 2044*9880d681SAndroid Build Coastguard Worker def _vi : VOP3e_Real_vi <op.VI3, outs, ins, asm, opName, HasMods, VOP3Only>, 2045*9880d681SAndroid Build Coastguard Worker VOP3DisableFields<1, useSrc2Input, HasMods>; 2046*9880d681SAndroid Build Coastguard Worker} 2047*9880d681SAndroid Build Coastguard Worker 2048*9880d681SAndroid Build Coastguard Workermulticlass VOP3_C_m <vop op, dag outs, dag ins, string asm, 2049*9880d681SAndroid Build Coastguard Worker list<dag> pattern, string opName, 2050*9880d681SAndroid Build Coastguard Worker bit HasMods, bit defExec, 2051*9880d681SAndroid Build Coastguard Worker string revOp, list<SchedReadWrite> sched> { 2052*9880d681SAndroid Build Coastguard Worker 2053*9880d681SAndroid Build Coastguard Worker def "" : VOP3_Pseudo <outs, ins, pattern, opName, HasMods>, 2054*9880d681SAndroid Build Coastguard Worker VOP2_REV<revOp#"_e64", !eq(revOp, opName)> { 2055*9880d681SAndroid Build Coastguard Worker let Defs = !if(defExec, [EXEC], []); 2056*9880d681SAndroid Build Coastguard Worker let SchedRW = sched; 2057*9880d681SAndroid Build Coastguard Worker } 2058*9880d681SAndroid Build Coastguard Worker 2059*9880d681SAndroid Build Coastguard Worker def _si : VOP3_C_Real_si <op.SI3, outs, ins, asm, opName, HasMods>, 2060*9880d681SAndroid Build Coastguard Worker VOP3DisableFields<1, 0, HasMods> { 2061*9880d681SAndroid Build Coastguard Worker let Defs = !if(defExec, [EXEC], []); 2062*9880d681SAndroid Build Coastguard Worker let SchedRW = sched; 2063*9880d681SAndroid Build Coastguard Worker } 2064*9880d681SAndroid Build Coastguard Worker 2065*9880d681SAndroid Build Coastguard Worker def _vi : VOP3_C_Real_vi <op.VI3, outs, ins, asm, opName, HasMods>, 2066*9880d681SAndroid Build Coastguard Worker VOP3DisableFields<1, 0, HasMods> { 2067*9880d681SAndroid Build Coastguard Worker let Defs = !if(defExec, [EXEC], []); 2068*9880d681SAndroid Build Coastguard Worker let SchedRW = sched; 2069*9880d681SAndroid Build Coastguard Worker } 2070*9880d681SAndroid Build Coastguard Worker} 2071*9880d681SAndroid Build Coastguard Worker 2072*9880d681SAndroid Build Coastguard Worker// An instruction that is VOP2 on SI and VOP3 on VI, no modifiers. 2073*9880d681SAndroid Build Coastguard Workermulticlass VOP2SI_3VI_m <vop3 op, string opName, dag outs, dag ins, 2074*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pattern = []> { 2075*9880d681SAndroid Build Coastguard Worker let isPseudo = 1, isCodeGenOnly = 1 in { 2076*9880d681SAndroid Build Coastguard Worker def "" : VOPAnyCommon <outs, ins, "", pattern>, 2077*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.NONE>; 2078*9880d681SAndroid Build Coastguard Worker } 2079*9880d681SAndroid Build Coastguard Worker 2080*9880d681SAndroid Build Coastguard Worker def _si : VOP2 <op.SI3{5-0}, outs, ins, asm, []>, 2081*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName, SIEncodingFamily.SI> { 2082*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isSICI]; 2083*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 2084*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 2085*9880d681SAndroid Build Coastguard Worker } 2086*9880d681SAndroid Build Coastguard Worker 2087*9880d681SAndroid Build Coastguard Worker def _vi : VOP3Common <outs, ins, asm, []>, 2088*9880d681SAndroid Build Coastguard Worker VOP3e_vi <op.VI3>, 2089*9880d681SAndroid Build Coastguard Worker VOP3DisableFields <1, 0, 0>, 2090*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName, SIEncodingFamily.VI> { 2091*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 2092*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 2093*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 2094*9880d681SAndroid Build Coastguard Worker } 2095*9880d681SAndroid Build Coastguard Worker} 2096*9880d681SAndroid Build Coastguard Worker 2097*9880d681SAndroid Build Coastguard Workermulticlass VOP1_Helper <vop1 op, string opName, VOPProfile p, list<dag> pat32, 2098*9880d681SAndroid Build Coastguard Worker list<dag> pat64> { 2099*9880d681SAndroid Build Coastguard Worker 2100*9880d681SAndroid Build Coastguard Worker defm _e32 : VOP1_m <op, opName, p, pat32>; 2101*9880d681SAndroid Build Coastguard Worker 2102*9880d681SAndroid Build Coastguard Worker defm _e64 : VOP3_1_m <op, p.Outs, p.Ins64, opName#p.Asm64, pat64, opName, 2103*9880d681SAndroid Build Coastguard Worker p.HasModifiers>; 2104*9880d681SAndroid Build Coastguard Worker 2105*9880d681SAndroid Build Coastguard Worker def _dpp : VOP1_DPP <op, opName, p>; 2106*9880d681SAndroid Build Coastguard Worker 2107*9880d681SAndroid Build Coastguard Worker def _sdwa : VOP1_SDWA <op, opName, p>; 2108*9880d681SAndroid Build Coastguard Worker} 2109*9880d681SAndroid Build Coastguard Worker 2110*9880d681SAndroid Build Coastguard Workermulticlass VOP1Inst <vop1 op, string opName, VOPProfile P, 2111*9880d681SAndroid Build Coastguard Worker SDPatternOperator node = null_frag> : VOP1_Helper < 2112*9880d681SAndroid Build Coastguard Worker op, opName, P, [], 2113*9880d681SAndroid Build Coastguard Worker !if(P.HasModifiers, 2114*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, 2115*9880d681SAndroid Build Coastguard Worker i32:$src0_modifiers, i1:$clamp, i32:$omod))))], 2116*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, (node P.Src0VT:$src0))]) 2117*9880d681SAndroid Build Coastguard Worker>; 2118*9880d681SAndroid Build Coastguard Worker 2119*9880d681SAndroid Build Coastguard Workermulticlass VOP1InstSI <vop1 op, string opName, VOPProfile P, 2120*9880d681SAndroid Build Coastguard Worker SDPatternOperator node = null_frag> { 2121*9880d681SAndroid Build Coastguard Worker 2122*9880d681SAndroid Build Coastguard Worker defm _e32 : VOP1SI_m <op, opName, P, []>; 2123*9880d681SAndroid Build Coastguard Worker 2124*9880d681SAndroid Build Coastguard Worker defm _e64 : VOP3SI_1_m <op, P.Outs, P.Ins64, opName#P.Asm64, 2125*9880d681SAndroid Build Coastguard Worker !if(P.HasModifiers, 2126*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, 2127*9880d681SAndroid Build Coastguard Worker i32:$src0_modifiers, i1:$clamp, i32:$omod))))], 2128*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, (node P.Src0VT:$src0))]), 2129*9880d681SAndroid Build Coastguard Worker opName, P.HasModifiers>; 2130*9880d681SAndroid Build Coastguard Worker} 2131*9880d681SAndroid Build Coastguard Worker 2132*9880d681SAndroid Build Coastguard Workermulticlass VOP2_Helper <vop2 op, string opName, VOPProfile p, list<dag> pat32, 2133*9880d681SAndroid Build Coastguard Worker list<dag> pat64, string revOp> { 2134*9880d681SAndroid Build Coastguard Worker 2135*9880d681SAndroid Build Coastguard Worker defm _e32 : VOP2_m <op, opName, p, pat32, revOp>; 2136*9880d681SAndroid Build Coastguard Worker 2137*9880d681SAndroid Build Coastguard Worker defm _e64 : VOP3_2_m <op, p.Outs, p.Ins64, opName#p.Asm64, pat64, opName, 2138*9880d681SAndroid Build Coastguard Worker revOp, p.HasModifiers>; 2139*9880d681SAndroid Build Coastguard Worker 2140*9880d681SAndroid Build Coastguard Worker def _dpp : VOP2_DPP <op, opName, p>; 2141*9880d681SAndroid Build Coastguard Worker 2142*9880d681SAndroid Build Coastguard Worker def _sdwa : VOP2_SDWA <op, opName, p>; 2143*9880d681SAndroid Build Coastguard Worker} 2144*9880d681SAndroid Build Coastguard Worker 2145*9880d681SAndroid Build Coastguard Workermulticlass VOP2Inst <vop2 op, string opName, VOPProfile P, 2146*9880d681SAndroid Build Coastguard Worker SDPatternOperator node = null_frag, 2147*9880d681SAndroid Build Coastguard Worker string revOp = opName> : VOP2_Helper < 2148*9880d681SAndroid Build Coastguard Worker op, opName, P, [], 2149*9880d681SAndroid Build Coastguard Worker !if(P.HasModifiers, 2150*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, 2151*9880d681SAndroid Build Coastguard Worker (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, 2152*9880d681SAndroid Build Coastguard Worker i1:$clamp, i32:$omod)), 2153*9880d681SAndroid Build Coastguard Worker (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers))))], 2154*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, (node P.Src0VT:$src0, P.Src1VT:$src1))]), 2155*9880d681SAndroid Build Coastguard Worker revOp 2156*9880d681SAndroid Build Coastguard Worker>; 2157*9880d681SAndroid Build Coastguard Worker 2158*9880d681SAndroid Build Coastguard Workermulticlass VOP2InstSI <vop2 op, string opName, VOPProfile P, 2159*9880d681SAndroid Build Coastguard Worker SDPatternOperator node = null_frag, 2160*9880d681SAndroid Build Coastguard Worker string revOp = opName> { 2161*9880d681SAndroid Build Coastguard Worker 2162*9880d681SAndroid Build Coastguard Worker defm _e32 : VOP2SI_m <op, opName, P, [], revOp>; 2163*9880d681SAndroid Build Coastguard Worker 2164*9880d681SAndroid Build Coastguard Worker defm _e64 : VOP3SI_2_m <op, P.Outs, P.Ins64, opName#P.Asm64, 2165*9880d681SAndroid Build Coastguard Worker !if(P.HasModifiers, 2166*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, 2167*9880d681SAndroid Build Coastguard Worker (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, 2168*9880d681SAndroid Build Coastguard Worker i1:$clamp, i32:$omod)), 2169*9880d681SAndroid Build Coastguard Worker (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers))))], 2170*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, (node P.Src0VT:$src0, P.Src1VT:$src1))]), 2171*9880d681SAndroid Build Coastguard Worker opName, revOp, P.HasModifiers>; 2172*9880d681SAndroid Build Coastguard Worker} 2173*9880d681SAndroid Build Coastguard Worker 2174*9880d681SAndroid Build Coastguard Workermulticlass VOP2e_Helper <vop2 op, string opName, VOPProfile p, 2175*9880d681SAndroid Build Coastguard Worker list<dag> pat32, list<dag> pat64, 2176*9880d681SAndroid Build Coastguard Worker string revOp, bit useSGPRInput> { 2177*9880d681SAndroid Build Coastguard Worker 2178*9880d681SAndroid Build Coastguard Worker let SchedRW = [Write32Bit] in { 2179*9880d681SAndroid Build Coastguard Worker let Uses = !if(useSGPRInput, [VCC, EXEC], [EXEC]) in { 2180*9880d681SAndroid Build Coastguard Worker defm _e32 : VOP2_m <op, opName, p, pat32, revOp>; 2181*9880d681SAndroid Build Coastguard Worker } 2182*9880d681SAndroid Build Coastguard Worker 2183*9880d681SAndroid Build Coastguard Worker defm _e64 : VOP3e_2_3_m <op, p.Outs64, p.Ins64, opName#p.Asm64, pat64, 2184*9880d681SAndroid Build Coastguard Worker opName, revOp, p.HasModifiers, useSGPRInput>; 2185*9880d681SAndroid Build Coastguard Worker } 2186*9880d681SAndroid Build Coastguard Worker} 2187*9880d681SAndroid Build Coastguard Worker 2188*9880d681SAndroid Build Coastguard Workermulticlass VOP2eInst <vop2 op, string opName, VOPProfile P, 2189*9880d681SAndroid Build Coastguard Worker SDPatternOperator node = null_frag, 2190*9880d681SAndroid Build Coastguard Worker string revOp = opName> : VOP2e_Helper < 2191*9880d681SAndroid Build Coastguard Worker op, opName, P, [], 2192*9880d681SAndroid Build Coastguard Worker !if(P.HasModifiers, 2193*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, 2194*9880d681SAndroid Build Coastguard Worker (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, 2195*9880d681SAndroid Build Coastguard Worker i1:$clamp, i32:$omod)), 2196*9880d681SAndroid Build Coastguard Worker (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers))))], 2197*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, (node P.Src0VT:$src0, P.Src1VT:$src1))]), 2198*9880d681SAndroid Build Coastguard Worker revOp, !eq(P.NumSrcArgs, 3) 2199*9880d681SAndroid Build Coastguard Worker>; 2200*9880d681SAndroid Build Coastguard Worker 2201*9880d681SAndroid Build Coastguard Workermulticlass VOP2b_Helper <vop2 op, string opName, VOPProfile p, 2202*9880d681SAndroid Build Coastguard Worker list<dag> pat32, list<dag> pat64, 2203*9880d681SAndroid Build Coastguard Worker string revOp, bit useSGPRInput> { 2204*9880d681SAndroid Build Coastguard Worker 2205*9880d681SAndroid Build Coastguard Worker let SchedRW = [Write32Bit, WriteSALU] in { 2206*9880d681SAndroid Build Coastguard Worker let Uses = !if(useSGPRInput, [VCC, EXEC], [EXEC]), Defs = [VCC] in { 2207*9880d681SAndroid Build Coastguard Worker defm _e32 : VOP2_m <op, opName, p, pat32, revOp>; 2208*9880d681SAndroid Build Coastguard Worker } 2209*9880d681SAndroid Build Coastguard Worker 2210*9880d681SAndroid Build Coastguard Worker defm _e64 : VOP3b_2_3_m <op, p.Outs64, p.Ins64, opName#p.Asm64, pat64, 2211*9880d681SAndroid Build Coastguard Worker opName, revOp, p.HasModifiers, useSGPRInput>; 2212*9880d681SAndroid Build Coastguard Worker } 2213*9880d681SAndroid Build Coastguard Worker} 2214*9880d681SAndroid Build Coastguard Worker 2215*9880d681SAndroid Build Coastguard Workermulticlass VOP2bInst <vop2 op, string opName, VOPProfile P, 2216*9880d681SAndroid Build Coastguard Worker SDPatternOperator node = null_frag, 2217*9880d681SAndroid Build Coastguard Worker string revOp = opName> : VOP2b_Helper < 2218*9880d681SAndroid Build Coastguard Worker op, opName, P, [], 2219*9880d681SAndroid Build Coastguard Worker !if(P.HasModifiers, 2220*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, 2221*9880d681SAndroid Build Coastguard Worker (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, 2222*9880d681SAndroid Build Coastguard Worker i1:$clamp, i32:$omod)), 2223*9880d681SAndroid Build Coastguard Worker (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers))))], 2224*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, (node P.Src0VT:$src0, P.Src1VT:$src1))]), 2225*9880d681SAndroid Build Coastguard Worker revOp, !eq(P.NumSrcArgs, 3) 2226*9880d681SAndroid Build Coastguard Worker>; 2227*9880d681SAndroid Build Coastguard Worker 2228*9880d681SAndroid Build Coastguard Worker// A VOP2 instruction that is VOP3-only on VI. 2229*9880d681SAndroid Build Coastguard Workermulticlass VOP2_VI3_Helper <vop23 op, string opName, VOPProfile p, 2230*9880d681SAndroid Build Coastguard Worker list<dag> pat32, list<dag> pat64, string revOp> { 2231*9880d681SAndroid Build Coastguard Worker 2232*9880d681SAndroid Build Coastguard Worker defm _e32 : VOP2SI_m <op, opName, p, pat32, revOp>; 2233*9880d681SAndroid Build Coastguard Worker 2234*9880d681SAndroid Build Coastguard Worker defm _e64 : VOP3_2_m <op, p.Outs, p.Ins64, opName#p.Asm64, pat64, opName, 2235*9880d681SAndroid Build Coastguard Worker revOp, p.HasModifiers>; 2236*9880d681SAndroid Build Coastguard Worker} 2237*9880d681SAndroid Build Coastguard Worker 2238*9880d681SAndroid Build Coastguard Workermulticlass VOP2_VI3_Inst <vop23 op, string opName, VOPProfile P, 2239*9880d681SAndroid Build Coastguard Worker SDPatternOperator node = null_frag, 2240*9880d681SAndroid Build Coastguard Worker string revOp = opName> 2241*9880d681SAndroid Build Coastguard Worker : VOP2_VI3_Helper < 2242*9880d681SAndroid Build Coastguard Worker op, opName, P, [], 2243*9880d681SAndroid Build Coastguard Worker !if(P.HasModifiers, 2244*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, 2245*9880d681SAndroid Build Coastguard Worker (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, 2246*9880d681SAndroid Build Coastguard Worker i1:$clamp, i32:$omod)), 2247*9880d681SAndroid Build Coastguard Worker (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers))))], 2248*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, (node P.Src0VT:$src0, P.Src1VT:$src1))]), 2249*9880d681SAndroid Build Coastguard Worker revOp 2250*9880d681SAndroid Build Coastguard Worker>; 2251*9880d681SAndroid Build Coastguard Worker 2252*9880d681SAndroid Build Coastguard Workermulticlass VOP2MADK <vop2 op, string opName, VOPProfile P, list<dag> pattern = []> { 2253*9880d681SAndroid Build Coastguard Worker 2254*9880d681SAndroid Build Coastguard Worker def "" : VOP2_Pseudo <P.Outs, P.Ins32, pattern, opName>; 2255*9880d681SAndroid Build Coastguard Worker 2256*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 0 in { 2257*9880d681SAndroid Build Coastguard Worker def _si : VOP2Common <P.Outs, P.Ins32, 2258*9880d681SAndroid Build Coastguard Worker !strconcat(opName, P.Asm32), []>, 2259*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName#"_e32", SIEncodingFamily.SI>, 2260*9880d681SAndroid Build Coastguard Worker VOP2_MADKe <op.SI> { 2261*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isSICI]; 2262*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 2263*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 2264*9880d681SAndroid Build Coastguard Worker } 2265*9880d681SAndroid Build Coastguard Worker 2266*9880d681SAndroid Build Coastguard Worker def _vi : VOP2Common <P.Outs, P.Ins32, 2267*9880d681SAndroid Build Coastguard Worker !strconcat(opName, P.Asm32), []>, 2268*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName#"_e32", SIEncodingFamily.VI>, 2269*9880d681SAndroid Build Coastguard Worker VOP2_MADKe <op.VI> { 2270*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 2271*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 2272*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 2273*9880d681SAndroid Build Coastguard Worker } 2274*9880d681SAndroid Build Coastguard Worker} // End isCodeGenOnly = 0 2275*9880d681SAndroid Build Coastguard Worker} 2276*9880d681SAndroid Build Coastguard Worker 2277*9880d681SAndroid Build Coastguard Workerclass VOPC_Pseudo <dag ins, list<dag> pattern, string opName> : 2278*9880d681SAndroid Build Coastguard Worker VOPCCommon <ins, "", pattern>, 2279*9880d681SAndroid Build Coastguard Worker VOP <opName>, 2280*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName#"_e32", SIEncodingFamily.NONE> { 2281*9880d681SAndroid Build Coastguard Worker let isPseudo = 1; 2282*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1; 2283*9880d681SAndroid Build Coastguard Worker} 2284*9880d681SAndroid Build Coastguard Worker 2285*9880d681SAndroid Build Coastguard Workerclass VOPC_SDWA <vopc op, string opName, bit DefExec, VOPProfile p> : 2286*9880d681SAndroid Build Coastguard Worker VOPC_SDWAe <op.VI>, 2287*9880d681SAndroid Build Coastguard Worker VOP_SDWA <p.OutsSDWA, p.InsSDWA, opName#p.AsmSDWA, [], p.HasModifiers>, 2288*9880d681SAndroid Build Coastguard Worker SDWADisableFields <p> { 2289*9880d681SAndroid Build Coastguard Worker let Defs = !if(DefExec, [VCC, EXEC], [VCC]); 2290*9880d681SAndroid Build Coastguard Worker let hasSideEffects = DefExec; 2291*9880d681SAndroid Build Coastguard Worker let AsmMatchConverter = "cvtSdwaVOPC"; 2292*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = !if(p.HasExt, [isVI], [DisableInst]); 2293*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SDWA"; 2294*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 2295*9880d681SAndroid Build Coastguard Worker} 2296*9880d681SAndroid Build Coastguard Worker 2297*9880d681SAndroid Build Coastguard Workermulticlass VOPC_m <vopc op, dag ins, string op_asm, list<dag> pattern, 2298*9880d681SAndroid Build Coastguard Worker string opName, bit DefExec, VOPProfile p, 2299*9880d681SAndroid Build Coastguard Worker list<SchedReadWrite> sched, 2300*9880d681SAndroid Build Coastguard Worker string revOpName = "", string asm = opName#"_e32 "#op_asm, 2301*9880d681SAndroid Build Coastguard Worker string alias_asm = opName#" "#op_asm> { 2302*9880d681SAndroid Build Coastguard Worker def "" : VOPC_Pseudo <ins, pattern, opName>, 2303*9880d681SAndroid Build Coastguard Worker VOP2_REV<revOpName#"_e32", !eq(revOpName, opName)> { 2304*9880d681SAndroid Build Coastguard Worker let Defs = !if(DefExec, [VCC, EXEC], [VCC]); 2305*9880d681SAndroid Build Coastguard Worker let SchedRW = sched; 2306*9880d681SAndroid Build Coastguard Worker let isConvergent = DefExec; 2307*9880d681SAndroid Build Coastguard Worker } 2308*9880d681SAndroid Build Coastguard Worker 2309*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isSICI] in { 2310*9880d681SAndroid Build Coastguard Worker def _si : VOPC<op.SI, ins, asm, []>, 2311*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName#"_e32", SIEncodingFamily.SI> { 2312*9880d681SAndroid Build Coastguard Worker let Defs = !if(DefExec, [VCC, EXEC], [VCC]); 2313*9880d681SAndroid Build Coastguard Worker let isConvergent = DefExec; 2314*9880d681SAndroid Build Coastguard Worker let SchedRW = sched; 2315*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 2316*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 2317*9880d681SAndroid Build Coastguard Worker } 2318*9880d681SAndroid Build Coastguard Worker 2319*9880d681SAndroid Build Coastguard Worker } // End AssemblerPredicates = [isSICI] 2320*9880d681SAndroid Build Coastguard Worker 2321*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI] in { 2322*9880d681SAndroid Build Coastguard Worker def _vi : VOPC<op.VI, ins, asm, []>, 2323*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName#"_e32", SIEncodingFamily.VI> { 2324*9880d681SAndroid Build Coastguard Worker let Defs = !if(DefExec, [VCC, EXEC], [VCC]); 2325*9880d681SAndroid Build Coastguard Worker let isConvergent = DefExec; 2326*9880d681SAndroid Build Coastguard Worker let SchedRW = sched; 2327*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 2328*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 2329*9880d681SAndroid Build Coastguard Worker } 2330*9880d681SAndroid Build Coastguard Worker 2331*9880d681SAndroid Build Coastguard Worker } // End AssemblerPredicates = [isVI] 2332*9880d681SAndroid Build Coastguard Worker 2333*9880d681SAndroid Build Coastguard Worker defm : SIInstAliasBuilder<alias_asm, p>; 2334*9880d681SAndroid Build Coastguard Worker} 2335*9880d681SAndroid Build Coastguard Worker 2336*9880d681SAndroid Build Coastguard Workermulticlass VOPC_Helper <vopc op, string opName, list<dag> pat32, 2337*9880d681SAndroid Build Coastguard Worker list<dag> pat64, bit DefExec, string revOp, 2338*9880d681SAndroid Build Coastguard Worker VOPProfile p, list<SchedReadWrite> sched> { 2339*9880d681SAndroid Build Coastguard Worker defm _e32 : VOPC_m <op, p.Ins32, p.Asm32, pat32, opName, DefExec, p, sched, 2340*9880d681SAndroid Build Coastguard Worker revOp>; 2341*9880d681SAndroid Build Coastguard Worker 2342*9880d681SAndroid Build Coastguard Worker defm _e64 : VOP3_C_m <op, (outs VOPDstS64:$sdst), p.Ins64, opName#p.Asm64, pat64, 2343*9880d681SAndroid Build Coastguard Worker opName, p.HasModifiers, DefExec, revOp, sched>; 2344*9880d681SAndroid Build Coastguard Worker 2345*9880d681SAndroid Build Coastguard Worker def _sdwa : VOPC_SDWA <op, opName, DefExec, p>; 2346*9880d681SAndroid Build Coastguard Worker} 2347*9880d681SAndroid Build Coastguard Worker 2348*9880d681SAndroid Build Coastguard Worker// Special case for class instructions which only have modifiers on 2349*9880d681SAndroid Build Coastguard Worker// the 1st source operand. 2350*9880d681SAndroid Build Coastguard Workermulticlass VOPC_Class_Helper <vopc op, string opName, list<dag> pat32, 2351*9880d681SAndroid Build Coastguard Worker list<dag> pat64, bit DefExec, string revOp, 2352*9880d681SAndroid Build Coastguard Worker VOPProfile p, list<SchedReadWrite> sched> { 2353*9880d681SAndroid Build Coastguard Worker defm _e32 : VOPC_m <op, p.Ins32, p.Asm32, pat32, opName, DefExec, p, sched>; 2354*9880d681SAndroid Build Coastguard Worker 2355*9880d681SAndroid Build Coastguard Worker defm _e64 : VOP3_C_m <op, (outs VOPDstS64:$sdst), p.Ins64, opName#p.Asm64, pat64, 2356*9880d681SAndroid Build Coastguard Worker opName, p.HasModifiers, DefExec, revOp, sched>, 2357*9880d681SAndroid Build Coastguard Worker VOP3DisableModFields<1, 0, 0>; 2358*9880d681SAndroid Build Coastguard Worker 2359*9880d681SAndroid Build Coastguard Worker def _sdwa : VOPC_SDWA <op, opName, DefExec, p> { 2360*9880d681SAndroid Build Coastguard Worker let src1_fmodifiers = 0; 2361*9880d681SAndroid Build Coastguard Worker let src1_imodifiers = ?; 2362*9880d681SAndroid Build Coastguard Worker } 2363*9880d681SAndroid Build Coastguard Worker} 2364*9880d681SAndroid Build Coastguard Worker 2365*9880d681SAndroid Build Coastguard Workermulticlass VOPCInst <vopc op, string opName, 2366*9880d681SAndroid Build Coastguard Worker VOPProfile P, PatLeaf cond = COND_NULL, 2367*9880d681SAndroid Build Coastguard Worker string revOp = opName, 2368*9880d681SAndroid Build Coastguard Worker bit DefExec = 0, 2369*9880d681SAndroid Build Coastguard Worker list<SchedReadWrite> sched = [Write32Bit]> : 2370*9880d681SAndroid Build Coastguard Worker VOPC_Helper < 2371*9880d681SAndroid Build Coastguard Worker op, opName, [], 2372*9880d681SAndroid Build Coastguard Worker !if(P.HasModifiers, 2373*9880d681SAndroid Build Coastguard Worker [(set i1:$sdst, 2374*9880d681SAndroid Build Coastguard Worker (setcc (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, 2375*9880d681SAndroid Build Coastguard Worker i1:$clamp, i32:$omod)), 2376*9880d681SAndroid Build Coastguard Worker (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers)), 2377*9880d681SAndroid Build Coastguard Worker cond))], 2378*9880d681SAndroid Build Coastguard Worker [(set i1:$sdst, (setcc P.Src0VT:$src0, P.Src1VT:$src1, cond))]), 2379*9880d681SAndroid Build Coastguard Worker DefExec, revOp, P, sched 2380*9880d681SAndroid Build Coastguard Worker>; 2381*9880d681SAndroid Build Coastguard Worker 2382*9880d681SAndroid Build Coastguard Workermulticlass VOPCClassInst <vopc op, string opName, VOPProfile P, 2383*9880d681SAndroid Build Coastguard Worker bit DefExec = 0, 2384*9880d681SAndroid Build Coastguard Worker list<SchedReadWrite> sched> : VOPC_Class_Helper < 2385*9880d681SAndroid Build Coastguard Worker op, opName, [], 2386*9880d681SAndroid Build Coastguard Worker !if(P.HasModifiers, 2387*9880d681SAndroid Build Coastguard Worker [(set i1:$sdst, 2388*9880d681SAndroid Build Coastguard Worker (AMDGPUfp_class (P.Src0VT (VOP3Mods0Clamp0OMod P.Src0VT:$src0, i32:$src0_modifiers)), P.Src1VT:$src1))], 2389*9880d681SAndroid Build Coastguard Worker [(set i1:$sdst, (AMDGPUfp_class P.Src0VT:$src0, P.Src1VT:$src1))]), 2390*9880d681SAndroid Build Coastguard Worker DefExec, opName, P, sched 2391*9880d681SAndroid Build Coastguard Worker>; 2392*9880d681SAndroid Build Coastguard Worker 2393*9880d681SAndroid Build Coastguard Worker 2394*9880d681SAndroid Build Coastguard Workermulticlass VOPC_F32 <vopc op, string opName, PatLeaf cond = COND_NULL, string revOp = opName> : 2395*9880d681SAndroid Build Coastguard Worker VOPCInst <op, opName, VOPC_I1_F32_F32, cond, revOp>; 2396*9880d681SAndroid Build Coastguard Worker 2397*9880d681SAndroid Build Coastguard Workermulticlass VOPC_F64 <vopc op, string opName, PatLeaf cond = COND_NULL, string revOp = opName> : 2398*9880d681SAndroid Build Coastguard Worker VOPCInst <op, opName, VOPC_I1_F64_F64, cond, revOp, 0, [WriteDoubleAdd]>; 2399*9880d681SAndroid Build Coastguard Worker 2400*9880d681SAndroid Build Coastguard Workermulticlass VOPC_I32 <vopc op, string opName, PatLeaf cond = COND_NULL, string revOp = opName> : 2401*9880d681SAndroid Build Coastguard Worker VOPCInst <op, opName, VOPC_I1_I32_I32, cond, revOp>; 2402*9880d681SAndroid Build Coastguard Worker 2403*9880d681SAndroid Build Coastguard Workermulticlass VOPC_I64 <vopc op, string opName, PatLeaf cond = COND_NULL, string revOp = opName> : 2404*9880d681SAndroid Build Coastguard Worker VOPCInst <op, opName, VOPC_I1_I64_I64, cond, revOp, 0, [Write64Bit]>; 2405*9880d681SAndroid Build Coastguard Worker 2406*9880d681SAndroid Build Coastguard Worker 2407*9880d681SAndroid Build Coastguard Workermulticlass VOPCX <vopc op, string opName, VOPProfile P, 2408*9880d681SAndroid Build Coastguard Worker PatLeaf cond = COND_NULL, 2409*9880d681SAndroid Build Coastguard Worker list<SchedReadWrite> sched, 2410*9880d681SAndroid Build Coastguard Worker string revOp = ""> 2411*9880d681SAndroid Build Coastguard Worker : VOPCInst <op, opName, P, cond, revOp, 1, sched>; 2412*9880d681SAndroid Build Coastguard Worker 2413*9880d681SAndroid Build Coastguard Workermulticlass VOPCX_F32 <vopc op, string opName, string revOp = opName> : 2414*9880d681SAndroid Build Coastguard Worker VOPCX <op, opName, VOPC_I1_F32_F32, COND_NULL, [Write32Bit], revOp>; 2415*9880d681SAndroid Build Coastguard Worker 2416*9880d681SAndroid Build Coastguard Workermulticlass VOPCX_F64 <vopc op, string opName, string revOp = opName> : 2417*9880d681SAndroid Build Coastguard Worker VOPCX <op, opName, VOPC_I1_F64_F64, COND_NULL, [WriteDoubleAdd], revOp>; 2418*9880d681SAndroid Build Coastguard Worker 2419*9880d681SAndroid Build Coastguard Workermulticlass VOPCX_I32 <vopc op, string opName, string revOp = opName> : 2420*9880d681SAndroid Build Coastguard Worker VOPCX <op, opName, VOPC_I1_I32_I32, COND_NULL, [Write32Bit], revOp>; 2421*9880d681SAndroid Build Coastguard Worker 2422*9880d681SAndroid Build Coastguard Workermulticlass VOPCX_I64 <vopc op, string opName, string revOp = opName> : 2423*9880d681SAndroid Build Coastguard Worker VOPCX <op, opName, VOPC_I1_I64_I64, COND_NULL, [Write64Bit], revOp>; 2424*9880d681SAndroid Build Coastguard Worker 2425*9880d681SAndroid Build Coastguard Worker 2426*9880d681SAndroid Build Coastguard Workermulticlass VOPC_CLASS_F32 <vopc op, string opName> : 2427*9880d681SAndroid Build Coastguard Worker VOPCClassInst <op, opName, VOPC_I1_F32_I32, 0, [Write32Bit]>; 2428*9880d681SAndroid Build Coastguard Worker 2429*9880d681SAndroid Build Coastguard Workermulticlass VOPCX_CLASS_F32 <vopc op, string opName> : 2430*9880d681SAndroid Build Coastguard Worker VOPCClassInst <op, opName, VOPC_I1_F32_I32, 1, [Write32Bit]>; 2431*9880d681SAndroid Build Coastguard Worker 2432*9880d681SAndroid Build Coastguard Workermulticlass VOPC_CLASS_F64 <vopc op, string opName> : 2433*9880d681SAndroid Build Coastguard Worker VOPCClassInst <op, opName, VOPC_I1_F64_I32, 0, [WriteDoubleAdd]>; 2434*9880d681SAndroid Build Coastguard Worker 2435*9880d681SAndroid Build Coastguard Workermulticlass VOPCX_CLASS_F64 <vopc op, string opName> : 2436*9880d681SAndroid Build Coastguard Worker VOPCClassInst <op, opName, VOPC_I1_F64_I32, 1, [WriteDoubleAdd]>; 2437*9880d681SAndroid Build Coastguard Worker 2438*9880d681SAndroid Build Coastguard Worker 2439*9880d681SAndroid Build Coastguard Workermulticlass VOP3_Helper <vop3 op, string opName, dag outs, dag ins, string asm, 2440*9880d681SAndroid Build Coastguard Worker list<dag> pat, int NumSrcArgs, bit HasMods, 2441*9880d681SAndroid Build Coastguard Worker bit VOP3Only = 0> : VOP3_m < 2442*9880d681SAndroid Build Coastguard Worker op, outs, ins, opName#" "#asm, pat, opName, NumSrcArgs, HasMods, VOP3Only 2443*9880d681SAndroid Build Coastguard Worker>; 2444*9880d681SAndroid Build Coastguard Worker 2445*9880d681SAndroid Build Coastguard Workermulticlass VOP3Inst <vop3 op, string opName, VOPProfile P, 2446*9880d681SAndroid Build Coastguard Worker SDPatternOperator node = null_frag, bit VOP3Only = 0> : 2447*9880d681SAndroid Build Coastguard Worker VOP3_Helper < 2448*9880d681SAndroid Build Coastguard Worker op, opName, (outs P.DstRC.RegClass:$vdst), P.Ins64, P.Asm64, 2449*9880d681SAndroid Build Coastguard Worker !if(!eq(P.NumSrcArgs, 3), 2450*9880d681SAndroid Build Coastguard Worker !if(P.HasModifiers, 2451*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, 2452*9880d681SAndroid Build Coastguard Worker (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, 2453*9880d681SAndroid Build Coastguard Worker i1:$clamp, i32:$omod)), 2454*9880d681SAndroid Build Coastguard Worker (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers)), 2455*9880d681SAndroid Build Coastguard Worker (P.Src2VT (VOP3Mods P.Src2VT:$src2, i32:$src2_modifiers))))], 2456*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, (node P.Src0VT:$src0, P.Src1VT:$src1, 2457*9880d681SAndroid Build Coastguard Worker P.Src2VT:$src2))]), 2458*9880d681SAndroid Build Coastguard Worker !if(!eq(P.NumSrcArgs, 2), 2459*9880d681SAndroid Build Coastguard Worker !if(P.HasModifiers, 2460*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, 2461*9880d681SAndroid Build Coastguard Worker (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, 2462*9880d681SAndroid Build Coastguard Worker i1:$clamp, i32:$omod)), 2463*9880d681SAndroid Build Coastguard Worker (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers))))], 2464*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, (node P.Src0VT:$src0, P.Src1VT:$src1))]) 2465*9880d681SAndroid Build Coastguard Worker /* P.NumSrcArgs == 1 */, 2466*9880d681SAndroid Build Coastguard Worker !if(P.HasModifiers, 2467*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, 2468*9880d681SAndroid Build Coastguard Worker (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, 2469*9880d681SAndroid Build Coastguard Worker i1:$clamp, i32:$omod))))], 2470*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, (node P.Src0VT:$src0))]))), 2471*9880d681SAndroid Build Coastguard Worker P.NumSrcArgs, P.HasModifiers, VOP3Only 2472*9880d681SAndroid Build Coastguard Worker>; 2473*9880d681SAndroid Build Coastguard Worker 2474*9880d681SAndroid Build Coastguard Worker// Special case for v_div_fmas_{f32|f64}, since it seems to be the 2475*9880d681SAndroid Build Coastguard Worker// only VOP instruction that implicitly reads VCC. 2476*9880d681SAndroid Build Coastguard Workermulticlass VOP3_VCC_Inst <vop3 op, string opName, 2477*9880d681SAndroid Build Coastguard Worker VOPProfile P, 2478*9880d681SAndroid Build Coastguard Worker SDPatternOperator node = null_frag> : VOP3_Helper < 2479*9880d681SAndroid Build Coastguard Worker op, opName, 2480*9880d681SAndroid Build Coastguard Worker (outs P.DstRC.RegClass:$vdst), 2481*9880d681SAndroid Build Coastguard Worker (ins FPInputMods:$src0_modifiers, P.Src0RC64:$src0, 2482*9880d681SAndroid Build Coastguard Worker FPInputMods:$src1_modifiers, P.Src1RC64:$src1, 2483*9880d681SAndroid Build Coastguard Worker FPInputMods:$src2_modifiers, P.Src2RC64:$src2, 2484*9880d681SAndroid Build Coastguard Worker clampmod:$clamp, 2485*9880d681SAndroid Build Coastguard Worker omod:$omod), 2486*9880d681SAndroid Build Coastguard Worker "$vdst, $src0_modifiers, $src1_modifiers, $src2_modifiers"#"$clamp"#"$omod", 2487*9880d681SAndroid Build Coastguard Worker [(set P.DstVT:$vdst, 2488*9880d681SAndroid Build Coastguard Worker (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, 2489*9880d681SAndroid Build Coastguard Worker i1:$clamp, i32:$omod)), 2490*9880d681SAndroid Build Coastguard Worker (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers)), 2491*9880d681SAndroid Build Coastguard Worker (P.Src2VT (VOP3Mods P.Src2VT:$src2, i32:$src2_modifiers)), 2492*9880d681SAndroid Build Coastguard Worker (i1 VCC)))], 2493*9880d681SAndroid Build Coastguard Worker 3, 1 2494*9880d681SAndroid Build Coastguard Worker>; 2495*9880d681SAndroid Build Coastguard Worker 2496*9880d681SAndroid Build Coastguard Workermulticlass VOP3bInst <vop op, string opName, VOPProfile P, list<dag> pattern = [], bit VOP3Only = 0> : 2497*9880d681SAndroid Build Coastguard Worker VOP3b_2_3_m < 2498*9880d681SAndroid Build Coastguard Worker op, P.Outs64, P.Ins64, 2499*9880d681SAndroid Build Coastguard Worker opName#" "#P.Asm64, pattern, 2500*9880d681SAndroid Build Coastguard Worker opName, "", 1, 1, VOP3Only 2501*9880d681SAndroid Build Coastguard Worker>; 2502*9880d681SAndroid Build Coastguard Worker 2503*9880d681SAndroid Build Coastguard Workerclass Vop3ModPat<Instruction Inst, VOPProfile P, SDPatternOperator node> : Pat< 2504*9880d681SAndroid Build Coastguard Worker (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, i1:$clamp, i32:$omod)), 2505*9880d681SAndroid Build Coastguard Worker (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers)), 2506*9880d681SAndroid Build Coastguard Worker (P.Src2VT (VOP3Mods P.Src2VT:$src2, i32:$src2_modifiers))), 2507*9880d681SAndroid Build Coastguard Worker (Inst i32:$src0_modifiers, P.Src0VT:$src0, 2508*9880d681SAndroid Build Coastguard Worker i32:$src1_modifiers, P.Src1VT:$src1, 2509*9880d681SAndroid Build Coastguard Worker i32:$src2_modifiers, P.Src2VT:$src2, 2510*9880d681SAndroid Build Coastguard Worker i1:$clamp, 2511*9880d681SAndroid Build Coastguard Worker i32:$omod)>; 2512*9880d681SAndroid Build Coastguard Worker 2513*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2514*9880d681SAndroid Build Coastguard Worker// Interpolation opcodes 2515*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2516*9880d681SAndroid Build Coastguard Worker 2517*9880d681SAndroid Build Coastguard Workerclass VINTRP_Pseudo <string opName, dag outs, dag ins, list<dag> pattern> : 2518*9880d681SAndroid Build Coastguard Worker VINTRPCommon <outs, ins, "", pattern>, 2519*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.NONE> { 2520*9880d681SAndroid Build Coastguard Worker let isPseudo = 1; 2521*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1; 2522*9880d681SAndroid Build Coastguard Worker} 2523*9880d681SAndroid Build Coastguard Worker 2524*9880d681SAndroid Build Coastguard Workerclass VINTRP_Real_si <bits <2> op, string opName, dag outs, dag ins, 2525*9880d681SAndroid Build Coastguard Worker string asm> : 2526*9880d681SAndroid Build Coastguard Worker VINTRPCommon <outs, ins, asm, []>, 2527*9880d681SAndroid Build Coastguard Worker VINTRPe <op>, 2528*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.SI> { 2529*9880d681SAndroid Build Coastguard Worker let AssemblerPredicate = SIAssemblerPredicate; 2530*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 2531*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 2532*9880d681SAndroid Build Coastguard Worker} 2533*9880d681SAndroid Build Coastguard Worker 2534*9880d681SAndroid Build Coastguard Workerclass VINTRP_Real_vi <bits <2> op, string opName, dag outs, dag ins, 2535*9880d681SAndroid Build Coastguard Worker string asm> : 2536*9880d681SAndroid Build Coastguard Worker VINTRPCommon <outs, ins, asm, []>, 2537*9880d681SAndroid Build Coastguard Worker VINTRPe_vi <op>, 2538*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.VI> { 2539*9880d681SAndroid Build Coastguard Worker let AssemblerPredicate = VIAssemblerPredicate; 2540*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 2541*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 2542*9880d681SAndroid Build Coastguard Worker} 2543*9880d681SAndroid Build Coastguard Worker 2544*9880d681SAndroid Build Coastguard Workermulticlass VINTRP_m <bits <2> op, dag outs, dag ins, string asm, 2545*9880d681SAndroid Build Coastguard Worker list<dag> pattern = []> { 2546*9880d681SAndroid Build Coastguard Worker def "" : VINTRP_Pseudo <NAME, outs, ins, pattern>; 2547*9880d681SAndroid Build Coastguard Worker 2548*9880d681SAndroid Build Coastguard Worker def _si : VINTRP_Real_si <op, NAME, outs, ins, asm>; 2549*9880d681SAndroid Build Coastguard Worker 2550*9880d681SAndroid Build Coastguard Worker def _vi : VINTRP_Real_vi <op, NAME, outs, ins, asm>; 2551*9880d681SAndroid Build Coastguard Worker} 2552*9880d681SAndroid Build Coastguard Worker 2553*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2554*9880d681SAndroid Build Coastguard Worker// Vector I/O classes 2555*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2556*9880d681SAndroid Build Coastguard Worker 2557*9880d681SAndroid Build Coastguard Workerclass DS_Pseudo <string opName, dag outs, dag ins, list<dag> pattern> : 2558*9880d681SAndroid Build Coastguard Worker DS <outs, ins, "", pattern>, 2559*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName, SIEncodingFamily.NONE> { 2560*9880d681SAndroid Build Coastguard Worker let isPseudo = 1; 2561*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1; 2562*9880d681SAndroid Build Coastguard Worker} 2563*9880d681SAndroid Build Coastguard Worker 2564*9880d681SAndroid Build Coastguard Workerclass DS_Real_si <bits<8> op, string opName, dag outs, dag ins, string asm> : 2565*9880d681SAndroid Build Coastguard Worker DS <outs, ins, asm, []>, 2566*9880d681SAndroid Build Coastguard Worker DSe <op>, 2567*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName, SIEncodingFamily.SI> { 2568*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 0; 2569*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isSICI]; 2570*9880d681SAndroid Build Coastguard Worker let DecoderNamespace="SICI"; 2571*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 2572*9880d681SAndroid Build Coastguard Worker} 2573*9880d681SAndroid Build Coastguard Worker 2574*9880d681SAndroid Build Coastguard Workerclass DS_Real_vi <bits<8> op, string opName, dag outs, dag ins, string asm> : 2575*9880d681SAndroid Build Coastguard Worker DS <outs, ins, asm, []>, 2576*9880d681SAndroid Build Coastguard Worker DSe_vi <op>, 2577*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName, SIEncodingFamily.VI> { 2578*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 0; 2579*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 2580*9880d681SAndroid Build Coastguard Worker let DecoderNamespace="VI"; 2581*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 2582*9880d681SAndroid Build Coastguard Worker} 2583*9880d681SAndroid Build Coastguard Worker 2584*9880d681SAndroid Build Coastguard Workerclass DS_Off16_Real_si <bits<8> op, string opName, dag outs, dag ins, string asm> : 2585*9880d681SAndroid Build Coastguard Worker DS_Real_si <op,opName, outs, ins, asm> { 2586*9880d681SAndroid Build Coastguard Worker 2587*9880d681SAndroid Build Coastguard Worker // Single load interpret the 2 i8imm operands as a single i16 offset. 2588*9880d681SAndroid Build Coastguard Worker bits<16> offset; 2589*9880d681SAndroid Build Coastguard Worker let offset0 = offset{7-0}; 2590*9880d681SAndroid Build Coastguard Worker let offset1 = offset{15-8}; 2591*9880d681SAndroid Build Coastguard Worker} 2592*9880d681SAndroid Build Coastguard Worker 2593*9880d681SAndroid Build Coastguard Workerclass DS_Off16_Real_vi <bits<8> op, string opName, dag outs, dag ins, string asm> : 2594*9880d681SAndroid Build Coastguard Worker DS_Real_vi <op, opName, outs, ins, asm> { 2595*9880d681SAndroid Build Coastguard Worker 2596*9880d681SAndroid Build Coastguard Worker // Single load interpret the 2 i8imm operands as a single i16 offset. 2597*9880d681SAndroid Build Coastguard Worker bits<16> offset; 2598*9880d681SAndroid Build Coastguard Worker let offset0 = offset{7-0}; 2599*9880d681SAndroid Build Coastguard Worker let offset1 = offset{15-8}; 2600*9880d681SAndroid Build Coastguard Worker} 2601*9880d681SAndroid Build Coastguard Worker 2602*9880d681SAndroid Build Coastguard Workermulticlass DS_1A_RET_ <dsop op, string opName, RegisterClass rc, 2603*9880d681SAndroid Build Coastguard Worker dag outs = (outs rc:$vdst), 2604*9880d681SAndroid Build Coastguard Worker dag ins = (ins VGPR_32:$addr, offset:$offset, gds:$gds), 2605*9880d681SAndroid Build Coastguard Worker string asm = opName#" $vdst, $addr"#"$offset$gds"> { 2606*9880d681SAndroid Build Coastguard Worker 2607*9880d681SAndroid Build Coastguard Worker def "" : DS_Pseudo <opName, outs, ins, []>; 2608*9880d681SAndroid Build Coastguard Worker 2609*9880d681SAndroid Build Coastguard Worker let data0 = 0, data1 = 0 in { 2610*9880d681SAndroid Build Coastguard Worker def _si : DS_Off16_Real_si <op.SI, opName, outs, ins, asm>; 2611*9880d681SAndroid Build Coastguard Worker def _vi : DS_Off16_Real_vi <op.VI, opName, outs, ins, asm>; 2612*9880d681SAndroid Build Coastguard Worker } 2613*9880d681SAndroid Build Coastguard Worker} 2614*9880d681SAndroid Build Coastguard Worker 2615*9880d681SAndroid Build Coastguard Worker// TODO: DS_1A_RET can be inherited from DS_1A_RET_ but its not working 2616*9880d681SAndroid Build Coastguard Worker// for some reason. In fact we can remove this class if use dsop everywhere 2617*9880d681SAndroid Build Coastguard Workermulticlass DS_1A_RET <bits<8> op, string opName, RegisterClass rc, 2618*9880d681SAndroid Build Coastguard Worker dag outs = (outs rc:$vdst), 2619*9880d681SAndroid Build Coastguard Worker dag ins = (ins VGPR_32:$addr, offset:$offset, gds:$gds), 2620*9880d681SAndroid Build Coastguard Worker string asm = opName#" $vdst, $addr"#"$offset$gds"> { 2621*9880d681SAndroid Build Coastguard Worker 2622*9880d681SAndroid Build Coastguard Worker def "" : DS_Pseudo <opName, outs, ins, []>; 2623*9880d681SAndroid Build Coastguard Worker 2624*9880d681SAndroid Build Coastguard Worker let data0 = 0, data1 = 0 in { 2625*9880d681SAndroid Build Coastguard Worker def _si : DS_Off16_Real_si <op, opName, outs, ins, asm>; 2626*9880d681SAndroid Build Coastguard Worker def _vi : DS_Off16_Real_vi <op, opName, outs, ins, asm>; 2627*9880d681SAndroid Build Coastguard Worker } 2628*9880d681SAndroid Build Coastguard Worker} 2629*9880d681SAndroid Build Coastguard Worker 2630*9880d681SAndroid Build Coastguard Workermulticlass DS_1A_Off8_RET <bits<8> op, string opName, RegisterClass rc, 2631*9880d681SAndroid Build Coastguard Worker dag outs = (outs rc:$vdst), 2632*9880d681SAndroid Build Coastguard Worker dag ins = (ins VGPR_32:$addr, offset0:$offset0, offset1:$offset1, 2633*9880d681SAndroid Build Coastguard Worker gds:$gds), 2634*9880d681SAndroid Build Coastguard Worker string asm = opName#" $vdst, $addr"#"$offset0"#"$offset1$gds"> { 2635*9880d681SAndroid Build Coastguard Worker 2636*9880d681SAndroid Build Coastguard Worker def "" : DS_Pseudo <opName, outs, ins, []>; 2637*9880d681SAndroid Build Coastguard Worker 2638*9880d681SAndroid Build Coastguard Worker let data0 = 0, data1 = 0, AsmMatchConverter = "cvtDSOffset01" in { 2639*9880d681SAndroid Build Coastguard Worker def _si : DS_Real_si <op, opName, outs, ins, asm>; 2640*9880d681SAndroid Build Coastguard Worker def _vi : DS_Real_vi <op, opName, outs, ins, asm>; 2641*9880d681SAndroid Build Coastguard Worker } 2642*9880d681SAndroid Build Coastguard Worker} 2643*9880d681SAndroid Build Coastguard Worker 2644*9880d681SAndroid Build Coastguard Workermulticlass DS_1A1D_NORET <bits<8> op, string opName, RegisterClass rc, 2645*9880d681SAndroid Build Coastguard Worker dag outs = (outs), 2646*9880d681SAndroid Build Coastguard Worker dag ins = (ins VGPR_32:$addr, rc:$data0, offset:$offset, gds:$gds), 2647*9880d681SAndroid Build Coastguard Worker string asm = opName#" $addr, $data0"#"$offset$gds"> { 2648*9880d681SAndroid Build Coastguard Worker 2649*9880d681SAndroid Build Coastguard Worker def "" : DS_Pseudo <opName, outs, ins, []>, 2650*9880d681SAndroid Build Coastguard Worker AtomicNoRet<opName, 0>; 2651*9880d681SAndroid Build Coastguard Worker 2652*9880d681SAndroid Build Coastguard Worker let data1 = 0, vdst = 0 in { 2653*9880d681SAndroid Build Coastguard Worker def _si : DS_Off16_Real_si <op, opName, outs, ins, asm>; 2654*9880d681SAndroid Build Coastguard Worker def _vi : DS_Off16_Real_vi <op, opName, outs, ins, asm>; 2655*9880d681SAndroid Build Coastguard Worker } 2656*9880d681SAndroid Build Coastguard Worker} 2657*9880d681SAndroid Build Coastguard Worker 2658*9880d681SAndroid Build Coastguard Workermulticlass DS_1A_Off8_NORET <bits<8> op, string opName, 2659*9880d681SAndroid Build Coastguard Worker dag outs = (outs), 2660*9880d681SAndroid Build Coastguard Worker dag ins = (ins VGPR_32:$addr, 2661*9880d681SAndroid Build Coastguard Worker offset0:$offset0, offset1:$offset1, gds:$gds), 2662*9880d681SAndroid Build Coastguard Worker string asm = opName#" $addr $offset0"#"$offset1$gds"> { 2663*9880d681SAndroid Build Coastguard Worker 2664*9880d681SAndroid Build Coastguard Worker def "" : DS_Pseudo <opName, outs, ins, []>; 2665*9880d681SAndroid Build Coastguard Worker 2666*9880d681SAndroid Build Coastguard Worker let data0 = 0, data1 = 0, vdst = 0, AsmMatchConverter = "cvtDSOffset01" in { 2667*9880d681SAndroid Build Coastguard Worker def _si : DS_Real_si <op, opName, outs, ins, asm>; 2668*9880d681SAndroid Build Coastguard Worker def _vi : DS_Real_vi <op, opName, outs, ins, asm>; 2669*9880d681SAndroid Build Coastguard Worker } 2670*9880d681SAndroid Build Coastguard Worker} 2671*9880d681SAndroid Build Coastguard Worker 2672*9880d681SAndroid Build Coastguard Workermulticlass DS_1A2D_Off8_NORET <bits<8> op, string opName, RegisterClass rc, 2673*9880d681SAndroid Build Coastguard Worker dag outs = (outs), 2674*9880d681SAndroid Build Coastguard Worker dag ins = (ins VGPR_32:$addr, rc:$data0, rc:$data1, 2675*9880d681SAndroid Build Coastguard Worker offset0:$offset0, offset1:$offset1, gds:$gds), 2676*9880d681SAndroid Build Coastguard Worker string asm = opName#" $addr, $data0, $data1$offset0$offset1$gds"> { 2677*9880d681SAndroid Build Coastguard Worker 2678*9880d681SAndroid Build Coastguard Worker def "" : DS_Pseudo <opName, outs, ins, []>; 2679*9880d681SAndroid Build Coastguard Worker 2680*9880d681SAndroid Build Coastguard Worker let vdst = 0, AsmMatchConverter = "cvtDSOffset01" in { 2681*9880d681SAndroid Build Coastguard Worker def _si : DS_Real_si <op, opName, outs, ins, asm>; 2682*9880d681SAndroid Build Coastguard Worker def _vi : DS_Real_vi <op, opName, outs, ins, asm>; 2683*9880d681SAndroid Build Coastguard Worker } 2684*9880d681SAndroid Build Coastguard Worker} 2685*9880d681SAndroid Build Coastguard Worker 2686*9880d681SAndroid Build Coastguard Workermulticlass DS_1A1D_RET <bits<8> op, string opName, RegisterClass rc, 2687*9880d681SAndroid Build Coastguard Worker string noRetOp = "", 2688*9880d681SAndroid Build Coastguard Worker dag outs = (outs rc:$vdst), 2689*9880d681SAndroid Build Coastguard Worker dag ins = (ins VGPR_32:$addr, rc:$data0, offset:$offset, gds:$gds), 2690*9880d681SAndroid Build Coastguard Worker string asm = opName#" $vdst, $addr, $data0"#"$offset$gds"> { 2691*9880d681SAndroid Build Coastguard Worker 2692*9880d681SAndroid Build Coastguard Worker let hasPostISelHook = 1 in { 2693*9880d681SAndroid Build Coastguard Worker def "" : DS_Pseudo <opName, outs, ins, []>, 2694*9880d681SAndroid Build Coastguard Worker AtomicNoRet<noRetOp, 1>; 2695*9880d681SAndroid Build Coastguard Worker 2696*9880d681SAndroid Build Coastguard Worker let data1 = 0 in { 2697*9880d681SAndroid Build Coastguard Worker def _si : DS_Off16_Real_si <op, opName, outs, ins, asm>; 2698*9880d681SAndroid Build Coastguard Worker def _vi : DS_Off16_Real_vi <op, opName, outs, ins, asm>; 2699*9880d681SAndroid Build Coastguard Worker } 2700*9880d681SAndroid Build Coastguard Worker } 2701*9880d681SAndroid Build Coastguard Worker} 2702*9880d681SAndroid Build Coastguard Worker 2703*9880d681SAndroid Build Coastguard Workermulticlass DS_1A1D_PERMUTE <bits<8> op, string opName, RegisterClass rc, 2704*9880d681SAndroid Build Coastguard Worker SDPatternOperator node = null_frag, 2705*9880d681SAndroid Build Coastguard Worker dag outs = (outs rc:$vdst), 2706*9880d681SAndroid Build Coastguard Worker dag ins = (ins VGPR_32:$addr, rc:$data0, offset:$offset), 2707*9880d681SAndroid Build Coastguard Worker string asm = opName#" $vdst, $addr, $data0"#"$offset"> { 2708*9880d681SAndroid Build Coastguard Worker 2709*9880d681SAndroid Build Coastguard Worker let mayLoad = 0, mayStore = 0, isConvergent = 1 in { 2710*9880d681SAndroid Build Coastguard Worker def "" : DS_Pseudo <opName, outs, ins, 2711*9880d681SAndroid Build Coastguard Worker [(set i32:$vdst, 2712*9880d681SAndroid Build Coastguard Worker (node (DS1Addr1Offset i32:$addr, i16:$offset), i32:$data0))]>; 2713*9880d681SAndroid Build Coastguard Worker 2714*9880d681SAndroid Build Coastguard Worker let data1 = 0, gds = 0 in { 2715*9880d681SAndroid Build Coastguard Worker def "_vi" : DS_Off16_Real_vi <op, opName, outs, ins, asm>; 2716*9880d681SAndroid Build Coastguard Worker } 2717*9880d681SAndroid Build Coastguard Worker } 2718*9880d681SAndroid Build Coastguard Worker} 2719*9880d681SAndroid Build Coastguard Worker 2720*9880d681SAndroid Build Coastguard Workermulticlass DS_1A2D_RET_m <bits<8> op, string opName, RegisterClass rc, 2721*9880d681SAndroid Build Coastguard Worker string noRetOp = "", dag ins, 2722*9880d681SAndroid Build Coastguard Worker dag outs = (outs rc:$vdst), 2723*9880d681SAndroid Build Coastguard Worker string asm = opName#" $vdst, $addr, $data0, $data1"#"$offset"#"$gds"> { 2724*9880d681SAndroid Build Coastguard Worker 2725*9880d681SAndroid Build Coastguard Worker let hasPostISelHook = 1 in { 2726*9880d681SAndroid Build Coastguard Worker def "" : DS_Pseudo <opName, outs, ins, []>, 2727*9880d681SAndroid Build Coastguard Worker AtomicNoRet<noRetOp, 1>; 2728*9880d681SAndroid Build Coastguard Worker 2729*9880d681SAndroid Build Coastguard Worker def _si : DS_Off16_Real_si <op, opName, outs, ins, asm>; 2730*9880d681SAndroid Build Coastguard Worker def _vi : DS_Off16_Real_vi <op, opName, outs, ins, asm>; 2731*9880d681SAndroid Build Coastguard Worker } 2732*9880d681SAndroid Build Coastguard Worker} 2733*9880d681SAndroid Build Coastguard Worker 2734*9880d681SAndroid Build Coastguard Workermulticlass DS_1A2D_RET <bits<8> op, string asm, RegisterClass rc, 2735*9880d681SAndroid Build Coastguard Worker string noRetOp = "", RegisterClass src = rc> : 2736*9880d681SAndroid Build Coastguard Worker DS_1A2D_RET_m <op, asm, rc, noRetOp, 2737*9880d681SAndroid Build Coastguard Worker (ins VGPR_32:$addr, src:$data0, src:$data1, 2738*9880d681SAndroid Build Coastguard Worker offset:$offset, gds:$gds) 2739*9880d681SAndroid Build Coastguard Worker>; 2740*9880d681SAndroid Build Coastguard Worker 2741*9880d681SAndroid Build Coastguard Workermulticlass DS_1A2D_NORET <bits<8> op, string opName, RegisterClass rc, 2742*9880d681SAndroid Build Coastguard Worker string noRetOp = opName, 2743*9880d681SAndroid Build Coastguard Worker dag outs = (outs), 2744*9880d681SAndroid Build Coastguard Worker dag ins = (ins VGPR_32:$addr, rc:$data0, rc:$data1, 2745*9880d681SAndroid Build Coastguard Worker offset:$offset, gds:$gds), 2746*9880d681SAndroid Build Coastguard Worker string asm = opName#" $addr, $data0, $data1"#"$offset"#"$gds"> { 2747*9880d681SAndroid Build Coastguard Worker 2748*9880d681SAndroid Build Coastguard Worker def "" : DS_Pseudo <opName, outs, ins, []>, 2749*9880d681SAndroid Build Coastguard Worker AtomicNoRet<noRetOp, 0>; 2750*9880d681SAndroid Build Coastguard Worker 2751*9880d681SAndroid Build Coastguard Worker let vdst = 0 in { 2752*9880d681SAndroid Build Coastguard Worker def _si : DS_Off16_Real_si <op, opName, outs, ins, asm>; 2753*9880d681SAndroid Build Coastguard Worker def _vi : DS_Off16_Real_vi <op, opName, outs, ins, asm>; 2754*9880d681SAndroid Build Coastguard Worker } 2755*9880d681SAndroid Build Coastguard Worker} 2756*9880d681SAndroid Build Coastguard Worker 2757*9880d681SAndroid Build Coastguard Workermulticlass DS_0A_RET <bits<8> op, string opName, 2758*9880d681SAndroid Build Coastguard Worker dag outs = (outs VGPR_32:$vdst), 2759*9880d681SAndroid Build Coastguard Worker dag ins = (ins offset:$offset, gds:$gds), 2760*9880d681SAndroid Build Coastguard Worker string asm = opName#" $vdst"#"$offset"#"$gds"> { 2761*9880d681SAndroid Build Coastguard Worker 2762*9880d681SAndroid Build Coastguard Worker let mayLoad = 1, mayStore = 1 in { 2763*9880d681SAndroid Build Coastguard Worker def "" : DS_Pseudo <opName, outs, ins, []>; 2764*9880d681SAndroid Build Coastguard Worker 2765*9880d681SAndroid Build Coastguard Worker let addr = 0, data0 = 0, data1 = 0 in { 2766*9880d681SAndroid Build Coastguard Worker def _si : DS_Off16_Real_si <op, opName, outs, ins, asm>; 2767*9880d681SAndroid Build Coastguard Worker def _vi : DS_Off16_Real_vi <op, opName, outs, ins, asm>; 2768*9880d681SAndroid Build Coastguard Worker } // end addr = 0, data0 = 0, data1 = 0 2769*9880d681SAndroid Build Coastguard Worker } // end mayLoad = 1, mayStore = 1 2770*9880d681SAndroid Build Coastguard Worker} 2771*9880d681SAndroid Build Coastguard Worker 2772*9880d681SAndroid Build Coastguard Workermulticlass DS_1A_RET_GDS <bits<8> op, string opName, 2773*9880d681SAndroid Build Coastguard Worker dag outs = (outs VGPR_32:$vdst), 2774*9880d681SAndroid Build Coastguard Worker dag ins = (ins VGPR_32:$addr, offset:$offset), 2775*9880d681SAndroid Build Coastguard Worker string asm = opName#" $vdst, $addr"#"$offset gds"> { 2776*9880d681SAndroid Build Coastguard Worker 2777*9880d681SAndroid Build Coastguard Worker def "" : DS_Pseudo <opName, outs, ins, []>; 2778*9880d681SAndroid Build Coastguard Worker 2779*9880d681SAndroid Build Coastguard Worker let data0 = 0, data1 = 0, gds = 1 in { 2780*9880d681SAndroid Build Coastguard Worker def _si : DS_Off16_Real_si <op, opName, outs, ins, asm>; 2781*9880d681SAndroid Build Coastguard Worker def _vi : DS_Off16_Real_vi <op, opName, outs, ins, asm>; 2782*9880d681SAndroid Build Coastguard Worker } // end data0 = 0, data1 = 0, gds = 1 2783*9880d681SAndroid Build Coastguard Worker} 2784*9880d681SAndroid Build Coastguard Worker 2785*9880d681SAndroid Build Coastguard Workermulticlass DS_1A_GDS <bits<8> op, string opName, 2786*9880d681SAndroid Build Coastguard Worker dag outs = (outs), 2787*9880d681SAndroid Build Coastguard Worker dag ins = (ins VGPR_32:$addr), 2788*9880d681SAndroid Build Coastguard Worker string asm = opName#" $addr gds"> { 2789*9880d681SAndroid Build Coastguard Worker 2790*9880d681SAndroid Build Coastguard Worker def "" : DS_Pseudo <opName, outs, ins, []>; 2791*9880d681SAndroid Build Coastguard Worker 2792*9880d681SAndroid Build Coastguard Worker let vdst = 0, data0 = 0, data1 = 0, offset0 = 0, offset1 = 0, gds = 1 in { 2793*9880d681SAndroid Build Coastguard Worker def _si : DS_Real_si <op, opName, outs, ins, asm>; 2794*9880d681SAndroid Build Coastguard Worker def _vi : DS_Real_vi <op, opName, outs, ins, asm>; 2795*9880d681SAndroid Build Coastguard Worker } // end vdst = 0, data = 0, data1 = 0, gds = 1 2796*9880d681SAndroid Build Coastguard Worker} 2797*9880d681SAndroid Build Coastguard Worker 2798*9880d681SAndroid Build Coastguard Workermulticlass DS_1A <bits<8> op, string opName, 2799*9880d681SAndroid Build Coastguard Worker dag outs = (outs), 2800*9880d681SAndroid Build Coastguard Worker dag ins = (ins VGPR_32:$addr, offset:$offset, gds:$gds), 2801*9880d681SAndroid Build Coastguard Worker string asm = opName#" $addr"#"$offset"#"$gds"> { 2802*9880d681SAndroid Build Coastguard Worker 2803*9880d681SAndroid Build Coastguard Worker let mayLoad = 1, mayStore = 1 in { 2804*9880d681SAndroid Build Coastguard Worker def "" : DS_Pseudo <opName, outs, ins, []>; 2805*9880d681SAndroid Build Coastguard Worker 2806*9880d681SAndroid Build Coastguard Worker let vdst = 0, data0 = 0, data1 = 0 in { 2807*9880d681SAndroid Build Coastguard Worker def _si : DS_Off16_Real_si <op, opName, outs, ins, asm>; 2808*9880d681SAndroid Build Coastguard Worker def _vi : DS_Off16_Real_vi <op, opName, outs, ins, asm>; 2809*9880d681SAndroid Build Coastguard Worker } // let vdst = 0, data0 = 0, data1 = 0 2810*9880d681SAndroid Build Coastguard Worker } // end mayLoad = 1, mayStore = 1 2811*9880d681SAndroid Build Coastguard Worker} 2812*9880d681SAndroid Build Coastguard Worker 2813*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2814*9880d681SAndroid Build Coastguard Worker// MTBUF classes 2815*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2816*9880d681SAndroid Build Coastguard Worker 2817*9880d681SAndroid Build Coastguard Workerclass MTBUF_Pseudo <string opName, dag outs, dag ins, list<dag> pattern> : 2818*9880d681SAndroid Build Coastguard Worker MTBUF <outs, ins, "", pattern>, 2819*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.NONE> { 2820*9880d681SAndroid Build Coastguard Worker let isPseudo = 1; 2821*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1; 2822*9880d681SAndroid Build Coastguard Worker} 2823*9880d681SAndroid Build Coastguard Worker 2824*9880d681SAndroid Build Coastguard Workerclass MTBUF_Real_si <bits<3> op, string opName, dag outs, dag ins, 2825*9880d681SAndroid Build Coastguard Worker string asm> : 2826*9880d681SAndroid Build Coastguard Worker MTBUF <outs, ins, asm, []>, 2827*9880d681SAndroid Build Coastguard Worker MTBUFe <op>, 2828*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.SI> { 2829*9880d681SAndroid Build Coastguard Worker let DecoderNamespace="SICI"; 2830*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 2831*9880d681SAndroid Build Coastguard Worker} 2832*9880d681SAndroid Build Coastguard Worker 2833*9880d681SAndroid Build Coastguard Workerclass MTBUF_Real_vi <bits<4> op, string opName, dag outs, dag ins, string asm> : 2834*9880d681SAndroid Build Coastguard Worker MTBUF <outs, ins, asm, []>, 2835*9880d681SAndroid Build Coastguard Worker MTBUFe_vi <op>, 2836*9880d681SAndroid Build Coastguard Worker SIMCInstr <opName, SIEncodingFamily.VI> { 2837*9880d681SAndroid Build Coastguard Worker let DecoderNamespace="VI"; 2838*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 2839*9880d681SAndroid Build Coastguard Worker} 2840*9880d681SAndroid Build Coastguard Worker 2841*9880d681SAndroid Build Coastguard Workermulticlass MTBUF_m <bits<3> op, string opName, dag outs, dag ins, string asm, 2842*9880d681SAndroid Build Coastguard Worker list<dag> pattern> { 2843*9880d681SAndroid Build Coastguard Worker 2844*9880d681SAndroid Build Coastguard Worker def "" : MTBUF_Pseudo <opName, outs, ins, pattern>; 2845*9880d681SAndroid Build Coastguard Worker 2846*9880d681SAndroid Build Coastguard Worker def _si : MTBUF_Real_si <op, opName, outs, ins, asm>; 2847*9880d681SAndroid Build Coastguard Worker 2848*9880d681SAndroid Build Coastguard Worker def _vi : MTBUF_Real_vi <{0, op{2}, op{1}, op{0}}, opName, outs, ins, asm>; 2849*9880d681SAndroid Build Coastguard Worker 2850*9880d681SAndroid Build Coastguard Worker} 2851*9880d681SAndroid Build Coastguard Worker 2852*9880d681SAndroid Build Coastguard Workerlet mayStore = 1, mayLoad = 0 in { 2853*9880d681SAndroid Build Coastguard Worker 2854*9880d681SAndroid Build Coastguard Workermulticlass MTBUF_Store_Helper <bits<3> op, string opName, 2855*9880d681SAndroid Build Coastguard Worker RegisterClass regClass> : MTBUF_m < 2856*9880d681SAndroid Build Coastguard Worker op, opName, (outs), 2857*9880d681SAndroid Build Coastguard Worker (ins regClass:$vdata, u16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, 2858*9880d681SAndroid Build Coastguard Worker i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VGPR_32:$vaddr, 2859*9880d681SAndroid Build Coastguard Worker SReg_128:$srsrc, i1imm:$slc, i1imm:$tfe, SCSrc_32:$soffset), 2860*9880d681SAndroid Build Coastguard Worker opName#" $vdata, $offset, $offen, $idxen, $glc, $addr64, $dfmt," 2861*9880d681SAndroid Build Coastguard Worker #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset", [] 2862*9880d681SAndroid Build Coastguard Worker>; 2863*9880d681SAndroid Build Coastguard Worker 2864*9880d681SAndroid Build Coastguard Worker} // mayStore = 1, mayLoad = 0 2865*9880d681SAndroid Build Coastguard Worker 2866*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, mayStore = 0 in { 2867*9880d681SAndroid Build Coastguard Worker 2868*9880d681SAndroid Build Coastguard Workermulticlass MTBUF_Load_Helper <bits<3> op, string opName, 2869*9880d681SAndroid Build Coastguard Worker RegisterClass regClass> : MTBUF_m < 2870*9880d681SAndroid Build Coastguard Worker op, opName, (outs regClass:$dst), 2871*9880d681SAndroid Build Coastguard Worker (ins u16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64, 2872*9880d681SAndroid Build Coastguard Worker i8imm:$dfmt, i8imm:$nfmt, VGPR_32:$vaddr, SReg_128:$srsrc, 2873*9880d681SAndroid Build Coastguard Worker i1imm:$slc, i1imm:$tfe, SCSrc_32:$soffset), 2874*9880d681SAndroid Build Coastguard Worker opName#" $dst, $offset, $offen, $idxen, $glc, $addr64, $dfmt," 2875*9880d681SAndroid Build Coastguard Worker #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset", [] 2876*9880d681SAndroid Build Coastguard Worker>; 2877*9880d681SAndroid Build Coastguard Worker 2878*9880d681SAndroid Build Coastguard Worker} // mayLoad = 1, mayStore = 0 2879*9880d681SAndroid Build Coastguard Worker 2880*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2881*9880d681SAndroid Build Coastguard Worker// MUBUF classes 2882*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2883*9880d681SAndroid Build Coastguard Worker 2884*9880d681SAndroid Build Coastguard Workerclass mubuf <bits<7> si, bits<7> vi = si> { 2885*9880d681SAndroid Build Coastguard Worker field bits<7> SI = si; 2886*9880d681SAndroid Build Coastguard Worker field bits<7> VI = vi; 2887*9880d681SAndroid Build Coastguard Worker} 2888*9880d681SAndroid Build Coastguard Worker 2889*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 0 in { 2890*9880d681SAndroid Build Coastguard Worker 2891*9880d681SAndroid Build Coastguard Workerclass MUBUF_si <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> : 2892*9880d681SAndroid Build Coastguard Worker MUBUF <outs, ins, asm, pattern>, MUBUFe <op> { 2893*9880d681SAndroid Build Coastguard Worker let lds = 0; 2894*9880d681SAndroid Build Coastguard Worker} 2895*9880d681SAndroid Build Coastguard Worker 2896*9880d681SAndroid Build Coastguard Worker} // End let isCodeGenOnly = 0 2897*9880d681SAndroid Build Coastguard Worker 2898*9880d681SAndroid Build Coastguard Workerclass MUBUF_vi <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> : 2899*9880d681SAndroid Build Coastguard Worker MUBUF <outs, ins, asm, pattern>, MUBUFe_vi <op> { 2900*9880d681SAndroid Build Coastguard Worker let lds = 0; 2901*9880d681SAndroid Build Coastguard Worker} 2902*9880d681SAndroid Build Coastguard Worker 2903*9880d681SAndroid Build Coastguard Workerclass MUBUFAddr64Table <bit is_addr64, string suffix = ""> { 2904*9880d681SAndroid Build Coastguard Worker bit IsAddr64 = is_addr64; 2905*9880d681SAndroid Build Coastguard Worker string OpName = NAME # suffix; 2906*9880d681SAndroid Build Coastguard Worker} 2907*9880d681SAndroid Build Coastguard Worker 2908*9880d681SAndroid Build Coastguard Workerclass MUBUF_Pseudo <string opName, dag outs, dag ins, list<dag> pattern> : 2909*9880d681SAndroid Build Coastguard Worker MUBUF <outs, ins, "", pattern>, 2910*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.NONE> { 2911*9880d681SAndroid Build Coastguard Worker let isPseudo = 1; 2912*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1; 2913*9880d681SAndroid Build Coastguard Worker 2914*9880d681SAndroid Build Coastguard Worker // dummy fields, so that we can use let statements around multiclasses 2915*9880d681SAndroid Build Coastguard Worker bits<1> offen; 2916*9880d681SAndroid Build Coastguard Worker bits<1> idxen; 2917*9880d681SAndroid Build Coastguard Worker bits<8> vaddr; 2918*9880d681SAndroid Build Coastguard Worker bits<1> glc; 2919*9880d681SAndroid Build Coastguard Worker bits<1> slc; 2920*9880d681SAndroid Build Coastguard Worker bits<1> tfe; 2921*9880d681SAndroid Build Coastguard Worker bits<8> soffset; 2922*9880d681SAndroid Build Coastguard Worker} 2923*9880d681SAndroid Build Coastguard Worker 2924*9880d681SAndroid Build Coastguard Workerclass MUBUF_Real_si <mubuf op, string opName, dag outs, dag ins, 2925*9880d681SAndroid Build Coastguard Worker string asm> : 2926*9880d681SAndroid Build Coastguard Worker MUBUF <outs, ins, asm, []>, 2927*9880d681SAndroid Build Coastguard Worker MUBUFe <op.SI>, 2928*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.SI> { 2929*9880d681SAndroid Build Coastguard Worker let lds = 0; 2930*9880d681SAndroid Build Coastguard Worker let AssemblerPredicate = SIAssemblerPredicate; 2931*9880d681SAndroid Build Coastguard Worker let DecoderNamespace="SICI"; 2932*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 2933*9880d681SAndroid Build Coastguard Worker} 2934*9880d681SAndroid Build Coastguard Worker 2935*9880d681SAndroid Build Coastguard Workerclass MUBUF_Real_vi <mubuf op, string opName, dag outs, dag ins, 2936*9880d681SAndroid Build Coastguard Worker string asm> : 2937*9880d681SAndroid Build Coastguard Worker MUBUF <outs, ins, asm, []>, 2938*9880d681SAndroid Build Coastguard Worker MUBUFe_vi <op.VI>, 2939*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.VI> { 2940*9880d681SAndroid Build Coastguard Worker let lds = 0; 2941*9880d681SAndroid Build Coastguard Worker let AssemblerPredicate = VIAssemblerPredicate; 2942*9880d681SAndroid Build Coastguard Worker let DecoderNamespace="VI"; 2943*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 2944*9880d681SAndroid Build Coastguard Worker} 2945*9880d681SAndroid Build Coastguard Worker 2946*9880d681SAndroid Build Coastguard Workermulticlass MUBUF_m <mubuf op, string opName, dag outs, dag ins, string asm, 2947*9880d681SAndroid Build Coastguard Worker list<dag> pattern> { 2948*9880d681SAndroid Build Coastguard Worker 2949*9880d681SAndroid Build Coastguard Worker def "" : MUBUF_Pseudo <opName, outs, ins, pattern>, 2950*9880d681SAndroid Build Coastguard Worker MUBUFAddr64Table <0>; 2951*9880d681SAndroid Build Coastguard Worker 2952*9880d681SAndroid Build Coastguard Worker let addr64 = 0, isCodeGenOnly = 0 in { 2953*9880d681SAndroid Build Coastguard Worker def _si : MUBUF_Real_si <op, opName, outs, ins, asm>; 2954*9880d681SAndroid Build Coastguard Worker } 2955*9880d681SAndroid Build Coastguard Worker 2956*9880d681SAndroid Build Coastguard Worker def _vi : MUBUF_Real_vi <op, opName, outs, ins, asm>; 2957*9880d681SAndroid Build Coastguard Worker} 2958*9880d681SAndroid Build Coastguard Worker 2959*9880d681SAndroid Build Coastguard Workermulticlass MUBUFAddr64_m <mubuf op, string opName, dag outs, 2960*9880d681SAndroid Build Coastguard Worker dag ins, string asm, list<dag> pattern> { 2961*9880d681SAndroid Build Coastguard Worker 2962*9880d681SAndroid Build Coastguard Worker def "" : MUBUF_Pseudo <opName, outs, ins, pattern>, 2963*9880d681SAndroid Build Coastguard Worker MUBUFAddr64Table <1>; 2964*9880d681SAndroid Build Coastguard Worker 2965*9880d681SAndroid Build Coastguard Worker let addr64 = 1, isCodeGenOnly = 0 in { 2966*9880d681SAndroid Build Coastguard Worker def _si : MUBUF_Real_si <op, opName, outs, ins, asm>; 2967*9880d681SAndroid Build Coastguard Worker } 2968*9880d681SAndroid Build Coastguard Worker 2969*9880d681SAndroid Build Coastguard Worker // There is no VI version. If the pseudo is selected, it should be lowered 2970*9880d681SAndroid Build Coastguard Worker // for VI appropriately. 2971*9880d681SAndroid Build Coastguard Worker} 2972*9880d681SAndroid Build Coastguard Worker 2973*9880d681SAndroid Build Coastguard Workermulticlass MUBUFAtomicOffset_m <mubuf op, string opName, dag outs, dag ins, 2974*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pattern, bit is_return> { 2975*9880d681SAndroid Build Coastguard Worker 2976*9880d681SAndroid Build Coastguard Worker def "" : MUBUF_Pseudo <opName, outs, ins, pattern>, 2977*9880d681SAndroid Build Coastguard Worker MUBUFAddr64Table <0, !if(is_return, "_RTN", "")>, 2978*9880d681SAndroid Build Coastguard Worker AtomicNoRet<NAME#"_OFFSET", is_return>; 2979*9880d681SAndroid Build Coastguard Worker 2980*9880d681SAndroid Build Coastguard Worker let offen = 0, idxen = 0, tfe = 0, vaddr = 0 in { 2981*9880d681SAndroid Build Coastguard Worker let addr64 = 0 in { 2982*9880d681SAndroid Build Coastguard Worker def _si : MUBUF_Real_si <op, opName, outs, ins, asm>; 2983*9880d681SAndroid Build Coastguard Worker } 2984*9880d681SAndroid Build Coastguard Worker 2985*9880d681SAndroid Build Coastguard Worker def _vi : MUBUF_Real_vi <op, opName, outs, ins, asm>; 2986*9880d681SAndroid Build Coastguard Worker } 2987*9880d681SAndroid Build Coastguard Worker} 2988*9880d681SAndroid Build Coastguard Worker 2989*9880d681SAndroid Build Coastguard Workermulticlass MUBUFAtomicAddr64_m <mubuf op, string opName, dag outs, dag ins, 2990*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pattern, bit is_return> { 2991*9880d681SAndroid Build Coastguard Worker 2992*9880d681SAndroid Build Coastguard Worker def "" : MUBUF_Pseudo <opName, outs, ins, pattern>, 2993*9880d681SAndroid Build Coastguard Worker MUBUFAddr64Table <1, !if(is_return, "_RTN", "")>, 2994*9880d681SAndroid Build Coastguard Worker AtomicNoRet<NAME#"_ADDR64", is_return>; 2995*9880d681SAndroid Build Coastguard Worker 2996*9880d681SAndroid Build Coastguard Worker let offen = 0, idxen = 0, addr64 = 1, tfe = 0 in { 2997*9880d681SAndroid Build Coastguard Worker def _si : MUBUF_Real_si <op, opName, outs, ins, asm>; 2998*9880d681SAndroid Build Coastguard Worker } 2999*9880d681SAndroid Build Coastguard Worker 3000*9880d681SAndroid Build Coastguard Worker // There is no VI version. If the pseudo is selected, it should be lowered 3001*9880d681SAndroid Build Coastguard Worker // for VI appropriately. 3002*9880d681SAndroid Build Coastguard Worker} 3003*9880d681SAndroid Build Coastguard Worker 3004*9880d681SAndroid Build Coastguard Workermulticlass MUBUFAtomicOther_m <mubuf op, string opName, dag outs, dag ins, 3005*9880d681SAndroid Build Coastguard Worker string asm, list<dag> pattern, bit is_return> { 3006*9880d681SAndroid Build Coastguard Worker 3007*9880d681SAndroid Build Coastguard Worker def "" : MUBUF_Pseudo <opName, outs, ins, pattern>, 3008*9880d681SAndroid Build Coastguard Worker AtomicNoRet<opName, is_return>; 3009*9880d681SAndroid Build Coastguard Worker 3010*9880d681SAndroid Build Coastguard Worker let tfe = 0 in { 3011*9880d681SAndroid Build Coastguard Worker let addr64 = 0 in { 3012*9880d681SAndroid Build Coastguard Worker def _si : MUBUF_Real_si <op, opName, outs, ins, asm>; 3013*9880d681SAndroid Build Coastguard Worker } 3014*9880d681SAndroid Build Coastguard Worker 3015*9880d681SAndroid Build Coastguard Worker def _vi : MUBUF_Real_vi <op, opName, outs, ins, asm>; 3016*9880d681SAndroid Build Coastguard Worker } 3017*9880d681SAndroid Build Coastguard Worker} 3018*9880d681SAndroid Build Coastguard Worker 3019*9880d681SAndroid Build Coastguard Workermulticlass MUBUF_Atomic <mubuf op, string name, RegisterClass rc, 3020*9880d681SAndroid Build Coastguard Worker ValueType vt, SDPatternOperator atomic> { 3021*9880d681SAndroid Build Coastguard Worker 3022*9880d681SAndroid Build Coastguard Worker let mayStore = 1, mayLoad = 1, hasPostISelHook = 1, hasSideEffects = 1 in { 3023*9880d681SAndroid Build Coastguard Worker 3024*9880d681SAndroid Build Coastguard Worker // No return variants 3025*9880d681SAndroid Build Coastguard Worker let glc = 0, AsmMatchConverter = "cvtMubufAtomic" in { 3026*9880d681SAndroid Build Coastguard Worker 3027*9880d681SAndroid Build Coastguard Worker defm _ADDR64 : MUBUFAtomicAddr64_m < 3028*9880d681SAndroid Build Coastguard Worker op, name#"_addr64", (outs), 3029*9880d681SAndroid Build Coastguard Worker (ins rc:$vdata, VReg_64:$vaddr, SReg_128:$srsrc, 3030*9880d681SAndroid Build Coastguard Worker SCSrc_32:$soffset, offset:$offset, slc:$slc), 3031*9880d681SAndroid Build Coastguard Worker name#" $vdata, $vaddr, $srsrc, $soffset addr64$offset$slc", [], 0 3032*9880d681SAndroid Build Coastguard Worker >; 3033*9880d681SAndroid Build Coastguard Worker 3034*9880d681SAndroid Build Coastguard Worker defm _OFFSET : MUBUFAtomicOffset_m < 3035*9880d681SAndroid Build Coastguard Worker op, name#"_offset", (outs), 3036*9880d681SAndroid Build Coastguard Worker (ins rc:$vdata, SReg_128:$srsrc, SCSrc_32:$soffset, offset:$offset, 3037*9880d681SAndroid Build Coastguard Worker slc:$slc), 3038*9880d681SAndroid Build Coastguard Worker name#" $vdata, off, $srsrc, $soffset$offset$slc", [], 0 3039*9880d681SAndroid Build Coastguard Worker >; 3040*9880d681SAndroid Build Coastguard Worker 3041*9880d681SAndroid Build Coastguard Worker let offen = 1, idxen = 0 in { 3042*9880d681SAndroid Build Coastguard Worker defm _OFFEN : MUBUFAtomicOther_m < 3043*9880d681SAndroid Build Coastguard Worker op, name#"_offen", (outs), 3044*9880d681SAndroid Build Coastguard Worker (ins rc:$vdata, VGPR_32:$vaddr, SReg_128:$srsrc, SCSrc_32:$soffset, 3045*9880d681SAndroid Build Coastguard Worker offset:$offset, slc:$slc), 3046*9880d681SAndroid Build Coastguard Worker name#" $vdata, $vaddr, $srsrc, $soffset offen$offset$slc", [], 0 3047*9880d681SAndroid Build Coastguard Worker >; 3048*9880d681SAndroid Build Coastguard Worker } 3049*9880d681SAndroid Build Coastguard Worker 3050*9880d681SAndroid Build Coastguard Worker let offen = 0, idxen = 1 in { 3051*9880d681SAndroid Build Coastguard Worker defm _IDXEN : MUBUFAtomicOther_m < 3052*9880d681SAndroid Build Coastguard Worker op, name#"_idxen", (outs), 3053*9880d681SAndroid Build Coastguard Worker (ins rc:$vdata, VGPR_32:$vaddr, SReg_128:$srsrc, SCSrc_32:$soffset, 3054*9880d681SAndroid Build Coastguard Worker offset:$offset, slc:$slc), 3055*9880d681SAndroid Build Coastguard Worker name#" $vdata, $vaddr, $srsrc, $soffset idxen$offset$slc", [], 0 3056*9880d681SAndroid Build Coastguard Worker >; 3057*9880d681SAndroid Build Coastguard Worker } 3058*9880d681SAndroid Build Coastguard Worker 3059*9880d681SAndroid Build Coastguard Worker let offen = 1, idxen = 1 in { 3060*9880d681SAndroid Build Coastguard Worker defm _BOTHEN : MUBUFAtomicOther_m < 3061*9880d681SAndroid Build Coastguard Worker op, name#"_bothen", (outs), 3062*9880d681SAndroid Build Coastguard Worker (ins rc:$vdata, VReg_64:$vaddr, SReg_128:$srsrc, SCSrc_32:$soffset, 3063*9880d681SAndroid Build Coastguard Worker offset:$offset, slc:$slc), 3064*9880d681SAndroid Build Coastguard Worker name#" $vdata, $vaddr, $srsrc, $soffset idxen offen$offset$slc", 3065*9880d681SAndroid Build Coastguard Worker [], 0 3066*9880d681SAndroid Build Coastguard Worker >; 3067*9880d681SAndroid Build Coastguard Worker } 3068*9880d681SAndroid Build Coastguard Worker } // glc = 0 3069*9880d681SAndroid Build Coastguard Worker 3070*9880d681SAndroid Build Coastguard Worker // Variant that return values 3071*9880d681SAndroid Build Coastguard Worker let glc = 1, Constraints = "$vdata = $vdata_in", 3072*9880d681SAndroid Build Coastguard Worker AsmMatchConverter = "cvtMubufAtomicReturn", 3073*9880d681SAndroid Build Coastguard Worker DisableEncoding = "$vdata_in" in { 3074*9880d681SAndroid Build Coastguard Worker 3075*9880d681SAndroid Build Coastguard Worker defm _RTN_ADDR64 : MUBUFAtomicAddr64_m < 3076*9880d681SAndroid Build Coastguard Worker op, name#"_rtn_addr64", (outs rc:$vdata), 3077*9880d681SAndroid Build Coastguard Worker (ins rc:$vdata_in, VReg_64:$vaddr, SReg_128:$srsrc, 3078*9880d681SAndroid Build Coastguard Worker SCSrc_32:$soffset, offset:$offset, slc:$slc), 3079*9880d681SAndroid Build Coastguard Worker name#" $vdata, $vaddr, $srsrc, $soffset addr64$offset glc$slc", 3080*9880d681SAndroid Build Coastguard Worker [(set vt:$vdata, 3081*9880d681SAndroid Build Coastguard Worker (atomic (MUBUFAddr64Atomic v4i32:$srsrc, i64:$vaddr, i32:$soffset, 3082*9880d681SAndroid Build Coastguard Worker i16:$offset, i1:$slc), vt:$vdata_in))], 1 3083*9880d681SAndroid Build Coastguard Worker >; 3084*9880d681SAndroid Build Coastguard Worker 3085*9880d681SAndroid Build Coastguard Worker defm _RTN_OFFSET : MUBUFAtomicOffset_m < 3086*9880d681SAndroid Build Coastguard Worker op, name#"_rtn_offset", (outs rc:$vdata), 3087*9880d681SAndroid Build Coastguard Worker (ins rc:$vdata_in, SReg_128:$srsrc, SCSrc_32:$soffset, 3088*9880d681SAndroid Build Coastguard Worker offset:$offset, slc:$slc), 3089*9880d681SAndroid Build Coastguard Worker name#" $vdata, off, $srsrc, $soffset$offset glc$slc", 3090*9880d681SAndroid Build Coastguard Worker [(set vt:$vdata, 3091*9880d681SAndroid Build Coastguard Worker (atomic (MUBUFOffsetAtomic v4i32:$srsrc, i32:$soffset, i16:$offset, 3092*9880d681SAndroid Build Coastguard Worker i1:$slc), vt:$vdata_in))], 1 3093*9880d681SAndroid Build Coastguard Worker >; 3094*9880d681SAndroid Build Coastguard Worker 3095*9880d681SAndroid Build Coastguard Worker let offen = 1, idxen = 0 in { 3096*9880d681SAndroid Build Coastguard Worker defm _RTN_OFFEN : MUBUFAtomicOther_m < 3097*9880d681SAndroid Build Coastguard Worker op, name#"_rtn_offen", (outs rc:$vdata), 3098*9880d681SAndroid Build Coastguard Worker (ins rc:$vdata_in, VGPR_32:$vaddr, SReg_128:$srsrc, SCSrc_32:$soffset, 3099*9880d681SAndroid Build Coastguard Worker offset:$offset, slc:$slc), 3100*9880d681SAndroid Build Coastguard Worker name#" $vdata, $vaddr, $srsrc, $soffset offen$offset glc$slc", 3101*9880d681SAndroid Build Coastguard Worker [], 1 3102*9880d681SAndroid Build Coastguard Worker >; 3103*9880d681SAndroid Build Coastguard Worker } 3104*9880d681SAndroid Build Coastguard Worker 3105*9880d681SAndroid Build Coastguard Worker let offen = 0, idxen = 1 in { 3106*9880d681SAndroid Build Coastguard Worker defm _RTN_IDXEN : MUBUFAtomicOther_m < 3107*9880d681SAndroid Build Coastguard Worker op, name#"_rtn_idxen", (outs rc:$vdata), 3108*9880d681SAndroid Build Coastguard Worker (ins rc:$vdata_in, VGPR_32:$vaddr, SReg_128:$srsrc, SCSrc_32:$soffset, 3109*9880d681SAndroid Build Coastguard Worker offset:$offset, slc:$slc), 3110*9880d681SAndroid Build Coastguard Worker name#" $vdata, $vaddr, $srsrc, $soffset idxen$offset glc$slc", 3111*9880d681SAndroid Build Coastguard Worker [], 1 3112*9880d681SAndroid Build Coastguard Worker >; 3113*9880d681SAndroid Build Coastguard Worker } 3114*9880d681SAndroid Build Coastguard Worker 3115*9880d681SAndroid Build Coastguard Worker let offen = 1, idxen = 1 in { 3116*9880d681SAndroid Build Coastguard Worker defm _RTN_BOTHEN : MUBUFAtomicOther_m < 3117*9880d681SAndroid Build Coastguard Worker op, name#"_rtn_bothen", (outs rc:$vdata), 3118*9880d681SAndroid Build Coastguard Worker (ins rc:$vdata_in, VReg_64:$vaddr, SReg_128:$srsrc, SCSrc_32:$soffset, 3119*9880d681SAndroid Build Coastguard Worker offset:$offset, slc:$slc), 3120*9880d681SAndroid Build Coastguard Worker name#" $vdata, $vaddr, $srsrc, $soffset idxen offen$offset glc$slc", 3121*9880d681SAndroid Build Coastguard Worker [], 1 3122*9880d681SAndroid Build Coastguard Worker >; 3123*9880d681SAndroid Build Coastguard Worker } 3124*9880d681SAndroid Build Coastguard Worker } // glc = 1 3125*9880d681SAndroid Build Coastguard Worker 3126*9880d681SAndroid Build Coastguard Worker } // mayStore = 1, mayLoad = 1, hasPostISelHook = 1 3127*9880d681SAndroid Build Coastguard Worker} 3128*9880d681SAndroid Build Coastguard Worker 3129*9880d681SAndroid Build Coastguard Worker// FIXME: tfe can't be an operand because it requires a separate 3130*9880d681SAndroid Build Coastguard Worker// opcode because it needs an N+1 register class dest register. 3131*9880d681SAndroid Build Coastguard Workermulticlass MUBUF_Load_Helper <mubuf op, string name, RegisterClass regClass, 3132*9880d681SAndroid Build Coastguard Worker ValueType load_vt = i32, 3133*9880d681SAndroid Build Coastguard Worker SDPatternOperator ld = null_frag> { 3134*9880d681SAndroid Build Coastguard Worker 3135*9880d681SAndroid Build Coastguard Worker let mayLoad = 1, mayStore = 0 in { 3136*9880d681SAndroid Build Coastguard Worker let offen = 0, idxen = 0, vaddr = 0 in { 3137*9880d681SAndroid Build Coastguard Worker defm _OFFSET : MUBUF_m <op, name#"_offset", (outs regClass:$vdata), 3138*9880d681SAndroid Build Coastguard Worker (ins SReg_128:$srsrc, SCSrc_32:$soffset, 3139*9880d681SAndroid Build Coastguard Worker offset:$offset, glc:$glc, slc:$slc, tfe:$tfe), 3140*9880d681SAndroid Build Coastguard Worker name#" $vdata, off, $srsrc, $soffset$offset$glc$slc$tfe", 3141*9880d681SAndroid Build Coastguard Worker [(set load_vt:$vdata, (ld (MUBUFOffset v4i32:$srsrc, 3142*9880d681SAndroid Build Coastguard Worker i32:$soffset, i16:$offset, 3143*9880d681SAndroid Build Coastguard Worker i1:$glc, i1:$slc, i1:$tfe)))]>; 3144*9880d681SAndroid Build Coastguard Worker } 3145*9880d681SAndroid Build Coastguard Worker 3146*9880d681SAndroid Build Coastguard Worker let offen = 1, idxen = 0 in { 3147*9880d681SAndroid Build Coastguard Worker defm _OFFEN : MUBUF_m <op, name#"_offen", (outs regClass:$vdata), 3148*9880d681SAndroid Build Coastguard Worker (ins VGPR_32:$vaddr, SReg_128:$srsrc, 3149*9880d681SAndroid Build Coastguard Worker SCSrc_32:$soffset, offset:$offset, glc:$glc, slc:$slc, 3150*9880d681SAndroid Build Coastguard Worker tfe:$tfe), 3151*9880d681SAndroid Build Coastguard Worker name#" $vdata, $vaddr, $srsrc, $soffset offen$offset$glc$slc$tfe", []>; 3152*9880d681SAndroid Build Coastguard Worker } 3153*9880d681SAndroid Build Coastguard Worker 3154*9880d681SAndroid Build Coastguard Worker let offen = 0, idxen = 1 in { 3155*9880d681SAndroid Build Coastguard Worker defm _IDXEN : MUBUF_m <op, name#"_idxen", (outs regClass:$vdata), 3156*9880d681SAndroid Build Coastguard Worker (ins VGPR_32:$vaddr, SReg_128:$srsrc, 3157*9880d681SAndroid Build Coastguard Worker SCSrc_32:$soffset, offset:$offset, glc:$glc, 3158*9880d681SAndroid Build Coastguard Worker slc:$slc, tfe:$tfe), 3159*9880d681SAndroid Build Coastguard Worker name#" $vdata, $vaddr, $srsrc, $soffset idxen$offset$glc$slc$tfe", []>; 3160*9880d681SAndroid Build Coastguard Worker } 3161*9880d681SAndroid Build Coastguard Worker 3162*9880d681SAndroid Build Coastguard Worker let offen = 1, idxen = 1 in { 3163*9880d681SAndroid Build Coastguard Worker defm _BOTHEN : MUBUF_m <op, name#"_bothen", (outs regClass:$vdata), 3164*9880d681SAndroid Build Coastguard Worker (ins VReg_64:$vaddr, SReg_128:$srsrc, SCSrc_32:$soffset, 3165*9880d681SAndroid Build Coastguard Worker offset:$offset, glc:$glc, slc:$slc, tfe:$tfe), 3166*9880d681SAndroid Build Coastguard Worker name#" $vdata, $vaddr, $srsrc, $soffset idxen offen$offset$glc$slc$tfe", []>; 3167*9880d681SAndroid Build Coastguard Worker } 3168*9880d681SAndroid Build Coastguard Worker 3169*9880d681SAndroid Build Coastguard Worker let offen = 0, idxen = 0 in { 3170*9880d681SAndroid Build Coastguard Worker defm _ADDR64 : MUBUFAddr64_m <op, name#"_addr64", (outs regClass:$vdata), 3171*9880d681SAndroid Build Coastguard Worker (ins VReg_64:$vaddr, SReg_128:$srsrc, 3172*9880d681SAndroid Build Coastguard Worker SCSrc_32:$soffset, offset:$offset, 3173*9880d681SAndroid Build Coastguard Worker glc:$glc, slc:$slc, tfe:$tfe), 3174*9880d681SAndroid Build Coastguard Worker name#" $vdata, $vaddr, $srsrc, $soffset addr64$offset$glc$slc$tfe", 3175*9880d681SAndroid Build Coastguard Worker [(set load_vt:$vdata, (ld (MUBUFAddr64 v4i32:$srsrc, 3176*9880d681SAndroid Build Coastguard Worker i64:$vaddr, i32:$soffset, 3177*9880d681SAndroid Build Coastguard Worker i16:$offset, i1:$glc, i1:$slc, 3178*9880d681SAndroid Build Coastguard Worker i1:$tfe)))]>; 3179*9880d681SAndroid Build Coastguard Worker } 3180*9880d681SAndroid Build Coastguard Worker } 3181*9880d681SAndroid Build Coastguard Worker} 3182*9880d681SAndroid Build Coastguard Worker 3183*9880d681SAndroid Build Coastguard Workermulticlass MUBUF_Store_Helper <mubuf op, string name, RegisterClass vdataClass, 3184*9880d681SAndroid Build Coastguard Worker ValueType store_vt = i32, SDPatternOperator st = null_frag> { 3185*9880d681SAndroid Build Coastguard Worker let mayLoad = 0, mayStore = 1 in { 3186*9880d681SAndroid Build Coastguard Worker let offen = 0, idxen = 0, vaddr = 0 in { 3187*9880d681SAndroid Build Coastguard Worker defm _OFFSET : MUBUF_m <op, name#"_offset",(outs), 3188*9880d681SAndroid Build Coastguard Worker (ins vdataClass:$vdata, SReg_128:$srsrc, SCSrc_32:$soffset, 3189*9880d681SAndroid Build Coastguard Worker offset:$offset, glc:$glc, slc:$slc, tfe:$tfe), 3190*9880d681SAndroid Build Coastguard Worker name#" $vdata, off, $srsrc, $soffset$offset$glc$slc$tfe", 3191*9880d681SAndroid Build Coastguard Worker [(st store_vt:$vdata, (MUBUFOffset v4i32:$srsrc, i32:$soffset, 3192*9880d681SAndroid Build Coastguard Worker i16:$offset, i1:$glc, i1:$slc, i1:$tfe))]>; 3193*9880d681SAndroid Build Coastguard Worker } // offen = 0, idxen = 0, vaddr = 0 3194*9880d681SAndroid Build Coastguard Worker 3195*9880d681SAndroid Build Coastguard Worker let offen = 1, idxen = 0 in { 3196*9880d681SAndroid Build Coastguard Worker defm _OFFEN : MUBUF_m <op, name#"_offen", (outs), 3197*9880d681SAndroid Build Coastguard Worker (ins vdataClass:$vdata, VGPR_32:$vaddr, SReg_128:$srsrc, 3198*9880d681SAndroid Build Coastguard Worker SCSrc_32:$soffset, offset:$offset, glc:$glc, 3199*9880d681SAndroid Build Coastguard Worker slc:$slc, tfe:$tfe), 3200*9880d681SAndroid Build Coastguard Worker name#" $vdata, $vaddr, $srsrc, $soffset offen"# 3201*9880d681SAndroid Build Coastguard Worker "$offset$glc$slc$tfe", []>; 3202*9880d681SAndroid Build Coastguard Worker } // end offen = 1, idxen = 0 3203*9880d681SAndroid Build Coastguard Worker 3204*9880d681SAndroid Build Coastguard Worker let offen = 0, idxen = 1 in { 3205*9880d681SAndroid Build Coastguard Worker defm _IDXEN : MUBUF_m <op, name#"_idxen", (outs), 3206*9880d681SAndroid Build Coastguard Worker (ins vdataClass:$vdata, VGPR_32:$vaddr, SReg_128:$srsrc, 3207*9880d681SAndroid Build Coastguard Worker SCSrc_32:$soffset, offset:$offset, glc:$glc, 3208*9880d681SAndroid Build Coastguard Worker slc:$slc, tfe:$tfe), 3209*9880d681SAndroid Build Coastguard Worker name#" $vdata, $vaddr, $srsrc, $soffset idxen$offset$glc$slc$tfe", []>; 3210*9880d681SAndroid Build Coastguard Worker } 3211*9880d681SAndroid Build Coastguard Worker 3212*9880d681SAndroid Build Coastguard Worker let offen = 1, idxen = 1 in { 3213*9880d681SAndroid Build Coastguard Worker defm _BOTHEN : MUBUF_m <op, name#"_bothen", (outs), 3214*9880d681SAndroid Build Coastguard Worker (ins vdataClass:$vdata, VReg_64:$vaddr, SReg_128:$srsrc, SCSrc_32:$soffset, 3215*9880d681SAndroid Build Coastguard Worker offset:$offset, glc:$glc, slc:$slc, tfe:$tfe), 3216*9880d681SAndroid Build Coastguard Worker name#" $vdata, $vaddr, $srsrc, $soffset idxen offen$offset$glc$slc$tfe", []>; 3217*9880d681SAndroid Build Coastguard Worker } 3218*9880d681SAndroid Build Coastguard Worker 3219*9880d681SAndroid Build Coastguard Worker let offen = 0, idxen = 0 in { 3220*9880d681SAndroid Build Coastguard Worker defm _ADDR64 : MUBUFAddr64_m <op, name#"_addr64", (outs), 3221*9880d681SAndroid Build Coastguard Worker (ins vdataClass:$vdata, VReg_64:$vaddr, SReg_128:$srsrc, 3222*9880d681SAndroid Build Coastguard Worker SCSrc_32:$soffset, 3223*9880d681SAndroid Build Coastguard Worker offset:$offset, glc:$glc, slc:$slc, 3224*9880d681SAndroid Build Coastguard Worker tfe:$tfe), 3225*9880d681SAndroid Build Coastguard Worker name#" $vdata, $vaddr, $srsrc, $soffset addr64"# 3226*9880d681SAndroid Build Coastguard Worker "$offset$glc$slc$tfe", 3227*9880d681SAndroid Build Coastguard Worker [(st store_vt:$vdata, 3228*9880d681SAndroid Build Coastguard Worker (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, 3229*9880d681SAndroid Build Coastguard Worker i32:$soffset, i16:$offset, 3230*9880d681SAndroid Build Coastguard Worker i1:$glc, i1:$slc, i1:$tfe))]>; 3231*9880d681SAndroid Build Coastguard Worker } 3232*9880d681SAndroid Build Coastguard Worker } // End mayLoad = 0, mayStore = 1 3233*9880d681SAndroid Build Coastguard Worker} 3234*9880d681SAndroid Build Coastguard Worker 3235*9880d681SAndroid Build Coastguard Worker// For cache invalidation instructions. 3236*9880d681SAndroid Build Coastguard Workermulticlass MUBUF_Invalidate <mubuf op, string opName, SDPatternOperator node> { 3237*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 1, mayStore = 1, AsmMatchConverter = "" in { 3238*9880d681SAndroid Build Coastguard Worker def "" : MUBUF_Pseudo <opName, (outs), (ins), [(node)]>; 3239*9880d681SAndroid Build Coastguard Worker 3240*9880d681SAndroid Build Coastguard Worker // Set everything to 0. 3241*9880d681SAndroid Build Coastguard Worker let offset = 0, offen = 0, idxen = 0, glc = 0, vaddr = 0, 3242*9880d681SAndroid Build Coastguard Worker vdata = 0, srsrc = 0, slc = 0, tfe = 0, soffset = 0 in { 3243*9880d681SAndroid Build Coastguard Worker let addr64 = 0 in { 3244*9880d681SAndroid Build Coastguard Worker def _si : MUBUF_Real_si <op, opName, (outs), (ins), opName>; 3245*9880d681SAndroid Build Coastguard Worker } 3246*9880d681SAndroid Build Coastguard Worker 3247*9880d681SAndroid Build Coastguard Worker def _vi : MUBUF_Real_vi <op, opName, (outs), (ins), opName>; 3248*9880d681SAndroid Build Coastguard Worker } 3249*9880d681SAndroid Build Coastguard Worker } // End hasSideEffects = 1, mayStore = 1, AsmMatchConverter = "" 3250*9880d681SAndroid Build Coastguard Worker} 3251*9880d681SAndroid Build Coastguard Worker 3252*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3253*9880d681SAndroid Build Coastguard Worker// FLAT classes 3254*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3255*9880d681SAndroid Build Coastguard Worker 3256*9880d681SAndroid Build Coastguard Workerclass flat <bits<7> ci, bits<7> vi = ci> { 3257*9880d681SAndroid Build Coastguard Worker field bits<7> CI = ci; 3258*9880d681SAndroid Build Coastguard Worker field bits<7> VI = vi; 3259*9880d681SAndroid Build Coastguard Worker} 3260*9880d681SAndroid Build Coastguard Worker 3261*9880d681SAndroid Build Coastguard Workerclass FLAT_Pseudo <string opName, dag outs, dag ins, list<dag> pattern> : 3262*9880d681SAndroid Build Coastguard Worker FLAT <0, outs, ins, "", pattern>, 3263*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.NONE> { 3264*9880d681SAndroid Build Coastguard Worker let isPseudo = 1; 3265*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1; 3266*9880d681SAndroid Build Coastguard Worker} 3267*9880d681SAndroid Build Coastguard Worker 3268*9880d681SAndroid Build Coastguard Workerclass FLAT_Real_ci <bits<7> op, string opName, dag outs, dag ins, string asm> : 3269*9880d681SAndroid Build Coastguard Worker FLAT <op, outs, ins, asm, []>, 3270*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.SI> { 3271*9880d681SAndroid Build Coastguard Worker let AssemblerPredicate = isCIOnly; 3272*9880d681SAndroid Build Coastguard Worker let DecoderNamespace="CI"; 3273*9880d681SAndroid Build Coastguard Worker} 3274*9880d681SAndroid Build Coastguard Worker 3275*9880d681SAndroid Build Coastguard Workerclass FLAT_Real_vi <bits<7> op, string opName, dag outs, dag ins, string asm> : 3276*9880d681SAndroid Build Coastguard Worker FLAT <op, outs, ins, asm, []>, 3277*9880d681SAndroid Build Coastguard Worker SIMCInstr<opName, SIEncodingFamily.VI> { 3278*9880d681SAndroid Build Coastguard Worker let AssemblerPredicate = VIAssemblerPredicate; 3279*9880d681SAndroid Build Coastguard Worker let DecoderNamespace="VI"; 3280*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 3281*9880d681SAndroid Build Coastguard Worker} 3282*9880d681SAndroid Build Coastguard Worker 3283*9880d681SAndroid Build Coastguard Workermulticlass FLAT_AtomicRet_m <flat op, dag outs, dag ins, string asm, 3284*9880d681SAndroid Build Coastguard Worker list<dag> pattern> { 3285*9880d681SAndroid Build Coastguard Worker def "" : FLAT_Pseudo <NAME#"_RTN", outs, ins, pattern>, 3286*9880d681SAndroid Build Coastguard Worker AtomicNoRet <NAME, 1>; 3287*9880d681SAndroid Build Coastguard Worker 3288*9880d681SAndroid Build Coastguard Worker def _ci : FLAT_Real_ci <op.CI, NAME#"_RTN", outs, ins, asm>; 3289*9880d681SAndroid Build Coastguard Worker 3290*9880d681SAndroid Build Coastguard Worker def _vi : FLAT_Real_vi <op.VI, NAME#"_RTN", outs, ins, asm>; 3291*9880d681SAndroid Build Coastguard Worker} 3292*9880d681SAndroid Build Coastguard Worker 3293*9880d681SAndroid Build Coastguard Workermulticlass FLAT_Load_Helper <flat op, string asm_name, 3294*9880d681SAndroid Build Coastguard Worker RegisterClass regClass, 3295*9880d681SAndroid Build Coastguard Worker dag outs = (outs regClass:$vdst), 3296*9880d681SAndroid Build Coastguard Worker dag ins = (ins VReg_64:$addr, glc:$glc, slc:$slc, tfe:$tfe), 3297*9880d681SAndroid Build Coastguard Worker string asm = asm_name#" $vdst, $addr$glc$slc$tfe"> { 3298*9880d681SAndroid Build Coastguard Worker 3299*9880d681SAndroid Build Coastguard Worker let data = 0, mayLoad = 1 in { 3300*9880d681SAndroid Build Coastguard Worker 3301*9880d681SAndroid Build Coastguard Worker def "" : FLAT_Pseudo <NAME, outs, ins, []>; 3302*9880d681SAndroid Build Coastguard Worker 3303*9880d681SAndroid Build Coastguard Worker def _ci : FLAT_Real_ci <op.CI, NAME, outs, ins, asm>; 3304*9880d681SAndroid Build Coastguard Worker 3305*9880d681SAndroid Build Coastguard Worker def _vi : FLAT_Real_vi <op.VI, NAME, outs, ins, asm>; 3306*9880d681SAndroid Build Coastguard Worker } 3307*9880d681SAndroid Build Coastguard Worker} 3308*9880d681SAndroid Build Coastguard Worker 3309*9880d681SAndroid Build Coastguard Workermulticlass FLAT_Store_Helper <flat op, string asm_name, 3310*9880d681SAndroid Build Coastguard Worker RegisterClass vdataClass, 3311*9880d681SAndroid Build Coastguard Worker dag outs = (outs), 3312*9880d681SAndroid Build Coastguard Worker dag ins = (ins VReg_64:$addr, vdataClass:$data, glc:$glc, 3313*9880d681SAndroid Build Coastguard Worker slc:$slc, tfe:$tfe), 3314*9880d681SAndroid Build Coastguard Worker string asm = asm_name#" $addr, $data$glc$slc$tfe"> { 3315*9880d681SAndroid Build Coastguard Worker 3316*9880d681SAndroid Build Coastguard Worker let mayLoad = 0, mayStore = 1, vdst = 0 in { 3317*9880d681SAndroid Build Coastguard Worker 3318*9880d681SAndroid Build Coastguard Worker def "" : FLAT_Pseudo <NAME, outs, ins, []>; 3319*9880d681SAndroid Build Coastguard Worker 3320*9880d681SAndroid Build Coastguard Worker def _ci : FLAT_Real_ci <op.CI, NAME, outs, ins, asm>; 3321*9880d681SAndroid Build Coastguard Worker 3322*9880d681SAndroid Build Coastguard Worker def _vi : FLAT_Real_vi <op.VI, NAME, outs, ins, asm>; 3323*9880d681SAndroid Build Coastguard Worker } 3324*9880d681SAndroid Build Coastguard Worker} 3325*9880d681SAndroid Build Coastguard Worker 3326*9880d681SAndroid Build Coastguard Workermulticlass FLAT_ATOMIC <flat op, string asm_name, RegisterClass vdst_rc, 3327*9880d681SAndroid Build Coastguard Worker ValueType vt, SDPatternOperator atomic = null_frag, 3328*9880d681SAndroid Build Coastguard Worker ValueType data_vt = vt, 3329*9880d681SAndroid Build Coastguard Worker RegisterClass data_rc = vdst_rc, 3330*9880d681SAndroid Build Coastguard Worker string asm_noret = asm_name#" $addr, $data"#"$slc"#"$tfe"> { 3331*9880d681SAndroid Build Coastguard Worker 3332*9880d681SAndroid Build Coastguard Worker let mayLoad = 1, mayStore = 1, glc = 0, vdst = 0 in { 3333*9880d681SAndroid Build Coastguard Worker def "" : FLAT_Pseudo <NAME, (outs), 3334*9880d681SAndroid Build Coastguard Worker (ins VReg_64:$addr, data_rc:$data, 3335*9880d681SAndroid Build Coastguard Worker slc:$slc, tfe:$tfe), []>, 3336*9880d681SAndroid Build Coastguard Worker AtomicNoRet <NAME, 0>; 3337*9880d681SAndroid Build Coastguard Worker 3338*9880d681SAndroid Build Coastguard Worker def _ci : FLAT_Real_ci <op.CI, NAME, (outs), 3339*9880d681SAndroid Build Coastguard Worker (ins VReg_64:$addr, data_rc:$data, 3340*9880d681SAndroid Build Coastguard Worker slc:$slc, tfe:$tfe), 3341*9880d681SAndroid Build Coastguard Worker asm_noret>; 3342*9880d681SAndroid Build Coastguard Worker 3343*9880d681SAndroid Build Coastguard Worker def _vi : FLAT_Real_vi <op.VI, NAME, (outs), 3344*9880d681SAndroid Build Coastguard Worker (ins VReg_64:$addr, data_rc:$data, 3345*9880d681SAndroid Build Coastguard Worker slc:$slc, tfe:$tfe), 3346*9880d681SAndroid Build Coastguard Worker asm_noret>; 3347*9880d681SAndroid Build Coastguard Worker } 3348*9880d681SAndroid Build Coastguard Worker 3349*9880d681SAndroid Build Coastguard Worker let glc = 1, hasPostISelHook = 1 in { 3350*9880d681SAndroid Build Coastguard Worker defm _RTN : FLAT_AtomicRet_m < 3351*9880d681SAndroid Build Coastguard Worker op, (outs vdst_rc:$vdst), 3352*9880d681SAndroid Build Coastguard Worker (ins VReg_64:$addr, data_rc:$data, slc:$slc, tfe:$tfe), 3353*9880d681SAndroid Build Coastguard Worker asm_name#" $vdst, $addr, $data glc$slc$tfe", 3354*9880d681SAndroid Build Coastguard Worker [(set vt:$vdst, 3355*9880d681SAndroid Build Coastguard Worker (atomic (FLATAtomic i64:$addr, i1:$slc, i1:$tfe), data_vt:$data))] 3356*9880d681SAndroid Build Coastguard Worker >; 3357*9880d681SAndroid Build Coastguard Worker } 3358*9880d681SAndroid Build Coastguard Worker} 3359*9880d681SAndroid Build Coastguard Worker 3360*9880d681SAndroid Build Coastguard Workerclass MIMG_Mask <string op, int channels> { 3361*9880d681SAndroid Build Coastguard Worker string Op = op; 3362*9880d681SAndroid Build Coastguard Worker int Channels = channels; 3363*9880d681SAndroid Build Coastguard Worker} 3364*9880d681SAndroid Build Coastguard Worker 3365*9880d681SAndroid Build Coastguard Workerclass mimg <bits<7> si, bits<7> vi = si> { 3366*9880d681SAndroid Build Coastguard Worker field bits<7> SI = si; 3367*9880d681SAndroid Build Coastguard Worker field bits<7> VI = vi; 3368*9880d681SAndroid Build Coastguard Worker} 3369*9880d681SAndroid Build Coastguard Worker 3370*9880d681SAndroid Build Coastguard Workerclass MIMG_Helper <dag outs, dag ins, string asm, 3371*9880d681SAndroid Build Coastguard Worker string dns=""> : MIMG<outs, ins, asm,[]> { 3372*9880d681SAndroid Build Coastguard Worker let mayLoad = 1; 3373*9880d681SAndroid Build Coastguard Worker let mayStore = 0; 3374*9880d681SAndroid Build Coastguard Worker let hasPostISelHook = 1; 3375*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = dns; 3376*9880d681SAndroid Build Coastguard Worker let isAsmParserOnly = !if(!eq(dns,""), 1, 0); 3377*9880d681SAndroid Build Coastguard Worker let AsmMatchConverter = "cvtMIMG"; 3378*9880d681SAndroid Build Coastguard Worker} 3379*9880d681SAndroid Build Coastguard Worker 3380*9880d681SAndroid Build Coastguard Workerclass MIMG_NoSampler_Helper <bits<7> op, string asm, 3381*9880d681SAndroid Build Coastguard Worker RegisterClass dst_rc, 3382*9880d681SAndroid Build Coastguard Worker RegisterClass addr_rc, 3383*9880d681SAndroid Build Coastguard Worker string dns=""> : MIMG_Helper < 3384*9880d681SAndroid Build Coastguard Worker (outs dst_rc:$vdata), 3385*9880d681SAndroid Build Coastguard Worker (ins addr_rc:$vaddr, SReg_256:$srsrc, 3386*9880d681SAndroid Build Coastguard Worker dmask:$dmask, unorm:$unorm, glc:$glc, slc:$slc, 3387*9880d681SAndroid Build Coastguard Worker r128:$r128, tfe:$tfe, lwe:$lwe, da:$da), 3388*9880d681SAndroid Build Coastguard Worker asm#" $vdata, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da", 3389*9880d681SAndroid Build Coastguard Worker dns>, MIMGe<op> { 3390*9880d681SAndroid Build Coastguard Worker let ssamp = 0; 3391*9880d681SAndroid Build Coastguard Worker} 3392*9880d681SAndroid Build Coastguard Worker 3393*9880d681SAndroid Build Coastguard Workermulticlass MIMG_NoSampler_Src_Helper <bits<7> op, string asm, 3394*9880d681SAndroid Build Coastguard Worker RegisterClass dst_rc, 3395*9880d681SAndroid Build Coastguard Worker int channels> { 3396*9880d681SAndroid Build Coastguard Worker def _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VGPR_32, 3397*9880d681SAndroid Build Coastguard Worker !if(!eq(channels, 1), "AMDGPU", "")>, 3398*9880d681SAndroid Build Coastguard Worker MIMG_Mask<asm#"_V1", channels>; 3399*9880d681SAndroid Build Coastguard Worker def _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>, 3400*9880d681SAndroid Build Coastguard Worker MIMG_Mask<asm#"_V2", channels>; 3401*9880d681SAndroid Build Coastguard Worker def _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>, 3402*9880d681SAndroid Build Coastguard Worker MIMG_Mask<asm#"_V4", channels>; 3403*9880d681SAndroid Build Coastguard Worker} 3404*9880d681SAndroid Build Coastguard Worker 3405*9880d681SAndroid Build Coastguard Workermulticlass MIMG_NoSampler <bits<7> op, string asm> { 3406*9880d681SAndroid Build Coastguard Worker defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VGPR_32, 1>; 3407*9880d681SAndroid Build Coastguard Worker defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 2>; 3408*9880d681SAndroid Build Coastguard Worker defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 3>; 3409*9880d681SAndroid Build Coastguard Worker defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 4>; 3410*9880d681SAndroid Build Coastguard Worker} 3411*9880d681SAndroid Build Coastguard Worker 3412*9880d681SAndroid Build Coastguard Workerclass MIMG_Store_Helper <bits<7> op, string asm, 3413*9880d681SAndroid Build Coastguard Worker RegisterClass data_rc, 3414*9880d681SAndroid Build Coastguard Worker RegisterClass addr_rc> : MIMG_Helper < 3415*9880d681SAndroid Build Coastguard Worker (outs), 3416*9880d681SAndroid Build Coastguard Worker (ins data_rc:$vdata, addr_rc:$vaddr, SReg_256:$srsrc, 3417*9880d681SAndroid Build Coastguard Worker dmask:$dmask, unorm:$unorm, glc:$glc, slc:$slc, 3418*9880d681SAndroid Build Coastguard Worker r128:$r128, tfe:$tfe, lwe:$lwe, da:$da), 3419*9880d681SAndroid Build Coastguard Worker asm#" $vdata, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da" 3420*9880d681SAndroid Build Coastguard Worker >, MIMGe<op> { 3421*9880d681SAndroid Build Coastguard Worker let ssamp = 0; 3422*9880d681SAndroid Build Coastguard Worker let mayLoad = 1; // TableGen requires this for matching with the intrinsics 3423*9880d681SAndroid Build Coastguard Worker let mayStore = 1; 3424*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 1; 3425*9880d681SAndroid Build Coastguard Worker let hasPostISelHook = 0; 3426*9880d681SAndroid Build Coastguard Worker} 3427*9880d681SAndroid Build Coastguard Worker 3428*9880d681SAndroid Build Coastguard Workermulticlass MIMG_Store_Addr_Helper <bits<7> op, string asm, 3429*9880d681SAndroid Build Coastguard Worker RegisterClass data_rc, 3430*9880d681SAndroid Build Coastguard Worker int channels> { 3431*9880d681SAndroid Build Coastguard Worker def _V1 : MIMG_Store_Helper <op, asm, data_rc, VGPR_32>, 3432*9880d681SAndroid Build Coastguard Worker MIMG_Mask<asm#"_V1", channels>; 3433*9880d681SAndroid Build Coastguard Worker def _V2 : MIMG_Store_Helper <op, asm, data_rc, VReg_64>, 3434*9880d681SAndroid Build Coastguard Worker MIMG_Mask<asm#"_V2", channels>; 3435*9880d681SAndroid Build Coastguard Worker def _V4 : MIMG_Store_Helper <op, asm, data_rc, VReg_128>, 3436*9880d681SAndroid Build Coastguard Worker MIMG_Mask<asm#"_V4", channels>; 3437*9880d681SAndroid Build Coastguard Worker} 3438*9880d681SAndroid Build Coastguard Worker 3439*9880d681SAndroid Build Coastguard Workermulticlass MIMG_Store <bits<7> op, string asm> { 3440*9880d681SAndroid Build Coastguard Worker defm _V1 : MIMG_Store_Addr_Helper <op, asm, VGPR_32, 1>; 3441*9880d681SAndroid Build Coastguard Worker defm _V2 : MIMG_Store_Addr_Helper <op, asm, VReg_64, 2>; 3442*9880d681SAndroid Build Coastguard Worker defm _V3 : MIMG_Store_Addr_Helper <op, asm, VReg_96, 3>; 3443*9880d681SAndroid Build Coastguard Worker defm _V4 : MIMG_Store_Addr_Helper <op, asm, VReg_128, 4>; 3444*9880d681SAndroid Build Coastguard Worker} 3445*9880d681SAndroid Build Coastguard Worker 3446*9880d681SAndroid Build Coastguard Workerclass MIMG_Atomic_Helper <string asm, RegisterClass data_rc, 3447*9880d681SAndroid Build Coastguard Worker RegisterClass addr_rc> : MIMG_Helper < 3448*9880d681SAndroid Build Coastguard Worker (outs data_rc:$vdst), 3449*9880d681SAndroid Build Coastguard Worker (ins data_rc:$vdata, addr_rc:$vaddr, SReg_256:$srsrc, 3450*9880d681SAndroid Build Coastguard Worker dmask:$dmask, unorm:$unorm, glc:$glc, slc:$slc, 3451*9880d681SAndroid Build Coastguard Worker r128:$r128, tfe:$tfe, lwe:$lwe, da:$da), 3452*9880d681SAndroid Build Coastguard Worker asm#" $vdst, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da" 3453*9880d681SAndroid Build Coastguard Worker > { 3454*9880d681SAndroid Build Coastguard Worker let mayStore = 1; 3455*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 1; 3456*9880d681SAndroid Build Coastguard Worker let hasPostISelHook = 0; 3457*9880d681SAndroid Build Coastguard Worker let Constraints = "$vdst = $vdata"; 3458*9880d681SAndroid Build Coastguard Worker let AsmMatchConverter = "cvtMIMGAtomic"; 3459*9880d681SAndroid Build Coastguard Worker} 3460*9880d681SAndroid Build Coastguard Worker 3461*9880d681SAndroid Build Coastguard Workerclass MIMG_Atomic_Real_si<mimg op, string name, string asm, 3462*9880d681SAndroid Build Coastguard Worker RegisterClass data_rc, RegisterClass addr_rc> : 3463*9880d681SAndroid Build Coastguard Worker MIMG_Atomic_Helper<asm, data_rc, addr_rc>, 3464*9880d681SAndroid Build Coastguard Worker SIMCInstr<name, SIEncodingFamily.SI>, 3465*9880d681SAndroid Build Coastguard Worker MIMGe<op.SI> { 3466*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 0; 3467*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isSICI]; 3468*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "SICI"; 3469*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableSIDecoder; 3470*9880d681SAndroid Build Coastguard Worker} 3471*9880d681SAndroid Build Coastguard Worker 3472*9880d681SAndroid Build Coastguard Workerclass MIMG_Atomic_Real_vi<mimg op, string name, string asm, 3473*9880d681SAndroid Build Coastguard Worker RegisterClass data_rc, RegisterClass addr_rc> : 3474*9880d681SAndroid Build Coastguard Worker MIMG_Atomic_Helper<asm, data_rc, addr_rc>, 3475*9880d681SAndroid Build Coastguard Worker SIMCInstr<name, SIEncodingFamily.VI>, 3476*9880d681SAndroid Build Coastguard Worker MIMGe<op.VI> { 3477*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 0; 3478*9880d681SAndroid Build Coastguard Worker let AssemblerPredicates = [isVI]; 3479*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VI"; 3480*9880d681SAndroid Build Coastguard Worker let DisableDecoder = DisableVIDecoder; 3481*9880d681SAndroid Build Coastguard Worker} 3482*9880d681SAndroid Build Coastguard Worker 3483*9880d681SAndroid Build Coastguard Workermulticlass MIMG_Atomic_Helper_m <mimg op, string name, string asm, 3484*9880d681SAndroid Build Coastguard Worker RegisterClass data_rc, RegisterClass addr_rc> { 3485*9880d681SAndroid Build Coastguard Worker let isPseudo = 1, isCodeGenOnly = 1 in { 3486*9880d681SAndroid Build Coastguard Worker def "" : MIMG_Atomic_Helper<asm, data_rc, addr_rc>, 3487*9880d681SAndroid Build Coastguard Worker SIMCInstr<name, SIEncodingFamily.NONE>; 3488*9880d681SAndroid Build Coastguard Worker } 3489*9880d681SAndroid Build Coastguard Worker 3490*9880d681SAndroid Build Coastguard Worker let ssamp = 0 in { 3491*9880d681SAndroid Build Coastguard Worker def _si : MIMG_Atomic_Real_si<op, name, asm, data_rc, addr_rc>; 3492*9880d681SAndroid Build Coastguard Worker 3493*9880d681SAndroid Build Coastguard Worker def _vi : MIMG_Atomic_Real_vi<op, name, asm, data_rc, addr_rc>; 3494*9880d681SAndroid Build Coastguard Worker } 3495*9880d681SAndroid Build Coastguard Worker} 3496*9880d681SAndroid Build Coastguard Worker 3497*9880d681SAndroid Build Coastguard Workermulticlass MIMG_Atomic <mimg op, string asm, RegisterClass data_rc = VGPR_32> { 3498*9880d681SAndroid Build Coastguard Worker defm _V1 : MIMG_Atomic_Helper_m <op, asm # "_V1", asm, data_rc, VGPR_32>; 3499*9880d681SAndroid Build Coastguard Worker defm _V2 : MIMG_Atomic_Helper_m <op, asm # "_V2", asm, data_rc, VReg_64>; 3500*9880d681SAndroid Build Coastguard Worker defm _V4 : MIMG_Atomic_Helper_m <op, asm # "_V3", asm, data_rc, VReg_128>; 3501*9880d681SAndroid Build Coastguard Worker} 3502*9880d681SAndroid Build Coastguard Worker 3503*9880d681SAndroid Build Coastguard Workerclass MIMG_Sampler_Helper <bits<7> op, string asm, 3504*9880d681SAndroid Build Coastguard Worker RegisterClass dst_rc, 3505*9880d681SAndroid Build Coastguard Worker RegisterClass src_rc, 3506*9880d681SAndroid Build Coastguard Worker int wqm, 3507*9880d681SAndroid Build Coastguard Worker string dns=""> : MIMG_Helper < 3508*9880d681SAndroid Build Coastguard Worker (outs dst_rc:$vdata), 3509*9880d681SAndroid Build Coastguard Worker (ins src_rc:$vaddr, SReg_256:$srsrc, SReg_128:$ssamp, 3510*9880d681SAndroid Build Coastguard Worker dmask:$dmask, unorm:$unorm, glc:$glc, slc:$slc, 3511*9880d681SAndroid Build Coastguard Worker r128:$r128, tfe:$tfe, lwe:$lwe, da:$da), 3512*9880d681SAndroid Build Coastguard Worker asm#" $vdata, $vaddr, $srsrc, $ssamp$dmask$unorm$glc$slc$r128$tfe$lwe$da", 3513*9880d681SAndroid Build Coastguard Worker dns>, MIMGe<op> { 3514*9880d681SAndroid Build Coastguard Worker let WQM = wqm; 3515*9880d681SAndroid Build Coastguard Worker} 3516*9880d681SAndroid Build Coastguard Worker 3517*9880d681SAndroid Build Coastguard Workermulticlass MIMG_Sampler_Src_Helper <bits<7> op, string asm, 3518*9880d681SAndroid Build Coastguard Worker RegisterClass dst_rc, 3519*9880d681SAndroid Build Coastguard Worker int channels, int wqm> { 3520*9880d681SAndroid Build Coastguard Worker def _V1 : MIMG_Sampler_Helper <op, asm, dst_rc, VGPR_32, wqm, 3521*9880d681SAndroid Build Coastguard Worker !if(!eq(channels, 1), "AMDGPU", "")>, 3522*9880d681SAndroid Build Coastguard Worker MIMG_Mask<asm#"_V1", channels>; 3523*9880d681SAndroid Build Coastguard Worker def _V2 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_64, wqm>, 3524*9880d681SAndroid Build Coastguard Worker MIMG_Mask<asm#"_V2", channels>; 3525*9880d681SAndroid Build Coastguard Worker def _V4 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_128, wqm>, 3526*9880d681SAndroid Build Coastguard Worker MIMG_Mask<asm#"_V4", channels>; 3527*9880d681SAndroid Build Coastguard Worker def _V8 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_256, wqm>, 3528*9880d681SAndroid Build Coastguard Worker MIMG_Mask<asm#"_V8", channels>; 3529*9880d681SAndroid Build Coastguard Worker def _V16 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_512, wqm>, 3530*9880d681SAndroid Build Coastguard Worker MIMG_Mask<asm#"_V16", channels>; 3531*9880d681SAndroid Build Coastguard Worker} 3532*9880d681SAndroid Build Coastguard Worker 3533*9880d681SAndroid Build Coastguard Workermulticlass MIMG_Sampler <bits<7> op, string asm, int wqm=0> { 3534*9880d681SAndroid Build Coastguard Worker defm _V1 : MIMG_Sampler_Src_Helper<op, asm, VGPR_32, 1, wqm>; 3535*9880d681SAndroid Build Coastguard Worker defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64, 2, wqm>; 3536*9880d681SAndroid Build Coastguard Worker defm _V3 : MIMG_Sampler_Src_Helper<op, asm, VReg_96, 3, wqm>; 3537*9880d681SAndroid Build Coastguard Worker defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128, 4, wqm>; 3538*9880d681SAndroid Build Coastguard Worker} 3539*9880d681SAndroid Build Coastguard Worker 3540*9880d681SAndroid Build Coastguard Workermulticlass MIMG_Sampler_WQM <bits<7> op, string asm> : MIMG_Sampler<op, asm, 1>; 3541*9880d681SAndroid Build Coastguard Worker 3542*9880d681SAndroid Build Coastguard Workerclass MIMG_Gather_Helper <bits<7> op, string asm, 3543*9880d681SAndroid Build Coastguard Worker RegisterClass dst_rc, 3544*9880d681SAndroid Build Coastguard Worker RegisterClass src_rc, int wqm> : MIMG < 3545*9880d681SAndroid Build Coastguard Worker (outs dst_rc:$vdata), 3546*9880d681SAndroid Build Coastguard Worker (ins src_rc:$vaddr, SReg_256:$srsrc, SReg_128:$ssamp, 3547*9880d681SAndroid Build Coastguard Worker dmask:$dmask, unorm:$unorm, glc:$glc, slc:$slc, 3548*9880d681SAndroid Build Coastguard Worker r128:$r128, tfe:$tfe, lwe:$lwe, da:$da), 3549*9880d681SAndroid Build Coastguard Worker asm#" $vdata, $vaddr, $srsrc, $ssamp$dmask$unorm$glc$slc$r128$tfe$lwe$da", 3550*9880d681SAndroid Build Coastguard Worker []>, MIMGe<op> { 3551*9880d681SAndroid Build Coastguard Worker let mayLoad = 1; 3552*9880d681SAndroid Build Coastguard Worker let mayStore = 0; 3553*9880d681SAndroid Build Coastguard Worker 3554*9880d681SAndroid Build Coastguard Worker // DMASK was repurposed for GATHER4. 4 components are always 3555*9880d681SAndroid Build Coastguard Worker // returned and DMASK works like a swizzle - it selects 3556*9880d681SAndroid Build Coastguard Worker // the component to fetch. The only useful DMASK values are 3557*9880d681SAndroid Build Coastguard Worker // 1=red, 2=green, 4=blue, 8=alpha. (e.g. 1 returns 3558*9880d681SAndroid Build Coastguard Worker // (red,red,red,red) etc.) The ISA document doesn't mention 3559*9880d681SAndroid Build Coastguard Worker // this. 3560*9880d681SAndroid Build Coastguard Worker // Therefore, disable all code which updates DMASK by setting this: 3561*9880d681SAndroid Build Coastguard Worker let Gather4 = 1; 3562*9880d681SAndroid Build Coastguard Worker let hasPostISelHook = 0; 3563*9880d681SAndroid Build Coastguard Worker let WQM = wqm; 3564*9880d681SAndroid Build Coastguard Worker 3565*9880d681SAndroid Build Coastguard Worker let isAsmParserOnly = 1; // TBD: fix it later 3566*9880d681SAndroid Build Coastguard Worker} 3567*9880d681SAndroid Build Coastguard Worker 3568*9880d681SAndroid Build Coastguard Workermulticlass MIMG_Gather_Src_Helper <bits<7> op, string asm, 3569*9880d681SAndroid Build Coastguard Worker RegisterClass dst_rc, 3570*9880d681SAndroid Build Coastguard Worker int channels, int wqm> { 3571*9880d681SAndroid Build Coastguard Worker def _V1 : MIMG_Gather_Helper <op, asm, dst_rc, VGPR_32, wqm>, 3572*9880d681SAndroid Build Coastguard Worker MIMG_Mask<asm#"_V1", channels>; 3573*9880d681SAndroid Build Coastguard Worker def _V2 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_64, wqm>, 3574*9880d681SAndroid Build Coastguard Worker MIMG_Mask<asm#"_V2", channels>; 3575*9880d681SAndroid Build Coastguard Worker def _V4 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_128, wqm>, 3576*9880d681SAndroid Build Coastguard Worker MIMG_Mask<asm#"_V4", channels>; 3577*9880d681SAndroid Build Coastguard Worker def _V8 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_256, wqm>, 3578*9880d681SAndroid Build Coastguard Worker MIMG_Mask<asm#"_V8", channels>; 3579*9880d681SAndroid Build Coastguard Worker def _V16 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_512, wqm>, 3580*9880d681SAndroid Build Coastguard Worker MIMG_Mask<asm#"_V16", channels>; 3581*9880d681SAndroid Build Coastguard Worker} 3582*9880d681SAndroid Build Coastguard Worker 3583*9880d681SAndroid Build Coastguard Workermulticlass MIMG_Gather <bits<7> op, string asm, int wqm=0> { 3584*9880d681SAndroid Build Coastguard Worker defm _V1 : MIMG_Gather_Src_Helper<op, asm, VGPR_32, 1, wqm>; 3585*9880d681SAndroid Build Coastguard Worker defm _V2 : MIMG_Gather_Src_Helper<op, asm, VReg_64, 2, wqm>; 3586*9880d681SAndroid Build Coastguard Worker defm _V3 : MIMG_Gather_Src_Helper<op, asm, VReg_96, 3, wqm>; 3587*9880d681SAndroid Build Coastguard Worker defm _V4 : MIMG_Gather_Src_Helper<op, asm, VReg_128, 4, wqm>; 3588*9880d681SAndroid Build Coastguard Worker} 3589*9880d681SAndroid Build Coastguard Worker 3590*9880d681SAndroid Build Coastguard Workermulticlass MIMG_Gather_WQM <bits<7> op, string asm> : MIMG_Gather<op, asm, 1>; 3591*9880d681SAndroid Build Coastguard Worker 3592*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3593*9880d681SAndroid Build Coastguard Worker// Vector instruction mappings 3594*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3595*9880d681SAndroid Build Coastguard Worker 3596*9880d681SAndroid Build Coastguard Worker// Maps an opcode in e32 form to its e64 equivalent 3597*9880d681SAndroid Build Coastguard Workerdef getVOPe64 : InstrMapping { 3598*9880d681SAndroid Build Coastguard Worker let FilterClass = "VOP"; 3599*9880d681SAndroid Build Coastguard Worker let RowFields = ["OpName"]; 3600*9880d681SAndroid Build Coastguard Worker let ColFields = ["Size"]; 3601*9880d681SAndroid Build Coastguard Worker let KeyCol = ["4"]; 3602*9880d681SAndroid Build Coastguard Worker let ValueCols = [["8"]]; 3603*9880d681SAndroid Build Coastguard Worker} 3604*9880d681SAndroid Build Coastguard Worker 3605*9880d681SAndroid Build Coastguard Worker// Maps an opcode in e64 form to its e32 equivalent 3606*9880d681SAndroid Build Coastguard Workerdef getVOPe32 : InstrMapping { 3607*9880d681SAndroid Build Coastguard Worker let FilterClass = "VOP"; 3608*9880d681SAndroid Build Coastguard Worker let RowFields = ["OpName"]; 3609*9880d681SAndroid Build Coastguard Worker let ColFields = ["Size"]; 3610*9880d681SAndroid Build Coastguard Worker let KeyCol = ["8"]; 3611*9880d681SAndroid Build Coastguard Worker let ValueCols = [["4"]]; 3612*9880d681SAndroid Build Coastguard Worker} 3613*9880d681SAndroid Build Coastguard Worker 3614*9880d681SAndroid Build Coastguard Workerdef getMaskedMIMGOp : InstrMapping { 3615*9880d681SAndroid Build Coastguard Worker let FilterClass = "MIMG_Mask"; 3616*9880d681SAndroid Build Coastguard Worker let RowFields = ["Op"]; 3617*9880d681SAndroid Build Coastguard Worker let ColFields = ["Channels"]; 3618*9880d681SAndroid Build Coastguard Worker let KeyCol = ["4"]; 3619*9880d681SAndroid Build Coastguard Worker let ValueCols = [["1"], ["2"], ["3"] ]; 3620*9880d681SAndroid Build Coastguard Worker} 3621*9880d681SAndroid Build Coastguard Worker 3622*9880d681SAndroid Build Coastguard Worker// Maps an commuted opcode to its original version 3623*9880d681SAndroid Build Coastguard Workerdef getCommuteOrig : InstrMapping { 3624*9880d681SAndroid Build Coastguard Worker let FilterClass = "VOP2_REV"; 3625*9880d681SAndroid Build Coastguard Worker let RowFields = ["RevOp"]; 3626*9880d681SAndroid Build Coastguard Worker let ColFields = ["IsOrig"]; 3627*9880d681SAndroid Build Coastguard Worker let KeyCol = ["0"]; 3628*9880d681SAndroid Build Coastguard Worker let ValueCols = [["1"]]; 3629*9880d681SAndroid Build Coastguard Worker} 3630*9880d681SAndroid Build Coastguard Worker 3631*9880d681SAndroid Build Coastguard Worker// Maps an original opcode to its commuted version 3632*9880d681SAndroid Build Coastguard Workerdef getCommuteRev : InstrMapping { 3633*9880d681SAndroid Build Coastguard Worker let FilterClass = "VOP2_REV"; 3634*9880d681SAndroid Build Coastguard Worker let RowFields = ["RevOp"]; 3635*9880d681SAndroid Build Coastguard Worker let ColFields = ["IsOrig"]; 3636*9880d681SAndroid Build Coastguard Worker let KeyCol = ["1"]; 3637*9880d681SAndroid Build Coastguard Worker let ValueCols = [["0"]]; 3638*9880d681SAndroid Build Coastguard Worker} 3639*9880d681SAndroid Build Coastguard Worker 3640*9880d681SAndroid Build Coastguard Workerdef getCommuteCmpOrig : InstrMapping { 3641*9880d681SAndroid Build Coastguard Worker let FilterClass = "VOP2_REV"; 3642*9880d681SAndroid Build Coastguard Worker let RowFields = ["RevOp"]; 3643*9880d681SAndroid Build Coastguard Worker let ColFields = ["IsOrig"]; 3644*9880d681SAndroid Build Coastguard Worker let KeyCol = ["0"]; 3645*9880d681SAndroid Build Coastguard Worker let ValueCols = [["1"]]; 3646*9880d681SAndroid Build Coastguard Worker} 3647*9880d681SAndroid Build Coastguard Worker 3648*9880d681SAndroid Build Coastguard Worker// Maps an original opcode to its commuted version 3649*9880d681SAndroid Build Coastguard Workerdef getCommuteCmpRev : InstrMapping { 3650*9880d681SAndroid Build Coastguard Worker let FilterClass = "VOP2_REV"; 3651*9880d681SAndroid Build Coastguard Worker let RowFields = ["RevOp"]; 3652*9880d681SAndroid Build Coastguard Worker let ColFields = ["IsOrig"]; 3653*9880d681SAndroid Build Coastguard Worker let KeyCol = ["1"]; 3654*9880d681SAndroid Build Coastguard Worker let ValueCols = [["0"]]; 3655*9880d681SAndroid Build Coastguard Worker} 3656*9880d681SAndroid Build Coastguard Worker 3657*9880d681SAndroid Build Coastguard Worker 3658*9880d681SAndroid Build Coastguard Workerdef getMCOpcodeGen : InstrMapping { 3659*9880d681SAndroid Build Coastguard Worker let FilterClass = "SIMCInstr"; 3660*9880d681SAndroid Build Coastguard Worker let RowFields = ["PseudoInstr"]; 3661*9880d681SAndroid Build Coastguard Worker let ColFields = ["Subtarget"]; 3662*9880d681SAndroid Build Coastguard Worker let KeyCol = [!cast<string>(SIEncodingFamily.NONE)]; 3663*9880d681SAndroid Build Coastguard Worker let ValueCols = [[!cast<string>(SIEncodingFamily.SI)], 3664*9880d681SAndroid Build Coastguard Worker [!cast<string>(SIEncodingFamily.VI)]]; 3665*9880d681SAndroid Build Coastguard Worker} 3666*9880d681SAndroid Build Coastguard Worker 3667*9880d681SAndroid Build Coastguard Workerdef getAddr64Inst : InstrMapping { 3668*9880d681SAndroid Build Coastguard Worker let FilterClass = "MUBUFAddr64Table"; 3669*9880d681SAndroid Build Coastguard Worker let RowFields = ["OpName"]; 3670*9880d681SAndroid Build Coastguard Worker let ColFields = ["IsAddr64"]; 3671*9880d681SAndroid Build Coastguard Worker let KeyCol = ["0"]; 3672*9880d681SAndroid Build Coastguard Worker let ValueCols = [["1"]]; 3673*9880d681SAndroid Build Coastguard Worker} 3674*9880d681SAndroid Build Coastguard Worker 3675*9880d681SAndroid Build Coastguard Worker// Maps an atomic opcode to its version with a return value. 3676*9880d681SAndroid Build Coastguard Workerdef getAtomicRetOp : InstrMapping { 3677*9880d681SAndroid Build Coastguard Worker let FilterClass = "AtomicNoRet"; 3678*9880d681SAndroid Build Coastguard Worker let RowFields = ["NoRetOp"]; 3679*9880d681SAndroid Build Coastguard Worker let ColFields = ["IsRet"]; 3680*9880d681SAndroid Build Coastguard Worker let KeyCol = ["0"]; 3681*9880d681SAndroid Build Coastguard Worker let ValueCols = [["1"]]; 3682*9880d681SAndroid Build Coastguard Worker} 3683*9880d681SAndroid Build Coastguard Worker 3684*9880d681SAndroid Build Coastguard Worker// Maps an atomic opcode to its returnless version. 3685*9880d681SAndroid Build Coastguard Workerdef getAtomicNoRetOp : InstrMapping { 3686*9880d681SAndroid Build Coastguard Worker let FilterClass = "AtomicNoRet"; 3687*9880d681SAndroid Build Coastguard Worker let RowFields = ["NoRetOp"]; 3688*9880d681SAndroid Build Coastguard Worker let ColFields = ["IsRet"]; 3689*9880d681SAndroid Build Coastguard Worker let KeyCol = ["1"]; 3690*9880d681SAndroid Build Coastguard Worker let ValueCols = [["0"]]; 3691*9880d681SAndroid Build Coastguard Worker} 3692*9880d681SAndroid Build Coastguard Worker 3693*9880d681SAndroid Build Coastguard Workerinclude "SIInstructions.td" 3694*9880d681SAndroid Build Coastguard Workerinclude "CIInstructions.td" 3695*9880d681SAndroid Build Coastguard Workerinclude "VIInstructions.td" 3696