1*0b57cec5SDimitry Andric//===-- MicroMipsDSPInstrFormats.td - Instruction Formats --*- tablegen -*-===// 2*0b57cec5SDimitry Andric// 3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric// 7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andricclass MMDSPInst<string opstr = ""> 10*0b57cec5SDimitry Andric : MipsInst<(outs), (ins), "", [], NoItinerary, FrmOther> { 11*0b57cec5SDimitry Andric let ASEPredicate = [HasDSP]; 12*0b57cec5SDimitry Andric let EncodingPredicates = [InMicroMips]; 13*0b57cec5SDimitry Andric string BaseOpcode = opstr; 14*0b57cec5SDimitry Andric string Arch = "mmdsp"; 15*0b57cec5SDimitry Andric let DecoderNamespace = "MicroMips"; 16*0b57cec5SDimitry Andric} 17*0b57cec5SDimitry Andric 18*0b57cec5SDimitry Andricclass MMDSPInstAlias<string Asm, dag Result, bit Emit = 0b1> 19*0b57cec5SDimitry Andric : InstAlias<Asm, Result, Emit>, PredicateControl { 20*0b57cec5SDimitry Andric let ASEPredicate = [HasDSP]; 21*0b57cec5SDimitry Andric let AdditionalPredicates = [InMicroMips]; 22*0b57cec5SDimitry Andric} 23*0b57cec5SDimitry Andric 24*0b57cec5SDimitry Andricclass POOL32A_3R_FMT<string opstr, bits<11> op> : MMDSPInst<opstr> { 25*0b57cec5SDimitry Andric bits<5> rd; 26*0b57cec5SDimitry Andric bits<5> rs; 27*0b57cec5SDimitry Andric bits<5> rt; 28*0b57cec5SDimitry Andric 29*0b57cec5SDimitry Andric let Inst{31-26} = 0b000000; 30*0b57cec5SDimitry Andric let Inst{25-21} = rt; 31*0b57cec5SDimitry Andric let Inst{20-16} = rs; 32*0b57cec5SDimitry Andric let Inst{15-11} = rd; 33*0b57cec5SDimitry Andric let Inst{10-0} = op; 34*0b57cec5SDimitry Andric} 35*0b57cec5SDimitry Andric 36*0b57cec5SDimitry Andricclass POOL32A_2R_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> { 37*0b57cec5SDimitry Andric bits<5> rt; 38*0b57cec5SDimitry Andric bits<5> rs; 39*0b57cec5SDimitry Andric 40*0b57cec5SDimitry Andric let Inst{31-26} = 0b000000; 41*0b57cec5SDimitry Andric let Inst{25-21} = rt; 42*0b57cec5SDimitry Andric let Inst{20-16} = rs; 43*0b57cec5SDimitry Andric let Inst{15-6} = op; 44*0b57cec5SDimitry Andric let Inst{5-0} = 0b111100; 45*0b57cec5SDimitry Andric} 46*0b57cec5SDimitry Andric 47*0b57cec5SDimitry Andricclass POOL32A_2RAC_FMT<string opstr, bits<8> op> : MMDSPInst<opstr> { 48*0b57cec5SDimitry Andric bits<5> rt; 49*0b57cec5SDimitry Andric bits<5> rs; 50*0b57cec5SDimitry Andric bits<2> ac; 51*0b57cec5SDimitry Andric 52*0b57cec5SDimitry Andric let Inst{31-26} = 0b000000; 53*0b57cec5SDimitry Andric let Inst{25-21} = rt; 54*0b57cec5SDimitry Andric let Inst{20-16} = rs; 55*0b57cec5SDimitry Andric let Inst{15-14} = ac; 56*0b57cec5SDimitry Andric let Inst{13-6} = op; 57*0b57cec5SDimitry Andric let Inst{5-0} = 0b111100; 58*0b57cec5SDimitry Andric} 59*0b57cec5SDimitry Andric 60*0b57cec5SDimitry Andricclass POOL32A_3RB0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> { 61*0b57cec5SDimitry Andric bits<5> rd; 62*0b57cec5SDimitry Andric bits<5> rs; 63*0b57cec5SDimitry Andric bits<5> rt; 64*0b57cec5SDimitry Andric 65*0b57cec5SDimitry Andric let Inst{31-26} = 0b000000; 66*0b57cec5SDimitry Andric let Inst{25-21} = rt; 67*0b57cec5SDimitry Andric let Inst{20-16} = rs; 68*0b57cec5SDimitry Andric let Inst{15-11} = rd; 69*0b57cec5SDimitry Andric let Inst{10} = 0b0; 70*0b57cec5SDimitry Andric let Inst{9-0} = op; 71*0b57cec5SDimitry Andric} 72*0b57cec5SDimitry Andric 73*0b57cec5SDimitry Andricclass POOL32A_2RSA4_FMT<string opstr, bits<12> op> : MMDSPInst<opstr> { 74*0b57cec5SDimitry Andric bits<5> rt; 75*0b57cec5SDimitry Andric bits<5> rs; 76*0b57cec5SDimitry Andric bits<4> sa; 77*0b57cec5SDimitry Andric 78*0b57cec5SDimitry Andric let Inst{31-26} = 0b000000; 79*0b57cec5SDimitry Andric let Inst{25-21} = rt; 80*0b57cec5SDimitry Andric let Inst{20-16} = rs; 81*0b57cec5SDimitry Andric let Inst{15-12} = sa; 82*0b57cec5SDimitry Andric let Inst{11-0} = op; 83*0b57cec5SDimitry Andric} 84*0b57cec5SDimitry Andric 85*0b57cec5SDimitry Andricclass POOL32A_2RSA3_FMT<string opstr, bits<7> op> : MMDSPInst<opstr> { 86*0b57cec5SDimitry Andric bits<5> rt; 87*0b57cec5SDimitry Andric bits<5> rs; 88*0b57cec5SDimitry Andric bits<3> sa; 89*0b57cec5SDimitry Andric 90*0b57cec5SDimitry Andric let Inst{31-26} = 0b000000; 91*0b57cec5SDimitry Andric let Inst{25-21} = rt; 92*0b57cec5SDimitry Andric let Inst{20-16} = rs; 93*0b57cec5SDimitry Andric let Inst{15-13} = sa; 94*0b57cec5SDimitry Andric let Inst{12-6} = op; 95*0b57cec5SDimitry Andric let Inst{5-0} = 0b111100; 96*0b57cec5SDimitry Andric} 97*0b57cec5SDimitry Andric 98*0b57cec5SDimitry Andricclass POOL32A_2RSA5B0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> { 99*0b57cec5SDimitry Andric bits<5> rt; 100*0b57cec5SDimitry Andric bits<5> rs; 101*0b57cec5SDimitry Andric bits<5> sa; 102*0b57cec5SDimitry Andric 103*0b57cec5SDimitry Andric let Inst{31-26} = 0b000000; 104*0b57cec5SDimitry Andric let Inst{25-21} = rt; 105*0b57cec5SDimitry Andric let Inst{20-16} = rs; 106*0b57cec5SDimitry Andric let Inst{15-11} = sa; 107*0b57cec5SDimitry Andric let Inst{10} = 0b0; 108*0b57cec5SDimitry Andric let Inst{9-0} = op; 109*0b57cec5SDimitry Andric} 110*0b57cec5SDimitry Andric 111*0b57cec5SDimitry Andricclass POOL32A_2RSA4B0_FMT<string opstr, bits<11> op> : MMDSPInst<opstr> { 112*0b57cec5SDimitry Andric bits<5> rt; 113*0b57cec5SDimitry Andric bits<5> rs; 114*0b57cec5SDimitry Andric bits<4> sa; 115*0b57cec5SDimitry Andric 116*0b57cec5SDimitry Andric let Inst{31-26} = 0b000000; 117*0b57cec5SDimitry Andric let Inst{25-21} = rt; 118*0b57cec5SDimitry Andric let Inst{20-16} = rs; 119*0b57cec5SDimitry Andric let Inst{15-12} = sa; 120*0b57cec5SDimitry Andric let Inst{11} = 0b0; 121*0b57cec5SDimitry Andric let Inst{10-0} = op; 122*0b57cec5SDimitry Andric} 123*0b57cec5SDimitry Andric 124*0b57cec5SDimitry Andricclass POOL32A_2RSA4OP6_FMT<string opstr, bits<6> op> : MMDSPInst<opstr> { 125*0b57cec5SDimitry Andric bits<5> rt; 126*0b57cec5SDimitry Andric bits<5> rs; 127*0b57cec5SDimitry Andric bits<4> sa; 128*0b57cec5SDimitry Andric 129*0b57cec5SDimitry Andric let Inst{31-26} = 0b000000; 130*0b57cec5SDimitry Andric let Inst{25-21} = rt; 131*0b57cec5SDimitry Andric let Inst{20-16} = rs; 132*0b57cec5SDimitry Andric let Inst{15-12} = sa; 133*0b57cec5SDimitry Andric let Inst{11-6} = op; 134*0b57cec5SDimitry Andric let Inst{5-0} = 0b111100; 135*0b57cec5SDimitry Andric} 136*0b57cec5SDimitry Andric 137*0b57cec5SDimitry Andricclass POOL32A_1RIMM5AC_FMT<string opstr, bits<8> funct> : MMDSPInst<opstr> { 138*0b57cec5SDimitry Andric bits<5> rt; 139*0b57cec5SDimitry Andric bits<5> imm; 140*0b57cec5SDimitry Andric bits<2> ac; 141*0b57cec5SDimitry Andric 142*0b57cec5SDimitry Andric let Inst{31-26} = 0b000000; 143*0b57cec5SDimitry Andric let Inst{25-21} = rt; 144*0b57cec5SDimitry Andric let Inst{20-16} = imm; 145*0b57cec5SDimitry Andric let Inst{15-14} = ac; 146*0b57cec5SDimitry Andric let Inst{13-6} = funct; 147*0b57cec5SDimitry Andric let Inst{5-0} = 0b111100; 148*0b57cec5SDimitry Andric} 149*0b57cec5SDimitry Andric 150*0b57cec5SDimitry Andricclass POOL32A_2RSA5_FMT<string opstr, bits<11> op> : MMDSPInst<opstr> { 151*0b57cec5SDimitry Andric bits<5> rt; 152*0b57cec5SDimitry Andric bits<5> rs; 153*0b57cec5SDimitry Andric bits<5> sa; 154*0b57cec5SDimitry Andric 155*0b57cec5SDimitry Andric let Inst{31-26} = 0b000000; 156*0b57cec5SDimitry Andric let Inst{25-21} = rt; 157*0b57cec5SDimitry Andric let Inst{20-16} = rs; 158*0b57cec5SDimitry Andric let Inst{15-11} = sa; 159*0b57cec5SDimitry Andric let Inst{10-0} = op; 160*0b57cec5SDimitry Andric} 161*0b57cec5SDimitry Andric 162*0b57cec5SDimitry Andricclass POOL32A_1RMEMB0_FMT<string opstr, bits<10> funct> : MMDSPInst<opstr> { 163*0b57cec5SDimitry Andric bits<5> index; 164*0b57cec5SDimitry Andric bits<5> base; 165*0b57cec5SDimitry Andric bits<5> rd; 166*0b57cec5SDimitry Andric 167*0b57cec5SDimitry Andric let Inst{31-26} = 0; 168*0b57cec5SDimitry Andric let Inst{25-21} = index; 169*0b57cec5SDimitry Andric let Inst{20-16} = base; 170*0b57cec5SDimitry Andric let Inst{15-11} = rd; 171*0b57cec5SDimitry Andric let Inst{10} = 0b0; 172*0b57cec5SDimitry Andric let Inst{9-0} = funct; 173*0b57cec5SDimitry Andric} 174*0b57cec5SDimitry Andric 175*0b57cec5SDimitry Andricclass POOL32A_1RAC_FMT<string instr_asm, bits<8> funct> : MMDSPInst<instr_asm> { 176*0b57cec5SDimitry Andric bits<5> rs; 177*0b57cec5SDimitry Andric bits<2> ac; 178*0b57cec5SDimitry Andric 179*0b57cec5SDimitry Andric let Inst{31-26} = 0; 180*0b57cec5SDimitry Andric let Inst{25-21} = 0; 181*0b57cec5SDimitry Andric let Inst{20-16} = rs; 182*0b57cec5SDimitry Andric let Inst{15-14} = ac; 183*0b57cec5SDimitry Andric let Inst{13-6} = funct; 184*0b57cec5SDimitry Andric let Inst{5-0} = 0b111100; 185*0b57cec5SDimitry Andric} 186*0b57cec5SDimitry Andric 187*0b57cec5SDimitry Andricclass POOL32A_1RMASK7_FMT<string opstr, bits<8> op> : MMDSPInst<opstr> { 188*0b57cec5SDimitry Andric bits<5> rt; 189*0b57cec5SDimitry Andric bits<7> mask; 190*0b57cec5SDimitry Andric 191*0b57cec5SDimitry Andric let Inst{31-26} = 0b000000; 192*0b57cec5SDimitry Andric let Inst{25-21} = rt; 193*0b57cec5SDimitry Andric let Inst{20-14} = mask; 194*0b57cec5SDimitry Andric let Inst{13-6} = op; 195*0b57cec5SDimitry Andric let Inst{5-0} = 0b111100; 196*0b57cec5SDimitry Andric} 197*0b57cec5SDimitry Andric 198*0b57cec5SDimitry Andricclass POOL32A_1RIMM10_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> { 199*0b57cec5SDimitry Andric bits<5> rd; 200*0b57cec5SDimitry Andric bits<10> imm; 201*0b57cec5SDimitry Andric 202*0b57cec5SDimitry Andric let Inst{31-26} = 0; 203*0b57cec5SDimitry Andric let Inst{25-16} = imm; 204*0b57cec5SDimitry Andric let Inst{15-11} = rd; 205*0b57cec5SDimitry Andric let Inst{10} = 0; 206*0b57cec5SDimitry Andric let Inst{9-0} = op; 207*0b57cec5SDimitry Andric} 208*0b57cec5SDimitry Andric 209*0b57cec5SDimitry Andricclass POOL32A_1RIMM8_FMT<string opstr, bits<6> op> : MMDSPInst<opstr> { 210*0b57cec5SDimitry Andric bits<5> rt; 211*0b57cec5SDimitry Andric bits<8> imm; 212*0b57cec5SDimitry Andric 213*0b57cec5SDimitry Andric let Inst{31-26} = 0; 214*0b57cec5SDimitry Andric let Inst{25-21} = rt; 215*0b57cec5SDimitry Andric let Inst{20-13} = imm; 216*0b57cec5SDimitry Andric let Inst{12} = 0; 217*0b57cec5SDimitry Andric let Inst{11-6} = op; 218*0b57cec5SDimitry Andric let Inst{5-0} = 0b111100; 219*0b57cec5SDimitry Andric} 220*0b57cec5SDimitry Andric 221*0b57cec5SDimitry Andricclass POOL32A_4B0SHIFT6AC4B0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> { 222*0b57cec5SDimitry Andric bits<6> shift; 223*0b57cec5SDimitry Andric bits<2> ac; 224*0b57cec5SDimitry Andric 225*0b57cec5SDimitry Andric let Inst{31-26} = 0b000000; 226*0b57cec5SDimitry Andric let Inst{25-22} = 0b0000; 227*0b57cec5SDimitry Andric let Inst{21-16} = shift; 228*0b57cec5SDimitry Andric let Inst{15-14} = ac; 229*0b57cec5SDimitry Andric let Inst{13-10} = 0b0000; 230*0b57cec5SDimitry Andric let Inst{9-0} = op; 231*0b57cec5SDimitry Andric} 232*0b57cec5SDimitry Andric 233*0b57cec5SDimitry Andricclass POOL32A_5B01RAC_FMT<string opstr, bits<8> op> : MMDSPInst<opstr> { 234*0b57cec5SDimitry Andric bits<5> rs; 235*0b57cec5SDimitry Andric bits<2> ac; 236*0b57cec5SDimitry Andric 237*0b57cec5SDimitry Andric let Inst{31-26} = 0b000000; 238*0b57cec5SDimitry Andric let Inst{25-21} = 0b00000; 239*0b57cec5SDimitry Andric let Inst{20-16} = rs; 240*0b57cec5SDimitry Andric let Inst{15-14} = ac; 241*0b57cec5SDimitry Andric let Inst{13-6} = op; 242*0b57cec5SDimitry Andric let Inst{5-0} = 0b111100; 243*0b57cec5SDimitry Andric} 244*0b57cec5SDimitry Andric 245*0b57cec5SDimitry Andricclass POOL32I_IMMB0_FMT<string opstr, bits<5> op> : MMDSPInst<opstr> { 246*0b57cec5SDimitry Andric bits<16> offset; 247*0b57cec5SDimitry Andric 248*0b57cec5SDimitry Andric let Inst{31-26} = 0b010000; 249*0b57cec5SDimitry Andric let Inst{25-21} = op; 250*0b57cec5SDimitry Andric let Inst{20-16} = 0; 251*0b57cec5SDimitry Andric let Inst{15-0} = offset; 252*0b57cec5SDimitry Andric} 253*0b57cec5SDimitry Andric 254*0b57cec5SDimitry Andricclass POOL32A_2RBP_FMT<string opstr> : MMDSPInst<opstr> { 255*0b57cec5SDimitry Andric bits<5> rt; 256*0b57cec5SDimitry Andric bits<5> rs; 257*0b57cec5SDimitry Andric bits<2> bp; 258*0b57cec5SDimitry Andric 259*0b57cec5SDimitry Andric let Inst{31-26} = 0; 260*0b57cec5SDimitry Andric let Inst{25-21} = rt; 261*0b57cec5SDimitry Andric let Inst{20-16} = rs; 262*0b57cec5SDimitry Andric let Inst{15-14} = bp; 263*0b57cec5SDimitry Andric let Inst{13-6} = 0b00100010; 264*0b57cec5SDimitry Andric let Inst{5-0} = 0b111100; 265*0b57cec5SDimitry Andric} 266*0b57cec5SDimitry Andric 267*0b57cec5SDimitry Andricclass POOL32A_2RB0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> { 268*0b57cec5SDimitry Andric bits<5> rt; 269*0b57cec5SDimitry Andric bits<5> rs; 270*0b57cec5SDimitry Andric 271*0b57cec5SDimitry Andric let Inst{31-26} = 0; 272*0b57cec5SDimitry Andric let Inst{25-21} = rt; 273*0b57cec5SDimitry Andric let Inst{20-16} = rs; 274*0b57cec5SDimitry Andric let Inst{15-10} = 0; 275*0b57cec5SDimitry Andric let Inst{9-0} = op; 276*0b57cec5SDimitry Andric} 277*0b57cec5SDimitry Andric 278*0b57cec5SDimitry Andricclass POOL32S_3RB0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> { 279*0b57cec5SDimitry Andric bits<5> rt; 280*0b57cec5SDimitry Andric bits<5> rs; 281*0b57cec5SDimitry Andric bits<5> rd; 282*0b57cec5SDimitry Andric 283*0b57cec5SDimitry Andric let Inst{31-26} = 0b010110; 284*0b57cec5SDimitry Andric let Inst{25-21} = rt; 285*0b57cec5SDimitry Andric let Inst{20-16} = rs; 286*0b57cec5SDimitry Andric let Inst{15-11} = rd; 287*0b57cec5SDimitry Andric let Inst{10} = 0b0; 288*0b57cec5SDimitry Andric let Inst{9-0} = op; 289*0b57cec5SDimitry Andric} 290*0b57cec5SDimitry Andric 291*0b57cec5SDimitry Andricclass POOL32A_2R2B0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> { 292*0b57cec5SDimitry Andric bits<5> rt; 293*0b57cec5SDimitry Andric bits<5> rs; 294*0b57cec5SDimitry Andric 295*0b57cec5SDimitry Andric let Inst{31-26} = 0; 296*0b57cec5SDimitry Andric let Inst{25-21} = rt; 297*0b57cec5SDimitry Andric let Inst{20-16} = rs; 298*0b57cec5SDimitry Andric let Inst{15-11} = 0; 299*0b57cec5SDimitry Andric let Inst{10} = 0; 300*0b57cec5SDimitry Andric let Inst{9-0} = op; 301*0b57cec5SDimitry Andric} 302