| //===- 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<int size, dag outs, dag ins, string asmstr, list<dag> 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<dag outs, dag ins, string asmstr, list<dag> 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<dag outs, dag ins, string asmstr, list<dag> 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<bits<4> op0, bits<4> op1, bits<4> op2, dag outs, dag ins, |
| string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> |
| : XtensaInst24<outs, ins, asmstr, pattern, itin> { |
| 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<bits<4> op0, bits<4> op1, dag outs, dag ins, |
| string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> |
| : XtensaInst24<outs, ins, asmstr, pattern, itin> { |
| 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<bits<4> op0, dag outs, dag ins, |
| string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> |
| : XtensaInst24<outs, ins, asmstr, pattern, itin> { |
| 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<bits<4> op0, dag outs, dag ins, |
| string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> |
| : XtensaInst24<outs, ins, asmstr, pattern, itin> { |
| bits<4> t; |
| bits<16> imm16; |
| |
| let Inst{23-8} = imm16; |
| let Inst{7-4} = t; |
| let Inst{3-0} = op0; |
| } |
| |
| class RSR_Inst<bits<4> op0, bits<4> op1, bits<4> op2, dag outs, dag ins, |
| string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> |
| : XtensaInst24<outs, ins, asmstr, pattern, itin> { |
| 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<bits<4> op0, dag outs, dag ins, |
| string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> |
| : XtensaInst24<outs, ins, asmstr, pattern, itin> { |
| bits<18> offset; |
| bits<2> n; |
| |
| let Inst{23-6} = offset; |
| let Inst{5-4} = n; |
| let Inst{3-0} = op0; |
| } |
| |
| class CALLX_Inst<bits<4> op0, bits<4> op1, bits<4> op2, dag outs, dag ins, |
| string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> |
| : XtensaInst24<outs, ins, asmstr, pattern, itin> { |
| 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<bits<4> op0, dag outs, dag ins, |
| string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> |
| : XtensaInst24<outs, ins, asmstr, pattern, itin> { |
| 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<bits<4> op0, bits<2> n, bits<2> m, dag outs, dag ins, |
| string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> |
| : XtensaInst24<outs, ins, asmstr, pattern, itin> { |
| 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<bits<4> op0, dag outs, dag ins, |
| string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> |
| : XtensaInst16<outs, ins, asmstr, pattern, itin> { |
| 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<bits<4> op0, bits<1> i, dag outs, dag ins, |
| string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> |
| : XtensaInst16<outs, ins, asmstr, pattern, itin> { |
| 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<bits<4> op0, bits<1> i, bits<1> z, dag outs, dag ins, |
| string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary> |
| : XtensaInst16<outs, ins, asmstr, pattern, itin> { |
| 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<dag outs, dag ins, string asmstr, list<dag> pattern> |
| : XtensaInst<2, outs, ins, asmstr, pattern> { |
| let isPseudo = 1; |
| let isCodeGenOnly = 1; |
| } |