MipsDSPInstrFormats.td revision 93ba059e489fd8fdf3a87db638a7283e66942a31
1//===- MipsDSPInstrFormats.td - Mips 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 10def HasDSP : Predicate<"Subtarget.hasDSP()">, 11 AssemblerPredicate<"FeatureDSP">; 12def HasDSPR2 : Predicate<"Subtarget.hasDSPR2()">, 13 AssemblerPredicate<"FeatureDSPR2">; 14 15// Fields. 16class Field6<bits<6> val> { 17 bits<6> V = val; 18} 19 20def SPECIAL3_OPCODE : Field6<0b011111>; 21def REGIMM_OPCODE : Field6<0b000001>; 22 23class DSPInst : MipsInst<(outs), (ins), "", [], NoItinerary, FrmOther> { 24 let Predicates = [HasDSP]; 25} 26 27class PseudoDSP<dag outs, dag ins, list<dag> pattern>: 28 MipsPseudo<outs, ins, "", pattern> { 29 let Predicates = [HasDSP]; 30} 31 32// ADDU.QB sub-class format. 33class ADDU_QB_FMT<bits<5> op> : DSPInst { 34 bits<5> rd; 35 bits<5> rs; 36 bits<5> rt; 37 38 let Opcode = SPECIAL3_OPCODE.V; 39 40 let Inst{25-21} = rs; 41 let Inst{20-16} = rt; 42 let Inst{15-11} = rd; 43 let Inst{10-6} = op; 44 let Inst{5-0} = 0b010000; 45} 46 47class RADDU_W_QB_FMT<bits<5> op> : DSPInst { 48 bits<5> rd; 49 bits<5> rs; 50 51 let Opcode = SPECIAL3_OPCODE.V; 52 53 let Inst{25-21} = rs; 54 let Inst{20-16} = 0; 55 let Inst{15-11} = rd; 56 let Inst{10-6} = op; 57 let Inst{5-0} = 0b010000; 58} 59 60// CMPU.EQ.QB sub-class format. 61class CMP_EQ_QB_R2_FMT<bits<5> op> : DSPInst { 62 bits<5> rs; 63 bits<5> rt; 64 65 let Opcode = SPECIAL3_OPCODE.V; 66 67 let Inst{25-21} = rs; 68 let Inst{20-16} = rt; 69 let Inst{15-11} = 0; 70 let Inst{10-6} = op; 71 let Inst{5-0} = 0b010001; 72} 73 74class CMP_EQ_QB_R3_FMT<bits<5> op> : DSPInst { 75 bits<5> rs; 76 bits<5> rt; 77 bits<5> rd; 78 79 let Opcode = SPECIAL3_OPCODE.V; 80 81 let Inst{25-21} = rs; 82 let Inst{20-16} = rt; 83 let Inst{15-11} = rd; 84 let Inst{10-6} = op; 85 let Inst{5-0} = 0b010001; 86} 87 88class PRECR_SRA_PH_W_FMT<bits<5> op> : DSPInst { 89 bits<5> rs; 90 bits<5> rt; 91 bits<5> sa; 92 93 let Opcode = SPECIAL3_OPCODE.V; 94 95 let Inst{25-21} = rs; 96 let Inst{20-16} = rt; 97 let Inst{15-11} = sa; 98 let Inst{10-6} = op; 99 let Inst{5-0} = 0b010001; 100} 101 102// ABSQ_S.PH sub-class format. 103class ABSQ_S_PH_R2_FMT<bits<5> op> : DSPInst { 104 bits<5> rd; 105 bits<5> rt; 106 107 let Opcode = SPECIAL3_OPCODE.V; 108 109 let Inst{25-21} = 0; 110 let Inst{20-16} = rt; 111 let Inst{15-11} = rd; 112 let Inst{10-6} = op; 113 let Inst{5-0} = 0b010010; 114} 115 116 117class REPL_FMT<bits<5> op> : DSPInst { 118 bits<5> rd; 119 bits<10> imm; 120 121 let Opcode = SPECIAL3_OPCODE.V; 122 123 let Inst{25-16} = imm; 124 let Inst{15-11} = rd; 125 let Inst{10-6} = op; 126 let Inst{5-0} = 0b010010; 127} 128 129// SHLL.QB sub-class format. 130class SHLL_QB_FMT<bits<5> op> : DSPInst { 131 bits<5> rd; 132 bits<5> rt; 133 bits<5> rs_sa; 134 135 let Opcode = SPECIAL3_OPCODE.V; 136 137 let Inst{25-21} = rs_sa; 138 let Inst{20-16} = rt; 139 let Inst{15-11} = rd; 140 let Inst{10-6} = op; 141 let Inst{5-0} = 0b010011; 142} 143 144// LX sub-class format. 145class LX_FMT<bits<5> op> : DSPInst { 146 bits<5> rd; 147 bits<5> base; 148 bits<5> index; 149 150 let Opcode = SPECIAL3_OPCODE.V; 151 152 let Inst{25-21} = base; 153 let Inst{20-16} = index; 154 let Inst{15-11} = rd; 155 let Inst{10-6} = op; 156 let Inst{5-0} = 0b001010; 157} 158 159// ADDUH.QB sub-class format. 160class ADDUH_QB_FMT<bits<5> op> : DSPInst { 161 bits<5> rd; 162 bits<5> rs; 163 bits<5> rt; 164 165 let Opcode = SPECIAL3_OPCODE.V; 166 167 let Inst{25-21} = rs; 168 let Inst{20-16} = rt; 169 let Inst{15-11} = rd; 170 let Inst{10-6} = op; 171 let Inst{5-0} = 0b011000; 172} 173 174// APPEND sub-class format. 175class APPEND_FMT<bits<5> op> : DSPInst { 176 bits<5> rt; 177 bits<5> rs; 178 bits<5> sa; 179 180 let Opcode = SPECIAL3_OPCODE.V; 181 182 let Inst{25-21} = rs; 183 let Inst{20-16} = rt; 184 let Inst{15-11} = sa; 185 let Inst{10-6} = op; 186 let Inst{5-0} = 0b110001; 187} 188 189// DPA.W.PH sub-class format. 190class DPA_W_PH_FMT<bits<5> op> : DSPInst { 191 bits<2> ac; 192 bits<5> rs; 193 bits<5> rt; 194 195 let Opcode = SPECIAL3_OPCODE.V; 196 197 let Inst{25-21} = rs; 198 let Inst{20-16} = rt; 199 let Inst{15-13} = 0; 200 let Inst{12-11} = ac; 201 let Inst{10-6} = op; 202 let Inst{5-0} = 0b110000; 203} 204 205// MULT sub-class format. 206class MULT_FMT<bits<6> opcode, bits<6> funct> : DSPInst { 207 bits<2> ac; 208 bits<5> rs; 209 bits<5> rt; 210 211 let Opcode = opcode; 212 213 let Inst{25-21} = rs; 214 let Inst{20-16} = rt; 215 let Inst{15-13} = 0; 216 let Inst{12-11} = ac; 217 let Inst{10-6} = 0; 218 let Inst{5-0} = funct; 219} 220 221// EXTR.W sub-class format (type 1). 222class EXTR_W_TY1_FMT<bits<5> op> : DSPInst { 223 bits<5> rt; 224 bits<2> ac; 225 bits<5> shift_rs; 226 227 let Opcode = SPECIAL3_OPCODE.V; 228 229 let Inst{25-21} = shift_rs; 230 let Inst{20-16} = rt; 231 let Inst{15-13} = 0; 232 let Inst{12-11} = ac; 233 let Inst{10-6} = op; 234 let Inst{5-0} = 0b111000; 235} 236 237// SHILO sub-class format. 238class SHILO_R1_FMT<bits<5> op> : DSPInst { 239 bits<2> ac; 240 bits<6> shift; 241 242 let Opcode = SPECIAL3_OPCODE.V; 243 244 let Inst{25-20} = shift; 245 let Inst{19-13} = 0; 246 let Inst{12-11} = ac; 247 let Inst{10-6} = op; 248 let Inst{5-0} = 0b111000; 249} 250 251class SHILO_R2_FMT<bits<5> op> : DSPInst { 252 bits<2> ac; 253 bits<5> rs; 254 255 let Opcode = SPECIAL3_OPCODE.V; 256 257 let Inst{25-21} = rs; 258 let Inst{20-13} = 0; 259 let Inst{12-11} = ac; 260 let Inst{10-6} = op; 261 let Inst{5-0} = 0b111000; 262} 263 264class RDDSP_FMT<bits<5> op> : DSPInst { 265 bits<5> rd; 266 bits<10> mask; 267 268 let Opcode = SPECIAL3_OPCODE.V; 269 270 let Inst{25-16} = mask; 271 let Inst{15-11} = rd; 272 let Inst{10-6} = op; 273 let Inst{5-0} = 0b111000; 274} 275 276class WRDSP_FMT<bits<5> op> : DSPInst { 277 bits<5> rs; 278 bits<10> mask; 279 280 let Opcode = SPECIAL3_OPCODE.V; 281 282 let Inst{25-21} = rs; 283 let Inst{20-11} = mask; 284 let Inst{10-6} = op; 285 let Inst{5-0} = 0b111000; 286} 287 288class BPOSGE32_FMT<bits<5> op> : DSPInst { 289 bits<16> offset; 290 291 let Opcode = REGIMM_OPCODE.V; 292 293 let Inst{25-21} = 0; 294 let Inst{20-16} = op; 295 let Inst{15-0} = offset; 296} 297 298// INSV sub-class format. 299class INSV_FMT<bits<6> op> : DSPInst { 300 bits<5> rt; 301 bits<5> rs; 302 303 let Opcode = SPECIAL3_OPCODE.V; 304 305 let Inst{25-21} = rs; 306 let Inst{20-16} = rt; 307 let Inst{15-6} = 0; 308 let Inst{5-0} = op; 309} 310