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