[llvm] [Mips][nanoMIPS] Add initial nanoMIPS target support (PR #223032)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 5 12:48:54 PDT 2026
================
@@ -0,0 +1,975 @@
+//===-- NanoMipsInstrFormats.td - nanoMIPS Instr Formats --*- tablegen -*--===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file describes the formats of the nanoMIPS instruction set.
+//
+//===----------------------------------------------------------------------===//
+
+class InstNM_Enc : Instruction, PredicateControl, ISA_NANOMIPS {
+ let Namespace = "Mips";
+ let DecoderNamespace = "NanoMips";
+
+ let EncodingPredicates = [HasNanoMips];
+ string Arch = "nanomips";
+ let AsmVariantName = "nanomips";
+}
+
+class InstNM<dag outs, dag ins, string asmstr, list<dag> pattern = [],
+ InstrItinClass itin = NoItinerary,
+ bit FastISelIgnore = 1>
+ : InstNM_Enc {
+ let OutOperandList = outs;
+ let InOperandList = ins;
+ let AsmString = asmstr;
+ let Pattern = pattern;
+ let FastISelShouldIgnore = FastISelIgnore;
+ bit isCTI = 0; // Any form of Control Transfer Instruction.
+
+ let Itinerary = itin;
+}
+
+class InstSize16 {
+ bits<16> Inst;
+ int Size = 2;
+ bits<16> SoftFail = 0;
+}
+
+class InstSize32 {
+ bits<32> Inst;
+ int Size = 4;
+ bits<32> SoftFail = 0;
+}
+
+class InstSize48 {
+ bits<48> Inst;
+ int Size = 6;
+ bits<48> SoftFail = 0;
+}
+
+class RegConstraint<string C> {
+ string Constraints = C;
+}
+
+class NoEncode<string E> {
+ string DisableEncoding = E;
+}
+
+//===----------------------------------------------------------------------===//
+// Opcode Pools, as specified in the ISA document.
+//===----------------------------------------------------------------------===//
+
+class _Pool_P32<bits<5> psel> : InstSize32 {
+ let Inst{31-26} = {psel{4-2}, 0b0, psel{1-0}};
+}
+
+class _Pool_P_ADDIU<bits<5> psel> : _Pool_P32<0b00000> {
+ let Inst{25-21} = psel;
+}
+
+class _Pool_P32A<bits<3> psel> : _Pool_P32<0b00100> {
+ let Inst{2-0} = psel;
+}
+
+class _Pool_P_GP_W<bits<2> psel> : _Pool_P32<0b01000> {
+ let Inst{1-0} = psel;
+}
+
+class _Pool_P_U12<bits<4> psel> : _Pool_P32<0b10000> {
+ let Inst{15-12} = psel;
+}
+
+class _Pool_P_LUI<bits<1> psel> : _Pool_P32<0b11100> {
+ let Inst{1} = psel;
+}
+
+class _Pool_P48I<bits<5> psel> : InstSize48 {
+ let Inst{47-42} = 0b011000;
+ let Inst{36-32} = psel;
+}
+
+class _Pool_P_GP_BH<bits<3> psel> : _Pool_P32<0b01001> {
+ let Inst{20-18} = psel;
+}
+
+class _Pool_P_LS_U12<bits<4> psel> : _Pool_P32<0b10001> {
+ let Inst{15-12} = psel;
+}
+
+class _Pool_P_LS_S9<bits<3> psel> : _Pool_P32<0b10101> {
+ let Inst{10-8} = psel;
+}
+
+class _Pool_P_BAL<bits<1> psel> : _Pool_P32<0b00110> {
+ let Inst{25} = psel;
+}
+
+class _Pool_P_J<bits<4> psel> : _Pool_P32<0b01010> {
+ let Inst{15-12} = psel;
+}
+
+// Covers both the P.BR1 and P.BR2 pools.
+class _Pool_P_BR12<bits<3> psel> : _Pool_P32<0b10010> {
+ let Inst{29} = psel{2};
+ let Inst{15-14} = psel{1-0};
+}
+
+class _Pool_P_BRI<bits<3> psel> : _Pool_P32<0b11010> {
+ let Inst{20-18} = psel;
+}
+
+class _Pool_P_SHIFT<bits<4> psel> : _Pool_P_U12<0b1100> {
+ bits<5> shift;
+ bits<5> rs;
+ bits<5> rt;
+
+ let Inst{25-21} = rt;
+ let Inst{20-16} = rs;
+ let Inst{8-5} = psel;
+ let Inst{4-0} = shift;
+}
+
+class _Pool_P_EXT_INS<bits<4> psel> : _Pool_P_U12<psel> {
+ let Inst{11} = 0;
+ let Inst{5} = 0;
+}
+
+class _Pool_P_LS_E0<bits<4> psel> : _Pool_P_LS_S9<0b010> {
+ let Inst{14-11} = psel;
+}
+
+class _Pool_P16<bits<5> psel> : InstSize16 {
+ let Inst{15-10} = {psel{4-2}, 0b1, psel{1-0}};
+}
+
+class _Pool_P16_MV : _Pool_P16<0b00000>;
+
+class _Pool_P16_SR<bits<1> psel> : _Pool_P16<0b00011> {
+ let Inst{8} = psel;
+}
+
+class _Pool_P16_SHIFT<bits<1> isel> : _Pool_P16<0b00100> {
+ let Inst{3} = isel;
+}
+
+class _Pool_P16_4X4<bits<2> psel> : _Pool_P16<0b00111> {
+ let Inst{8} = psel{1};
+ let Inst{3} = psel{0};
+}
+
+class _Pool_P16C<bits<1> psel> : _Pool_P16<0b01000> {
+ let Inst{0} = psel;
+}
+
+class _Pool_POOL16C_00<bits<2> psel> : _Pool_P16<0b01000> {
+ let Inst{3-2} = psel;
+ let Inst{1-0} = 0b00;
+}
+
+class _Pool_P16_LB<bits<2> psel> : _Pool_P16<0b01011> {
+ let Inst{3-2} = psel;
+}
+
+class _Pool_P16_A1<bits<1> psel> : _Pool_P16<0b01100> {
+ let Inst{6} = psel;
+}
+
+class _Pool_P16_LH<bits<2> psel> : _Pool_P16<0b01111> {
+ let Inst{3} = psel{1};
+ let Inst{0} = psel{0};
+}
+
+class _Pool_P16_A2<bits<1> psel> : _Pool_P16<0b10000> {
+ let Inst{3} = psel;
+}
+
+class _Pool_P16_ADDU<bits<1> psel> : _Pool_P16<0b10100> {
+ let Inst{0} = psel;
+}
+
+class _Pool_P16_BR<bits<4> psel> : _Pool_P16<0b11010> {
+ let Inst{3-0} = psel;
+}
+
+class _Pool_P16_RI<bits<2> psel> : _Pool_P16_MV {
+ let Inst{4-3} = psel;
+ let Inst{9-5} = 0b00000;
+}
+
+class _Pool_P_RI<bits<2> psel> : _Pool_P_ADDIU<0b00000> {
+ let Inst{20-19} = psel;
+}
+
+class _Pool_POOL32A0<bits<1> psel> : _Pool_P32A<0b000> {
+ let Inst{5} = psel;
+}
+
+class _Pool_POOL32A0_0<bits<6> psel> : _Pool_POOL32A0<0b0> {
+ let Inst{9-6} = psel{5-2};
+ let Inst{4-3} = psel{1-0};
+}
+
+class _Pool_P_TRAP<bits<1> isel> : _Pool_POOL32A0_0<0b000000> {
+ let Inst{10} = isel;
+}
+
+class _Pool_P_CMOVE<bits<1> isel> : _Pool_POOL32A0_0<0b100010> {
+ let Inst{10} = isel;
+}
+
+class _Pool_POOL32A7<bits<3> psel> : _Pool_P32A<0b111> {
+ let Inst{5-3} = psel;
+}
+
+class _Pool_POOL32Axf_4<bits<7> isel> : _Pool_POOL32A7<0b111> {
+ let Inst{15-9} = isel;
+ let Inst{8-6} = 0b100;
+}
+
+class _Pool_POOL32Axf_5<bits<2> psel> : _Pool_POOL32A7<0b111> {
+ let Inst{8-6} = 0b101;
+ let Inst{15-14} = psel;
+}
+
+class _Pool_POOL32Axf_5_group0<bits<5> isel> : _Pool_POOL32Axf_5<0b00> {
+ let Inst{13-9} = isel;
+}
+
+class _Pool_POOL32Axf_5_group1<bits<5> isel> : _Pool_POOL32Axf_5<0b01> {
+ let Inst{13-9} = isel;
+}
+
+class _Pool_POOL32Axf_5_group3<bits<5> isel> : _Pool_POOL32Axf_5<0b11> {
+ let Inst{13-9} = isel;
+}
+
+class _Pool_PP_LSX<bit scaled, bits<4> isel> : _Pool_POOL32A7<0b000> {
+ let Inst{6} = scaled;
+ let Inst{10-7} = isel;
+}
+
+class _Pool_POOL32A0_1<bits<6> psel> : _Pool_POOL32A0<0b1> {
+ let Inst{9-6} = psel{5-2};
+ let Inst{4-3} = psel{1-0};
+}
+
+class _Pool_PP_SR<bits<2> isel> : _Pool_P_U12<0b0011> {
+ let Inst{20} = 0;
+ let Inst{1-0} = isel;
+}
+
+//===----------------------------------------------------------------------===//
+// nanoMIPS Instruction Formats
+//===----------------------------------------------------------------------===//
+
+class Arith4x4_Enc<bits<2> isel> : _Pool_P16_4X4<isel> {
+ bits<5> dst;
+ bits<5> rs;
+ bits<5> rt;
----------------
nrakovic wrote:
Removed in cbd38d7.
https://github.com/llvm/llvm-project/pull/223032
More information about the llvm-commits
mailing list