1*9880d681SAndroid Build Coastguard Worker//==- HexagonInstrFormats.td - Hexagon Instruction Formats --*- 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 Worker 10*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 11*9880d681SAndroid Build Coastguard Worker// Hexagon Instruction Flags + 12*9880d681SAndroid Build Coastguard Worker// 13*9880d681SAndroid Build Coastguard Worker// *** Must match HexagonBaseInfo.h *** 14*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerclass IType<bits<5> t> { 17*9880d681SAndroid Build Coastguard Worker bits<5> Value = t; 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Workerdef TypePSEUDO : IType<0>; 20*9880d681SAndroid Build Coastguard Workerdef TypeALU32 : IType<1>; 21*9880d681SAndroid Build Coastguard Workerdef TypeCR : IType<2>; 22*9880d681SAndroid Build Coastguard Workerdef TypeJR : IType<3>; 23*9880d681SAndroid Build Coastguard Workerdef TypeJ : IType<4>; 24*9880d681SAndroid Build Coastguard Workerdef TypeLD : IType<5>; 25*9880d681SAndroid Build Coastguard Workerdef TypeST : IType<6>; 26*9880d681SAndroid Build Coastguard Workerdef TypeSYSTEM : IType<7>; 27*9880d681SAndroid Build Coastguard Workerdef TypeXTYPE : IType<8>; 28*9880d681SAndroid Build Coastguard Workerdef TypeENDLOOP: IType<31>; 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker// Maintain list of valid subtargets for each instruction. 31*9880d681SAndroid Build Coastguard Workerclass SubTarget<bits<6> value> { 32*9880d681SAndroid Build Coastguard Worker bits<6> Value = value; 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdef HasAnySubT : SubTarget<0x3f>; // 111111 36*9880d681SAndroid Build Coastguard Workerdef HasV5SubT : SubTarget<0x3e>; // 111110 37*9880d681SAndroid Build Coastguard Workerdef HasV55SubT : SubTarget<0x3c>; // 111100 38*9880d681SAndroid Build Coastguard Workerdef HasV60SubT : SubTarget<0x38>; // 111000 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker// Addressing modes for load/store instructions 41*9880d681SAndroid Build Coastguard Workerclass AddrModeType<bits<3> value> { 42*9880d681SAndroid Build Coastguard Worker bits<3> Value = value; 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdef NoAddrMode : AddrModeType<0>; // No addressing mode 46*9880d681SAndroid Build Coastguard Workerdef Absolute : AddrModeType<1>; // Absolute addressing mode 47*9880d681SAndroid Build Coastguard Workerdef AbsoluteSet : AddrModeType<2>; // Absolute set addressing mode 48*9880d681SAndroid Build Coastguard Workerdef BaseImmOffset : AddrModeType<3>; // Indirect with offset 49*9880d681SAndroid Build Coastguard Workerdef BaseLongOffset : AddrModeType<4>; // Indirect with long offset 50*9880d681SAndroid Build Coastguard Workerdef BaseRegOffset : AddrModeType<5>; // Indirect with register offset 51*9880d681SAndroid Build Coastguard Workerdef PostInc : AddrModeType<6>; // Post increment addressing mode 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerclass MemAccessSize<bits<4> value> { 54*9880d681SAndroid Build Coastguard Worker bits<4> Value = value; 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdef NoMemAccess : MemAccessSize<0>;// Not a memory acces instruction. 58*9880d681SAndroid Build Coastguard Workerdef ByteAccess : MemAccessSize<1>;// Byte access instruction (memb). 59*9880d681SAndroid Build Coastguard Workerdef HalfWordAccess : MemAccessSize<2>;// Half word access instruction (memh). 60*9880d681SAndroid Build Coastguard Workerdef WordAccess : MemAccessSize<3>;// Word access instruction (memw). 61*9880d681SAndroid Build Coastguard Workerdef DoubleWordAccess : MemAccessSize<4>;// Double word access instruction (memd) 62*9880d681SAndroid Build Coastguard Workerdef Vector64Access : MemAccessSize<7>;// Vector access instruction (memv) 63*9880d681SAndroid Build Coastguard Workerdef Vector128Access : MemAccessSize<8>;// Vector access instruction (memv) 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 67*9880d681SAndroid Build Coastguard Worker// Instruction Class Declaration + 68*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerclass OpcodeHexagon { 71*9880d681SAndroid Build Coastguard Worker field bits<32> Inst = ?; // Default to an invalid insn. 72*9880d681SAndroid Build Coastguard Worker bits<4> IClass = 0; // ICLASS 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker let Inst{31-28} = IClass; 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker bits<1> zero = 0; 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerclass InstHexagon<dag outs, dag ins, string asmstr, list<dag> pattern, 80*9880d681SAndroid Build Coastguard Worker string cstr, InstrItinClass itin, IType type> 81*9880d681SAndroid Build Coastguard Worker : Instruction { 82*9880d681SAndroid Build Coastguard Worker let Namespace = "Hexagon"; 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker dag OutOperandList = outs; 85*9880d681SAndroid Build Coastguard Worker dag InOperandList = ins; 86*9880d681SAndroid Build Coastguard Worker let AsmString = asmstr; 87*9880d681SAndroid Build Coastguard Worker let Pattern = pattern; 88*9880d681SAndroid Build Coastguard Worker let Constraints = cstr; 89*9880d681SAndroid Build Coastguard Worker let Itinerary = itin; 90*9880d681SAndroid Build Coastguard Worker let Size = 4; 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker // SoftFail is a field the disassembler can use to provide a way for 93*9880d681SAndroid Build Coastguard Worker // instructions to not match without killing the whole decode process. It is 94*9880d681SAndroid Build Coastguard Worker // mainly used for ARM, but Tablegen expects this field to exist or it fails 95*9880d681SAndroid Build Coastguard Worker // to build the decode table. 96*9880d681SAndroid Build Coastguard Worker field bits<32> SoftFail = 0; 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker // *** Must match MCTargetDesc/HexagonBaseInfo.h *** 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker // Instruction type according to the ISA. 101*9880d681SAndroid Build Coastguard Worker IType Type = type; 102*9880d681SAndroid Build Coastguard Worker let TSFlags{4-0} = Type.Value; 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker // Solo instructions, i.e., those that cannot be in a packet with others. 105*9880d681SAndroid Build Coastguard Worker bits<1> isSolo = 0; 106*9880d681SAndroid Build Coastguard Worker let TSFlags{5} = isSolo; 107*9880d681SAndroid Build Coastguard Worker // Packed only with A or X-type instructions. 108*9880d681SAndroid Build Coastguard Worker bits<1> isSoloAX = 0; 109*9880d681SAndroid Build Coastguard Worker let TSFlags{6} = isSoloAX; 110*9880d681SAndroid Build Coastguard Worker // Only A-type instruction in first slot or nothing. 111*9880d681SAndroid Build Coastguard Worker bits<1> isSoloAin1 = 0; 112*9880d681SAndroid Build Coastguard Worker let TSFlags{7} = isSoloAin1; 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker // Predicated instructions. 115*9880d681SAndroid Build Coastguard Worker bits<1> isPredicated = 0; 116*9880d681SAndroid Build Coastguard Worker let TSFlags{8} = isPredicated; 117*9880d681SAndroid Build Coastguard Worker bits<1> isPredicatedFalse = 0; 118*9880d681SAndroid Build Coastguard Worker let TSFlags{9} = isPredicatedFalse; 119*9880d681SAndroid Build Coastguard Worker bits<1> isPredicatedNew = 0; 120*9880d681SAndroid Build Coastguard Worker let TSFlags{10} = isPredicatedNew; 121*9880d681SAndroid Build Coastguard Worker bits<1> isPredicateLate = 0; 122*9880d681SAndroid Build Coastguard Worker let TSFlags{11} = isPredicateLate; // Late predicate producer insn. 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker // New-value insn helper fields. 125*9880d681SAndroid Build Coastguard Worker bits<1> isNewValue = 0; 126*9880d681SAndroid Build Coastguard Worker let TSFlags{12} = isNewValue; // New-value consumer insn. 127*9880d681SAndroid Build Coastguard Worker bits<1> hasNewValue = 0; 128*9880d681SAndroid Build Coastguard Worker let TSFlags{13} = hasNewValue; // New-value producer insn. 129*9880d681SAndroid Build Coastguard Worker bits<3> opNewValue = 0; 130*9880d681SAndroid Build Coastguard Worker let TSFlags{16-14} = opNewValue; // New-value produced operand. 131*9880d681SAndroid Build Coastguard Worker bits<1> isNVStorable = 0; 132*9880d681SAndroid Build Coastguard Worker let TSFlags{17} = isNVStorable; // Store that can become new-value store. 133*9880d681SAndroid Build Coastguard Worker bits<1> isNVStore = 0; 134*9880d681SAndroid Build Coastguard Worker let TSFlags{18} = isNVStore; // New-value store insn. 135*9880d681SAndroid Build Coastguard Worker bits<1> isCVLoadable = 0; 136*9880d681SAndroid Build Coastguard Worker let TSFlags{19} = isCVLoadable; // Load that can become cur-value load. 137*9880d681SAndroid Build Coastguard Worker bits<1> isCVLoad = 0; 138*9880d681SAndroid Build Coastguard Worker let TSFlags{20} = isCVLoad; // Cur-value load insn. 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker // Immediate extender helper fields. 141*9880d681SAndroid Build Coastguard Worker bits<1> isExtendable = 0; 142*9880d681SAndroid Build Coastguard Worker let TSFlags{21} = isExtendable; // Insn may be extended. 143*9880d681SAndroid Build Coastguard Worker bits<1> isExtended = 0; 144*9880d681SAndroid Build Coastguard Worker let TSFlags{22} = isExtended; // Insn must be extended. 145*9880d681SAndroid Build Coastguard Worker bits<3> opExtendable = 0; 146*9880d681SAndroid Build Coastguard Worker let TSFlags{25-23} = opExtendable; // Which operand may be extended. 147*9880d681SAndroid Build Coastguard Worker bits<1> isExtentSigned = 0; 148*9880d681SAndroid Build Coastguard Worker let TSFlags{26} = isExtentSigned; // Signed or unsigned range. 149*9880d681SAndroid Build Coastguard Worker bits<5> opExtentBits = 0; 150*9880d681SAndroid Build Coastguard Worker let TSFlags{31-27} = opExtentBits; //Number of bits of range before extending. 151*9880d681SAndroid Build Coastguard Worker bits<2> opExtentAlign = 0; 152*9880d681SAndroid Build Coastguard Worker let TSFlags{33-32} = opExtentAlign; // Alignment exponent before extending. 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker // If an instruction is valid on a subtarget, set the corresponding 155*9880d681SAndroid Build Coastguard Worker // bit from validSubTargets. 156*9880d681SAndroid Build Coastguard Worker // By default, instruction is valid on all subtargets. 157*9880d681SAndroid Build Coastguard Worker SubTarget validSubTargets = HasAnySubT; 158*9880d681SAndroid Build Coastguard Worker let TSFlags{39-34} = validSubTargets.Value; 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Worker // Addressing mode for load/store instructions. 161*9880d681SAndroid Build Coastguard Worker AddrModeType addrMode = NoAddrMode; 162*9880d681SAndroid Build Coastguard Worker let TSFlags{42-40} = addrMode.Value; 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker // Memory access size for mem access instructions (load/store) 165*9880d681SAndroid Build Coastguard Worker MemAccessSize accessSize = NoMemAccess; 166*9880d681SAndroid Build Coastguard Worker let TSFlags{46-43} = accessSize.Value; 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker bits<1> isTaken = 0; 169*9880d681SAndroid Build Coastguard Worker let TSFlags {47} = isTaken; // Branch prediction. 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker bits<1> isFP = 0; 172*9880d681SAndroid Build Coastguard Worker let TSFlags {48} = isFP; // Floating-point. 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Worker bits<1> hasNewValue2 = 0; 175*9880d681SAndroid Build Coastguard Worker let TSFlags{50} = hasNewValue2; // Second New-value producer insn. 176*9880d681SAndroid Build Coastguard Worker bits<3> opNewValue2 = 0; 177*9880d681SAndroid Build Coastguard Worker let TSFlags{53-51} = opNewValue2; // Second New-value produced operand. 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker bits<1> isAccumulator = 0; 180*9880d681SAndroid Build Coastguard Worker let TSFlags{54} = isAccumulator; 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker // Fields used for relation models. 183*9880d681SAndroid Build Coastguard Worker bit isNonTemporal = 0; 184*9880d681SAndroid Build Coastguard Worker string isNT = ""; // set to "true" for non-temporal vector stores. 185*9880d681SAndroid Build Coastguard Worker string BaseOpcode = ""; 186*9880d681SAndroid Build Coastguard Worker string CextOpcode = ""; 187*9880d681SAndroid Build Coastguard Worker string PredSense = ""; 188*9880d681SAndroid Build Coastguard Worker string PNewValue = ""; 189*9880d681SAndroid Build Coastguard Worker string NValueST = ""; // Set to "true" for new-value stores. 190*9880d681SAndroid Build Coastguard Worker string InputType = ""; // Input is "imm" or "reg" type. 191*9880d681SAndroid Build Coastguard Worker string isFloat = "false"; // Set to "true" for the floating-point load/store. 192*9880d681SAndroid Build Coastguard Worker string isBrTaken = !if(isTaken, "true", "false"); // Set to "true"/"false" for jump instructions 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Worker let PredSense = !if(isPredicated, !if(isPredicatedFalse, "false", "true"), 195*9880d681SAndroid Build Coastguard Worker ""); 196*9880d681SAndroid Build Coastguard Worker let PNewValue = !if(isPredicatedNew, "new", ""); 197*9880d681SAndroid Build Coastguard Worker let NValueST = !if(isNVStore, "true", "false"); 198*9880d681SAndroid Build Coastguard Worker let isNT = !if(isNonTemporal, "true", "false"); 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Worker // *** Must match MCTargetDesc/HexagonBaseInfo.h *** 201*9880d681SAndroid Build Coastguard Worker} 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 204*9880d681SAndroid Build Coastguard Worker// Instruction Classes Definitions + 205*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker// LD Instruction Class in V2/V3/V4. 208*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED. 209*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1 in 210*9880d681SAndroid Build Coastguard Workerclass LDInst<dag outs, dag ins, string asmstr, list<dag> pattern = [], 211*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = LD_tc_ld_SLOT01> 212*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeLD>, OpcodeHexagon; 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1 in 215*9880d681SAndroid Build Coastguard Workerclass LDInst2<dag outs, dag ins, string asmstr, list<dag> pattern = [], 216*9880d681SAndroid Build Coastguard Worker string cstr = ""> 217*9880d681SAndroid Build Coastguard Worker : LDInst<outs, ins, asmstr, pattern, cstr>; 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Workerclass CONSTLDInst<dag outs, dag ins, string asmstr, list<dag> pattern = [], 220*9880d681SAndroid Build Coastguard Worker string cstr = ""> 221*9880d681SAndroid Build Coastguard Worker : LDInst<outs, ins, asmstr, pattern, cstr>; 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Worker// LD Instruction Class in V2/V3/V4. 224*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED. 225*9880d681SAndroid Build Coastguard Workerclass LDInstPost<dag outs, dag ins, string asmstr, list<dag> pattern = [], 226*9880d681SAndroid Build Coastguard Worker string cstr = ""> 227*9880d681SAndroid Build Coastguard Worker : LDInst<outs, ins, asmstr, pattern, cstr>; 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1 in 230*9880d681SAndroid Build Coastguard Workerclass LD0Inst<dag outs, dag ins, string asmstr, list<dag> pattern = [], 231*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin=LD_tc_ld_SLOT0> 232*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeLD>, OpcodeHexagon; 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1 in 235*9880d681SAndroid Build Coastguard Workerclass LD1Inst<dag outs, dag ins, string asmstr, list<dag> pattern = [], 236*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin=LD_tc_ld_SLOT0> 237*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeLD>; 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Worker// ST Instruction Class in V2/V3 can take SLOT0 only. 240*9880d681SAndroid Build Coastguard Worker// ST Instruction Class in V4 can take SLOT0 & SLOT1. 241*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class CHANGED from V2/V3 to V4. 242*9880d681SAndroid Build Coastguard Workerlet mayStore = 1 in 243*9880d681SAndroid Build Coastguard Workerclass STInst<dag outs, dag ins, string asmstr, list<dag> pattern = [], 244*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = ST_tc_st_SLOT01> 245*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeST>, OpcodeHexagon; 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Workerclass STInst2<dag outs, dag ins, string asmstr, list<dag> pattern = [], 248*9880d681SAndroid Build Coastguard Worker string cstr = ""> 249*9880d681SAndroid Build Coastguard Worker : STInst<outs, ins, asmstr, pattern, cstr>; 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Workerlet mayStore = 1 in 252*9880d681SAndroid Build Coastguard Workerclass ST0Inst<dag outs, dag ins, string asmstr, list<dag> pattern = [], 253*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = ST_tc_ld_SLOT0> 254*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeST>, OpcodeHexagon; 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker// Same as ST0Inst but doesn't derive from OpcodeHexagon. 257*9880d681SAndroid Build Coastguard Workerlet mayStore = 1 in 258*9880d681SAndroid Build Coastguard Workerclass ST1Inst<dag outs, dag ins, string asmstr, list<dag> pattern = [], 259*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = ST_tc_st_SLOT0> 260*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeST>; 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Worker// ST Instruction Class in V2/V3 can take SLOT0 only. 263*9880d681SAndroid Build Coastguard Worker// ST Instruction Class in V4 can take SLOT0 & SLOT1. 264*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class CHANGED from V2/V3 to V4. 265*9880d681SAndroid Build Coastguard Workerclass STInstPost<dag outs, dag ins, string asmstr, list<dag> pattern = [], 266*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = ST_tc_st_SLOT01> 267*9880d681SAndroid Build Coastguard Worker : STInst<outs, ins, asmstr, pattern, cstr, itin>; 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Worker// SYSTEM Instruction Class in V4 can take SLOT0 only 270*9880d681SAndroid Build Coastguard Worker// In V2/V3 we used ST for this but in v4 ST can take SLOT0 or SLOT1. 271*9880d681SAndroid Build Coastguard Workerclass SYSInst<dag outs, dag ins, string asmstr, list<dag> pattern = [], 272*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = ST_tc_3stall_SLOT0> 273*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeSYSTEM>, 274*9880d681SAndroid Build Coastguard Worker OpcodeHexagon; 275*9880d681SAndroid Build Coastguard Worker 276*9880d681SAndroid Build Coastguard Worker// ALU32 Instruction Class in V2/V3/V4. 277*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED. 278*9880d681SAndroid Build Coastguard Workerclass ALU32Inst<dag outs, dag ins, string asmstr, list<dag> pattern = [], 279*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = ALU32_2op_tc_1_SLOT0123> 280*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeALU32>, OpcodeHexagon; 281*9880d681SAndroid Build Coastguard Worker 282*9880d681SAndroid Build Coastguard Worker// ALU64 Instruction Class in V2/V3. 283*9880d681SAndroid Build Coastguard Worker// XTYPE Instruction Class in V4. 284*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED. 285*9880d681SAndroid Build Coastguard Worker// Name of the Instruction Class changed from ALU64 to XTYPE from V2/V3 to V4. 286*9880d681SAndroid Build Coastguard Workerclass ALU64Inst<dag outs, dag ins, string asmstr, list<dag> pattern = [], 287*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = ALU64_tc_2_SLOT23> 288*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeXTYPE>, 289*9880d681SAndroid Build Coastguard Worker OpcodeHexagon; 290*9880d681SAndroid Build Coastguard Worker 291*9880d681SAndroid Build Coastguard Workerclass ALU64_acc<dag outs, dag ins, string asmstr, list<dag> pattern = [], 292*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = ALU64_tc_2_SLOT23> 293*9880d681SAndroid Build Coastguard Worker : ALU64Inst<outs, ins, asmstr, pattern, cstr, itin>; 294*9880d681SAndroid Build Coastguard Worker 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Worker// M Instruction Class in V2/V3. 297*9880d681SAndroid Build Coastguard Worker// XTYPE Instruction Class in V4. 298*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED. 299*9880d681SAndroid Build Coastguard Worker// Name of the Instruction Class changed from M to XTYPE from V2/V3 to V4. 300*9880d681SAndroid Build Coastguard Workerclass MInst<dag outs, dag ins, string asmstr, list<dag> pattern = [], 301*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = M_tc_3x_SLOT23> 302*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeXTYPE>, 303*9880d681SAndroid Build Coastguard Worker OpcodeHexagon; 304*9880d681SAndroid Build Coastguard Worker 305*9880d681SAndroid Build Coastguard Worker// Same as above but doesn't derive from OpcodeHexagon 306*9880d681SAndroid Build Coastguard Workerclass MInst2<dag outs, dag ins, string asmstr, list<dag> pattern = [], 307*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = M_tc_3x_SLOT23> 308*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeXTYPE>; 309*9880d681SAndroid Build Coastguard Worker 310*9880d681SAndroid Build Coastguard Worker// M Instruction Class in V2/V3. 311*9880d681SAndroid Build Coastguard Worker// XTYPE Instruction Class in V4. 312*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED. 313*9880d681SAndroid Build Coastguard Worker// Name of the Instruction Class changed from M to XTYPE from V2/V3 to V4. 314*9880d681SAndroid Build Coastguard Workerclass MInst_acc<dag outs, dag ins, string asmstr, list<dag> pattern = [], 315*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = M_tc_2_SLOT23> 316*9880d681SAndroid Build Coastguard Worker : MInst<outs, ins, asmstr, pattern, cstr, itin>; 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Worker// S Instruction Class in V2/V3. 319*9880d681SAndroid Build Coastguard Worker// XTYPE Instruction Class in V4. 320*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED. 321*9880d681SAndroid Build Coastguard Worker// Name of the Instruction Class changed from S to XTYPE from V2/V3 to V4. 322*9880d681SAndroid Build Coastguard Workerclass SInst<dag outs, dag ins, string asmstr, list<dag> pattern = [], 323*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = S_2op_tc_1_SLOT23> 324*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeXTYPE>, 325*9880d681SAndroid Build Coastguard Worker OpcodeHexagon; 326*9880d681SAndroid Build Coastguard Worker 327*9880d681SAndroid Build Coastguard Workerclass SInst2<dag outs, dag ins, string asmstr, list<dag> pattern = [], 328*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = S_2op_tc_1_SLOT23> 329*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeXTYPE>; 330*9880d681SAndroid Build Coastguard Worker 331*9880d681SAndroid Build Coastguard Worker// S Instruction Class in V2/V3. 332*9880d681SAndroid Build Coastguard Worker// XTYPE Instruction Class in V4. 333*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED. 334*9880d681SAndroid Build Coastguard Worker// Name of the Instruction Class changed from S to XTYPE from V2/V3 to V4. 335*9880d681SAndroid Build Coastguard Workerclass SInst_acc<dag outs, dag ins, string asmstr, list<dag> pattern = [], 336*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = S_3op_tc_1_SLOT23> 337*9880d681SAndroid Build Coastguard Worker : SInst<outs, ins, asmstr, pattern, cstr, itin>; 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Worker// J Instruction Class in V2/V3/V4. 340*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED. 341*9880d681SAndroid Build Coastguard Workerclass JInst<dag outs, dag ins, string asmstr, list<dag> pattern = [], 342*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = J_tc_2early_SLOT23> 343*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeJ>, OpcodeHexagon; 344*9880d681SAndroid Build Coastguard Worker 345*9880d681SAndroid Build Coastguard Worker// JR Instruction Class in V2/V3/V4. 346*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED. 347*9880d681SAndroid Build Coastguard Workerclass JRInst<dag outs, dag ins, string asmstr, list<dag> pattern = [], 348*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = J_tc_2early_SLOT2> 349*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeJR>, OpcodeHexagon; 350*9880d681SAndroid Build Coastguard Worker 351*9880d681SAndroid Build Coastguard Worker// CR Instruction Class in V2/V3/V4. 352*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED. 353*9880d681SAndroid Build Coastguard Workerclass CRInst<dag outs, dag ins, string asmstr, list<dag> pattern = [], 354*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = CR_tc_2early_SLOT3> 355*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCR>, OpcodeHexagon; 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, isPseudo = 1 in 358*9880d681SAndroid Build Coastguard Workerclass Endloop<dag outs, dag ins, string asmstr, list<dag> pattern = [], 359*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = J_tc_2early_SLOT0123> 360*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeENDLOOP>, 361*9880d681SAndroid Build Coastguard Worker OpcodeHexagon; 362*9880d681SAndroid Build Coastguard Worker 363*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, isPseudo = 1 in 364*9880d681SAndroid Build Coastguard Workerclass Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern = [], 365*9880d681SAndroid Build Coastguard Worker string cstr = ""> 366*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, PSEUDO, TypePSEUDO>, 367*9880d681SAndroid Build Coastguard Worker OpcodeHexagon; 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, isPseudo = 1 in 370*9880d681SAndroid Build Coastguard Workerclass PseudoM<dag outs, dag ins, string asmstr, list<dag> pattern = [], 371*9880d681SAndroid Build Coastguard Worker string cstr=""> 372*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, PSEUDOM, TypePSEUDO>, 373*9880d681SAndroid Build Coastguard Worker OpcodeHexagon; 374*9880d681SAndroid Build Coastguard Worker 375*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 376*9880d681SAndroid Build Coastguard Worker// Instruction Classes Definitions - 377*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 378*9880d681SAndroid Build Coastguard Worker 379*9880d681SAndroid Build Coastguard Worker 380*9880d681SAndroid Build Coastguard Worker// 381*9880d681SAndroid Build Coastguard Worker// ALU32 patterns 382*9880d681SAndroid Build Coastguard Worker//. 383*9880d681SAndroid Build Coastguard Workerclass ALU32_rr<dag outs, dag ins, string asmstr, list<dag> pattern = [], 384*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = ALU32_2op_tc_1_SLOT0123> 385*9880d681SAndroid Build Coastguard Worker : ALU32Inst<outs, ins, asmstr, pattern, cstr, itin>; 386*9880d681SAndroid Build Coastguard Worker 387*9880d681SAndroid Build Coastguard Workerclass ALU32_ir<dag outs, dag ins, string asmstr, list<dag> pattern = [], 388*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = ALU32_2op_tc_1_SLOT0123> 389*9880d681SAndroid Build Coastguard Worker : ALU32Inst<outs, ins, asmstr, pattern, cstr, itin>; 390*9880d681SAndroid Build Coastguard Worker 391*9880d681SAndroid Build Coastguard Workerclass ALU32_ri<dag outs, dag ins, string asmstr, list<dag> pattern = [], 392*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = ALU32_2op_tc_1_SLOT0123> 393*9880d681SAndroid Build Coastguard Worker : ALU32Inst<outs, ins, asmstr, pattern, cstr, itin>; 394*9880d681SAndroid Build Coastguard Worker 395*9880d681SAndroid Build Coastguard Workerclass ALU32_ii<dag outs, dag ins, string asmstr, list<dag> pattern = [], 396*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = ALU32_2op_tc_1_SLOT0123> 397*9880d681SAndroid Build Coastguard Worker : ALU32Inst<outs, ins, asmstr, pattern, cstr, itin>; 398*9880d681SAndroid Build Coastguard Worker 399*9880d681SAndroid Build Coastguard Worker// 400*9880d681SAndroid Build Coastguard Worker// ALU64 patterns. 401*9880d681SAndroid Build Coastguard Worker// 402*9880d681SAndroid Build Coastguard Workerclass ALU64_rr<dag outs, dag ins, string asmstr, list<dag> pattern = [], 403*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = ALU64_tc_1_SLOT23> 404*9880d681SAndroid Build Coastguard Worker : ALU64Inst<outs, ins, asmstr, pattern, cstr, itin>; 405*9880d681SAndroid Build Coastguard Worker 406*9880d681SAndroid Build Coastguard Workerclass ALU64_ri<dag outs, dag ins, string asmstr, list<dag> pattern = [], 407*9880d681SAndroid Build Coastguard Worker string cstr = "", InstrItinClass itin = ALU64_tc_1_SLOT23> 408*9880d681SAndroid Build Coastguard Worker : ALU64Inst<outs, ins, asmstr, pattern, cstr, itin>; 409*9880d681SAndroid Build Coastguard Worker 410*9880d681SAndroid Build Coastguard Worker// Post increment ST Instruction. 411*9880d681SAndroid Build Coastguard Workerclass STInstPI<dag outs, dag ins, string asmstr, list<dag> pattern = [], 412*9880d681SAndroid Build Coastguard Worker string cstr = ""> 413*9880d681SAndroid Build Coastguard Worker : STInst<outs, ins, asmstr, pattern, cstr>; 414*9880d681SAndroid Build Coastguard Worker 415*9880d681SAndroid Build Coastguard Workerlet mayStore = 1 in 416*9880d681SAndroid Build Coastguard Workerclass STInst2PI<dag outs, dag ins, string asmstr, list<dag> pattern = [], 417*9880d681SAndroid Build Coastguard Worker string cstr = ""> 418*9880d681SAndroid Build Coastguard Worker : STInst<outs, ins, asmstr, pattern, cstr>; 419*9880d681SAndroid Build Coastguard Worker 420*9880d681SAndroid Build Coastguard Worker// Post increment LD Instruction. 421*9880d681SAndroid Build Coastguard Workerclass LDInstPI<dag outs, dag ins, string asmstr, list<dag> pattern = [], 422*9880d681SAndroid Build Coastguard Worker string cstr = ""> 423*9880d681SAndroid Build Coastguard Worker : LDInst<outs, ins, asmstr, pattern, cstr>; 424*9880d681SAndroid Build Coastguard Worker 425*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1 in 426*9880d681SAndroid Build Coastguard Workerclass LDInst2PI<dag outs, dag ins, string asmstr, list<dag> pattern = [], 427*9880d681SAndroid Build Coastguard Worker string cstr = ""> 428*9880d681SAndroid Build Coastguard Worker : LDInst<outs, ins, asmstr, pattern, cstr>; 429*9880d681SAndroid Build Coastguard Worker 430*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 431*9880d681SAndroid Build Coastguard Worker// V4 Instruction Format Definitions + 432*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 433*9880d681SAndroid Build Coastguard Worker 434*9880d681SAndroid Build Coastguard Workerinclude "HexagonInstrFormatsV4.td" 435*9880d681SAndroid Build Coastguard Worker 436*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 437*9880d681SAndroid Build Coastguard Worker// V4 Instruction Format Definitions + 438*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 439*9880d681SAndroid Build Coastguard Worker 440*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 441*9880d681SAndroid Build Coastguard Worker// V60 Instruction Format Definitions + 442*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 443*9880d681SAndroid Build Coastguard Worker 444*9880d681SAndroid Build Coastguard Workerinclude "HexagonInstrFormatsV60.td" 445*9880d681SAndroid Build Coastguard Worker 446*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 447*9880d681SAndroid Build Coastguard Worker// V60 Instruction Format Definitions + 448*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 449