1 //==- HexagonInstrFormats.td - Hexagon Instruction Formats --*- tablegen -*-==// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 //===----------------------------------------------------------------------===// 11 // Hexagon Intruction Flags + 12 // 13 // *** Must match HexagonBaseInfo.h *** 14 //===----------------------------------------------------------------------===// 15 16 17 //===----------------------------------------------------------------------===// 18 // Intruction Class Declaration + 19 //===----------------------------------------------------------------------===// 20 21 class InstHexagon<dag outs, dag ins, string asmstr, list<dag> pattern, 22 string cstr, InstrItinClass itin> : Instruction { 23 field bits<32> Inst; 24 25 let Namespace = "Hexagon"; 26 27 dag OutOperandList = outs; 28 dag InOperandList = ins; 29 let AsmString = asmstr; 30 let Pattern = pattern; 31 let Constraints = cstr; 32 let Itinerary = itin; 33 34 // *** The code below must match HexagonBaseInfo.h *** 35 36 // Predicated instructions. 37 bits<1> isPredicated = 0; 38 let TSFlags{1} = isPredicated; 39 40 // *** The code above must match HexagonBaseInfo.h *** 41 } 42 43 //===----------------------------------------------------------------------===// 44 // Intruction Classes Definitions + 45 //===----------------------------------------------------------------------===// 46 47 // LD Instruction Class in V2/V3/V4. 48 // Definition of the instruction class NOT CHANGED. 49 class LDInst<dag outs, dag ins, string asmstr, list<dag> pattern> 50 : InstHexagon<outs, ins, asmstr, pattern, "", LD> { 51 bits<5> rd; 52 bits<5> rs; 53 bits<13> imm13; 54 } 55 56 // LD Instruction Class in V2/V3/V4. 57 // Definition of the instruction class NOT CHANGED. 58 class LDInstPost<dag outs, dag ins, string asmstr, list<dag> pattern, 59 string cstr> 60 : InstHexagon<outs, ins, asmstr, pattern, cstr, LD> { 61 bits<5> rd; 62 bits<5> rs; 63 bits<5> rt; 64 bits<13> imm13; 65 } 66 67 // ST Instruction Class in V2/V3 can take SLOT0 only. 68 // ST Instruction Class in V4 can take SLOT0 & SLOT1. 69 // Definition of the instruction class CHANGED from V2/V3 to V4. 70 class STInst<dag outs, dag ins, string asmstr, list<dag> pattern> 71 : InstHexagon<outs, ins, asmstr, pattern, "", ST> { 72 bits<5> rd; 73 bits<5> rs; 74 bits<13> imm13; 75 } 76 77 // ST Instruction Class in V2/V3 can take SLOT0 only. 78 // ST Instruction Class in V4 can take SLOT0 & SLOT1. 79 // Definition of the instruction class CHANGED from V2/V3 to V4. 80 class STInstPost<dag outs, dag ins, string asmstr, list<dag> pattern, 81 string cstr> 82 : InstHexagon<outs, ins, asmstr, pattern, cstr, ST> { 83 bits<5> rd; 84 bits<5> rs; 85 bits<5> rt; 86 bits<13> imm13; 87 } 88 89 // ALU32 Instruction Class in V2/V3/V4. 90 // Definition of the instruction class NOT CHANGED. 91 class ALU32Type<dag outs, dag ins, string asmstr, list<dag> pattern> 92 : InstHexagon<outs, ins, asmstr, pattern, "", ALU32> { 93 bits<5> rd; 94 bits<5> rs; 95 bits<5> rt; 96 bits<16> imm16; 97 bits<16> imm16_2; 98 } 99 100 // ALU64 Instruction Class in V2/V3. 101 // XTYPE Instruction Class in V4. 102 // Definition of the instruction class NOT CHANGED. 103 // Name of the Instruction Class changed from ALU64 to XTYPE from V2/V3 to V4. 104 class ALU64Type<dag outs, dag ins, string asmstr, list<dag> pattern> 105 : InstHexagon<outs, ins, asmstr, pattern, "", ALU64> { 106 bits<5> rd; 107 bits<5> rs; 108 bits<5> rt; 109 bits<16> imm16; 110 bits<16> imm16_2; 111 } 112 113 // M Instruction Class in V2/V3. 114 // XTYPE Instruction Class in V4. 115 // Definition of the instruction class NOT CHANGED. 116 // Name of the Instruction Class changed from M to XTYPE from V2/V3 to V4. 117 class MInst<dag outs, dag ins, string asmstr, list<dag> pattern> 118 : InstHexagon<outs, ins, asmstr, pattern, "", M> { 119 bits<5> rd; 120 bits<5> rs; 121 bits<5> rt; 122 } 123 124 // M Instruction Class in V2/V3. 125 // XTYPE Instruction Class in V4. 126 // Definition of the instruction class NOT CHANGED. 127 // Name of the Instruction Class changed from M to XTYPE from V2/V3 to V4. 128 class MInst_acc<dag outs, dag ins, string asmstr, list<dag> pattern, 129 string cstr> 130 : InstHexagon<outs, ins, asmstr, pattern, cstr, M> { 131 bits<5> rd; 132 bits<5> rs; 133 bits<5> rt; 134 } 135 136 // S Instruction Class in V2/V3. 137 // XTYPE Instruction Class in V4. 138 // Definition of the instruction class NOT CHANGED. 139 // Name of the Instruction Class changed from S to XTYPE from V2/V3 to V4. 140 class SInst<dag outs, dag ins, string asmstr, list<dag> pattern> 141 //: InstHexagon<outs, ins, asmstr, pattern, cstr, !if(V4T, XTYPE_V4, M)> { 142 : InstHexagon<outs, ins, asmstr, pattern, "", S> { 143 // : InstHexagon<outs, ins, asmstr, pattern, "", S> { 144 bits<5> rd; 145 bits<5> rs; 146 bits<5> rt; 147 } 148 149 // S Instruction Class in V2/V3. 150 // XTYPE Instruction Class in V4. 151 // Definition of the instruction class NOT CHANGED. 152 // Name of the Instruction Class changed from S to XTYPE from V2/V3 to V4. 153 class SInst_acc<dag outs, dag ins, string asmstr, list<dag> pattern, 154 string cstr> 155 : InstHexagon<outs, ins, asmstr, pattern, cstr, S> { 156 // : InstHexagon<outs, ins, asmstr, pattern, cstr, S> { 157 // : InstHexagon<outs, ins, asmstr, pattern, cstr, !if(V4T, XTYPE_V4, S)> { 158 bits<5> rd; 159 bits<5> rs; 160 bits<5> rt; 161 } 162 163 // J Instruction Class in V2/V3/V4. 164 // Definition of the instruction class NOT CHANGED. 165 class JType<dag outs, dag ins, string asmstr, list<dag> pattern> 166 : InstHexagon<outs, ins, asmstr, pattern, "", J> { 167 bits<16> imm16; 168 } 169 170 // JR Instruction Class in V2/V3/V4. 171 // Definition of the instruction class NOT CHANGED. 172 class JRType<dag outs, dag ins, string asmstr, list<dag> pattern> 173 : InstHexagon<outs, ins, asmstr, pattern, "", JR> { 174 bits<5> rs; 175 bits<5> pu; // Predicate register 176 } 177 178 // CR Instruction Class in V2/V3/V4. 179 // Definition of the instruction class NOT CHANGED. 180 class CRInst<dag outs, dag ins, string asmstr, list<dag> pattern> 181 : InstHexagon<outs, ins, asmstr, pattern, "", CR> { 182 bits<5> rs; 183 bits<10> imm10; 184 } 185 186 187 class Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern> 188 : InstHexagon<outs, ins, asmstr, pattern, "", PSEUDO>; 189 190 191 //===----------------------------------------------------------------------===// 192 // Intruction Classes Definitions - 193 //===----------------------------------------------------------------------===// 194 195 196 // 197 // ALU32 patterns 198 //. 199 class ALU32_rr<dag outs, dag ins, string asmstr, list<dag> pattern> 200 : ALU32Type<outs, ins, asmstr, pattern> { 201 } 202 203 class ALU32_ir<dag outs, dag ins, string asmstr, list<dag> pattern> 204 : ALU32Type<outs, ins, asmstr, pattern> { 205 let rt{0-4} = 0; 206 } 207 208 class ALU32_ri<dag outs, dag ins, string asmstr, list<dag> pattern> 209 : ALU32Type<outs, ins, asmstr, pattern> { 210 let rt{0-4} = 0; 211 } 212 213 class ALU32_ii<dag outs, dag ins, string asmstr, list<dag> pattern> 214 : ALU32Type<outs, ins, asmstr, pattern> { 215 let rt{0-4} = 0; 216 } 217 218 // 219 // ALU64 patterns. 220 // 221 class ALU64_rr<dag outs, dag ins, string asmstr, list<dag> pattern> 222 : ALU64Type<outs, ins, asmstr, pattern> { 223 } 224 225 // J Type Instructions. 226 class JInst<dag outs, dag ins, string asmstr, list<dag> pattern> 227 : JType<outs, ins, asmstr, pattern> { 228 } 229 230 // JR type Instructions. 231 class JRInst<dag outs, dag ins, string asmstr, list<dag> pattern> 232 : JRType<outs, ins, asmstr, pattern> { 233 } 234 235 236 // Post increment ST Instruction. 237 class STInstPI<dag outs, dag ins, string asmstr, list<dag> pattern, string cstr> 238 : STInstPost<outs, ins, asmstr, pattern, cstr> { 239 let rt{0-4} = 0; 240 } 241 242 // Post increment LD Instruction. 243 class LDInstPI<dag outs, dag ins, string asmstr, list<dag> pattern, string cstr> 244 : LDInstPost<outs, ins, asmstr, pattern, cstr> { 245 let rt{0-4} = 0; 246 } 247 248 //===----------------------------------------------------------------------===// 249 // V4 Instruction Format Definitions + 250 //===----------------------------------------------------------------------===// 251 252 include "HexagonInstrFormatsV4.td" 253 254 //===----------------------------------------------------------------------===// 255 // V4 Instruction Format Definitions + 256 //===----------------------------------------------------------------------===// 257