//===- ARMInstrFormats.td - ARM Instruction Formats --*- tablegen -*---------=// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // // ARM Instruction Format Definitions. // // 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 val> { bits<5> Value = val; } def Pseudo : Format<1>; def MulFrm : Format<2>; def MulSMLAW : Format<3>; def MulSMULW : Format<4>; def MulSMLA : Format<5>; def MulSMUL : Format<6>; def Branch : Format<7>; def BranchMisc : Format<8>; def DPRdIm : Format<9>; def DPRdReg : Format<10>; def DPRdSoReg : Format<11>; def DPRdMisc : Format<12>; def DPRnIm : Format<13>; def DPRnReg : Format<14>; def DPRnSoReg : Format<15>; def DPRIm : Format<16>; def DPRReg : Format<17>; def DPRSoReg : Format<18>; def DPRImS : Format<19>; def DPRRegS : Format<20>; def DPRSoRegS : Format<21>; def LdFrm : Format<22>; def StFrm : Format<23>; def ArithMisc : Format<24>; def ThumbFrm : Format<25>; def VFPFrm : Format<26>; //===----------------------------------------------------------------------===// // ARM Instruction templates. // class InstARM opcod, AddrMode am, SizeFlagVal sz, IndexMode im, Format f, string cstr> : Instruction { field bits<32> Inst; let Namespace = "ARM"; bits<4> Opcode = opcod; AddrMode AM = am; bits<4> AddrModeBits = AM.Value; SizeFlagVal SZ = sz; bits<3> SizeFlag = SZ.Value; IndexMode IM = im; bits<2> IndexModeBits = IM.Value; Format F = f; bits<5> Form = F.Value; let Constraints = cstr; } class PseudoInst pattern> : InstARM<0, AddrModeNone, SizeSpecial, IndexModeNone, Pseudo, ""> { let OutOperandList = oops; let InOperandList = iops; let AsmString = asm; let Pattern = pattern; } // Almost all ARM instructions are predicable. class I opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz, IndexMode im, Format f, string opc, string asm, string cstr, list pattern> : InstARM { let OutOperandList = oops; let InOperandList = !con(iops, (ops pred:$p)); let AsmString = !strconcat(opc, !strconcat("${p}", asm)); let Pattern = pattern; list Predicates = [IsARM]; } // Same as I except it can optionally modify CPSR. Note it's modeled as // an input operand since by default it's a zero register. It will // become an implicit def once it's "flipped". class sI opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz, IndexMode im, Format f, string opc, string asm, string cstr, list pattern> : InstARM { let OutOperandList = oops; let InOperandList = !con(iops, (ops pred:$p, cc_out:$s)); let AsmString = !strconcat(opc, !strconcat("${p}${s}", asm)); let Pattern = pattern; list Predicates = [IsARM]; } class AI opcod, dag oops, dag iops, Format f, string opc, string asm, list pattern> : I; class AsI opcod, dag oops, dag iops, Format f, string opc, string asm, list pattern> : sI; class AI1 opcod, dag oops, dag iops, Format f, string opc, string asm, list pattern> : I { let Inst{5-6} = 0; let Inst{7-10} = opcod; } class AsI1 opcod, dag oops, dag iops, Format f, string opc, string asm, list pattern> : sI { let Inst{5-6} = 0; let Inst{7-10} = opcod; } class AI2 opcod, dag oops, dag iops, Format f, string opc, string asm, list pattern> : I; class AI3 opcod, dag oops, dag iops, Format f, string opc, string asm, list pattern> : I; class AI4 opcod, dag oops, dag iops, Format f, string opc, string asm, list pattern> : I; class AI1x2 opcod, dag oops, dag iops, Format f, string opc, string asm, list pattern> : I; // Pre-indexed ops class AI2pr opcod, dag oops, dag iops, Format f, string opc, string asm, string cstr, list pattern> : I; class AI3pr opcod, dag oops, dag iops, Format f, string opc, string asm, string cstr, list pattern> : I; // Post-indexed ops class AI2po opcod, dag oops, dag iops, Format f, string opc, string asm, string cstr, list pattern> : I; class AI3po opcod, dag oops, dag iops, Format f, string opc, string asm, string cstr, list pattern> : I; // Special cases. class XI opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz, IndexMode im, Format f, string asm, string cstr, list pattern> : InstARM { let OutOperandList = oops; let InOperandList = iops; let AsmString = asm; let Pattern = pattern; list Predicates = [IsARM]; } class AXI opcod, dag oops, dag iops, Format f, string asm, list pattern> : XI; class AXI1 opcod, dag oops, dag iops, Format f, string asm, list pattern> : XI; class AXI2 opcod, dag oops, dag iops, Format f, string asm, list pattern> : XI; class AXI3 opcod, dag oops, dag iops, Format f, string asm, list pattern> : XI; class AXI4 opcod, dag oops, dag iops, Format f, string asm, list pattern> : XI; class AXIx2 opcod, dag oops, dag iops, Format f, string asm, list pattern> : XI; // BR_JT instructions class JTI opcod, dag oops, dag iops, string asm, list pattern> : XI; class JTI1 opcod, dag oops, dag iops, string asm, list pattern> : XI; class JTI2 opcod, dag oops, dag iops, string asm, list pattern> : XI; //===----------------------------------------------------------------------===// // ARMPat - Same as Pat<>, but requires that the compiler be in ARM mode. class ARMPat : Pat { list Predicates = [IsARM]; } class ARMV5TEPat : Pat { list Predicates = [IsARM, HasV5TE]; } class ARMV6Pat : Pat { list Predicates = [IsARM, HasV6]; } //===----------------------------------------------------------------------===// // // Thumb Instruction Format Definitions. // // TI - Thumb instruction. class ThumbI pattern> // FIXME: Set all opcodes to 0 for now. : InstARM<0, am, sz, IndexModeNone, ThumbFrm, cstr> { let OutOperandList = outs; let InOperandList = ins; let AsmString = asm; let Pattern = pattern; list Predicates = [IsThumb]; } class TI pattern> : ThumbI; class TI1 pattern> : ThumbI; class TI2 pattern> : ThumbI; class TI4 pattern> : ThumbI; class TIs pattern> : ThumbI; // Two-address instructions class TIt pattern> : ThumbI; // BL, BLX(1) are translated by assembler into two instructions class TIx2 pattern> : ThumbI; // BR_JT instructions class TJTI pattern> : ThumbI; //===----------------------------------------------------------------------===// // ThumbPat - Same as Pat<>, but requires that the compiler be in Thumb mode. class ThumbPat : Pat { list Predicates = [IsThumb]; } class ThumbV5Pat : Pat { list Predicates = [IsThumb, HasV5T]; }