| //===- 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; |
| } |