//===- XtensaInstrFormats.td - Xtensa Instruction Formats --*- tablegen -*-===// // // The LLVM Compiler Infrastructure // // 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 // //===----------------------------------------------------------------------===// // Base class for Xtensa 16 & 24 bit Formats class XtensaInst pattern, InstrItinClass itin = NoItinerary> : Instruction { let Namespace = "Xtensa"; let Size = size; let OutOperandList = outs; let InOperandList = ins; let AsmString = asmstr; let Pattern = pattern; let Itinerary = itin; } // Base class for Xtensa 24 bit Format class XtensaInst24 pattern, InstrItinClass itin = NoItinerary> : XtensaInst<3, outs, ins, asmstr, pattern, itin> { field bits<24> Inst; field bits<24> SoftFail = 0; } // Base class for Xtensa 16 bit Format class XtensaInst16 pattern, InstrItinClass itin = NoItinerary> : XtensaInst<2, outs, ins, asmstr, pattern, itin> { field bits<16> Inst; field bits<16> SoftFail = 0; let Predicates = [HasDensity]; } class RRR_Inst op0, bits<4> op1, bits<4> op2, dag outs, dag ins, string asmstr, list pattern, InstrItinClass itin = NoItinerary> : XtensaInst24 { bits<4> r; bits<4> s; bits<4> t; let Inst{23-20} = op2; let Inst{19-16} = op1; let Inst{15-12} = r; let Inst{11-8} = s; let Inst{7-4} = t; let Inst{3-0} = op0; } class RRI4_Inst op0, bits<4> op1, dag outs, dag ins, string asmstr, list pattern, InstrItinClass itin = NoItinerary> : XtensaInst24 { bits<4> r; bits<4> s; bits<4> t; bits<4> imm4; let Inst{23-20} = imm4; let Inst{19-16} = op1; let Inst{15-12} = r; let Inst{11-8} = s; let Inst{7-4} = t; let Inst{3-0} = op0; } class RRI8_Inst op0, dag outs, dag ins, string asmstr, list pattern, InstrItinClass itin = NoItinerary> : XtensaInst24 { bits<4> r; bits<4> s; bits<4> t; bits<8> imm8; let Inst{23-16} = imm8; let Inst{15-12} = r; let Inst{11-8} = s; let Inst{7-4} = t; let Inst{3-0} = op0; } class RI16_Inst op0, dag outs, dag ins, string asmstr, list pattern, InstrItinClass itin = NoItinerary> : XtensaInst24 { bits<4> t; bits<16> imm16; let Inst{23-8} = imm16; let Inst{7-4} = t; let Inst{3-0} = op0; } class RSR_Inst op0, bits<4> op1, bits<4> op2, dag outs, dag ins, string asmstr, list pattern, InstrItinClass itin = NoItinerary> : XtensaInst24 { bits<8> sr; bits<4> t; let Inst{23-20} = op2; let Inst{19-16} = op1; let Inst{15-8} = sr; let Inst{7-4} = t; let Inst{3-0} = op0; } class CALL_Inst op0, dag outs, dag ins, string asmstr, list pattern, InstrItinClass itin = NoItinerary> : XtensaInst24 { bits<18> offset; bits<2> n; let Inst{23-6} = offset; let Inst{5-4} = n; let Inst{3-0} = op0; } class CALLX_Inst op0, bits<4> op1, bits<4> op2, dag outs, dag ins, string asmstr, list pattern, InstrItinClass itin = NoItinerary> : XtensaInst24 { bits<4> r; bits<4> s; bits<2> m; bits<2> n; let Inst{23-20} = op2; let Inst{19-16} = op1; let Inst{15-12} = r; let Inst{11-8} = s; let Inst{7-6} = m; let Inst{5-4} = n; let Inst{3-0} = op0; } class BRI8_Inst op0, dag outs, dag ins, string asmstr, list pattern, InstrItinClass itin = NoItinerary> : XtensaInst24 { bits<8> imm8; bits<4> r; bits<4> s; bits<2> m; bits<2> n; let Inst{23-16} = imm8; let Inst{15-12} = r; let Inst{11-8} = s; let Inst{7-6} = m; let Inst{5-4} = n; let Inst{3-0} = op0; } class BRI12_Inst op0, bits<2> n, bits<2> m, dag outs, dag ins, string asmstr, list pattern, InstrItinClass itin = NoItinerary> : XtensaInst24 { bits<12> imm12; bits<4> s; let Inst{23-12} = imm12; let Inst{11-8} = s; let Inst{7-6} = m; let Inst{5-4} = n; let Inst{3-0} = op0; } class RRRN_Inst op0, dag outs, dag ins, string asmstr, list pattern, InstrItinClass itin = NoItinerary> : XtensaInst16 { bits<4> r; bits<4> s; bits<4> t; let Inst{15-12} = r; let Inst{11-8} = s; let Inst{7-4} = t; let Inst{3-0} = op0; } class RI7_Inst op0, bits<1> i, dag outs, dag ins, string asmstr, list pattern, InstrItinClass itin = NoItinerary> : XtensaInst16 { bits<7> imm7; bits<4> s; let Inst{15-12} = imm7{3-0}; let Inst{11-8} = s; let Inst{7} = i; let Inst{6-4} = imm7{6-4}; let Inst{3-0} = op0; } class RI6_Inst op0, bits<1> i, bits<1> z, dag outs, dag ins, string asmstr, list pattern, InstrItinClass itin = NoItinerary> : XtensaInst16 { bits<6> imm6; bits<4> s; let Inst{15-12} = imm6{3-0}; let Inst{11-8} = s; let Inst{7} = i; let Inst{6} = z; let Inst{5-4} = imm6{5-4}; let Inst{3-0} = op0; } // Pseudo instructions class Pseudo pattern> : XtensaInst<2, outs, ins, asmstr, pattern> { let isPseudo = 1; let isCodeGenOnly = 1; }