xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/Mips/MipsDSPInstrFormats.td (revision e25152834cdf3b353892835a4f3b157e066a8ed4)
10b57cec5SDimitry Andric//===- MipsDSPInstrFormats.td - Mips Instruction Formats ---*- tablegen -*-===//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andricclass DspMMRel;
100b57cec5SDimitry Andric
110b57cec5SDimitry Andricdef Dsp2MicroMips : InstrMapping {
120b57cec5SDimitry Andric  let FilterClass = "DspMMRel";
130b57cec5SDimitry Andric  // Instructions with the same BaseOpcode and isNVStore values form a row.
140b57cec5SDimitry Andric  let RowFields = ["BaseOpcode"];
150b57cec5SDimitry Andric  // Instructions with the same predicate sense form a column.
160b57cec5SDimitry Andric  let ColFields = ["Arch"];
170b57cec5SDimitry Andric  // The key column is the unpredicated instructions.
180b57cec5SDimitry Andric  let KeyCol = ["dsp"];
190b57cec5SDimitry Andric  // Value columns are PredSense=true and PredSense=false
200b57cec5SDimitry Andric  let ValueCols = [["dsp"], ["mmdsp"]];
210b57cec5SDimitry Andric}
220b57cec5SDimitry Andric
230b57cec5SDimitry Andricdef HasDSP : Predicate<"Subtarget->hasDSP()">,
24*5ffd83dbSDimitry Andric             AssemblerPredicate<(all_of FeatureDSP)>;
250b57cec5SDimitry Andricdef HasDSPR2 : Predicate<"Subtarget->hasDSPR2()">,
26*5ffd83dbSDimitry Andric               AssemblerPredicate<(all_of FeatureDSPR2)>;
270b57cec5SDimitry Andricdef HasDSPR3 : Predicate<"Subtarget->hasDSPR3()">,
28*5ffd83dbSDimitry Andric               AssemblerPredicate<(all_of FeatureDSPR3)>;
290b57cec5SDimitry Andric
300b57cec5SDimitry Andricclass ISA_DSPR2 {
310b57cec5SDimitry Andric  list<Predicate> ASEPredicate = [HasDSPR2];
320b57cec5SDimitry Andric}
330b57cec5SDimitry Andric
340b57cec5SDimitry Andricclass ISA_DSPR3 {
350b57cec5SDimitry Andric  list<Predicate> ASEPredicate = [HasDSPR3];
360b57cec5SDimitry Andric}
370b57cec5SDimitry Andric
380b57cec5SDimitry Andric// Fields.
390b57cec5SDimitry Andricclass Field6<bits<6> val> {
400b57cec5SDimitry Andric  bits<6> V = val;
410b57cec5SDimitry Andric}
420b57cec5SDimitry Andric
430b57cec5SDimitry Andricdef SPECIAL3_OPCODE : Field6<0b011111>;
440b57cec5SDimitry Andricdef REGIMM_OPCODE : Field6<0b000001>;
450b57cec5SDimitry Andric
460b57cec5SDimitry Andricclass DSPInst<string opstr = "">
470b57cec5SDimitry Andric    : MipsInst<(outs), (ins), "", [], NoItinerary, FrmOther> {
480b57cec5SDimitry Andric  let ASEPredicate = [HasDSP];
490b57cec5SDimitry Andric  string BaseOpcode = opstr;
500b57cec5SDimitry Andric  string Arch = "dsp";
510b57cec5SDimitry Andric}
520b57cec5SDimitry Andric
530b57cec5SDimitry Andricclass PseudoDSP<dag outs, dag ins, list<dag> pattern,
540b57cec5SDimitry Andric                InstrItinClass itin = IIPseudo>
550b57cec5SDimitry Andric    : MipsPseudo<outs, ins, pattern, itin> {
560b57cec5SDimitry Andric  let ASEPredicate = [HasDSP];
570b57cec5SDimitry Andric}
580b57cec5SDimitry Andric
590b57cec5SDimitry Andricclass DSPInstAlias<string Asm, dag Result, bit Emit = 0b1>
600b57cec5SDimitry Andric    : InstAlias<Asm, Result, Emit>, PredicateControl {
610b57cec5SDimitry Andric  let ASEPredicate = [HasDSP];
620b57cec5SDimitry Andric}
630b57cec5SDimitry Andric
640b57cec5SDimitry Andric// ADDU.QB sub-class format.
650b57cec5SDimitry Andricclass ADDU_QB_FMT<bits<5> op> : DSPInst {
660b57cec5SDimitry Andric  bits<5> rd;
670b57cec5SDimitry Andric  bits<5> rs;
680b57cec5SDimitry Andric  bits<5> rt;
690b57cec5SDimitry Andric
700b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
710b57cec5SDimitry Andric
720b57cec5SDimitry Andric  let Inst{25-21} = rs;
730b57cec5SDimitry Andric  let Inst{20-16} = rt;
740b57cec5SDimitry Andric  let Inst{15-11} = rd;
750b57cec5SDimitry Andric  let Inst{10-6}  = op;
760b57cec5SDimitry Andric  let Inst{5-0}   = 0b010000;
770b57cec5SDimitry Andric}
780b57cec5SDimitry Andric
790b57cec5SDimitry Andricclass RADDU_W_QB_FMT<bits<5> op> : DSPInst {
800b57cec5SDimitry Andric  bits<5> rd;
810b57cec5SDimitry Andric  bits<5> rs;
820b57cec5SDimitry Andric
830b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
840b57cec5SDimitry Andric
850b57cec5SDimitry Andric  let Inst{25-21} = rs;
860b57cec5SDimitry Andric  let Inst{20-16} = 0;
870b57cec5SDimitry Andric  let Inst{15-11} = rd;
880b57cec5SDimitry Andric  let Inst{10-6}  = op;
890b57cec5SDimitry Andric  let Inst{5-0}   = 0b010000;
900b57cec5SDimitry Andric}
910b57cec5SDimitry Andric
920b57cec5SDimitry Andric// CMPU.EQ.QB sub-class format.
930b57cec5SDimitry Andricclass CMP_EQ_QB_R2_FMT<bits<5> op> : DSPInst {
940b57cec5SDimitry Andric  bits<5> rs;
950b57cec5SDimitry Andric  bits<5> rt;
960b57cec5SDimitry Andric
970b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
980b57cec5SDimitry Andric
990b57cec5SDimitry Andric  let Inst{25-21} = rs;
1000b57cec5SDimitry Andric  let Inst{20-16} = rt;
1010b57cec5SDimitry Andric  let Inst{15-11} = 0;
1020b57cec5SDimitry Andric  let Inst{10-6}  = op;
1030b57cec5SDimitry Andric  let Inst{5-0}   = 0b010001;
1040b57cec5SDimitry Andric}
1050b57cec5SDimitry Andric
1060b57cec5SDimitry Andricclass CMP_EQ_QB_R3_FMT<bits<5> op> : DSPInst {
1070b57cec5SDimitry Andric  bits<5> rs;
1080b57cec5SDimitry Andric  bits<5> rt;
1090b57cec5SDimitry Andric  bits<5> rd;
1100b57cec5SDimitry Andric
1110b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
1120b57cec5SDimitry Andric
1130b57cec5SDimitry Andric  let Inst{25-21} = rs;
1140b57cec5SDimitry Andric  let Inst{20-16} = rt;
1150b57cec5SDimitry Andric  let Inst{15-11} = rd;
1160b57cec5SDimitry Andric  let Inst{10-6}  = op;
1170b57cec5SDimitry Andric  let Inst{5-0}   = 0b010001;
1180b57cec5SDimitry Andric}
1190b57cec5SDimitry Andric
1200b57cec5SDimitry Andricclass PRECR_SRA_PH_W_FMT<bits<5> op> : DSPInst {
1210b57cec5SDimitry Andric  bits<5> rs;
1220b57cec5SDimitry Andric  bits<5> rt;
1230b57cec5SDimitry Andric  bits<5> sa;
1240b57cec5SDimitry Andric
1250b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
1260b57cec5SDimitry Andric
1270b57cec5SDimitry Andric  let Inst{25-21} = rs;
1280b57cec5SDimitry Andric  let Inst{20-16} = rt;
1290b57cec5SDimitry Andric  let Inst{15-11} = sa;
1300b57cec5SDimitry Andric  let Inst{10-6}  = op;
1310b57cec5SDimitry Andric  let Inst{5-0}   = 0b010001;
1320b57cec5SDimitry Andric}
1330b57cec5SDimitry Andric
1340b57cec5SDimitry Andric// ABSQ_S.PH sub-class format.
1350b57cec5SDimitry Andricclass ABSQ_S_PH_R2_FMT<bits<5> op> : DSPInst {
1360b57cec5SDimitry Andric  bits<5> rd;
1370b57cec5SDimitry Andric  bits<5> rt;
1380b57cec5SDimitry Andric
1390b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
1400b57cec5SDimitry Andric
1410b57cec5SDimitry Andric  let Inst{25-21} = 0;
1420b57cec5SDimitry Andric  let Inst{20-16} = rt;
1430b57cec5SDimitry Andric  let Inst{15-11} = rd;
1440b57cec5SDimitry Andric  let Inst{10-6}  = op;
1450b57cec5SDimitry Andric  let Inst{5-0}   = 0b010010;
1460b57cec5SDimitry Andric}
1470b57cec5SDimitry Andric
1480b57cec5SDimitry Andric
1490b57cec5SDimitry Andricclass REPL_FMT<bits<5> op> : DSPInst {
1500b57cec5SDimitry Andric  bits<5> rd;
1510b57cec5SDimitry Andric  bits<10> imm;
1520b57cec5SDimitry Andric
1530b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
1540b57cec5SDimitry Andric
1550b57cec5SDimitry Andric  let Inst{25-16} = imm;
1560b57cec5SDimitry Andric  let Inst{15-11} = rd;
1570b57cec5SDimitry Andric  let Inst{10-6}  = op;
1580b57cec5SDimitry Andric  let Inst{5-0}   = 0b010010;
1590b57cec5SDimitry Andric}
1600b57cec5SDimitry Andric
1610b57cec5SDimitry Andric// SHLL.QB sub-class format.
1620b57cec5SDimitry Andricclass SHLL_QB_FMT<bits<5> op> : DSPInst {
1630b57cec5SDimitry Andric  bits<5> rd;
1640b57cec5SDimitry Andric  bits<5> rt;
1650b57cec5SDimitry Andric  bits<5> rs_sa;
1660b57cec5SDimitry Andric
1670b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
1680b57cec5SDimitry Andric
1690b57cec5SDimitry Andric  let Inst{25-21} = rs_sa;
1700b57cec5SDimitry Andric  let Inst{20-16} = rt;
1710b57cec5SDimitry Andric  let Inst{15-11} = rd;
1720b57cec5SDimitry Andric  let Inst{10-6}  = op;
1730b57cec5SDimitry Andric  let Inst{5-0}   = 0b010011;
1740b57cec5SDimitry Andric}
1750b57cec5SDimitry Andric
1760b57cec5SDimitry Andric// LX sub-class format.
1770b57cec5SDimitry Andricclass LX_FMT<bits<5> op> : DSPInst {
1780b57cec5SDimitry Andric  bits<5> rd;
1790b57cec5SDimitry Andric  bits<5> base;
1800b57cec5SDimitry Andric  bits<5> index;
1810b57cec5SDimitry Andric
1820b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
1830b57cec5SDimitry Andric
1840b57cec5SDimitry Andric  let Inst{25-21} = base;
1850b57cec5SDimitry Andric  let Inst{20-16} = index;
1860b57cec5SDimitry Andric  let Inst{15-11} = rd;
1870b57cec5SDimitry Andric  let Inst{10-6}  = op;
1880b57cec5SDimitry Andric  let Inst{5-0} = 0b001010;
1890b57cec5SDimitry Andric}
1900b57cec5SDimitry Andric
1910b57cec5SDimitry Andric// ADDUH.QB sub-class format.
1920b57cec5SDimitry Andricclass ADDUH_QB_FMT<bits<5> op> : DSPInst {
1930b57cec5SDimitry Andric  bits<5> rd;
1940b57cec5SDimitry Andric  bits<5> rs;
1950b57cec5SDimitry Andric  bits<5> rt;
1960b57cec5SDimitry Andric
1970b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
1980b57cec5SDimitry Andric
1990b57cec5SDimitry Andric  let Inst{25-21} = rs;
2000b57cec5SDimitry Andric  let Inst{20-16} = rt;
2010b57cec5SDimitry Andric  let Inst{15-11} = rd;
2020b57cec5SDimitry Andric  let Inst{10-6} = op;
2030b57cec5SDimitry Andric  let Inst{5-0} = 0b011000;
2040b57cec5SDimitry Andric}
2050b57cec5SDimitry Andric
2060b57cec5SDimitry Andric// APPEND sub-class format.
2070b57cec5SDimitry Andricclass APPEND_FMT<bits<5> op> : DSPInst {
2080b57cec5SDimitry Andric  bits<5> rt;
2090b57cec5SDimitry Andric  bits<5> rs;
2100b57cec5SDimitry Andric  bits<5> sa;
2110b57cec5SDimitry Andric
2120b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
2130b57cec5SDimitry Andric
2140b57cec5SDimitry Andric  let Inst{25-21} = rs;
2150b57cec5SDimitry Andric  let Inst{20-16} = rt;
2160b57cec5SDimitry Andric  let Inst{15-11} = sa;
2170b57cec5SDimitry Andric  let Inst{10-6} = op;
2180b57cec5SDimitry Andric  let Inst{5-0} = 0b110001;
2190b57cec5SDimitry Andric}
2200b57cec5SDimitry Andric
2210b57cec5SDimitry Andric// DPA.W.PH sub-class format.
2220b57cec5SDimitry Andricclass DPA_W_PH_FMT<bits<5> op> : DSPInst {
2230b57cec5SDimitry Andric  bits<2> ac;
2240b57cec5SDimitry Andric  bits<5> rs;
2250b57cec5SDimitry Andric  bits<5> rt;
2260b57cec5SDimitry Andric
2270b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
2280b57cec5SDimitry Andric
2290b57cec5SDimitry Andric  let Inst{25-21} = rs;
2300b57cec5SDimitry Andric  let Inst{20-16} = rt;
2310b57cec5SDimitry Andric  let Inst{15-13} = 0;
2320b57cec5SDimitry Andric  let Inst{12-11} = ac;
2330b57cec5SDimitry Andric  let Inst{10-6}  = op;
2340b57cec5SDimitry Andric  let Inst{5-0} = 0b110000;
2350b57cec5SDimitry Andric}
2360b57cec5SDimitry Andric
2370b57cec5SDimitry Andric// MULT sub-class format.
2380b57cec5SDimitry Andricclass MULT_FMT<bits<6> opcode, bits<6> funct> : DSPInst {
2390b57cec5SDimitry Andric  bits<2> ac;
2400b57cec5SDimitry Andric  bits<5> rs;
2410b57cec5SDimitry Andric  bits<5> rt;
2420b57cec5SDimitry Andric
2430b57cec5SDimitry Andric  let Opcode = opcode;
2440b57cec5SDimitry Andric
2450b57cec5SDimitry Andric  let Inst{25-21} = rs;
2460b57cec5SDimitry Andric  let Inst{20-16} = rt;
2470b57cec5SDimitry Andric  let Inst{15-13} = 0;
2480b57cec5SDimitry Andric  let Inst{12-11} = ac;
2490b57cec5SDimitry Andric  let Inst{10-6}  = 0;
2500b57cec5SDimitry Andric  let Inst{5-0} = funct;
2510b57cec5SDimitry Andric}
2520b57cec5SDimitry Andric
2530b57cec5SDimitry Andric// MFHI sub-class format.
2540b57cec5SDimitry Andricclass MFHI_FMT<bits<6> funct> : DSPInst {
2550b57cec5SDimitry Andric  bits<5> rd;
2560b57cec5SDimitry Andric  bits<2> ac;
2570b57cec5SDimitry Andric
2580b57cec5SDimitry Andric  let Inst{31-26} = 0;
2590b57cec5SDimitry Andric  let Inst{25-23} = 0;
2600b57cec5SDimitry Andric  let Inst{22-21} = ac;
2610b57cec5SDimitry Andric  let Inst{20-16} = 0;
2620b57cec5SDimitry Andric  let Inst{15-11} = rd;
2630b57cec5SDimitry Andric  let Inst{10-6} = 0;
2640b57cec5SDimitry Andric  let Inst{5-0} = funct;
2650b57cec5SDimitry Andric}
2660b57cec5SDimitry Andric
2670b57cec5SDimitry Andric// MTHI sub-class format.
2680b57cec5SDimitry Andricclass MTHI_FMT<bits<6> funct> : DSPInst {
2690b57cec5SDimitry Andric  bits<5> rs;
2700b57cec5SDimitry Andric  bits<2> ac;
2710b57cec5SDimitry Andric
2720b57cec5SDimitry Andric  let Inst{31-26} = 0;
2730b57cec5SDimitry Andric  let Inst{25-21} = rs;
2740b57cec5SDimitry Andric  let Inst{20-13} = 0;
2750b57cec5SDimitry Andric  let Inst{12-11} = ac;
2760b57cec5SDimitry Andric  let Inst{10-6} = 0;
2770b57cec5SDimitry Andric  let Inst{5-0} = funct;
2780b57cec5SDimitry Andric}
2790b57cec5SDimitry Andric
2800b57cec5SDimitry Andric// EXTR.W sub-class format (type 1).
2810b57cec5SDimitry Andricclass EXTR_W_TY1_FMT<bits<5> op> : DSPInst {
2820b57cec5SDimitry Andric  bits<5> rt;
2830b57cec5SDimitry Andric  bits<2> ac;
2840b57cec5SDimitry Andric  bits<5> shift_rs;
2850b57cec5SDimitry Andric
2860b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
2870b57cec5SDimitry Andric
2880b57cec5SDimitry Andric  let Inst{25-21} = shift_rs;
2890b57cec5SDimitry Andric  let Inst{20-16} = rt;
2900b57cec5SDimitry Andric  let Inst{15-13} = 0;
2910b57cec5SDimitry Andric  let Inst{12-11} = ac;
2920b57cec5SDimitry Andric  let Inst{10-6} = op;
2930b57cec5SDimitry Andric  let Inst{5-0} = 0b111000;
2940b57cec5SDimitry Andric}
2950b57cec5SDimitry Andric
2960b57cec5SDimitry Andric// SHILO sub-class format.
2970b57cec5SDimitry Andricclass SHILO_R1_FMT<bits<5> op> : DSPInst {
2980b57cec5SDimitry Andric  bits<2> ac;
2990b57cec5SDimitry Andric  bits<6> shift;
3000b57cec5SDimitry Andric
3010b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
3020b57cec5SDimitry Andric
3030b57cec5SDimitry Andric  let Inst{25-20} = shift;
3040b57cec5SDimitry Andric  let Inst{19-13} = 0;
3050b57cec5SDimitry Andric  let Inst{12-11} = ac;
3060b57cec5SDimitry Andric  let Inst{10-6} = op;
3070b57cec5SDimitry Andric  let Inst{5-0} = 0b111000;
3080b57cec5SDimitry Andric}
3090b57cec5SDimitry Andric
3100b57cec5SDimitry Andricclass SHILO_R2_FMT<bits<5> op> : DSPInst {
3110b57cec5SDimitry Andric  bits<2> ac;
3120b57cec5SDimitry Andric  bits<5> rs;
3130b57cec5SDimitry Andric
3140b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
3150b57cec5SDimitry Andric
3160b57cec5SDimitry Andric  let Inst{25-21} = rs;
3170b57cec5SDimitry Andric  let Inst{20-13} = 0;
3180b57cec5SDimitry Andric  let Inst{12-11} = ac;
3190b57cec5SDimitry Andric  let Inst{10-6} = op;
3200b57cec5SDimitry Andric  let Inst{5-0} = 0b111000;
3210b57cec5SDimitry Andric}
3220b57cec5SDimitry Andric
3230b57cec5SDimitry Andricclass RDDSP_FMT<bits<5> op> : DSPInst {
3240b57cec5SDimitry Andric  bits<5> rd;
3250b57cec5SDimitry Andric  bits<10> mask;
3260b57cec5SDimitry Andric
3270b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
3280b57cec5SDimitry Andric
3290b57cec5SDimitry Andric  let Inst{25-16} = mask;
3300b57cec5SDimitry Andric  let Inst{15-11} = rd;
3310b57cec5SDimitry Andric  let Inst{10-6} = op;
3320b57cec5SDimitry Andric  let Inst{5-0} = 0b111000;
3330b57cec5SDimitry Andric}
3340b57cec5SDimitry Andric
3350b57cec5SDimitry Andricclass WRDSP_FMT<bits<5> op> : DSPInst {
3360b57cec5SDimitry Andric  bits<5> rs;
3370b57cec5SDimitry Andric  bits<10> mask;
3380b57cec5SDimitry Andric
3390b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
3400b57cec5SDimitry Andric
3410b57cec5SDimitry Andric  let Inst{25-21} = rs;
3420b57cec5SDimitry Andric  let Inst{20-11} = mask;
3430b57cec5SDimitry Andric  let Inst{10-6} = op;
3440b57cec5SDimitry Andric  let Inst{5-0} = 0b111000;
3450b57cec5SDimitry Andric}
3460b57cec5SDimitry Andric
3470b57cec5SDimitry Andricclass BPOSGE32_FMT<bits<5> op> : DSPInst {
3480b57cec5SDimitry Andric  bits<16> offset;
3490b57cec5SDimitry Andric
3500b57cec5SDimitry Andric  let Opcode = REGIMM_OPCODE.V;
3510b57cec5SDimitry Andric
3520b57cec5SDimitry Andric  let Inst{25-21} = 0;
3530b57cec5SDimitry Andric  let Inst{20-16} = op;
3540b57cec5SDimitry Andric  let Inst{15-0} = offset;
3550b57cec5SDimitry Andric}
3560b57cec5SDimitry Andric
3570b57cec5SDimitry Andric// INSV sub-class format.
3580b57cec5SDimitry Andricclass INSV_FMT<bits<6> op> : DSPInst {
3590b57cec5SDimitry Andric  bits<5> rt;
3600b57cec5SDimitry Andric  bits<5> rs;
3610b57cec5SDimitry Andric
3620b57cec5SDimitry Andric  let Opcode = SPECIAL3_OPCODE.V;
3630b57cec5SDimitry Andric
3640b57cec5SDimitry Andric  let Inst{25-21} = rs;
3650b57cec5SDimitry Andric  let Inst{20-16} = rt;
3660b57cec5SDimitry Andric  let Inst{15-6} = 0;
3670b57cec5SDimitry Andric  let Inst{5-0} = op;
3680b57cec5SDimitry Andric}
369