| Akira Hatanaka | 7d7ee0c | 2011-09-24 01:40:18 +0000 | [diff] [blame] | 1 | //===- Mips64InstrInfo.td - Mips64 Instruction Information -*- tablegen -*-===// | 
|  | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 | // | 
|  | 10 | // This file describes Mips64 instructions. | 
|  | 11 | // | 
|  | 12 | //===----------------------------------------------------------------------===// | 
| Akira Hatanaka | c117967 | 2011-09-28 17:50:27 +0000 | [diff] [blame] | 13 |  | 
|  | 14 | //===----------------------------------------------------------------------===// | 
| Akira Hatanaka | 7769a77 | 2011-09-30 02:08:54 +0000 | [diff] [blame] | 15 | // Mips Operand, Complex Patterns and Transformations Definitions. | 
|  | 16 | //===----------------------------------------------------------------------===// | 
|  | 17 |  | 
|  | 18 | // Instruction operand types | 
| Akira Hatanaka | 61e256a | 2011-09-30 03:18:46 +0000 | [diff] [blame] | 19 | def shamt_64       : Operand<i64>; | 
| Akira Hatanaka | 7769a77 | 2011-09-30 02:08:54 +0000 | [diff] [blame] | 20 |  | 
|  | 21 | // Unsigned Operand | 
|  | 22 | def uimm16_64      : Operand<i64> { | 
|  | 23 | let PrintMethod = "printUnsignedImm"; | 
|  | 24 | } | 
|  | 25 |  | 
| Akira Hatanaka | 61e256a | 2011-09-30 03:18:46 +0000 | [diff] [blame] | 26 | // Transformation Function - get Imm - 32. | 
|  | 27 | def Subtract32 : SDNodeXForm<imm, [{ | 
| Akira Hatanaka | 4a04a56 | 2011-12-07 20:10:24 +0000 | [diff] [blame] | 28 | return getImm(N, (unsigned)N->getZExtValue() - 32); | 
| Akira Hatanaka | 61e256a | 2011-09-30 03:18:46 +0000 | [diff] [blame] | 29 | }]>; | 
|  | 30 |  | 
| Akira Hatanaka | 2a232d8 | 2011-12-19 19:44:09 +0000 | [diff] [blame] | 31 | // shamt must fit in 6 bits. | 
|  | 32 | def immZExt6 : ImmLeaf<i32, [{return Imm == (Imm & 0x3f);}]>; | 
| Akira Hatanaka | 61e256a | 2011-09-30 03:18:46 +0000 | [diff] [blame] | 33 |  | 
| Akira Hatanaka | 7769a77 | 2011-09-30 02:08:54 +0000 | [diff] [blame] | 34 | //===----------------------------------------------------------------------===// | 
| Akira Hatanaka | 3603641 | 2011-09-29 20:37:56 +0000 | [diff] [blame] | 35 | // Instructions specific format | 
|  | 36 | //===----------------------------------------------------------------------===// | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 37 | let DecoderNamespace = "Mips64" in { | 
| Akira Hatanaka | 61e256a | 2011-09-30 03:18:46 +0000 | [diff] [blame] | 38 |  | 
| Akira Hatanaka | b1527b7 | 2012-12-20 04:20:09 +0000 | [diff] [blame] | 39 | multiclass Atomic2Ops64<PatFrag Op> { | 
| Craig Topper | a8c5ec0 | 2013-01-07 05:45:56 +0000 | [diff] [blame] | 40 | def NAME : Atomic2Ops<Op, CPU64Regs, CPURegs>, | 
|  | 41 | Requires<[NotN64, HasStdEnc]>; | 
|  | 42 | def _P8  : Atomic2Ops<Op, CPU64Regs, CPU64Regs>, | 
|  | 43 | Requires<[IsN64, HasStdEnc]> { | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 44 | let isCodeGenOnly = 1; | 
|  | 45 | } | 
| Akira Hatanaka | 21cbc25 | 2011-11-11 04:14:30 +0000 | [diff] [blame] | 46 | } | 
|  | 47 |  | 
| Akira Hatanaka | b1527b7 | 2012-12-20 04:20:09 +0000 | [diff] [blame] | 48 | multiclass AtomicCmpSwap64<PatFrag Op>  { | 
| Craig Topper | a8c5ec0 | 2013-01-07 05:45:56 +0000 | [diff] [blame] | 49 | def NAME : AtomicCmpSwap<Op, CPU64Regs, CPURegs>, | 
|  | 50 | Requires<[NotN64, HasStdEnc]>; | 
|  | 51 | def _P8  : AtomicCmpSwap<Op, CPU64Regs, CPU64Regs>, | 
|  | 52 | Requires<[IsN64, HasStdEnc]> { | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 53 | let isCodeGenOnly = 1; | 
|  | 54 | } | 
| Akira Hatanaka | 21cbc25 | 2011-11-11 04:14:30 +0000 | [diff] [blame] | 55 | } | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 56 | } | 
| Akira Hatanaka | 97e179f | 2012-12-07 03:06:09 +0000 | [diff] [blame] | 57 | let usesCustomInserter = 1, Predicates = [HasStdEnc], | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 58 | DecoderNamespace = "Mips64" in { | 
| Akira Hatanaka | b1527b7 | 2012-12-20 04:20:09 +0000 | [diff] [blame] | 59 | defm ATOMIC_LOAD_ADD_I64  : Atomic2Ops64<atomic_load_add_64>; | 
|  | 60 | defm ATOMIC_LOAD_SUB_I64  : Atomic2Ops64<atomic_load_sub_64>; | 
|  | 61 | defm ATOMIC_LOAD_AND_I64  : Atomic2Ops64<atomic_load_and_64>; | 
|  | 62 | defm ATOMIC_LOAD_OR_I64   : Atomic2Ops64<atomic_load_or_64>; | 
|  | 63 | defm ATOMIC_LOAD_XOR_I64  : Atomic2Ops64<atomic_load_xor_64>; | 
|  | 64 | defm ATOMIC_LOAD_NAND_I64 : Atomic2Ops64<atomic_load_nand_64>; | 
|  | 65 | defm ATOMIC_SWAP_I64      : Atomic2Ops64<atomic_swap_64>; | 
|  | 66 | defm ATOMIC_CMP_SWAP_I64  : AtomicCmpSwap64<atomic_cmp_swap_64>; | 
| Akira Hatanaka | 21cbc25 | 2011-11-11 04:14:30 +0000 | [diff] [blame] | 67 | } | 
|  | 68 |  | 
| Akira Hatanaka | 3603641 | 2011-09-29 20:37:56 +0000 | [diff] [blame] | 69 | //===----------------------------------------------------------------------===// | 
|  | 70 | // Instruction definition | 
|  | 71 | //===----------------------------------------------------------------------===// | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 72 | let DecoderNamespace = "Mips64" in { | 
| Akira Hatanaka | 7769a77 | 2011-09-30 02:08:54 +0000 | [diff] [blame] | 73 | /// Arithmetic Instructions (ALU Immediate) | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 74 | def DADDi   : ArithLogicI<"daddi", simm16_64, CPU64RegsOpnd>, ADDI_FM<0x18>; | 
|  | 75 | def DADDiu  : ArithLogicI<"daddiu", simm16_64, CPU64RegsOpnd, immSExt16, add>, | 
| Akira Hatanaka | ab1b715b | 2012-12-20 03:40:03 +0000 | [diff] [blame] | 76 | ADDI_FM<0x19>, IsAsCheapAsAMove; | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 77 | def DANDi   : ArithLogicI<"andi", uimm16_64, CPU64RegsOpnd, immZExt16, and>, | 
| Akira Hatanaka | ab1b715b | 2012-12-20 03:40:03 +0000 | [diff] [blame] | 78 | ADDI_FM<0xc>; | 
| Akira Hatanaka | e7f1acc | 2012-12-20 04:27:52 +0000 | [diff] [blame] | 79 | def SLTi64  : SetCC_I<"slti", setlt, simm16_64, immSExt16, CPU64Regs>, | 
|  | 80 | SLTI_FM<0xa>; | 
|  | 81 | def SLTiu64 : SetCC_I<"sltiu", setult, simm16_64, immSExt16, CPU64Regs>, | 
|  | 82 | SLTI_FM<0xb>; | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 83 | def ORi64   : ArithLogicI<"ori", uimm16_64, CPU64RegsOpnd, immZExt16, or>, | 
| Akira Hatanaka | ab1b715b | 2012-12-20 03:40:03 +0000 | [diff] [blame] | 84 | ADDI_FM<0xd>; | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 85 | def XORi64  : ArithLogicI<"xori", uimm16_64, CPU64RegsOpnd, immZExt16, xor>, | 
| Akira Hatanaka | ab1b715b | 2012-12-20 03:40:03 +0000 | [diff] [blame] | 86 | ADDI_FM<0xe>; | 
| Akira Hatanaka | e738efc | 2012-12-21 22:46:07 +0000 | [diff] [blame] | 87 | def LUi64   : LoadUpper<"lui", CPU64Regs, uimm16_64>, LUI_FM; | 
| Akira Hatanaka | 7769a77 | 2011-09-30 02:08:54 +0000 | [diff] [blame] | 88 |  | 
| Akira Hatanaka | 3603641 | 2011-09-29 20:37:56 +0000 | [diff] [blame] | 89 | /// Arithmetic Instructions (3-Operand, R-Type) | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 90 | def DADD   : ArithLogicR<"dadd", CPU64RegsOpnd>, ADD_FM<0, 0x2c>; | 
|  | 91 | def DADDu  : ArithLogicR<"daddu", CPU64RegsOpnd, 1, IIAlu, add>, | 
|  | 92 | ADD_FM<0, 0x2d>; | 
|  | 93 | def DSUBu  : ArithLogicR<"dsubu", CPU64RegsOpnd, 0, IIAlu, sub>, | 
|  | 94 | ADD_FM<0, 0x2f>; | 
| Akira Hatanaka | e7f1acc | 2012-12-20 04:27:52 +0000 | [diff] [blame] | 95 | def SLT64  : SetCC_R<"slt", setlt, CPU64Regs>, ADD_FM<0, 0x2a>; | 
|  | 96 | def SLTu64 : SetCC_R<"sltu", setult, CPU64Regs>, ADD_FM<0, 0x2b>; | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 97 | def AND64  : ArithLogicR<"and", CPU64RegsOpnd, 1, IIAlu, and>, ADD_FM<0, 0x24>; | 
|  | 98 | def OR64   : ArithLogicR<"or", CPU64RegsOpnd, 1, IIAlu, or>, ADD_FM<0, 0x25>; | 
|  | 99 | def XOR64  : ArithLogicR<"xor", CPU64RegsOpnd, 1, IIAlu, xor>, ADD_FM<0, 0x26>; | 
|  | 100 | def NOR64  : LogicNOR<"nor", CPU64RegsOpnd>, ADD_FM<0, 0x27>; | 
| Akira Hatanaka | 61e256a | 2011-09-30 03:18:46 +0000 | [diff] [blame] | 101 |  | 
|  | 102 | /// Shift Instructions | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 103 | def DSLL   : shift_rotate_imm<"dsll", shamt, CPU64RegsOpnd, shl, immZExt6>, | 
| Akira Hatanaka | f412e75 | 2013-01-04 19:25:46 +0000 | [diff] [blame] | 104 | SRA_FM<0x38, 0>; | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 105 | def DSRL   : shift_rotate_imm<"dsrl", shamt, CPU64RegsOpnd, srl, immZExt6>, | 
| Akira Hatanaka | f412e75 | 2013-01-04 19:25:46 +0000 | [diff] [blame] | 106 | SRA_FM<0x3a, 0>; | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 107 | def DSRA   : shift_rotate_imm<"dsra", shamt, CPU64RegsOpnd, sra, immZExt6>, | 
| Akira Hatanaka | f412e75 | 2013-01-04 19:25:46 +0000 | [diff] [blame] | 108 | SRA_FM<0x3b, 0>; | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 109 | def DSLLV  : shift_rotate_reg<"dsllv", CPU64RegsOpnd, shl>, SRLV_FM<0x14, 0>; | 
|  | 110 | def DSRLV  : shift_rotate_reg<"dsrlv", CPU64RegsOpnd, srl>, SRLV_FM<0x16, 0>; | 
|  | 111 | def DSRAV  : shift_rotate_reg<"dsrav", CPU64RegsOpnd, sra>, SRLV_FM<0x17, 0>; | 
|  | 112 | def DSLL32 : shift_rotate_imm<"dsll32", shamt, CPU64RegsOpnd>, SRA_FM<0x3c, 0>; | 
|  | 113 | def DSRL32 : shift_rotate_imm<"dsrl32", shamt, CPU64RegsOpnd>, SRA_FM<0x3e, 0>; | 
|  | 114 | def DSRA32 : shift_rotate_imm<"dsra32", shamt, CPU64RegsOpnd>, SRA_FM<0x3f, 0>; | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 115 | } | 
| Akira Hatanaka | 7ba8a8d | 2011-09-30 18:51:46 +0000 | [diff] [blame] | 116 | // Rotate Instructions | 
| Akira Hatanaka | 97e179f | 2012-12-07 03:06:09 +0000 | [diff] [blame] | 117 | let Predicates = [HasMips64r2, HasStdEnc], | 
| Akira Hatanaka | cdf4fd8 | 2012-05-22 03:10:09 +0000 | [diff] [blame] | 118 | DecoderNamespace = "Mips64" in { | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 119 | def DROTR  : shift_rotate_imm<"drotr", shamt, CPU64RegsOpnd, rotr, immZExt6>, | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 120 | SRA_FM<0x3a, 1>; | 
|  | 121 | def DROTRV : shift_rotate_reg<"drotrv", CPU64RegsOpnd, rotr>, | 
|  | 122 | SRLV_FM<0x16, 1>; | 
| Akira Hatanaka | 7ba8a8d | 2011-09-30 18:51:46 +0000 | [diff] [blame] | 123 | } | 
|  | 124 |  | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 125 | let DecoderNamespace = "Mips64" in { | 
| Akira Hatanaka | be68f3c | 2011-10-11 00:27:28 +0000 | [diff] [blame] | 126 | /// Load and Store Instructions | 
| Jia Liu | f54f60f | 2012-02-28 07:46:26 +0000 | [diff] [blame] | 127 | ///  aligned | 
| Akira Hatanaka | f412e75 | 2013-01-04 19:25:46 +0000 | [diff] [blame] | 128 | defm LB64  : LoadM<"lb", CPU64Regs, sextloadi8>, LW_FM<0x20>; | 
|  | 129 | defm LBu64 : LoadM<"lbu", CPU64Regs, zextloadi8>, LW_FM<0x24>; | 
|  | 130 | defm LH64  : LoadM<"lh", CPU64Regs, sextloadi16>, LW_FM<0x21>; | 
|  | 131 | defm LHu64 : LoadM<"lhu", CPU64Regs, zextloadi16>, LW_FM<0x25>; | 
|  | 132 | defm LW64  : LoadM<"lw", CPU64Regs, sextloadi32>, LW_FM<0x23>; | 
|  | 133 | defm LWu64 : LoadM<"lwu", CPU64Regs, zextloadi32>, LW_FM<0x27>; | 
|  | 134 | defm SB64  : StoreM<"sb", CPU64Regs, truncstorei8>, LW_FM<0x28>; | 
|  | 135 | defm SH64  : StoreM<"sh", CPU64Regs, truncstorei16>, LW_FM<0x29>; | 
|  | 136 | defm SW64  : StoreM<"sw", CPU64Regs, truncstorei32>, LW_FM<0x2b>; | 
|  | 137 | defm LD    : LoadM<"ld", CPU64Regs, load>, LW_FM<0x37>; | 
|  | 138 | defm SD    : StoreM<"sd", CPU64Regs, store>, LW_FM<0x3f>; | 
| Akira Hatanaka | be68f3c | 2011-10-11 00:27:28 +0000 | [diff] [blame] | 139 |  | 
| Akira Hatanaka | f11571d | 2012-06-02 00:04:19 +0000 | [diff] [blame] | 140 | /// load/store left/right | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 141 | defm LWL64 : LoadLeftRightM<"lwl", MipsLWL, CPU64Regs>, LW_FM<0x22>; | 
|  | 142 | defm LWR64 : LoadLeftRightM<"lwr", MipsLWR, CPU64Regs>, LW_FM<0x26>; | 
|  | 143 | defm SWL64 : StoreLeftRightM<"swl", MipsSWL, CPU64Regs>, LW_FM<0x2a>; | 
|  | 144 | defm SWR64 : StoreLeftRightM<"swr", MipsSWR, CPU64Regs>, LW_FM<0x2e>; | 
|  | 145 |  | 
| Akira Hatanaka | e1826d7 | 2012-12-21 23:01:24 +0000 | [diff] [blame] | 146 | defm LDL   : LoadLeftRightM<"ldl", MipsLDL, CPU64Regs>, LW_FM<0x1a>; | 
|  | 147 | defm LDR   : LoadLeftRightM<"ldr", MipsLDR, CPU64Regs>, LW_FM<0x1b>; | 
|  | 148 | defm SDL   : StoreLeftRightM<"sdl", MipsSDL, CPU64Regs>, LW_FM<0x2c>; | 
|  | 149 | defm SDR   : StoreLeftRightM<"sdr", MipsSDR, CPU64Regs>, LW_FM<0x2d>; | 
| Akira Hatanaka | f11571d | 2012-06-02 00:04:19 +0000 | [diff] [blame] | 150 |  | 
| Akira Hatanaka | 21cbc25 | 2011-11-11 04:14:30 +0000 | [diff] [blame] | 151 | /// Load-linked, Store-conditional | 
| Akira Hatanaka | e1826d7 | 2012-12-21 23:01:24 +0000 | [diff] [blame] | 152 | let Predicates = [NotN64, HasStdEnc] in { | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 153 | def LLD : LLBase<"lld", CPU64RegsOpnd, mem>, LW_FM<0x34>; | 
|  | 154 | def SCD : SCBase<"scd", CPU64RegsOpnd, mem>, LW_FM<0x3c>; | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 155 | } | 
| Akira Hatanaka | e1826d7 | 2012-12-21 23:01:24 +0000 | [diff] [blame] | 156 |  | 
|  | 157 | let Predicates = [IsN64, HasStdEnc], isCodeGenOnly = 1 in { | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 158 | def LLD_P8 : LLBase<"lld", CPU64RegsOpnd, mem64>, LW_FM<0x34>; | 
|  | 159 | def SCD_P8 : SCBase<"scd", CPU64RegsOpnd, mem64>, LW_FM<0x3c>; | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 160 | } | 
| Akira Hatanaka | 21cbc25 | 2011-11-11 04:14:30 +0000 | [diff] [blame] | 161 |  | 
| Akira Hatanaka | 4b6ac98 | 2011-10-11 18:49:17 +0000 | [diff] [blame] | 162 | /// Jump and Branch Instructions | 
| Akira Hatanaka | a158042 | 2012-12-21 23:03:50 +0000 | [diff] [blame] | 163 | def JR64   : IndirectBranch<CPU64Regs>, MTLO_FM<8>; | 
| Akira Hatanaka | f71ffd2 | 2012-12-20 04:10:13 +0000 | [diff] [blame] | 164 | def BEQ64  : CBranch<"beq", seteq, CPU64Regs>, BEQ_FM<4>; | 
|  | 165 | def BNE64  : CBranch<"bne", setne, CPU64Regs>, BEQ_FM<5>; | 
| Akira Hatanaka | c0ea0bb | 2012-12-20 04:13:23 +0000 | [diff] [blame] | 166 | def BGEZ64 : CBranchZero<"bgez", setge, CPU64Regs>, BGEZ_FM<1, 1>; | 
|  | 167 | def BGTZ64 : CBranchZero<"bgtz", setgt, CPU64Regs>, BGEZ_FM<7, 0>; | 
|  | 168 | def BLEZ64 : CBranchZero<"blez", setle, CPU64Regs>, BGEZ_FM<6, 0>; | 
|  | 169 | def BLTZ64 : CBranchZero<"bltz", setlt, CPU64Regs>, BGEZ_FM<1, 0>; | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 170 | } | 
|  | 171 | let DecoderNamespace = "Mips64" in | 
| Akira Hatanaka | a158042 | 2012-12-21 23:03:50 +0000 | [diff] [blame] | 172 | def JALR64 : JumpLinkReg<"jalr", CPU64Regs>, JALR_FM; | 
| Akira Hatanaka | 061d1ea | 2013-02-07 19:48:00 +0000 | [diff] [blame^] | 173 | def JALR64Pseudo : JumpLinkRegPseudo<CPU64Regs, JALR64, RA_64>; | 
| Akira Hatanaka | a158042 | 2012-12-21 23:03:50 +0000 | [diff] [blame] | 174 | def TAILCALL64_R : JumpFR<CPU64Regs, MipsTailCall>, MTLO_FM<8>, IsTailCall; | 
| Akira Hatanaka | b89a4bf | 2012-01-04 03:02:47 +0000 | [diff] [blame] | 175 |  | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 176 | let DecoderNamespace = "Mips64" in { | 
| Akira Hatanaka | a279d9b | 2011-10-03 20:01:11 +0000 | [diff] [blame] | 177 | /// Multiply and Divide Instructions. | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 178 | def DMULT  : Mult<"dmult", IIImul, CPU64RegsOpnd, [HI64, LO64]>, | 
|  | 179 | MULT_FM<0, 0x1c>; | 
|  | 180 | def DMULTu : Mult<"dmultu", IIImul, CPU64RegsOpnd, [HI64, LO64]>, | 
|  | 181 | MULT_FM<0, 0x1d>; | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 182 | def DSDIV  : Div<MipsDivRem, "ddiv", IIIdiv, CPU64RegsOpnd, [HI64, LO64]>, | 
| Akira Hatanaka | beea8a3 | 2012-12-21 23:17:36 +0000 | [diff] [blame] | 183 | MULT_FM<0, 0x1e>; | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 184 | def DUDIV  : Div<MipsDivRemU, "ddivu", IIIdiv, CPU64RegsOpnd, [HI64, LO64]>, | 
| Akira Hatanaka | beea8a3 | 2012-12-21 23:17:36 +0000 | [diff] [blame] | 185 | MULT_FM<0, 0x1f>; | 
| Akira Hatanaka | a279d9b | 2011-10-03 20:01:11 +0000 | [diff] [blame] | 186 |  | 
| Akira Hatanaka | b14c6e4 | 2012-12-21 22:39:17 +0000 | [diff] [blame] | 187 | def MTHI64 : MoveToLOHI<"mthi", CPU64Regs, [HI64]>, MTLO_FM<0x11>; | 
|  | 188 | def MTLO64 : MoveToLOHI<"mtlo", CPU64Regs, [LO64]>, MTLO_FM<0x13>; | 
|  | 189 | def MFHI64 : MoveFromLOHI<"mfhi", CPU64Regs, [HI64]>, MFLO_FM<0x10>; | 
|  | 190 | def MFLO64 : MoveFromLOHI<"mflo", CPU64Regs, [LO64]>, MFLO_FM<0x12>; | 
| Akira Hatanaka | cdcc745 | 2011-10-03 19:28:44 +0000 | [diff] [blame] | 191 |  | 
| Akira Hatanaka | 9f7ec15 | 2012-01-24 21:41:09 +0000 | [diff] [blame] | 192 | /// Sign Ext In Register Instructions. | 
| Akira Hatanaka | 6ac2fc4 | 2012-12-21 23:21:32 +0000 | [diff] [blame] | 193 | def SEB64 : SignExtInReg<"seb", i8, CPU64Regs>, SEB_FM<0x10, 0x20>; | 
|  | 194 | def SEH64 : SignExtInReg<"seh", i16, CPU64Regs>, SEB_FM<0x18, 0x20>; | 
| Akira Hatanaka | 9f7ec15 | 2012-01-24 21:41:09 +0000 | [diff] [blame] | 195 |  | 
| Akira Hatanaka | 48a72ca | 2011-10-03 21:16:50 +0000 | [diff] [blame] | 196 | /// Count Leading | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 197 | def DCLZ : CountLeading0<"dclz", CPU64RegsOpnd>, CLO_FM<0x24>; | 
|  | 198 | def DCLO : CountLeading1<"dclo", CPU64RegsOpnd>, CLO_FM<0x25>; | 
| Akira Hatanaka | 48a72ca | 2011-10-03 21:16:50 +0000 | [diff] [blame] | 199 |  | 
| Akira Hatanaka | 4706ac9 | 2011-12-20 23:56:43 +0000 | [diff] [blame] | 200 | /// Double Word Swap Bytes/HalfWords | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 201 | def DSBH : SubwordSwap<"dsbh", CPU64RegsOpnd>, SEB_FM<2, 0x24>; | 
|  | 202 | def DSHD : SubwordSwap<"dshd", CPU64RegsOpnd>, SEB_FM<5, 0x24>; | 
| Akira Hatanaka | 4706ac9 | 2011-12-20 23:56:43 +0000 | [diff] [blame] | 203 |  | 
| Akira Hatanaka | 6ac2fc4 | 2012-12-21 23:21:32 +0000 | [diff] [blame] | 204 | def LEA_ADDiu64 : EffectiveAddress<"daddiu", CPU64Regs, mem_ea_64>, LW_FM<0x19>; | 
|  | 205 |  | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 206 | } | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 207 | let DecoderNamespace = "Mips64" in { | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 208 | def RDHWR64 : ReadHardware<CPU64Regs, HW64RegsOpnd>, RDHWR_FM; | 
| Akira Hatanaka | 4350c18 | 2011-12-07 23:31:26 +0000 | [diff] [blame] | 209 |  | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 210 | def DEXT : ExtBase<"dext", CPU64RegsOpnd>, EXT_FM<3>; | 
| Jack Carter | cd6b0e1 | 2012-08-28 20:07:41 +0000 | [diff] [blame] | 211 | let Pattern = []<dag> in { | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 212 | def DEXTU : ExtBase<"dextu", CPU64RegsOpnd>, EXT_FM<2>; | 
|  | 213 | def DEXTM : ExtBase<"dextm", CPU64RegsOpnd>, EXT_FM<1>; | 
| Jack Carter | cd6b0e1 | 2012-08-28 20:07:41 +0000 | [diff] [blame] | 214 | } | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 215 | def DINS : InsBase<"dins", CPU64RegsOpnd>, EXT_FM<7>; | 
| Jack Carter | b3f3b17 | 2012-08-31 18:06:48 +0000 | [diff] [blame] | 216 | let Pattern = []<dag> in { | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 217 | def DINSU : InsBase<"dinsu", CPU64RegsOpnd>, EXT_FM<6>; | 
|  | 218 | def DINSM : InsBase<"dinsm", CPU64RegsOpnd>, EXT_FM<5>; | 
| Jack Carter | b3f3b17 | 2012-08-31 18:06:48 +0000 | [diff] [blame] | 219 | } | 
| Akira Hatanaka | 20cee2e | 2011-12-05 21:26:34 +0000 | [diff] [blame] | 220 |  | 
| Jack Carter | f4946cf | 2012-08-07 00:35:22 +0000 | [diff] [blame] | 221 | let isCodeGenOnly = 1, rs = 0, shamt = 0 in { | 
| Jack Carter | 120a30a | 2012-08-09 19:43:18 +0000 | [diff] [blame] | 222 | def DSLL64_32 : FR<0x00, 0x3c, (outs CPU64Regs:$rd), (ins CPURegs:$rt), | 
| Jack Carter | f4946cf | 2012-08-07 00:35:22 +0000 | [diff] [blame] | 223 | "dsll\t$rd, $rt, 32", [], IIAlu>; | 
|  | 224 | def SLL64_32 : FR<0x0, 0x00, (outs CPU64Regs:$rd), (ins CPURegs:$rt), | 
|  | 225 | "sll\t$rd, $rt, 0", [], IIAlu>; | 
|  | 226 | def SLL64_64 : FR<0x0, 0x00, (outs CPU64Regs:$rd), (ins CPU64Regs:$rt), | 
|  | 227 | "sll\t$rd, $rt, 0", [], IIAlu>; | 
|  | 228 | } | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 229 | } | 
| Akira Hatanaka | 7ba8a8d | 2011-09-30 18:51:46 +0000 | [diff] [blame] | 230 | //===----------------------------------------------------------------------===// | 
|  | 231 | //  Arbitrary patterns that map to one or more instructions | 
|  | 232 | //===----------------------------------------------------------------------===// | 
|  | 233 |  | 
| Akira Hatanaka | f93b3f4 | 2011-11-14 19:06:14 +0000 | [diff] [blame] | 234 | // extended loads | 
| Akira Hatanaka | 97e179f | 2012-12-07 03:06:09 +0000 | [diff] [blame] | 235 | let Predicates = [NotN64, HasStdEnc] in { | 
| Akira Hatanaka | d8ab16b | 2012-06-14 21:03:23 +0000 | [diff] [blame] | 236 | def : MipsPat<(i64 (extloadi1  addr:$src)), (LB64 addr:$src)>; | 
|  | 237 | def : MipsPat<(i64 (extloadi8  addr:$src)), (LB64 addr:$src)>; | 
| Akira Hatanaka | 3e7ba76 | 2012-09-15 01:52:08 +0000 | [diff] [blame] | 238 | def : MipsPat<(i64 (extloadi16 addr:$src)), (LH64 addr:$src)>; | 
|  | 239 | def : MipsPat<(i64 (extloadi32 addr:$src)), (LW64 addr:$src)>; | 
| Akira Hatanaka | f93b3f4 | 2011-11-14 19:06:14 +0000 | [diff] [blame] | 240 | } | 
| Akira Hatanaka | 97e179f | 2012-12-07 03:06:09 +0000 | [diff] [blame] | 241 | let Predicates = [IsN64, HasStdEnc] in { | 
| Akira Hatanaka | d8ab16b | 2012-06-14 21:03:23 +0000 | [diff] [blame] | 242 | def : MipsPat<(i64 (extloadi1  addr:$src)), (LB64_P8 addr:$src)>; | 
|  | 243 | def : MipsPat<(i64 (extloadi8  addr:$src)), (LB64_P8 addr:$src)>; | 
| Akira Hatanaka | 3e7ba76 | 2012-09-15 01:52:08 +0000 | [diff] [blame] | 244 | def : MipsPat<(i64 (extloadi16 addr:$src)), (LH64_P8 addr:$src)>; | 
|  | 245 | def : MipsPat<(i64 (extloadi32 addr:$src)), (LW64_P8 addr:$src)>; | 
| Akira Hatanaka | f93b3f4 | 2011-11-14 19:06:14 +0000 | [diff] [blame] | 246 | } | 
| Akira Hatanaka | 09b23eb | 2011-10-11 00:55:05 +0000 | [diff] [blame] | 247 |  | 
|  | 248 | // hi/lo relocs | 
| Akira Hatanaka | d8ab16b | 2012-06-14 21:03:23 +0000 | [diff] [blame] | 249 | def : MipsPat<(MipsHi tglobaladdr:$in), (LUi64 tglobaladdr:$in)>; | 
|  | 250 | def : MipsPat<(MipsHi tblockaddress:$in), (LUi64 tblockaddress:$in)>; | 
|  | 251 | def : MipsPat<(MipsHi tjumptable:$in), (LUi64 tjumptable:$in)>; | 
|  | 252 | def : MipsPat<(MipsHi tconstpool:$in), (LUi64 tconstpool:$in)>; | 
|  | 253 | def : MipsPat<(MipsHi tglobaltlsaddr:$in), (LUi64 tglobaltlsaddr:$in)>; | 
| Akira Hatanaka | bb6e74a | 2012-11-21 20:40:38 +0000 | [diff] [blame] | 254 | def : MipsPat<(MipsHi texternalsym:$in), (LUi64 texternalsym:$in)>; | 
| Akira Hatanaka | 7b8547c | 2011-11-16 22:39:56 +0000 | [diff] [blame] | 255 |  | 
| Akira Hatanaka | d8ab16b | 2012-06-14 21:03:23 +0000 | [diff] [blame] | 256 | def : MipsPat<(MipsLo tglobaladdr:$in), (DADDiu ZERO_64, tglobaladdr:$in)>; | 
|  | 257 | def : MipsPat<(MipsLo tblockaddress:$in), (DADDiu ZERO_64, tblockaddress:$in)>; | 
|  | 258 | def : MipsPat<(MipsLo tjumptable:$in), (DADDiu ZERO_64, tjumptable:$in)>; | 
|  | 259 | def : MipsPat<(MipsLo tconstpool:$in), (DADDiu ZERO_64, tconstpool:$in)>; | 
|  | 260 | def : MipsPat<(MipsLo tglobaltlsaddr:$in), | 
|  | 261 | (DADDiu ZERO_64, tglobaltlsaddr:$in)>; | 
| Akira Hatanaka | bb6e74a | 2012-11-21 20:40:38 +0000 | [diff] [blame] | 262 | def : MipsPat<(MipsLo texternalsym:$in), (DADDiu ZERO_64, texternalsym:$in)>; | 
| Akira Hatanaka | 7b8547c | 2011-11-16 22:39:56 +0000 | [diff] [blame] | 263 |  | 
| Akira Hatanaka | d8ab16b | 2012-06-14 21:03:23 +0000 | [diff] [blame] | 264 | def : MipsPat<(add CPU64Regs:$hi, (MipsLo tglobaladdr:$lo)), | 
|  | 265 | (DADDiu CPU64Regs:$hi, tglobaladdr:$lo)>; | 
|  | 266 | def : MipsPat<(add CPU64Regs:$hi, (MipsLo tblockaddress:$lo)), | 
|  | 267 | (DADDiu CPU64Regs:$hi, tblockaddress:$lo)>; | 
|  | 268 | def : MipsPat<(add CPU64Regs:$hi, (MipsLo tjumptable:$lo)), | 
|  | 269 | (DADDiu CPU64Regs:$hi, tjumptable:$lo)>; | 
|  | 270 | def : MipsPat<(add CPU64Regs:$hi, (MipsLo tconstpool:$lo)), | 
|  | 271 | (DADDiu CPU64Regs:$hi, tconstpool:$lo)>; | 
|  | 272 | def : MipsPat<(add CPU64Regs:$hi, (MipsLo tglobaltlsaddr:$lo)), | 
|  | 273 | (DADDiu CPU64Regs:$hi, tglobaltlsaddr:$lo)>; | 
| Akira Hatanaka | f75add6 | 2011-10-11 18:53:46 +0000 | [diff] [blame] | 274 |  | 
| Akira Hatanaka | b049aef | 2012-02-24 22:34:47 +0000 | [diff] [blame] | 275 | def : WrapperPat<tglobaladdr, DADDiu, CPU64Regs>; | 
|  | 276 | def : WrapperPat<tconstpool, DADDiu, CPU64Regs>; | 
|  | 277 | def : WrapperPat<texternalsym, DADDiu, CPU64Regs>; | 
|  | 278 | def : WrapperPat<tblockaddress, DADDiu, CPU64Regs>; | 
|  | 279 | def : WrapperPat<tjumptable, DADDiu, CPU64Regs>; | 
|  | 280 | def : WrapperPat<tglobaltlsaddr, DADDiu, CPU64Regs>; | 
| Akira Hatanaka | b2e05cb | 2011-12-07 22:11:43 +0000 | [diff] [blame] | 281 |  | 
| Akira Hatanaka | 7148bce | 2011-10-11 19:09:09 +0000 | [diff] [blame] | 282 | defm : BrcondPats<CPU64Regs, BEQ64, BNE64, SLT64, SLTu64, SLTi64, SLTiu64, | 
|  | 283 | ZERO_64>; | 
|  | 284 |  | 
| Akira Hatanaka | f75add6 | 2011-10-11 18:53:46 +0000 | [diff] [blame] | 285 | // setcc patterns | 
| Akira Hatanaka | 453ac88 | 2011-10-11 21:48:01 +0000 | [diff] [blame] | 286 | defm : SeteqPats<CPU64Regs, SLTiu64, XOR64, SLTu64, ZERO_64>; | 
| Akira Hatanaka | 46a7994 | 2011-10-11 21:40:01 +0000 | [diff] [blame] | 287 | defm : SetlePats<CPU64Regs, SLT64, SLTu64>; | 
|  | 288 | defm : SetgtPats<CPU64Regs, SLT64, SLTu64>; | 
|  | 289 | defm : SetgePats<CPU64Regs, SLT64, SLTu64>; | 
|  | 290 | defm : SetgeImmPats<CPU64Regs, SLTi64, SLTiu64>; | 
| Akira Hatanaka | d5c1329 | 2011-11-07 18:57:41 +0000 | [diff] [blame] | 291 |  | 
|  | 292 | // truncate | 
| Akira Hatanaka | d8ab16b | 2012-06-14 21:03:23 +0000 | [diff] [blame] | 293 | def : MipsPat<(i32 (trunc CPU64Regs:$src)), | 
|  | 294 | (SLL (EXTRACT_SUBREG CPU64Regs:$src, sub_32), 0)>, | 
| Akira Hatanaka | 97e179f | 2012-12-07 03:06:09 +0000 | [diff] [blame] | 295 | Requires<[IsN64, HasStdEnc]>; | 
| Jia Liu | f54f60f | 2012-02-28 07:46:26 +0000 | [diff] [blame] | 296 |  | 
| Akira Hatanaka | ae378af | 2011-12-07 23:14:41 +0000 | [diff] [blame] | 297 | // 32-to-64-bit extension | 
| Akira Hatanaka | d8ab16b | 2012-06-14 21:03:23 +0000 | [diff] [blame] | 298 | def : MipsPat<(i64 (anyext CPURegs:$src)), (SLL64_32 CPURegs:$src)>; | 
|  | 299 | def : MipsPat<(i64 (zext CPURegs:$src)), (DSRL (DSLL64_32 CPURegs:$src), 32)>; | 
|  | 300 | def : MipsPat<(i64 (sext CPURegs:$src)), (SLL64_32 CPURegs:$src)>; | 
| Akira Hatanaka | 4e21069 | 2011-12-20 22:06:20 +0000 | [diff] [blame] | 301 |  | 
| Akira Hatanaka | 494fdf1 | 2011-12-20 22:40:40 +0000 | [diff] [blame] | 302 | // Sign extend in register | 
| Akira Hatanaka | d8ab16b | 2012-06-14 21:03:23 +0000 | [diff] [blame] | 303 | def : MipsPat<(i64 (sext_inreg CPU64Regs:$src, i32)), | 
|  | 304 | (SLL64_64 CPU64Regs:$src)>; | 
| Akira Hatanaka | 494fdf1 | 2011-12-20 22:40:40 +0000 | [diff] [blame] | 305 |  | 
| Akira Hatanaka | d8ab16b | 2012-06-14 21:03:23 +0000 | [diff] [blame] | 306 | // bswap MipsPattern | 
|  | 307 | def : MipsPat<(bswap CPU64Regs:$rt), (DSHD (DSBH CPU64Regs:$rt))>; | 
| David Chisnall | 3705125 | 2012-10-09 16:27:43 +0000 | [diff] [blame] | 308 |  | 
|  | 309 | //===----------------------------------------------------------------------===// | 
|  | 310 | // Instruction aliases | 
|  | 311 | //===----------------------------------------------------------------------===// | 
| Jack Carter | 9c1a027 | 2013-02-05 08:32:10 +0000 | [diff] [blame] | 312 | def : InstAlias<"move $dst, $src", | 
|  | 313 | (DADDu CPU64RegsOpnd:$dst,  CPU64RegsOpnd:$src, ZERO_64), 1>, | 
|  | 314 | Requires<[HasMips64]>; | 
|  | 315 | def : InstAlias<"move $dst, $src", | 
|  | 316 | (OR64 CPU64RegsOpnd:$dst, CPU64RegsOpnd:$src, ZERO_64), 0>, | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 317 | Requires<[HasMips64]>; | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 318 | def : InstAlias<"and $rs, $rt, $imm", | 
| Jack Carter | 9c1a027 | 2013-02-05 08:32:10 +0000 | [diff] [blame] | 319 | (DANDi CPU64RegsOpnd:$rs, CPU64RegsOpnd:$rt, uimm16_64:$imm), | 
|  | 320 | 1>, | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 321 | Requires<[HasMips64]>; | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 322 | def : InstAlias<"slt $rs, $rt, $imm", | 
| Jack Carter | 9c1a027 | 2013-02-05 08:32:10 +0000 | [diff] [blame] | 323 | (SLTi64 CPURegsOpnd:$rs, CPU64Regs:$rt, simm16_64:$imm), 1>, | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 324 | Requires<[HasMips64]>; | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 325 | def : InstAlias<"xor $rs, $rt, $imm", | 
| Jack Carter | 9c1a027 | 2013-02-05 08:32:10 +0000 | [diff] [blame] | 326 | (XORi64 CPU64RegsOpnd:$rs, CPU64RegsOpnd:$rt, uimm16_64:$imm), | 
|  | 327 | 1>, | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 328 | Requires<[HasMips64]>; | 
|  | 329 | def : InstAlias<"not $rt, $rs", | 
| Jack Carter | 9c1a027 | 2013-02-05 08:32:10 +0000 | [diff] [blame] | 330 | (NOR64 CPU64RegsOpnd:$rt, CPU64RegsOpnd:$rs, ZERO_64), 1>, | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 331 | Requires<[HasMips64]>; | 
| Jack Carter | 9c1a027 | 2013-02-05 08:32:10 +0000 | [diff] [blame] | 332 | def : InstAlias<"j $rs", (JR64 CPU64Regs:$rs), 0>, Requires<[HasMips64]>; | 
| Akira Hatanaka | 061d1ea | 2013-02-07 19:48:00 +0000 | [diff] [blame^] | 333 | def : InstAlias<"jalr $rs", (JALR64 RA_64, CPU64Regs:$rs)>, | 
|  | 334 | Requires<[HasMips64]>; | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 335 | def : InstAlias<"daddu $rs, $rt, $imm", | 
| Jack Carter | 9c1a027 | 2013-02-05 08:32:10 +0000 | [diff] [blame] | 336 | (DADDiu CPU64RegsOpnd:$rs, CPU64RegsOpnd:$rt, simm16_64:$imm), | 
|  | 337 | 1>; | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 338 | def : InstAlias<"dadd $rs, $rt, $imm", | 
| Jack Carter | 9c1a027 | 2013-02-05 08:32:10 +0000 | [diff] [blame] | 339 | (DADDi CPU64RegsOpnd:$rs, CPU64RegsOpnd:$rt, simm16_64:$imm), | 
|  | 340 | 1>; | 
| David Chisnall | 6a00ab4 | 2012-10-11 10:21:34 +0000 | [diff] [blame] | 341 |  | 
|  | 342 | /// Move between CPU and coprocessor registers | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 343 |  | 
| David Chisnall | 6a00ab4 | 2012-10-11 10:21:34 +0000 | [diff] [blame] | 344 | let DecoderNamespace = "Mips64" in { | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 345 | def DMFC0_3OP64 : MFC3OP<(outs CPU64RegsOpnd:$rt), | 
|  | 346 | (ins CPU64RegsOpnd:$rd, uimm16:$sel), | 
| Akira Hatanaka | e36e2f6 | 2013-01-04 19:13:49 +0000 | [diff] [blame] | 347 | "dmfc0\t$rt, $rd, $sel">, MFC3OP_FM<0x10, 1>; | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 348 | def DMTC0_3OP64 : MFC3OP<(outs CPU64RegsOpnd:$rd, uimm16:$sel), | 
|  | 349 | (ins CPU64RegsOpnd:$rt), | 
| Akira Hatanaka | e36e2f6 | 2013-01-04 19:13:49 +0000 | [diff] [blame] | 350 | "dmtc0\t$rt, $rd, $sel">, MFC3OP_FM<0x10, 5>; | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 351 | def DMFC2_3OP64 : MFC3OP<(outs CPU64RegsOpnd:$rt), | 
|  | 352 | (ins CPU64RegsOpnd:$rd, uimm16:$sel), | 
| Akira Hatanaka | e36e2f6 | 2013-01-04 19:13:49 +0000 | [diff] [blame] | 353 | "dmfc2\t$rt, $rd, $sel">, MFC3OP_FM<0x12, 1>; | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 354 | def DMTC2_3OP64 : MFC3OP<(outs CPU64RegsOpnd:$rd, uimm16:$sel), | 
|  | 355 | (ins CPU64RegsOpnd:$rt), | 
| Akira Hatanaka | e36e2f6 | 2013-01-04 19:13:49 +0000 | [diff] [blame] | 356 | "dmtc2\t$rt, $rd, $sel">, MFC3OP_FM<0x12, 5>; | 
| David Chisnall | 6a00ab4 | 2012-10-11 10:21:34 +0000 | [diff] [blame] | 357 | } | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 358 |  | 
| David Chisnall | 6a00ab4 | 2012-10-11 10:21:34 +0000 | [diff] [blame] | 359 | // Two operand (implicit 0 selector) versions: | 
| Akira Hatanaka | e067e5a | 2013-01-04 19:38:05 +0000 | [diff] [blame] | 360 | def : InstAlias<"dmfc0 $rt, $rd", | 
| Jack Carter | 9c1a027 | 2013-02-05 08:32:10 +0000 | [diff] [blame] | 361 | (DMFC0_3OP64 CPU64RegsOpnd:$rt, CPU64RegsOpnd:$rd, 0), 0>; | 
| Akira Hatanaka | e067e5a | 2013-01-04 19:38:05 +0000 | [diff] [blame] | 362 | def : InstAlias<"dmtc0 $rt, $rd", | 
| Jack Carter | 9c1a027 | 2013-02-05 08:32:10 +0000 | [diff] [blame] | 363 | (DMTC0_3OP64 CPU64RegsOpnd:$rd, 0, CPU64RegsOpnd:$rt), 0>; | 
| Akira Hatanaka | e067e5a | 2013-01-04 19:38:05 +0000 | [diff] [blame] | 364 | def : InstAlias<"dmfc2 $rt, $rd", | 
| Jack Carter | 9c1a027 | 2013-02-05 08:32:10 +0000 | [diff] [blame] | 365 | (DMFC2_3OP64 CPU64RegsOpnd:$rt, CPU64RegsOpnd:$rd, 0), 0>; | 
| Akira Hatanaka | e067e5a | 2013-01-04 19:38:05 +0000 | [diff] [blame] | 366 | def : InstAlias<"dmtc2 $rt, $rd", | 
| Jack Carter | 9c1a027 | 2013-02-05 08:32:10 +0000 | [diff] [blame] | 367 | (DMTC2_3OP64 CPU64RegsOpnd:$rd, 0, CPU64RegsOpnd:$rt), 0>; | 
| David Chisnall | 6a00ab4 | 2012-10-11 10:21:34 +0000 | [diff] [blame] | 368 |  |