1//===- MipsMSAInstrFormats.td - Mips Instruction Formats ---*- tablegen -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9class MSAInst : MipsInst<(outs), (ins), "", [], NoItinerary, FrmOther>, 10 ASE_MSA { 11 let EncodingPredicates = [HasStdEnc]; 12 let Inst{31-26} = 0b011110; 13} 14 15class MSACBranch : MSAInst { 16 let Inst{31-26} = 0b010001; 17} 18 19class MSASpecial : MSAInst { 20 let Inst{31-26} = 0b000000; 21} 22 23class MSAPseudo<dag outs, dag ins, list<dag> pattern, 24 InstrItinClass itin = IIPseudo>: 25 MipsPseudo<outs, ins, pattern, itin> { 26 let EncodingPredicates = [HasStdEnc]; 27 let ASEPredicate = [HasMSA]; 28} 29 30class MSA_BIT_B_FMT<bits<3> major, bits<6> minor>: MSAInst { 31 bits<5> ws; 32 bits<5> wd; 33 bits<3> m; 34 35 let Inst{25-23} = major; 36 let Inst{22-19} = 0b1110; 37 let Inst{18-16} = m; 38 let Inst{15-11} = ws; 39 let Inst{10-6} = wd; 40 let Inst{5-0} = minor; 41} 42 43class MSA_BIT_H_FMT<bits<3> major, bits<6> minor>: MSAInst { 44 bits<5> ws; 45 bits<5> wd; 46 bits<4> m; 47 48 let Inst{25-23} = major; 49 let Inst{22-20} = 0b110; 50 let Inst{19-16} = m; 51 let Inst{15-11} = ws; 52 let Inst{10-6} = wd; 53 let Inst{5-0} = minor; 54} 55 56class MSA_BIT_W_FMT<bits<3> major, bits<6> minor>: MSAInst { 57 bits<5> ws; 58 bits<5> wd; 59 bits<5> m; 60 61 let Inst{25-23} = major; 62 let Inst{22-21} = 0b10; 63 let Inst{20-16} = m; 64 let Inst{15-11} = ws; 65 let Inst{10-6} = wd; 66 let Inst{5-0} = minor; 67} 68 69class MSA_BIT_D_FMT<bits<3> major, bits<6> minor>: MSAInst { 70 bits<5> ws; 71 bits<5> wd; 72 bits<6> m; 73 74 let Inst{25-23} = major; 75 let Inst{22} = 0b0; 76 let Inst{21-16} = m; 77 let Inst{15-11} = ws; 78 let Inst{10-6} = wd; 79 let Inst{5-0} = minor; 80} 81 82class MSA_2R_FILL_FMT<bits<8> major, bits<2> df, bits<6> minor>: MSAInst { 83 bits<5> rs; 84 bits<5> wd; 85 86 let Inst{25-18} = major; 87 let Inst{17-16} = df; 88 let Inst{15-11} = rs; 89 let Inst{10-6} = wd; 90 let Inst{5-0} = minor; 91} 92 93class MSA_2R_FILL_D_FMT<bits<8> major, bits<2> df, bits<6> minor>: MSAInst { 94 bits<5> rs; 95 bits<5> wd; 96 97 let Inst{25-18} = major; 98 let Inst{17-16} = df; 99 let Inst{15-11} = rs; 100 let Inst{10-6} = wd; 101 let Inst{5-0} = minor; 102} 103 104class MSA_2R_FMT<bits<8> major, bits<2> df, bits<6> minor>: MSAInst { 105 bits<5> ws; 106 bits<5> wd; 107 108 let Inst{25-18} = major; 109 let Inst{17-16} = df; 110 let Inst{15-11} = ws; 111 let Inst{10-6} = wd; 112 let Inst{5-0} = minor; 113} 114 115class MSA_2RF_FMT<bits<9> major, bits<1> df, bits<6> minor>: MSAInst { 116 bits<5> ws; 117 bits<5> wd; 118 119 let Inst{25-17} = major; 120 let Inst{16} = df; 121 let Inst{15-11} = ws; 122 let Inst{10-6} = wd; 123 let Inst{5-0} = minor; 124} 125 126class MSA_3R_FMT<bits<3> major, bits<2> df, bits<6> minor>: MSAInst { 127 bits<5> wt; 128 bits<5> ws; 129 bits<5> wd; 130 131 let Inst{25-23} = major; 132 let Inst{22-21} = df; 133 let Inst{20-16} = wt; 134 let Inst{15-11} = ws; 135 let Inst{10-6} = wd; 136 let Inst{5-0} = minor; 137} 138 139class MSA_3RF_FMT<bits<4> major, bits<1> df, bits<6> minor>: MSAInst { 140 bits<5> wt; 141 bits<5> ws; 142 bits<5> wd; 143 144 let Inst{25-22} = major; 145 let Inst{21} = df; 146 let Inst{20-16} = wt; 147 let Inst{15-11} = ws; 148 let Inst{10-6} = wd; 149 let Inst{5-0} = minor; 150} 151 152class MSA_3R_INDEX_FMT<bits<3> major, bits<2> df, bits<6> minor>: MSAInst { 153 bits<5> rt; 154 bits<5> ws; 155 bits<5> wd; 156 157 let Inst{25-23} = major; 158 let Inst{22-21} = df; 159 let Inst{20-16} = rt; 160 let Inst{15-11} = ws; 161 let Inst{10-6} = wd; 162 let Inst{5-0} = minor; 163} 164 165class MSA_ELM_FMT<bits<10> major, bits<6> minor>: MSAInst { 166 bits<5> ws; 167 bits<5> wd; 168 169 let Inst{25-16} = major; 170 let Inst{15-11} = ws; 171 let Inst{10-6} = wd; 172 let Inst{5-0} = minor; 173} 174 175class MSA_ELM_CFCMSA_FMT<bits<10> major, bits<6> minor>: MSAInst { 176 bits<5> rd; 177 bits<5> cs; 178 179 let Inst{25-16} = major; 180 let Inst{15-11} = cs; 181 let Inst{10-6} = rd; 182 let Inst{5-0} = minor; 183} 184 185class MSA_ELM_CTCMSA_FMT<bits<10> major, bits<6> minor>: MSAInst { 186 bits<5> rs; 187 bits<5> cd; 188 189 let Inst{25-16} = major; 190 let Inst{15-11} = rs; 191 let Inst{10-6} = cd; 192 let Inst{5-0} = minor; 193} 194 195class MSA_ELM_B_FMT<bits<4> major, bits<6> minor>: MSAInst { 196 bits<4> n; 197 bits<5> ws; 198 bits<5> wd; 199 200 let Inst{25-22} = major; 201 let Inst{21-20} = 0b00; 202 let Inst{19-16} = n{3-0}; 203 let Inst{15-11} = ws; 204 let Inst{10-6} = wd; 205 let Inst{5-0} = minor; 206} 207 208class MSA_ELM_H_FMT<bits<4> major, bits<6> minor>: MSAInst { 209 bits<4> n; 210 bits<5> ws; 211 bits<5> wd; 212 213 let Inst{25-22} = major; 214 let Inst{21-19} = 0b100; 215 let Inst{18-16} = n{2-0}; 216 let Inst{15-11} = ws; 217 let Inst{10-6} = wd; 218 let Inst{5-0} = minor; 219} 220 221class MSA_ELM_W_FMT<bits<4> major, bits<6> minor>: MSAInst { 222 bits<4> n; 223 bits<5> ws; 224 bits<5> wd; 225 226 let Inst{25-22} = major; 227 let Inst{21-18} = 0b1100; 228 let Inst{17-16} = n{1-0}; 229 let Inst{15-11} = ws; 230 let Inst{10-6} = wd; 231 let Inst{5-0} = minor; 232} 233 234class MSA_ELM_D_FMT<bits<4> major, bits<6> minor>: MSAInst { 235 bits<4> n; 236 bits<5> ws; 237 bits<5> wd; 238 239 let Inst{25-22} = major; 240 let Inst{21-17} = 0b11100; 241 let Inst{16} = n{0}; 242 let Inst{15-11} = ws; 243 let Inst{10-6} = wd; 244 let Inst{5-0} = minor; 245} 246 247class MSA_ELM_COPY_B_FMT<bits<4> major, bits<6> minor>: MSAInst { 248 bits<4> n; 249 bits<5> ws; 250 bits<5> rd; 251 252 let Inst{25-22} = major; 253 let Inst{21-20} = 0b00; 254 let Inst{19-16} = n{3-0}; 255 let Inst{15-11} = ws; 256 let Inst{10-6} = rd; 257 let Inst{5-0} = minor; 258} 259 260class MSA_ELM_COPY_H_FMT<bits<4> major, bits<6> minor>: MSAInst { 261 bits<4> n; 262 bits<5> ws; 263 bits<5> rd; 264 265 let Inst{25-22} = major; 266 let Inst{21-19} = 0b100; 267 let Inst{18-16} = n{2-0}; 268 let Inst{15-11} = ws; 269 let Inst{10-6} = rd; 270 let Inst{5-0} = minor; 271} 272 273class MSA_ELM_COPY_W_FMT<bits<4> major, bits<6> minor>: MSAInst { 274 bits<4> n; 275 bits<5> ws; 276 bits<5> rd; 277 278 let Inst{25-22} = major; 279 let Inst{21-18} = 0b1100; 280 let Inst{17-16} = n{1-0}; 281 let Inst{15-11} = ws; 282 let Inst{10-6} = rd; 283 let Inst{5-0} = minor; 284} 285 286class MSA_ELM_COPY_D_FMT<bits<4> major, bits<6> minor>: MSAInst { 287 bits<4> n; 288 bits<5> ws; 289 bits<5> rd; 290 291 let Inst{25-22} = major; 292 let Inst{21-17} = 0b11100; 293 let Inst{16} = n{0}; 294 let Inst{15-11} = ws; 295 let Inst{10-6} = rd; 296 let Inst{5-0} = minor; 297} 298 299class MSA_ELM_INSERT_B_FMT<bits<4> major, bits<6> minor>: MSAInst { 300 bits<6> n; 301 bits<5> rs; 302 bits<5> wd; 303 304 let Inst{25-22} = major; 305 let Inst{21-20} = 0b00; 306 let Inst{19-16} = n{3-0}; 307 let Inst{15-11} = rs; 308 let Inst{10-6} = wd; 309 let Inst{5-0} = minor; 310} 311 312class MSA_ELM_INSERT_H_FMT<bits<4> major, bits<6> minor>: MSAInst { 313 bits<6> n; 314 bits<5> rs; 315 bits<5> wd; 316 317 let Inst{25-22} = major; 318 let Inst{21-19} = 0b100; 319 let Inst{18-16} = n{2-0}; 320 let Inst{15-11} = rs; 321 let Inst{10-6} = wd; 322 let Inst{5-0} = minor; 323} 324 325class MSA_ELM_INSERT_W_FMT<bits<4> major, bits<6> minor>: MSAInst { 326 bits<6> n; 327 bits<5> rs; 328 bits<5> wd; 329 330 let Inst{25-22} = major; 331 let Inst{21-18} = 0b1100; 332 let Inst{17-16} = n{1-0}; 333 let Inst{15-11} = rs; 334 let Inst{10-6} = wd; 335 let Inst{5-0} = minor; 336} 337 338class MSA_ELM_INSERT_D_FMT<bits<4> major, bits<6> minor>: MSAInst { 339 bits<6> n; 340 bits<5> rs; 341 bits<5> wd; 342 343 let Inst{25-22} = major; 344 let Inst{21-17} = 0b11100; 345 let Inst{16} = n{0}; 346 let Inst{15-11} = rs; 347 let Inst{10-6} = wd; 348 let Inst{5-0} = minor; 349} 350 351class MSA_I5_FMT<bits<3> major, bits<2> df, bits<6> minor>: MSAInst { 352 bits<5> imm; 353 bits<5> ws; 354 bits<5> wd; 355 356 let Inst{25-23} = major; 357 let Inst{22-21} = df; 358 let Inst{20-16} = imm; 359 let Inst{15-11} = ws; 360 let Inst{10-6} = wd; 361 let Inst{5-0} = minor; 362} 363 364class MSA_I8_FMT<bits<2> major, bits<6> minor>: MSAInst { 365 bits<8> u8; 366 bits<5> ws; 367 bits<5> wd; 368 369 let Inst{25-24} = major; 370 let Inst{23-16} = u8; 371 let Inst{15-11} = ws; 372 let Inst{10-6} = wd; 373 let Inst{5-0} = minor; 374} 375 376class MSA_I10_FMT<bits<3> major, bits<2> df, bits<6> minor>: MSAInst { 377 bits<10> s10; 378 bits<5> wd; 379 380 let Inst{25-23} = major; 381 let Inst{22-21} = df; 382 let Inst{20-11} = s10; 383 let Inst{10-6} = wd; 384 let Inst{5-0} = minor; 385} 386 387class MSA_MI10_FMT<bits<2> df, bits<4> minor>: MSAInst { 388 bits<21> addr; 389 bits<5> wd; 390 391 let Inst{25-16} = addr{9-0}; 392 let Inst{15-11} = addr{20-16}; 393 let Inst{10-6} = wd; 394 let Inst{5-2} = minor; 395 let Inst{1-0} = df; 396} 397 398class MSA_VEC_FMT<bits<5> major, bits<6> minor>: MSAInst { 399 bits<5> wt; 400 bits<5> ws; 401 bits<5> wd; 402 403 let Inst{25-21} = major; 404 let Inst{20-16} = wt; 405 let Inst{15-11} = ws; 406 let Inst{10-6} = wd; 407 let Inst{5-0} = minor; 408} 409 410class MSA_CBRANCH_FMT<bits<3> major, bits<2> df>: MSACBranch { 411 bits<16> offset; 412 bits<5> wt; 413 414 let Inst{25-23} = major; 415 let Inst{22-21} = df; 416 let Inst{20-16} = wt; 417 let Inst{15-0} = offset; 418} 419 420class MSA_CBRANCH_V_FMT<bits<5> major>: MSACBranch { 421 bits<16> offset; 422 bits<5> wt; 423 424 let Inst{25-21} = major; 425 let Inst{20-16} = wt; 426 let Inst{15-0} = offset; 427} 428 429class SPECIAL_LSA_FMT<bits<6> minor>: MSASpecial { 430 bits<5> rs; 431 bits<5> rt; 432 bits<5> rd; 433 bits<2> sa; 434 435 let Inst{25-21} = rs; 436 let Inst{20-16} = rt; 437 let Inst{15-11} = rd; 438 let Inst{10-8} = 0b000; 439 let Inst{7-6} = sa; 440 let Inst{5-0} = minor; 441} 442 443class SPECIAL_DLSA_FMT<bits<6> minor>: MSASpecial { 444 bits<5> rs; 445 bits<5> rt; 446 bits<5> rd; 447 bits<2> sa; 448 449 let Inst{25-21} = rs; 450 let Inst{20-16} = rt; 451 let Inst{15-11} = rd; 452 let Inst{10-8} = 0b000; 453 let Inst{7-6} = sa; 454 let Inst{5-0} = minor; 455} 456