blob: b4a8993c197172796081252624c76b93b27fc388 [file] [log] [blame]
//===- SystemZInstrFormats.td - SystemZ Instruction Formats ----*- tablegen -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// Format specifies the encoding used by the instruction. This is part of the
// ad-hoc solution used to emit machine instruction encodings by our machine
// code emitter.
class Format<bits<5> val> {
bits<5> Value = val;
}
def Pseudo : Format<0>;
def EForm : Format<1>;
def IForm : Format<2>;
def RIForm : Format<3>;
def RIEForm : Format<4>;
def RILForm : Format<5>;
def RISForm : Format<6>;
def RRForm : Format<7>;
def RREForm : Format<8>;
def RRFForm : Format<9>;
def RRRForm : Format<10>;
def RRSForm : Format<11>;
def RSForm : Format<12>;
def RSIForm : Format<13>;
def RSILForm : Format<14>;
def RSYForm : Format<15>;
def RXForm : Format<16>;
def RXEForm : Format<17>;
def RXFForm : Format<18>;
def RXYForm : Format<19>;
def SForm : Format<20>;
def SIForm : Format<21>;
def SILForm : Format<22>;
def SIYForm : Format<23>;
def SSForm : Format<24>;
def SSEForm : Format<25>;
def SSFForm : Format<26>;
class InstSystemZ<bits<16> op, Format f, dag outs, dag ins> : Instruction {
let Namespace = "SystemZ";
bits<16> Opcode = op;
Format Form = f;
bits<5> FormBits = Form.Value;
dag OutOperandList = outs;
dag InOperandList = ins;
}
class I8<bits<8> op, Format f, dag outs, dag ins, string asmstr,
list<dag> pattern>
: InstSystemZ<0, f, outs, ins> {
let Opcode{0-7} = op;
let Opcode{8-15} = 0;
let Pattern = pattern;
let AsmString = asmstr;
}
class I12<bits<12> op, Format f, dag outs, dag ins, string asmstr,
list<dag> pattern>
: InstSystemZ<0, f, outs, ins> {
let Opcode{0-11} = op;
let Opcode{12-15} = 0;
let Pattern = pattern;
let AsmString = asmstr;
}
class I16<bits<16> op, Format f, dag outs, dag ins, string asmstr,
list<dag> pattern>
: InstSystemZ<op, f, outs, ins> {
let Pattern = pattern;
let AsmString = asmstr;
}
class RRI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
: I8<op, RRForm, outs, ins, asmstr, pattern>;
class RII<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
: I12<op, RIForm, outs, ins, asmstr, pattern>;
class RILI<bits<12> op, dag outs, dag ins, string asmstr, list<dag> pattern>
: I12<op, RILForm, outs, ins, asmstr, pattern>;
class RREI<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
: I16<op, RREForm, outs, ins, asmstr, pattern>;
class RXI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
: I8<op, RXForm, outs, ins, asmstr, pattern> {
let AddedComplexity = 1;
}
class RXYI<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
: I16<op, RXYForm, outs, ins, asmstr, pattern>;
class RSI<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
: I8<op, RSForm, outs, ins, asmstr, pattern> {
let AddedComplexity = 1;
}
class RSYI<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
: I16<op, RSYForm, outs, ins, asmstr, pattern>;
class SII<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern>
: I8<op, SIForm, outs, ins, asmstr, pattern> {
let AddedComplexity = 1;
}
class SIYI<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
: I16<op, SIYForm, outs, ins, asmstr, pattern>;
class SILI<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
: I16<op, SILForm, outs, ins, asmstr, pattern>;
//===----------------------------------------------------------------------===//
// Pseudo instructions
//===----------------------------------------------------------------------===//
class Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern>
: InstSystemZ<0, Pseudo, outs, ins> {
let Pattern = pattern;
let AsmString = asmstr;
}