ARMInstrFormats.td revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===-- ARMInstrFormats.td - ARM Instruction Formats -------*- tablegen -*-===//
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//                     The LLVM Compiler Infrastructure
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// License. See LICENSE.TXT for details.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===//
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===//
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ARM Instruction Format Definitions.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Format specifies the encoding used by the instruction.  This is part of the
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ad-hoc solution used to emit machine instruction encodings by our machine
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// code emitter.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Format<bits<6> val> {
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<6> Value = val;
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def Pseudo        : Format<0>;
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def MulFrm        : Format<1>;
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def BrFrm         : Format<2>;
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def BrMiscFrm     : Format<3>;
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def DPFrm         : Format<4>;
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def DPSoRegRegFrm    : Format<5>;
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def LdFrm         : Format<6>;
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def StFrm         : Format<7>;
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def LdMiscFrm     : Format<8>;
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def StMiscFrm     : Format<9>;
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def LdStMulFrm    : Format<10>;
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def LdStExFrm     : Format<11>;
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def ArithMiscFrm  : Format<12>;
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def SatFrm        : Format<13>;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def ExtFrm        : Format<14>;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def VFPUnaryFrm   : Format<15>;
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def VFPBinaryFrm  : Format<16>;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def VFPConv1Frm   : Format<17>;
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def VFPConv2Frm   : Format<18>;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def VFPConv3Frm   : Format<19>;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def VFPConv4Frm   : Format<20>;
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def VFPConv5Frm   : Format<21>;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def VFPLdStFrm    : Format<22>;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def VFPLdStMulFrm : Format<23>;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def VFPMiscFrm    : Format<24>;
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def ThumbFrm      : Format<25>;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def MiscFrm       : Format<26>;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def NGetLnFrm     : Format<27>;
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def NSetLnFrm     : Format<28>;
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def NDupFrm       : Format<29>;
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def NLdStFrm      : Format<30>;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def N1RegModImmFrm: Format<31>;
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def N2RegFrm      : Format<32>;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def NVCVTFrm      : Format<33>;
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def NVDupLnFrm    : Format<34>;
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def N2RegVShLFrm  : Format<35>;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def N2RegVShRFrm  : Format<36>;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def N3RegFrm      : Format<37>;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def N3RegVShFrm   : Format<38>;
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def NVExtFrm      : Format<39>;
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def NVMulSLFrm    : Format<40>;
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def NVTBLFrm      : Format<41>;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def DPSoRegImmFrm  : Format<42>;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Misc flags.
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The instruction has an Rn register operand.
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// UnaryDP - Indicates this is a unary data processing instruction, i.e.
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// it doesn't have a Rn operand.
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class UnaryDP    { bit isUnaryDataProc = 1; }
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Xform16Bit - Indicates this Thumb2 instruction may be transformed into
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// a 16-bit Thumb instruction if certain conditions are met.
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Xform16Bit { bit canXformTo16Bit = 1; }
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===//
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ARM Instruction flags.  These need to match ARMBaseInstrInfo.h.
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: Once the JIT is MC-ized, these can go away.
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Addressing mode.
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AddrMode<bits<5> val> {
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Value = val;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrModeNone    : AddrMode<0>;
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrMode1       : AddrMode<1>;
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrMode2       : AddrMode<2>;
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrMode3       : AddrMode<3>;
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrMode4       : AddrMode<4>;
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrMode5       : AddrMode<5>;
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrMode6       : AddrMode<6>;
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrModeT1_1    : AddrMode<7>;
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrModeT1_2    : AddrMode<8>;
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrModeT1_4    : AddrMode<9>;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrModeT1_s    : AddrMode<10>;
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrModeT2_i12  : AddrMode<11>;
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrModeT2_i8   : AddrMode<12>;
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrModeT2_so   : AddrMode<13>;
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrModeT2_pc   : AddrMode<14>;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrModeT2_i8s4 : AddrMode<15>;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def AddrMode_i12    : AddrMode<16>;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Load / store index mode.
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class IndexMode<bits<2> val> {
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<2> Value = val;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def IndexModeNone : IndexMode<0>;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def IndexModePre  : IndexMode<1>;
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def IndexModePost : IndexMode<2>;
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def IndexModeUpd  : IndexMode<3>;
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Instruction execution domain.
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Domain<bits<3> val> {
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<3> Value = val;
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def GenericDomain : Domain<0>;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def VFPDomain     : Domain<1>; // Instructions in VFP domain only
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def NeonDomain    : Domain<2>; // Instructions in Neon domain only
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def VFPNeonDomain : Domain<3>; // Instructions in both VFP & Neon domains
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def VFPNeonA8Domain : Domain<5>; // Instructions in VFP & Neon under A8
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===//
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ARM special operands.
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ARM imod and iflag operands, used only by the CPS instruction.
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def imod_op : Operand<i32> {
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let PrintMethod = "printCPSIMod";
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def ProcIFlagsOperand : AsmOperandClass {
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Name = "ProcIFlags";
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMethod = "parseProcIFlagsOperand";
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def iflags_op : Operand<i32> {
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let PrintMethod = "printCPSIFlag";
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMatchClass = ProcIFlagsOperand;
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ARM Predicate operand. Default to 14 = always (AL). Second part is CC
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// register whose default is 0 (no register).
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def CondCodeOperand : AsmOperandClass { let Name = "CondCode"; }
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def pred : PredicateOperand<OtherVT, (ops i32imm, i32imm),
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     (ops (i32 14), (i32 zero_reg))> {
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let PrintMethod = "printPredicateOperand";
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMatchClass = CondCodeOperand;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderMethod = "DecodePredicateOperand";
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Selectable predicate operand for CMOV instructions. We can't use a normal
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// predicate because the default values interfere with instruction selection. In
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// all other respects it is identical though: pseudo-instruction expansion
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// relies on the MachineOperands being compatible.
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def cmovpred : Operand<i32>, PredicateOp,
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               ComplexPattern<i32, 2, "SelectCMOVPred"> {
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let MIOperandInfo = (ops i32imm, i32imm);
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let PrintMethod = "printPredicateOperand";
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Conditional code result for instructions whose 's' bit is set, e.g. subs.
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def CCOutOperand : AsmOperandClass { let Name = "CCOut"; }
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def cc_out : OptionalDefOperand<OtherVT, (ops CCR), (ops (i32 zero_reg))> {
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let EncoderMethod = "getCCOutOpValue";
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let PrintMethod = "printSBitModifierOperand";
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMatchClass = CCOutOperand;
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderMethod = "DecodeCCOutOperand";
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Same as cc_out except it defaults to setting CPSR.
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def s_cc_out : OptionalDefOperand<OtherVT, (ops CCR), (ops (i32 CPSR))> {
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let EncoderMethod = "getCCOutOpValue";
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let PrintMethod = "printSBitModifierOperand";
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMatchClass = CCOutOperand;
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderMethod = "DecodeCCOutOperand";
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ARM special operands for disassembly only.
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def SetEndAsmOperand : ImmAsmOperand {
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Name = "SetEndImm";
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMethod = "parseSetEndImm";
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def setend_op : Operand<i32> {
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let PrintMethod = "printSetendOperand";
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMatchClass = SetEndAsmOperand;
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def MSRMaskOperand : AsmOperandClass {
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Name = "MSRMask";
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMethod = "parseMSRMaskOperand";
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def msr_mask : Operand<i32> {
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let PrintMethod = "printMSRMaskOperand";
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderMethod = "DecodeMSRMask";
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMatchClass = MSRMaskOperand;
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Shift Right Immediate - A shift right immediate is encoded differently from
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// other shift immediates. The imm6 field is encoded like so:
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//    Offset    Encoding
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//     8        imm6<5:3> = '001', 8 - <imm> is encoded in imm6<2:0>
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//     16       imm6<5:4> = '01', 16 - <imm> is encoded in imm6<3:0>
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//     32       imm6<5> = '1', 32 - <imm> is encoded in imm6<4:0>
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//     64       64 - <imm> is encoded in imm6<5:0>
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def shr_imm8_asm_operand : ImmAsmOperand { let Name = "ShrImm8"; }
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def shr_imm8  : Operand<i32>, ImmLeaf<i32, [{ return Imm > 0 && Imm <= 8; }]> {
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let EncoderMethod = "getShiftRight8Imm";
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderMethod = "DecodeShiftRight8Imm";
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMatchClass = shr_imm8_asm_operand;
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def shr_imm16_asm_operand : ImmAsmOperand { let Name = "ShrImm16"; }
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def shr_imm16 : Operand<i32>, ImmLeaf<i32, [{ return Imm > 0 && Imm <= 16; }]> {
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let EncoderMethod = "getShiftRight16Imm";
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderMethod = "DecodeShiftRight16Imm";
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMatchClass = shr_imm16_asm_operand;
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def shr_imm32_asm_operand : ImmAsmOperand { let Name = "ShrImm32"; }
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def shr_imm32 : Operand<i32>, ImmLeaf<i32, [{ return Imm > 0 && Imm <= 32; }]> {
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let EncoderMethod = "getShiftRight32Imm";
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderMethod = "DecodeShiftRight32Imm";
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMatchClass = shr_imm32_asm_operand;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def shr_imm64_asm_operand : ImmAsmOperand { let Name = "ShrImm64"; }
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def shr_imm64 : Operand<i32>, ImmLeaf<i32, [{ return Imm > 0 && Imm <= 64; }]> {
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let EncoderMethod = "getShiftRight64Imm";
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderMethod = "DecodeShiftRight64Imm";
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMatchClass = shr_imm64_asm_operand;
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===//
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ARM Assembler alias templates.
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ARMInstAlias<string Asm, dag Result, bit Emit = 0b1>
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      : InstAlias<Asm, Result, Emit>, Requires<[IsARM]>;
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class  tInstAlias<string Asm, dag Result, bit Emit = 0b1>
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      : InstAlias<Asm, Result, Emit>, Requires<[IsThumb]>;
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class t2InstAlias<string Asm, dag Result, bit Emit = 0b1>
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      : InstAlias<Asm, Result, Emit>, Requires<[IsThumb2]>;
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class VFP2InstAlias<string Asm, dag Result, bit Emit = 0b1>
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      : InstAlias<Asm, Result, Emit>, Requires<[HasVFP2]>;
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class VFP2DPInstAlias<string Asm, dag Result, bit Emit = 0b1>
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      : InstAlias<Asm, Result, Emit>, Requires<[HasVFP2,HasDPVFP]>;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class VFP3InstAlias<string Asm, dag Result, bit Emit = 0b1>
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      : InstAlias<Asm, Result, Emit>, Requires<[HasVFP3]>;
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NEONInstAlias<string Asm, dag Result, bit Emit = 0b1>
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      : InstAlias<Asm, Result, Emit>, Requires<[HasNEON]>;
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class VFP2MnemonicAlias<string src, string dst> : MnemonicAlias<src, dst>,
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          Requires<[HasVFP2]>;
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NEONMnemonicAlias<string src, string dst> : MnemonicAlias<src, dst>,
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          Requires<[HasNEON]>;
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===//
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ARM Instruction templates.
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InstTemplate<AddrMode am, int sz, IndexMode im,
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                   Format f, Domain d, string cstr, InstrItinClass itin>
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Instruction {
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Namespace = "ARM";
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  AddrMode AM = am;
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  int Size = sz;
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  IndexMode IM = im;
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<2> IndexModeBits = IM.Value;
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Format F = f;
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<6> Form = F.Value;
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Domain D = d;
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bit isUnaryDataProc = 0;
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bit canXformTo16Bit = 0;
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // The instruction is a 16-bit flag setting Thumb instruction. Used
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // by the parser to determine whether to require the 'S' suffix on the
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // mnemonic (when not in an IT block) or preclude it (when in an IT block).
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bit thumbArithFlagSetting = 0;
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // If this is a pseudo instruction, mark it isCodeGenOnly.
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let isCodeGenOnly = !eq(!cast<string>(f), "Pseudo");
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // The layout of TSFlags should be kept in sync with ARMBaseInfo.h.
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let TSFlags{4-0}   = AM.Value;
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let TSFlags{6-5}   = IndexModeBits;
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let TSFlags{12-7} = Form;
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let TSFlags{13}    = isUnaryDataProc;
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let TSFlags{14}    = canXformTo16Bit;
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let TSFlags{17-15} = D.Value;
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let TSFlags{18}    = thumbArithFlagSetting;
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Constraints = cstr;
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Itinerary = itin;
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Encoding {
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  field bits<32> Inst;
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Mask of bits that cause an encoding to be UNPREDICTABLE.
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // If a bit is set, then if the corresponding bit in the
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // target encoding differs from its value in the "Inst" field,
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // the instruction is UNPREDICTABLE (SoftFail in abstract parlance).
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  field bits<32> Unpredictable = 0;
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // SoftFail is the generic name for this field, but we alias it so
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // as to make it more obvious what it means in ARM-land.
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  field bits<32> SoftFail = Unpredictable;
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InstARM<AddrMode am, int sz, IndexMode im,
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              Format f, Domain d, string cstr, InstrItinClass itin>
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstTemplate<am, sz, im, f, d, cstr, itin>, Encoding {
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderNamespace = "ARM";
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This Encoding-less class is used by Thumb1 to specify the encoding bits later
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// on by adding flavors to specific instructions.
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InstThumb<AddrMode am, int sz, IndexMode im,
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                Format f, Domain d, string cstr, InstrItinClass itin>
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstTemplate<am, sz, im, f, d, cstr, itin> {
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderNamespace = "Thumb";
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Pseudo-instructions for alternate assembly syntax (never used by codegen).
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// These are aliases that require C++ handling to convert to the target
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// instruction, while InstAliases can be handled directly by tblgen.
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AsmPseudoInst<string asm, dag iops, dag oops = (outs)>
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstTemplate<AddrModeNone, 0, IndexModeNone, Pseudo, GenericDomain,
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "", NoItinerary> {
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = iops;
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = [];
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let isCodeGenOnly = 0; // So we get asm matcher for it.
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = asm;
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let isPseudo = 1;
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ARMAsmPseudo<string asm, dag iops, dag oops = (outs)>
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AsmPseudoInst<asm, iops, oops>, Requires<[IsARM]>;
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class tAsmPseudo<string asm, dag iops, dag oops = (outs)>
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AsmPseudoInst<asm, iops, oops>, Requires<[IsThumb]>;
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class t2AsmPseudo<string asm, dag iops, dag oops = (outs)>
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AsmPseudoInst<asm, iops, oops>, Requires<[IsThumb2]>;
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class VFP2AsmPseudo<string asm, dag iops, dag oops = (outs)>
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AsmPseudoInst<asm, iops, oops>, Requires<[HasVFP2]>;
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NEONAsmPseudo<string asm, dag iops, dag oops = (outs)>
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AsmPseudoInst<asm, iops, oops>, Requires<[HasNEON]>;
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Pseudo instructions for the code generator.
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class PseudoInst<dag oops, dag iops, InstrItinClass itin, list<dag> pattern>
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstTemplate<AddrModeNone, 0, IndexModeNone, Pseudo,
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 GenericDomain, "", itin> {
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = iops;
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let isCodeGenOnly = 1;
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let isPseudo = 1;
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// PseudoInst that's ARM-mode only.
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ARMPseudoInst<dag oops, dag iops, int sz, InstrItinClass itin,
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    list<dag> pattern>
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : PseudoInst<oops, iops, itin, pattern> {
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Size = sz;
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsARM];
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// PseudoInst that's Thumb-mode only.
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class tPseudoInst<dag oops, dag iops, int sz, InstrItinClass itin,
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    list<dag> pattern>
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : PseudoInst<oops, iops, itin, pattern> {
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Size = sz;
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsThumb];
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// PseudoInst that's Thumb2-mode only.
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class t2PseudoInst<dag oops, dag iops, int sz, InstrItinClass itin,
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    list<dag> pattern>
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : PseudoInst<oops, iops, itin, pattern> {
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Size = sz;
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsThumb2];
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ARMPseudoExpand<dag oops, dag iops, int sz,
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                      InstrItinClass itin, list<dag> pattern,
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                      dag Result>
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : ARMPseudoInst<oops, iops, sz, itin, pattern>,
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PseudoInstExpansion<Result>;
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class tPseudoExpand<dag oops, dag iops, int sz,
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    InstrItinClass itin, list<dag> pattern,
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    dag Result>
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : tPseudoInst<oops, iops, sz, itin, pattern>,
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PseudoInstExpansion<Result>;
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class t2PseudoExpand<dag oops, dag iops, int sz,
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    InstrItinClass itin, list<dag> pattern,
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    dag Result>
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : t2PseudoInst<oops, iops, sz, itin, pattern>,
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PseudoInstExpansion<Result>;
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Almost all ARM instructions are predicable.
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class I<dag oops, dag iops, AddrMode am, int sz,
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IndexMode im, Format f, InstrItinClass itin,
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        string opc, string asm, string cstr,
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        list<dag> pattern>
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstARM<am, sz, im, f, GenericDomain, cstr, itin> {
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> p;
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-28} = p;
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = !con(iops, (ins pred:$p));
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = !strconcat(opc, "${p}", asm);
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsARM];
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// A few are not predicable
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InoP<dag oops, dag iops, AddrMode am, int sz,
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           IndexMode im, Format f, InstrItinClass itin,
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           string opc, string asm, string cstr,
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           list<dag> pattern>
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstARM<am, sz, im, f, GenericDomain, cstr, itin> {
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = iops;
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = !strconcat(opc, asm);
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let isPredicable = 0;
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsARM];
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Same as I except it can optionally modify CPSR. Note it's modeled as an input
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// operand since by default it's a zero register. It will become an implicit def
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// once it's "flipped".
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class sI<dag oops, dag iops, AddrMode am, int sz,
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         IndexMode im, Format f, InstrItinClass itin,
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         string opc, string asm, string cstr,
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         list<dag> pattern>
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstARM<am, sz, im, f, GenericDomain, cstr, itin> {
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> p; // Predicate operand
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<1> s; // condition-code set flag ('1' if the insn should set the flags)
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-28} = p;
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{20} = s;
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = !con(iops, (ins pred:$p, cc_out:$s));
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = !strconcat(opc, "${s}${p}", asm);
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsARM];
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Special cases
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class XI<dag oops, dag iops, AddrMode am, int sz,
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         IndexMode im, Format f, InstrItinClass itin,
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         string asm, string cstr, list<dag> pattern>
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstARM<am, sz, im, f, GenericDomain, cstr, itin> {
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = iops;
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = asm;
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsARM];
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AI<dag oops, dag iops, Format f, InstrItinClass itin,
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         string opc, string asm, list<dag> pattern>
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrModeNone, 4, IndexModeNone, f, itin,
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opc, asm, "", pattern>;
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AsI<dag oops, dag iops, Format f, InstrItinClass itin,
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          string opc, string asm, list<dag> pattern>
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : sI<oops, iops, AddrModeNone, 4, IndexModeNone, f, itin,
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       opc, asm, "", pattern>;
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AXI<dag oops, dag iops, Format f, InstrItinClass itin,
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          string asm, list<dag> pattern>
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : XI<oops, iops, AddrModeNone, 4, IndexModeNone, f, itin,
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       asm, "", pattern>;
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AXIM<dag oops, dag iops, AddrMode am, Format f, InstrItinClass itin,
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          string asm, list<dag> pattern>
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : XI<oops, iops, am, 4, IndexModeNone, f, itin,
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       asm, "", pattern>;
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AInoP<dag oops, dag iops, Format f, InstrItinClass itin,
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string opc, string asm, list<dag> pattern>
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InoP<oops, iops, AddrModeNone, 4, IndexModeNone, f, itin,
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         opc, asm, "", pattern>;
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Ctrl flow instructions
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ABI<bits<4> opcod, dag oops, dag iops, InstrItinClass itin,
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          string opc, string asm, list<dag> pattern>
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrModeNone, 4, IndexModeNone, BrFrm, itin,
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opc, asm, "", pattern> {
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-24} = opcod;
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ABXI<bits<4> opcod, dag oops, dag iops, InstrItinClass itin,
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           string asm, list<dag> pattern>
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : XI<oops, iops, AddrModeNone, 4, IndexModeNone, BrFrm, itin,
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       asm, "", pattern> {
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-24} = opcod;
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// BR_JT instructions
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class JTI<dag oops, dag iops, InstrItinClass itin,
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          string asm, list<dag> pattern>
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : XI<oops, iops, AddrModeNone, 0, IndexModeNone, BrMiscFrm, itin,
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       asm, "", pattern>;
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AIldr_ex_or_acq<bits<2> opcod, bits<2> opcod2, dag oops, dag iops, InstrItinClass itin,
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              string opc, string asm, list<dag> pattern>
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrModeNone, 4, IndexModeNone, LdStExFrm, itin,
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opc, asm, "", pattern> {
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rt;
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> addr;
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-23} = 0b00011;
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22-21} = opcod;
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{20}    = 1;
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = addr;
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Rt;
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-10} = 0b11;
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{9-8}   = opcod2;
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-0}   = 0b10011111;
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AIstr_ex_or_rel<bits<2> opcod, bits<2> opcod2, dag oops, dag iops, InstrItinClass itin,
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              string opc, string asm, list<dag> pattern>
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrModeNone, 4, IndexModeNone, LdStExFrm, itin,
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opc, asm, "", pattern> {
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rt;
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> addr;
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-23} = 0b00011;
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22-21} = opcod;
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{20}    = 0;
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = addr;
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-10} = 0b11;
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{9-8}   = opcod2;
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-4}   = 0b1001;
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Rt;
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Atomic load/store instructions
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AIldrex<bits<2> opcod, dag oops, dag iops, InstrItinClass itin,
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              string opc, string asm, list<dag> pattern>
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AIldr_ex_or_acq<opcod, 0b11, oops, iops, itin, opc, asm, pattern>;
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AIstrex<bits<2> opcod, dag oops, dag iops, InstrItinClass itin,
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              string opc, string asm, list<dag> pattern>
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AIstr_ex_or_rel<opcod, 0b11, oops, iops, itin, opc, asm, pattern> {
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rd;
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Rd;
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Exclusive load/store instructions
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AIldaex<bits<2> opcod, dag oops, dag iops, InstrItinClass itin,
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              string opc, string asm, list<dag> pattern>
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AIldr_ex_or_acq<opcod, 0b10, oops, iops, itin, opc, asm, pattern>,
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Requires<[IsARM, HasV8]>;
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AIstlex<bits<2> opcod, dag oops, dag iops, InstrItinClass itin,
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              string opc, string asm, list<dag> pattern>
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AIstr_ex_or_rel<opcod, 0b10, oops, iops, itin, opc, asm, pattern>,
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Requires<[IsARM, HasV8]> {
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rd;
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Rd;
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AIswp<bit b, dag oops, dag iops, string opc, list<dag> pattern>
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AI<oops, iops, MiscFrm, NoItinerary, opc, "\t$Rt, $Rt2, $addr", pattern> {
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rt;
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rt2;
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> addr;
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-23} = 0b00010;
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22} = b;
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = 0b00;
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = addr;
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Rt;
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-4} = 0b00001001;
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0} = Rt2;
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Unpredictable{11-8} = 0b1111;
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderMethod = "DecodeSwap";
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Acquire/Release load/store instructions
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AIldracq<bits<2> opcod, dag oops, dag iops, InstrItinClass itin,
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              string opc, string asm, list<dag> pattern>
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AIldr_ex_or_acq<opcod, 0b00, oops, iops, itin, opc, asm, pattern>,
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Requires<[IsARM, HasV8]>;
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AIstrrel<bits<2> opcod, dag oops, dag iops, InstrItinClass itin,
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              string opc, string asm, list<dag> pattern>
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AIstr_ex_or_rel<opcod, 0b00, oops, iops, itin, opc, asm, pattern>,
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Requires<[IsARM, HasV8]> {
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12}   = 0b1111;
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// addrmode1 instructions
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AI1<bits<4> opcod, dag oops, dag iops, Format f, InstrItinClass itin,
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          string opc, string asm, list<dag> pattern>
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrMode1, 4, IndexModeNone, f, itin,
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opc, asm, "", pattern> {
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24-21} = opcod;
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-26} = 0b00;
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AsI1<bits<4> opcod, dag oops, dag iops, Format f, InstrItinClass itin,
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           string opc, string asm, list<dag> pattern>
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : sI<oops, iops, AddrMode1, 4, IndexModeNone, f, itin,
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       opc, asm, "", pattern> {
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24-21} = opcod;
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-26} = 0b00;
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AXI1<bits<4> opcod, dag oops, dag iops, Format f, InstrItinClass itin,
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           string asm, list<dag> pattern>
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : XI<oops, iops, AddrMode1, 4, IndexModeNone, f, itin,
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       asm, "", pattern> {
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24-21} = opcod;
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-26} = 0b00;
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// loads
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// LDR/LDRB/STR/STRB/...
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AI2ldst<bits<3> op, bit isLd, bit isByte, dag oops, dag iops, AddrMode am,
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             Format f, InstrItinClass itin, string opc, string asm,
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             list<dag> pattern>
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, am, 4, IndexModeNone, f, itin, opc, asm,
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "", pattern> {
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-25} = op;
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24} = 1;  // 24 == P
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // 23 == U
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22} = isByte;
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21} = 0;  // 21 == W
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{20} = isLd;
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Indexed load/stores
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AI2ldstidx<bit isLd, bit isByte, bit isPre, dag oops, dag iops,
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                IndexMode im, Format f, InstrItinClass itin, string opc,
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                string asm, string cstr, list<dag> pattern>
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrMode2, 4, im, f, itin,
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opc, asm, cstr, pattern> {
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rt;
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-26} = 0b01;
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24}    = isPre; // P bit
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = isByte; // B bit
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21}    = isPre; // W bit
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{20}    = isLd; // L bit
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Rt;
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AI2stridx_reg<bit isByte, bit isPre, dag oops, dag iops,
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                IndexMode im, Format f, InstrItinClass itin, string opc,
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                string asm, string cstr, list<dag> pattern>
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AI2ldstidx<0, isByte, isPre, oops, iops, im, f, itin, opc, asm, cstr,
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               pattern> {
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // AM2 store w/ two operands: (GPR, am2offset)
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // {12}     isAdd
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // {11-0}   imm12/Rm
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<14> offset;
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rn;
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{25} = 1;
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{23} = offset{12};
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Rn;
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-5} = offset{11-5};
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4} = 0;
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0} = offset{3-0};
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AI2stridx_imm<bit isByte, bit isPre, dag oops, dag iops,
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                IndexMode im, Format f, InstrItinClass itin, string opc,
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                string asm, string cstr, list<dag> pattern>
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AI2ldstidx<0, isByte, isPre, oops, iops, im, f, itin, opc, asm, cstr,
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               pattern> {
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // AM2 store w/ two operands: (GPR, am2offset)
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // {12}     isAdd
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // {11-0}   imm12/Rm
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<14> offset;
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rn;
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{25} = 0;
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{23} = offset{12};
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Rn;
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-0} = offset{11-0};
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: Merge with the above class when addrmode2 gets used for STR, STRB
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// but for now use this class for STRT and STRBT.
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AI2stridxT<bit isByte, bit isPre, dag oops, dag iops,
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                IndexMode im, Format f, InstrItinClass itin, string opc,
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                string asm, string cstr, list<dag> pattern>
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AI2ldstidx<0, isByte, isPre, oops, iops, im, f, itin, opc, asm, cstr,
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               pattern> {
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // AM2 store w/ two operands: (GPR, am2offset)
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // {17-14}  Rn
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // {13}     1 == Rm, 0 == imm12
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // {12}     isAdd
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // {11-0}   imm12/Rm
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<18> addr;
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{25} = addr{13};
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{23} = addr{12};
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = addr{17-14};
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-0} = addr{11-0};
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// addrmode3 instructions
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AI3ld<bits<4> op, bit op20, dag oops, dag iops, Format f,
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            InstrItinClass itin, string opc, string asm, list<dag> pattern>
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrMode3, 4, IndexModeNone, f, itin,
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opc, asm, "", pattern> {
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<14> addr;
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rt;
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-25} = 0b000;
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24}    = 1;            // P bit
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{23}    = addr{8};      // U bit
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = addr{13};     // 1 == imm8, 0 == Rm
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21}    = 0;            // W bit
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{20}    = op20;         // L bit
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = addr{12-9};   // Rn
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Rt;           // Rt
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8}  = addr{7-4};    // imm7_4/zero
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-4}   = op;
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = addr{3-0};    // imm3_0/Rm
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderMethod = "DecodeAddrMode3Instruction";
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AI3ldstidx<bits<4> op, bit op20, bit isPre, dag oops, dag iops,
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                IndexMode im, Format f, InstrItinClass itin, string opc,
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                string asm, string cstr, list<dag> pattern>
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrMode3, 4, im, f, itin,
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opc, asm, cstr, pattern> {
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rt;
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-25} = 0b000;
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24}    = isPre;        // P bit
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21}    = isPre;        // W bit
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{20}    = op20;         // L bit
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Rt;           // Rt
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-4}   = op;
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: Merge with the above class when addrmode2 gets used for LDR, LDRB
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// but for now use this class for LDRSBT, LDRHT, LDSHT.
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AI3ldstidxT<bits<4> op, bit isLoad, dag oops, dag iops,
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  IndexMode im, Format f, InstrItinClass itin, string opc,
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  string asm, string cstr, list<dag> pattern>
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrMode3, 4, im, f, itin, opc, asm, cstr, pattern> {
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // {13}     1 == imm8, 0 == Rm
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // {12-9}   Rn
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // {8}      isAdd
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // {7-4}    imm7_4/zero
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // {3-0}    imm3_0/Rm
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> addr;
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rt;
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-25} = 0b000;
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24}    = 0;            // P bit
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21}    = 1;
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{20}    = isLoad;       // L bit
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = addr;         // Rn
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Rt;           // Rt
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-4}   = op;
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// stores
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AI3str<bits<4> op, dag oops, dag iops, Format f, InstrItinClass itin,
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             string opc, string asm, list<dag> pattern>
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrMode3, 4, IndexModeNone, f, itin,
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opc, asm, "", pattern> {
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<14> addr;
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rt;
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-25} = 0b000;
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24}    = 1;            // P bit
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{23}    = addr{8};      // U bit
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = addr{13};     // 1 == imm8, 0 == Rm
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21}    = 0;            // W bit
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{20}    = 0;            // L bit
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = addr{12-9};   // Rn
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Rt;           // Rt
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8}  = addr{7-4};    // imm7_4/zero
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-4}   = op;
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = addr{3-0};    // imm3_0/Rm
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderMethod = "DecodeAddrMode3Instruction";
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// addrmode4 instructions
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AXI4<dag oops, dag iops, IndexMode im, Format f, InstrItinClass itin,
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           string asm, string cstr, list<dag> pattern>
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : XI<oops, iops, AddrMode4, 4, im, f, itin, asm, cstr, pattern> {
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4>  p;
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<16> regs;
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4>  Rn;
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-28} = p;
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-25} = 0b100;
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = 0; // S bit
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Rn;
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-0}  = regs;
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Unsigned multiply, multiply-accumulate instructions.
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AMul1I<bits<7> opcod, dag oops, dag iops, InstrItinClass itin,
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             string opc, string asm, list<dag> pattern>
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrModeNone, 4, IndexModeNone, MulFrm, itin,
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opc, asm, "", pattern> {
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-4}   = 0b1001;
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{20}    = 0; // S bit
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-21} = opcod;
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AsMul1I<bits<7> opcod, dag oops, dag iops, InstrItinClass itin,
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              string opc, string asm, list<dag> pattern>
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : sI<oops, iops, AddrModeNone, 4, IndexModeNone, MulFrm, itin,
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       opc, asm, "", pattern> {
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-4}   = 0b1001;
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-21} = opcod;
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Most significant word multiply
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AMul2I<bits<7> opcod, bits<4> opc7_4, dag oops, dag iops,
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             InstrItinClass itin, string opc, string asm, list<dag> pattern>
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrModeNone, 4, IndexModeNone, MulFrm, itin,
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opc, asm, "", pattern> {
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rd;
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rn;
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rm;
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-4}   = opc7_4;
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{20}    = 1;
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-21} = opcod;
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Rd;
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8}  = Rm;
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Rn;
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// MSW multiple w/ Ra operand
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AMul2Ia<bits<7> opcod, bits<4> opc7_4, dag oops, dag iops,
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              InstrItinClass itin, string opc, string asm, list<dag> pattern>
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AMul2I<opcod, opc7_4, oops, iops, itin, opc, asm, pattern> {
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Ra;
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Ra;
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// SMUL<x><y> / SMULW<y> / SMLA<x><y> / SMLAW<x><y>
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AMulxyIbase<bits<7> opcod, bits<2> bit6_5, dag oops, dag iops,
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              InstrItinClass itin, string opc, string asm, list<dag> pattern>
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrModeNone, 4, IndexModeNone, MulFrm, itin,
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opc, asm, "", pattern> {
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rn;
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rm;
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = 0;
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7}     = 1;
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{20}    = 0;
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-21} = opcod;
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6-5}   = bit6_5;
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8}  = Rm;
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Rn;
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AMulxyI<bits<7> opcod, bits<2> bit6_5, dag oops, dag iops,
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              InstrItinClass itin, string opc, string asm, list<dag> pattern>
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AMulxyIbase<opcod, bit6_5, oops, iops, itin, opc, asm, pattern> {
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rd;
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Rd;
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// AMulxyI with Ra operand
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AMulxyIa<bits<7> opcod, bits<2> bit6_5, dag oops, dag iops,
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              InstrItinClass itin, string opc, string asm, list<dag> pattern>
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AMulxyI<opcod, bit6_5, oops, iops, itin, opc, asm, pattern> {
8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Ra;
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Ra;
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// SMLAL*
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AMulxyI64<bits<7> opcod, bits<2> bit6_5, dag oops, dag iops,
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              InstrItinClass itin, string opc, string asm, list<dag> pattern>
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AMulxyIbase<opcod, bit6_5, oops, iops, itin, opc, asm, pattern> {
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> RdLo;
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> RdHi;
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = RdHi;
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = RdLo;
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Extend instructions.
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AExtI<bits<8> opcod, dag oops, dag iops, InstrItinClass itin,
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string opc, string asm, list<dag> pattern>
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrModeNone, 4, IndexModeNone, ExtFrm, itin,
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opc, asm, "", pattern> {
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // All AExtI instructions have Rd and Rm register operands.
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rd;
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rm;
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Rd;
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Rm;
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-4}   = 0b0111;
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{9-8}   = 0b00;
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-20} = opcod;
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Unpredictable{9-8} = 0b11;
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Misc Arithmetic instructions.
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AMiscA1I<bits<8> opcod, bits<4> opc7_4, dag oops, dag iops,
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               InstrItinClass itin, string opc, string asm, list<dag> pattern>
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrModeNone, 4, IndexModeNone, ArithMiscFrm, itin,
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opc, asm, "", pattern> {
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rd;
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rm;
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-20} = opcod;
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = 0b1111;
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Rd;
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8}  = 0b1111;
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-4}   = opc7_4;
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Rm;
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Division instructions.
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ADivA1I<bits<3> opcod, dag oops, dag iops,
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              InstrItinClass itin, string opc, string asm, list<dag> pattern>
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrModeNone, 4, IndexModeNone, ArithMiscFrm, itin,
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opc, asm, "", pattern> {
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rd;
9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rn;
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rm;
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-23} = 0b01110;
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22-20} = opcod;
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Rd;
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = 0b1111;
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8}  = Rm;
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-4}   = 0b0001;
9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Rn;
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// PKH instructions
9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def PKHLSLAsmOperand : ImmAsmOperand {
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Name = "PKHLSLImm";
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMethod = "parsePKHLSLImm";
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def pkh_lsl_amt: Operand<i32>, ImmLeaf<i32, [{ return Imm >= 0 && Imm < 32; }]>{
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let PrintMethod = "printPKHLSLShiftImm";
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMatchClass = PKHLSLAsmOperand;
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def PKHASRAsmOperand : AsmOperandClass {
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Name = "PKHASRImm";
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMethod = "parsePKHASRImm";
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def pkh_asr_amt: Operand<i32>, ImmLeaf<i32, [{ return Imm > 0 && Imm <= 32; }]>{
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let PrintMethod = "printPKHASRShiftImm";
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let ParserMatchClass = PKHASRAsmOperand;
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class APKHI<bits<8> opcod, bit tb, dag oops, dag iops, InstrItinClass itin,
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string opc, string asm, list<dag> pattern>
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : I<oops, iops, AddrModeNone, 4, IndexModeNone, ArithMiscFrm, itin,
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opc, asm, "", pattern> {
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rd;
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rn;
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rm;
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> sh;
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-20} = opcod;
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Rn;
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Rd;
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-7}  = sh;
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6}     = tb;
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5-4}   = 0b01;
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Rm;
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===//
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ARMPat - Same as Pat<>, but requires that the compiler be in ARM mode.
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ARMPat<dag pattern, dag result> : Pat<pattern, result> {
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsARM];
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ARMV5TPat<dag pattern, dag result> : Pat<pattern, result> {
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsARM, HasV5T];
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ARMV5TEPat<dag pattern, dag result> : Pat<pattern, result> {
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsARM, HasV5TE];
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ARMV5MOPat - Same as ARMV5TEPat with UseMulOps.
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ARMV5MOPat<dag pattern, dag result> : Pat<pattern, result> {
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsARM, HasV5TE, UseMulOps];
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ARMV6Pat<dag pattern, dag result> : Pat<pattern, result> {
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsARM, HasV6];
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===//
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Thumb Instruction Format Definitions.
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ThumbI<dag oops, dag iops, AddrMode am, int sz,
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             InstrItinClass itin, string asm, string cstr, list<dag> pattern>
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstThumb<am, sz, IndexModeNone, ThumbFrm, GenericDomain, cstr, itin> {
9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = iops;
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = asm;
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsThumb];
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// TI - Thumb instruction.
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class TI<dag oops, dag iops, InstrItinClass itin, string asm, list<dag> pattern>
9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : ThumbI<oops, iops, AddrModeNone, 2, itin, asm, "", pattern>;
9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Two-address instructions
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class TIt<dag oops, dag iops, InstrItinClass itin, string asm,
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          list<dag> pattern>
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : ThumbI<oops, iops, AddrModeNone, 2, itin, asm, "$lhs = $dst",
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           pattern>;
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// tBL, tBX 32-bit instructions
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class TIx2<bits<5> opcod1, bits<2> opcod2, bit opcod3,
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           dag oops, dag iops, InstrItinClass itin, string asm,
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           list<dag> pattern>
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : ThumbI<oops, iops, AddrModeNone, 4, itin, asm, "", pattern>,
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Encoding {
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-27} = opcod1;
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-14} = opcod2;
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{12}    = opcod3;
10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// BR_JT instructions
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class TJTI<dag oops, dag iops, InstrItinClass itin, string asm,
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           list<dag> pattern>
10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : ThumbI<oops, iops, AddrModeNone, 0, itin, asm, "", pattern>;
10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Thumb1 only
10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Thumb1I<dag oops, dag iops, AddrMode am, int sz,
10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              InstrItinClass itin, string asm, string cstr, list<dag> pattern>
10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstThumb<am, sz, IndexModeNone, ThumbFrm, GenericDomain, cstr, itin> {
10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = iops;
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = asm;
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsThumb, IsThumb1Only];
10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1I<dag oops, dag iops, InstrItinClass itin,
10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          string asm, list<dag> pattern>
10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb1I<oops, iops, AddrModeNone, 2, itin, asm, "", pattern>;
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1Ix2<dag oops, dag iops, InstrItinClass itin,
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string asm, list<dag> pattern>
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb1I<oops, iops, AddrModeNone, 4, itin, asm, "", pattern>;
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Two-address instructions
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1It<dag oops, dag iops, InstrItinClass itin,
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           string asm, string cstr, list<dag> pattern>
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb1I<oops, iops, AddrModeNone, 2, itin,
10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            asm, cstr, pattern>;
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Thumb1 instruction that can either be predicated or set CPSR.
10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Thumb1sI<dag oops, dag iops, AddrMode am, int sz,
10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               InstrItinClass itin,
10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               string opc, string asm, string cstr, list<dag> pattern>
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstThumb<am, sz, IndexModeNone, ThumbFrm, GenericDomain, cstr, itin> {
10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = !con(oops, (outs s_cc_out:$s));
10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = !con(iops, (ins pred:$p));
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = !strconcat(opc, "${s}${p}", asm);
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let thumbArithFlagSetting = 1;
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsThumb, IsThumb1Only];
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderNamespace = "ThumbSBit";
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1sI<dag oops, dag iops, InstrItinClass itin,
10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           string opc, string asm, list<dag> pattern>
10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb1sI<oops, iops, AddrModeNone, 2, itin, opc, asm, "", pattern>;
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Two-address instructions
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1sIt<dag oops, dag iops, InstrItinClass itin,
10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string opc, string asm, list<dag> pattern>
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb1sI<oops, iops, AddrModeNone, 2, itin, opc, asm,
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             "$Rn = $Rdn", pattern>;
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Thumb1 instruction that can be predicated.
10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Thumb1pI<dag oops, dag iops, AddrMode am, int sz,
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               InstrItinClass itin,
10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               string opc, string asm, string cstr, list<dag> pattern>
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstThumb<am, sz, IndexModeNone, ThumbFrm, GenericDomain, cstr, itin> {
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = !con(iops, (ins pred:$p));
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = !strconcat(opc, "${p}", asm);
10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsThumb, IsThumb1Only];
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1pI<dag oops, dag iops, InstrItinClass itin,
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           string opc, string asm, list<dag> pattern>
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb1pI<oops, iops, AddrModeNone, 2, itin, opc, asm, "", pattern>;
10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Two-address instructions
10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1pIt<dag oops, dag iops, InstrItinClass itin,
10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string opc, string asm, list<dag> pattern>
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb1pI<oops, iops, AddrModeNone, 2, itin, opc, asm,
10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             "$Rn = $Rdn", pattern>;
10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1pIs<dag oops, dag iops,
10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            InstrItinClass itin, string opc, string asm, list<dag> pattern>
10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb1pI<oops, iops, AddrModeT1_s, 2, itin, opc, asm, "", pattern>;
10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Encoding16 : Encoding {
10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-16} = 0x0000;
10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// A6.2 16-bit Thumb instruction encoding
10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1Encoding<bits<6> opcode> : Encoding16 {
10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-10} = opcode;
10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// A6.2.1 Shift (immediate), add, subtract, move, and compare encoding.
11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1General<bits<5> opcode> : Encoding16 {
11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-14} = 0b00;
11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{13-9} = opcode;
11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// A6.2.2 Data-processing encoding.
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1DataProcessing<bits<4> opcode> : Encoding16 {
11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-10} = 0b010000;
11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{9-6} = opcode;
11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// A6.2.3 Special data instructions and branch and exchange encoding.
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1Special<bits<4> opcode> : Encoding16 {
11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-10} = 0b010001;
11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{9-6}   = opcode;
11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// A6.2.4 Load/store single data item encoding.
11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1LoadStore<bits<4> opA, bits<3> opB> : Encoding16 {
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = opA;
11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-9}  = opB;
11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1LdStSP<bits<3> opB>   : T1LoadStore<0b1001, opB>; // SP relative
11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1BranchCond<bits<4> opcode> : Encoding16 {
11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = opcode;
11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Helper classes to encode Thumb1 loads and stores. For immediates, the
11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// following bits are used for "opA" (see A6.2.4):
11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//   0b0110 => Immediate, 4 bytes
11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//   0b1000 => Immediate, 2 bytes
11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//   0b0111 => Immediate, 1 byte
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1pILdStEncode<bits<3> opcode, dag oops, dag iops, AddrMode am,
11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     InstrItinClass itin, string opc, string asm,
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     list<dag> pattern>
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb1pI<oops, iops, am, 2, itin, opc, asm, "", pattern>,
11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    T1LoadStore<0b0101, opcode> {
11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<3> Rt;
11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<8> addr;
11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{8-6} = addr{5-3};    // Rm
11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5-3} = addr{2-0};    // Rn
11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{2-0} = Rt;
11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1pILdStEncodeImm<bits<4> opA, bit opB, dag oops, dag iops, AddrMode am,
11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        InstrItinClass itin, string opc, string asm,
11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        list<dag> pattern>
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb1pI<oops, iops, am, 2, itin, opc, asm, "", pattern>,
11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    T1LoadStore<opA, {opB,?,?}> {
11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<3> Rt;
11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<8> addr;
11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{10-6} = addr{7-3};   // imm5
11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5-3}  = addr{2-0};   // Rn
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{2-0}  = Rt;
11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// A6.2.5 Miscellaneous 16-bit instructions encoding.
11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T1Misc<bits<7> opcode> : Encoding16 {
11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = 0b1011;
11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-5} = opcode;
11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Thumb2I - Thumb2 instruction. Almost all Thumb2 instructions are predicable.
11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Thumb2I<dag oops, dag iops, AddrMode am, int sz,
11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              InstrItinClass itin,
11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              string opc, string asm, string cstr, list<dag> pattern>
11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstARM<am, sz, IndexModeNone, ThumbFrm, GenericDomain, cstr, itin> {
11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = !con(iops, (ins pred:$p));
11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = !strconcat(opc, "${p}", asm);
11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsThumb2];
11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderNamespace = "Thumb2";
11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Same as Thumb2I except it can optionally modify CPSR. Note it's modeled as an
11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// input operand since by default it's a zero register. It will become an
11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// implicit def once it's "flipped".
11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: This uses unified syntax so {s} comes before {p}. We should make it
11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// more consistent.
11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Thumb2sI<dag oops, dag iops, AddrMode am, int sz,
11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               InstrItinClass itin,
11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               string opc, string asm, string cstr, list<dag> pattern>
11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstARM<am, sz, IndexModeNone, ThumbFrm, GenericDomain, cstr, itin> {
11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<1> s; // condition-code set flag ('1' if the insn should set the flags)
11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{20} = s;
11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = !con(iops, (ins pred:$p, cc_out:$s));
11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = !strconcat(opc, "${s}${p}", asm);
11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsThumb2];
11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderNamespace = "Thumb2";
11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Special cases
11995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Thumb2XI<dag oops, dag iops, AddrMode am, int sz,
12005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               InstrItinClass itin,
12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               string asm, string cstr, list<dag> pattern>
12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstARM<am, sz, IndexModeNone, ThumbFrm, GenericDomain, cstr, itin> {
12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = iops;
12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = asm;
12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsThumb2];
12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderNamespace = "Thumb2";
12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ThumbXI<dag oops, dag iops, AddrMode am, int sz,
12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              InstrItinClass itin,
12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              string asm, string cstr, list<dag> pattern>
12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstARM<am, sz, IndexModeNone, ThumbFrm, GenericDomain, cstr, itin> {
12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = iops;
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = asm;
12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [IsThumb, IsThumb1Only];
12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderNamespace = "Thumb";
12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T2I<dag oops, dag iops, InstrItinClass itin,
12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          string opc, string asm, list<dag> pattern>
12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb2I<oops, iops, AddrModeNone, 4, itin, opc, asm, "", pattern>;
12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T2Ii12<dag oops, dag iops, InstrItinClass itin,
12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             string opc, string asm, list<dag> pattern>
12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb2I<oops, iops, AddrModeT2_i12, 4, itin, opc, asm, "",pattern>;
12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T2Ii8<dag oops, dag iops, InstrItinClass itin,
12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string opc, string asm, list<dag> pattern>
12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb2I<oops, iops, AddrModeT2_i8, 4, itin, opc, asm, "", pattern>;
12325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T2Iso<dag oops, dag iops, InstrItinClass itin,
12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string opc, string asm, list<dag> pattern>
12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb2I<oops, iops, AddrModeT2_so, 4, itin, opc, asm, "", pattern>;
12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T2Ipc<dag oops, dag iops, InstrItinClass itin,
12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string opc, string asm, list<dag> pattern>
12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb2I<oops, iops, AddrModeT2_pc, 4, itin, opc, asm, "", pattern>;
12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T2Ii8s4<bit P, bit W, bit isLoad, dag oops, dag iops, InstrItinClass itin,
12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              string opc, string asm, string cstr, list<dag> pattern>
12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb2I<oops, iops, AddrModeT2_i8s4, 4, itin, opc, asm, cstr,
12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            pattern> {
12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rt;
12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rt2;
12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<13> addr;
12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-25} = 0b1110100;
12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24}    = P;
12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{23}    = addr{8};
12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = 1;
12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21}    = W;
12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{20}    = isLoad;
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = addr{12-9};
12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Rt{3-0};
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8}  = Rt2{3-0};
12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-0}   = addr{7-0};
12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class T2Ii8s4post<bit P, bit W, bit isLoad, dag oops, dag iops,
12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  InstrItinClass itin, string opc, string asm, string cstr,
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  list<dag> pattern>
12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : Thumb2I<oops, iops, AddrModeT2_i8s4, 4, itin, opc, asm, cstr,
12605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            pattern> {
12615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rt;
12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rt2;
12635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> addr;
12645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<9> imm;
12655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-25} = 0b1110100;
12665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24}    = P;
12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{23}    = imm{8};
12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = 1;
126907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{21}    = W;
127007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{20}    = isLoad;
127107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{19-16} = addr;
127207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{15-12} = Rt{3-0};
127307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{11-8}  = Rt2{3-0};
127407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{7-0}   = imm{7-0};
127507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
127607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
127707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass T2sI<dag oops, dag iops, InstrItinClass itin,
127807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch           string opc, string asm, list<dag> pattern>
127907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  : Thumb2sI<oops, iops, AddrModeNone, 4, itin, opc, asm, "", pattern>;
128007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
128107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass T2XI<dag oops, dag iops, InstrItinClass itin,
128207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch           string asm, list<dag> pattern>
128307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  : Thumb2XI<oops, iops, AddrModeNone, 4, itin, asm, "", pattern>;
128407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass T2JTI<dag oops, dag iops, InstrItinClass itin,
128507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            string asm, list<dag> pattern>
128607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  : Thumb2XI<oops, iops, AddrModeNone, 0, itin, asm, "", pattern>;
128707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
128807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// Move to/from coprocessor instructions
128907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass T2Cop<bits<4> opc, dag oops, dag iops, string opcstr, string asm,
129007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            list<dag> pattern>
129107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  : T2I <oops, iops, NoItinerary, opcstr, asm, pattern>, Requires<[IsThumb2]> {
129207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{31-28} = opc;
129307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
129407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
129507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// Two-address instructions
129607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass T2XIt<dag oops, dag iops, InstrItinClass itin,
129707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            string asm, string cstr, list<dag> pattern>
129807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  : Thumb2XI<oops, iops, AddrModeNone, 4, itin, asm, cstr, pattern>;
129907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
130007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// T2Ipreldst - Thumb2 pre-indexed load / store instructions.
130107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass T2Ipreldst<bit signed, bits<2> opcod, bit load, bit pre,
130207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                 dag oops, dag iops,
130307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                 AddrMode am, IndexMode im, InstrItinClass itin,
130407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                 string opc, string asm, string cstr, list<dag> pattern>
130507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  : InstARM<am, 4, im, ThumbFrm, GenericDomain, cstr, itin> {
130607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let OutOperandList = oops;
130707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let InOperandList = !con(iops, (ins pred:$p));
130807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let AsmString = !strconcat(opc, "${p}", asm);
130907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Pattern = pattern;
131007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  list<Predicate> Predicates = [IsThumb2];
131107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let DecoderNamespace = "Thumb2";
131207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
131307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bits<4> Rt;
131407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bits<13> addr;
131507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{31-27} = 0b11111;
131607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{26-25} = 0b00;
131707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{24}    = signed;
131807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{23}    = 0;
131907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{22-21} = opcod;
132007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{20}    = load;
132107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{19-16} = addr{12-9};
132207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{15-12} = Rt{3-0};
132307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{11}    = 1;
132407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  // (P, W) = (1, 1) Pre-indexed or (0, 1) Post-indexed
132507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{10}    = pre; // The P bit.
132607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{9}     = addr{8}; // Sign bit
132707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{8}     = 1; // The W bit.
132807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{7-0}   = addr{7-0};
132907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
133007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let DecoderMethod = "DecodeT2LdStPre";
133107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
133207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
133307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// T2Ipostldst - Thumb2 post-indexed load / store instructions.
133407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass T2Ipostldst<bit signed, bits<2> opcod, bit load, bit pre,
133507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                 dag oops, dag iops,
133607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                 AddrMode am, IndexMode im, InstrItinClass itin,
133707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                 string opc, string asm, string cstr, list<dag> pattern>
133807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  : InstARM<am, 4, im, ThumbFrm, GenericDomain, cstr, itin> {
133907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let OutOperandList = oops;
134007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let InOperandList = !con(iops, (ins pred:$p));
134107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let AsmString = !strconcat(opc, "${p}", asm);
134207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Pattern = pattern;
134307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  list<Predicate> Predicates = [IsThumb2];
134407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let DecoderNamespace = "Thumb2";
134507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
134607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bits<4> Rt;
134707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bits<4> Rn;
134807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bits<9> offset;
134907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{31-27} = 0b11111;
135007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{26-25} = 0b00;
135107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{24}    = signed;
135207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{23}    = 0;
135307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{22-21} = opcod;
135407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{20}    = load;
135507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{19-16} = Rn;
135607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{15-12} = Rt{3-0};
135707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{11}    = 1;
135807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  // (P, W) = (1, 1) Pre-indexed or (0, 1) Post-indexed
135907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{10}    = pre; // The P bit.
136007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{9}     = offset{8}; // Sign bit
136107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{8}     = 1; // The W bit.
136207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{7-0}   = offset{7-0};
136307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
136407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let DecoderMethod = "DecodeT2LdStPre";
136507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
136607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
136707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// Tv5Pat - Same as Pat<>, but requires V5T Thumb mode.
136807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass Tv5Pat<dag pattern, dag result> : Pat<pattern, result> {
136907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  list<Predicate> Predicates = [IsThumb, IsThumb1Only, HasV5T];
137007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
137107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
137207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// T1Pat - Same as Pat<>, but requires that the compiler be in Thumb1 mode.
137307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass T1Pat<dag pattern, dag result> : Pat<pattern, result> {
137407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  list<Predicate> Predicates = [IsThumb, IsThumb1Only];
137507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
137607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
137707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// T2v6Pat - Same as Pat<>, but requires V6T2 Thumb2 mode.
137807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass T2v6Pat<dag pattern, dag result> : Pat<pattern, result> {
137907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  list<Predicate> Predicates = [IsThumb2, HasV6T2];
138007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
138107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
138207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// T2Pat - Same as Pat<>, but requires that the compiler be in Thumb2 mode.
138307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass T2Pat<dag pattern, dag result> : Pat<pattern, result> {
138407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  list<Predicate> Predicates = [IsThumb2];
138507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
138607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
138707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch//===----------------------------------------------------------------------===//
138807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
138907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch//===----------------------------------------------------------------------===//
139007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// ARM VFP Instruction templates.
139107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch//
139207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
139307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// Almost all VFP instructions are predicable.
139407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass VFPI<dag oops, dag iops, AddrMode am, int sz,
139507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch           IndexMode im, Format f, InstrItinClass itin,
139607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch           string opc, string asm, string cstr, list<dag> pattern>
139707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  : InstARM<am, sz, im, f, VFPDomain, cstr, itin> {
139807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  bits<4> p;
139907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Inst{31-28} = p;
140007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let OutOperandList = oops;
140107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let InOperandList = !con(iops, (ins pred:$p));
140207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let AsmString = !strconcat(opc, "${p}", asm);
140307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let Pattern = pattern;
140407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let PostEncoderMethod = "VFPThumb2PostEncoder";
140507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  let DecoderNamespace = "VFP";
140607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch  list<Predicate> Predicates = [HasVFP2];
140707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
140807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
140907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// Special cases
141007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass VFPXI<dag oops, dag iops, AddrMode am, int sz,
141107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            IndexMode im, Format f, InstrItinClass itin,
141207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            string asm, string cstr, list<dag> pattern>
14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstARM<am, sz, im, f, VFPDomain, cstr, itin> {
14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> p;
14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-28} = p;
14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = iops;
14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = asm;
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let PostEncoderMethod = "VFPThumb2PostEncoder";
14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderNamespace = "VFP";
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [HasVFP2];
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class VFPAI<dag oops, dag iops, Format f, InstrItinClass itin,
14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string opc, string asm, list<dag> pattern>
14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : VFPI<oops, iops, AddrModeNone, 4, IndexModeNone, f, itin,
14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         opc, asm, "", pattern> {
14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let PostEncoderMethod = "VFPThumb2PostEncoder";
14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ARM VFP addrmode5 loads and stores
14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ADI5<bits<4> opcod1, bits<2> opcod2, dag oops, dag iops,
14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           InstrItinClass itin,
14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           string opc, string asm, list<dag> pattern>
14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : VFPI<oops, iops, AddrMode5, 4, IndexModeNone,
14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         VFPLdStFrm, itin, opc, asm, "", pattern> {
14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5>  Dd;
14405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<13> addr;
14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode instruction operands.
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{23}    = addr{8};      // U (add = (U == '1'))
14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Dd{4};
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = addr{12-9};   // Rn
14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Dd{3-0};
14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-0}   = addr{7-0};    // imm8
14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-24} = opcod1;
14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = opcod2;
14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-9}  = 0b101;
14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{8}     = 1;          // Double precision
14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Loads & stores operate on both NEON and VFP pipelines.
14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let D = VFPNeonDomain;
14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ASI5<bits<4> opcod1, bits<2> opcod2, dag oops, dag iops,
14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           InstrItinClass itin,
14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           string opc, string asm, list<dag> pattern>
14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : VFPI<oops, iops, AddrMode5, 4, IndexModeNone,
14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         VFPLdStFrm, itin, opc, asm, "", pattern> {
14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5>  Sd;
14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<13> addr;
14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode instruction operands.
14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{23}    = addr{8};      // U (add = (U == '1'))
14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Sd{0};
14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = addr{12-9};   // Rn
14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Sd{4-1};
14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-0}   = addr{7-0};    // imm8
14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-24} = opcod1;
14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = opcod2;
14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-9}  = 0b101;
14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{8}     = 0;          // Single precision
14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Loads & stores operate on both NEON and VFP pipelines.
14805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let D = VFPNeonDomain;
14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// VFP Load / store multiple pseudo instructions.
14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class PseudoVFPLdStM<dag oops, dag iops, InstrItinClass itin, string cstr,
14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     list<dag> pattern>
14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstARM<AddrMode4, 4, IndexModeNone, Pseudo, VFPNeonDomain,
14875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            cstr, itin> {
14885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = !con(iops, (ins pred:$p));
14905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
14915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [HasVFP2];
14925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Load / store multiple
14955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Unknown precision
14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AXXI4<dag oops, dag iops, IndexMode im,
14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string asm, string cstr, list<dag> pattern>
14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : VFPXI<oops, iops, AddrMode4, 4, im,
15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          VFPLdStFrm, NoItinerary, asm, cstr, pattern> {
15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4>  Rn;
15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<13> regs;
15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode instruction operands.
15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Rn;
15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = 0;
15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = regs{11-8};
15095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-1}   = regs{7-1};
15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-25} = 0b110;
15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8}  = 0b1011;
15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{0}     = 1;
15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Double precision
15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AXDI4<dag oops, dag iops, IndexMode im, InstrItinClass itin,
15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string asm, string cstr, list<dag> pattern>
15195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : VFPXI<oops, iops, AddrMode4, 4, im,
15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          VFPLdStMulFrm, itin, asm, cstr, pattern> {
15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4>  Rn;
15235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<13> regs;
15245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode instruction operands.
15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Rn;
15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = regs{12};
15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = regs{11-8};
15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-1}   = regs{7-1};
15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-25} = 0b110;
15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-9}  = 0b101;
15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{8}     = 1;          // Double precision
15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{0}     = 0;
15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Single Precision
15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AXSI4<dag oops, dag iops, IndexMode im, InstrItinClass itin,
15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string asm, string cstr, list<dag> pattern>
15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : VFPXI<oops, iops, AddrMode4, 4, im,
15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          VFPLdStMulFrm, itin, asm, cstr, pattern> {
15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rn;
15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<13> regs;
15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode instruction operands.
15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Rn;
15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = regs{8};
15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = regs{12-9};
15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-0}   = regs{7-0};
15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-25} = 0b110;
15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-9}  = 0b101;
15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{8}     = 0;          // Single precision
15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Double precision, unary
15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ADuI<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3, bits<2> opcod4,
15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           bit opcod5, dag oops, dag iops, InstrItinClass itin, string opc,
15605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           string asm, list<dag> pattern>
15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : VFPAI<oops, iops, VFPUnaryFrm, itin, opc, asm, pattern> {
15625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Dd;
15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Dm;
15655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode instruction operands.
15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Dm{3-0};
15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = Dm{4};
15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Dd{3-0};
15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Dd{4};
15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-23} = opcod1;
15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = opcod2;
15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = opcod3;
15755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-9}  = 0b101;
15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{8}     = 1;          // Double precision
15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-6}   = opcod4;
15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = opcod5;
15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Predicates = [HasVFP2, HasDPVFP];
15815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Double precision, unary, not-predicated
15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ADuInp<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3, bits<2> opcod4,
15855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           bit opcod5, dag oops, dag iops, InstrItinClass itin,
15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           string asm, list<dag> pattern>
15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : VFPXI<oops, iops, AddrModeNone, 4, IndexModeNone, VFPUnaryFrm, itin, asm, "", pattern> {
15885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Dd;
15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Dm;
15915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-28} = 0b1111;
15935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode instruction operands.
15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Dm{3-0};
15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = Dm{4};
15975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Dd{3-0};
15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Dd{4};
15995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-23} = opcod1;
16015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = opcod2;
16025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = opcod3;
16035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-9}  = 0b101;
16045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{8}     = 1;          // Double precision
16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-6}   = opcod4;
16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = opcod5;
16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Double precision, binary
16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ADbI<bits<5> opcod1, bits<2> opcod2, bit op6, bit op4, dag oops,
16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           dag iops, InstrItinClass itin, string opc, string asm,
16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           list<dag> pattern>
16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : VFPAI<oops, iops, VFPBinaryFrm, itin, opc, asm, pattern> {
16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Dd;
16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Dn;
16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Dm;
16185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode instruction operands.
16205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Dm{3-0};
16215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = Dm{4};
16225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Dn{3-0};
16235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7}     = Dn{4};
16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Dd{3-0};
16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Dd{4};
16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-23} = opcod1;
16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = opcod2;
16295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-9}  = 0b101;
16305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{8}     = 1;          // Double precision
16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6}     = op6;
16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = op4;
16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Predicates = [HasVFP2, HasDPVFP];
16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FP, binary, not predicated
16385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ADbInp<bits<5> opcod1, bits<2> opcod2, bit opcod3, dag oops, dag iops,
16395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           InstrItinClass itin, string asm, list<dag> pattern>
16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : VFPXI<oops, iops, AddrModeNone, 4, IndexModeNone, VFPBinaryFrm, itin,
16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          asm, "", pattern>
16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
16445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Dd;
16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Dn;
16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Dm;
16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-28} = 0b1111;
16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode instruction operands.
16515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Dm{3-0};
16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = Dm{4};
16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Dn{3-0};
16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7}     = Dn{4};
16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Dd{3-0};
16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Dd{4};
16575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-23} = opcod1;
16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = opcod2;
16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-9}  = 0b101;
16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{8}     = 1; // double precision
16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6}     = opcod3;
16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = 0;
16645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Predicates = [HasVFP2, HasDPVFP];
16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Single precision, unary, predicated
16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ASuI<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3, bits<2> opcod4,
16705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           bit opcod5, dag oops, dag iops, InstrItinClass itin, string opc,
16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           string asm, list<dag> pattern>
16725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : VFPAI<oops, iops, VFPUnaryFrm, itin, opc, asm, pattern> {
16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Sd;
16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Sm;
16765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode instruction operands.
16785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Sm{4-1};
16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = Sm{0};
16805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Sd{4-1};
16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Sd{0};
16825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-23} = opcod1;
16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = opcod2;
16855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = opcod3;
16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-9}  = 0b101;
16875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{8}     = 0;          // Single precision
16885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-6}   = opcod4;
16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = opcod5;
16905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Single precision, unary, non-predicated
16935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ASuInp<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3, bits<2> opcod4,
16945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             bit opcod5, dag oops, dag iops, InstrItinClass itin,
16955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             string asm, list<dag> pattern>
16965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : VFPXI<oops, iops, AddrModeNone, 4, IndexModeNone,
16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          VFPUnaryFrm, itin, asm, "", pattern> {
16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Sd;
17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Sm;
17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-28} = 0b1111;
17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode instruction operands.
17055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Sm{4-1};
17065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = Sm{0};
17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Sd{4-1};
17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Sd{0};
17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-23} = opcod1;
17115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = opcod2;
17125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = opcod3;
17135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-9}  = 0b101;
17145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{8}     = 0;          // Single precision
17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-6}   = opcod4;
17165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = opcod5;
17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Single precision unary, if no NEON. Same as ASuI except not available if
17205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// NEON is enabled.
17215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ASuIn<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3, bits<2> opcod4,
17225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            bit opcod5, dag oops, dag iops, InstrItinClass itin, string opc,
17235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string asm, list<dag> pattern>
17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : ASuI<opcod1, opcod2, opcod3, opcod4, opcod5, oops, iops, itin, opc, asm,
17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         pattern> {
17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [HasVFP2,DontUseNEONForFP];
17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Single precision, binary
17305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ASbI<bits<5> opcod1, bits<2> opcod2, bit op6, bit op4, dag oops, dag iops,
17315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           InstrItinClass itin, string opc, string asm, list<dag> pattern>
17325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : VFPAI<oops, iops, VFPBinaryFrm, itin, opc, asm, pattern> {
17335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
17345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Sd;
17355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Sn;
17365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Sm;
17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode instruction operands.
17395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Sm{4-1};
17405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = Sm{0};
17415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Sn{4-1};
17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7}     = Sn{0};
17435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Sd{4-1};
17445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Sd{0};
17455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-23} = opcod1;
17475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = opcod2;
17485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-9}  = 0b101;
17495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{8}     = 0;          // Single precision
17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6}     = op6;
17515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = op4;
17525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Single precision, binary, not predicated
17555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ASbInp<bits<5> opcod1, bits<2> opcod2, bit opcod3, dag oops, dag iops,
17565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           InstrItinClass itin, string asm, list<dag> pattern>
17575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : VFPXI<oops, iops, AddrModeNone, 4, IndexModeNone,
17585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          VFPBinaryFrm, itin, asm, "", pattern>
17595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
17615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Sd;
17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Sn;
17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Sm;
17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-28} = 0b1111;
17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode instruction operands.
17685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Sm{4-1};
17695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = Sm{0};
17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Sn{4-1};
17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7}     = Sn{0};
17725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Sd{4-1};
17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Sd{0};
17745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-23} = opcod1;
17765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = opcod2;
17775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-9}  = 0b101;
17785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{8}     = 0; // Single precision
17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6}     = opcod3;
17805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = 0;
17815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Single precision binary, if no NEON. Same as ASbI except not available if
17845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// NEON is enabled.
17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ASbIn<bits<5> opcod1, bits<2> opcod2, bit op6, bit op4, dag oops,
17865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            dag iops, InstrItinClass itin, string opc, string asm,
17875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            list<dag> pattern>
17885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : ASbI<opcod1, opcod2, op6, op4, oops, iops, itin, opc, asm, pattern> {
17895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [HasVFP2,DontUseNEONForFP];
17905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
17925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Sd;
17935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Sn;
17945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Sm;
17955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode instruction operands.
17975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Sm{4-1};
17985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = Sm{0};
17995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Sn{4-1};
18005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7}     = Sn{0};
18015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Sd{4-1};
18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Sd{0};
18035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// VFP conversion instructions
18065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AVConv1I<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3, bits<4> opcod4,
18075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               dag oops, dag iops, InstrItinClass itin, string opc, string asm,
18085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               list<dag> pattern>
18095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : VFPAI<oops, iops, VFPConv1Frm, itin, opc, asm, pattern> {
18105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-23} = opcod1;
18115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = opcod2;
18125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = opcod3;
18135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8}  = opcod4;
18145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6}     = 1;
18155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = 0;
18165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// VFP conversion between floating-point and fixed-point
18195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AVConv1XI<bits<5> op1, bits<2> op2, bits<4> op3, bits<4> op4, bit op5,
18205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                dag oops, dag iops, InstrItinClass itin, string opc, string asm,
18215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                list<dag> pattern>
18225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AVConv1I<op1, op2, op3, op4, oops, iops, itin, opc, asm, pattern> {
18235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> fbits;
18245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // size (fixed-point number): sx == 0 ? 16 : 32
18255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7} = op5; // sx
18265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5} = fbits{0};
18275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0} = fbits{4-1};
18285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// VFP conversion instructions, if no NEON
18315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AVConv1In<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3, bits<4> opcod4,
18325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                dag oops, dag iops, InstrItinClass itin,
18335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                string opc, string asm, list<dag> pattern>
18345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AVConv1I<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm,
18355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             pattern> {
18365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [HasVFP2,DontUseNEONForFP];
18375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AVConvXI<bits<8> opcod1, bits<4> opcod2, dag oops, dag iops, Format f,
18405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               InstrItinClass itin,
18415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               string opc, string asm, list<dag> pattern>
18425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : VFPAI<oops, iops, f, itin, opc, asm, pattern> {
18435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-20} = opcod1;
18445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8}  = opcod2;
18455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = 1;
18465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AVConv2I<bits<8> opcod1, bits<4> opcod2, dag oops, dag iops,
18495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               InstrItinClass itin, string opc, string asm, list<dag> pattern>
18505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AVConvXI<opcod1, opcod2, oops, iops, VFPConv2Frm, itin, opc, asm, pattern>;
18515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AVConv3I<bits<8> opcod1, bits<4> opcod2, dag oops, dag iops,
18535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               InstrItinClass itin, string opc, string asm, list<dag> pattern>
18545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AVConvXI<opcod1, opcod2, oops, iops, VFPConv3Frm, itin, opc, asm, pattern>;
18555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AVConv4I<bits<8> opcod1, bits<4> opcod2, dag oops, dag iops,
18575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               InstrItinClass itin, string opc, string asm, list<dag> pattern>
18585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AVConvXI<opcod1, opcod2, oops, iops, VFPConv4Frm, itin, opc, asm, pattern>;
18595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AVConv5I<bits<8> opcod1, bits<4> opcod2, dag oops, dag iops,
18615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               InstrItinClass itin, string opc, string asm, list<dag> pattern>
18625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : AVConvXI<opcod1, opcod2, oops, iops, VFPConv5Frm, itin, opc, asm, pattern>;
18635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===//
18655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===//
18675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ARM NEON Instruction templates.
18685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
18695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NeonI<dag oops, dag iops, AddrMode am, IndexMode im, Format f,
18715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            InstrItinClass itin, string opc, string dt, string asm, string cstr,
18725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            list<dag> pattern>
18735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstARM<am, 4, im, f, NeonDomain, cstr, itin> {
18745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
18755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = !con(iops, (ins pred:$p));
18765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = !strconcat(opc, "${p}", ".", dt, "\t", asm);
18775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
18785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [HasNEON];
18795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderNamespace = "NEON";
18805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Same as NeonI except it does not have a "data type" specifier.
18835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NeonXI<dag oops, dag iops, AddrMode am, IndexMode im, Format f,
18845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             InstrItinClass itin, string opc, string asm, string cstr,
18855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             list<dag> pattern>
18865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstARM<am, 4, im, f, NeonDomain, cstr, itin> {
18875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
18885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = !con(iops, (ins pred:$p));
18895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = !strconcat(opc, "${p}", "\t", asm);
18905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
18915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [HasNEON];
18925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderNamespace = "NEON";
18935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Same as NeonI except it is not predicated
18965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NeonInp<dag oops, dag iops, AddrMode am, IndexMode im, Format f,
18975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            InstrItinClass itin, string opc, string dt, string asm, string cstr,
18985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            list<dag> pattern>
18995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstARM<am, 4, im, f, NeonDomain, cstr, itin> {
19005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
19015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = iops;
19025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = !strconcat(opc, ".", dt, "\t", asm);
19035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
19045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [HasNEON];
19055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderNamespace = "NEON";
19065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-28} = 0b1111;
19085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NLdSt<bit op23, bits<2> op21_20, bits<4> op11_8, bits<4> op7_4,
19115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            dag oops, dag iops, InstrItinClass itin,
19125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string opc, string dt, string asm, string cstr, list<dag> pattern>
19135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : NeonI<oops, iops, AddrMode6, IndexModeNone, NLdStFrm, itin, opc, dt, asm,
19145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          cstr, pattern> {
19155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-24} = 0b11110100;
19165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{23}    = op23;
19175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = op21_20;
19185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8}  = op11_8;
19195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7-4}   = op7_4;
19205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let PostEncoderMethod = "NEONThumb2LoadStorePostEncoder";
19225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderNamespace = "NEONLoadStore";
19235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vd;
19255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<6> Rn;
19265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> Rm;
19275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Vd{4};
19295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Vd{3-0};
19305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Rn{3-0};
19315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Rm{3-0};
19325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NLdStLn<bit op23, bits<2> op21_20, bits<4> op11_8, bits<4> op7_4,
19355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            dag oops, dag iops, InstrItinClass itin,
19365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string opc, string dt, string asm, string cstr, list<dag> pattern>
19375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : NLdSt<op23, op21_20, op11_8, op7_4, oops, iops, itin, opc,
19385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          dt, asm, cstr, pattern> {
19395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<3> lane;
19405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class PseudoNLdSt<dag oops, dag iops, InstrItinClass itin, string cstr>
19435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstARM<AddrMode6, 4, IndexModeNone, Pseudo, NeonDomain, cstr,
19445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            itin> {
19455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
19465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = !con(iops, (ins pred:$p));
19475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [HasNEON];
19485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class PseudoNeonI<dag oops, dag iops, InstrItinClass itin, string cstr,
19515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  list<dag> pattern>
19525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstARM<AddrModeNone, 4, IndexModeNone, Pseudo, NeonDomain, cstr,
19535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            itin> {
19545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
19555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = !con(iops, (ins pred:$p));
19565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
19575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [HasNEON];
19585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NDataI<dag oops, dag iops, Format f, InstrItinClass itin,
19615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             string opc, string dt, string asm, string cstr, list<dag> pattern>
19625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : NeonI<oops, iops, AddrModeNone, IndexModeNone, f, itin, opc, dt, asm, cstr,
19635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          pattern> {
19645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-25} = 0b1111001;
19655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let PostEncoderMethod = "NEONThumb2DataIPostEncoder";
19665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderNamespace = "NEONData";
19675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NDataXI<dag oops, dag iops, Format f, InstrItinClass itin,
19705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              string opc, string asm, string cstr, list<dag> pattern>
19715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : NeonXI<oops, iops, AddrModeNone, IndexModeNone, f, itin, opc, asm,
19725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           cstr, pattern> {
19735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-25} = 0b1111001;
19745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let PostEncoderMethod = "NEONThumb2DataIPostEncoder";
19755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderNamespace = "NEONData";
19765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// NEON "one register and a modified immediate" format.
19795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class N1ModImm<bit op23, bits<3> op21_19, bits<4> op11_8, bit op7, bit op6,
19805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               bit op5, bit op4,
19815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               dag oops, dag iops, InstrItinClass itin,
19825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               string opc, string dt, string asm, string cstr,
19835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               list<dag> pattern>
19845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : NDataI<oops, iops, N1RegModImmFrm, itin, opc, dt, asm, cstr, pattern> {
19855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{23}    = op23;
19865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-19} = op21_19;
19875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8}  = op11_8;
19885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7}     = op7;
19895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6}     = op6;
19905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = op5;
19915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = op4;
19925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
19945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vd;
19955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<13> SIMM;
19965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Vd{3-0};
19985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Vd{4};
19995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24}    = SIMM{7};
20005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{18-16} = SIMM{6-4};
20015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = SIMM{3-0};
20025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderMethod = "DecodeNEONModImmInstruction";
20035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// NEON 2 vector register format.
20065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class N2V<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18, bits<2> op17_16,
20075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          bits<5> op11_7, bit op6, bit op4,
20085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          dag oops, dag iops, InstrItinClass itin,
20095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          string opc, string dt, string asm, string cstr, list<dag> pattern>
20105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : NDataI<oops, iops, N2RegFrm, itin, opc, dt, asm, cstr, pattern> {
20115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24-23} = op24_23;
20125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = op21_20;
20135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-18} = op19_18;
20145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{17-16} = op17_16;
20155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-7}  = op11_7;
20165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6}     = op6;
20175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = op4;
20185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
20205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vd;
20215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vm;
20225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Vd{3-0};
20245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Vd{4};
20255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Vm{3-0};
20265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = Vm{4};
20275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Same as N2V but not predicated.
20305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class N2Vnp<bits<2> op19_18, bits<2> op17_16, bits<3> op10_8, bit op7, bit op6,
20315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            dag oops, dag iops, InstrItinClass itin, string OpcodeStr,
20325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string Dt, ValueType ResTy, ValueType OpTy, list<dag> pattern>
20335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   : NeonInp<oops, iops, AddrModeNone, IndexModeNone, N2RegFrm, itin,
20345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             OpcodeStr, Dt, "$Vd, $Vm", "", pattern> {
20355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vd;
20365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vm;
20375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode instruction operands
20395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Vd{4};
20405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Vd{3-0};
20415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = Vm{4};
20425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Vm{3-0};
20435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode constant bits
20455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-23} = 0b00111;
20465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = 0b11;
20475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-18} = op19_18;
20485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{17-16} = op17_16;
20495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11} = 0;
20505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{10-8} = op10_8;
20515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7} = op7;
20525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6} = op6;
20535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4} = 0;
20545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderNamespace = "NEON";
20565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Same as N2V except it doesn't have a datatype suffix.
20595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class N2VX<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18, bits<2> op17_16,
20605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           bits<5> op11_7, bit op6, bit op4,
20615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           dag oops, dag iops, InstrItinClass itin,
20625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           string opc, string asm, string cstr, list<dag> pattern>
20635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : NDataXI<oops, iops, N2RegFrm, itin, opc, asm, cstr, pattern> {
20645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24-23} = op24_23;
20655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = op21_20;
20665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-18} = op19_18;
20675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{17-16} = op17_16;
20685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-7}  = op11_7;
20695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6}     = op6;
20705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = op4;
20715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
20735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vd;
20745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vm;
20755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Vd{3-0};
20775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Vd{4};
20785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Vm{3-0};
20795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = Vm{4};
20805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// NEON 2 vector register with immediate.
20835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class N2VImm<bit op24, bit op23, bits<4> op11_8, bit op7, bit op6, bit op4,
20845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             dag oops, dag iops, Format f, InstrItinClass itin,
20855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             string opc, string dt, string asm, string cstr, list<dag> pattern>
20865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : NDataI<oops, iops, f, itin, opc, dt, asm, cstr, pattern> {
20875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24}   = op24;
20885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{23}   = op23;
20895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8} = op11_8;
20905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7}    = op7;
20915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6}    = op6;
20925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}    = op4;
20935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
20955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vd;
20965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vm;
20975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<6> SIMM;
20985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Vd{3-0};
21005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Vd{4};
21015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Vm{3-0};
21025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = Vm{4};
21035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-16} = SIMM{5-0};
21045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// NEON 3 vector register format.
21075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class N3VCommon<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op6,
21095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                bit op4, dag oops, dag iops, Format f, InstrItinClass itin,
21105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                string opc, string dt, string asm, string cstr,
21115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                list<dag> pattern>
21125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : NDataI<oops, iops, f, itin, opc, dt, asm, cstr, pattern> {
21135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24}    = op24;
21145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{23}    = op23;
21155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = op21_20;
21165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8}  = op11_8;
21175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6}     = op6;
21185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = op4;
21195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class N3V<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op6, bit op4,
21225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          dag oops, dag iops, Format f, InstrItinClass itin,
21235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          string opc, string dt, string asm, string cstr, list<dag> pattern>
21245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : N3VCommon<op24, op23, op21_20, op11_8, op6, op4,
21255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              oops, iops, f, itin, opc, dt, asm, cstr, pattern> {
21265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
21275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vd;
21285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vn;
21295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vm;
21305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Vd{3-0};
21325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Vd{4};
21335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Vn{3-0};
21345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7}     = Vn{4};
21355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Vm{3-0};
21365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = Vm{4};
21375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class N3Vnp<bits<5> op27_23, bits<2> op21_20, bits<4> op11_8, bit op6,
21405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                bit op4, dag oops, dag iops,Format f, InstrItinClass itin,
21415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy,
21425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                SDPatternOperator IntOp, bit Commutable, list<dag> pattern>
21435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : NeonInp<oops, iops, AddrModeNone, IndexModeNone, f, itin, OpcodeStr,
21445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Dt, "$Vd, $Vn, $Vm", "", pattern> {
21455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vd;
21465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vn;
21475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vm;
21485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode instruction operands
21505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22} = Vd{4};
21515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Vd{3-0};
21525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Vn{3-0};
21535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7} = Vn{4};
21545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5} = Vm{4};
21555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0} = Vm{3-0};
21565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Encode constant bits
21585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-23} = op27_23;
21595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = op21_20;
21605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8}  = op11_8;
21615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6}     = op6;
21625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = op4;
21635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class N3VLane32<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op6,
21665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                bit op4, dag oops, dag iops, Format f, InstrItinClass itin,
21675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                string opc, string dt, string asm, string cstr,
21685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                list<dag> pattern>
21695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : N3VCommon<op24, op23, op21_20, op11_8, op6, op4,
21705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              oops, iops, f, itin, opc, dt, asm, cstr, pattern> {
21715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
21735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vd;
21745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vn;
21755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vm;
21765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bit lane;
21775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Vd{3-0};
21795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Vd{4};
21805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Vn{3-0};
21815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7}     = Vn{4};
21825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Vm{3-0};
21835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = lane;
21845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class N3VLane16<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op6,
21875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                bit op4, dag oops, dag iops, Format f, InstrItinClass itin,
21885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                string opc, string dt, string asm, string cstr,
21895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                list<dag> pattern>
21905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : N3VCommon<op24, op23, op21_20, op11_8, op6, op4,
21915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              oops, iops, f, itin, opc, dt, asm, cstr, pattern> {
21925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
21945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vd;
21955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vn;
21965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vm;
21975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<2> lane;
21985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Vd{3-0};
22005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Vd{4};
22015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Vn{3-0};
22025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7}     = Vn{4};
22035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{2-0}   = Vm{2-0};
22045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = lane{1};
22055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3}     = lane{0};
22065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Same as N3V except it doesn't have a data type suffix.
22095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class N3VX<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op6,
22105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           bit op4,
22115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           dag oops, dag iops, Format f, InstrItinClass itin,
22125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           string opc, string asm, string cstr, list<dag> pattern>
22135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : NDataXI<oops, iops, f, itin, opc, asm, cstr, pattern> {
22145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24}    = op24;
22155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{23}    = op23;
22165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = op21_20;
22175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8}  = op11_8;
22185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6}     = op6;
22195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = op4;
22205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Instruction operands.
22225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vd;
22235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vn;
22245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vm;
22255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Vd{3-0};
22275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}    = Vd{4};
22285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = Vn{3-0};
22295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7}     = Vn{4};
22305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = Vm{3-0};
22315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = Vm{4};
22325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// NEON VMOVs between scalar and core registers.
22355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NVLaneOp<bits<8> opcod1, bits<4> opcod2, bits<2> opcod3,
22365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               dag oops, dag iops, Format f, InstrItinClass itin,
22375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               string opc, string dt, string asm, list<dag> pattern>
22385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : InstARM<AddrModeNone, 4, IndexModeNone, f, NeonDomain,
22395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            "", itin> {
22405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{27-20} = opcod1;
22415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-8}  = opcod2;
22425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6-5}   = opcod3;
22435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = 1;
22445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // A8.6.303, A8.6.328, A8.6.329
22455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0}   = 0b0000;
22465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let OutOperandList = oops;
22485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let InOperandList = !con(iops, (ins pred:$p));
22495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let AsmString = !strconcat(opc, "${p}", ".", dt, "\t", asm);
22505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Pattern = pattern;
22515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [HasNEON];
22525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let PostEncoderMethod = "NEONThumb2DupPostEncoder";
22545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let DecoderNamespace = "NEONDup";
22555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> V;
22575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> R;
22585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> p;
22595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<4> lane;
22605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{31-28} = p{3-0};
22625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{7}     = V{4};
22635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = V{3-0};
22645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = R{3-0};
22655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NVGetLane<bits<8> opcod1, bits<4> opcod2, bits<2> opcod3,
22675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                dag oops, dag iops, InstrItinClass itin,
22685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                string opc, string dt, string asm, list<dag> pattern>
22695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : NVLaneOp<opcod1, opcod2, opcod3, oops, iops, NGetLnFrm, itin,
22705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             opc, dt, asm, pattern>;
22715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NVSetLane<bits<8> opcod1, bits<4> opcod2, bits<2> opcod3,
22725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                dag oops, dag iops, InstrItinClass itin,
22735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                string opc, string dt, string asm, list<dag> pattern>
22745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : NVLaneOp<opcod1, opcod2, opcod3, oops, iops, NSetLnFrm, itin,
22755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             opc, dt, asm, pattern>;
22765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NVDup<bits<8> opcod1, bits<4> opcod2, bits<2> opcod3,
22775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            dag oops, dag iops, InstrItinClass itin,
22785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            string opc, string dt, string asm, list<dag> pattern>
22795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : NVLaneOp<opcod1, opcod2, opcod3, oops, iops, NDupFrm, itin,
22805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             opc, dt, asm, pattern>;
22815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Vector Duplicate Lane (from scalar to all elements)
22835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NVDupLane<bits<4> op19_16, bit op6, dag oops, dag iops,
22845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                InstrItinClass itin, string opc, string dt, string asm,
22855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                list<dag> pattern>
22865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  : NDataI<oops, iops, NVDupLnFrm, itin, opc, dt, asm, "", pattern> {
22875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{24-23} = 0b11;
22885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{21-20} = 0b11;
22895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{19-16} = op19_16;
22905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{11-7}  = 0b11000;
22915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{6}     = op6;
22925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{4}     = 0;
22935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vd;
22955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bits<5> Vm;
22965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{22}     = Vd{4};
22985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{15-12} = Vd{3-0};
22995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{5}     = Vm{4};
23005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Inst{3-0} = Vm{3-0};
23015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// NEONFPPat - Same as Pat<>, but requires that the compiler be using NEON
23045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// for single-precision FP.
23055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NEONFPPat<dag pattern, dag result> : Pat<pattern, result> {
23065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  list<Predicate> Predicates = [HasNEON,UseNEONForFP];
23075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// VFP/NEON Instruction aliases for type suffices.
23105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class VFPDataTypeInstAlias<string opc, string dt, string asm, dag Result> :
23115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  InstAlias<!strconcat(opc, dt, "\t", asm), Result>, Requires<[HasVFP2]>;
23125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)multiclass VFPDTAnyInstAlias<string opc, string asm, dag Result> {
23145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def : VFPDataTypeInstAlias<opc, ".8", asm, Result>;
23155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def : VFPDataTypeInstAlias<opc, ".16", asm, Result>;
23165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def : VFPDataTypeInstAlias<opc, ".32", asm, Result>;
23175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def : VFPDataTypeInstAlias<opc, ".64", asm, Result>;
23185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)multiclass NEONDTAnyInstAlias<string opc, string asm, dag Result> {
23215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  let Predicates = [HasNEON] in {
23225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def : VFPDataTypeInstAlias<opc, ".8", asm, Result>;
23235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def : VFPDataTypeInstAlias<opc, ".16", asm, Result>;
23245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def : VFPDataTypeInstAlias<opc, ".32", asm, Result>;
23255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def : VFPDataTypeInstAlias<opc, ".64", asm, Result>;
23265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The same alias classes using AsmPseudo instead, for the more complex
23305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// stuff in NEON that InstAlias can't quite handle.
23315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Note that we can't use anonymous defm references here like we can
23325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// above, as we care about the ultimate instruction enum names generated, unlike
23335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// for instalias defs.
23345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NEONDataTypeAsmPseudoInst<string opc, string dt, string asm, dag iops> :
23355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  AsmPseudoInst<!strconcat(opc, dt, "\t", asm), iops>, Requires<[HasNEON]>;
23365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Data type suffix token aliases. Implements Table A7-3 in the ARM ARM.
23385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".s8", ".i8">;
23395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".u8", ".i8">;
23405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".s16", ".i16">;
23415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".u16", ".i16">;
23425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".s32", ".i32">;
23435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".u32", ".i32">;
23445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".s64", ".i64">;
23455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".u64", ".i64">;
23465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".i8", ".8">;
23485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".i16", ".16">;
23495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".i32", ".32">;
23505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".i64", ".64">;
23515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".p8", ".8">;
23535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".p16", ".16">;
23545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".f32", ".32">;
23565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".f64", ".64">;
23575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".f", ".f32">;
23585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def : TokenAlias<".d", ".f64">;
23595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)