218 lines
5.8 KiB
TableGen
218 lines
5.8 KiB
TableGen
//===- 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;
|
|
}
|