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