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)