xref: /netbsd-src/external/apache2/llvm/dist/llvm/lib/Target/Mips/MipsInstrInfo.td (revision 82d56013d7b633d116a93943de88e08335357a7c)
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