17330f729Sjoerg//===- MipsInstrInfo.td - Target Description for Mips Target -*- tablegen -*-=// 27330f729Sjoerg// 37330f729Sjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 47330f729Sjoerg// See https://llvm.org/LICENSE.txt for license information. 57330f729Sjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 67330f729Sjoerg// 77330f729Sjoerg//===----------------------------------------------------------------------===// 87330f729Sjoerg// 97330f729Sjoerg// This file contains the Mips implementation of the TargetInstrInfo class. 107330f729Sjoerg// 117330f729Sjoerg//===----------------------------------------------------------------------===// 127330f729Sjoerg 137330f729Sjoerg 147330f729Sjoerg//===----------------------------------------------------------------------===// 157330f729Sjoerg// Mips profiles and nodes 167330f729Sjoerg//===----------------------------------------------------------------------===// 177330f729Sjoerg 187330f729Sjoergdef SDT_MipsJmpLink : SDTypeProfile<0, 1, [SDTCisVT<0, iPTR>]>; 197330f729Sjoergdef SDT_MipsCMov : SDTypeProfile<1, 4, [SDTCisSameAs<0, 1>, 207330f729Sjoerg SDTCisSameAs<1, 2>, 217330f729Sjoerg SDTCisSameAs<3, 4>, 227330f729Sjoerg SDTCisInt<4>]>; 237330f729Sjoergdef SDT_MipsCallSeqStart : SDCallSeqStart<[SDTCisVT<0, i32>, SDTCisVT<1, i32>]>; 247330f729Sjoergdef SDT_MipsCallSeqEnd : SDCallSeqEnd<[SDTCisVT<0, i32>, SDTCisVT<1, i32>]>; 257330f729Sjoergdef SDT_MFLOHI : SDTypeProfile<1, 1, [SDTCisInt<0>, SDTCisVT<1, untyped>]>; 267330f729Sjoergdef SDT_MTLOHI : SDTypeProfile<1, 2, [SDTCisVT<0, untyped>, 277330f729Sjoerg SDTCisInt<1>, SDTCisSameAs<1, 2>]>; 287330f729Sjoergdef SDT_MipsMultDiv : SDTypeProfile<1, 2, [SDTCisVT<0, untyped>, SDTCisInt<1>, 297330f729Sjoerg SDTCisSameAs<1, 2>]>; 307330f729Sjoergdef SDT_MipsMAddMSub : SDTypeProfile<1, 3, 317330f729Sjoerg [SDTCisVT<0, untyped>, SDTCisSameAs<0, 3>, 327330f729Sjoerg SDTCisVT<1, i32>, SDTCisSameAs<1, 2>]>; 337330f729Sjoergdef SDT_MipsDivRem16 : SDTypeProfile<0, 2, [SDTCisInt<0>, SDTCisSameAs<0, 1>]>; 347330f729Sjoerg 357330f729Sjoergdef SDT_MipsThreadPointer : SDTypeProfile<1, 0, [SDTCisPtrTy<0>]>; 367330f729Sjoerg 377330f729Sjoergdef SDT_Sync : SDTypeProfile<0, 1, [SDTCisVT<0, i32>]>; 387330f729Sjoerg 397330f729Sjoergdef SDT_Ext : SDTypeProfile<1, 3, [SDTCisInt<0>, SDTCisSameAs<0, 1>, 407330f729Sjoerg SDTCisVT<2, i32>, SDTCisSameAs<2, 3>]>; 417330f729Sjoergdef SDT_Ins : SDTypeProfile<1, 4, [SDTCisInt<0>, SDTCisSameAs<0, 1>, 427330f729Sjoerg SDTCisVT<2, i32>, SDTCisSameAs<2, 3>, 437330f729Sjoerg SDTCisSameAs<0, 4>]>; 447330f729Sjoerg 457330f729Sjoergdef SDTMipsLoadLR : SDTypeProfile<1, 2, 467330f729Sjoerg [SDTCisInt<0>, SDTCisPtrTy<1>, 477330f729Sjoerg SDTCisSameAs<0, 2>]>; 487330f729Sjoerg 497330f729Sjoerg// Call 507330f729Sjoergdef MipsJmpLink : SDNode<"MipsISD::JmpLink",SDT_MipsJmpLink, 517330f729Sjoerg [SDNPHasChain, SDNPOutGlue, SDNPOptInGlue, 527330f729Sjoerg SDNPVariadic]>; 537330f729Sjoerg 547330f729Sjoerg// Tail call 557330f729Sjoergdef MipsTailCall : SDNode<"MipsISD::TailCall", SDT_MipsJmpLink, 567330f729Sjoerg [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; 577330f729Sjoerg 587330f729Sjoerg// Hi and Lo nodes are used to handle global addresses. Used on 597330f729Sjoerg// MipsISelLowering to lower stuff like GlobalAddress, ExternalSymbol 607330f729Sjoerg// static model. (nothing to do with Mips Registers Hi and Lo) 617330f729Sjoerg 627330f729Sjoerg// Hi is the odd node out, on MIPS64 it can expand to either daddiu when 637330f729Sjoerg// using static relocations with 64 bit symbols, or lui when using 32 bit 647330f729Sjoerg// symbols. 657330f729Sjoergdef MipsHigher : SDNode<"MipsISD::Higher", SDTIntUnaryOp>; 667330f729Sjoergdef MipsHighest : SDNode<"MipsISD::Highest", SDTIntUnaryOp>; 677330f729Sjoergdef MipsHi : SDNode<"MipsISD::Hi", SDTIntUnaryOp>; 687330f729Sjoergdef MipsLo : SDNode<"MipsISD::Lo", SDTIntUnaryOp>; 697330f729Sjoerg 707330f729Sjoergdef MipsGPRel : SDNode<"MipsISD::GPRel", SDTIntUnaryOp>; 717330f729Sjoerg 727330f729Sjoerg// Hi node for accessing the GOT. 737330f729Sjoergdef MipsGotHi : SDNode<"MipsISD::GotHi", SDTIntUnaryOp>; 747330f729Sjoerg 757330f729Sjoerg// Hi node for handling TLS offsets 767330f729Sjoergdef MipsTlsHi : SDNode<"MipsISD::TlsHi", SDTIntUnaryOp>; 777330f729Sjoerg 787330f729Sjoerg// Thread pointer 797330f729Sjoergdef MipsThreadPointer: SDNode<"MipsISD::ThreadPointer", SDT_MipsThreadPointer>; 807330f729Sjoerg 817330f729Sjoerg// Return 827330f729Sjoergdef MipsRet : SDNode<"MipsISD::Ret", SDTNone, 837330f729Sjoerg [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; 847330f729Sjoerg 857330f729Sjoergdef MipsERet : SDNode<"MipsISD::ERet", SDTNone, 867330f729Sjoerg [SDNPHasChain, SDNPOptInGlue, SDNPSideEffect]>; 877330f729Sjoerg 887330f729Sjoerg// These are target-independent nodes, but have target-specific formats. 897330f729Sjoergdef callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_MipsCallSeqStart, 907330f729Sjoerg [SDNPHasChain, SDNPSideEffect, SDNPOutGlue]>; 917330f729Sjoergdef callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_MipsCallSeqEnd, 927330f729Sjoerg [SDNPHasChain, SDNPSideEffect, 937330f729Sjoerg SDNPOptInGlue, SDNPOutGlue]>; 947330f729Sjoerg 957330f729Sjoerg// Nodes used to extract LO/HI registers. 967330f729Sjoergdef MipsMFHI : SDNode<"MipsISD::MFHI", SDT_MFLOHI>; 977330f729Sjoergdef MipsMFLO : SDNode<"MipsISD::MFLO", SDT_MFLOHI>; 987330f729Sjoerg 997330f729Sjoerg// Node used to insert 32-bit integers to LOHI register pair. 1007330f729Sjoergdef MipsMTLOHI : SDNode<"MipsISD::MTLOHI", SDT_MTLOHI>; 1017330f729Sjoerg 1027330f729Sjoerg// Mult nodes. 1037330f729Sjoergdef MipsMult : SDNode<"MipsISD::Mult", SDT_MipsMultDiv>; 1047330f729Sjoergdef MipsMultu : SDNode<"MipsISD::Multu", SDT_MipsMultDiv>; 1057330f729Sjoerg 1067330f729Sjoerg// MAdd*/MSub* nodes 1077330f729Sjoergdef MipsMAdd : SDNode<"MipsISD::MAdd", SDT_MipsMAddMSub>; 1087330f729Sjoergdef MipsMAddu : SDNode<"MipsISD::MAddu", SDT_MipsMAddMSub>; 1097330f729Sjoergdef MipsMSub : SDNode<"MipsISD::MSub", SDT_MipsMAddMSub>; 1107330f729Sjoergdef MipsMSubu : SDNode<"MipsISD::MSubu", SDT_MipsMAddMSub>; 1117330f729Sjoerg 1127330f729Sjoerg// DivRem(u) nodes 1137330f729Sjoergdef MipsDivRem : SDNode<"MipsISD::DivRem", SDT_MipsMultDiv>; 1147330f729Sjoergdef MipsDivRemU : SDNode<"MipsISD::DivRemU", SDT_MipsMultDiv>; 1157330f729Sjoergdef MipsDivRem16 : SDNode<"MipsISD::DivRem16", SDT_MipsDivRem16, 1167330f729Sjoerg [SDNPOutGlue]>; 1177330f729Sjoergdef MipsDivRemU16 : SDNode<"MipsISD::DivRemU16", SDT_MipsDivRem16, 1187330f729Sjoerg [SDNPOutGlue]>; 1197330f729Sjoerg 1207330f729Sjoerg// Target constant nodes that are not part of any isel patterns and remain 1217330f729Sjoerg// unchanged can cause instructions with illegal operands to be emitted. 1227330f729Sjoerg// Wrapper node patterns give the instruction selector a chance to replace 1237330f729Sjoerg// target constant nodes that would otherwise remain unchanged with ADDiu 1247330f729Sjoerg// nodes. Without these wrapper node patterns, the following conditional move 1257330f729Sjoerg// instruction is emitted when function cmov2 in test/CodeGen/Mips/cmov.ll is 1267330f729Sjoerg// compiled: 1277330f729Sjoerg// movn %got(d)($gp), %got(c)($gp), $4 1287330f729Sjoerg// This instruction is illegal since movn can take only register operands. 1297330f729Sjoerg 1307330f729Sjoergdef MipsWrapper : SDNode<"MipsISD::Wrapper", SDTIntBinOp>; 1317330f729Sjoerg 1327330f729Sjoergdef MipsSync : SDNode<"MipsISD::Sync", SDT_Sync, [SDNPHasChain,SDNPSideEffect]>; 1337330f729Sjoerg 1347330f729Sjoergdef MipsExt : SDNode<"MipsISD::Ext", SDT_Ext>; 1357330f729Sjoergdef MipsIns : SDNode<"MipsISD::Ins", SDT_Ins>; 1367330f729Sjoergdef MipsCIns : SDNode<"MipsISD::CIns", SDT_Ext>; 1377330f729Sjoerg 1387330f729Sjoergdef MipsLWL : SDNode<"MipsISD::LWL", SDTMipsLoadLR, 1397330f729Sjoerg [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 1407330f729Sjoergdef MipsLWR : SDNode<"MipsISD::LWR", SDTMipsLoadLR, 1417330f729Sjoerg [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 1427330f729Sjoergdef MipsSWL : SDNode<"MipsISD::SWL", SDTStore, 1437330f729Sjoerg [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 1447330f729Sjoergdef MipsSWR : SDNode<"MipsISD::SWR", SDTStore, 1457330f729Sjoerg [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 1467330f729Sjoergdef MipsLDL : SDNode<"MipsISD::LDL", SDTMipsLoadLR, 1477330f729Sjoerg [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 1487330f729Sjoergdef MipsLDR : SDNode<"MipsISD::LDR", SDTMipsLoadLR, 1497330f729Sjoerg [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 1507330f729Sjoergdef MipsSDL : SDNode<"MipsISD::SDL", SDTStore, 1517330f729Sjoerg [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 1527330f729Sjoergdef MipsSDR : SDNode<"MipsISD::SDR", SDTStore, 1537330f729Sjoerg [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 1547330f729Sjoerg 1557330f729Sjoerg//===----------------------------------------------------------------------===// 1567330f729Sjoerg// Mips Instruction Predicate Definitions. 1577330f729Sjoerg//===----------------------------------------------------------------------===// 1587330f729Sjoergdef HasMips2 : Predicate<"Subtarget->hasMips2()">, 159*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMips2)>; 1607330f729Sjoergdef HasMips3_32 : Predicate<"Subtarget->hasMips3_32()">, 161*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMips3_32)>; 1627330f729Sjoergdef HasMips3_32r2 : Predicate<"Subtarget->hasMips3_32r2()">, 163*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMips3_32r2)>; 1647330f729Sjoergdef HasMips3 : Predicate<"Subtarget->hasMips3()">, 165*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMips3)>; 1667330f729Sjoergdef NotMips3 : Predicate<"!Subtarget->hasMips3()">, 167*82d56013Sjoerg AssemblerPredicate<(all_of (not FeatureMips3))>; 1687330f729Sjoergdef HasMips4_32 : Predicate<"Subtarget->hasMips4_32()">, 169*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMips4_32)>; 1707330f729Sjoergdef NotMips4_32 : Predicate<"!Subtarget->hasMips4_32()">, 171*82d56013Sjoerg AssemblerPredicate<(all_of (not FeatureMips4_32))>; 1727330f729Sjoergdef HasMips4_32r2 : Predicate<"Subtarget->hasMips4_32r2()">, 173*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMips4_32r2)>; 1747330f729Sjoergdef HasMips5_32r2 : Predicate<"Subtarget->hasMips5_32r2()">, 175*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMips5_32r2)>; 1767330f729Sjoergdef HasMips32 : Predicate<"Subtarget->hasMips32()">, 177*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMips32)>; 1787330f729Sjoergdef HasMips32r2 : Predicate<"Subtarget->hasMips32r2()">, 179*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMips32r2)>; 1807330f729Sjoergdef HasMips32r5 : Predicate<"Subtarget->hasMips32r5()">, 181*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMips32r5)>; 1827330f729Sjoergdef HasMips32r6 : Predicate<"Subtarget->hasMips32r6()">, 183*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMips32r6)>; 1847330f729Sjoergdef NotMips32r6 : Predicate<"!Subtarget->hasMips32r6()">, 185*82d56013Sjoerg AssemblerPredicate<(all_of (not FeatureMips32r6))>; 1867330f729Sjoergdef IsGP64bit : Predicate<"Subtarget->isGP64bit()">, 187*82d56013Sjoerg AssemblerPredicate<(all_of FeatureGP64Bit)>; 1887330f729Sjoergdef IsGP32bit : Predicate<"!Subtarget->isGP64bit()">, 189*82d56013Sjoerg AssemblerPredicate<(all_of (not FeatureGP64Bit))>; 1907330f729Sjoergdef IsPTR64bit : Predicate<"Subtarget->isABI_N64()">, 191*82d56013Sjoerg AssemblerPredicate<(all_of FeaturePTR64Bit)>; 1927330f729Sjoergdef IsPTR32bit : Predicate<"!Subtarget->isABI_N64()">, 193*82d56013Sjoerg AssemblerPredicate<(all_of (not FeaturePTR64Bit))>; 1947330f729Sjoergdef HasMips64 : Predicate<"Subtarget->hasMips64()">, 195*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMips64)>; 1967330f729Sjoergdef NotMips64 : Predicate<"!Subtarget->hasMips64()">, 197*82d56013Sjoerg AssemblerPredicate<(all_of (not FeatureMips64))>; 1987330f729Sjoergdef HasMips64r2 : Predicate<"Subtarget->hasMips64r2()">, 199*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMips64r2)>; 2007330f729Sjoergdef HasMips64r5 : Predicate<"Subtarget->hasMips64r5()">, 201*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMips64r5)>; 2027330f729Sjoergdef HasMips64r6 : Predicate<"Subtarget->hasMips64r6()">, 203*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMips64r6)>; 2047330f729Sjoergdef NotMips64r6 : Predicate<"!Subtarget->hasMips64r6()">, 205*82d56013Sjoerg AssemblerPredicate<(all_of (not FeatureMips64r6))>; 2067330f729Sjoergdef InMips16Mode : Predicate<"Subtarget->inMips16Mode()">, 207*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMips16)>; 2087330f729Sjoergdef NotInMips16Mode : Predicate<"!Subtarget->inMips16Mode()">, 209*82d56013Sjoerg AssemblerPredicate<(all_of (not FeatureMips16))>; 2107330f729Sjoergdef HasCnMips : Predicate<"Subtarget->hasCnMips()">, 211*82d56013Sjoerg AssemblerPredicate<(all_of FeatureCnMips)>; 2127330f729Sjoergdef NotCnMips : Predicate<"!Subtarget->hasCnMips()">, 213*82d56013Sjoerg AssemblerPredicate<(all_of (not FeatureCnMips))>; 214*82d56013Sjoergdef HasCnMipsP : Predicate<"Subtarget->hasCnMipsP()">, 215*82d56013Sjoerg AssemblerPredicate<(all_of FeatureCnMipsP)>; 216*82d56013Sjoergdef NotCnMipsP : Predicate<"!Subtarget->hasCnMipsP()">, 217*82d56013Sjoerg AssemblerPredicate<(all_of (not FeatureCnMipsP))>; 2187330f729Sjoergdef IsSym32 : Predicate<"Subtarget->hasSym32()">, 219*82d56013Sjoerg AssemblerPredicate<(all_of FeatureSym32)>; 2207330f729Sjoergdef IsSym64 : Predicate<"!Subtarget->hasSym32()">, 221*82d56013Sjoerg AssemblerPredicate<(all_of (not FeatureSym32))>; 2227330f729Sjoergdef IsN64 : Predicate<"Subtarget->isABI_N64()">; 2237330f729Sjoergdef IsNotN64 : Predicate<"!Subtarget->isABI_N64()">; 2247330f729Sjoergdef RelocNotPIC : Predicate<"!TM.isPositionIndependent()">; 2257330f729Sjoergdef RelocPIC : Predicate<"TM.isPositionIndependent()">; 2267330f729Sjoergdef NoNaNsFPMath : Predicate<"TM.Options.NoNaNsFPMath">; 2277330f729Sjoergdef UseAbs : Predicate<"Subtarget->inAbs2008Mode() ||" 2287330f729Sjoerg "TM.Options.NoNaNsFPMath">; 2297330f729Sjoergdef HasStdEnc : Predicate<"Subtarget->hasStandardEncoding()">, 230*82d56013Sjoerg AssemblerPredicate<(all_of (not FeatureMips16))>; 2317330f729Sjoergdef NotDSP : Predicate<"!Subtarget->hasDSP()">; 2327330f729Sjoergdef InMicroMips : Predicate<"Subtarget->inMicroMipsMode()">, 233*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMicroMips)>; 2347330f729Sjoergdef NotInMicroMips : Predicate<"!Subtarget->inMicroMipsMode()">, 235*82d56013Sjoerg AssemblerPredicate<(all_of (not FeatureMicroMips))>; 2367330f729Sjoergdef IsLE : Predicate<"Subtarget->isLittle()">; 2377330f729Sjoergdef IsBE : Predicate<"!Subtarget->isLittle()">; 2387330f729Sjoergdef IsNotNaCl : Predicate<"!Subtarget->isTargetNaCl()">; 239*82d56013Sjoergdef UseTCCInDIV : AssemblerPredicate<(all_of FeatureUseTCCInDIV)>; 2407330f729Sjoergdef HasEVA : Predicate<"Subtarget->hasEVA()">, 241*82d56013Sjoerg AssemblerPredicate<(all_of FeatureEVA)>; 2427330f729Sjoergdef HasMSA : Predicate<"Subtarget->hasMSA()">, 243*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMSA)>; 2447330f729Sjoergdef HasMadd4 : Predicate<"!Subtarget->disableMadd4()">, 245*82d56013Sjoerg AssemblerPredicate<(all_of (not FeatureNoMadd4))>; 2467330f729Sjoergdef HasMT : Predicate<"Subtarget->hasMT()">, 247*82d56013Sjoerg AssemblerPredicate<(all_of FeatureMT)>; 2487330f729Sjoergdef UseIndirectJumpsHazard : Predicate<"Subtarget->useIndirectJumpsHazard()">, 249*82d56013Sjoerg AssemblerPredicate<(all_of FeatureUseIndirectJumpsHazard)>; 2507330f729Sjoergdef NoIndirectJumpGuards : Predicate<"!Subtarget->useIndirectJumpsHazard()">, 251*82d56013Sjoerg AssemblerPredicate<(all_of (not FeatureUseIndirectJumpsHazard))>; 2527330f729Sjoergdef HasCRC : Predicate<"Subtarget->hasCRC()">, 253*82d56013Sjoerg AssemblerPredicate<(all_of FeatureCRC)>; 2547330f729Sjoergdef HasVirt : Predicate<"Subtarget->hasVirt()">, 255*82d56013Sjoerg AssemblerPredicate<(all_of FeatureVirt)>; 2567330f729Sjoergdef HasGINV : Predicate<"Subtarget->hasGINV()">, 257*82d56013Sjoerg AssemblerPredicate<(all_of FeatureGINV)>; 2587330f729Sjoerg// TODO: Add support for FPOpFusion::Standard 2597330f729Sjoergdef AllowFPOpFusion : Predicate<"TM.Options.AllowFPOpFusion ==" 2607330f729Sjoerg " FPOpFusion::Fast">; 2617330f729Sjoerg//===----------------------------------------------------------------------===// 2627330f729Sjoerg// Mips GPR size adjectives. 2637330f729Sjoerg// They are mutually exclusive. 2647330f729Sjoerg//===----------------------------------------------------------------------===// 2657330f729Sjoerg 2667330f729Sjoergclass GPR_32 { list<Predicate> GPRPredicates = [IsGP32bit]; } 2677330f729Sjoergclass GPR_64 { list<Predicate> GPRPredicates = [IsGP64bit]; } 2687330f729Sjoerg 2697330f729Sjoergclass PTR_32 { list<Predicate> PTRPredicates = [IsPTR32bit]; } 2707330f729Sjoergclass PTR_64 { list<Predicate> PTRPredicates = [IsPTR64bit]; } 2717330f729Sjoerg 2727330f729Sjoerg//===----------------------------------------------------------------------===// 2737330f729Sjoerg// Mips Symbol size adjectives. 2747330f729Sjoerg// They are mutally exculsive. 2757330f729Sjoerg//===----------------------------------------------------------------------===// 2767330f729Sjoerg 2777330f729Sjoergclass SYM_32 { list<Predicate> SYMPredicates = [IsSym32]; } 2787330f729Sjoergclass SYM_64 { list<Predicate> SYMPredicates = [IsSym64]; } 2797330f729Sjoerg 2807330f729Sjoerg//===----------------------------------------------------------------------===// 2817330f729Sjoerg// Mips ISA/ASE membership and instruction group membership adjectives. 2827330f729Sjoerg// They are mutually exclusive. 2837330f729Sjoerg//===----------------------------------------------------------------------===// 2847330f729Sjoerg 2857330f729Sjoerg// FIXME: I'd prefer to use additive predicates to build the instruction sets 2867330f729Sjoerg// but we are short on assembler feature bits at the moment. Using a 2877330f729Sjoerg// subtractive predicate will hopefully keep us under the 32 predicate 2887330f729Sjoerg// limit long enough to develop an alternative way to handle P1||P2 2897330f729Sjoerg// predicates. 2907330f729Sjoergclass ISA_MIPS1 { 2917330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 2927330f729Sjoerg} 2937330f729Sjoergclass ISA_MIPS1_NOT_MIPS3 { 2947330f729Sjoerg list<Predicate> InsnPredicates = [NotMips3]; 2957330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 2967330f729Sjoerg} 2977330f729Sjoergclass ISA_MIPS1_NOT_4_32 { 2987330f729Sjoerg list<Predicate> InsnPredicates = [NotMips4_32]; 2997330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3007330f729Sjoerg} 3017330f729Sjoergclass ISA_MIPS1_NOT_32R6_64R6 { 3027330f729Sjoerg list<Predicate> InsnPredicates = [NotMips32r6, NotMips64r6]; 3037330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3047330f729Sjoerg} 3057330f729Sjoergclass ISA_MIPS2 { 3067330f729Sjoerg list<Predicate> InsnPredicates = [HasMips2]; 3077330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3087330f729Sjoerg} 3097330f729Sjoergclass ISA_MIPS2_NOT_32R6_64R6 { 3107330f729Sjoerg list<Predicate> InsnPredicates = [HasMips2, NotMips32r6, NotMips64r6]; 3117330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3127330f729Sjoerg} 3137330f729Sjoergclass ISA_MIPS3 { 3147330f729Sjoerg list<Predicate> InsnPredicates = [HasMips3]; 3157330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3167330f729Sjoerg} 3177330f729Sjoergclass ISA_MIPS3_NOT_32R6_64R6 { 3187330f729Sjoerg list<Predicate> InsnPredicates = [HasMips3, NotMips32r6, NotMips64r6]; 3197330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3207330f729Sjoerg} 3217330f729Sjoergclass ISA_MIPS32 { 3227330f729Sjoerg list<Predicate> InsnPredicates = [HasMips32]; 3237330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3247330f729Sjoerg} 3257330f729Sjoergclass ISA_MIPS32_NOT_32R6_64R6 { 3267330f729Sjoerg list<Predicate> InsnPredicates = [HasMips32, NotMips32r6, NotMips64r6]; 3277330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3287330f729Sjoerg} 3297330f729Sjoergclass ISA_MIPS32R2 { 3307330f729Sjoerg list<Predicate> InsnPredicates = [HasMips32r2]; 3317330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3327330f729Sjoerg} 3337330f729Sjoergclass ISA_MIPS32R2_NOT_32R6_64R6 { 3347330f729Sjoerg list<Predicate> InsnPredicates = [HasMips32r2, NotMips32r6, NotMips64r6]; 3357330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3367330f729Sjoerg} 3377330f729Sjoergclass ISA_MIPS32R5 { 3387330f729Sjoerg list<Predicate> InsnPredicates = [HasMips32r5]; 3397330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3407330f729Sjoerg} 3417330f729Sjoergclass ISA_MIPS64 { 3427330f729Sjoerg list<Predicate> InsnPredicates = [HasMips64]; 3437330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3447330f729Sjoerg} 3457330f729Sjoergclass ISA_MIPS64_NOT_64R6 { 3467330f729Sjoerg list<Predicate> InsnPredicates = [HasMips64, NotMips64r6]; 3477330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3487330f729Sjoerg} 3497330f729Sjoergclass ISA_MIPS64R2 { 3507330f729Sjoerg list<Predicate> InsnPredicates = [HasMips64r2]; 3517330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3527330f729Sjoerg} 3537330f729Sjoergclass ISA_MIPS64R5 { 3547330f729Sjoerg list<Predicate> InsnPredicates = [HasMips64r5]; 3557330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3567330f729Sjoerg} 3577330f729Sjoergclass ISA_MIPS32R6 { 3587330f729Sjoerg list<Predicate> InsnPredicates = [HasMips32r6]; 3597330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3607330f729Sjoerg} 3617330f729Sjoergclass ISA_MIPS64R6 { 3627330f729Sjoerg list<Predicate> InsnPredicates = [HasMips64r6]; 3637330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3647330f729Sjoerg} 3657330f729Sjoergclass ISA_MICROMIPS { 3667330f729Sjoerg list<Predicate> EncodingPredicates = [InMicroMips]; 3677330f729Sjoerg} 3687330f729Sjoergclass ISA_MICROMIPS32R5 { 3697330f729Sjoerg list<Predicate> InsnPredicates = [HasMips32r5]; 3707330f729Sjoerg list<Predicate> EncodingPredicates = [InMicroMips]; 3717330f729Sjoerg} 3727330f729Sjoergclass ISA_MICROMIPS32R6 { 3737330f729Sjoerg list<Predicate> InsnPredicates = [HasMips32r6]; 3747330f729Sjoerg list<Predicate> EncodingPredicates = [InMicroMips]; 3757330f729Sjoerg} 3767330f729Sjoergclass ISA_MICROMIPS64R6 { 3777330f729Sjoerg list<Predicate> InsnPredicates = [HasMips64r6]; 3787330f729Sjoerg list<Predicate> EncodingPredicates = [InMicroMips]; 3797330f729Sjoerg} 3807330f729Sjoergclass ISA_MICROMIPS32_NOT_MIPS32R6 { 3817330f729Sjoerg list<Predicate> InsnPredicates = [NotMips32r6]; 3827330f729Sjoerg list<Predicate> EncodingPredicates = [InMicroMips]; 3837330f729Sjoerg} 3847330f729Sjoergclass ASE_EVA { list<Predicate> ASEPredicate = [HasEVA]; } 3857330f729Sjoerg 3867330f729Sjoerg// The portions of MIPS-III that were also added to MIPS32 3877330f729Sjoergclass INSN_MIPS3_32 { 3887330f729Sjoerg list<Predicate> InsnPredicates = [HasMips3_32]; 3897330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3907330f729Sjoerg} 3917330f729Sjoerg 3927330f729Sjoerg// The portions of MIPS-III that were also added to MIPS32 but were removed in 3937330f729Sjoerg// MIPS32r6 and MIPS64r6. 3947330f729Sjoergclass INSN_MIPS3_32_NOT_32R6_64R6 { 3957330f729Sjoerg list<Predicate> InsnPredicates = [HasMips3_32, NotMips32r6, NotMips64r6]; 3967330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 3977330f729Sjoerg} 3987330f729Sjoerg 3997330f729Sjoerg// The portions of MIPS-III that were also added to MIPS32 4007330f729Sjoergclass INSN_MIPS3_32R2 { 4017330f729Sjoerg list<Predicate> InsnPredicates = [HasMips3_32r2]; 4027330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 4037330f729Sjoerg} 4047330f729Sjoerg 4057330f729Sjoerg// The portions of MIPS-IV that were also added to MIPS32. 4067330f729Sjoergclass INSN_MIPS4_32 { 4077330f729Sjoerg list <Predicate> InsnPredicates = [HasMips4_32]; 4087330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 4097330f729Sjoerg} 4107330f729Sjoerg 4117330f729Sjoerg// The portions of MIPS-IV that were also added to MIPS32 but were removed in 4127330f729Sjoerg// MIPS32r6 and MIPS64r6. 4137330f729Sjoergclass INSN_MIPS4_32_NOT_32R6_64R6 { 4147330f729Sjoerg list<Predicate> InsnPredicates = [HasMips4_32, NotMips32r6, NotMips64r6]; 4157330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 4167330f729Sjoerg} 4177330f729Sjoerg 4187330f729Sjoerg// The portions of MIPS-IV that were also added to MIPS32r2 but were removed in 4197330f729Sjoerg// MIPS32r6 and MIPS64r6. 4207330f729Sjoergclass INSN_MIPS4_32R2_NOT_32R6_64R6 { 4217330f729Sjoerg list<Predicate> InsnPredicates = [HasMips4_32r2, NotMips32r6, NotMips64r6]; 4227330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 4237330f729Sjoerg} 4247330f729Sjoerg 4257330f729Sjoerg// The portions of MIPS-IV that were also added to MIPS32r2. 4267330f729Sjoergclass INSN_MIPS4_32R2 { 4277330f729Sjoerg list<Predicate> InsnPredicates = [HasMips4_32r2]; 4287330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 4297330f729Sjoerg} 4307330f729Sjoerg 4317330f729Sjoerg// The portions of MIPS-V that were also added to MIPS32r2 but were removed in 4327330f729Sjoerg// MIPS32r6 and MIPS64r6. 4337330f729Sjoergclass INSN_MIPS5_32R2_NOT_32R6_64R6 { 4347330f729Sjoerg list<Predicate> InsnPredicates = [HasMips5_32r2, NotMips32r6, NotMips64r6]; 4357330f729Sjoerg list<Predicate> EncodingPredicates = [HasStdEnc]; 4367330f729Sjoerg} 4377330f729Sjoerg 4387330f729Sjoergclass ASE_CNMIPS { 4397330f729Sjoerg list<Predicate> ASEPredicate = [HasCnMips]; 4407330f729Sjoerg} 4417330f729Sjoerg 4427330f729Sjoergclass NOT_ASE_CNMIPS { 4437330f729Sjoerg list<Predicate> ASEPredicate = [NotCnMips]; 4447330f729Sjoerg} 4457330f729Sjoerg 446*82d56013Sjoergclass ASE_CNMIPSP { 447*82d56013Sjoerg list<Predicate> ASEPredicate = [HasCnMipsP]; 448*82d56013Sjoerg} 449*82d56013Sjoerg 450*82d56013Sjoergclass NOT_ASE_CNMIPSP { 451*82d56013Sjoerg list<Predicate> ASEPredicate = [NotCnMipsP]; 452*82d56013Sjoerg} 453*82d56013Sjoerg 4547330f729Sjoergclass ASE_MIPS64_CNMIPS { 4557330f729Sjoerg list<Predicate> ASEPredicate = [HasMips64, HasCnMips]; 4567330f729Sjoerg} 4577330f729Sjoerg 4587330f729Sjoergclass ASE_MSA { 4597330f729Sjoerg list<Predicate> ASEPredicate = [HasMSA]; 4607330f729Sjoerg} 4617330f729Sjoerg 4627330f729Sjoergclass ASE_MSA_NOT_MSA64 { 4637330f729Sjoerg list<Predicate> ASEPredicate = [HasMSA, NotMips64]; 4647330f729Sjoerg} 4657330f729Sjoerg 4667330f729Sjoergclass ASE_MSA64 { 4677330f729Sjoerg list<Predicate> ASEPredicate = [HasMSA, HasMips64]; 4687330f729Sjoerg} 4697330f729Sjoerg 4707330f729Sjoergclass ASE_MT { 4717330f729Sjoerg list <Predicate> ASEPredicate = [HasMT]; 4727330f729Sjoerg} 4737330f729Sjoerg 4747330f729Sjoergclass ASE_CRC { 4757330f729Sjoerg list <Predicate> ASEPredicate = [HasCRC]; 4767330f729Sjoerg} 4777330f729Sjoerg 4787330f729Sjoergclass ASE_VIRT { 4797330f729Sjoerg list <Predicate> ASEPredicate = [HasVirt]; 4807330f729Sjoerg} 4817330f729Sjoerg 4827330f729Sjoergclass ASE_GINV { 4837330f729Sjoerg list <Predicate> ASEPredicate = [HasGINV]; 4847330f729Sjoerg} 4857330f729Sjoerg 4867330f729Sjoerg// Class used for separating microMIPSr6 and microMIPS (r3) instruction. 4877330f729Sjoerg// It can be used only on instructions that doesn't inherit PredicateControl. 4887330f729Sjoergclass ISA_MICROMIPS_NOT_32R6 : PredicateControl { 4897330f729Sjoerg let InsnPredicates = [NotMips32r6]; 4907330f729Sjoerg let EncodingPredicates = [InMicroMips]; 4917330f729Sjoerg} 4927330f729Sjoerg 4937330f729Sjoergclass ASE_NOT_DSP { 4947330f729Sjoerg list<Predicate> ASEPredicate = [NotDSP]; 4957330f729Sjoerg} 4967330f729Sjoerg 4977330f729Sjoergclass MADD4 { 4987330f729Sjoerg list<Predicate> AdditionalPredicates = [HasMadd4]; 4997330f729Sjoerg} 5007330f729Sjoerg 501*82d56013Sjoerg// Classes used for separating expansions that differ based on the ABI in 5027330f729Sjoerg// use. 5037330f729Sjoergclass ABI_N64 { 5047330f729Sjoerg list<Predicate> AdditionalPredicates = [IsN64]; 5057330f729Sjoerg} 5067330f729Sjoerg 5077330f729Sjoergclass ABI_NOT_N64 { 5087330f729Sjoerg list<Predicate> AdditionalPredicates = [IsNotN64]; 5097330f729Sjoerg} 5107330f729Sjoerg 5117330f729Sjoergclass FPOP_FUSION_FAST { 5127330f729Sjoerg list <Predicate> AdditionalPredicates = [AllowFPOpFusion]; 5137330f729Sjoerg} 5147330f729Sjoerg 5157330f729Sjoerg//===----------------------------------------------------------------------===// 5167330f729Sjoerg 5177330f729Sjoergclass MipsPat<dag pattern, dag result> : Pat<pattern, result>, PredicateControl; 5187330f729Sjoerg 5197330f729Sjoergclass MipsInstAlias<string Asm, dag Result, bit Emit = 0b1> : 5207330f729Sjoerg InstAlias<Asm, Result, Emit>, PredicateControl; 5217330f729Sjoerg 5227330f729Sjoergclass IsCommutable { 5237330f729Sjoerg bit isCommutable = 1; 5247330f729Sjoerg} 5257330f729Sjoerg 5267330f729Sjoergclass IsBranch { 5277330f729Sjoerg bit isBranch = 1; 5287330f729Sjoerg bit isCTI = 1; 5297330f729Sjoerg} 5307330f729Sjoerg 5317330f729Sjoergclass IsReturn { 5327330f729Sjoerg bit isReturn = 1; 5337330f729Sjoerg bit isCTI = 1; 5347330f729Sjoerg} 5357330f729Sjoerg 5367330f729Sjoergclass IsCall { 5377330f729Sjoerg bit isCall = 1; 5387330f729Sjoerg bit isCTI = 1; 5397330f729Sjoerg} 5407330f729Sjoerg 5417330f729Sjoergclass IsTailCall { 5427330f729Sjoerg bit isCall = 1; 5437330f729Sjoerg bit isTerminator = 1; 5447330f729Sjoerg bit isReturn = 1; 5457330f729Sjoerg bit isBarrier = 1; 5467330f729Sjoerg bit hasExtraSrcRegAllocReq = 1; 5477330f729Sjoerg bit isCodeGenOnly = 1; 5487330f729Sjoerg bit isCTI = 1; 5497330f729Sjoerg} 5507330f729Sjoerg 5517330f729Sjoergclass IsAsCheapAsAMove { 5527330f729Sjoerg bit isAsCheapAsAMove = 1; 5537330f729Sjoerg} 5547330f729Sjoerg 5557330f729Sjoergclass NeverHasSideEffects { 5567330f729Sjoerg bit hasSideEffects = 0; 5577330f729Sjoerg} 5587330f729Sjoerg 5597330f729Sjoerg//===----------------------------------------------------------------------===// 5607330f729Sjoerg// Instruction format superclass 5617330f729Sjoerg//===----------------------------------------------------------------------===// 5627330f729Sjoerg 5637330f729Sjoerginclude "MipsInstrFormats.td" 5647330f729Sjoerg 5657330f729Sjoerg//===----------------------------------------------------------------------===// 5667330f729Sjoerg// Mips Operand, Complex Patterns and Transformations Definitions. 5677330f729Sjoerg//===----------------------------------------------------------------------===// 5687330f729Sjoerg 5697330f729Sjoergclass ConstantSImmAsmOperandClass<int Bits, list<AsmOperandClass> Supers = [], 5707330f729Sjoerg int Offset = 0> : AsmOperandClass { 5717330f729Sjoerg let Name = "ConstantSImm" # Bits # "_" # Offset; 5727330f729Sjoerg let RenderMethod = "addConstantSImmOperands<" # Bits # ", " # Offset # ">"; 5737330f729Sjoerg let PredicateMethod = "isConstantSImm<" # Bits # ", " # Offset # ">"; 5747330f729Sjoerg let SuperClasses = Supers; 5757330f729Sjoerg let DiagnosticType = "SImm" # Bits # "_" # Offset; 5767330f729Sjoerg} 5777330f729Sjoerg 5787330f729Sjoergclass SimmLslAsmOperandClass<int Bits, list<AsmOperandClass> Supers = [], 5797330f729Sjoerg int Shift = 0> : AsmOperandClass { 5807330f729Sjoerg let Name = "Simm" # Bits # "_Lsl" # Shift; 5817330f729Sjoerg let RenderMethod = "addImmOperands"; 5827330f729Sjoerg let PredicateMethod = "isScaledSImm<" # Bits # ", " # Shift # ">"; 5837330f729Sjoerg let SuperClasses = Supers; 5847330f729Sjoerg let DiagnosticType = "SImm" # Bits # "_Lsl" # Shift; 5857330f729Sjoerg} 5867330f729Sjoerg 5877330f729Sjoergclass ConstantUImmAsmOperandClass<int Bits, list<AsmOperandClass> Supers = [], 5887330f729Sjoerg int Offset = 0> : AsmOperandClass { 5897330f729Sjoerg let Name = "ConstantUImm" # Bits # "_" # Offset; 5907330f729Sjoerg let RenderMethod = "addConstantUImmOperands<" # Bits # ", " # Offset # ">"; 5917330f729Sjoerg let PredicateMethod = "isConstantUImm<" # Bits # ", " # Offset # ">"; 5927330f729Sjoerg let SuperClasses = Supers; 5937330f729Sjoerg let DiagnosticType = "UImm" # Bits # "_" # Offset; 5947330f729Sjoerg} 5957330f729Sjoerg 5967330f729Sjoergclass ConstantUImmRangeAsmOperandClass<int Bottom, int Top, 5977330f729Sjoerg list<AsmOperandClass> Supers = []> 5987330f729Sjoerg : AsmOperandClass { 5997330f729Sjoerg let Name = "ConstantUImmRange" # Bottom # "_" # Top; 6007330f729Sjoerg let RenderMethod = "addImmOperands"; 6017330f729Sjoerg let PredicateMethod = "isConstantUImmRange<" # Bottom # ", " # Top # ">"; 6027330f729Sjoerg let SuperClasses = Supers; 6037330f729Sjoerg let DiagnosticType = "UImmRange" # Bottom # "_" # Top; 6047330f729Sjoerg} 6057330f729Sjoerg 6067330f729Sjoergclass SImmAsmOperandClass<int Bits, list<AsmOperandClass> Supers = []> 6077330f729Sjoerg : AsmOperandClass { 6087330f729Sjoerg let Name = "SImm" # Bits; 6097330f729Sjoerg let RenderMethod = "addSImmOperands<" # Bits # ">"; 6107330f729Sjoerg let PredicateMethod = "isSImm<" # Bits # ">"; 6117330f729Sjoerg let SuperClasses = Supers; 6127330f729Sjoerg let DiagnosticType = "SImm" # Bits; 6137330f729Sjoerg} 6147330f729Sjoerg 6157330f729Sjoergclass UImmAsmOperandClass<int Bits, list<AsmOperandClass> Supers = []> 6167330f729Sjoerg : AsmOperandClass { 6177330f729Sjoerg let Name = "UImm" # Bits; 6187330f729Sjoerg let RenderMethod = "addUImmOperands<" # Bits # ">"; 6197330f729Sjoerg let PredicateMethod = "isUImm<" # Bits # ">"; 6207330f729Sjoerg let SuperClasses = Supers; 6217330f729Sjoerg let DiagnosticType = "UImm" # Bits; 6227330f729Sjoerg} 6237330f729Sjoerg 6247330f729Sjoerg// Generic case - only to support certain assembly pseudo instructions. 6257330f729Sjoergclass UImmAnyAsmOperandClass<int Bits, list<AsmOperandClass> Supers = []> 6267330f729Sjoerg : AsmOperandClass { 6277330f729Sjoerg let Name = "ImmAny"; 6287330f729Sjoerg let RenderMethod = "addConstantUImmOperands<32>"; 6297330f729Sjoerg let PredicateMethod = "isSImm<" # Bits # ">"; 6307330f729Sjoerg let SuperClasses = Supers; 6317330f729Sjoerg let DiagnosticType = "ImmAny"; 6327330f729Sjoerg} 6337330f729Sjoerg 6347330f729Sjoerg// AsmOperandClasses require a strict ordering which is difficult to manage 6357330f729Sjoerg// as a hierarchy. Instead, we use a linear ordering and impose an order that 6367330f729Sjoerg// is in some places arbitrary. 6377330f729Sjoerg// 6387330f729Sjoerg// Here the rules that are in use: 6397330f729Sjoerg// * Wider immediates are a superset of narrower immediates: 6407330f729Sjoerg// uimm4 < uimm5 < uimm6 6417330f729Sjoerg// * For the same bit-width, unsigned immediates are a superset of signed 6427330f729Sjoerg// immediates:: 6437330f729Sjoerg// simm4 < uimm4 < simm5 < uimm5 6447330f729Sjoerg// * For the same upper-bound, signed immediates are a superset of unsigned 6457330f729Sjoerg// immediates: 6467330f729Sjoerg// uimm3 < simm4 < uimm4 < simm4 6477330f729Sjoerg// * Modified immediates are a superset of ordinary immediates: 6487330f729Sjoerg// uimm5 < uimm5_plus1 (1..32) < uimm5_plus32 (32..63) < uimm6 6497330f729Sjoerg// The term 'superset' starts to break down here since the uimm5_plus* classes 6507330f729Sjoerg// are not true supersets of uimm5 (but they are still subsets of uimm6). 6517330f729Sjoerg// * 'Relaxed' immediates are supersets of the corresponding unsigned immediate. 6527330f729Sjoerg// uimm16 < uimm16_relaxed 6537330f729Sjoerg// * The codeGen pattern type is arbitrarily ordered. 6547330f729Sjoerg// uimm5 < uimm5_64, and uimm5 < vsplat_uimm5 6557330f729Sjoerg// This is entirely arbitrary. We need an ordering and what we pick is 6567330f729Sjoerg// unimportant since only one is possible for a given mnemonic. 6577330f729Sjoerg 6587330f729Sjoergdef UImm32CoercedAsmOperandClass : UImmAnyAsmOperandClass<33, []> { 6597330f729Sjoerg let Name = "UImm32_Coerced"; 6607330f729Sjoerg let DiagnosticType = "UImm32_Coerced"; 6617330f729Sjoerg} 6627330f729Sjoergdef SImm32RelaxedAsmOperandClass 6637330f729Sjoerg : SImmAsmOperandClass<32, [UImm32CoercedAsmOperandClass]> { 6647330f729Sjoerg let Name = "SImm32_Relaxed"; 6657330f729Sjoerg let PredicateMethod = "isAnyImm<33>"; 6667330f729Sjoerg let DiagnosticType = "SImm32_Relaxed"; 6677330f729Sjoerg} 6687330f729Sjoergdef SImm32AsmOperandClass 6697330f729Sjoerg : SImmAsmOperandClass<32, [SImm32RelaxedAsmOperandClass]>; 6707330f729Sjoergdef ConstantUImm26AsmOperandClass 6717330f729Sjoerg : ConstantUImmAsmOperandClass<26, [SImm32AsmOperandClass]>; 6727330f729Sjoergdef ConstantUImm20AsmOperandClass 6737330f729Sjoerg : ConstantUImmAsmOperandClass<20, [ConstantUImm26AsmOperandClass]>; 6747330f729Sjoergdef ConstantSImm19Lsl2AsmOperandClass : AsmOperandClass { 6757330f729Sjoerg let Name = "SImm19Lsl2"; 6767330f729Sjoerg let RenderMethod = "addImmOperands"; 6777330f729Sjoerg let PredicateMethod = "isScaledSImm<19, 2>"; 6787330f729Sjoerg let SuperClasses = [ConstantUImm20AsmOperandClass]; 6797330f729Sjoerg let DiagnosticType = "SImm19_Lsl2"; 6807330f729Sjoerg} 6817330f729Sjoergdef UImm16RelaxedAsmOperandClass 6827330f729Sjoerg : UImmAsmOperandClass<16, [ConstantUImm20AsmOperandClass]> { 6837330f729Sjoerg let Name = "UImm16_Relaxed"; 6847330f729Sjoerg let PredicateMethod = "isAnyImm<16>"; 6857330f729Sjoerg let DiagnosticType = "UImm16_Relaxed"; 6867330f729Sjoerg} 6877330f729Sjoerg// Similar to the relaxed classes which take an SImm and render it as 6887330f729Sjoerg// an UImm, this takes a UImm and renders it as an SImm. 6897330f729Sjoergdef UImm16AltRelaxedAsmOperandClass 6907330f729Sjoerg : SImmAsmOperandClass<16, [UImm16RelaxedAsmOperandClass]> { 6917330f729Sjoerg let Name = "UImm16_AltRelaxed"; 6927330f729Sjoerg let PredicateMethod = "isUImm<16>"; 6937330f729Sjoerg let DiagnosticType = "UImm16_AltRelaxed"; 6947330f729Sjoerg} 6957330f729Sjoerg// FIXME: One of these should probably have UImm16AsmOperandClass as the 6967330f729Sjoerg// superclass instead of UImm16RelaxedasmOPerandClass. 6977330f729Sjoergdef UImm16AsmOperandClass 6987330f729Sjoerg : UImmAsmOperandClass<16, [UImm16RelaxedAsmOperandClass]>; 6997330f729Sjoergdef SImm16RelaxedAsmOperandClass 7007330f729Sjoerg : SImmAsmOperandClass<16, [UImm16RelaxedAsmOperandClass]> { 7017330f729Sjoerg let Name = "SImm16_Relaxed"; 7027330f729Sjoerg let PredicateMethod = "isAnyImm<16>"; 7037330f729Sjoerg let DiagnosticType = "SImm16_Relaxed"; 7047330f729Sjoerg} 7057330f729Sjoergdef SImm16AsmOperandClass 7067330f729Sjoerg : SImmAsmOperandClass<16, [SImm16RelaxedAsmOperandClass]>; 7077330f729Sjoergdef ConstantSImm10Lsl3AsmOperandClass : AsmOperandClass { 7087330f729Sjoerg let Name = "SImm10Lsl3"; 7097330f729Sjoerg let RenderMethod = "addImmOperands"; 7107330f729Sjoerg let PredicateMethod = "isScaledSImm<10, 3>"; 7117330f729Sjoerg let SuperClasses = [SImm16AsmOperandClass]; 7127330f729Sjoerg let DiagnosticType = "SImm10_Lsl3"; 7137330f729Sjoerg} 7147330f729Sjoergdef ConstantSImm10Lsl2AsmOperandClass : AsmOperandClass { 7157330f729Sjoerg let Name = "SImm10Lsl2"; 7167330f729Sjoerg let RenderMethod = "addImmOperands"; 7177330f729Sjoerg let PredicateMethod = "isScaledSImm<10, 2>"; 7187330f729Sjoerg let SuperClasses = [ConstantSImm10Lsl3AsmOperandClass]; 7197330f729Sjoerg let DiagnosticType = "SImm10_Lsl2"; 7207330f729Sjoerg} 7217330f729Sjoergdef ConstantSImm11AsmOperandClass 7227330f729Sjoerg : ConstantSImmAsmOperandClass<11, [ConstantSImm10Lsl2AsmOperandClass]>; 7237330f729Sjoergdef ConstantSImm10Lsl1AsmOperandClass : AsmOperandClass { 7247330f729Sjoerg let Name = "SImm10Lsl1"; 7257330f729Sjoerg let RenderMethod = "addImmOperands"; 7267330f729Sjoerg let PredicateMethod = "isScaledSImm<10, 1>"; 7277330f729Sjoerg let SuperClasses = [ConstantSImm11AsmOperandClass]; 7287330f729Sjoerg let DiagnosticType = "SImm10_Lsl1"; 7297330f729Sjoerg} 7307330f729Sjoergdef ConstantUImm10AsmOperandClass 7317330f729Sjoerg : ConstantUImmAsmOperandClass<10, [ConstantSImm10Lsl1AsmOperandClass]>; 7327330f729Sjoergdef ConstantSImm10AsmOperandClass 7337330f729Sjoerg : ConstantSImmAsmOperandClass<10, [ConstantUImm10AsmOperandClass]>; 7347330f729Sjoergdef ConstantSImm9AsmOperandClass 7357330f729Sjoerg : ConstantSImmAsmOperandClass<9, [ConstantSImm10AsmOperandClass]>; 7367330f729Sjoergdef ConstantSImm7Lsl2AsmOperandClass : AsmOperandClass { 7377330f729Sjoerg let Name = "SImm7Lsl2"; 7387330f729Sjoerg let RenderMethod = "addImmOperands"; 7397330f729Sjoerg let PredicateMethod = "isScaledSImm<7, 2>"; 7407330f729Sjoerg let SuperClasses = [ConstantSImm9AsmOperandClass]; 7417330f729Sjoerg let DiagnosticType = "SImm7_Lsl2"; 7427330f729Sjoerg} 7437330f729Sjoergdef ConstantUImm8AsmOperandClass 7447330f729Sjoerg : ConstantUImmAsmOperandClass<8, [ConstantSImm7Lsl2AsmOperandClass]>; 7457330f729Sjoergdef ConstantUImm7Sub1AsmOperandClass 7467330f729Sjoerg : ConstantUImmAsmOperandClass<7, [ConstantUImm8AsmOperandClass], -1> { 7477330f729Sjoerg // Specify the names since the -1 offset causes invalid identifiers otherwise. 7487330f729Sjoerg let Name = "UImm7_N1"; 7497330f729Sjoerg let DiagnosticType = "UImm7_N1"; 7507330f729Sjoerg} 7517330f729Sjoergdef ConstantUImm7AsmOperandClass 7527330f729Sjoerg : ConstantUImmAsmOperandClass<7, [ConstantUImm7Sub1AsmOperandClass]>; 7537330f729Sjoergdef ConstantUImm6Lsl2AsmOperandClass : AsmOperandClass { 7547330f729Sjoerg let Name = "UImm6Lsl2"; 7557330f729Sjoerg let RenderMethod = "addImmOperands"; 7567330f729Sjoerg let PredicateMethod = "isScaledUImm<6, 2>"; 7577330f729Sjoerg let SuperClasses = [ConstantUImm7AsmOperandClass]; 7587330f729Sjoerg let DiagnosticType = "UImm6_Lsl2"; 7597330f729Sjoerg} 7607330f729Sjoergdef ConstantUImm6AsmOperandClass 7617330f729Sjoerg : ConstantUImmAsmOperandClass<6, [ConstantUImm6Lsl2AsmOperandClass]>; 7627330f729Sjoergdef ConstantSImm6AsmOperandClass 7637330f729Sjoerg : ConstantSImmAsmOperandClass<6, [ConstantUImm6AsmOperandClass]>; 7647330f729Sjoergdef ConstantUImm5Lsl2AsmOperandClass : AsmOperandClass { 7657330f729Sjoerg let Name = "UImm5Lsl2"; 7667330f729Sjoerg let RenderMethod = "addImmOperands"; 7677330f729Sjoerg let PredicateMethod = "isScaledUImm<5, 2>"; 7687330f729Sjoerg let SuperClasses = [ConstantSImm6AsmOperandClass]; 7697330f729Sjoerg let DiagnosticType = "UImm5_Lsl2"; 7707330f729Sjoerg} 7717330f729Sjoergdef ConstantUImm5_Range2_64AsmOperandClass 7727330f729Sjoerg : ConstantUImmRangeAsmOperandClass<2, 64, [ConstantUImm5Lsl2AsmOperandClass]>; 7737330f729Sjoergdef ConstantUImm5Plus33AsmOperandClass 7747330f729Sjoerg : ConstantUImmAsmOperandClass<5, [ConstantUImm5_Range2_64AsmOperandClass], 7757330f729Sjoerg 33>; 7767330f729Sjoergdef ConstantUImm5ReportUImm6AsmOperandClass 7777330f729Sjoerg : ConstantUImmAsmOperandClass<5, [ConstantUImm5Plus33AsmOperandClass]> { 7787330f729Sjoerg let Name = "ConstantUImm5_0_Report_UImm6"; 7797330f729Sjoerg let DiagnosticType = "UImm5_0_Report_UImm6"; 7807330f729Sjoerg} 7817330f729Sjoergdef ConstantUImm5Plus32AsmOperandClass 7827330f729Sjoerg : ConstantUImmAsmOperandClass< 7837330f729Sjoerg 5, [ConstantUImm5ReportUImm6AsmOperandClass], 32>; 7847330f729Sjoergdef ConstantUImm5Plus32NormalizeAsmOperandClass 7857330f729Sjoerg : ConstantUImmAsmOperandClass<5, [ConstantUImm5Plus32AsmOperandClass], 32> { 7867330f729Sjoerg let Name = "ConstantUImm5_32_Norm"; 7877330f729Sjoerg // We must also subtract 32 when we render the operand. 7887330f729Sjoerg let RenderMethod = "addConstantUImmOperands<5, 32, -32>"; 7897330f729Sjoerg} 7907330f729Sjoergdef ConstantUImm5Plus1ReportUImm6AsmOperandClass 7917330f729Sjoerg : ConstantUImmAsmOperandClass< 7927330f729Sjoerg 5, [ConstantUImm5Plus32NormalizeAsmOperandClass], 1>{ 7937330f729Sjoerg let Name = "ConstantUImm5_Plus1_Report_UImm6"; 7947330f729Sjoerg} 7957330f729Sjoergdef ConstantUImm5Plus1AsmOperandClass 7967330f729Sjoerg : ConstantUImmAsmOperandClass< 7977330f729Sjoerg 5, [ConstantUImm5Plus1ReportUImm6AsmOperandClass], 1>; 7987330f729Sjoergdef ConstantUImm5AsmOperandClass 7997330f729Sjoerg : ConstantUImmAsmOperandClass<5, [ConstantUImm5Plus1AsmOperandClass]>; 8007330f729Sjoergdef ConstantSImm5AsmOperandClass 8017330f729Sjoerg : ConstantSImmAsmOperandClass<5, [ConstantUImm5AsmOperandClass]>; 8027330f729Sjoergdef ConstantUImm4AsmOperandClass 8037330f729Sjoerg : ConstantUImmAsmOperandClass<4, [ConstantSImm5AsmOperandClass]>; 8047330f729Sjoergdef ConstantSImm4AsmOperandClass 8057330f729Sjoerg : ConstantSImmAsmOperandClass<4, [ConstantUImm4AsmOperandClass]>; 8067330f729Sjoergdef ConstantUImm3AsmOperandClass 8077330f729Sjoerg : ConstantUImmAsmOperandClass<3, [ConstantSImm4AsmOperandClass]>; 8087330f729Sjoergdef ConstantUImm2Plus1AsmOperandClass 8097330f729Sjoerg : ConstantUImmAsmOperandClass<2, [ConstantUImm3AsmOperandClass], 1>; 8107330f729Sjoergdef ConstantUImm2AsmOperandClass 8117330f729Sjoerg : ConstantUImmAsmOperandClass<2, [ConstantUImm3AsmOperandClass]>; 8127330f729Sjoergdef ConstantUImm1AsmOperandClass 8137330f729Sjoerg : ConstantUImmAsmOperandClass<1, [ConstantUImm2AsmOperandClass]>; 8147330f729Sjoergdef ConstantImmzAsmOperandClass : AsmOperandClass { 8157330f729Sjoerg let Name = "ConstantImmz"; 8167330f729Sjoerg let RenderMethod = "addConstantUImmOperands<1>"; 8177330f729Sjoerg let PredicateMethod = "isConstantImmz"; 8187330f729Sjoerg let SuperClasses = [ConstantUImm1AsmOperandClass]; 8197330f729Sjoerg let DiagnosticType = "Immz"; 8207330f729Sjoerg} 8217330f729Sjoerg 8227330f729Sjoergdef Simm19Lsl2AsmOperand 8237330f729Sjoerg : SimmLslAsmOperandClass<19, [], 2>; 8247330f729Sjoerg 8257330f729Sjoergdef MipsJumpTargetAsmOperand : AsmOperandClass { 8267330f729Sjoerg let Name = "JumpTarget"; 8277330f729Sjoerg let ParserMethod = "parseJumpTarget"; 8287330f729Sjoerg let PredicateMethod = "isImm"; 8297330f729Sjoerg let RenderMethod = "addImmOperands"; 8307330f729Sjoerg} 8317330f729Sjoerg 8327330f729Sjoerg// Instruction operand types 8337330f729Sjoergdef jmptarget : Operand<OtherVT> { 8347330f729Sjoerg let EncoderMethod = "getJumpTargetOpValue"; 8357330f729Sjoerg let ParserMatchClass = MipsJumpTargetAsmOperand; 8367330f729Sjoerg} 8377330f729Sjoergdef brtarget : Operand<OtherVT> { 8387330f729Sjoerg let EncoderMethod = "getBranchTargetOpValue"; 8397330f729Sjoerg let OperandType = "OPERAND_PCREL"; 8407330f729Sjoerg let DecoderMethod = "DecodeBranchTarget"; 8417330f729Sjoerg let ParserMatchClass = MipsJumpTargetAsmOperand; 8427330f729Sjoerg} 8437330f729Sjoergdef brtarget1SImm16 : Operand<OtherVT> { 8447330f729Sjoerg let EncoderMethod = "getBranchTargetOpValue1SImm16"; 8457330f729Sjoerg let OperandType = "OPERAND_PCREL"; 8467330f729Sjoerg let DecoderMethod = "DecodeBranchTarget1SImm16"; 8477330f729Sjoerg let ParserMatchClass = MipsJumpTargetAsmOperand; 8487330f729Sjoerg} 8497330f729Sjoergdef calltarget : Operand<iPTR> { 8507330f729Sjoerg let EncoderMethod = "getJumpTargetOpValue"; 8517330f729Sjoerg let ParserMatchClass = MipsJumpTargetAsmOperand; 8527330f729Sjoerg} 8537330f729Sjoerg 8547330f729Sjoergdef imm64: Operand<i64>; 8557330f729Sjoerg 8567330f729Sjoergdef simm19_lsl2 : Operand<i32> { 8577330f729Sjoerg let EncoderMethod = "getSimm19Lsl2Encoding"; 8587330f729Sjoerg let DecoderMethod = "DecodeSimm19Lsl2"; 8597330f729Sjoerg let ParserMatchClass = Simm19Lsl2AsmOperand; 8607330f729Sjoerg} 8617330f729Sjoerg 8627330f729Sjoergdef simm18_lsl3 : Operand<i32> { 8637330f729Sjoerg let EncoderMethod = "getSimm18Lsl3Encoding"; 8647330f729Sjoerg let DecoderMethod = "DecodeSimm18Lsl3"; 8657330f729Sjoerg let ParserMatchClass = MipsJumpTargetAsmOperand; 8667330f729Sjoerg} 8677330f729Sjoerg 8687330f729Sjoerg// Zero 8697330f729Sjoergdef uimmz : Operand<i32> { 8707330f729Sjoerg let PrintMethod = "printUImm<0>"; 8717330f729Sjoerg let ParserMatchClass = ConstantImmzAsmOperandClass; 8727330f729Sjoerg} 8737330f729Sjoerg 8747330f729Sjoerg// size operand of ins instruction 8757330f729Sjoergdef uimm_range_2_64 : Operand<i32> { 8767330f729Sjoerg let PrintMethod = "printUImm<6, 2>"; 8777330f729Sjoerg let EncoderMethod = "getSizeInsEncoding"; 8787330f729Sjoerg let DecoderMethod = "DecodeInsSize"; 8797330f729Sjoerg let ParserMatchClass = ConstantUImm5_Range2_64AsmOperandClass; 8807330f729Sjoerg} 8817330f729Sjoerg 8827330f729Sjoerg// Unsigned Operands 8837330f729Sjoergforeach I = {1, 2, 3, 4, 5, 6, 7, 8, 10, 20, 26} in 8847330f729Sjoerg def uimm # I : Operand<i32> { 8857330f729Sjoerg let PrintMethod = "printUImm<" # I # ">"; 8867330f729Sjoerg let ParserMatchClass = 8877330f729Sjoerg !cast<AsmOperandClass>("ConstantUImm" # I # "AsmOperandClass"); 8887330f729Sjoerg } 8897330f729Sjoerg 8907330f729Sjoergdef uimm2_plus1 : Operand<i32> { 8917330f729Sjoerg let PrintMethod = "printUImm<2, 1>"; 8927330f729Sjoerg let EncoderMethod = "getUImmWithOffsetEncoding<2, 1>"; 8937330f729Sjoerg let DecoderMethod = "DecodeUImmWithOffset<2, 1>"; 8947330f729Sjoerg let ParserMatchClass = ConstantUImm2Plus1AsmOperandClass; 8957330f729Sjoerg} 8967330f729Sjoerg 8977330f729Sjoergdef uimm5_plus1 : Operand<i32> { 8987330f729Sjoerg let PrintMethod = "printUImm<5, 1>"; 8997330f729Sjoerg let EncoderMethod = "getUImmWithOffsetEncoding<5, 1>"; 9007330f729Sjoerg let DecoderMethod = "DecodeUImmWithOffset<5, 1>"; 9017330f729Sjoerg let ParserMatchClass = ConstantUImm5Plus1AsmOperandClass; 9027330f729Sjoerg} 9037330f729Sjoerg 9047330f729Sjoergdef uimm5_plus1_report_uimm6 : Operand<i32> { 9057330f729Sjoerg let PrintMethod = "printUImm<6, 1>"; 9067330f729Sjoerg let EncoderMethod = "getUImmWithOffsetEncoding<5, 1>"; 9077330f729Sjoerg let DecoderMethod = "DecodeUImmWithOffset<5, 1>"; 9087330f729Sjoerg let ParserMatchClass = ConstantUImm5Plus1ReportUImm6AsmOperandClass; 9097330f729Sjoerg} 9107330f729Sjoerg 9117330f729Sjoergdef uimm5_plus32 : Operand<i32> { 9127330f729Sjoerg let PrintMethod = "printUImm<5, 32>"; 9137330f729Sjoerg let ParserMatchClass = ConstantUImm5Plus32AsmOperandClass; 9147330f729Sjoerg} 9157330f729Sjoerg 9167330f729Sjoergdef uimm5_plus33 : Operand<i32> { 9177330f729Sjoerg let PrintMethod = "printUImm<5, 33>"; 9187330f729Sjoerg let EncoderMethod = "getUImmWithOffsetEncoding<5, 1>"; 9197330f729Sjoerg let DecoderMethod = "DecodeUImmWithOffset<5, 1>"; 9207330f729Sjoerg let ParserMatchClass = ConstantUImm5Plus33AsmOperandClass; 9217330f729Sjoerg} 9227330f729Sjoerg 9237330f729Sjoergdef uimm5_inssize_plus1 : Operand<i32> { 9247330f729Sjoerg let PrintMethod = "printUImm<6>"; 9257330f729Sjoerg let ParserMatchClass = ConstantUImm5Plus1AsmOperandClass; 9267330f729Sjoerg let EncoderMethod = "getSizeInsEncoding"; 9277330f729Sjoerg let DecoderMethod = "DecodeInsSize"; 9287330f729Sjoerg} 9297330f729Sjoerg 9307330f729Sjoergdef uimm5_plus32_normalize : Operand<i32> { 9317330f729Sjoerg let PrintMethod = "printUImm<5>"; 9327330f729Sjoerg let ParserMatchClass = ConstantUImm5Plus32NormalizeAsmOperandClass; 9337330f729Sjoerg} 9347330f729Sjoerg 9357330f729Sjoergdef uimm5_lsl2 : Operand<OtherVT> { 9367330f729Sjoerg let EncoderMethod = "getUImm5Lsl2Encoding"; 9377330f729Sjoerg let DecoderMethod = "DecodeUImmWithOffsetAndScale<5, 0, 4>"; 9387330f729Sjoerg let ParserMatchClass = ConstantUImm5Lsl2AsmOperandClass; 9397330f729Sjoerg} 9407330f729Sjoerg 9417330f729Sjoergdef uimm5_plus32_normalize_64 : Operand<i64> { 9427330f729Sjoerg let PrintMethod = "printUImm<5>"; 9437330f729Sjoerg let ParserMatchClass = ConstantUImm5Plus32NormalizeAsmOperandClass; 9447330f729Sjoerg} 9457330f729Sjoerg 9467330f729Sjoergdef uimm6_lsl2 : Operand<OtherVT> { 9477330f729Sjoerg let EncoderMethod = "getUImm6Lsl2Encoding"; 9487330f729Sjoerg let DecoderMethod = "DecodeUImmWithOffsetAndScale<6, 0, 4>"; 9497330f729Sjoerg let ParserMatchClass = ConstantUImm6Lsl2AsmOperandClass; 9507330f729Sjoerg} 9517330f729Sjoerg 9527330f729Sjoergforeach I = {16} in 9537330f729Sjoerg def uimm # I : Operand<i32> { 9547330f729Sjoerg let PrintMethod = "printUImm<" # I # ">"; 9557330f729Sjoerg let ParserMatchClass = 9567330f729Sjoerg !cast<AsmOperandClass>("UImm" # I # "AsmOperandClass"); 9577330f729Sjoerg } 9587330f729Sjoerg 9597330f729Sjoerg// Like uimm16_64 but coerces simm16 to uimm16. 9607330f729Sjoergdef uimm16_relaxed : Operand<i32> { 9617330f729Sjoerg let PrintMethod = "printUImm<16>"; 962*82d56013Sjoerg let ParserMatchClass = UImm16RelaxedAsmOperandClass; 9637330f729Sjoerg} 9647330f729Sjoerg 9657330f729Sjoergforeach I = {5} in 9667330f729Sjoerg def uimm # I # _64 : Operand<i64> { 9677330f729Sjoerg let PrintMethod = "printUImm<" # I # ">"; 9687330f729Sjoerg let ParserMatchClass = 9697330f729Sjoerg !cast<AsmOperandClass>("ConstantUImm" # I # "AsmOperandClass"); 9707330f729Sjoerg } 9717330f729Sjoerg 9727330f729Sjoergforeach I = {16} in 9737330f729Sjoerg def uimm # I # _64 : Operand<i64> { 9747330f729Sjoerg let PrintMethod = "printUImm<" # I # ">"; 9757330f729Sjoerg let ParserMatchClass = 9767330f729Sjoerg !cast<AsmOperandClass>("UImm" # I # "AsmOperandClass"); 9777330f729Sjoerg } 9787330f729Sjoerg 9797330f729Sjoerg// Like uimm16_64 but coerces simm16 to uimm16. 9807330f729Sjoergdef uimm16_64_relaxed : Operand<i64> { 9817330f729Sjoerg let PrintMethod = "printUImm<16>"; 982*82d56013Sjoerg let ParserMatchClass = UImm16RelaxedAsmOperandClass; 9837330f729Sjoerg} 9847330f729Sjoerg 9857330f729Sjoergdef uimm16_altrelaxed : Operand<i32> { 9867330f729Sjoerg let PrintMethod = "printUImm<16>"; 987*82d56013Sjoerg let ParserMatchClass = UImm16AltRelaxedAsmOperandClass; 9887330f729Sjoerg} 9897330f729Sjoerg// Like uimm5 but reports a less confusing error for 32-63 when 9907330f729Sjoerg// an instruction alias permits that. 9917330f729Sjoergdef uimm5_report_uimm6 : Operand<i32> { 9927330f729Sjoerg let PrintMethod = "printUImm<6>"; 9937330f729Sjoerg let ParserMatchClass = ConstantUImm5ReportUImm6AsmOperandClass; 9947330f729Sjoerg} 9957330f729Sjoerg 9967330f729Sjoerg// Like uimm5_64 but reports a less confusing error for 32-63 when 9977330f729Sjoerg// an instruction alias permits that. 9987330f729Sjoergdef uimm5_64_report_uimm6 : Operand<i64> { 9997330f729Sjoerg let PrintMethod = "printUImm<5>"; 10007330f729Sjoerg let ParserMatchClass = ConstantUImm5ReportUImm6AsmOperandClass; 10017330f729Sjoerg} 10027330f729Sjoerg 10037330f729Sjoergforeach I = {1, 2, 3, 4} in 10047330f729Sjoerg def uimm # I # _ptr : Operand<iPTR> { 10057330f729Sjoerg let PrintMethod = "printUImm<" # I # ">"; 10067330f729Sjoerg let ParserMatchClass = 10077330f729Sjoerg !cast<AsmOperandClass>("ConstantUImm" # I # "AsmOperandClass"); 10087330f729Sjoerg } 10097330f729Sjoerg 10107330f729Sjoergforeach I = {1, 2, 3, 4, 5, 6, 8} in 10117330f729Sjoerg def vsplat_uimm # I : Operand<vAny> { 10127330f729Sjoerg let PrintMethod = "printUImm<" # I # ">"; 10137330f729Sjoerg let ParserMatchClass = 10147330f729Sjoerg !cast<AsmOperandClass>("ConstantUImm" # I # "AsmOperandClass"); 10157330f729Sjoerg } 10167330f729Sjoerg 10177330f729Sjoerg// Signed operands 10187330f729Sjoergforeach I = {4, 5, 6, 9, 10, 11} in 10197330f729Sjoerg def simm # I : Operand<i32> { 10207330f729Sjoerg let DecoderMethod = "DecodeSImmWithOffsetAndScale<" # I # ">"; 10217330f729Sjoerg let ParserMatchClass = 10227330f729Sjoerg !cast<AsmOperandClass>("ConstantSImm" # I # "AsmOperandClass"); 10237330f729Sjoerg } 10247330f729Sjoerg 10257330f729Sjoergforeach I = {1, 2, 3} in 10267330f729Sjoerg def simm10_lsl # I : Operand<i32> { 10277330f729Sjoerg let DecoderMethod = "DecodeSImmWithOffsetAndScale<10, " # I # ">"; 10287330f729Sjoerg let ParserMatchClass = 10297330f729Sjoerg !cast<AsmOperandClass>("ConstantSImm10Lsl" # I # "AsmOperandClass"); 10307330f729Sjoerg } 10317330f729Sjoerg 10327330f729Sjoergforeach I = {10} in 10337330f729Sjoerg def simm # I # _64 : Operand<i64> { 10347330f729Sjoerg let DecoderMethod = "DecodeSImmWithOffsetAndScale<" # I # ">"; 10357330f729Sjoerg let ParserMatchClass = 10367330f729Sjoerg !cast<AsmOperandClass>("ConstantSImm" # I # "AsmOperandClass"); 10377330f729Sjoerg } 10387330f729Sjoerg 10397330f729Sjoergforeach I = {5, 10} in 10407330f729Sjoerg def vsplat_simm # I : Operand<vAny> { 10417330f729Sjoerg let ParserMatchClass = 10427330f729Sjoerg !cast<AsmOperandClass>("ConstantSImm" # I # "AsmOperandClass"); 10437330f729Sjoerg } 10447330f729Sjoerg 10457330f729Sjoergdef simm7_lsl2 : Operand<OtherVT> { 10467330f729Sjoerg let EncoderMethod = "getSImm7Lsl2Encoding"; 10477330f729Sjoerg let DecoderMethod = "DecodeSImmWithOffsetAndScale<" # I # ", 0, 4>"; 10487330f729Sjoerg let ParserMatchClass = ConstantSImm7Lsl2AsmOperandClass; 10497330f729Sjoerg} 10507330f729Sjoerg 10517330f729Sjoergforeach I = {16, 32} in 10527330f729Sjoerg def simm # I : Operand<i32> { 10537330f729Sjoerg let DecoderMethod = "DecodeSImmWithOffsetAndScale<" # I # ">"; 10547330f729Sjoerg let ParserMatchClass = !cast<AsmOperandClass>("SImm" # I # "AsmOperandClass"); 10557330f729Sjoerg } 10567330f729Sjoerg 10577330f729Sjoerg// Like simm16 but coerces uimm16 to simm16. 10587330f729Sjoergdef simm16_relaxed : Operand<i32> { 10597330f729Sjoerg let DecoderMethod = "DecodeSImmWithOffsetAndScale<16>"; 1060*82d56013Sjoerg let ParserMatchClass = SImm16RelaxedAsmOperandClass; 10617330f729Sjoerg} 10627330f729Sjoerg 10637330f729Sjoergdef simm16_64 : Operand<i64> { 10647330f729Sjoerg let DecoderMethod = "DecodeSImmWithOffsetAndScale<16>"; 1065*82d56013Sjoerg let ParserMatchClass = SImm16AsmOperandClass; 10667330f729Sjoerg} 10677330f729Sjoerg 10687330f729Sjoerg// like simm32 but coerces simm32 to uimm32. 10697330f729Sjoergdef uimm32_coerced : Operand<i32> { 1070*82d56013Sjoerg let ParserMatchClass = UImm32CoercedAsmOperandClass; 10717330f729Sjoerg} 10727330f729Sjoerg// Like simm32 but coerces uimm32 to simm32. 10737330f729Sjoergdef simm32_relaxed : Operand<i32> { 10747330f729Sjoerg let DecoderMethod = "DecodeSImmWithOffsetAndScale<32>"; 1075*82d56013Sjoerg let ParserMatchClass = SImm32RelaxedAsmOperandClass; 10767330f729Sjoerg} 10777330f729Sjoerg 10787330f729Sjoerg// This is almost the same as a uimm7 but 0x7f is interpreted as -1. 10797330f729Sjoergdef li16_imm : Operand<i32> { 10807330f729Sjoerg let DecoderMethod = "DecodeLi16Imm"; 10817330f729Sjoerg let ParserMatchClass = ConstantUImm7Sub1AsmOperandClass; 10827330f729Sjoerg} 10837330f729Sjoerg 10847330f729Sjoergdef MipsMemAsmOperand : AsmOperandClass { 10857330f729Sjoerg let Name = "Mem"; 10867330f729Sjoerg let ParserMethod = "parseMemOperand"; 10877330f729Sjoerg} 10887330f729Sjoerg 1089*82d56013Sjoergclass MipsMemSimmAsmOperand<int Width, int Shift = 0> : AsmOperandClass { 1090*82d56013Sjoerg let Name = "MemOffsetSimm" # Width # "_" # Shift; 10917330f729Sjoerg let SuperClasses = [MipsMemAsmOperand]; 10927330f729Sjoerg let RenderMethod = "addMemOperands"; 10937330f729Sjoerg let ParserMethod = "parseMemOperand"; 1094*82d56013Sjoerg let PredicateMethod = "isMemWithSimmOffset<" # Width # ", " # Shift # ">"; 1095*82d56013Sjoerg let DiagnosticType = !if(!eq(Shift, 0), "MemSImm" # Width, 1096*82d56013Sjoerg "MemSImm" # Width # "Lsl" # Shift); 10977330f729Sjoerg} 10987330f729Sjoerg 10997330f729Sjoergdef MipsMemSimmPtrAsmOperand : AsmOperandClass { 11007330f729Sjoerg let Name = "MemOffsetSimmPtr"; 11017330f729Sjoerg let SuperClasses = [MipsMemAsmOperand]; 11027330f729Sjoerg let RenderMethod = "addMemOperands"; 11037330f729Sjoerg let ParserMethod = "parseMemOperand"; 11047330f729Sjoerg let PredicateMethod = "isMemWithPtrSizeOffset"; 11057330f729Sjoerg let DiagnosticType = "MemSImmPtr"; 11067330f729Sjoerg} 11077330f729Sjoerg 11087330f729Sjoergdef MipsInvertedImmoperand : AsmOperandClass { 11097330f729Sjoerg let Name = "InvNum"; 11107330f729Sjoerg let RenderMethod = "addImmOperands"; 11117330f729Sjoerg let ParserMethod = "parseInvNum"; 11127330f729Sjoerg} 11137330f729Sjoerg 11147330f729Sjoergdef InvertedImOperand : Operand<i32> { 11157330f729Sjoerg let ParserMatchClass = MipsInvertedImmoperand; 11167330f729Sjoerg} 11177330f729Sjoerg 11187330f729Sjoergdef InvertedImOperand64 : Operand<i64> { 11197330f729Sjoerg let ParserMatchClass = MipsInvertedImmoperand; 11207330f729Sjoerg} 11217330f729Sjoerg 11227330f729Sjoergclass mem_generic : Operand<iPTR> { 11237330f729Sjoerg let PrintMethod = "printMemOperand"; 11247330f729Sjoerg let MIOperandInfo = (ops ptr_rc, simm16); 11257330f729Sjoerg let EncoderMethod = "getMemEncoding"; 11267330f729Sjoerg let ParserMatchClass = MipsMemAsmOperand; 11277330f729Sjoerg let OperandType = "OPERAND_MEMORY"; 11287330f729Sjoerg} 11297330f729Sjoerg 11307330f729Sjoerg// Address operand 11317330f729Sjoergdef mem : mem_generic; 11327330f729Sjoerg 11337330f729Sjoerg// MSA specific address operand 11347330f729Sjoergdef mem_msa : mem_generic { 11357330f729Sjoerg let MIOperandInfo = (ops ptr_rc, simm10); 11367330f729Sjoerg let EncoderMethod = "getMSAMemEncoding"; 11377330f729Sjoerg} 11387330f729Sjoerg 11397330f729Sjoergdef simm12 : Operand<i32> { 11407330f729Sjoerg let DecoderMethod = "DecodeSimm12"; 11417330f729Sjoerg} 11427330f729Sjoerg 1143*82d56013Sjoergdef mem_simm9_exp : mem_generic { 11447330f729Sjoerg let MIOperandInfo = (ops ptr_rc, simm9); 1145*82d56013Sjoerg let ParserMatchClass = MipsMemSimmPtrAsmOperand; 1146*82d56013Sjoerg let OperandNamespace = "MipsII"; 1147*82d56013Sjoerg let OperandType = "OPERAND_MEM_SIMM9"; 11487330f729Sjoerg} 11497330f729Sjoerg 1150*82d56013Sjoergforeach I = {9, 10, 11, 12, 16} in 1151*82d56013Sjoerg def mem_simm # I : mem_generic { 1152*82d56013Sjoerg let MIOperandInfo = (ops ptr_rc, !cast<Operand>("simm" # I)); 1153*82d56013Sjoerg let ParserMatchClass = MipsMemSimmAsmOperand<I>; 11547330f729Sjoerg } 11557330f729Sjoerg 11567330f729Sjoergforeach I = {1, 2, 3} in 11577330f729Sjoerg def mem_simm10_lsl # I : mem_generic { 11587330f729Sjoerg let MIOperandInfo = (ops ptr_rc, !cast<Operand>("simm10_lsl" # I)); 11597330f729Sjoerg let EncoderMethod = "getMemEncoding<" # I # ">"; 1160*82d56013Sjoerg let ParserMatchClass = MipsMemSimmAsmOperand<10, I>; 11617330f729Sjoerg } 11627330f729Sjoerg 11637330f729Sjoergdef mem_simmptr : mem_generic { 11647330f729Sjoerg let ParserMatchClass = MipsMemSimmPtrAsmOperand; 11657330f729Sjoerg} 11667330f729Sjoerg 11677330f729Sjoergdef mem_ea : Operand<iPTR> { 11687330f729Sjoerg let PrintMethod = "printMemOperandEA"; 11697330f729Sjoerg let MIOperandInfo = (ops ptr_rc, simm16); 11707330f729Sjoerg let EncoderMethod = "getMemEncoding"; 11717330f729Sjoerg let OperandType = "OPERAND_MEMORY"; 11727330f729Sjoerg} 11737330f729Sjoerg 11747330f729Sjoergdef PtrRC : Operand<iPTR> { 11757330f729Sjoerg let MIOperandInfo = (ops ptr_rc); 11767330f729Sjoerg let DecoderMethod = "DecodePtrRegisterClass"; 11777330f729Sjoerg let ParserMatchClass = GPR32AsmOperand; 11787330f729Sjoerg} 11797330f729Sjoerg 11807330f729Sjoerg// size operand of ins instruction 11817330f729Sjoergdef size_ins : Operand<i32> { 11827330f729Sjoerg let EncoderMethod = "getSizeInsEncoding"; 11837330f729Sjoerg let DecoderMethod = "DecodeInsSize"; 11847330f729Sjoerg} 11857330f729Sjoerg 11867330f729Sjoerg// Transformation Function - get the lower 16 bits. 11877330f729Sjoergdef LO16 : SDNodeXForm<imm, [{ 11887330f729Sjoerg return getImm(N, N->getZExtValue() & 0xFFFF); 11897330f729Sjoerg}]>; 11907330f729Sjoerg 11917330f729Sjoerg// Transformation Function - get the higher 16 bits. 11927330f729Sjoergdef HI16 : SDNodeXForm<imm, [{ 11937330f729Sjoerg return getImm(N, (N->getZExtValue() >> 16) & 0xFFFF); 11947330f729Sjoerg}]>; 11957330f729Sjoerg 11967330f729Sjoerg// Plus 1. 11977330f729Sjoergdef Plus1 : SDNodeXForm<imm, [{ return getImm(N, N->getSExtValue() + 1); }]>; 11987330f729Sjoerg 11997330f729Sjoerg// Node immediate is zero (e.g. insve.d) 12007330f729Sjoergdef immz : PatLeaf<(imm), [{ return N->getSExtValue() == 0; }]>; 12017330f729Sjoerg 12027330f729Sjoerg// Node immediate fits as 16-bit sign extended on target immediate. 12037330f729Sjoerg// e.g. addi, andi 12047330f729Sjoergdef immSExt8 : PatLeaf<(imm), [{ return isInt<8>(N->getSExtValue()); }]>; 12057330f729Sjoerg 12067330f729Sjoerg// Node immediate fits as 16-bit sign extended on target immediate. 12077330f729Sjoerg// e.g. addi, andi 12087330f729Sjoergdef immSExt16 : PatLeaf<(imm), [{ return isInt<16>(N->getSExtValue()); }]>; 1209*82d56013Sjoergdef imm32SExt16 : IntImmLeaf<i32, [{ return isInt<16>(Imm.getSExtValue()); }]>; 12107330f729Sjoerg 12117330f729Sjoerg// Node immediate fits as 7-bit zero extended on target immediate. 12127330f729Sjoergdef immZExt7 : PatLeaf<(imm), [{ return isUInt<7>(N->getZExtValue()); }]>; 12137330f729Sjoergdef timmZExt7 : PatLeaf<(timm), [{ return isUInt<7>(N->getZExtValue()); }]>; 12147330f729Sjoerg 12157330f729Sjoerg// Node immediate fits as 16-bit zero extended on target immediate. 12167330f729Sjoerg// The LO16 param means that only the lower 16 bits of the node 12177330f729Sjoerg// immediate are caught. 12187330f729Sjoerg// e.g. addiu, sltiu 12197330f729Sjoergdef immZExt16 : PatLeaf<(imm), [{ 12207330f729Sjoerg if (N->getValueType(0) == MVT::i32) 12217330f729Sjoerg return (uint32_t)N->getZExtValue() == (unsigned short)N->getZExtValue(); 12227330f729Sjoerg else 12237330f729Sjoerg return (uint64_t)N->getZExtValue() == (unsigned short)N->getZExtValue(); 12247330f729Sjoerg}], LO16>; 1225*82d56013Sjoergdef imm32ZExt16 : IntImmLeaf<i32, [{ 1226*82d56013Sjoerg return (uint32_t)Imm.getZExtValue() == (unsigned short)Imm.getZExtValue(); 1227*82d56013Sjoerg}]>; 12287330f729Sjoerg 12297330f729Sjoerg// Immediate can be loaded with LUi (32-bit int with lower 16-bit cleared). 12307330f729Sjoergdef immSExt32Low16Zero : PatLeaf<(imm), [{ 12317330f729Sjoerg int64_t Val = N->getSExtValue(); 12327330f729Sjoerg return isInt<32>(Val) && !(Val & 0xffff); 12337330f729Sjoerg}]>; 12347330f729Sjoerg 12357330f729Sjoerg// Zero-extended 32-bit unsigned int with lower 16-bit cleared. 12367330f729Sjoergdef immZExt32Low16Zero : PatLeaf<(imm), [{ 12377330f729Sjoerg uint64_t Val = N->getZExtValue(); 12387330f729Sjoerg return isUInt<32>(Val) && !(Val & 0xffff); 12397330f729Sjoerg}]>; 12407330f729Sjoerg 12417330f729Sjoerg// Note immediate fits as a 32 bit signed extended on target immediate. 12427330f729Sjoergdef immSExt32 : PatLeaf<(imm), [{ return isInt<32>(N->getSExtValue()); }]>; 12437330f729Sjoerg 12447330f729Sjoerg// Note immediate fits as a 32 bit zero extended on target immediate. 12457330f729Sjoergdef immZExt32 : PatLeaf<(imm), [{ return isUInt<32>(N->getZExtValue()); }]>; 12467330f729Sjoerg 12477330f729Sjoerg// shamt field must fit in 5 bits. 12487330f729Sjoergdef immZExt5 : ImmLeaf<i32, [{return Imm == (Imm & 0x1f);}]>; 12497330f729Sjoergdef timmZExt5 : TImmLeaf<i32, [{return Imm == (Imm & 0x1f);}]>; 12507330f729Sjoerg 12517330f729Sjoergdef immZExt5Plus1 : PatLeaf<(imm), [{ 12527330f729Sjoerg return isUInt<5>(N->getZExtValue() - 1); 12537330f729Sjoerg}]>; 12547330f729Sjoergdef immZExt5Plus32 : PatLeaf<(imm), [{ 12557330f729Sjoerg return isUInt<5>(N->getZExtValue() - 32); 12567330f729Sjoerg}]>; 12577330f729Sjoergdef immZExt5Plus33 : PatLeaf<(imm), [{ 12587330f729Sjoerg return isUInt<5>(N->getZExtValue() - 33); 12597330f729Sjoerg}]>; 12607330f729Sjoerg 12617330f729Sjoergdef immZExt5To31 : SDNodeXForm<imm, [{ 12627330f729Sjoerg return getImm(N, 31 - N->getZExtValue()); 12637330f729Sjoerg}]>; 12647330f729Sjoerg 12657330f729Sjoerg// True if (N + 1) fits in 16-bit field. 12667330f729Sjoergdef immSExt16Plus1 : PatLeaf<(imm), [{ 12677330f729Sjoerg return isInt<17>(N->getSExtValue()) && isInt<16>(N->getSExtValue() + 1); 12687330f729Sjoerg}]>; 12697330f729Sjoerg 12707330f729Sjoergdef immZExtRange2To64 : PatLeaf<(imm), [{ 12717330f729Sjoerg return isUInt<7>(N->getZExtValue()) && (N->getZExtValue() >= 2) && 12727330f729Sjoerg (N->getZExtValue() <= 64); 12737330f729Sjoerg}]>; 12747330f729Sjoerg 12757330f729Sjoergdef ORiPred : PatLeaf<(imm), [{ 12767330f729Sjoerg return isUInt<16>(N->getZExtValue()) && !isInt<16>(N->getSExtValue()); 12777330f729Sjoerg}], LO16>; 12787330f729Sjoerg 12797330f729Sjoergdef LUiPred : PatLeaf<(imm), [{ 12807330f729Sjoerg int64_t Val = N->getSExtValue(); 12817330f729Sjoerg return !isInt<16>(Val) && isInt<32>(Val) && !(Val & 0xffff); 12827330f729Sjoerg}]>; 12837330f729Sjoerg 12847330f729Sjoergdef LUiORiPred : PatLeaf<(imm), [{ 12857330f729Sjoerg int64_t SVal = N->getSExtValue(); 12867330f729Sjoerg return isInt<32>(SVal) && (SVal & 0xffff); 12877330f729Sjoerg}]>; 12887330f729Sjoerg 1289*82d56013Sjoerg// Mips Address Mode! SDNode frameindex could possibly be a match 12907330f729Sjoerg// since load and store instructions from stack used it. 12917330f729Sjoergdef addr : 12927330f729Sjoerg ComplexPattern<iPTR, 2, "selectIntAddr", [frameindex]>; 12937330f729Sjoerg 12947330f729Sjoergdef addrRegImm : 12957330f729Sjoerg ComplexPattern<iPTR, 2, "selectAddrRegImm", [frameindex]>; 12967330f729Sjoerg 12977330f729Sjoergdef addrDefault : 12987330f729Sjoerg ComplexPattern<iPTR, 2, "selectAddrDefault", [frameindex]>; 12997330f729Sjoerg 13007330f729Sjoergdef addrimm10 : ComplexPattern<iPTR, 2, "selectIntAddrSImm10", [frameindex]>; 13017330f729Sjoergdef addrimm10lsl1 : ComplexPattern<iPTR, 2, "selectIntAddrSImm10Lsl1", 13027330f729Sjoerg [frameindex]>; 13037330f729Sjoergdef addrimm10lsl2 : ComplexPattern<iPTR, 2, "selectIntAddrSImm10Lsl2", 13047330f729Sjoerg [frameindex]>; 13057330f729Sjoergdef addrimm10lsl3 : ComplexPattern<iPTR, 2, "selectIntAddrSImm10Lsl3", 13067330f729Sjoerg [frameindex]>; 13077330f729Sjoerg 13087330f729Sjoerg//===----------------------------------------------------------------------===// 13097330f729Sjoerg// Instructions specific format 13107330f729Sjoerg//===----------------------------------------------------------------------===// 13117330f729Sjoerg 13127330f729Sjoerg// Arithmetic and logical instructions with 3 register operands. 13137330f729Sjoergclass ArithLogicR<string opstr, RegisterOperand RO, bit isComm = 0, 13147330f729Sjoerg InstrItinClass Itin = NoItinerary, 13157330f729Sjoerg SDPatternOperator OpNode = null_frag>: 13167330f729Sjoerg InstSE<(outs RO:$rd), (ins RO:$rs, RO:$rt), 13177330f729Sjoerg !strconcat(opstr, "\t$rd, $rs, $rt"), 13187330f729Sjoerg [(set RO:$rd, (OpNode RO:$rs, RO:$rt))], Itin, FrmR, opstr> { 13197330f729Sjoerg let isCommutable = isComm; 13207330f729Sjoerg let isReMaterializable = 1; 13217330f729Sjoerg let TwoOperandAliasConstraint = "$rd = $rs"; 13227330f729Sjoerg} 13237330f729Sjoerg 13247330f729Sjoerg// Arithmetic and logical instructions with 2 register operands. 13257330f729Sjoergclass ArithLogicI<string opstr, Operand Od, RegisterOperand RO, 13267330f729Sjoerg InstrItinClass Itin = NoItinerary, 13277330f729Sjoerg SDPatternOperator imm_type = null_frag, 13287330f729Sjoerg SDPatternOperator OpNode = null_frag> : 13297330f729Sjoerg InstSE<(outs RO:$rt), (ins RO:$rs, Od:$imm16), 13307330f729Sjoerg !strconcat(opstr, "\t$rt, $rs, $imm16"), 13317330f729Sjoerg [(set RO:$rt, (OpNode RO:$rs, imm_type:$imm16))], 13327330f729Sjoerg Itin, FrmI, opstr> { 13337330f729Sjoerg let isReMaterializable = 1; 13347330f729Sjoerg let TwoOperandAliasConstraint = "$rs = $rt"; 13357330f729Sjoerg} 13367330f729Sjoerg 13377330f729Sjoerg// Arithmetic Multiply ADD/SUB 13387330f729Sjoergclass MArithR<string opstr, InstrItinClass itin, bit isComm = 0> : 13397330f729Sjoerg InstSE<(outs), (ins GPR32Opnd:$rs, GPR32Opnd:$rt), 13407330f729Sjoerg !strconcat(opstr, "\t$rs, $rt"), [], itin, FrmR, opstr> { 13417330f729Sjoerg let Defs = [HI0, LO0]; 13427330f729Sjoerg let Uses = [HI0, LO0]; 13437330f729Sjoerg let isCommutable = isComm; 13447330f729Sjoerg} 13457330f729Sjoerg 13467330f729Sjoerg// Logical 13477330f729Sjoergclass LogicNOR<string opstr, RegisterOperand RO>: 13487330f729Sjoerg InstSE<(outs RO:$rd), (ins RO:$rs, RO:$rt), 13497330f729Sjoerg !strconcat(opstr, "\t$rd, $rs, $rt"), 13507330f729Sjoerg [(set RO:$rd, (not (or RO:$rs, RO:$rt)))], II_NOR, FrmR, opstr> { 13517330f729Sjoerg let isCommutable = 1; 13527330f729Sjoerg} 13537330f729Sjoerg 13547330f729Sjoerg// Shifts 13557330f729Sjoergclass shift_rotate_imm<string opstr, Operand ImmOpnd, 13567330f729Sjoerg RegisterOperand RO, InstrItinClass itin, 13577330f729Sjoerg SDPatternOperator OpNode = null_frag, 13587330f729Sjoerg SDPatternOperator PF = null_frag> : 13597330f729Sjoerg InstSE<(outs RO:$rd), (ins RO:$rt, ImmOpnd:$shamt), 13607330f729Sjoerg !strconcat(opstr, "\t$rd, $rt, $shamt"), 13617330f729Sjoerg [(set RO:$rd, (OpNode RO:$rt, PF:$shamt))], itin, FrmR, opstr> { 13627330f729Sjoerg let TwoOperandAliasConstraint = "$rt = $rd"; 13637330f729Sjoerg} 13647330f729Sjoerg 13657330f729Sjoergclass shift_rotate_reg<string opstr, RegisterOperand RO, InstrItinClass itin, 13667330f729Sjoerg SDPatternOperator OpNode = null_frag>: 13677330f729Sjoerg InstSE<(outs RO:$rd), (ins RO:$rt, GPR32Opnd:$rs), 13687330f729Sjoerg !strconcat(opstr, "\t$rd, $rt, $rs"), 13697330f729Sjoerg [(set RO:$rd, (OpNode RO:$rt, GPR32Opnd:$rs))], itin, FrmR, 13707330f729Sjoerg opstr>; 13717330f729Sjoerg 13727330f729Sjoerg// Load Upper Immediate 13737330f729Sjoergclass LoadUpper<string opstr, RegisterOperand RO, Operand Imm>: 13747330f729Sjoerg InstSE<(outs RO:$rt), (ins Imm:$imm16), !strconcat(opstr, "\t$rt, $imm16"), 13757330f729Sjoerg [], II_LUI, FrmI, opstr>, IsAsCheapAsAMove { 13767330f729Sjoerg let hasSideEffects = 0; 13777330f729Sjoerg let isReMaterializable = 1; 13787330f729Sjoerg} 13797330f729Sjoerg 13807330f729Sjoerg// Memory Load/Store 13817330f729Sjoergclass LoadMemory<string opstr, DAGOperand RO, DAGOperand MO, 13827330f729Sjoerg SDPatternOperator OpNode = null_frag, 13837330f729Sjoerg InstrItinClass Itin = NoItinerary, 13847330f729Sjoerg ComplexPattern Addr = addr> : 13857330f729Sjoerg InstSE<(outs RO:$rt), (ins MO:$addr), !strconcat(opstr, "\t$rt, $addr"), 13867330f729Sjoerg [(set RO:$rt, (OpNode Addr:$addr))], Itin, FrmI, opstr> { 13877330f729Sjoerg let DecoderMethod = "DecodeMem"; 13887330f729Sjoerg let canFoldAsLoad = 1; 13897330f729Sjoerg string BaseOpcode = opstr; 13907330f729Sjoerg let mayLoad = 1; 13917330f729Sjoerg} 13927330f729Sjoerg 13937330f729Sjoergclass Load<string opstr, DAGOperand RO, SDPatternOperator OpNode = null_frag, 13947330f729Sjoerg InstrItinClass Itin = NoItinerary, ComplexPattern Addr = addr> : 13957330f729Sjoerg LoadMemory<opstr, RO, mem, OpNode, Itin, Addr>; 13967330f729Sjoerg 13977330f729Sjoergclass StoreMemory<string opstr, DAGOperand RO, DAGOperand MO, 13987330f729Sjoerg SDPatternOperator OpNode = null_frag, 13997330f729Sjoerg InstrItinClass Itin = NoItinerary, ComplexPattern Addr = addr> : 14007330f729Sjoerg InstSE<(outs), (ins RO:$rt, MO:$addr), !strconcat(opstr, "\t$rt, $addr"), 14017330f729Sjoerg [(OpNode RO:$rt, Addr:$addr)], Itin, FrmI, opstr> { 14027330f729Sjoerg let DecoderMethod = "DecodeMem"; 14037330f729Sjoerg string BaseOpcode = opstr; 14047330f729Sjoerg let mayStore = 1; 14057330f729Sjoerg} 14067330f729Sjoerg 14077330f729Sjoergclass Store<string opstr, DAGOperand RO, SDPatternOperator OpNode = null_frag, 14087330f729Sjoerg InstrItinClass Itin = NoItinerary, ComplexPattern Addr = addr, 14097330f729Sjoerg DAGOperand MO = mem> : 14107330f729Sjoerg StoreMemory<opstr, RO, MO, OpNode, Itin, Addr>; 14117330f729Sjoerg 14127330f729Sjoerg// Load/Store Left/Right 14137330f729Sjoerglet canFoldAsLoad = 1 in 14147330f729Sjoergclass LoadLeftRight<string opstr, SDNode OpNode, RegisterOperand RO, 14157330f729Sjoerg InstrItinClass Itin> : 14167330f729Sjoerg InstSE<(outs RO:$rt), (ins mem:$addr, RO:$src), 14177330f729Sjoerg !strconcat(opstr, "\t$rt, $addr"), 14187330f729Sjoerg [(set RO:$rt, (OpNode addr:$addr, RO:$src))], Itin, FrmI> { 14197330f729Sjoerg let DecoderMethod = "DecodeMem"; 14207330f729Sjoerg string Constraints = "$src = $rt"; 14217330f729Sjoerg let BaseOpcode = opstr; 14227330f729Sjoerg} 14237330f729Sjoerg 14247330f729Sjoergclass StoreLeftRight<string opstr, SDNode OpNode, RegisterOperand RO, 14257330f729Sjoerg InstrItinClass Itin> : 14267330f729Sjoerg InstSE<(outs), (ins RO:$rt, mem:$addr), !strconcat(opstr, "\t$rt, $addr"), 14277330f729Sjoerg [(OpNode RO:$rt, addr:$addr)], Itin, FrmI> { 14287330f729Sjoerg let DecoderMethod = "DecodeMem"; 14297330f729Sjoerg let BaseOpcode = opstr; 14307330f729Sjoerg} 14317330f729Sjoerg 14327330f729Sjoerg// COP2 Load/Store 14337330f729Sjoergclass LW_FT2<string opstr, RegisterOperand RC, InstrItinClass Itin, 14347330f729Sjoerg SDPatternOperator OpNode= null_frag> : 14357330f729Sjoerg InstSE<(outs RC:$rt), (ins mem_simm16:$addr), 14367330f729Sjoerg !strconcat(opstr, "\t$rt, $addr"), 14377330f729Sjoerg [(set RC:$rt, (OpNode addrDefault:$addr))], Itin, FrmFI, opstr> { 14387330f729Sjoerg let DecoderMethod = "DecodeFMem2"; 14397330f729Sjoerg let mayLoad = 1; 14407330f729Sjoerg} 14417330f729Sjoerg 14427330f729Sjoergclass SW_FT2<string opstr, RegisterOperand RC, InstrItinClass Itin, 14437330f729Sjoerg SDPatternOperator OpNode= null_frag> : 14447330f729Sjoerg InstSE<(outs), (ins RC:$rt, mem_simm16:$addr), 14457330f729Sjoerg !strconcat(opstr, "\t$rt, $addr"), 14467330f729Sjoerg [(OpNode RC:$rt, addrDefault:$addr)], Itin, FrmFI, opstr> { 14477330f729Sjoerg let DecoderMethod = "DecodeFMem2"; 14487330f729Sjoerg let mayStore = 1; 14497330f729Sjoerg} 14507330f729Sjoerg 14517330f729Sjoerg// COP3 Load/Store 14527330f729Sjoergclass LW_FT3<string opstr, RegisterOperand RC, InstrItinClass Itin, 14537330f729Sjoerg SDPatternOperator OpNode= null_frag> : 14547330f729Sjoerg InstSE<(outs RC:$rt), (ins mem:$addr), !strconcat(opstr, "\t$rt, $addr"), 14557330f729Sjoerg [(set RC:$rt, (OpNode addrDefault:$addr))], Itin, FrmFI, opstr> { 14567330f729Sjoerg let DecoderMethod = "DecodeFMem3"; 14577330f729Sjoerg let mayLoad = 1; 14587330f729Sjoerg} 14597330f729Sjoerg 14607330f729Sjoergclass SW_FT3<string opstr, RegisterOperand RC, InstrItinClass Itin, 14617330f729Sjoerg SDPatternOperator OpNode= null_frag> : 14627330f729Sjoerg InstSE<(outs), (ins RC:$rt, mem:$addr), !strconcat(opstr, "\t$rt, $addr"), 14637330f729Sjoerg [(OpNode RC:$rt, addrDefault:$addr)], Itin, FrmFI, opstr> { 14647330f729Sjoerg let DecoderMethod = "DecodeFMem3"; 14657330f729Sjoerg let mayStore = 1; 14667330f729Sjoerg} 14677330f729Sjoerg 14687330f729Sjoerg// Conditional Branch 14697330f729Sjoergclass CBranch<string opstr, DAGOperand opnd, PatFrag cond_op, 14707330f729Sjoerg RegisterOperand RO> : 14717330f729Sjoerg InstSE<(outs), (ins RO:$rs, RO:$rt, opnd:$offset), 14727330f729Sjoerg !strconcat(opstr, "\t$rs, $rt, $offset"), 14737330f729Sjoerg [(brcond (i32 (cond_op RO:$rs, RO:$rt)), bb:$offset)], II_BCC, 14747330f729Sjoerg FrmI, opstr> { 14757330f729Sjoerg let isBranch = 1; 14767330f729Sjoerg let isTerminator = 1; 14777330f729Sjoerg let hasDelaySlot = 1; 14787330f729Sjoerg let Defs = [AT]; 14797330f729Sjoerg bit isCTI = 1; 14807330f729Sjoerg} 14817330f729Sjoerg 14827330f729Sjoergclass CBranchLikely<string opstr, DAGOperand opnd, RegisterOperand RO> : 14837330f729Sjoerg InstSE<(outs), (ins RO:$rs, RO:$rt, opnd:$offset), 14847330f729Sjoerg !strconcat(opstr, "\t$rs, $rt, $offset"), [], II_BCC, FrmI, opstr> { 14857330f729Sjoerg let isBranch = 1; 14867330f729Sjoerg let isTerminator = 1; 14877330f729Sjoerg let hasDelaySlot = 1; 14887330f729Sjoerg let Defs = [AT]; 14897330f729Sjoerg bit isCTI = 1; 14907330f729Sjoerg} 14917330f729Sjoerg 14927330f729Sjoergclass CBranchZero<string opstr, DAGOperand opnd, PatFrag cond_op, 14937330f729Sjoerg RegisterOperand RO> : 14947330f729Sjoerg InstSE<(outs), (ins RO:$rs, opnd:$offset), 14957330f729Sjoerg !strconcat(opstr, "\t$rs, $offset"), 14967330f729Sjoerg [(brcond (i32 (cond_op RO:$rs, 0)), bb:$offset)], II_BCCZ, 14977330f729Sjoerg FrmI, opstr> { 14987330f729Sjoerg let isBranch = 1; 14997330f729Sjoerg let isTerminator = 1; 15007330f729Sjoerg let hasDelaySlot = 1; 15017330f729Sjoerg let Defs = [AT]; 15027330f729Sjoerg bit isCTI = 1; 15037330f729Sjoerg} 15047330f729Sjoerg 15057330f729Sjoergclass CBranchZeroLikely<string opstr, DAGOperand opnd, RegisterOperand RO> : 15067330f729Sjoerg InstSE<(outs), (ins RO:$rs, opnd:$offset), 15077330f729Sjoerg !strconcat(opstr, "\t$rs, $offset"), [], II_BCCZ, FrmI, opstr> { 15087330f729Sjoerg let isBranch = 1; 15097330f729Sjoerg let isTerminator = 1; 15107330f729Sjoerg let hasDelaySlot = 1; 15117330f729Sjoerg let Defs = [AT]; 15127330f729Sjoerg bit isCTI = 1; 15137330f729Sjoerg} 15147330f729Sjoerg 15157330f729Sjoerg// SetCC 15167330f729Sjoergclass SetCC_R<string opstr, PatFrag cond_op, RegisterOperand RO> : 15177330f729Sjoerg InstSE<(outs GPR32Opnd:$rd), (ins RO:$rs, RO:$rt), 15187330f729Sjoerg !strconcat(opstr, "\t$rd, $rs, $rt"), 15197330f729Sjoerg [(set GPR32Opnd:$rd, (cond_op RO:$rs, RO:$rt))], 15207330f729Sjoerg II_SLT_SLTU, FrmR, opstr>; 15217330f729Sjoerg 15227330f729Sjoergclass SetCC_I<string opstr, PatFrag cond_op, Operand Od, PatLeaf imm_type, 15237330f729Sjoerg RegisterOperand RO>: 15247330f729Sjoerg InstSE<(outs GPR32Opnd:$rt), (ins RO:$rs, Od:$imm16), 15257330f729Sjoerg !strconcat(opstr, "\t$rt, $rs, $imm16"), 15267330f729Sjoerg [(set GPR32Opnd:$rt, (cond_op RO:$rs, imm_type:$imm16))], 15277330f729Sjoerg II_SLTI_SLTIU, FrmI, opstr>; 15287330f729Sjoerg 15297330f729Sjoerg// Jump 15307330f729Sjoergclass JumpFJ<DAGOperand opnd, string opstr, SDPatternOperator operator, 15317330f729Sjoerg SDPatternOperator targetoperator, string bopstr> : 15327330f729Sjoerg InstSE<(outs), (ins opnd:$target), !strconcat(opstr, "\t$target"), 15337330f729Sjoerg [(operator targetoperator:$target)], II_J, FrmJ, bopstr> { 15347330f729Sjoerg let isTerminator=1; 15357330f729Sjoerg let isBarrier=1; 15367330f729Sjoerg let hasDelaySlot = 1; 15377330f729Sjoerg let DecoderMethod = "DecodeJumpTarget"; 15387330f729Sjoerg let Defs = [AT]; 15397330f729Sjoerg bit isCTI = 1; 15407330f729Sjoerg} 15417330f729Sjoerg 15427330f729Sjoerg// Unconditional branch 15437330f729Sjoergclass UncondBranch<Instruction BEQInst, DAGOperand opnd> : 15447330f729Sjoerg PseudoSE<(outs), (ins brtarget:$offset), [(br bb:$offset)], II_B>, 15457330f729Sjoerg PseudoInstExpansion<(BEQInst ZERO, ZERO, opnd:$offset)> { 15467330f729Sjoerg let isBranch = 1; 15477330f729Sjoerg let isTerminator = 1; 15487330f729Sjoerg let isBarrier = 1; 15497330f729Sjoerg let hasDelaySlot = 1; 15507330f729Sjoerg let AdditionalPredicates = [RelocPIC]; 15517330f729Sjoerg let Defs = [AT]; 15527330f729Sjoerg bit isCTI = 1; 15537330f729Sjoerg} 15547330f729Sjoerg 15557330f729Sjoerg// Base class for indirect branch and return instruction classes. 15567330f729Sjoerglet isTerminator=1, isBarrier=1, hasDelaySlot = 1, isCTI = 1 in 15577330f729Sjoergclass JumpFR<string opstr, RegisterOperand RO, 15587330f729Sjoerg SDPatternOperator operator = null_frag>: 15597330f729Sjoerg InstSE<(outs), (ins RO:$rs), "jr\t$rs", [(operator RO:$rs)], II_JR, 15607330f729Sjoerg FrmR, opstr>; 15617330f729Sjoerg 15627330f729Sjoerg// Indirect branch 15637330f729Sjoergclass IndirectBranch<string opstr, RegisterOperand RO> : JumpFR<opstr, RO> { 15647330f729Sjoerg let isBranch = 1; 15657330f729Sjoerg let isIndirectBranch = 1; 15667330f729Sjoerg} 15677330f729Sjoerg 15687330f729Sjoerg// Jump and Link (Call) 15697330f729Sjoerglet isCall=1, hasDelaySlot=1, isCTI=1, Defs = [RA] in { 15707330f729Sjoerg class JumpLink<string opstr, DAGOperand opnd> : 15717330f729Sjoerg InstSE<(outs), (ins opnd:$target), !strconcat(opstr, "\t$target"), 15727330f729Sjoerg [(MipsJmpLink tglobaladdr:$target)], II_JAL, FrmJ, opstr> { 15737330f729Sjoerg let DecoderMethod = "DecodeJumpTarget"; 15747330f729Sjoerg } 15757330f729Sjoerg 15767330f729Sjoerg class JumpLinkRegPseudo<RegisterOperand RO, Instruction JALRInst, 15777330f729Sjoerg Register RetReg, RegisterOperand ResRO = RO>: 15787330f729Sjoerg PseudoSE<(outs), (ins RO:$rs), [(MipsJmpLink RO:$rs)], II_JALR>, 15797330f729Sjoerg PseudoInstExpansion<(JALRInst RetReg, ResRO:$rs)> { 15807330f729Sjoerg let hasPostISelHook = 1; 15817330f729Sjoerg } 15827330f729Sjoerg 15837330f729Sjoerg class JumpLinkReg<string opstr, RegisterOperand RO>: 15847330f729Sjoerg InstSE<(outs RO:$rd), (ins RO:$rs), !strconcat(opstr, "\t$rd, $rs"), 15857330f729Sjoerg [], II_JALR, FrmR, opstr> { 15867330f729Sjoerg let hasPostISelHook = 1; 15877330f729Sjoerg } 15887330f729Sjoerg 15897330f729Sjoerg class BGEZAL_FT<string opstr, DAGOperand opnd, 15907330f729Sjoerg RegisterOperand RO> : 15917330f729Sjoerg InstSE<(outs), (ins RO:$rs, opnd:$offset), 15927330f729Sjoerg !strconcat(opstr, "\t$rs, $offset"), [], II_BCCZAL, FrmI, opstr> { 15937330f729Sjoerg let hasDelaySlot = 1; 15947330f729Sjoerg } 15957330f729Sjoerg 15967330f729Sjoerg} 15977330f729Sjoerg 15987330f729Sjoerglet isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, hasDelaySlot = 1, 15997330f729Sjoerg hasExtraSrcRegAllocReq = 1, isCTI = 1, Defs = [AT] in { 16007330f729Sjoerg class TailCall<Instruction JumpInst, DAGOperand Opnd> : 16017330f729Sjoerg PseudoSE<(outs), (ins calltarget:$target), [], II_J>, 16027330f729Sjoerg PseudoInstExpansion<(JumpInst Opnd:$target)>; 16037330f729Sjoerg 16047330f729Sjoerg class TailCallReg<Instruction JumpInst, RegisterOperand RO> : 16057330f729Sjoerg PseudoSE<(outs), (ins RO:$rs), [(MipsTailCall RO:$rs)], II_JR>, 16067330f729Sjoerg PseudoInstExpansion<(JumpInst RO:$rs)> { 16077330f729Sjoerg let hasPostISelHook = 1; 16087330f729Sjoerg } 16097330f729Sjoerg} 16107330f729Sjoerg 16117330f729Sjoergclass BAL_BR_Pseudo<Instruction RealInst, DAGOperand opnd> : 16127330f729Sjoerg PseudoSE<(outs), (ins opnd:$offset), [], II_BCCZAL>, 16137330f729Sjoerg PseudoInstExpansion<(RealInst ZERO, opnd:$offset)> { 16147330f729Sjoerg let isBranch = 1; 16157330f729Sjoerg let isTerminator = 1; 16167330f729Sjoerg let isBarrier = 1; 16177330f729Sjoerg let hasDelaySlot = 1; 16187330f729Sjoerg let Defs = [RA]; 16197330f729Sjoerg bit isCTI = 1; 16207330f729Sjoerg} 16217330f729Sjoerg 16227330f729Sjoerglet isCTI = 1 in { 16237330f729Sjoerg// Syscall 16247330f729Sjoergclass SYS_FT<string opstr, Operand ImmOp, InstrItinClass itin = NoItinerary> : 16257330f729Sjoerg InstSE<(outs), (ins ImmOp:$code_), 16267330f729Sjoerg !strconcat(opstr, "\t$code_"), [], itin, FrmI, opstr>; 16277330f729Sjoerg// Break 16287330f729Sjoergclass BRK_FT<string opstr> : 16297330f729Sjoerg InstSE<(outs), (ins uimm10:$code_1, uimm10:$code_2), 16307330f729Sjoerg !strconcat(opstr, "\t$code_1, $code_2"), [], II_BREAK, 16317330f729Sjoerg FrmOther, opstr>; 16327330f729Sjoerg 16337330f729Sjoerg// (D)Eret 16347330f729Sjoergclass ER_FT<string opstr, InstrItinClass itin = NoItinerary> : 16357330f729Sjoerg InstSE<(outs), (ins), 16367330f729Sjoerg opstr, [], itin, FrmOther, opstr>; 16377330f729Sjoerg 16387330f729Sjoerg// Wait 16397330f729Sjoergclass WAIT_FT<string opstr> : 16407330f729Sjoerg InstSE<(outs), (ins), opstr, [], II_WAIT, FrmOther, opstr>; 16417330f729Sjoerg} 16427330f729Sjoerg 16437330f729Sjoerg// Interrupts 16447330f729Sjoergclass DEI_FT<string opstr, RegisterOperand RO, 16457330f729Sjoerg InstrItinClass itin = NoItinerary> : 16467330f729Sjoerg InstSE<(outs RO:$rt), (ins), 16477330f729Sjoerg !strconcat(opstr, "\t$rt"), [], itin, FrmOther, opstr>; 16487330f729Sjoerg 16497330f729Sjoerg// Sync 16507330f729Sjoerglet hasSideEffects = 1 in 16517330f729Sjoergclass SYNC_FT<string opstr> : 16527330f729Sjoerg InstSE<(outs), (ins uimm5:$stype), "sync $stype", 16537330f729Sjoerg [(MipsSync immZExt5:$stype)], II_SYNC, FrmOther, opstr>; 16547330f729Sjoerg 16557330f729Sjoergclass SYNCI_FT<string opstr, DAGOperand MO> : 16567330f729Sjoerg InstSE<(outs), (ins MO:$addr), !strconcat(opstr, "\t$addr"), [], 16577330f729Sjoerg II_SYNCI, FrmOther, opstr> { 16587330f729Sjoerg let hasSideEffects = 1; 16597330f729Sjoerg let DecoderMethod = "DecodeSyncI"; 16607330f729Sjoerg} 16617330f729Sjoerg 16627330f729Sjoerglet hasSideEffects = 1, isCTI = 1 in { 16637330f729Sjoergclass TEQ_FT<string opstr, RegisterOperand RO, Operand ImmOp, 16647330f729Sjoerg InstrItinClass itin = NoItinerary> : 16657330f729Sjoerg InstSE<(outs), (ins RO:$rs, RO:$rt, ImmOp:$code_), 16667330f729Sjoerg !strconcat(opstr, "\t$rs, $rt, $code_"), [], itin, FrmI, opstr>; 16677330f729Sjoerg 16687330f729Sjoergclass TEQI_FT<string opstr, RegisterOperand RO, 16697330f729Sjoerg InstrItinClass itin = NoItinerary> : 16707330f729Sjoerg InstSE<(outs), (ins RO:$rs, simm16:$imm16), 16717330f729Sjoerg !strconcat(opstr, "\t$rs, $imm16"), [], itin, FrmOther, opstr>; 16727330f729Sjoerg} 16737330f729Sjoerg 16747330f729Sjoerg// Mul, Div 16757330f729Sjoergclass Mult<string opstr, InstrItinClass itin, RegisterOperand RO, 16767330f729Sjoerg list<Register> DefRegs> : 16777330f729Sjoerg InstSE<(outs), (ins RO:$rs, RO:$rt), !strconcat(opstr, "\t$rs, $rt"), [], 16787330f729Sjoerg itin, FrmR, opstr> { 16797330f729Sjoerg let isCommutable = 1; 16807330f729Sjoerg let Defs = DefRegs; 16817330f729Sjoerg let hasSideEffects = 0; 16827330f729Sjoerg} 16837330f729Sjoerg 16847330f729Sjoerg// Pseudo multiply/divide instruction with explicit accumulator register 16857330f729Sjoerg// operands. 16867330f729Sjoergclass MultDivPseudo<Instruction RealInst, RegisterClass R0, RegisterOperand R1, 16877330f729Sjoerg SDPatternOperator OpNode, InstrItinClass Itin, 16887330f729Sjoerg bit IsComm = 1, bit HasSideEffects = 0, 16897330f729Sjoerg bit UsesCustomInserter = 0> : 16907330f729Sjoerg PseudoSE<(outs R0:$ac), (ins R1:$rs, R1:$rt), 16917330f729Sjoerg [(set R0:$ac, (OpNode R1:$rs, R1:$rt))], Itin>, 16927330f729Sjoerg PseudoInstExpansion<(RealInst R1:$rs, R1:$rt)> { 16937330f729Sjoerg let isCommutable = IsComm; 16947330f729Sjoerg let hasSideEffects = HasSideEffects; 16957330f729Sjoerg let usesCustomInserter = UsesCustomInserter; 16967330f729Sjoerg} 16977330f729Sjoerg 16987330f729Sjoerg// Pseudo multiply add/sub instruction with explicit accumulator register 16997330f729Sjoerg// operands. 17007330f729Sjoergclass MAddSubPseudo<Instruction RealInst, SDPatternOperator OpNode, 17017330f729Sjoerg InstrItinClass itin> 17027330f729Sjoerg : PseudoSE<(outs ACC64:$ac), 17037330f729Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt, ACC64:$acin), 17047330f729Sjoerg [(set ACC64:$ac, 17057330f729Sjoerg (OpNode GPR32Opnd:$rs, GPR32Opnd:$rt, ACC64:$acin))], 17067330f729Sjoerg itin>, 17077330f729Sjoerg PseudoInstExpansion<(RealInst GPR32Opnd:$rs, GPR32Opnd:$rt)> { 17087330f729Sjoerg string Constraints = "$acin = $ac"; 17097330f729Sjoerg} 17107330f729Sjoerg 17117330f729Sjoergclass Div<string opstr, InstrItinClass itin, RegisterOperand RO, 17127330f729Sjoerg list<Register> DefRegs> : 17137330f729Sjoerg InstSE<(outs), (ins RO:$rs, RO:$rt), !strconcat(opstr, "\t$$zero, $rs, $rt"), 17147330f729Sjoerg [], itin, FrmR, opstr> { 17157330f729Sjoerg let Defs = DefRegs; 17167330f729Sjoerg} 17177330f729Sjoerg 17187330f729Sjoerg// Move from Hi/Lo 17197330f729Sjoergclass PseudoMFLOHI<RegisterClass DstRC, RegisterClass SrcRC, SDNode OpNode> 17207330f729Sjoerg : PseudoSE<(outs DstRC:$rd), (ins SrcRC:$hilo), 17217330f729Sjoerg [(set DstRC:$rd, (OpNode SrcRC:$hilo))], II_MFHI_MFLO>; 17227330f729Sjoerg 17237330f729Sjoergclass MoveFromLOHI<string opstr, RegisterOperand RO, Register UseReg>: 17247330f729Sjoerg InstSE<(outs RO:$rd), (ins), !strconcat(opstr, "\t$rd"), [], II_MFHI_MFLO, 17257330f729Sjoerg FrmR, opstr> { 17267330f729Sjoerg let Uses = [UseReg]; 17277330f729Sjoerg let hasSideEffects = 0; 17287330f729Sjoerg let isMoveReg = 1; 17297330f729Sjoerg} 17307330f729Sjoerg 17317330f729Sjoergclass PseudoMTLOHI<RegisterClass DstRC, RegisterClass SrcRC> 17327330f729Sjoerg : PseudoSE<(outs DstRC:$lohi), (ins SrcRC:$lo, SrcRC:$hi), 17337330f729Sjoerg [(set DstRC:$lohi, (MipsMTLOHI SrcRC:$lo, SrcRC:$hi))], 17347330f729Sjoerg II_MTHI_MTLO>; 17357330f729Sjoerg 17367330f729Sjoergclass MoveToLOHI<string opstr, RegisterOperand RO, list<Register> DefRegs>: 17377330f729Sjoerg InstSE<(outs), (ins RO:$rs), !strconcat(opstr, "\t$rs"), [], II_MTHI_MTLO, 17387330f729Sjoerg FrmR, opstr> { 17397330f729Sjoerg let Defs = DefRegs; 17407330f729Sjoerg let hasSideEffects = 0; 17417330f729Sjoerg let isMoveReg = 1; 17427330f729Sjoerg} 17437330f729Sjoerg 17447330f729Sjoergclass EffectiveAddress<string opstr, RegisterOperand RO> : 17457330f729Sjoerg InstSE<(outs RO:$rt), (ins mem_ea:$addr), !strconcat(opstr, "\t$rt, $addr"), 17467330f729Sjoerg [(set RO:$rt, addr:$addr)], II_ADDIU, FrmI, 17477330f729Sjoerg !strconcat(opstr, "_lea")> { 17487330f729Sjoerg let isCodeGenOnly = 1; 17497330f729Sjoerg let hasNoSchedulingInfo = 1; 17507330f729Sjoerg let DecoderMethod = "DecodeMem"; 17517330f729Sjoerg} 17527330f729Sjoerg 17537330f729Sjoerg// Count Leading Ones/Zeros in Word 17547330f729Sjoergclass CountLeading0<string opstr, RegisterOperand RO, 17557330f729Sjoerg InstrItinClass itin = NoItinerary>: 17567330f729Sjoerg InstSE<(outs RO:$rd), (ins RO:$rs), !strconcat(opstr, "\t$rd, $rs"), 17577330f729Sjoerg [(set RO:$rd, (ctlz RO:$rs))], itin, FrmR, opstr>; 17587330f729Sjoerg 17597330f729Sjoergclass CountLeading1<string opstr, RegisterOperand RO, 17607330f729Sjoerg InstrItinClass itin = NoItinerary>: 17617330f729Sjoerg InstSE<(outs RO:$rd), (ins RO:$rs), !strconcat(opstr, "\t$rd, $rs"), 17627330f729Sjoerg [(set RO:$rd, (ctlz (not RO:$rs)))], itin, FrmR, opstr>; 17637330f729Sjoerg 17647330f729Sjoerg// Sign Extend in Register. 17657330f729Sjoergclass SignExtInReg<string opstr, ValueType vt, RegisterOperand RO, 17667330f729Sjoerg InstrItinClass itin> : 17677330f729Sjoerg InstSE<(outs RO:$rd), (ins RO:$rt), !strconcat(opstr, "\t$rd, $rt"), 17687330f729Sjoerg [(set RO:$rd, (sext_inreg RO:$rt, vt))], itin, FrmR, opstr>; 17697330f729Sjoerg 17707330f729Sjoerg// Subword Swap 17717330f729Sjoergclass SubwordSwap<string opstr, RegisterOperand RO, 17727330f729Sjoerg InstrItinClass itin = NoItinerary>: 17737330f729Sjoerg InstSE<(outs RO:$rd), (ins RO:$rt), !strconcat(opstr, "\t$rd, $rt"), [], itin, 17747330f729Sjoerg FrmR, opstr> { 17757330f729Sjoerg let hasSideEffects = 0; 17767330f729Sjoerg} 17777330f729Sjoerg 17787330f729Sjoerg// Read Hardware 17797330f729Sjoergclass ReadHardware<RegisterOperand CPURegOperand, RegisterOperand RO> : 17807330f729Sjoerg InstSE<(outs CPURegOperand:$rt), (ins RO:$rd, uimm8:$sel), 17817330f729Sjoerg "rdhwr\t$rt, $rd, $sel", [], II_RDHWR, FrmR, "rdhwr">; 17827330f729Sjoerg 17837330f729Sjoerg// Ext and Ins 17847330f729Sjoergclass ExtBase<string opstr, RegisterOperand RO, Operand PosOpnd, 17857330f729Sjoerg Operand SizeOpnd, PatFrag PosImm, PatFrag SizeImm, 17867330f729Sjoerg SDPatternOperator Op = null_frag> : 17877330f729Sjoerg InstSE<(outs RO:$rt), (ins RO:$rs, PosOpnd:$pos, SizeOpnd:$size), 17887330f729Sjoerg !strconcat(opstr, "\t$rt, $rs, $pos, $size"), 17897330f729Sjoerg [(set RO:$rt, (Op RO:$rs, PosImm:$pos, SizeImm:$size))], II_EXT, 17907330f729Sjoerg FrmR, opstr>; 17917330f729Sjoerg 17927330f729Sjoerg// 'ins' and its' 64 bit variants are matched by C++ code. 17937330f729Sjoergclass InsBase<string opstr, RegisterOperand RO, Operand PosOpnd, 17947330f729Sjoerg Operand SizeOpnd, PatFrag PosImm, PatFrag SizeImm>: 17957330f729Sjoerg InstSE<(outs RO:$rt), (ins RO:$rs, PosOpnd:$pos, SizeOpnd:$size, RO:$src), 17967330f729Sjoerg !strconcat(opstr, "\t$rt, $rs, $pos, $size"), 17977330f729Sjoerg [(set RO:$rt, (null_frag RO:$rs, PosImm:$pos, SizeImm:$size, 17987330f729Sjoerg RO:$src))], 17997330f729Sjoerg II_INS, FrmR, opstr> { 18007330f729Sjoerg let Constraints = "$src = $rt"; 18017330f729Sjoerg} 18027330f729Sjoerg 18037330f729Sjoerg// Atomic instructions with 2 source operands (ATOMIC_SWAP & ATOMIC_LOAD_*). 18047330f729Sjoergclass Atomic2Ops<PatFrag Op, RegisterClass DRC> : 18057330f729Sjoerg PseudoSE<(outs DRC:$dst), (ins PtrRC:$ptr, DRC:$incr), 18067330f729Sjoerg [(set DRC:$dst, (Op iPTR:$ptr, DRC:$incr))]> { 18077330f729Sjoerg let hasNoSchedulingInfo = 1; 18087330f729Sjoerg} 18097330f729Sjoerg 18107330f729Sjoergclass Atomic2OpsPostRA<RegisterClass RC> : 18117330f729Sjoerg PseudoSE<(outs RC:$dst), (ins PtrRC:$ptr, RC:$incr), []> { 18127330f729Sjoerg let mayLoad = 1; 18137330f729Sjoerg let mayStore = 1; 18147330f729Sjoerg} 18157330f729Sjoerg 18167330f729Sjoergclass Atomic2OpsSubwordPostRA<RegisterClass RC> : 18177330f729Sjoerg PseudoSE<(outs RC:$dst), (ins PtrRC:$ptr, RC:$incr, RC:$mask, RC:$mask2, 18187330f729Sjoerg RC:$shiftamnt), []>; 18197330f729Sjoerg 18207330f729Sjoerg// Atomic Compare & Swap. 18217330f729Sjoerg// Atomic compare and swap is lowered into two stages. The first stage happens 18227330f729Sjoerg// during ISelLowering, which produces the PostRA version of this instruction. 18237330f729Sjoergclass AtomicCmpSwap<PatFrag Op, RegisterClass DRC> : 18247330f729Sjoerg PseudoSE<(outs DRC:$dst), (ins PtrRC:$ptr, DRC:$cmp, DRC:$swap), 18257330f729Sjoerg [(set DRC:$dst, (Op iPTR:$ptr, DRC:$cmp, DRC:$swap))]> { 18267330f729Sjoerg let hasNoSchedulingInfo = 1; 18277330f729Sjoerg} 18287330f729Sjoerg 18297330f729Sjoergclass AtomicCmpSwapPostRA<RegisterClass RC> : 18307330f729Sjoerg PseudoSE<(outs RC:$dst), (ins PtrRC:$ptr, RC:$cmp, RC:$swap), []> { 18317330f729Sjoerg let mayLoad = 1; 18327330f729Sjoerg let mayStore = 1; 18337330f729Sjoerg} 18347330f729Sjoerg 18357330f729Sjoergclass AtomicCmpSwapSubwordPostRA<RegisterClass RC> : 18367330f729Sjoerg PseudoSE<(outs RC:$dst), (ins PtrRC:$ptr, RC:$mask, RC:$ShiftCmpVal, 18377330f729Sjoerg RC:$mask2, RC:$ShiftNewVal, RC:$ShiftAmt), []> { 18387330f729Sjoerg let mayLoad = 1; 18397330f729Sjoerg let mayStore = 1; 18407330f729Sjoerg} 18417330f729Sjoerg 18427330f729Sjoergclass LLBase<string opstr, RegisterOperand RO, DAGOperand MO = mem> : 18437330f729Sjoerg InstSE<(outs RO:$rt), (ins MO:$addr), !strconcat(opstr, "\t$rt, $addr"), 18447330f729Sjoerg [], II_LL, FrmI, opstr> { 18457330f729Sjoerg let DecoderMethod = "DecodeMem"; 18467330f729Sjoerg let mayLoad = 1; 18477330f729Sjoerg} 18487330f729Sjoerg 18497330f729Sjoergclass SCBase<string opstr, RegisterOperand RO> : 18507330f729Sjoerg InstSE<(outs RO:$dst), (ins RO:$rt, mem:$addr), 18517330f729Sjoerg !strconcat(opstr, "\t$rt, $addr"), [], II_SC, FrmI> { 18527330f729Sjoerg let DecoderMethod = "DecodeMem"; 18537330f729Sjoerg let mayStore = 1; 18547330f729Sjoerg let Constraints = "$rt = $dst"; 18557330f729Sjoerg} 18567330f729Sjoerg 18577330f729Sjoergclass MFC3OP<string asmstr, RegisterOperand RO, RegisterOperand RD, 18587330f729Sjoerg InstrItinClass itin> : 18597330f729Sjoerg InstSE<(outs RO:$rt), (ins RD:$rd, uimm3:$sel), 18607330f729Sjoerg !strconcat(asmstr, "\t$rt, $rd, $sel"), [], itin, FrmFR> { 18617330f729Sjoerg let BaseOpcode = asmstr; 18627330f729Sjoerg} 18637330f729Sjoerg 18647330f729Sjoergclass MTC3OP<string asmstr, RegisterOperand RO, RegisterOperand RD, 18657330f729Sjoerg InstrItinClass itin> : 18667330f729Sjoerg InstSE<(outs RO:$rd), (ins RD:$rt, uimm3:$sel), 18677330f729Sjoerg !strconcat(asmstr, "\t$rt, $rd, $sel"), [], itin, FrmFR> { 18687330f729Sjoerg let BaseOpcode = asmstr; 18697330f729Sjoerg} 18707330f729Sjoerg 18717330f729Sjoergclass TrapBase<Instruction RealInst> 18727330f729Sjoerg : PseudoSE<(outs), (ins), [(trap)], II_TRAP>, 18737330f729Sjoerg PseudoInstExpansion<(RealInst 0, 0)> { 1874*82d56013Sjoerg let mayStore = 0; 1875*82d56013Sjoerg let mayLoad = 0; 1876*82d56013Sjoerg let hasSideEffects = 1; 1877*82d56013Sjoerg let isTrap = 1; 18787330f729Sjoerg let isCodeGenOnly = 1; 18797330f729Sjoerg} 18807330f729Sjoerg 18817330f729Sjoerg//===----------------------------------------------------------------------===// 18827330f729Sjoerg// Pseudo instructions 18837330f729Sjoerg//===----------------------------------------------------------------------===// 18847330f729Sjoerg 18857330f729Sjoerg// Return RA. 18867330f729Sjoerglet isReturn=1, isTerminator=1, isBarrier=1, hasCtrlDep=1, isCTI=1 in { 18877330f729Sjoerg let hasDelaySlot=1 in 18887330f729Sjoerg def RetRA : PseudoSE<(outs), (ins), [(MipsRet)]>; 18897330f729Sjoerg 18907330f729Sjoerg let hasSideEffects=1 in 18917330f729Sjoerg def ERet : PseudoSE<(outs), (ins), [(MipsERet)]>; 18927330f729Sjoerg} 18937330f729Sjoerg 18947330f729Sjoerglet Defs = [SP], Uses = [SP], hasSideEffects = 1, hasNoSchedulingInfo = 1 in { 18957330f729Sjoergdef ADJCALLSTACKDOWN : MipsPseudo<(outs), (ins i32imm:$amt1, i32imm:$amt2), 18967330f729Sjoerg [(callseq_start timm:$amt1, timm:$amt2)]>; 18977330f729Sjoergdef ADJCALLSTACKUP : MipsPseudo<(outs), (ins i32imm:$amt1, i32imm:$amt2), 18987330f729Sjoerg [(callseq_end timm:$amt1, timm:$amt2)]>; 18997330f729Sjoerg} 19007330f729Sjoerg 19017330f729Sjoerglet usesCustomInserter = 1 in { 19027330f729Sjoerg def ATOMIC_LOAD_ADD_I8 : Atomic2Ops<atomic_load_add_8, GPR32>; 19037330f729Sjoerg def ATOMIC_LOAD_ADD_I16 : Atomic2Ops<atomic_load_add_16, GPR32>; 19047330f729Sjoerg def ATOMIC_LOAD_ADD_I32 : Atomic2Ops<atomic_load_add_32, GPR32>; 19057330f729Sjoerg def ATOMIC_LOAD_SUB_I8 : Atomic2Ops<atomic_load_sub_8, GPR32>; 19067330f729Sjoerg def ATOMIC_LOAD_SUB_I16 : Atomic2Ops<atomic_load_sub_16, GPR32>; 19077330f729Sjoerg def ATOMIC_LOAD_SUB_I32 : Atomic2Ops<atomic_load_sub_32, GPR32>; 19087330f729Sjoerg def ATOMIC_LOAD_AND_I8 : Atomic2Ops<atomic_load_and_8, GPR32>; 19097330f729Sjoerg def ATOMIC_LOAD_AND_I16 : Atomic2Ops<atomic_load_and_16, GPR32>; 19107330f729Sjoerg def ATOMIC_LOAD_AND_I32 : Atomic2Ops<atomic_load_and_32, GPR32>; 19117330f729Sjoerg def ATOMIC_LOAD_OR_I8 : Atomic2Ops<atomic_load_or_8, GPR32>; 19127330f729Sjoerg def ATOMIC_LOAD_OR_I16 : Atomic2Ops<atomic_load_or_16, GPR32>; 19137330f729Sjoerg def ATOMIC_LOAD_OR_I32 : Atomic2Ops<atomic_load_or_32, GPR32>; 19147330f729Sjoerg def ATOMIC_LOAD_XOR_I8 : Atomic2Ops<atomic_load_xor_8, GPR32>; 19157330f729Sjoerg def ATOMIC_LOAD_XOR_I16 : Atomic2Ops<atomic_load_xor_16, GPR32>; 19167330f729Sjoerg def ATOMIC_LOAD_XOR_I32 : Atomic2Ops<atomic_load_xor_32, GPR32>; 19177330f729Sjoerg def ATOMIC_LOAD_NAND_I8 : Atomic2Ops<atomic_load_nand_8, GPR32>; 19187330f729Sjoerg def ATOMIC_LOAD_NAND_I16 : Atomic2Ops<atomic_load_nand_16, GPR32>; 19197330f729Sjoerg def ATOMIC_LOAD_NAND_I32 : Atomic2Ops<atomic_load_nand_32, GPR32>; 19207330f729Sjoerg 19217330f729Sjoerg def ATOMIC_SWAP_I8 : Atomic2Ops<atomic_swap_8, GPR32>; 19227330f729Sjoerg def ATOMIC_SWAP_I16 : Atomic2Ops<atomic_swap_16, GPR32>; 19237330f729Sjoerg def ATOMIC_SWAP_I32 : Atomic2Ops<atomic_swap_32, GPR32>; 19247330f729Sjoerg 19257330f729Sjoerg def ATOMIC_CMP_SWAP_I8 : AtomicCmpSwap<atomic_cmp_swap_8, GPR32>; 19267330f729Sjoerg def ATOMIC_CMP_SWAP_I16 : AtomicCmpSwap<atomic_cmp_swap_16, GPR32>; 19277330f729Sjoerg def ATOMIC_CMP_SWAP_I32 : AtomicCmpSwap<atomic_cmp_swap_32, GPR32>; 19287330f729Sjoerg 1929*82d56013Sjoerg def ATOMIC_LOAD_MIN_I8 : Atomic2Ops<atomic_load_min_8, GPR32>; 1930*82d56013Sjoerg def ATOMIC_LOAD_MIN_I16 : Atomic2Ops<atomic_load_min_16, GPR32>; 1931*82d56013Sjoerg def ATOMIC_LOAD_MIN_I32 : Atomic2Ops<atomic_load_min_32, GPR32>; 1932*82d56013Sjoerg def ATOMIC_LOAD_MAX_I8 : Atomic2Ops<atomic_load_max_8, GPR32>; 1933*82d56013Sjoerg def ATOMIC_LOAD_MAX_I16 : Atomic2Ops<atomic_load_max_16, GPR32>; 1934*82d56013Sjoerg def ATOMIC_LOAD_MAX_I32 : Atomic2Ops<atomic_load_max_32, GPR32>; 1935*82d56013Sjoerg def ATOMIC_LOAD_UMIN_I8 : Atomic2Ops<atomic_load_umin_8, GPR32>; 1936*82d56013Sjoerg def ATOMIC_LOAD_UMIN_I16 : Atomic2Ops<atomic_load_umin_16, GPR32>; 1937*82d56013Sjoerg def ATOMIC_LOAD_UMIN_I32 : Atomic2Ops<atomic_load_umin_32, GPR32>; 1938*82d56013Sjoerg def ATOMIC_LOAD_UMAX_I8 : Atomic2Ops<atomic_load_umax_8, GPR32>; 1939*82d56013Sjoerg def ATOMIC_LOAD_UMAX_I16 : Atomic2Ops<atomic_load_umax_16, GPR32>; 1940*82d56013Sjoerg def ATOMIC_LOAD_UMAX_I32 : Atomic2Ops<atomic_load_umax_32, GPR32>; 19417330f729Sjoerg} 19427330f729Sjoerg 19437330f729Sjoergdef ATOMIC_LOAD_ADD_I8_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 19447330f729Sjoergdef ATOMIC_LOAD_ADD_I16_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 19457330f729Sjoergdef ATOMIC_LOAD_ADD_I32_POSTRA : Atomic2OpsPostRA<GPR32>; 19467330f729Sjoergdef ATOMIC_LOAD_SUB_I8_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 19477330f729Sjoergdef ATOMIC_LOAD_SUB_I16_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 19487330f729Sjoergdef ATOMIC_LOAD_SUB_I32_POSTRA : Atomic2OpsPostRA<GPR32>; 19497330f729Sjoergdef ATOMIC_LOAD_AND_I8_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 19507330f729Sjoergdef ATOMIC_LOAD_AND_I16_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 19517330f729Sjoergdef ATOMIC_LOAD_AND_I32_POSTRA : Atomic2OpsPostRA<GPR32>; 19527330f729Sjoergdef ATOMIC_LOAD_OR_I8_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 19537330f729Sjoergdef ATOMIC_LOAD_OR_I16_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 19547330f729Sjoergdef ATOMIC_LOAD_OR_I32_POSTRA : Atomic2OpsPostRA<GPR32>; 19557330f729Sjoergdef ATOMIC_LOAD_XOR_I8_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 19567330f729Sjoergdef ATOMIC_LOAD_XOR_I16_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 19577330f729Sjoergdef ATOMIC_LOAD_XOR_I32_POSTRA : Atomic2OpsPostRA<GPR32>; 19587330f729Sjoergdef ATOMIC_LOAD_NAND_I8_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 19597330f729Sjoergdef ATOMIC_LOAD_NAND_I16_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 19607330f729Sjoergdef ATOMIC_LOAD_NAND_I32_POSTRA : Atomic2OpsPostRA<GPR32>; 19617330f729Sjoerg 19627330f729Sjoergdef ATOMIC_SWAP_I8_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 19637330f729Sjoergdef ATOMIC_SWAP_I16_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 19647330f729Sjoergdef ATOMIC_SWAP_I32_POSTRA : Atomic2OpsPostRA<GPR32>; 19657330f729Sjoerg 19667330f729Sjoergdef ATOMIC_CMP_SWAP_I8_POSTRA : AtomicCmpSwapSubwordPostRA<GPR32>; 19677330f729Sjoergdef ATOMIC_CMP_SWAP_I16_POSTRA : AtomicCmpSwapSubwordPostRA<GPR32>; 19687330f729Sjoergdef ATOMIC_CMP_SWAP_I32_POSTRA : AtomicCmpSwapPostRA<GPR32>; 19697330f729Sjoerg 1970*82d56013Sjoergdef ATOMIC_LOAD_MIN_I8_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 1971*82d56013Sjoergdef ATOMIC_LOAD_MIN_I16_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 1972*82d56013Sjoergdef ATOMIC_LOAD_MIN_I32_POSTRA : Atomic2OpsPostRA<GPR32>; 1973*82d56013Sjoergdef ATOMIC_LOAD_MAX_I8_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 1974*82d56013Sjoergdef ATOMIC_LOAD_MAX_I16_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 1975*82d56013Sjoergdef ATOMIC_LOAD_MAX_I32_POSTRA : Atomic2OpsPostRA<GPR32>; 1976*82d56013Sjoergdef ATOMIC_LOAD_UMIN_I8_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 1977*82d56013Sjoergdef ATOMIC_LOAD_UMIN_I16_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 1978*82d56013Sjoergdef ATOMIC_LOAD_UMIN_I32_POSTRA : Atomic2OpsPostRA<GPR32>; 1979*82d56013Sjoergdef ATOMIC_LOAD_UMAX_I8_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 1980*82d56013Sjoergdef ATOMIC_LOAD_UMAX_I16_POSTRA : Atomic2OpsSubwordPostRA<GPR32>; 1981*82d56013Sjoergdef ATOMIC_LOAD_UMAX_I32_POSTRA : Atomic2OpsPostRA<GPR32>; 1982*82d56013Sjoerg 19837330f729Sjoerg/// Pseudo instructions for loading and storing accumulator registers. 19847330f729Sjoerglet isPseudo = 1, isCodeGenOnly = 1, hasNoSchedulingInfo = 1 in { 19857330f729Sjoerg def LOAD_ACC64 : Load<"", ACC64>; 19867330f729Sjoerg def STORE_ACC64 : Store<"", ACC64>; 19877330f729Sjoerg} 19887330f729Sjoerg 19897330f729Sjoerg// We need these two pseudo instructions to avoid offset calculation for long 19907330f729Sjoerg// branches. See the comment in file MipsLongBranch.cpp for detailed 19917330f729Sjoerg// explanation. 19927330f729Sjoerg 19937330f729Sjoerg// Expands to: lui $dst, %highest/%higher/%hi/%lo($tgt - $baltgt) 19947330f729Sjoergdef LONG_BRANCH_LUi : PseudoSE<(outs GPR32Opnd:$dst), 19957330f729Sjoerg (ins brtarget:$tgt, brtarget:$baltgt), []> { 19967330f729Sjoerg bit hasNoSchedulingInfo = 1; 19977330f729Sjoerg} 19987330f729Sjoerg// Expands to: lui $dst, highest/%higher/%hi/%lo($tgt) 19997330f729Sjoergdef LONG_BRANCH_LUi2Op : PseudoSE<(outs GPR32Opnd:$dst), 20007330f729Sjoerg (ins brtarget:$tgt), []> { 20017330f729Sjoerg bit hasNoSchedulingInfo = 1; 20027330f729Sjoerg} 20037330f729Sjoerg 20047330f729Sjoerg// Expands to: addiu $dst, $src, %highest/%higher/%hi/%lo($tgt - $baltgt) 20057330f729Sjoergdef LONG_BRANCH_ADDiu : PseudoSE<(outs GPR32Opnd:$dst), 20067330f729Sjoerg (ins GPR32Opnd:$src, brtarget:$tgt, brtarget:$baltgt), []> { 20077330f729Sjoerg bit hasNoSchedulingInfo = 1; 20087330f729Sjoerg} 20097330f729Sjoerg// Expands to: addiu $dst, $src, %highest/%higher/%hi/%lo($tgt) 20107330f729Sjoergdef LONG_BRANCH_ADDiu2Op : PseudoSE<(outs GPR32Opnd:$dst), 20117330f729Sjoerg (ins GPR32Opnd:$src, brtarget:$tgt), []> { 20127330f729Sjoerg bit hasNoSchedulingInfo = 1; 20137330f729Sjoerg} 20147330f729Sjoerg 20157330f729Sjoerg//===----------------------------------------------------------------------===// 20167330f729Sjoerg// Instruction definition 20177330f729Sjoerg//===----------------------------------------------------------------------===// 20187330f729Sjoerg//===----------------------------------------------------------------------===// 20197330f729Sjoerg// MipsI Instructions 20207330f729Sjoerg//===----------------------------------------------------------------------===// 20217330f729Sjoerg 20227330f729Sjoerg/// Arithmetic Instructions (ALU Immediate) 20237330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 20247330f729Sjoerg def ADDiu : MMRel, StdMMR6Rel, ArithLogicI<"addiu", simm16_relaxed, GPR32Opnd, 2025*82d56013Sjoerg II_ADDIU, imm32SExt16, add>, 20267330f729Sjoerg ADDI_FM<0x9>, IsAsCheapAsAMove, ISA_MIPS1; 20277330f729Sjoerg 20287330f729Sjoerg def ANDi : MMRel, StdMMR6Rel, 2029*82d56013Sjoerg ArithLogicI<"andi", uimm16, GPR32Opnd, II_ANDI, imm32ZExt16, and>, 20307330f729Sjoerg ADDI_FM<0xc>, ISA_MIPS1; 20317330f729Sjoerg def ORi : MMRel, StdMMR6Rel, 2032*82d56013Sjoerg ArithLogicI<"ori", uimm16, GPR32Opnd, II_ORI, imm32ZExt16, or>, 20337330f729Sjoerg ADDI_FM<0xd>, ISA_MIPS1; 20347330f729Sjoerg def XORi : MMRel, StdMMR6Rel, 2035*82d56013Sjoerg ArithLogicI<"xori", uimm16, GPR32Opnd, II_XORI, imm32ZExt16, xor>, 20367330f729Sjoerg ADDI_FM<0xe>, ISA_MIPS1; 20377330f729Sjoerg def ADDi : MMRel, ArithLogicI<"addi", simm16_relaxed, GPR32Opnd, II_ADDI>, 20387330f729Sjoerg ADDI_FM<0x8>, ISA_MIPS1_NOT_32R6_64R6; 20397330f729Sjoerg def SLTi : MMRel, SetCC_I<"slti", setlt, simm16, immSExt16, GPR32Opnd>, 20407330f729Sjoerg SLTI_FM<0xa>, ISA_MIPS1; 20417330f729Sjoerg def SLTiu : MMRel, SetCC_I<"sltiu", setult, simm16, immSExt16, GPR32Opnd>, 20427330f729Sjoerg SLTI_FM<0xb>, ISA_MIPS1; 20437330f729Sjoerg 20447330f729Sjoerg def LUi : MMRel, LoadUpper<"lui", GPR32Opnd, uimm16_relaxed>, LUI_FM, 20457330f729Sjoerg ISA_MIPS1; 20467330f729Sjoerg 20477330f729Sjoerg /// Arithmetic Instructions (3-Operand, R-Type) 20487330f729Sjoerg def ADDu : MMRel, StdMMR6Rel, ArithLogicR<"addu", GPR32Opnd, 1, II_ADDU, add>, 20497330f729Sjoerg ADD_FM<0, 0x21>, ISA_MIPS1; 20507330f729Sjoerg def SUBu : MMRel, StdMMR6Rel, ArithLogicR<"subu", GPR32Opnd, 0, II_SUBU, sub>, 20517330f729Sjoerg ADD_FM<0, 0x23>, ISA_MIPS1; 20527330f729Sjoerg 20537330f729Sjoerg let Defs = [HI0, LO0] in 20547330f729Sjoerg def MUL : MMRel, ArithLogicR<"mul", GPR32Opnd, 1, II_MUL, mul>, 20557330f729Sjoerg ADD_FM<0x1c, 2>, ISA_MIPS32_NOT_32R6_64R6; 20567330f729Sjoerg 20577330f729Sjoerg def ADD : MMRel, StdMMR6Rel, ArithLogicR<"add", GPR32Opnd, 1, II_ADD>, 20587330f729Sjoerg ADD_FM<0, 0x20>, ISA_MIPS1; 20597330f729Sjoerg def SUB : MMRel, StdMMR6Rel, ArithLogicR<"sub", GPR32Opnd, 0, II_SUB>, 20607330f729Sjoerg ADD_FM<0, 0x22>, ISA_MIPS1; 20617330f729Sjoerg 20627330f729Sjoerg def SLT : MMRel, SetCC_R<"slt", setlt, GPR32Opnd>, ADD_FM<0, 0x2a>, 20637330f729Sjoerg ISA_MIPS1; 20647330f729Sjoerg def SLTu : MMRel, SetCC_R<"sltu", setult, GPR32Opnd>, ADD_FM<0, 0x2b>, 20657330f729Sjoerg ISA_MIPS1; 20667330f729Sjoerg def AND : MMRel, StdMMR6Rel, ArithLogicR<"and", GPR32Opnd, 1, II_AND, and>, 20677330f729Sjoerg ADD_FM<0, 0x24>, ISA_MIPS1; 20687330f729Sjoerg def OR : MMRel, StdMMR6Rel, ArithLogicR<"or", GPR32Opnd, 1, II_OR, or>, 20697330f729Sjoerg ADD_FM<0, 0x25>, ISA_MIPS1; 20707330f729Sjoerg def XOR : MMRel, StdMMR6Rel, ArithLogicR<"xor", GPR32Opnd, 1, II_XOR, xor>, 20717330f729Sjoerg ADD_FM<0, 0x26>, ISA_MIPS1; 20727330f729Sjoerg def NOR : MMRel, StdMMR6Rel, LogicNOR<"nor", GPR32Opnd>, ADD_FM<0, 0x27>, 20737330f729Sjoerg ISA_MIPS1; 20747330f729Sjoerg} 20757330f729Sjoerg 20767330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 20777330f729Sjoerg /// Shift Instructions 20787330f729Sjoerg def SLL : MMRel, shift_rotate_imm<"sll", uimm5, GPR32Opnd, II_SLL, shl, 20797330f729Sjoerg immZExt5>, SRA_FM<0, 0>, ISA_MIPS1; 20807330f729Sjoerg def SRL : MMRel, shift_rotate_imm<"srl", uimm5, GPR32Opnd, II_SRL, srl, 20817330f729Sjoerg immZExt5>, SRA_FM<2, 0>, ISA_MIPS1; 20827330f729Sjoerg def SRA : MMRel, shift_rotate_imm<"sra", uimm5, GPR32Opnd, II_SRA, sra, 20837330f729Sjoerg immZExt5>, SRA_FM<3, 0>, ISA_MIPS1; 20847330f729Sjoerg def SLLV : MMRel, shift_rotate_reg<"sllv", GPR32Opnd, II_SLLV, shl>, 20857330f729Sjoerg SRLV_FM<4, 0>, ISA_MIPS1; 20867330f729Sjoerg def SRLV : MMRel, shift_rotate_reg<"srlv", GPR32Opnd, II_SRLV, srl>, 20877330f729Sjoerg SRLV_FM<6, 0>, ISA_MIPS1; 20887330f729Sjoerg def SRAV : MMRel, shift_rotate_reg<"srav", GPR32Opnd, II_SRAV, sra>, 20897330f729Sjoerg SRLV_FM<7, 0>, ISA_MIPS1; 20907330f729Sjoerg 20917330f729Sjoerg // Rotate Instructions 20927330f729Sjoerg def ROTR : MMRel, shift_rotate_imm<"rotr", uimm5, GPR32Opnd, II_ROTR, rotr, 20937330f729Sjoerg immZExt5>, 20947330f729Sjoerg SRA_FM<2, 1>, ISA_MIPS32R2; 20957330f729Sjoerg def ROTRV : MMRel, shift_rotate_reg<"rotrv", GPR32Opnd, II_ROTRV, rotr>, 20967330f729Sjoerg SRLV_FM<6, 1>, ISA_MIPS32R2; 20977330f729Sjoerg} 20987330f729Sjoerg 20997330f729Sjoerg/// Load and Store Instructions 21007330f729Sjoerg/// aligned 21017330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 21027330f729Sjoerg def LB : LoadMemory<"lb", GPR32Opnd, mem_simmptr, sextloadi8, II_LB>, MMRel, 21037330f729Sjoerg LW_FM<0x20>, ISA_MIPS1; 21047330f729Sjoerg def LBu : LoadMemory<"lbu", GPR32Opnd, mem_simmptr, zextloadi8, II_LBU, 21057330f729Sjoerg addrDefault>, MMRel, LW_FM<0x24>, ISA_MIPS1; 21067330f729Sjoerg def LH : LoadMemory<"lh", GPR32Opnd, mem_simmptr, sextloadi16, II_LH, 21077330f729Sjoerg addrDefault>, MMRel, LW_FM<0x21>, ISA_MIPS1; 21087330f729Sjoerg def LHu : LoadMemory<"lhu", GPR32Opnd, mem_simmptr, zextloadi16, II_LHU>, 21097330f729Sjoerg MMRel, LW_FM<0x25>, ISA_MIPS1; 21107330f729Sjoerg def LW : StdMMR6Rel, Load<"lw", GPR32Opnd, load, II_LW, addrDefault>, MMRel, 21117330f729Sjoerg LW_FM<0x23>, ISA_MIPS1; 21127330f729Sjoerg def SB : StdMMR6Rel, Store<"sb", GPR32Opnd, truncstorei8, II_SB>, MMRel, 21137330f729Sjoerg LW_FM<0x28>, ISA_MIPS1; 21147330f729Sjoerg def SH : Store<"sh", GPR32Opnd, truncstorei16, II_SH>, MMRel, LW_FM<0x29>, 21157330f729Sjoerg ISA_MIPS1; 2116*82d56013Sjoerg def SW : StdMMR6Rel, Store<"sw", GPR32Opnd, store, II_SW>, 2117*82d56013Sjoerg MMRel, LW_FM<0x2b>, ISA_MIPS1; 21187330f729Sjoerg} 21197330f729Sjoerg 21207330f729Sjoerg/// load/store left/right 21217330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 21227330f729Sjoergdef LWL : MMRel, LoadLeftRight<"lwl", MipsLWL, GPR32Opnd, II_LWL>, LW_FM<0x22>, 21237330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 21247330f729Sjoergdef LWR : MMRel, LoadLeftRight<"lwr", MipsLWR, GPR32Opnd, II_LWR>, LW_FM<0x26>, 21257330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 21267330f729Sjoergdef SWL : MMRel, StoreLeftRight<"swl", MipsSWL, GPR32Opnd, II_SWL>, LW_FM<0x2a>, 21277330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 21287330f729Sjoergdef SWR : MMRel, StoreLeftRight<"swr", MipsSWR, GPR32Opnd, II_SWR>, LW_FM<0x2e>, 21297330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 21307330f729Sjoerg 21317330f729Sjoerg// COP2 Memory Instructions 21327330f729Sjoergdef LWC2 : StdMMR6Rel, LW_FT2<"lwc2", COP2Opnd, II_LWC2, load>, LW_FM<0x32>, 21337330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 21347330f729Sjoergdef SWC2 : StdMMR6Rel, SW_FT2<"swc2", COP2Opnd, II_SWC2, store>, 21357330f729Sjoerg LW_FM<0x3a>, ISA_MIPS1_NOT_32R6_64R6; 21367330f729Sjoergdef LDC2 : StdMMR6Rel, LW_FT2<"ldc2", COP2Opnd, II_LDC2, load>, LW_FM<0x36>, 21377330f729Sjoerg ISA_MIPS2_NOT_32R6_64R6; 21387330f729Sjoergdef SDC2 : StdMMR6Rel, SW_FT2<"sdc2", COP2Opnd, II_SDC2, store>, 21397330f729Sjoerg LW_FM<0x3e>, ISA_MIPS2_NOT_32R6_64R6; 21407330f729Sjoerg 21417330f729Sjoerg// COP3 Memory Instructions 21427330f729Sjoerglet DecoderNamespace = "COP3_" in { 21437330f729Sjoerg def LWC3 : LW_FT3<"lwc3", COP3Opnd, II_LWC3, load>, LW_FM<0x33>, 21447330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6, NOT_ASE_CNMIPS; 21457330f729Sjoerg def SWC3 : SW_FT3<"swc3", COP3Opnd, II_SWC3, store>, LW_FM<0x3b>, 21467330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6, NOT_ASE_CNMIPS; 21477330f729Sjoerg def LDC3 : LW_FT3<"ldc3", COP3Opnd, II_LDC3, load>, LW_FM<0x37>, 21487330f729Sjoerg ISA_MIPS2, NOT_ASE_CNMIPS; 21497330f729Sjoerg def SDC3 : SW_FT3<"sdc3", COP3Opnd, II_SDC3, store>, LW_FM<0x3f>, 21507330f729Sjoerg ISA_MIPS2, NOT_ASE_CNMIPS; 21517330f729Sjoerg} 21527330f729Sjoerg 21537330f729Sjoerg def SYNC : MMRel, StdMMR6Rel, SYNC_FT<"sync">, SYNC_FM, ISA_MIPS2; 21547330f729Sjoerg def SYNCI : MMRel, StdMMR6Rel, SYNCI_FT<"synci", mem_simm16>, SYNCI_FM, 21557330f729Sjoerg ISA_MIPS32R2; 21567330f729Sjoerg} 21577330f729Sjoerg 21587330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 21597330f729Sjoerg def TEQ : MMRel, TEQ_FT<"teq", GPR32Opnd, uimm10, II_TEQ>, TEQ_FM<0x34>, 21607330f729Sjoerg ISA_MIPS2; 21617330f729Sjoerg def TGE : MMRel, TEQ_FT<"tge", GPR32Opnd, uimm10, II_TGE>, TEQ_FM<0x30>, 21627330f729Sjoerg ISA_MIPS2; 21637330f729Sjoerg def TGEU : MMRel, TEQ_FT<"tgeu", GPR32Opnd, uimm10, II_TGEU>, TEQ_FM<0x31>, 21647330f729Sjoerg ISA_MIPS2; 21657330f729Sjoerg def TLT : MMRel, TEQ_FT<"tlt", GPR32Opnd, uimm10, II_TLT>, TEQ_FM<0x32>, 21667330f729Sjoerg ISA_MIPS2; 21677330f729Sjoerg def TLTU : MMRel, TEQ_FT<"tltu", GPR32Opnd, uimm10, II_TLTU>, TEQ_FM<0x33>, 21687330f729Sjoerg ISA_MIPS2; 21697330f729Sjoerg def TNE : MMRel, TEQ_FT<"tne", GPR32Opnd, uimm10, II_TNE>, TEQ_FM<0x36>, 21707330f729Sjoerg ISA_MIPS2; 21717330f729Sjoerg 21727330f729Sjoerg def TEQI : MMRel, TEQI_FT<"teqi", GPR32Opnd, II_TEQI>, TEQI_FM<0xc>, 21737330f729Sjoerg ISA_MIPS2_NOT_32R6_64R6; 21747330f729Sjoerg def TGEI : MMRel, TEQI_FT<"tgei", GPR32Opnd, II_TGEI>, TEQI_FM<0x8>, 21757330f729Sjoerg ISA_MIPS2_NOT_32R6_64R6; 21767330f729Sjoerg def TGEIU : MMRel, TEQI_FT<"tgeiu", GPR32Opnd, II_TGEIU>, TEQI_FM<0x9>, 21777330f729Sjoerg ISA_MIPS2_NOT_32R6_64R6; 21787330f729Sjoerg def TLTI : MMRel, TEQI_FT<"tlti", GPR32Opnd, II_TLTI>, TEQI_FM<0xa>, 21797330f729Sjoerg ISA_MIPS2_NOT_32R6_64R6; 21807330f729Sjoerg def TTLTIU : MMRel, TEQI_FT<"tltiu", GPR32Opnd, II_TTLTIU>, TEQI_FM<0xb>, 21817330f729Sjoerg ISA_MIPS2_NOT_32R6_64R6; 21827330f729Sjoerg def TNEI : MMRel, TEQI_FT<"tnei", GPR32Opnd, II_TNEI>, TEQI_FM<0xe>, 21837330f729Sjoerg ISA_MIPS2_NOT_32R6_64R6; 21847330f729Sjoerg} 21857330f729Sjoerg 21867330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 21877330f729Sjoerg def BREAK : MMRel, StdMMR6Rel, BRK_FT<"break">, BRK_FM<0xd>, ISA_MIPS1; 21887330f729Sjoerg def SYSCALL : MMRel, SYS_FT<"syscall", uimm20, II_SYSCALL>, SYS_FM<0xc>, 21897330f729Sjoerg ISA_MIPS1; 21907330f729Sjoerg def TRAP : TrapBase<BREAK>, ISA_MIPS1; 21917330f729Sjoerg def SDBBP : MMRel, SYS_FT<"sdbbp", uimm20, II_SDBBP>, SDBBP_FM, 21927330f729Sjoerg ISA_MIPS32_NOT_32R6_64R6; 21937330f729Sjoerg 21947330f729Sjoerg def ERET : MMRel, ER_FT<"eret", II_ERET>, ER_FM<0x18, 0x0>, INSN_MIPS3_32; 21957330f729Sjoerg def ERETNC : MMRel, ER_FT<"eretnc", II_ERETNC>, ER_FM<0x18, 0x1>, 21967330f729Sjoerg ISA_MIPS32R5; 21977330f729Sjoerg def DERET : MMRel, ER_FT<"deret", II_DERET>, ER_FM<0x1f, 0x0>, ISA_MIPS32; 21987330f729Sjoerg 21997330f729Sjoerg def EI : MMRel, StdMMR6Rel, DEI_FT<"ei", GPR32Opnd, II_EI>, EI_FM<1>, 22007330f729Sjoerg ISA_MIPS32R2; 22017330f729Sjoerg def DI : MMRel, StdMMR6Rel, DEI_FT<"di", GPR32Opnd, II_DI>, EI_FM<0>, 22027330f729Sjoerg ISA_MIPS32R2; 22037330f729Sjoerg 22047330f729Sjoerg def WAIT : MMRel, StdMMR6Rel, WAIT_FT<"wait">, WAIT_FM, INSN_MIPS3_32; 22057330f729Sjoerg} 22067330f729Sjoerg 22077330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 22087330f729Sjoerg/// Load-linked, Store-conditional 22097330f729Sjoergdef LL : LLBase<"ll", GPR32Opnd>, LW_FM<0x30>, PTR_32, ISA_MIPS2_NOT_32R6_64R6; 22107330f729Sjoergdef SC : SCBase<"sc", GPR32Opnd>, LW_FM<0x38>, PTR_32, ISA_MIPS2_NOT_32R6_64R6; 22117330f729Sjoerg} 22127330f729Sjoerg/// Jump and Branch Instructions 22137330f729Sjoerglet AdditionalPredicates = [NotInMicroMips, RelocNotPIC] in 22147330f729Sjoergdef J : MMRel, JumpFJ<jmptarget, "j", br, bb, "j">, FJ<2>, 22157330f729Sjoerg IsBranch, ISA_MIPS1; 22167330f729Sjoerg 22177330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 2218*82d56013Sjoergdef JR : MMRel, IndirectBranch<"jr", GPR32Opnd>, MTLO_FM<8>, 2219*82d56013Sjoerg ISA_MIPS1_NOT_32R6_64R6; 22207330f729Sjoergdef BEQ : MMRel, CBranch<"beq", brtarget, seteq, GPR32Opnd>, BEQ_FM<4>, 22217330f729Sjoerg ISA_MIPS1; 22227330f729Sjoergdef BEQL : MMRel, CBranchLikely<"beql", brtarget, GPR32Opnd>, 22237330f729Sjoerg BEQ_FM<20>, ISA_MIPS2_NOT_32R6_64R6; 22247330f729Sjoergdef BNE : MMRel, CBranch<"bne", brtarget, setne, GPR32Opnd>, BEQ_FM<5>, 22257330f729Sjoerg ISA_MIPS1; 22267330f729Sjoergdef BNEL : MMRel, CBranchLikely<"bnel", brtarget, GPR32Opnd>, 22277330f729Sjoerg BEQ_FM<21>, ISA_MIPS2_NOT_32R6_64R6; 22287330f729Sjoergdef BGEZ : MMRel, CBranchZero<"bgez", brtarget, setge, GPR32Opnd>, 22297330f729Sjoerg BGEZ_FM<1, 1>, ISA_MIPS1; 22307330f729Sjoergdef BGEZL : MMRel, CBranchZeroLikely<"bgezl", brtarget, GPR32Opnd>, 22317330f729Sjoerg BGEZ_FM<1, 3>, ISA_MIPS2_NOT_32R6_64R6; 22327330f729Sjoergdef BGTZ : MMRel, CBranchZero<"bgtz", brtarget, setgt, GPR32Opnd>, 22337330f729Sjoerg BGEZ_FM<7, 0>, ISA_MIPS1; 22347330f729Sjoergdef BGTZL : MMRel, CBranchZeroLikely<"bgtzl", brtarget, GPR32Opnd>, 22357330f729Sjoerg BGEZ_FM<23, 0>, ISA_MIPS2_NOT_32R6_64R6; 22367330f729Sjoergdef BLEZ : MMRel, CBranchZero<"blez", brtarget, setle, GPR32Opnd>, 22377330f729Sjoerg BGEZ_FM<6, 0>, ISA_MIPS1; 22387330f729Sjoergdef BLEZL : MMRel, CBranchZeroLikely<"blezl", brtarget, GPR32Opnd>, 22397330f729Sjoerg BGEZ_FM<22, 0>, ISA_MIPS2_NOT_32R6_64R6; 22407330f729Sjoergdef BLTZ : MMRel, CBranchZero<"bltz", brtarget, setlt, GPR32Opnd>, 22417330f729Sjoerg BGEZ_FM<1, 0>, ISA_MIPS1; 22427330f729Sjoergdef BLTZL : MMRel, CBranchZeroLikely<"bltzl", brtarget, GPR32Opnd>, 22437330f729Sjoerg BGEZ_FM<1, 2>, ISA_MIPS2_NOT_32R6_64R6; 22447330f729Sjoergdef B : UncondBranch<BEQ, brtarget>, ISA_MIPS1; 22457330f729Sjoerg 22467330f729Sjoergdef JAL : MMRel, JumpLink<"jal", calltarget>, FJ<3>, ISA_MIPS1; 22477330f729Sjoerg 22487330f729Sjoerg} 22497330f729Sjoerg 22507330f729Sjoerglet AdditionalPredicates = [NotInMicroMips, NoIndirectJumpGuards] in { 22517330f729Sjoerg def JALR : JumpLinkReg<"jalr", GPR32Opnd>, JALR_FM, ISA_MIPS1; 22527330f729Sjoerg def JALRPseudo : JumpLinkRegPseudo<GPR32Opnd, JALR, RA>, ISA_MIPS1; 22537330f729Sjoerg} 22547330f729Sjoerg 22557330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 22567330f729Sjoerg def JALX : MMRel, JumpLink<"jalx", calltarget>, FJ<0x1D>, 22577330f729Sjoerg ISA_MIPS32_NOT_32R6_64R6; 22587330f729Sjoerg def BGEZAL : MMRel, BGEZAL_FT<"bgezal", brtarget, GPR32Opnd>, BGEZAL_FM<0x11>, 22597330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 22607330f729Sjoerg def BGEZALL : MMRel, BGEZAL_FT<"bgezall", brtarget, GPR32Opnd>, 22617330f729Sjoerg BGEZAL_FM<0x13>, ISA_MIPS2_NOT_32R6_64R6; 22627330f729Sjoerg def BLTZAL : MMRel, BGEZAL_FT<"bltzal", brtarget, GPR32Opnd>, BGEZAL_FM<0x10>, 22637330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 22647330f729Sjoerg def BLTZALL : MMRel, BGEZAL_FT<"bltzall", brtarget, GPR32Opnd>, 22657330f729Sjoerg BGEZAL_FM<0x12>, ISA_MIPS2_NOT_32R6_64R6; 22667330f729Sjoerg def BAL_BR : BAL_BR_Pseudo<BGEZAL, brtarget>, ISA_MIPS1; 22677330f729Sjoerg} 22687330f729Sjoerglet AdditionalPredicates = [NotInMips16Mode, NotInMicroMips] in { 22697330f729Sjoerg def TAILCALL : TailCall<J, jmptarget>, ISA_MIPS1; 22707330f729Sjoerg} 22717330f729Sjoerglet AdditionalPredicates = [NotInMips16Mode, NotInMicroMips, 22727330f729Sjoerg NoIndirectJumpGuards] in 22737330f729Sjoerg def TAILCALLREG : TailCallReg<JR, GPR32Opnd>, ISA_MIPS1_NOT_32R6_64R6; 22747330f729Sjoerg 22757330f729Sjoerg// Indirect branches are matched as PseudoIndirectBranch/PseudoIndirectBranch64 22767330f729Sjoerg// then are expanded to JR, JR64, JALR, or JALR64 depending on the ISA. 22777330f729Sjoergclass PseudoIndirectBranchBase<Instruction JumpInst, RegisterOperand RO> : 22787330f729Sjoerg MipsPseudo<(outs), (ins RO:$rs), [(brind RO:$rs)], 22797330f729Sjoerg II_IndirectBranchPseudo>, 22807330f729Sjoerg PseudoInstExpansion<(JumpInst RO:$rs)> { 22817330f729Sjoerg let isTerminator=1; 22827330f729Sjoerg let isBarrier=1; 22837330f729Sjoerg let hasDelaySlot = 1; 22847330f729Sjoerg let isBranch = 1; 22857330f729Sjoerg let isIndirectBranch = 1; 22867330f729Sjoerg bit isCTI = 1; 22877330f729Sjoerg} 22887330f729Sjoerg 22897330f729Sjoerglet AdditionalPredicates = [NotInMips16Mode, NotInMicroMips, 22907330f729Sjoerg NoIndirectJumpGuards] in 22917330f729Sjoerg def PseudoIndirectBranch : PseudoIndirectBranchBase<JR, GPR32Opnd>, 22927330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 22937330f729Sjoerg 22947330f729Sjoerg// Return instructions are matched as a RetRA instruction, then are expanded 22957330f729Sjoerg// into PseudoReturn/PseudoReturn64 after register allocation. Finally, 22967330f729Sjoerg// MipsAsmPrinter expands this into JR, JR64, JALR, or JALR64 depending on the 22977330f729Sjoerg// ISA. 22987330f729Sjoergclass PseudoReturnBase<RegisterOperand RO> : MipsPseudo<(outs), (ins RO:$rs), 22997330f729Sjoerg [], II_ReturnPseudo> { 23007330f729Sjoerg let isTerminator = 1; 23017330f729Sjoerg let isBarrier = 1; 23027330f729Sjoerg let hasDelaySlot = 1; 23037330f729Sjoerg let isReturn = 1; 23047330f729Sjoerg let isCodeGenOnly = 1; 23057330f729Sjoerg let hasCtrlDep = 1; 23067330f729Sjoerg let hasExtraSrcRegAllocReq = 1; 23077330f729Sjoerg bit isCTI = 1; 23087330f729Sjoerg} 23097330f729Sjoerg 23107330f729Sjoergdef PseudoReturn : PseudoReturnBase<GPR32Opnd>; 23117330f729Sjoerg 23127330f729Sjoerg// Exception handling related node and instructions. 23137330f729Sjoerg// The conversion sequence is: 23147330f729Sjoerg// ISD::EH_RETURN -> MipsISD::EH_RETURN -> 23157330f729Sjoerg// MIPSeh_return -> (stack change + indirect branch) 23167330f729Sjoerg// 23177330f729Sjoerg// MIPSeh_return takes the place of regular return instruction 23187330f729Sjoerg// but takes two arguments (V1, V0) which are used for storing 23197330f729Sjoerg// the offset and return address respectively. 23207330f729Sjoergdef SDT_MipsEHRET : SDTypeProfile<0, 2, [SDTCisInt<0>, SDTCisPtrTy<1>]>; 23217330f729Sjoerg 23227330f729Sjoergdef MIPSehret : SDNode<"MipsISD::EH_RETURN", SDT_MipsEHRET, 23237330f729Sjoerg [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; 23247330f729Sjoerg 23257330f729Sjoerglet Uses = [V0, V1], isTerminator = 1, isReturn = 1, 23267330f729Sjoerg isBarrier = 1, isCTI = 1, hasNoSchedulingInfo = 1 in { 23277330f729Sjoerg def MIPSeh_return32 : MipsPseudo<(outs), (ins GPR32:$spoff, GPR32:$dst), 23287330f729Sjoerg [(MIPSehret GPR32:$spoff, GPR32:$dst)]>; 23297330f729Sjoerg def MIPSeh_return64 : MipsPseudo<(outs), (ins GPR64:$spoff, GPR64:$dst), 23307330f729Sjoerg [(MIPSehret GPR64:$spoff, GPR64:$dst)]>; 23317330f729Sjoerg} 23327330f729Sjoerg 23337330f729Sjoerg/// Multiply and Divide Instructions. 23347330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 23357330f729Sjoerg def MULT : MMRel, Mult<"mult", II_MULT, GPR32Opnd, [HI0, LO0]>, 23367330f729Sjoerg MULT_FM<0, 0x18>, ISA_MIPS1_NOT_32R6_64R6; 23377330f729Sjoerg def MULTu : MMRel, Mult<"multu", II_MULTU, GPR32Opnd, [HI0, LO0]>, 23387330f729Sjoerg MULT_FM<0, 0x19>, ISA_MIPS1_NOT_32R6_64R6; 23397330f729Sjoerg def SDIV : MMRel, Div<"div", II_DIV, GPR32Opnd, [HI0, LO0]>, 23407330f729Sjoerg MULT_FM<0, 0x1a>, ISA_MIPS1_NOT_32R6_64R6; 23417330f729Sjoerg def UDIV : MMRel, Div<"divu", II_DIVU, GPR32Opnd, [HI0, LO0]>, 23427330f729Sjoerg MULT_FM<0, 0x1b>, ISA_MIPS1_NOT_32R6_64R6; 23437330f729Sjoerg def MTHI : MMRel, MoveToLOHI<"mthi", GPR32Opnd, [HI0]>, MTLO_FM<0x11>, 23447330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 23457330f729Sjoerg def MTLO : MMRel, MoveToLOHI<"mtlo", GPR32Opnd, [LO0]>, MTLO_FM<0x13>, 23467330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 23477330f729Sjoerg def MFHI : MMRel, MoveFromLOHI<"mfhi", GPR32Opnd, AC0>, MFLO_FM<0x10>, 23487330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 23497330f729Sjoerg def MFLO : MMRel, MoveFromLOHI<"mflo", GPR32Opnd, AC0>, MFLO_FM<0x12>, 23507330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 23517330f729Sjoerg 23527330f729Sjoerg /// Sign Ext In Register Instructions. 23537330f729Sjoerg def SEB : MMRel, StdMMR6Rel, SignExtInReg<"seb", i8, GPR32Opnd, II_SEB>, 23547330f729Sjoerg SEB_FM<0x10, 0x20>, ISA_MIPS32R2; 23557330f729Sjoerg def SEH : MMRel, StdMMR6Rel, SignExtInReg<"seh", i16, GPR32Opnd, II_SEH>, 23567330f729Sjoerg SEB_FM<0x18, 0x20>, ISA_MIPS32R2; 23577330f729Sjoerg 23587330f729Sjoerg /// Count Leading 23597330f729Sjoerg def CLZ : MMRel, CountLeading0<"clz", GPR32Opnd, II_CLZ>, CLO_FM<0x20>, 23607330f729Sjoerg ISA_MIPS32_NOT_32R6_64R6; 23617330f729Sjoerg def CLO : MMRel, CountLeading1<"clo", GPR32Opnd, II_CLO>, CLO_FM<0x21>, 23627330f729Sjoerg ISA_MIPS32_NOT_32R6_64R6; 23637330f729Sjoerg 23647330f729Sjoerg /// Word Swap Bytes Within Halfwords 23657330f729Sjoerg def WSBH : MMRel, SubwordSwap<"wsbh", GPR32Opnd, II_WSBH>, SEB_FM<2, 0x20>, 23667330f729Sjoerg ISA_MIPS32R2; 23677330f729Sjoerg 23687330f729Sjoerg /// No operation. 23697330f729Sjoerg def NOP : PseudoSE<(outs), (ins), []>, 23707330f729Sjoerg PseudoInstExpansion<(SLL ZERO, ZERO, 0)>, ISA_MIPS1; 23717330f729Sjoerg 23727330f729Sjoerg // FrameIndexes are legalized when they are operands from load/store 23737330f729Sjoerg // instructions. The same not happens for stack address copies, so an 23747330f729Sjoerg // add op with mem ComplexPattern is used and the stack address copy 23757330f729Sjoerg // can be matched. It's similar to Sparc LEA_ADDRi 23767330f729Sjoerg let AdditionalPredicates = [NotInMicroMips] in 2377*82d56013Sjoerg def LEA_ADDiu : MMRel, EffectiveAddress<"addiu", GPR32Opnd>, LW_FM<9>, 2378*82d56013Sjoerg ISA_MIPS1; 23797330f729Sjoerg 23807330f729Sjoerg // MADD*/MSUB* 23817330f729Sjoerg def MADD : MMRel, MArithR<"madd", II_MADD, 1>, MULT_FM<0x1c, 0>, 23827330f729Sjoerg ISA_MIPS32_NOT_32R6_64R6; 23837330f729Sjoerg def MADDU : MMRel, MArithR<"maddu", II_MADDU, 1>, MULT_FM<0x1c, 1>, 23847330f729Sjoerg ISA_MIPS32_NOT_32R6_64R6; 23857330f729Sjoerg def MSUB : MMRel, MArithR<"msub", II_MSUB>, MULT_FM<0x1c, 4>, 23867330f729Sjoerg ISA_MIPS32_NOT_32R6_64R6; 23877330f729Sjoerg def MSUBU : MMRel, MArithR<"msubu", II_MSUBU>, MULT_FM<0x1c, 5>, 23887330f729Sjoerg ISA_MIPS32_NOT_32R6_64R6; 23897330f729Sjoerg} 23907330f729Sjoerg 23917330f729Sjoerglet AdditionalPredicates = [NotDSP] in { 23927330f729Sjoergdef PseudoMULT : MultDivPseudo<MULT, ACC64, GPR32Opnd, MipsMult, II_MULT>, 23937330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 23947330f729Sjoergdef PseudoMULTu : MultDivPseudo<MULTu, ACC64, GPR32Opnd, MipsMultu, II_MULTU>, 23957330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 23967330f729Sjoergdef PseudoMFHI : PseudoMFLOHI<GPR32, ACC64, MipsMFHI>, ISA_MIPS1_NOT_32R6_64R6; 23977330f729Sjoergdef PseudoMFLO : PseudoMFLOHI<GPR32, ACC64, MipsMFLO>, ISA_MIPS1_NOT_32R6_64R6; 23987330f729Sjoergdef PseudoMTLOHI : PseudoMTLOHI<ACC64, GPR32>, ISA_MIPS1_NOT_32R6_64R6; 23997330f729Sjoergdef PseudoMADD : MAddSubPseudo<MADD, MipsMAdd, II_MADD>, 24007330f729Sjoerg ISA_MIPS32_NOT_32R6_64R6; 24017330f729Sjoergdef PseudoMADDU : MAddSubPseudo<MADDU, MipsMAddu, II_MADDU>, 24027330f729Sjoerg ISA_MIPS32_NOT_32R6_64R6; 24037330f729Sjoergdef PseudoMSUB : MAddSubPseudo<MSUB, MipsMSub, II_MSUB>, 24047330f729Sjoerg ISA_MIPS32_NOT_32R6_64R6; 24057330f729Sjoergdef PseudoMSUBU : MAddSubPseudo<MSUBU, MipsMSubu, II_MSUBU>, 24067330f729Sjoerg ISA_MIPS32_NOT_32R6_64R6; 24077330f729Sjoerg} 24087330f729Sjoerg 24097330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 24107330f729Sjoerg def PseudoSDIV : MultDivPseudo<SDIV, ACC64, GPR32Opnd, MipsDivRem, II_DIV, 24117330f729Sjoerg 0, 1, 1>, ISA_MIPS1_NOT_32R6_64R6; 24127330f729Sjoerg def PseudoUDIV : MultDivPseudo<UDIV, ACC64, GPR32Opnd, MipsDivRemU, II_DIVU, 24137330f729Sjoerg 0, 1, 1>, ISA_MIPS1_NOT_32R6_64R6; 24147330f729Sjoerg def RDHWR : MMRel, ReadHardware<GPR32Opnd, HWRegsOpnd>, RDHWR_FM, ISA_MIPS1; 24157330f729Sjoerg // TODO: Add '0 < pos+size <= 32' constraint check to ext instruction 24167330f729Sjoerg def EXT : MMRel, StdMMR6Rel, ExtBase<"ext", GPR32Opnd, uimm5, uimm5_plus1, 24177330f729Sjoerg immZExt5, immZExt5Plus1, MipsExt>, 24187330f729Sjoerg EXT_FM<0>, ISA_MIPS32R2; 24197330f729Sjoerg def INS : MMRel, StdMMR6Rel, InsBase<"ins", GPR32Opnd, uimm5, 24207330f729Sjoerg uimm5_inssize_plus1, immZExt5, 24217330f729Sjoerg immZExt5Plus1>, 24227330f729Sjoerg EXT_FM<4>, ISA_MIPS32R2; 24237330f729Sjoerg} 24247330f729Sjoerg/// Move Control Registers From/To CPU Registers 24257330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 24267330f729Sjoerg def MTC0 : MTC3OP<"mtc0", COP0Opnd, GPR32Opnd, II_MTC0>, 24277330f729Sjoerg MFC3OP_FM<0x10, 4, 0>, ISA_MIPS1; 24287330f729Sjoerg def MFC0 : MFC3OP<"mfc0", GPR32Opnd, COP0Opnd, II_MFC0>, 24297330f729Sjoerg MFC3OP_FM<0x10, 0, 0>, ISA_MIPS1; 24307330f729Sjoerg def MFC2 : MFC3OP<"mfc2", GPR32Opnd, COP2Opnd, II_MFC2>, 24317330f729Sjoerg MFC3OP_FM<0x12, 0, 0>, ISA_MIPS1; 24327330f729Sjoerg def MTC2 : MTC3OP<"mtc2", COP2Opnd, GPR32Opnd, II_MTC2>, 24337330f729Sjoerg MFC3OP_FM<0x12, 4, 0>, ISA_MIPS1; 24347330f729Sjoerg} 24357330f729Sjoerg 24367330f729Sjoergclass Barrier<string asmstr, InstrItinClass itin = NoItinerary> : 24377330f729Sjoerg InstSE<(outs), (ins), asmstr, [], itin, FrmOther, asmstr>; 24387330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 24397330f729Sjoerg def SSNOP : MMRel, StdMMR6Rel, Barrier<"ssnop", II_SSNOP>, BARRIER_FM<1>, 24407330f729Sjoerg ISA_MIPS1; 24417330f729Sjoerg def EHB : MMRel, Barrier<"ehb", II_EHB>, BARRIER_FM<3>, ISA_MIPS1; 24427330f729Sjoerg 24437330f729Sjoerg let isCTI = 1 in 24447330f729Sjoerg def PAUSE : MMRel, StdMMR6Rel, Barrier<"pause", II_PAUSE>, BARRIER_FM<5>, 24457330f729Sjoerg ISA_MIPS32R2; 24467330f729Sjoerg} 24477330f729Sjoerg 24487330f729Sjoerg// JR_HB and JALR_HB are defined here using the new style naming 24497330f729Sjoerg// scheme because some of this code is shared with Mips32r6InstrInfo.td 24507330f729Sjoerg// and because of that it doesn't follow the naming convention of the 24517330f729Sjoerg// rest of the file. To avoid a mixture of old vs new style, the new 24527330f729Sjoerg// style was chosen. 24537330f729Sjoergclass JR_HB_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> { 24547330f729Sjoerg dag OutOperandList = (outs); 24557330f729Sjoerg dag InOperandList = (ins GPROpnd:$rs); 24567330f729Sjoerg string AsmString = !strconcat(instr_asm, "\t$rs"); 24577330f729Sjoerg list<dag> Pattern = []; 24587330f729Sjoerg} 24597330f729Sjoerg 24607330f729Sjoergclass JALR_HB_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> { 24617330f729Sjoerg dag OutOperandList = (outs GPROpnd:$rd); 24627330f729Sjoerg dag InOperandList = (ins GPROpnd:$rs); 24637330f729Sjoerg string AsmString = !strconcat(instr_asm, "\t$rd, $rs"); 24647330f729Sjoerg list<dag> Pattern = []; 24657330f729Sjoerg} 24667330f729Sjoerg 24677330f729Sjoergclass JR_HB_DESC<RegisterOperand RO> : 24687330f729Sjoerg InstSE<(outs), (ins), "", [], II_JR_HB, FrmJ>, JR_HB_DESC_BASE<"jr.hb", RO> { 24697330f729Sjoerg let isBranch=1; 24707330f729Sjoerg let isIndirectBranch=1; 24717330f729Sjoerg let hasDelaySlot=1; 24727330f729Sjoerg let isTerminator=1; 24737330f729Sjoerg let isBarrier=1; 24747330f729Sjoerg bit isCTI = 1; 24757330f729Sjoerg} 24767330f729Sjoerg 24777330f729Sjoergclass JALR_HB_DESC<RegisterOperand RO> : 24787330f729Sjoerg InstSE<(outs), (ins), "", [], II_JALR_HB, FrmJ>, JALR_HB_DESC_BASE<"jalr.hb", 24797330f729Sjoerg RO> { 24807330f729Sjoerg let isIndirectBranch=1; 24817330f729Sjoerg let hasDelaySlot=1; 24827330f729Sjoerg bit isCTI = 1; 24837330f729Sjoerg} 24847330f729Sjoerg 24857330f729Sjoergclass JR_HB_ENC : JR_HB_FM<8>; 24867330f729Sjoergclass JALR_HB_ENC : JALR_HB_FM<9>; 24877330f729Sjoerg 24887330f729Sjoergdef JR_HB : JR_HB_DESC<GPR32Opnd>, JR_HB_ENC, ISA_MIPS32R2_NOT_32R6_64R6; 24897330f729Sjoergdef JALR_HB : JALR_HB_DESC<GPR32Opnd>, JALR_HB_ENC, ISA_MIPS32; 24907330f729Sjoerg 24917330f729Sjoerglet AdditionalPredicates = [NotInMicroMips, UseIndirectJumpsHazard] in 24927330f729Sjoerg def JALRHBPseudo : JumpLinkRegPseudo<GPR32Opnd, JALR_HB, RA>; 24937330f729Sjoerg 24947330f729Sjoerg 24957330f729Sjoerglet AdditionalPredicates = [NotInMips16Mode, NotInMicroMips, 24967330f729Sjoerg UseIndirectJumpsHazard] in { 24977330f729Sjoerg def TAILCALLREGHB : TailCallReg<JR_HB, GPR32Opnd>, ISA_MIPS32_NOT_32R6_64R6; 24987330f729Sjoerg def PseudoIndirectHazardBranch : PseudoIndirectBranchBase<JR_HB, GPR32Opnd>, 24997330f729Sjoerg ISA_MIPS32R2_NOT_32R6_64R6; 25007330f729Sjoerg} 25017330f729Sjoerg 25027330f729Sjoergclass TLB<string asmstr, InstrItinClass itin = NoItinerary> : 25037330f729Sjoerg InstSE<(outs), (ins), asmstr, [], itin, FrmOther, asmstr>; 25047330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 25057330f729Sjoerg def TLBP : MMRel, TLB<"tlbp", II_TLBP>, COP0_TLB_FM<0x08>, ISA_MIPS1; 25067330f729Sjoerg def TLBR : MMRel, TLB<"tlbr", II_TLBR>, COP0_TLB_FM<0x01>, ISA_MIPS1; 25077330f729Sjoerg def TLBWI : MMRel, TLB<"tlbwi", II_TLBWI>, COP0_TLB_FM<0x02>, ISA_MIPS1; 25087330f729Sjoerg def TLBWR : MMRel, TLB<"tlbwr", II_TLBWR>, COP0_TLB_FM<0x06>, ISA_MIPS1; 25097330f729Sjoerg} 25107330f729Sjoergclass CacheOp<string instr_asm, Operand MemOpnd, 25117330f729Sjoerg InstrItinClass itin = NoItinerary> : 25127330f729Sjoerg InstSE<(outs), (ins MemOpnd:$addr, uimm5:$hint), 25137330f729Sjoerg !strconcat(instr_asm, "\t$hint, $addr"), [], itin, FrmOther, 25147330f729Sjoerg instr_asm> { 25157330f729Sjoerg let DecoderMethod = "DecodeCacheOp"; 25167330f729Sjoerg} 25177330f729Sjoerg 25187330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 25197330f729Sjoerg def CACHE : MMRel, CacheOp<"cache", mem, II_CACHE>, CACHEOP_FM<0b101111>, 25207330f729Sjoerg INSN_MIPS3_32_NOT_32R6_64R6; 25217330f729Sjoerg def PREF : MMRel, CacheOp<"pref", mem, II_PREF>, CACHEOP_FM<0b110011>, 25227330f729Sjoerg INSN_MIPS3_32_NOT_32R6_64R6; 25237330f729Sjoerg} 25247330f729Sjoerg// FIXME: We are missing the prefx instruction. 25257330f729Sjoergdef ROL : MipsAsmPseudoInst<(outs), 25267330f729Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt, GPR32Opnd:$rd), 25277330f729Sjoerg "rol\t$rs, $rt, $rd">; 25287330f729Sjoergdef ROLImm : MipsAsmPseudoInst<(outs), 25297330f729Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt, simm16:$imm), 25307330f729Sjoerg "rol\t$rs, $rt, $imm">; 25317330f729Sjoergdef : MipsInstAlias<"rol $rd, $rs", 25327330f729Sjoerg (ROL GPR32Opnd:$rd, GPR32Opnd:$rd, GPR32Opnd:$rs), 0>; 25337330f729Sjoergdef : MipsInstAlias<"rol $rd, $imm", 25347330f729Sjoerg (ROLImm GPR32Opnd:$rd, GPR32Opnd:$rd, simm16:$imm), 0>; 25357330f729Sjoerg 25367330f729Sjoergdef ROR : MipsAsmPseudoInst<(outs), 25377330f729Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt, GPR32Opnd:$rd), 25387330f729Sjoerg "ror\t$rs, $rt, $rd">; 25397330f729Sjoergdef RORImm : MipsAsmPseudoInst<(outs), 25407330f729Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt, simm16:$imm), 25417330f729Sjoerg "ror\t$rs, $rt, $imm">; 25427330f729Sjoergdef : MipsInstAlias<"ror $rd, $rs", 25437330f729Sjoerg (ROR GPR32Opnd:$rd, GPR32Opnd:$rd, GPR32Opnd:$rs), 0>; 25447330f729Sjoergdef : MipsInstAlias<"ror $rd, $imm", 25457330f729Sjoerg (RORImm GPR32Opnd:$rd, GPR32Opnd:$rd, simm16:$imm), 0>; 25467330f729Sjoerg 25477330f729Sjoergdef DROL : MipsAsmPseudoInst<(outs), 25487330f729Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt, GPR32Opnd:$rd), 25497330f729Sjoerg "drol\t$rs, $rt, $rd">, ISA_MIPS64; 25507330f729Sjoergdef DROLImm : MipsAsmPseudoInst<(outs), 25517330f729Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt, simm16:$imm), 25527330f729Sjoerg "drol\t$rs, $rt, $imm">, ISA_MIPS64; 25537330f729Sjoergdef : MipsInstAlias<"drol $rd, $rs", 2554*82d56013Sjoerg (DROL GPR32Opnd:$rd, GPR32Opnd:$rd, GPR32Opnd:$rs), 0>, 2555*82d56013Sjoerg ISA_MIPS64; 25567330f729Sjoergdef : MipsInstAlias<"drol $rd, $imm", 2557*82d56013Sjoerg (DROLImm GPR32Opnd:$rd, GPR32Opnd:$rd, simm16:$imm), 0>, 2558*82d56013Sjoerg ISA_MIPS64; 25597330f729Sjoerg 25607330f729Sjoergdef DROR : MipsAsmPseudoInst<(outs), 25617330f729Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt, GPR32Opnd:$rd), 25627330f729Sjoerg "dror\t$rs, $rt, $rd">, ISA_MIPS64; 25637330f729Sjoergdef DRORImm : MipsAsmPseudoInst<(outs), 25647330f729Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt, simm16:$imm), 25657330f729Sjoerg "dror\t$rs, $rt, $imm">, ISA_MIPS64; 25667330f729Sjoergdef : MipsInstAlias<"dror $rd, $rs", 2567*82d56013Sjoerg (DROR GPR32Opnd:$rd, GPR32Opnd:$rd, GPR32Opnd:$rs), 0>, 2568*82d56013Sjoerg ISA_MIPS64; 25697330f729Sjoergdef : MipsInstAlias<"dror $rd, $imm", 2570*82d56013Sjoerg (DRORImm GPR32Opnd:$rd, GPR32Opnd:$rd, simm16:$imm), 0>, 2571*82d56013Sjoerg ISA_MIPS64; 25727330f729Sjoerg 25737330f729Sjoergdef ABSMacro : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), (ins GPR32Opnd:$rs), 25747330f729Sjoerg "abs\t$rd, $rs">; 25757330f729Sjoerg 25767330f729Sjoergdef SEQMacro : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 25777330f729Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt), 25787330f729Sjoerg "seq $rd, $rs, $rt">, NOT_ASE_CNMIPS; 25797330f729Sjoerg 25807330f729Sjoergdef : MipsInstAlias<"seq $rd, $rs", 25817330f729Sjoerg (SEQMacro GPR32Opnd:$rd, GPR32Opnd:$rd, GPR32Opnd:$rs), 0>, 25827330f729Sjoerg NOT_ASE_CNMIPS; 25837330f729Sjoerg 25847330f729Sjoergdef SEQIMacro : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 25857330f729Sjoerg (ins GPR32Opnd:$rs, simm32_relaxed:$imm), 25867330f729Sjoerg "seq $rd, $rs, $imm">, NOT_ASE_CNMIPS; 25877330f729Sjoerg 25887330f729Sjoergdef : MipsInstAlias<"seq $rd, $imm", 25897330f729Sjoerg (SEQIMacro GPR32Opnd:$rd, GPR32Opnd:$rd, simm32:$imm), 0>, 25907330f729Sjoerg NOT_ASE_CNMIPS; 25917330f729Sjoerg 2592*82d56013Sjoergdef SNEMacro : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 2593*82d56013Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt), 2594*82d56013Sjoerg "sne $rd, $rs, $rt">, NOT_ASE_CNMIPS; 2595*82d56013Sjoerg 2596*82d56013Sjoergdef : MipsInstAlias<"sne $rd, $rs", 2597*82d56013Sjoerg (SNEMacro GPR32Opnd:$rd, GPR32Opnd:$rd, GPR32Opnd:$rs), 0>, 2598*82d56013Sjoerg NOT_ASE_CNMIPS; 2599*82d56013Sjoerg 2600*82d56013Sjoergdef SNEIMacro : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 2601*82d56013Sjoerg (ins GPR32Opnd:$rs, simm32_relaxed:$imm), 2602*82d56013Sjoerg "sne $rd, $rs, $imm">, NOT_ASE_CNMIPS; 2603*82d56013Sjoerg 2604*82d56013Sjoergdef : MipsInstAlias<"sne $rd, $imm", 2605*82d56013Sjoerg (SNEIMacro GPR32Opnd:$rd, GPR32Opnd:$rd, simm32:$imm), 0>, 2606*82d56013Sjoerg NOT_ASE_CNMIPS; 2607*82d56013Sjoerg 26087330f729Sjoergdef MULImmMacro : MipsAsmPseudoInst<(outs), (ins GPR32Opnd:$rd, GPR32Opnd:$rs, 26097330f729Sjoerg simm32_relaxed:$imm), 26107330f729Sjoerg "mul\t$rd, $rs, $imm">, 26117330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 26127330f729Sjoergdef MULOMacro : MipsAsmPseudoInst<(outs), (ins GPR32Opnd:$rd, GPR32Opnd:$rs, 26137330f729Sjoerg GPR32Opnd:$rt), 26147330f729Sjoerg "mulo\t$rd, $rs, $rt">, 26157330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 26167330f729Sjoergdef MULOUMacro : MipsAsmPseudoInst<(outs), (ins GPR32Opnd:$rd, GPR32Opnd:$rs, 26177330f729Sjoerg GPR32Opnd:$rt), 26187330f729Sjoerg "mulou\t$rd, $rs, $rt">, 26197330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 26207330f729Sjoerg 26217330f729Sjoerg// Virtualization ASE 26227330f729Sjoergclass HYPCALL_FT<string opstr> : 26237330f729Sjoerg InstSE<(outs), (ins uimm10:$code_), 26247330f729Sjoerg !strconcat(opstr, "\t$code_"), [], II_HYPCALL, FrmOther, opstr> { 26257330f729Sjoerg let BaseOpcode = opstr; 26267330f729Sjoerg} 26277330f729Sjoerg 26287330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 26297330f729Sjoerg def MFGC0 : MMRel, MFC3OP<"mfgc0", GPR32Opnd, COP0Opnd, II_MFGC0>, 26307330f729Sjoerg MFC3OP_FM<0x10, 3, 0>, ISA_MIPS32R5, ASE_VIRT; 26317330f729Sjoerg def MTGC0 : MMRel, MTC3OP<"mtgc0", COP0Opnd, GPR32Opnd, II_MTGC0>, 26327330f729Sjoerg MFC3OP_FM<0x10, 3, 2>, ISA_MIPS32R5, ASE_VIRT; 26337330f729Sjoerg def MFHGC0 : MMRel, MFC3OP<"mfhgc0", GPR32Opnd, COP0Opnd, II_MFHGC0>, 26347330f729Sjoerg MFC3OP_FM<0x10, 3, 4>, ISA_MIPS32R5, ASE_VIRT; 26357330f729Sjoerg def MTHGC0 : MMRel, MTC3OP<"mthgc0", COP0Opnd, GPR32Opnd, II_MTHGC0>, 26367330f729Sjoerg MFC3OP_FM<0x10, 3, 6>, ISA_MIPS32R5, ASE_VIRT; 26377330f729Sjoerg def TLBGINV : MMRel, TLB<"tlbginv", II_TLBGINV>, COP0_TLB_FM<0b001011>, 26387330f729Sjoerg ISA_MIPS32R5, ASE_VIRT; 26397330f729Sjoerg def TLBGINVF : MMRel, TLB<"tlbginvf", II_TLBGINVF>, COP0_TLB_FM<0b001100>, 26407330f729Sjoerg ISA_MIPS32R5, ASE_VIRT; 26417330f729Sjoerg def TLBGP : MMRel, TLB<"tlbgp", II_TLBGP>, COP0_TLB_FM<0b010000>, 26427330f729Sjoerg ISA_MIPS32R5, ASE_VIRT; 26437330f729Sjoerg def TLBGR : MMRel, TLB<"tlbgr", II_TLBGR>, COP0_TLB_FM<0b001001>, 26447330f729Sjoerg ISA_MIPS32R5, ASE_VIRT; 26457330f729Sjoerg def TLBGWI : MMRel, TLB<"tlbgwi", II_TLBGWI>, COP0_TLB_FM<0b001010>, 26467330f729Sjoerg ISA_MIPS32R5, ASE_VIRT; 26477330f729Sjoerg def TLBGWR : MMRel, TLB<"tlbgwr", II_TLBGWR>, COP0_TLB_FM<0b001110>, 26487330f729Sjoerg ISA_MIPS32R5, ASE_VIRT; 26497330f729Sjoerg def HYPCALL : MMRel, HYPCALL_FT<"hypcall">, 26507330f729Sjoerg HYPCALL_FM<0b101000>, ISA_MIPS32R5, ASE_VIRT; 26517330f729Sjoerg} 26527330f729Sjoerg 26537330f729Sjoerg//===----------------------------------------------------------------------===// 26547330f729Sjoerg// Instruction aliases 26557330f729Sjoerg//===----------------------------------------------------------------------===// 26567330f729Sjoerg 26577330f729Sjoergmulticlass OneOrTwoOperandMacroImmediateAlias<string Memnomic, 26587330f729Sjoerg Instruction Opcode, 26597330f729Sjoerg RegisterOperand RO = GPR32Opnd, 26607330f729Sjoerg Operand Imm = simm32_relaxed> { 26617330f729Sjoerg def : MipsInstAlias<!strconcat(Memnomic, " $rs, $rt, $imm"), 26627330f729Sjoerg (Opcode RO:$rs, 26637330f729Sjoerg RO:$rt, 26647330f729Sjoerg Imm:$imm), 0>; 26657330f729Sjoerg def : MipsInstAlias<!strconcat(Memnomic, " $rs, $imm"), 26667330f729Sjoerg (Opcode RO:$rs, 26677330f729Sjoerg RO:$rs, 26687330f729Sjoerg Imm:$imm), 0>; 26697330f729Sjoerg} 26707330f729Sjoerg 26717330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 26727330f729Sjoerg def : MipsInstAlias<"move $dst, $src", 26737330f729Sjoerg (OR GPR32Opnd:$dst, GPR32Opnd:$src, ZERO), 1>, 26747330f729Sjoerg GPR_32, ISA_MIPS1; 26757330f729Sjoerg def : MipsInstAlias<"move $dst, $src", 26767330f729Sjoerg (ADDu GPR32Opnd:$dst, GPR32Opnd:$src, ZERO), 1>, 26777330f729Sjoerg GPR_32, ISA_MIPS1; 26787330f729Sjoerg 26797330f729Sjoerg def : MipsInstAlias<"bal $offset", (BGEZAL ZERO, brtarget:$offset), 1>, 26807330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 26817330f729Sjoerg 26827330f729Sjoerg def : MipsInstAlias<"j $rs", (JR GPR32Opnd:$rs), 0>, ISA_MIPS1; 26837330f729Sjoerg 26847330f729Sjoerg def : MipsInstAlias<"jalr $rs", (JALR RA, GPR32Opnd:$rs), 0>; 26857330f729Sjoerg 26867330f729Sjoerg def : MipsInstAlias<"jalr.hb $rs", (JALR_HB RA, GPR32Opnd:$rs), 1>, 26877330f729Sjoerg ISA_MIPS32; 26887330f729Sjoerg 26897330f729Sjoerg def : MipsInstAlias<"neg $rt, $rs", 26907330f729Sjoerg (SUB GPR32Opnd:$rt, ZERO, GPR32Opnd:$rs), 1>, ISA_MIPS1; 26917330f729Sjoerg def : MipsInstAlias<"neg $rt", 26927330f729Sjoerg (SUB GPR32Opnd:$rt, ZERO, GPR32Opnd:$rt), 1>, ISA_MIPS1; 26937330f729Sjoerg def : MipsInstAlias<"negu $rt, $rs", 26947330f729Sjoerg (SUBu GPR32Opnd:$rt, ZERO, GPR32Opnd:$rs), 1>, ISA_MIPS1; 26957330f729Sjoerg def : MipsInstAlias<"negu $rt", 26967330f729Sjoerg (SUBu GPR32Opnd:$rt, ZERO, GPR32Opnd:$rt), 1>, ISA_MIPS1; 26977330f729Sjoerg 26987330f729Sjoerg def SGE : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 26997330f729Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt), 27007330f729Sjoerg "sge\t$rd, $rs, $rt">, ISA_MIPS1; 27017330f729Sjoerg def : MipsInstAlias<"sge $rs, $rt", 27027330f729Sjoerg (SGE GPR32Opnd:$rs, GPR32Opnd:$rs, GPR32Opnd:$rt), 0>, 27037330f729Sjoerg ISA_MIPS1; 27047330f729Sjoerg def SGEImm : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 27057330f729Sjoerg (ins GPR32Opnd:$rs, simm32:$imm), 27067330f729Sjoerg "sge\t$rd, $rs, $imm">, GPR_32; 27077330f729Sjoerg def : MipsInstAlias<"sge $rs, $imm", (SGEImm GPR32Opnd:$rs, 27087330f729Sjoerg GPR32Opnd:$rs, 27097330f729Sjoerg simm32:$imm), 0>, 27107330f729Sjoerg GPR_32; 27117330f729Sjoerg 27127330f729Sjoerg def SGEU : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 27137330f729Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt), 27147330f729Sjoerg "sgeu\t$rd, $rs, $rt">, ISA_MIPS1; 27157330f729Sjoerg def : MipsInstAlias<"sgeu $rs, $rt", 27167330f729Sjoerg (SGEU GPR32Opnd:$rs, GPR32Opnd:$rs, GPR32Opnd:$rt), 0>, 27177330f729Sjoerg ISA_MIPS1; 27187330f729Sjoerg def SGEUImm : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 27197330f729Sjoerg (ins GPR32Opnd:$rs, uimm32_coerced:$imm), 27207330f729Sjoerg "sgeu\t$rd, $rs, $imm">, GPR_32; 27217330f729Sjoerg def : MipsInstAlias<"sgeu $rs, $imm", (SGEUImm GPR32Opnd:$rs, 27227330f729Sjoerg GPR32Opnd:$rs, 27237330f729Sjoerg uimm32_coerced:$imm), 0>, 27247330f729Sjoerg GPR_32; 27257330f729Sjoerg 27267330f729Sjoerg def : MipsInstAlias< 27277330f729Sjoerg "sgt $rd, $rs, $rt", 27287330f729Sjoerg (SLT GPR32Opnd:$rd, GPR32Opnd:$rt, GPR32Opnd:$rs), 0>, ISA_MIPS1; 27297330f729Sjoerg def : MipsInstAlias< 27307330f729Sjoerg "sgt $rs, $rt", 27317330f729Sjoerg (SLT GPR32Opnd:$rs, GPR32Opnd:$rt, GPR32Opnd:$rs), 0>, ISA_MIPS1; 27327330f729Sjoerg 27337330f729Sjoerg def SGTImm : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 27347330f729Sjoerg (ins GPR32Opnd:$rs, simm32:$imm), 27357330f729Sjoerg "sgt\t$rd, $rs, $imm">, GPR_32; 27367330f729Sjoerg def : MipsInstAlias<"sgt $rs, $imm", (SGTImm GPR32Opnd:$rs, 27377330f729Sjoerg GPR32Opnd:$rs, 27387330f729Sjoerg simm32:$imm), 0>, 27397330f729Sjoerg GPR_32; 27407330f729Sjoerg def : MipsInstAlias< 27417330f729Sjoerg "sgtu $rd, $rs, $rt", 27427330f729Sjoerg (SLTu GPR32Opnd:$rd, GPR32Opnd:$rt, GPR32Opnd:$rs), 0>, ISA_MIPS1; 27437330f729Sjoerg def : MipsInstAlias< 27447330f729Sjoerg "sgtu $$rs, $rt", 27457330f729Sjoerg (SLTu GPR32Opnd:$rs, GPR32Opnd:$rt, GPR32Opnd:$rs), 0>, ISA_MIPS1; 27467330f729Sjoerg 27477330f729Sjoerg def SGTUImm : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 27487330f729Sjoerg (ins GPR32Opnd:$rs, uimm32_coerced:$imm), 27497330f729Sjoerg "sgtu\t$rd, $rs, $imm">, GPR_32; 27507330f729Sjoerg def : MipsInstAlias<"sgtu $rs, $imm", (SGTUImm GPR32Opnd:$rs, 27517330f729Sjoerg GPR32Opnd:$rs, 27527330f729Sjoerg uimm32_coerced:$imm), 0>, 27537330f729Sjoerg GPR_32; 27547330f729Sjoerg 2755*82d56013Sjoerg def SLE : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 2756*82d56013Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt), 2757*82d56013Sjoerg "sle\t$rd, $rs, $rt">, ISA_MIPS1; 2758*82d56013Sjoerg def : MipsInstAlias<"sle $rs, $rt", 2759*82d56013Sjoerg (SLE GPR32Opnd:$rs, GPR32Opnd:$rs, GPR32Opnd:$rt), 0>, 2760*82d56013Sjoerg ISA_MIPS1; 2761*82d56013Sjoerg def SLEImm : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 2762*82d56013Sjoerg (ins GPR32Opnd:$rs, simm32:$imm), 2763*82d56013Sjoerg "sle\t$rd, $rs, $imm">, GPR_32; 2764*82d56013Sjoerg def : MipsInstAlias<"sle $rs, $imm", (SLEImm GPR32Opnd:$rs, 2765*82d56013Sjoerg GPR32Opnd:$rs, 2766*82d56013Sjoerg simm32:$imm), 0>, 2767*82d56013Sjoerg GPR_32; 2768*82d56013Sjoerg 2769*82d56013Sjoerg def SLEU : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 2770*82d56013Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt), 2771*82d56013Sjoerg "sleu\t$rd, $rs, $rt">, ISA_MIPS1; 2772*82d56013Sjoerg def : MipsInstAlias<"sleu $rs, $rt", 2773*82d56013Sjoerg (SLEU GPR32Opnd:$rs, GPR32Opnd:$rs, GPR32Opnd:$rt), 0>, 2774*82d56013Sjoerg ISA_MIPS1; 2775*82d56013Sjoerg def SLEUImm : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 2776*82d56013Sjoerg (ins GPR32Opnd:$rs, uimm32_coerced:$imm), 2777*82d56013Sjoerg "sleu\t$rd, $rs, $imm">, GPR_32; 2778*82d56013Sjoerg def : MipsInstAlias<"sleu $rs, $imm", (SLEUImm GPR32Opnd:$rs, 2779*82d56013Sjoerg GPR32Opnd:$rs, 2780*82d56013Sjoerg uimm32_coerced:$imm), 0>, 2781*82d56013Sjoerg GPR_32; 2782*82d56013Sjoerg 27837330f729Sjoerg def : MipsInstAlias< 27847330f729Sjoerg "not $rt, $rs", 27857330f729Sjoerg (NOR GPR32Opnd:$rt, GPR32Opnd:$rs, ZERO), 0>, ISA_MIPS1; 27867330f729Sjoerg def : MipsInstAlias< 27877330f729Sjoerg "not $rt", 27887330f729Sjoerg (NOR GPR32Opnd:$rt, GPR32Opnd:$rt, ZERO), 0>, ISA_MIPS1; 27897330f729Sjoerg 27907330f729Sjoerg def : MipsInstAlias<"nop", (SLL ZERO, ZERO, 0), 1>, ISA_MIPS1; 27917330f729Sjoerg 2792*82d56013Sjoerg defm : OneOrTwoOperandMacroImmediateAlias<"add", ADDi>, 2793*82d56013Sjoerg ISA_MIPS1_NOT_32R6_64R6; 27947330f729Sjoerg 27957330f729Sjoerg defm : OneOrTwoOperandMacroImmediateAlias<"addu", ADDiu>, ISA_MIPS1; 27967330f729Sjoerg 27977330f729Sjoerg defm : OneOrTwoOperandMacroImmediateAlias<"and", ANDi>, ISA_MIPS1, GPR_32; 27987330f729Sjoerg 27997330f729Sjoerg defm : OneOrTwoOperandMacroImmediateAlias<"or", ORi>, ISA_MIPS1, GPR_32; 28007330f729Sjoerg 28017330f729Sjoerg defm : OneOrTwoOperandMacroImmediateAlias<"xor", XORi>, ISA_MIPS1, GPR_32; 28027330f729Sjoerg 28037330f729Sjoerg defm : OneOrTwoOperandMacroImmediateAlias<"slt", SLTi>, ISA_MIPS1, GPR_32; 28047330f729Sjoerg 28057330f729Sjoerg defm : OneOrTwoOperandMacroImmediateAlias<"sltu", SLTiu>, ISA_MIPS1, GPR_32; 28067330f729Sjoerg 28077330f729Sjoerg def : MipsInstAlias<"mfgc0 $rt, $rd", 28087330f729Sjoerg (MFGC0 GPR32Opnd:$rt, COP0Opnd:$rd, 0), 0>, 28097330f729Sjoerg ISA_MIPS32R5, ASE_VIRT; 28107330f729Sjoerg def : MipsInstAlias<"mtgc0 $rt, $rd", 28117330f729Sjoerg (MTGC0 COP0Opnd:$rd, GPR32Opnd:$rt, 0), 0>, 28127330f729Sjoerg ISA_MIPS32R5, ASE_VIRT; 28137330f729Sjoerg def : MipsInstAlias<"mfhgc0 $rt, $rd", 28147330f729Sjoerg (MFHGC0 GPR32Opnd:$rt, COP0Opnd:$rd, 0), 0>, 28157330f729Sjoerg ISA_MIPS32R5, ASE_VIRT; 28167330f729Sjoerg def : MipsInstAlias<"mthgc0 $rt, $rd", 28177330f729Sjoerg (MTHGC0 COP0Opnd:$rd, GPR32Opnd:$rt, 0), 0>, 28187330f729Sjoerg ISA_MIPS32R5, ASE_VIRT; 28197330f729Sjoerg def : MipsInstAlias<"mfc0 $rt, $rd", (MFC0 GPR32Opnd:$rt, COP0Opnd:$rd, 0), 0>, 28207330f729Sjoerg ISA_MIPS1; 28217330f729Sjoerg def : MipsInstAlias<"mtc0 $rt, $rd", (MTC0 COP0Opnd:$rd, GPR32Opnd:$rt, 0), 0>, 28227330f729Sjoerg ISA_MIPS1; 28237330f729Sjoerg def : MipsInstAlias<"mfc2 $rt, $rd", (MFC2 GPR32Opnd:$rt, COP2Opnd:$rd, 0), 0>, 28247330f729Sjoerg ISA_MIPS1; 28257330f729Sjoerg def : MipsInstAlias<"mtc2 $rt, $rd", (MTC2 COP2Opnd:$rd, GPR32Opnd:$rt, 0), 0>, 28267330f729Sjoerg ISA_MIPS1; 28277330f729Sjoerg 28287330f729Sjoerg def : MipsInstAlias<"b $offset", (BEQ ZERO, ZERO, brtarget:$offset), 0>, 28297330f729Sjoerg ISA_MIPS1; 28307330f729Sjoerg 28317330f729Sjoerg def : MipsInstAlias<"bnez $rs,$offset", 28327330f729Sjoerg (BNE GPR32Opnd:$rs, ZERO, brtarget:$offset), 0>, 28337330f729Sjoerg ISA_MIPS1; 28347330f729Sjoerg def : MipsInstAlias<"bnezl $rs, $offset", 28357330f729Sjoerg (BNEL GPR32Opnd:$rs, ZERO, brtarget:$offset), 1>, 28367330f729Sjoerg ISA_MIPS2; 28377330f729Sjoerg def : MipsInstAlias<"beqz $rs,$offset", 28387330f729Sjoerg (BEQ GPR32Opnd:$rs, ZERO, brtarget:$offset), 0>, 28397330f729Sjoerg ISA_MIPS1; 28407330f729Sjoerg def : MipsInstAlias<"beqzl $rs, $offset", 28417330f729Sjoerg (BEQL GPR32Opnd:$rs, ZERO, brtarget:$offset), 1>, 28427330f729Sjoerg ISA_MIPS2; 28437330f729Sjoerg 28447330f729Sjoerg def : MipsInstAlias<"syscall", (SYSCALL 0), 1>, ISA_MIPS1; 28457330f729Sjoerg 28467330f729Sjoerg def : MipsInstAlias<"break", (BREAK 0, 0), 1>, ISA_MIPS1; 28477330f729Sjoerg def : MipsInstAlias<"break $imm", (BREAK uimm10:$imm, 0), 1>, ISA_MIPS1; 28487330f729Sjoerg def : MipsInstAlias<"ei", (EI ZERO), 1>, ISA_MIPS32R2; 28497330f729Sjoerg def : MipsInstAlias<"di", (DI ZERO), 1>, ISA_MIPS32R2; 28507330f729Sjoerg 28517330f729Sjoerg def : MipsInstAlias<"teq $rs, $rt", 28527330f729Sjoerg (TEQ GPR32Opnd:$rs, GPR32Opnd:$rt, 0), 1>, ISA_MIPS2; 28537330f729Sjoerg def : MipsInstAlias<"tge $rs, $rt", 28547330f729Sjoerg (TGE GPR32Opnd:$rs, GPR32Opnd:$rt, 0), 1>, ISA_MIPS2; 28557330f729Sjoerg def : MipsInstAlias<"tgeu $rs, $rt", 28567330f729Sjoerg (TGEU GPR32Opnd:$rs, GPR32Opnd:$rt, 0), 1>, ISA_MIPS2; 28577330f729Sjoerg def : MipsInstAlias<"tlt $rs, $rt", 28587330f729Sjoerg (TLT GPR32Opnd:$rs, GPR32Opnd:$rt, 0), 1>, ISA_MIPS2; 28597330f729Sjoerg def : MipsInstAlias<"tltu $rs, $rt", 28607330f729Sjoerg (TLTU GPR32Opnd:$rs, GPR32Opnd:$rt, 0), 1>, ISA_MIPS2; 28617330f729Sjoerg def : MipsInstAlias<"tne $rs, $rt", 28627330f729Sjoerg (TNE GPR32Opnd:$rs, GPR32Opnd:$rt, 0), 1>, ISA_MIPS2; 28637330f729Sjoerg def : MipsInstAlias<"rdhwr $rt, $rs", 28647330f729Sjoerg (RDHWR GPR32Opnd:$rt, HWRegsOpnd:$rs, 0), 1>, ISA_MIPS1; 28657330f729Sjoerg 28667330f729Sjoerg} 28677330f729Sjoergdef : MipsInstAlias<"sub, $rd, $rs, $imm", 28687330f729Sjoerg (ADDi GPR32Opnd:$rd, GPR32Opnd:$rs, 28697330f729Sjoerg InvertedImOperand:$imm), 0>, ISA_MIPS1_NOT_32R6_64R6; 28707330f729Sjoergdef : MipsInstAlias<"sub $rs, $imm", 28717330f729Sjoerg (ADDi GPR32Opnd:$rs, GPR32Opnd:$rs, InvertedImOperand:$imm), 28727330f729Sjoerg 0>, ISA_MIPS1_NOT_32R6_64R6; 28737330f729Sjoergdef : MipsInstAlias<"subu, $rd, $rs, $imm", 28747330f729Sjoerg (ADDiu GPR32Opnd:$rd, GPR32Opnd:$rs, 28757330f729Sjoerg InvertedImOperand:$imm), 0>; 28767330f729Sjoergdef : MipsInstAlias<"subu $rs, $imm", (ADDiu GPR32Opnd:$rs, GPR32Opnd:$rs, 28777330f729Sjoerg InvertedImOperand:$imm), 0>; 28787330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 28797330f729Sjoerg def : MipsInstAlias<"sll $rd, $rt, $rs", 28807330f729Sjoerg (SLLV GPR32Opnd:$rd, GPR32Opnd:$rt, GPR32Opnd:$rs), 0>; 28817330f729Sjoerg def : MipsInstAlias<"sra $rd, $rt, $rs", 28827330f729Sjoerg (SRAV GPR32Opnd:$rd, GPR32Opnd:$rt, GPR32Opnd:$rs), 0>; 28837330f729Sjoerg def : MipsInstAlias<"srl $rd, $rt, $rs", 28847330f729Sjoerg (SRLV GPR32Opnd:$rd, GPR32Opnd:$rt, GPR32Opnd:$rs), 0>; 28857330f729Sjoerg def : MipsInstAlias<"sll $rd, $rt", 28867330f729Sjoerg (SLLV GPR32Opnd:$rd, GPR32Opnd:$rd, GPR32Opnd:$rt), 0>; 28877330f729Sjoerg def : MipsInstAlias<"sra $rd, $rt", 28887330f729Sjoerg (SRAV GPR32Opnd:$rd, GPR32Opnd:$rd, GPR32Opnd:$rt), 0>; 28897330f729Sjoerg def : MipsInstAlias<"srl $rd, $rt", 28907330f729Sjoerg (SRLV GPR32Opnd:$rd, GPR32Opnd:$rd, GPR32Opnd:$rt), 0>; 28917330f729Sjoerg def : MipsInstAlias<"seh $rd", (SEH GPR32Opnd:$rd, GPR32Opnd:$rd), 0>, 28927330f729Sjoerg ISA_MIPS32R2; 28937330f729Sjoerg def : MipsInstAlias<"seb $rd", (SEB GPR32Opnd:$rd, GPR32Opnd:$rd), 0>, 28947330f729Sjoerg ISA_MIPS32R2; 28957330f729Sjoerg} 28967330f729Sjoergdef : MipsInstAlias<"sdbbp", (SDBBP 0)>, ISA_MIPS32_NOT_32R6_64R6; 28977330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in 28987330f729Sjoerg def : MipsInstAlias<"sync", (SYNC 0), 1>, ISA_MIPS2; 28997330f729Sjoerg 29007330f729Sjoergdef : MipsInstAlias<"mulo $rs, $rt", 29017330f729Sjoerg (MULOMacro GPR32Opnd:$rs, GPR32Opnd:$rs, GPR32Opnd:$rt), 0>, 29027330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 29037330f729Sjoergdef : MipsInstAlias<"mulou $rs, $rt", 29047330f729Sjoerg (MULOUMacro GPR32Opnd:$rs, GPR32Opnd:$rs, GPR32Opnd:$rt), 0>, 29057330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 29067330f729Sjoerg 29077330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in 29087330f729Sjoerg def : MipsInstAlias<"hypcall", (HYPCALL 0), 1>, ISA_MIPS32R5, ASE_VIRT; 29097330f729Sjoerg 29107330f729Sjoerg//===----------------------------------------------------------------------===// 29117330f729Sjoerg// Assembler Pseudo Instructions 29127330f729Sjoerg//===----------------------------------------------------------------------===// 29137330f729Sjoerg 29147330f729Sjoerg// We use uimm32_coerced to accept a 33 bit signed number that is rendered into 29157330f729Sjoerg// a 32 bit number. 29167330f729Sjoergclass LoadImmediate32<string instr_asm, Operand Od, RegisterOperand RO> : 29177330f729Sjoerg MipsAsmPseudoInst<(outs RO:$rt), (ins Od:$imm32), 29187330f729Sjoerg !strconcat(instr_asm, "\t$rt, $imm32")> ; 29197330f729Sjoergdef LoadImm32 : LoadImmediate32<"li", uimm32_coerced, GPR32Opnd>; 29207330f729Sjoerg 29217330f729Sjoergclass LoadAddressFromReg32<string instr_asm, Operand MemOpnd, 29227330f729Sjoerg RegisterOperand RO> : 29237330f729Sjoerg MipsAsmPseudoInst<(outs RO:$rt), (ins MemOpnd:$addr), 29247330f729Sjoerg !strconcat(instr_asm, "\t$rt, $addr")> ; 29257330f729Sjoergdef LoadAddrReg32 : LoadAddressFromReg32<"la", mem, GPR32Opnd>; 29267330f729Sjoerg 29277330f729Sjoergclass LoadAddressFromImm32<string instr_asm, Operand Od, RegisterOperand RO> : 29287330f729Sjoerg MipsAsmPseudoInst<(outs RO:$rt), (ins Od:$imm32), 29297330f729Sjoerg !strconcat(instr_asm, "\t$rt, $imm32")> ; 29307330f729Sjoergdef LoadAddrImm32 : LoadAddressFromImm32<"la", i32imm, GPR32Opnd>; 29317330f729Sjoerg 29327330f729Sjoergdef JalTwoReg : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), (ins GPR32Opnd:$rs), 29337330f729Sjoerg "jal\t$rd, $rs"> ; 29347330f729Sjoergdef JalOneReg : MipsAsmPseudoInst<(outs), (ins GPR32Opnd:$rs), 29357330f729Sjoerg "jal\t$rs"> ; 29367330f729Sjoerg 29377330f729Sjoergclass NORIMM_DESC_BASE<RegisterOperand RO, DAGOperand Imm> : 29387330f729Sjoerg MipsAsmPseudoInst<(outs RO:$rs), (ins RO:$rt, Imm:$imm), 29397330f729Sjoerg "nor\t$rs, $rt, $imm">; 29407330f729Sjoergdef NORImm : NORIMM_DESC_BASE<GPR32Opnd, simm32_relaxed>, GPR_32; 29417330f729Sjoergdef : MipsInstAlias<"nor\t$rs, $imm", (NORImm GPR32Opnd:$rs, GPR32Opnd:$rs, 29427330f729Sjoerg simm32_relaxed:$imm)>, GPR_32; 29437330f729Sjoerg 29447330f729Sjoerglet hasDelaySlot = 1, isCTI = 1 in { 29457330f729Sjoergdef BneImm : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), 29467330f729Sjoerg (ins imm64:$imm64, brtarget:$offset), 29477330f729Sjoerg "bne\t$rt, $imm64, $offset">; 29487330f729Sjoergdef BeqImm : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), 29497330f729Sjoerg (ins imm64:$imm64, brtarget:$offset), 29507330f729Sjoerg "beq\t$rt, $imm64, $offset">; 29517330f729Sjoerg 29527330f729Sjoergclass CondBranchPseudo<string instr_asm> : 29537330f729Sjoerg MipsAsmPseudoInst<(outs), (ins GPR32Opnd:$rs, GPR32Opnd:$rt, 29547330f729Sjoerg brtarget:$offset), 29557330f729Sjoerg !strconcat(instr_asm, "\t$rs, $rt, $offset")>; 29567330f729Sjoerg} 29577330f729Sjoerg 29587330f729Sjoergdef BLT : CondBranchPseudo<"blt">; 29597330f729Sjoergdef BLE : CondBranchPseudo<"ble">; 29607330f729Sjoergdef BGE : CondBranchPseudo<"bge">; 29617330f729Sjoergdef BGT : CondBranchPseudo<"bgt">; 29627330f729Sjoergdef BLTU : CondBranchPseudo<"bltu">; 29637330f729Sjoergdef BLEU : CondBranchPseudo<"bleu">; 29647330f729Sjoergdef BGEU : CondBranchPseudo<"bgeu">; 29657330f729Sjoergdef BGTU : CondBranchPseudo<"bgtu">; 29667330f729Sjoergdef BLTL : CondBranchPseudo<"bltl">, ISA_MIPS2_NOT_32R6_64R6; 29677330f729Sjoergdef BLEL : CondBranchPseudo<"blel">, ISA_MIPS2_NOT_32R6_64R6; 29687330f729Sjoergdef BGEL : CondBranchPseudo<"bgel">, ISA_MIPS2_NOT_32R6_64R6; 29697330f729Sjoergdef BGTL : CondBranchPseudo<"bgtl">, ISA_MIPS2_NOT_32R6_64R6; 29707330f729Sjoergdef BLTUL: CondBranchPseudo<"bltul">, ISA_MIPS2_NOT_32R6_64R6; 29717330f729Sjoergdef BLEUL: CondBranchPseudo<"bleul">, ISA_MIPS2_NOT_32R6_64R6; 29727330f729Sjoergdef BGEUL: CondBranchPseudo<"bgeul">, ISA_MIPS2_NOT_32R6_64R6; 29737330f729Sjoergdef BGTUL: CondBranchPseudo<"bgtul">, ISA_MIPS2_NOT_32R6_64R6; 29747330f729Sjoerg 29757330f729Sjoerglet isCTI = 1 in 29767330f729Sjoergclass CondBranchImmPseudo<string instr_asm> : 29777330f729Sjoerg MipsAsmPseudoInst<(outs), (ins GPR32Opnd:$rs, imm64:$imm, brtarget:$offset), 29787330f729Sjoerg !strconcat(instr_asm, "\t$rs, $imm, $offset")>; 29797330f729Sjoerg 29807330f729Sjoergdef BEQLImmMacro : CondBranchImmPseudo<"beql">, ISA_MIPS2_NOT_32R6_64R6; 29817330f729Sjoergdef BNELImmMacro : CondBranchImmPseudo<"bnel">, ISA_MIPS2_NOT_32R6_64R6; 29827330f729Sjoerg 29837330f729Sjoergdef BLTImmMacro : CondBranchImmPseudo<"blt">; 29847330f729Sjoergdef BLEImmMacro : CondBranchImmPseudo<"ble">; 29857330f729Sjoergdef BGEImmMacro : CondBranchImmPseudo<"bge">; 29867330f729Sjoergdef BGTImmMacro : CondBranchImmPseudo<"bgt">; 29877330f729Sjoergdef BLTUImmMacro : CondBranchImmPseudo<"bltu">; 29887330f729Sjoergdef BLEUImmMacro : CondBranchImmPseudo<"bleu">; 29897330f729Sjoergdef BGEUImmMacro : CondBranchImmPseudo<"bgeu">; 29907330f729Sjoergdef BGTUImmMacro : CondBranchImmPseudo<"bgtu">; 29917330f729Sjoergdef BLTLImmMacro : CondBranchImmPseudo<"bltl">, ISA_MIPS2_NOT_32R6_64R6; 29927330f729Sjoergdef BLELImmMacro : CondBranchImmPseudo<"blel">, ISA_MIPS2_NOT_32R6_64R6; 29937330f729Sjoergdef BGELImmMacro : CondBranchImmPseudo<"bgel">, ISA_MIPS2_NOT_32R6_64R6; 29947330f729Sjoergdef BGTLImmMacro : CondBranchImmPseudo<"bgtl">, ISA_MIPS2_NOT_32R6_64R6; 29957330f729Sjoergdef BLTULImmMacro : CondBranchImmPseudo<"bltul">, ISA_MIPS2_NOT_32R6_64R6; 29967330f729Sjoergdef BLEULImmMacro : CondBranchImmPseudo<"bleul">, ISA_MIPS2_NOT_32R6_64R6; 29977330f729Sjoergdef BGEULImmMacro : CondBranchImmPseudo<"bgeul">, ISA_MIPS2_NOT_32R6_64R6; 29987330f729Sjoergdef BGTULImmMacro : CondBranchImmPseudo<"bgtul">, ISA_MIPS2_NOT_32R6_64R6; 29997330f729Sjoerg 30007330f729Sjoerg// FIXME: Predicates are removed because instructions are matched regardless of 30017330f729Sjoerg// predicates, because PredicateControl was not in the hierarchy. This was 30027330f729Sjoerg// done to emit more precise error message from expansion function. 30037330f729Sjoerg// Once the tablegen-erated errors are made better, this needs to be fixed and 30047330f729Sjoerg// predicates needs to be restored. 30057330f729Sjoerg 30067330f729Sjoergdef SDivMacro : MipsAsmPseudoInst<(outs GPR32NonZeroOpnd:$rd), 30077330f729Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt), 30087330f729Sjoerg "div\t$rd, $rs, $rt">, 30097330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30107330f729Sjoergdef SDivIMacro : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 30117330f729Sjoerg (ins GPR32Opnd:$rs, simm32:$imm), 30127330f729Sjoerg "div\t$rd, $rs, $imm">, 30137330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30147330f729Sjoergdef UDivMacro : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 30157330f729Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt), 30167330f729Sjoerg "divu\t$rd, $rs, $rt">, 30177330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30187330f729Sjoergdef UDivIMacro : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 30197330f729Sjoerg (ins GPR32Opnd:$rs, simm32:$imm), 30207330f729Sjoerg "divu\t$rd, $rs, $imm">, 30217330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30227330f729Sjoerg 30237330f729Sjoerg 30247330f729Sjoergdef : MipsInstAlias<"div $rs, $rt", (SDIV GPR32ZeroOpnd:$rs, 30257330f729Sjoerg GPR32Opnd:$rt), 0>, 30267330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30277330f729Sjoergdef : MipsInstAlias<"div $rs, $rt", (SDivMacro GPR32NonZeroOpnd:$rs, 30287330f729Sjoerg GPR32NonZeroOpnd:$rs, 30297330f729Sjoerg GPR32Opnd:$rt), 0>, 30307330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30317330f729Sjoergdef : MipsInstAlias<"div $rd, $imm", (SDivIMacro GPR32Opnd:$rd, GPR32Opnd:$rd, 30327330f729Sjoerg simm32:$imm), 0>, 30337330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30347330f729Sjoerg 30357330f729Sjoergdef : MipsInstAlias<"divu $rt, $rs", (UDIV GPR32ZeroOpnd:$rt, 30367330f729Sjoerg GPR32Opnd:$rs), 0>, 30377330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30387330f729Sjoergdef : MipsInstAlias<"divu $rt, $rs", (UDivMacro GPR32NonZeroOpnd:$rt, 30397330f729Sjoerg GPR32NonZeroOpnd:$rt, 30407330f729Sjoerg GPR32Opnd:$rs), 0>, 30417330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30427330f729Sjoerg 30437330f729Sjoergdef : MipsInstAlias<"divu $rd, $imm", (UDivIMacro GPR32Opnd:$rd, GPR32Opnd:$rd, 30447330f729Sjoerg simm32:$imm), 0>, 30457330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30467330f729Sjoerg 30477330f729Sjoergdef SRemMacro : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 30487330f729Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt), 30497330f729Sjoerg "rem\t$rd, $rs, $rt">, 30507330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30517330f729Sjoergdef SRemIMacro : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 30527330f729Sjoerg (ins GPR32Opnd:$rs, simm32_relaxed:$imm), 30537330f729Sjoerg "rem\t$rd, $rs, $imm">, 30547330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30557330f729Sjoergdef URemMacro : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 30567330f729Sjoerg (ins GPR32Opnd:$rs, GPR32Opnd:$rt), 30577330f729Sjoerg "remu\t$rd, $rs, $rt">, 30587330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30597330f729Sjoergdef URemIMacro : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), 30607330f729Sjoerg (ins GPR32Opnd:$rs, simm32_relaxed:$imm), 30617330f729Sjoerg "remu\t$rd, $rs, $imm">, 30627330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30637330f729Sjoerg 30647330f729Sjoergdef : MipsInstAlias<"rem $rt, $rs", (SRemMacro GPR32Opnd:$rt, GPR32Opnd:$rt, 30657330f729Sjoerg GPR32Opnd:$rs), 0>, 30667330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30677330f729Sjoergdef : MipsInstAlias<"rem $rd, $imm", (SRemIMacro GPR32Opnd:$rd, GPR32Opnd:$rd, 30687330f729Sjoerg simm32_relaxed:$imm), 0>, 30697330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30707330f729Sjoergdef : MipsInstAlias<"remu $rt, $rs", (URemMacro GPR32Opnd:$rt, GPR32Opnd:$rt, 30717330f729Sjoerg GPR32Opnd:$rs), 0>, 30727330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30737330f729Sjoergdef : MipsInstAlias<"remu $rd, $imm", (URemIMacro GPR32Opnd:$rd, GPR32Opnd:$rd, 30747330f729Sjoerg simm32_relaxed:$imm), 0>, 30757330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 30767330f729Sjoerg 30777330f729Sjoergdef Ulh : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins mem:$addr), 30787330f729Sjoerg "ulh\t$rt, $addr">; //, ISA_MIPS1_NOT_32R6_64R6; 30797330f729Sjoerg 30807330f729Sjoergdef Ulhu : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins mem:$addr), 30817330f729Sjoerg "ulhu\t$rt, $addr">; //, ISA_MIPS1_NOT_32R6_64R6; 30827330f729Sjoerg 30837330f729Sjoergdef Ulw : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins mem:$addr), 30847330f729Sjoerg "ulw\t$rt, $addr">; //, ISA_MIPS1_NOT_32R6_64R6; 30857330f729Sjoerg 30867330f729Sjoergdef Ush : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins mem:$addr), 30877330f729Sjoerg "ush\t$rt, $addr">; //, ISA_MIPS1_NOT_32R6_64R6; 30887330f729Sjoerg 30897330f729Sjoergdef Usw : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins mem:$addr), 30907330f729Sjoerg "usw\t$rt, $addr">; //, ISA_MIPS1_NOT_32R6_64R6; 30917330f729Sjoerg 30927330f729Sjoergdef LDMacro : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), 30937330f729Sjoerg (ins mem_simm16:$addr), "ld $rt, $addr">, 30947330f729Sjoerg ISA_MIPS1_NOT_MIPS3; 30957330f729Sjoergdef SDMacro : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), 30967330f729Sjoerg (ins mem_simm16:$addr), "sd $rt, $addr">, 30977330f729Sjoerg ISA_MIPS1_NOT_MIPS3; 30987330f729Sjoerg//===----------------------------------------------------------------------===// 30997330f729Sjoerg// Arbitrary patterns that map to one or more instructions 31007330f729Sjoerg//===----------------------------------------------------------------------===// 31017330f729Sjoerg 31027330f729Sjoerg// Load/store pattern templates. 31037330f729Sjoergclass LoadRegImmPat<Instruction LoadInst, ValueType ValTy, PatFrag Node> : 31047330f729Sjoerg MipsPat<(ValTy (Node addrRegImm:$a)), (LoadInst addrRegImm:$a)>; 31057330f729Sjoerg 31067330f729Sjoergclass StoreRegImmPat<Instruction StoreInst, ValueType ValTy> : 31077330f729Sjoerg MipsPat<(store ValTy:$v, addrRegImm:$a), (StoreInst ValTy:$v, addrRegImm:$a)>; 31087330f729Sjoerg 31097330f729Sjoerg// Materialize constants. 31107330f729Sjoergmulticlass MaterializeImms<ValueType VT, Register ZEROReg, 31117330f729Sjoerg Instruction ADDiuOp, Instruction LUiOp, 31127330f729Sjoerg Instruction ORiOp> { 31137330f729Sjoerg 31147330f729Sjoerg// Constant synthesis previously relied on the ordering of the patterns below. 31157330f729Sjoerg// By making the predicates they use non-overlapping, the patterns were 31167330f729Sjoerg// reordered so that the effect of the newly introduced predicates can be 31177330f729Sjoerg// observed. 31187330f729Sjoerg 31197330f729Sjoerg// Arbitrary immediates 3120*82d56013Sjoergdef : MipsPat<(VT LUiORiPred:$imm), 3121*82d56013Sjoerg (ORiOp (LUiOp (HI16 imm:$imm)), (LO16 imm:$imm))>; 31227330f729Sjoerg 31237330f729Sjoerg// Bits 32-16 set, sign/zero extended. 31247330f729Sjoergdef : MipsPat<(VT LUiPred:$imm), (LUiOp (HI16 imm:$imm))>; 31257330f729Sjoerg 31267330f729Sjoerg// Small immediates 31277330f729Sjoergdef : MipsPat<(VT ORiPred:$imm), (ORiOp ZEROReg, imm:$imm)>; 31287330f729Sjoergdef : MipsPat<(VT immSExt16:$imm), (ADDiuOp ZEROReg, imm:$imm)>; 31297330f729Sjoerg} 31307330f729Sjoerg 31317330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in 31327330f729Sjoerg defm : MaterializeImms<i32, ZERO, ADDiu, LUi, ORi>, ISA_MIPS1; 31337330f729Sjoerg 31347330f729Sjoerg// Carry MipsPatterns 31357330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 31367330f729Sjoerg def : MipsPat<(subc GPR32:$lhs, GPR32:$rhs), 31377330f729Sjoerg (SUBu GPR32:$lhs, GPR32:$rhs)>, ISA_MIPS1; 31387330f729Sjoerg} 31397330f729Sjoergdef : MipsPat<(addc GPR32:$lhs, GPR32:$rhs), 31407330f729Sjoerg (ADDu GPR32:$lhs, GPR32:$rhs)>, ISA_MIPS1, ASE_NOT_DSP; 31417330f729Sjoergdef : MipsPat<(addc GPR32:$src, immSExt16:$imm), 31427330f729Sjoerg (ADDiu GPR32:$src, imm:$imm)>, ISA_MIPS1, ASE_NOT_DSP; 31437330f729Sjoerg 31447330f729Sjoerg// Support multiplication for pre-Mips32 targets that don't have 31457330f729Sjoerg// the MUL instruction. 31467330f729Sjoergdef : MipsPat<(mul GPR32:$lhs, GPR32:$rhs), 31477330f729Sjoerg (PseudoMFLO (PseudoMULT GPR32:$lhs, GPR32:$rhs))>, 31487330f729Sjoerg ISA_MIPS1_NOT_32R6_64R6; 31497330f729Sjoerg 31507330f729Sjoerg// SYNC 31517330f729Sjoergdef : MipsPat<(MipsSync (i32 immz)), 31527330f729Sjoerg (SYNC 0)>, ISA_MIPS2; 31537330f729Sjoerg 31547330f729Sjoerg// Call 31557330f729Sjoergdef : MipsPat<(MipsJmpLink (i32 texternalsym:$dst)), 31567330f729Sjoerg (JAL texternalsym:$dst)>, ISA_MIPS1; 31577330f729Sjoerg//def : MipsPat<(MipsJmpLink GPR32:$dst), 31587330f729Sjoerg// (JALR GPR32:$dst)>; 31597330f729Sjoerg 31607330f729Sjoerg// Tail call 31617330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 31627330f729Sjoerg def : MipsPat<(MipsTailCall (iPTR tglobaladdr:$dst)), 31637330f729Sjoerg (TAILCALL tglobaladdr:$dst)>, ISA_MIPS1; 31647330f729Sjoerg def : MipsPat<(MipsTailCall (iPTR texternalsym:$dst)), 31657330f729Sjoerg (TAILCALL texternalsym:$dst)>, ISA_MIPS1; 31667330f729Sjoerg} 31677330f729Sjoerg// hi/lo relocs 31687330f729Sjoergmulticlass MipsHiLoRelocs<Instruction Lui, Instruction Addiu, 31697330f729Sjoerg Register ZeroReg, RegisterOperand GPROpnd> { 31707330f729Sjoerg def : MipsPat<(MipsHi tglobaladdr:$in), (Lui tglobaladdr:$in)>; 31717330f729Sjoerg def : MipsPat<(MipsHi tblockaddress:$in), (Lui tblockaddress:$in)>; 31727330f729Sjoerg def : MipsPat<(MipsHi tjumptable:$in), (Lui tjumptable:$in)>; 31737330f729Sjoerg def : MipsPat<(MipsHi tconstpool:$in), (Lui tconstpool:$in)>; 31747330f729Sjoerg def : MipsPat<(MipsHi texternalsym:$in), (Lui texternalsym:$in)>; 31757330f729Sjoerg 31767330f729Sjoerg def : MipsPat<(MipsLo tglobaladdr:$in), 31777330f729Sjoerg (Addiu ZeroReg, tglobaladdr:$in)>; 31787330f729Sjoerg def : MipsPat<(MipsLo tblockaddress:$in), 31797330f729Sjoerg (Addiu ZeroReg, tblockaddress:$in)>; 31807330f729Sjoerg def : MipsPat<(MipsLo tjumptable:$in), 31817330f729Sjoerg (Addiu ZeroReg, tjumptable:$in)>; 31827330f729Sjoerg def : MipsPat<(MipsLo tconstpool:$in), 31837330f729Sjoerg (Addiu ZeroReg, tconstpool:$in)>; 31847330f729Sjoerg def : MipsPat<(MipsLo tglobaltlsaddr:$in), 31857330f729Sjoerg (Addiu ZeroReg, tglobaltlsaddr:$in)>; 31867330f729Sjoerg def : MipsPat<(MipsLo texternalsym:$in), 31877330f729Sjoerg (Addiu ZeroReg, texternalsym:$in)>; 31887330f729Sjoerg 31897330f729Sjoerg def : MipsPat<(add GPROpnd:$hi, (MipsLo tglobaladdr:$lo)), 31907330f729Sjoerg (Addiu GPROpnd:$hi, tglobaladdr:$lo)>; 31917330f729Sjoerg def : MipsPat<(add GPROpnd:$hi, (MipsLo tblockaddress:$lo)), 31927330f729Sjoerg (Addiu GPROpnd:$hi, tblockaddress:$lo)>; 31937330f729Sjoerg def : MipsPat<(add GPROpnd:$hi, (MipsLo tjumptable:$lo)), 31947330f729Sjoerg (Addiu GPROpnd:$hi, tjumptable:$lo)>; 31957330f729Sjoerg def : MipsPat<(add GPROpnd:$hi, (MipsLo tconstpool:$lo)), 31967330f729Sjoerg (Addiu GPROpnd:$hi, tconstpool:$lo)>; 31977330f729Sjoerg def : MipsPat<(add GPROpnd:$hi, (MipsLo tglobaltlsaddr:$lo)), 31987330f729Sjoerg (Addiu GPROpnd:$hi, tglobaltlsaddr:$lo)>; 31997330f729Sjoerg def : MipsPat<(add GPROpnd:$hi, (MipsLo texternalsym:$lo)), 32007330f729Sjoerg (Addiu GPROpnd:$hi, texternalsym:$lo)>; 32017330f729Sjoerg} 32027330f729Sjoerg 32037330f729Sjoerg// wrapper_pic 32047330f729Sjoergclass WrapperPat<SDNode node, Instruction ADDiuOp, RegisterClass RC>: 32057330f729Sjoerg MipsPat<(MipsWrapper RC:$gp, node:$in), (ADDiuOp RC:$gp, node:$in)>; 32067330f729Sjoerg 32077330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 32087330f729Sjoerg defm : MipsHiLoRelocs<LUi, ADDiu, ZERO, GPR32Opnd>, ISA_MIPS1; 32097330f729Sjoerg 32107330f729Sjoerg def : MipsPat<(MipsGotHi tglobaladdr:$in), (LUi tglobaladdr:$in)>, ISA_MIPS1; 32117330f729Sjoerg def : MipsPat<(MipsGotHi texternalsym:$in), (LUi texternalsym:$in)>, 32127330f729Sjoerg ISA_MIPS1; 32137330f729Sjoerg 32147330f729Sjoerg def : MipsPat<(MipsTlsHi tglobaltlsaddr:$in), (LUi tglobaltlsaddr:$in)>, 32157330f729Sjoerg ISA_MIPS1; 32167330f729Sjoerg 32177330f729Sjoerg // gp_rel relocs 32187330f729Sjoerg def : MipsPat<(add GPR32:$gp, (MipsGPRel tglobaladdr:$in)), 32197330f729Sjoerg (ADDiu GPR32:$gp, tglobaladdr:$in)>, ISA_MIPS1, ABI_NOT_N64; 32207330f729Sjoerg def : MipsPat<(add GPR32:$gp, (MipsGPRel tconstpool:$in)), 32217330f729Sjoerg (ADDiu GPR32:$gp, tconstpool:$in)>, ISA_MIPS1, ABI_NOT_N64; 32227330f729Sjoerg 32237330f729Sjoerg def : WrapperPat<tglobaladdr, ADDiu, GPR32>, ISA_MIPS1; 32247330f729Sjoerg def : WrapperPat<tconstpool, ADDiu, GPR32>, ISA_MIPS1; 32257330f729Sjoerg def : WrapperPat<texternalsym, ADDiu, GPR32>, ISA_MIPS1; 32267330f729Sjoerg def : WrapperPat<tblockaddress, ADDiu, GPR32>, ISA_MIPS1; 32277330f729Sjoerg def : WrapperPat<tjumptable, ADDiu, GPR32>, ISA_MIPS1; 32287330f729Sjoerg def : WrapperPat<tglobaltlsaddr, ADDiu, GPR32>, ISA_MIPS1; 32297330f729Sjoerg 32307330f729Sjoerg // Mips does not have "not", so we expand our way 32317330f729Sjoerg def : MipsPat<(not GPR32:$in), 32327330f729Sjoerg (NOR GPR32Opnd:$in, ZERO)>, ISA_MIPS1; 32337330f729Sjoerg} 32347330f729Sjoerg 32357330f729Sjoerg// extended loads 32367330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 32377330f729Sjoerg def : MipsPat<(i32 (extloadi1 addr:$src)), (LBu addr:$src)>, ISA_MIPS1; 32387330f729Sjoerg def : MipsPat<(i32 (extloadi8 addr:$src)), (LBu addr:$src)>, ISA_MIPS1; 32397330f729Sjoerg def : MipsPat<(i32 (extloadi16 addr:$src)), (LHu addr:$src)>, ISA_MIPS1; 32407330f729Sjoerg 32417330f729Sjoerg // peepholes 32427330f729Sjoerg def : MipsPat<(store (i32 0), addr:$dst), (SW ZERO, addr:$dst)>, ISA_MIPS1; 32437330f729Sjoerg} 32447330f729Sjoerg 32457330f729Sjoerg// brcond patterns 32467330f729Sjoergmulticlass BrcondPats<RegisterClass RC, Instruction BEQOp, Instruction BEQOp1, 32477330f729Sjoerg Instruction BNEOp, Instruction SLTOp, Instruction SLTuOp, 32487330f729Sjoerg Instruction SLTiOp, Instruction SLTiuOp, 32497330f729Sjoerg Register ZEROReg> { 32507330f729Sjoergdef : MipsPat<(brcond (i32 (setne RC:$lhs, 0)), bb:$dst), 32517330f729Sjoerg (BNEOp RC:$lhs, ZEROReg, bb:$dst)>; 32527330f729Sjoergdef : MipsPat<(brcond (i32 (seteq RC:$lhs, 0)), bb:$dst), 32537330f729Sjoerg (BEQOp RC:$lhs, ZEROReg, bb:$dst)>; 32547330f729Sjoerg 32557330f729Sjoergdef : MipsPat<(brcond (i32 (setge RC:$lhs, RC:$rhs)), bb:$dst), 32567330f729Sjoerg (BEQOp1 (SLTOp RC:$lhs, RC:$rhs), ZERO, bb:$dst)>; 32577330f729Sjoergdef : MipsPat<(brcond (i32 (setuge RC:$lhs, RC:$rhs)), bb:$dst), 32587330f729Sjoerg (BEQOp1 (SLTuOp RC:$lhs, RC:$rhs), ZERO, bb:$dst)>; 32597330f729Sjoergdef : MipsPat<(brcond (i32 (setge RC:$lhs, immSExt16:$rhs)), bb:$dst), 32607330f729Sjoerg (BEQOp1 (SLTiOp RC:$lhs, immSExt16:$rhs), ZERO, bb:$dst)>; 32617330f729Sjoergdef : MipsPat<(brcond (i32 (setuge RC:$lhs, immSExt16:$rhs)), bb:$dst), 32627330f729Sjoerg (BEQOp1 (SLTiuOp RC:$lhs, immSExt16:$rhs), ZERO, bb:$dst)>; 32637330f729Sjoergdef : MipsPat<(brcond (i32 (setgt RC:$lhs, immSExt16Plus1:$rhs)), bb:$dst), 32647330f729Sjoerg (BEQOp1 (SLTiOp RC:$lhs, (Plus1 imm:$rhs)), ZERO, bb:$dst)>; 32657330f729Sjoergdef : MipsPat<(brcond (i32 (setugt RC:$lhs, immSExt16Plus1:$rhs)), bb:$dst), 32667330f729Sjoerg (BEQOp1 (SLTiuOp RC:$lhs, (Plus1 imm:$rhs)), ZERO, bb:$dst)>; 32677330f729Sjoerg 32687330f729Sjoergdef : MipsPat<(brcond (i32 (setle RC:$lhs, RC:$rhs)), bb:$dst), 32697330f729Sjoerg (BEQOp1 (SLTOp RC:$rhs, RC:$lhs), ZERO, bb:$dst)>; 32707330f729Sjoergdef : MipsPat<(brcond (i32 (setule RC:$lhs, RC:$rhs)), bb:$dst), 32717330f729Sjoerg (BEQOp1 (SLTuOp RC:$rhs, RC:$lhs), ZERO, bb:$dst)>; 32727330f729Sjoerg 32737330f729Sjoergdef : MipsPat<(brcond RC:$cond, bb:$dst), 32747330f729Sjoerg (BNEOp RC:$cond, ZEROReg, bb:$dst)>; 32757330f729Sjoerg} 32767330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 32777330f729Sjoerg defm : BrcondPats<GPR32, BEQ, BEQ, BNE, SLT, SLTu, SLTi, SLTiu, ZERO>, 32787330f729Sjoerg ISA_MIPS1; 32797330f729Sjoerg def : MipsPat<(brcond (i32 (setlt i32:$lhs, 1)), bb:$dst), 32807330f729Sjoerg (BLEZ i32:$lhs, bb:$dst)>, ISA_MIPS1; 32817330f729Sjoerg def : MipsPat<(brcond (i32 (setgt i32:$lhs, -1)), bb:$dst), 32827330f729Sjoerg (BGEZ i32:$lhs, bb:$dst)>, ISA_MIPS1; 32837330f729Sjoerg} 32847330f729Sjoerg 32857330f729Sjoerg// setcc patterns 32867330f729Sjoergmulticlass SeteqPats<RegisterClass RC, Instruction SLTiuOp, Instruction XOROp, 32877330f729Sjoerg Instruction SLTuOp, Register ZEROReg> { 32887330f729Sjoerg def : MipsPat<(seteq RC:$lhs, 0), 32897330f729Sjoerg (SLTiuOp RC:$lhs, 1)>; 32907330f729Sjoerg def : MipsPat<(setne RC:$lhs, 0), 32917330f729Sjoerg (SLTuOp ZEROReg, RC:$lhs)>; 32927330f729Sjoerg def : MipsPat<(seteq RC:$lhs, RC:$rhs), 32937330f729Sjoerg (SLTiuOp (XOROp RC:$lhs, RC:$rhs), 1)>; 32947330f729Sjoerg def : MipsPat<(setne RC:$lhs, RC:$rhs), 32957330f729Sjoerg (SLTuOp ZEROReg, (XOROp RC:$lhs, RC:$rhs))>; 32967330f729Sjoerg} 32977330f729Sjoerg 32987330f729Sjoergmulticlass SetlePats<RegisterClass RC, Instruction XORiOp, Instruction SLTOp, 32997330f729Sjoerg Instruction SLTuOp> { 33007330f729Sjoerg def : MipsPat<(setle RC:$lhs, RC:$rhs), 33017330f729Sjoerg (XORiOp (SLTOp RC:$rhs, RC:$lhs), 1)>; 33027330f729Sjoerg def : MipsPat<(setule RC:$lhs, RC:$rhs), 33037330f729Sjoerg (XORiOp (SLTuOp RC:$rhs, RC:$lhs), 1)>; 33047330f729Sjoerg} 33057330f729Sjoerg 33067330f729Sjoergmulticlass SetgtPats<RegisterClass RC, Instruction SLTOp, Instruction SLTuOp> { 33077330f729Sjoerg def : MipsPat<(setgt RC:$lhs, RC:$rhs), 33087330f729Sjoerg (SLTOp RC:$rhs, RC:$lhs)>; 33097330f729Sjoerg def : MipsPat<(setugt RC:$lhs, RC:$rhs), 33107330f729Sjoerg (SLTuOp RC:$rhs, RC:$lhs)>; 33117330f729Sjoerg} 33127330f729Sjoerg 33137330f729Sjoergmulticlass SetgePats<RegisterClass RC, Instruction XORiOp, Instruction SLTOp, 33147330f729Sjoerg Instruction SLTuOp> { 33157330f729Sjoerg def : MipsPat<(setge RC:$lhs, RC:$rhs), 33167330f729Sjoerg (XORiOp (SLTOp RC:$lhs, RC:$rhs), 1)>; 33177330f729Sjoerg def : MipsPat<(setuge RC:$lhs, RC:$rhs), 33187330f729Sjoerg (XORiOp (SLTuOp RC:$lhs, RC:$rhs), 1)>; 33197330f729Sjoerg} 33207330f729Sjoerg 33217330f729Sjoergmulticlass SetgeImmPats<RegisterClass RC, Instruction XORiOp, 33227330f729Sjoerg Instruction SLTiOp, Instruction SLTiuOp> { 33237330f729Sjoerg def : MipsPat<(setge RC:$lhs, immSExt16:$rhs), 33247330f729Sjoerg (XORiOp (SLTiOp RC:$lhs, immSExt16:$rhs), 1)>; 33257330f729Sjoerg def : MipsPat<(setuge RC:$lhs, immSExt16:$rhs), 33267330f729Sjoerg (XORiOp (SLTiuOp RC:$lhs, immSExt16:$rhs), 1)>; 33277330f729Sjoerg} 33287330f729Sjoerg 33297330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 33307330f729Sjoerg defm : SeteqPats<GPR32, SLTiu, XOR, SLTu, ZERO>, ISA_MIPS1; 33317330f729Sjoerg defm : SetlePats<GPR32, XORi, SLT, SLTu>, ISA_MIPS1; 33327330f729Sjoerg defm : SetgtPats<GPR32, SLT, SLTu>, ISA_MIPS1; 33337330f729Sjoerg defm : SetgePats<GPR32, XORi, SLT, SLTu>, ISA_MIPS1; 33347330f729Sjoerg defm : SetgeImmPats<GPR32, XORi, SLTi, SLTiu>, ISA_MIPS1; 33357330f729Sjoerg 33367330f729Sjoerg // bswap pattern 33377330f729Sjoerg def : MipsPat<(bswap GPR32:$rt), (ROTR (WSBH GPR32:$rt), 16)>, ISA_MIPS32R2; 33387330f729Sjoerg} 33397330f729Sjoerg 33407330f729Sjoerg// Load halfword/word patterns. 33417330f729Sjoerglet AdditionalPredicates = [NotInMicroMips] in { 33427330f729Sjoerg let AddedComplexity = 40 in { 33437330f729Sjoerg def : LoadRegImmPat<LBu, i32, zextloadi8>, ISA_MIPS1; 33447330f729Sjoerg def : LoadRegImmPat<LHu, i32, zextloadi16>, ISA_MIPS1; 33457330f729Sjoerg def : LoadRegImmPat<LB, i32, sextloadi8>, ISA_MIPS1; 33467330f729Sjoerg def : LoadRegImmPat<LH, i32, sextloadi16>, ISA_MIPS1; 33477330f729Sjoerg def : LoadRegImmPat<LW, i32, load>, ISA_MIPS1; 33487330f729Sjoerg } 33497330f729Sjoerg 33507330f729Sjoerg // Atomic load patterns. 33517330f729Sjoerg def : MipsPat<(atomic_load_8 addr:$a), (LB addr:$a)>, ISA_MIPS1; 33527330f729Sjoerg def : MipsPat<(atomic_load_16 addr:$a), (LH addr:$a)>, ISA_MIPS1; 33537330f729Sjoerg def : MipsPat<(atomic_load_32 addr:$a), (LW addr:$a)>, ISA_MIPS1; 33547330f729Sjoerg 33557330f729Sjoerg // Atomic store patterns. 33567330f729Sjoerg def : MipsPat<(atomic_store_8 addr:$a, GPR32:$v), (SB GPR32:$v, addr:$a)>, 33577330f729Sjoerg ISA_MIPS1; 33587330f729Sjoerg def : MipsPat<(atomic_store_16 addr:$a, GPR32:$v), (SH GPR32:$v, addr:$a)>, 33597330f729Sjoerg ISA_MIPS1; 33607330f729Sjoerg def : MipsPat<(atomic_store_32 addr:$a, GPR32:$v), (SW GPR32:$v, addr:$a)>, 33617330f729Sjoerg ISA_MIPS1; 33627330f729Sjoerg} 33637330f729Sjoerg 33647330f729Sjoerg//===----------------------------------------------------------------------===// 33657330f729Sjoerg// Floating Point Support 33667330f729Sjoerg//===----------------------------------------------------------------------===// 33677330f729Sjoerg 33687330f729Sjoerginclude "MipsInstrFPU.td" 33697330f729Sjoerginclude "Mips64InstrInfo.td" 33707330f729Sjoerginclude "MipsCondMov.td" 33717330f729Sjoerg 33727330f729Sjoerginclude "Mips32r6InstrInfo.td" 33737330f729Sjoerginclude "Mips64r6InstrInfo.td" 33747330f729Sjoerg 33757330f729Sjoerg// 33767330f729Sjoerg// Mips16 33777330f729Sjoerg 33787330f729Sjoerginclude "Mips16InstrFormats.td" 33797330f729Sjoerginclude "Mips16InstrInfo.td" 33807330f729Sjoerg 33817330f729Sjoerg// DSP 33827330f729Sjoerginclude "MipsDSPInstrFormats.td" 33837330f729Sjoerginclude "MipsDSPInstrInfo.td" 33847330f729Sjoerg 33857330f729Sjoerg// MSA 33867330f729Sjoerginclude "MipsMSAInstrFormats.td" 33877330f729Sjoerginclude "MipsMSAInstrInfo.td" 33887330f729Sjoerg 33897330f729Sjoerg// EVA 33907330f729Sjoerginclude "MipsEVAInstrFormats.td" 33917330f729Sjoerginclude "MipsEVAInstrInfo.td" 33927330f729Sjoerg 33937330f729Sjoerg// MT 33947330f729Sjoerginclude "MipsMTInstrFormats.td" 33957330f729Sjoerginclude "MipsMTInstrInfo.td" 33967330f729Sjoerg 33977330f729Sjoerg// Micromips 33987330f729Sjoerginclude "MicroMipsInstrFormats.td" 33997330f729Sjoerginclude "MicroMipsInstrInfo.td" 34007330f729Sjoerginclude "MicroMipsInstrFPU.td" 34017330f729Sjoerg 34027330f729Sjoerg// Micromips r6 34037330f729Sjoerginclude "MicroMips32r6InstrFormats.td" 34047330f729Sjoerginclude "MicroMips32r6InstrInfo.td" 34057330f729Sjoerg 34067330f729Sjoerg// Micromips DSP 34077330f729Sjoerginclude "MicroMipsDSPInstrFormats.td" 34087330f729Sjoerginclude "MicroMipsDSPInstrInfo.td" 3409