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 | |
Akira Hatanaka | 2a232d8 | 2011-12-19 19:44:09 +0000 | [diff] [blame] | 18 | // shamt must fit in 6 bits. |
| 19 | def immZExt6 : ImmLeaf<i32, [{return Imm == (Imm & 0x3f);}]>; |
Akira Hatanaka | 61e256a | 2011-09-30 03:18:46 +0000 | [diff] [blame] | 20 | |
Kai Nacke | 6da86e8 | 2014-04-04 16:21:59 +0000 | [diff] [blame] | 21 | // Node immediate fits as 10-bit sign extended on target immediate. |
| 22 | // e.g. seqi, snei |
| 23 | def immSExt10_64 : PatLeaf<(i64 imm), |
| 24 | [{ return isInt<10>(N->getSExtValue()); }]>; |
| 25 | |
Daniel Sanders | 0fa6041 | 2014-06-12 13:39:06 +0000 | [diff] [blame] | 26 | def immZExt16_64 : PatLeaf<(i64 imm), |
Simon Dardis | 5676d06 | 2016-04-22 13:19:22 +0000 | [diff] [blame] | 27 | [{ return isUInt<16>(N->getZExtValue()); }]>; |
Daniel Sanders | 0fa6041 | 2014-06-12 13:39:06 +0000 | [diff] [blame] | 28 | |
Kai Nacke | 63072f8 | 2015-01-20 16:10:51 +0000 | [diff] [blame] | 29 | def immZExt5_64 : ImmLeaf<i64, [{ return Imm == (Imm & 0x1f); }]>; |
| 30 | |
| 31 | // Transformation function: get log2 of low 32 bits of immediate |
| 32 | def Log2LO : SDNodeXForm<imm, [{ |
| 33 | return getImm(N, Log2_64((unsigned) N->getZExtValue())); |
| 34 | }]>; |
| 35 | |
| 36 | // Transformation function: get log2 of high 32 bits of immediate |
| 37 | def Log2HI : SDNodeXForm<imm, [{ |
| 38 | return getImm(N, Log2_64((unsigned) (N->getZExtValue() >> 32))); |
| 39 | }]>; |
| 40 | |
| 41 | // Predicate: True if immediate is a power of 2 and fits 32 bits |
| 42 | def PowerOf2LO : PatLeaf<(imm), [{ |
| 43 | if (N->getValueType(0) == MVT::i64) { |
| 44 | uint64_t Imm = N->getZExtValue(); |
| 45 | return isPowerOf2_64(Imm) && (Imm & 0xffffffff) == Imm; |
| 46 | } |
| 47 | else |
| 48 | return false; |
| 49 | }]>; |
| 50 | |
| 51 | // Predicate: True if immediate is a power of 2 and exceeds 32 bits |
| 52 | def PowerOf2HI : PatLeaf<(imm), [{ |
| 53 | if (N->getValueType(0) == MVT::i64) { |
| 54 | uint64_t Imm = N->getZExtValue(); |
| 55 | return isPowerOf2_64(Imm) && (Imm & 0xffffffff00000000) == Imm; |
| 56 | } |
| 57 | else |
| 58 | return false; |
| 59 | }]>; |
| 60 | |
Strahinja Petrovic | 89df797 | 2017-08-30 11:25:38 +0000 | [diff] [blame] | 61 | def PowerOf2LO_i32 : PatLeaf<(imm), [{ |
| 62 | if (N->getValueType(0) == MVT::i32) { |
| 63 | uint64_t Imm = N->getZExtValue(); |
| 64 | return isPowerOf2_32(Imm) && isUInt<32>(Imm); |
| 65 | } |
| 66 | else |
| 67 | return false; |
| 68 | }]>; |
| 69 | |
Vasileios Kalintiris | 3751d41 | 2016-04-13 15:07:45 +0000 | [diff] [blame] | 70 | def assertzext_lt_i32 : PatFrag<(ops node:$src), (assertzext node:$src), [{ |
| 71 | return cast<VTSDNode>(N->getOperand(1))->getVT().bitsLT(MVT::i32); |
| 72 | }]>; |
| 73 | |
Akira Hatanaka | 7769a77 | 2011-09-30 02:08:54 +0000 | [diff] [blame] | 74 | //===----------------------------------------------------------------------===// |
Akira Hatanaka | 3603641 | 2011-09-29 20:37:56 +0000 | [diff] [blame] | 75 | // Instructions specific format |
| 76 | //===----------------------------------------------------------------------===// |
Akira Hatanaka | 6781fc1 | 2013-08-20 21:08:22 +0000 | [diff] [blame] | 77 | let usesCustomInserter = 1 in { |
| 78 | def ATOMIC_LOAD_ADD_I64 : Atomic2Ops<atomic_load_add_64, GPR64>; |
| 79 | def ATOMIC_LOAD_SUB_I64 : Atomic2Ops<atomic_load_sub_64, GPR64>; |
| 80 | def ATOMIC_LOAD_AND_I64 : Atomic2Ops<atomic_load_and_64, GPR64>; |
| 81 | def ATOMIC_LOAD_OR_I64 : Atomic2Ops<atomic_load_or_64, GPR64>; |
| 82 | def ATOMIC_LOAD_XOR_I64 : Atomic2Ops<atomic_load_xor_64, GPR64>; |
| 83 | def ATOMIC_LOAD_NAND_I64 : Atomic2Ops<atomic_load_nand_64, GPR64>; |
| 84 | def ATOMIC_SWAP_I64 : Atomic2Ops<atomic_swap_64, GPR64>; |
| 85 | def ATOMIC_CMP_SWAP_I64 : AtomicCmpSwap<atomic_cmp_swap_64, GPR64>; |
Akira Hatanaka | 21cbc25 | 2011-11-11 04:14:30 +0000 | [diff] [blame] | 86 | } |
| 87 | |
Aleksandar Beserminji | 3239ba8 | 2018-07-05 09:27:05 +0000 | [diff] [blame] | 88 | def ATOMIC_LOAD_ADD_I64_POSTRA : Atomic2OpsPostRA<GPR64>; |
| 89 | def ATOMIC_LOAD_SUB_I64_POSTRA : Atomic2OpsPostRA<GPR64>; |
| 90 | def ATOMIC_LOAD_AND_I64_POSTRA : Atomic2OpsPostRA<GPR64>; |
| 91 | def ATOMIC_LOAD_OR_I64_POSTRA : Atomic2OpsPostRA<GPR64>; |
| 92 | def ATOMIC_LOAD_XOR_I64_POSTRA : Atomic2OpsPostRA<GPR64>; |
| 93 | def ATOMIC_LOAD_NAND_I64_POSTRA : Atomic2OpsPostRA<GPR64>; |
| 94 | |
| 95 | def ATOMIC_SWAP_I64_POSTRA : Atomic2OpsPostRA<GPR64>; |
| 96 | |
| 97 | def ATOMIC_CMP_SWAP_I64_POSTRA : AtomicCmpSwapPostRA<GPR64>; |
| 98 | |
Akira Hatanaka | 4254319 | 2013-04-30 23:22:09 +0000 | [diff] [blame] | 99 | /// Pseudo instructions for loading and storing accumulator registers. |
Simon Dardis | e661e52 | 2016-06-14 09:35:29 +0000 | [diff] [blame] | 100 | let isPseudo = 1, isCodeGenOnly = 1, hasNoSchedulingInfo = 1 in { |
Akira Hatanaka | 6781fc1 | 2013-08-20 21:08:22 +0000 | [diff] [blame] | 101 | def LOAD_ACC128 : Load<"", ACC128>; |
| 102 | def STORE_ACC128 : Store<"", ACC128>; |
Akira Hatanaka | c8d8502 | 2013-03-30 00:54:52 +0000 | [diff] [blame] | 103 | } |
| 104 | |
Akira Hatanaka | 3603641 | 2011-09-29 20:37:56 +0000 | [diff] [blame] | 105 | //===----------------------------------------------------------------------===// |
| 106 | // Instruction definition |
| 107 | //===----------------------------------------------------------------------===// |
Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 108 | let DecoderNamespace = "Mips64" in { |
Akira Hatanaka | 7769a77 | 2011-09-30 02:08:54 +0000 | [diff] [blame] | 109 | /// Arithmetic Instructions (ALU Immediate) |
Simon Dardis | e661e52 | 2016-06-14 09:35:29 +0000 | [diff] [blame] | 110 | def DADDi : ArithLogicI<"daddi", simm16_64, GPR64Opnd, II_DADDI>, |
| 111 | ADDI_FM<0x18>, ISA_MIPS3_NOT_32R6_64R6; |
Zlatko Buljan | 53a037f | 2016-04-08 07:27:26 +0000 | [diff] [blame] | 112 | let AdditionalPredicates = [NotInMicroMips] in { |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 113 | def DADDiu : ArithLogicI<"daddiu", simm16_64, GPR64Opnd, II_DADDIU, |
| 114 | immSExt16, add>, |
Zlatko Buljan | 53a037f | 2016-04-08 07:27:26 +0000 | [diff] [blame] | 115 | ADDI_FM<0x19>, IsAsCheapAsAMove, ISA_MIPS3; |
| 116 | } |
Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 117 | |
| 118 | let isCodeGenOnly = 1 in { |
Vasileios Kalintiris | 36901dd | 2016-03-01 20:25:43 +0000 | [diff] [blame] | 119 | def SLTi64 : SetCC_I<"slti", setlt, simm16_64, immSExt16, GPR64Opnd>, |
Simon Dardis | 1d6254f | 2018-06-08 10:55:34 +0000 | [diff] [blame] | 120 | SLTI_FM<0xa>, GPR_64; |
Vasileios Kalintiris | 36901dd | 2016-03-01 20:25:43 +0000 | [diff] [blame] | 121 | def SLTiu64 : SetCC_I<"sltiu", setult, simm16_64, immSExt16, GPR64Opnd>, |
Simon Dardis | 1d6254f | 2018-06-08 10:55:34 +0000 | [diff] [blame] | 122 | SLTI_FM<0xb>, GPR_64; |
Daniel Sanders | 306ef07 | 2014-01-16 15:57:05 +0000 | [diff] [blame] | 123 | def ANDi64 : ArithLogicI<"andi", uimm16_64, GPR64Opnd, II_AND, immZExt16, and>, |
Simon Dardis | 1d6254f | 2018-06-08 10:55:34 +0000 | [diff] [blame] | 124 | ADDI_FM<0xc>, GPR_64; |
Daniel Sanders | 306ef07 | 2014-01-16 15:57:05 +0000 | [diff] [blame] | 125 | def ORi64 : ArithLogicI<"ori", uimm16_64, GPR64Opnd, II_OR, immZExt16, or>, |
Simon Dardis | 1d6254f | 2018-06-08 10:55:34 +0000 | [diff] [blame] | 126 | ADDI_FM<0xd>, GPR_64; |
Daniel Sanders | 306ef07 | 2014-01-16 15:57:05 +0000 | [diff] [blame] | 127 | def XORi64 : ArithLogicI<"xori", uimm16_64, GPR64Opnd, II_XOR, immZExt16, xor>, |
Simon Dardis | 1d6254f | 2018-06-08 10:55:34 +0000 | [diff] [blame] | 128 | ADDI_FM<0xe>, GPR_64; |
| 129 | def LUi64 : LoadUpper<"lui", GPR64Opnd, uimm16_64_relaxed>, LUI_FM, GPR_64; |
Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 130 | } |
Akira Hatanaka | 7769a77 | 2011-09-30 02:08:54 +0000 | [diff] [blame] | 131 | |
Akira Hatanaka | 3603641 | 2011-09-29 20:37:56 +0000 | [diff] [blame] | 132 | /// Arithmetic Instructions (3-Operand, R-Type) |
Zlatko Buljan | 53a037f | 2016-04-08 07:27:26 +0000 | [diff] [blame] | 133 | let AdditionalPredicates = [NotInMicroMips] in { |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 134 | def DADD : ArithLogicR<"dadd", GPR64Opnd, 1, II_DADD>, ADD_FM<0, 0x2c>, |
Zlatko Buljan | de0bbe6 | 2016-04-27 11:31:44 +0000 | [diff] [blame] | 135 | ISA_MIPS3; |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 136 | def DADDu : ArithLogicR<"daddu", GPR64Opnd, 1, II_DADDU, add>, |
| 137 | ADD_FM<0, 0x2d>, ISA_MIPS3; |
| 138 | def DSUBu : ArithLogicR<"dsubu", GPR64Opnd, 0, II_DSUBU, sub>, |
| 139 | ADD_FM<0, 0x2f>, ISA_MIPS3; |
| 140 | def DSUB : ArithLogicR<"dsub", GPR64Opnd, 0, II_DSUB>, ADD_FM<0, 0x2e>, |
Zlatko Buljan | de0bbe6 | 2016-04-27 11:31:44 +0000 | [diff] [blame] | 141 | ISA_MIPS3; |
Zlatko Buljan | 53a037f | 2016-04-08 07:27:26 +0000 | [diff] [blame] | 142 | } |
Akira Hatanaka | e2a39e7 | 2013-08-06 22:35:29 +0000 | [diff] [blame] | 143 | |
| 144 | let isCodeGenOnly = 1 in { |
Simon Dardis | 1d6254f | 2018-06-08 10:55:34 +0000 | [diff] [blame] | 145 | def SLT64 : SetCC_R<"slt", setlt, GPR64Opnd>, ADD_FM<0, 0x2a>, GPR_64; |
| 146 | def SLTu64 : SetCC_R<"sltu", setult, GPR64Opnd>, ADD_FM<0, 0x2b>, GPR_64; |
| 147 | def AND64 : ArithLogicR<"and", GPR64Opnd, 1, II_AND, and>, ADD_FM<0, 0x24>, |
| 148 | GPR_64; |
| 149 | def OR64 : ArithLogicR<"or", GPR64Opnd, 1, II_OR, or>, ADD_FM<0, 0x25>, |
| 150 | GPR_64; |
| 151 | def XOR64 : ArithLogicR<"xor", GPR64Opnd, 1, II_XOR, xor>, ADD_FM<0, 0x26>, |
| 152 | GPR_64; |
| 153 | def NOR64 : LogicNOR<"nor", GPR64Opnd>, ADD_FM<0, 0x27>, GPR_64; |
Akira Hatanaka | e2a39e7 | 2013-08-06 22:35:29 +0000 | [diff] [blame] | 154 | } |
Akira Hatanaka | 61e256a | 2011-09-30 03:18:46 +0000 | [diff] [blame] | 155 | |
| 156 | /// Shift Instructions |
Hrvoje Varga | aeb1fe8 | 2016-05-11 11:17:04 +0000 | [diff] [blame] | 157 | let AdditionalPredicates = [NotInMicroMips] in { |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 158 | def DSLL : shift_rotate_imm<"dsll", uimm6, GPR64Opnd, II_DSLL, shl, |
| 159 | immZExt6>, |
Hrvoje Varga | f1e0a03 | 2016-06-16 07:06:25 +0000 | [diff] [blame] | 160 | SRA_FM<0x38, 0>, ISA_MIPS3; |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 161 | def DSRL : shift_rotate_imm<"dsrl", uimm6, GPR64Opnd, II_DSRL, srl, |
| 162 | immZExt6>, |
Daniel Sanders | f2056be | 2014-05-09 13:02:27 +0000 | [diff] [blame] | 163 | SRA_FM<0x3a, 0>, ISA_MIPS3; |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 164 | def DSRA : shift_rotate_imm<"dsra", uimm6, GPR64Opnd, II_DSRA, sra, |
| 165 | immZExt6>, |
Daniel Sanders | f2056be | 2014-05-09 13:02:27 +0000 | [diff] [blame] | 166 | SRA_FM<0x3b, 0>, ISA_MIPS3; |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 167 | def DSLLV : shift_rotate_reg<"dsllv", GPR64Opnd, II_DSLLV, shl>, |
Hrvoje Varga | f1e0a03 | 2016-06-16 07:06:25 +0000 | [diff] [blame] | 168 | SRLV_FM<0x14, 0>, ISA_MIPS3; |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 169 | def DSRAV : shift_rotate_reg<"dsrav", GPR64Opnd, II_DSRAV, sra>, |
Hrvoje Varga | aeb1fe8 | 2016-05-11 11:17:04 +0000 | [diff] [blame] | 170 | SRLV_FM<0x17, 0>, ISA_MIPS3; |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 171 | def DSRLV : shift_rotate_reg<"dsrlv", GPR64Opnd, II_DSRLV, srl>, |
Hrvoje Varga | 24b975d | 2016-06-27 08:23:28 +0000 | [diff] [blame] | 172 | SRLV_FM<0x16, 0>, ISA_MIPS3; |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 173 | def DSLL32 : shift_rotate_imm<"dsll32", uimm5, GPR64Opnd, II_DSLL32>, |
Hrvoje Varga | aeb1fe8 | 2016-05-11 11:17:04 +0000 | [diff] [blame] | 174 | SRA_FM<0x3c, 0>, ISA_MIPS3; |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 175 | def DSRL32 : shift_rotate_imm<"dsrl32", uimm5, GPR64Opnd, II_DSRL32>, |
Hrvoje Varga | 24b975d | 2016-06-27 08:23:28 +0000 | [diff] [blame] | 176 | SRA_FM<0x3e, 0>, ISA_MIPS3; |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 177 | def DSRA32 : shift_rotate_imm<"dsra32", uimm5, GPR64Opnd, II_DSRA32>, |
Hrvoje Varga | aeb1fe8 | 2016-05-11 11:17:04 +0000 | [diff] [blame] | 178 | SRA_FM<0x3f, 0>, ISA_MIPS3; |
Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 179 | |
Akira Hatanaka | 7ba8a8d | 2011-09-30 18:51:46 +0000 | [diff] [blame] | 180 | // Rotate Instructions |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 181 | def DROTR : shift_rotate_imm<"drotr", uimm6, GPR64Opnd, II_DROTR, rotr, |
| 182 | immZExt6>, |
Hrvoje Varga | f1e0a03 | 2016-06-16 07:06:25 +0000 | [diff] [blame] | 183 | SRA_FM<0x3a, 1>, ISA_MIPS64R2; |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 184 | def DROTRV : shift_rotate_reg<"drotrv", GPR64Opnd, II_DROTRV, rotr>, |
Hrvoje Varga | f1e0a03 | 2016-06-16 07:06:25 +0000 | [diff] [blame] | 185 | SRLV_FM<0x16, 1>, ISA_MIPS64R2; |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 186 | def DROTR32 : shift_rotate_imm<"drotr32", uimm5, GPR64Opnd, II_DROTR32>, |
Hrvoje Varga | f1e0a03 | 2016-06-16 07:06:25 +0000 | [diff] [blame] | 187 | SRA_FM<0x3e, 1>, ISA_MIPS64R2; |
| 188 | } |
Akira Hatanaka | 7ba8a8d | 2011-09-30 18:51:46 +0000 | [diff] [blame] | 189 | |
Akira Hatanaka | be68f3c | 2011-10-11 00:27:28 +0000 | [diff] [blame] | 190 | /// Load and Store Instructions |
Jia Liu | f54f60f | 2012-02-28 07:46:26 +0000 | [diff] [blame] | 191 | /// aligned |
Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 192 | let isCodeGenOnly = 1 in { |
Simon Dardis | 1d6254f | 2018-06-08 10:55:34 +0000 | [diff] [blame] | 193 | def LB64 : Load<"lb", GPR64Opnd, sextloadi8, II_LB>, LW_FM<0x20>, GPR_64; |
| 194 | def LBu64 : Load<"lbu", GPR64Opnd, zextloadi8, II_LBU>, LW_FM<0x24>, GPR_64; |
| 195 | def LH64 : Load<"lh", GPR64Opnd, sextloadi16, II_LH>, LW_FM<0x21>, GPR_64; |
| 196 | def LHu64 : Load<"lhu", GPR64Opnd, zextloadi16, II_LHU>, LW_FM<0x25>, GPR_64; |
| 197 | def LW64 : Load<"lw", GPR64Opnd, sextloadi32, II_LW>, LW_FM<0x23>, GPR_64; |
| 198 | def SB64 : Store<"sb", GPR64Opnd, truncstorei8, II_SB>, LW_FM<0x28>, GPR_64; |
| 199 | def SH64 : Store<"sh", GPR64Opnd, truncstorei16, II_SH>, LW_FM<0x29>, |
| 200 | GPR_64; |
| 201 | def SW64 : Store<"sw", GPR64Opnd, truncstorei32, II_SW>, LW_FM<0x2b>, |
| 202 | GPR_64; |
Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 203 | } |
| 204 | |
Hrvoje Varga | 24b975d | 2016-06-27 08:23:28 +0000 | [diff] [blame] | 205 | let AdditionalPredicates = [NotInMicroMips] in { |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 206 | def LWu : MMRel, Load<"lwu", GPR64Opnd, zextloadi32, II_LWU>, |
Hrvoje Varga | 24b975d | 2016-06-27 08:23:28 +0000 | [diff] [blame] | 207 | LW_FM<0x27>, ISA_MIPS3; |
Simon Atanasyan | 05db279 | 2018-05-10 16:01:36 +0000 | [diff] [blame] | 208 | def LD : LoadMemory<"ld", GPR64Opnd, mem_simmptr, load, II_LD>, |
Hrvoje Varga | 24b975d | 2016-06-27 08:23:28 +0000 | [diff] [blame] | 209 | LW_FM<0x37>, ISA_MIPS3; |
Simon Atanasyan | 05db279 | 2018-05-10 16:01:36 +0000 | [diff] [blame] | 210 | def SD : StoreMemory<"sd", GPR64Opnd, mem_simmptr, store, II_SD>, |
Hrvoje Varga | 24b975d | 2016-06-27 08:23:28 +0000 | [diff] [blame] | 211 | LW_FM<0x3f>, ISA_MIPS3; |
| 212 | } |
| 213 | |
| 214 | |
Akira Hatanaka | be68f3c | 2011-10-11 00:27:28 +0000 | [diff] [blame] | 215 | |
Akira Hatanaka | f11571d | 2012-06-02 00:04:19 +0000 | [diff] [blame] | 216 | /// load/store left/right |
Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 217 | let isCodeGenOnly = 1 in { |
Simon Dardis | 1d6254f | 2018-06-08 10:55:34 +0000 | [diff] [blame] | 218 | def LWL64 : LoadLeftRight<"lwl", MipsLWL, GPR64Opnd, II_LWL>, LW_FM<0x22>, |
| 219 | GPR_64; |
| 220 | def LWR64 : LoadLeftRight<"lwr", MipsLWR, GPR64Opnd, II_LWR>, LW_FM<0x26>, |
| 221 | GPR_64; |
| 222 | def SWL64 : StoreLeftRight<"swl", MipsSWL, GPR64Opnd, II_SWL>, LW_FM<0x2a>, |
| 223 | GPR_64; |
| 224 | def SWR64 : StoreLeftRight<"swr", MipsSWR, GPR64Opnd, II_SWR>, LW_FM<0x2e>, |
| 225 | GPR_64; |
Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 226 | } |
Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 227 | |
Daniel Sanders | f2056be | 2014-05-09 13:02:27 +0000 | [diff] [blame] | 228 | def LDL : LoadLeftRight<"ldl", MipsLDL, GPR64Opnd, II_LDL>, LW_FM<0x1a>, |
Daniel Sanders | ac27263 | 2014-05-23 13:18:02 +0000 | [diff] [blame] | 229 | ISA_MIPS3_NOT_32R6_64R6; |
Daniel Sanders | f2056be | 2014-05-09 13:02:27 +0000 | [diff] [blame] | 230 | def LDR : LoadLeftRight<"ldr", MipsLDR, GPR64Opnd, II_LDR>, LW_FM<0x1b>, |
Daniel Sanders | ac27263 | 2014-05-23 13:18:02 +0000 | [diff] [blame] | 231 | ISA_MIPS3_NOT_32R6_64R6; |
Daniel Sanders | f2056be | 2014-05-09 13:02:27 +0000 | [diff] [blame] | 232 | def SDL : StoreLeftRight<"sdl", MipsSDL, GPR64Opnd, II_SDL>, LW_FM<0x2c>, |
Daniel Sanders | ac27263 | 2014-05-23 13:18:02 +0000 | [diff] [blame] | 233 | ISA_MIPS3_NOT_32R6_64R6; |
Daniel Sanders | f2056be | 2014-05-09 13:02:27 +0000 | [diff] [blame] | 234 | def SDR : StoreLeftRight<"sdr", MipsSDR, GPR64Opnd, II_SDR>, LW_FM<0x2d>, |
Daniel Sanders | ac27263 | 2014-05-23 13:18:02 +0000 | [diff] [blame] | 235 | ISA_MIPS3_NOT_32R6_64R6; |
Akira Hatanaka | f11571d | 2012-06-02 00:04:19 +0000 | [diff] [blame] | 236 | |
Akira Hatanaka | 21cbc25 | 2011-11-11 04:14:30 +0000 | [diff] [blame] | 237 | /// Load-linked, Store-conditional |
Hrvoje Varga | 24b975d | 2016-06-27 08:23:28 +0000 | [diff] [blame] | 238 | let AdditionalPredicates = [NotInMicroMips] in { |
Simon Atanasyan | 05db279 | 2018-05-10 16:01:36 +0000 | [diff] [blame] | 239 | def LLD : LLBase<"lld", GPR64Opnd, mem_simmptr>, LW_FM<0x34>, |
Hrvoje Varga | 24b975d | 2016-06-27 08:23:28 +0000 | [diff] [blame] | 240 | ISA_MIPS3_NOT_32R6_64R6; |
| 241 | } |
Daniel Sanders | 6a803f6 | 2014-06-16 13:13:03 +0000 | [diff] [blame] | 242 | def SCD : SCBase<"scd", GPR64Opnd>, LW_FM<0x3c>, ISA_MIPS3_NOT_32R6_64R6; |
Akira Hatanaka | 21cbc25 | 2011-11-11 04:14:30 +0000 | [diff] [blame] | 243 | |
Simon Dardis | 4fbf76f | 2016-06-14 11:29:28 +0000 | [diff] [blame] | 244 | let AdditionalPredicates = [NotInMicroMips], |
| 245 | DecoderNamespace = "Mips32_64_PTR64" in { |
| 246 | def LL64 : LLBase<"ll", GPR32Opnd>, LW_FM<0x30>, PTR_64, |
| 247 | ISA_MIPS2_NOT_32R6_64R6; |
| 248 | def SC64 : SCBase<"sc", GPR32Opnd>, LW_FM<0x38>, PTR_64, |
| 249 | ISA_MIPS2_NOT_32R6_64R6; |
Simon Dardis | 57f4ae4 | 2016-08-04 09:17:07 +0000 | [diff] [blame] | 250 | def JR64 : IndirectBranch<"jr", GPR64Opnd>, MTLO_FM<8>, PTR_64; |
Simon Dardis | 4fbf76f | 2016-06-14 11:29:28 +0000 | [diff] [blame] | 251 | } |
| 252 | |
Simon Dardis | 57f4ae4 | 2016-08-04 09:17:07 +0000 | [diff] [blame] | 253 | def JALR64 : JumpLinkReg<"jalr", GPR64Opnd>, JALR_FM; |
| 254 | |
Akira Hatanaka | 4b6ac98 | 2011-10-11 18:49:17 +0000 | [diff] [blame] | 255 | /// Jump and Branch Instructions |
Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 256 | let isCodeGenOnly = 1 in { |
Simon Dardis | 1d6254f | 2018-06-08 10:55:34 +0000 | [diff] [blame] | 257 | def BEQ64 : CBranch<"beq", brtarget, seteq, GPR64Opnd>, BEQ_FM<4>, |
| 258 | GPR_64; |
| 259 | def BNE64 : CBranch<"bne", brtarget, setne, GPR64Opnd>, BEQ_FM<5>, |
| 260 | GPR_64; |
| 261 | def BGEZ64 : CBranchZero<"bgez", brtarget, setge, GPR64Opnd>, BGEZ_FM<1, 1>, |
| 262 | GPR_64; |
| 263 | def BGTZ64 : CBranchZero<"bgtz", brtarget, setgt, GPR64Opnd>, BGEZ_FM<7, 0>, |
| 264 | GPR_64; |
| 265 | def BLEZ64 : CBranchZero<"blez", brtarget, setle, GPR64Opnd>, BGEZ_FM<6, 0>, |
| 266 | GPR_64; |
| 267 | def BLTZ64 : CBranchZero<"bltz", brtarget, setlt, GPR64Opnd>, BGEZ_FM<1, 0>, |
| 268 | GPR_64; |
Simon Dardis | 7bc8ad5 | 2018-02-21 00:06:53 +0000 | [diff] [blame] | 269 | let AdditionalPredicates = [NoIndirectJumpGuards] in |
| 270 | def JALR64Pseudo : JumpLinkRegPseudo<GPR64Opnd, JALR, RA, GPR32Opnd>; |
| 271 | } |
| 272 | let AdditionalPredicates = [NotInMicroMips], |
| 273 | DecoderNamespace = "Mips64" in { |
| 274 | def JR_HB64 : JR_HB_DESC<GPR64Opnd>, JR_HB_ENC, ISA_MIPS32_NOT_32R6_64R6; |
| 275 | def JALR_HB64 : JALR_HB_DESC<GPR64Opnd>, JALR_HB_ENC, ISA_MIPS32R2; |
| 276 | } |
| 277 | def PseudoReturn64 : PseudoReturnBase<GPR64Opnd>; |
| 278 | |
| 279 | let AdditionalPredicates = [NotInMips16Mode, NotInMicroMips, |
| 280 | NoIndirectJumpGuards] in { |
| 281 | def TAILCALLREG64 : TailCallReg<JR64, GPR64Opnd>, ISA_MIPS3_NOT_32R6_64R6, |
| 282 | PTR_64; |
| 283 | def PseudoIndirectBranch64 : PseudoIndirectBranchBase<JR64, GPR64Opnd>, |
| 284 | ISA_MIPS3_NOT_32R6_64R6; |
Akira Hatanaka | 34a32c0 | 2013-08-06 22:20:40 +0000 | [diff] [blame] | 285 | } |
| 286 | |
Simon Dardis | 7bc8ad5 | 2018-02-21 00:06:53 +0000 | [diff] [blame] | 287 | let AdditionalPredicates = [NotInMips16Mode, NotInMicroMips, |
| 288 | UseIndirectJumpsHazard] in { |
| 289 | def TAILCALLREGHB64 : TailCallReg<JR_HB64, GPR64Opnd>, |
| 290 | ISA_MIPS32R2_NOT_32R6_64R6, PTR_64; |
| 291 | def PseudoIndirectHazardBranch64 : PseudoIndirectBranchBase<JR_HB64, |
| 292 | GPR64Opnd>, |
| 293 | ISA_MIPS32R2_NOT_32R6_64R6; |
| 294 | } |
Daniel Sanders | 338513b | 2014-07-09 10:16:07 +0000 | [diff] [blame] | 295 | |
Akira Hatanaka | a279d9b | 2011-10-03 20:01:11 +0000 | [diff] [blame] | 296 | /// Multiply and Divide Instructions. |
Zlatko Buljan | 31c9ebe | 2016-05-06 08:24:14 +0000 | [diff] [blame] | 297 | let AdditionalPredicates = [NotInMicroMips] in { |
| 298 | def DMULT : Mult<"dmult", II_DMULT, GPR64Opnd, [HI0_64, LO0_64]>, |
| 299 | MULT_FM<0, 0x1c>, ISA_MIPS3_NOT_32R6_64R6; |
| 300 | def DMULTu : Mult<"dmultu", II_DMULTU, GPR64Opnd, [HI0_64, LO0_64]>, |
| 301 | MULT_FM<0, 0x1d>, ISA_MIPS3_NOT_32R6_64R6; |
| 302 | } |
Akira Hatanaka | 00fcf2e | 2013-08-08 21:54:26 +0000 | [diff] [blame] | 303 | def PseudoDMULT : MultDivPseudo<DMULT, ACC128, GPR64Opnd, MipsMult, |
Daniel Sanders | 308181e | 2014-06-12 10:44:10 +0000 | [diff] [blame] | 304 | II_DMULT>, ISA_MIPS3_NOT_32R6_64R6; |
Akira Hatanaka | 00fcf2e | 2013-08-08 21:54:26 +0000 | [diff] [blame] | 305 | def PseudoDMULTu : MultDivPseudo<DMULTu, ACC128, GPR64Opnd, MipsMultu, |
Daniel Sanders | 308181e | 2014-06-12 10:44:10 +0000 | [diff] [blame] | 306 | II_DMULTU>, ISA_MIPS3_NOT_32R6_64R6; |
Zlatko Buljan | 58d6a95 | 2016-04-13 08:02:26 +0000 | [diff] [blame] | 307 | let AdditionalPredicates = [NotInMicroMips] in { |
| 308 | def DSDIV : Div<"ddiv", II_DDIV, GPR64Opnd, [HI0_64, LO0_64]>, |
| 309 | MULT_FM<0, 0x1e>, ISA_MIPS3_NOT_32R6_64R6; |
| 310 | def DUDIV : Div<"ddivu", II_DDIVU, GPR64Opnd, [HI0_64, LO0_64]>, |
| 311 | MULT_FM<0, 0x1f>, ISA_MIPS3_NOT_32R6_64R6; |
| 312 | } |
Akira Hatanaka | 00fcf2e | 2013-08-08 21:54:26 +0000 | [diff] [blame] | 313 | def PseudoDSDIV : MultDivPseudo<DSDIV, ACC128, GPR64Opnd, MipsDivRem, |
Daniel Sanders | 308181e | 2014-06-12 10:44:10 +0000 | [diff] [blame] | 314 | II_DDIV, 0, 1, 1>, ISA_MIPS3_NOT_32R6_64R6; |
Akira Hatanaka | 00fcf2e | 2013-08-08 21:54:26 +0000 | [diff] [blame] | 315 | def PseudoDUDIV : MultDivPseudo<DUDIV, ACC128, GPR64Opnd, MipsDivRemU, |
Daniel Sanders | 308181e | 2014-06-12 10:44:10 +0000 | [diff] [blame] | 316 | II_DDIVU, 0, 1, 1>, ISA_MIPS3_NOT_32R6_64R6; |
Akira Hatanaka | a279d9b | 2011-10-03 20:01:11 +0000 | [diff] [blame] | 317 | |
Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 318 | let isCodeGenOnly = 1 in { |
Daniel Sanders | 308181e | 2014-06-12 10:44:10 +0000 | [diff] [blame] | 319 | def MTHI64 : MoveToLOHI<"mthi", GPR64Opnd, [HI0_64]>, MTLO_FM<0x11>, |
| 320 | ISA_MIPS3_NOT_32R6_64R6; |
| 321 | def MTLO64 : MoveToLOHI<"mtlo", GPR64Opnd, [LO0_64]>, MTLO_FM<0x13>, |
| 322 | ISA_MIPS3_NOT_32R6_64R6; |
| 323 | def MFHI64 : MoveFromLOHI<"mfhi", GPR64Opnd, AC0_64>, MFLO_FM<0x10>, |
| 324 | ISA_MIPS3_NOT_32R6_64R6; |
| 325 | def MFLO64 : MoveFromLOHI<"mflo", GPR64Opnd, AC0_64>, MFLO_FM<0x12>, |
| 326 | ISA_MIPS3_NOT_32R6_64R6; |
| 327 | def PseudoMFHI64 : PseudoMFLOHI<GPR64, ACC128, MipsMFHI>, |
| 328 | ISA_MIPS3_NOT_32R6_64R6; |
| 329 | def PseudoMFLO64 : PseudoMFLOHI<GPR64, ACC128, MipsMFLO>, |
| 330 | ISA_MIPS3_NOT_32R6_64R6; |
| 331 | def PseudoMTLOHI64 : PseudoMTLOHI<ACC128, GPR64>, ISA_MIPS3_NOT_32R6_64R6; |
Akira Hatanaka | cdcc745 | 2011-10-03 19:28:44 +0000 | [diff] [blame] | 332 | |
Akira Hatanaka | 9f7ec15 | 2012-01-24 21:41:09 +0000 | [diff] [blame] | 333 | /// Sign Ext In Register Instructions. |
Daniel Sanders | fcea810 | 2014-05-12 12:28:15 +0000 | [diff] [blame] | 334 | def SEB64 : SignExtInReg<"seb", i8, GPR64Opnd, II_SEB>, SEB_FM<0x10, 0x20>, |
| 335 | ISA_MIPS32R2; |
| 336 | def SEH64 : SignExtInReg<"seh", i16, GPR64Opnd, II_SEH>, SEB_FM<0x18, 0x20>, |
| 337 | ISA_MIPS32R2; |
Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 338 | } |
Akira Hatanaka | 9f7ec15 | 2012-01-24 21:41:09 +0000 | [diff] [blame] | 339 | |
Akira Hatanaka | 48a72ca | 2011-10-03 21:16:50 +0000 | [diff] [blame] | 340 | /// Count Leading |
Hrvoje Varga | f1e0a03 | 2016-06-16 07:06:25 +0000 | [diff] [blame] | 341 | let AdditionalPredicates = [NotInMicroMips] in { |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 342 | def DCLZ : CountLeading0<"dclz", GPR64Opnd, II_DCLZ>, CLO_FM<0x24>, |
| 343 | ISA_MIPS64_NOT_64R6; |
| 344 | def DCLO : CountLeading1<"dclo", GPR64Opnd, II_DCLO>, CLO_FM<0x25>, |
| 345 | ISA_MIPS64_NOT_64R6; |
Akira Hatanaka | 48a72ca | 2011-10-03 21:16:50 +0000 | [diff] [blame] | 346 | |
Akira Hatanaka | 4706ac9 | 2011-12-20 23:56:43 +0000 | [diff] [blame] | 347 | /// Double Word Swap Bytes/HalfWords |
Simon Dardis | f114820 | 2016-08-24 13:00:47 +0000 | [diff] [blame] | 348 | def DSBH : SubwordSwap<"dsbh", GPR64Opnd, II_DSBH>, SEB_FM<2, 0x24>, |
| 349 | ISA_MIPS64R2; |
| 350 | def DSHD : SubwordSwap<"dshd", GPR64Opnd, II_DSHD>, SEB_FM<5, 0x24>, |
| 351 | ISA_MIPS64R2; |
Simon Dardis | ee67dcb | 2018-06-01 10:07:10 +0000 | [diff] [blame] | 352 | |
Simon Dardis | 1d6254f | 2018-06-08 10:55:34 +0000 | [diff] [blame] | 353 | def LEA_ADDiu64 : EffectiveAddress<"daddiu", GPR64Opnd>, LW_FM<0x19>, |
| 354 | GPR_64; |
Hrvoje Varga | aeb1fe8 | 2016-05-11 11:17:04 +0000 | [diff] [blame] | 355 | } |
Akira Hatanaka | 4706ac9 | 2011-12-20 23:56:43 +0000 | [diff] [blame] | 356 | |
Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 357 | let isCodeGenOnly = 1 in |
Simon Dardis | 1d6254f | 2018-06-08 10:55:34 +0000 | [diff] [blame] | 358 | def RDHWR64 : ReadHardware<GPR64Opnd, HWRegsOpnd>, RDHWR_FM, GPR_64; |
Akira Hatanaka | 4350c18 | 2011-12-07 23:31:26 +0000 | [diff] [blame] | 359 | |
Zoran Jovanovic | 366783e | 2015-08-12 12:45:16 +0000 | [diff] [blame] | 360 | let AdditionalPredicates = [NotInMicroMips] in { |
Simon Dardis | 55e4467 | 2017-09-14 17:27:53 +0000 | [diff] [blame] | 361 | // The 'pos + size' constraints for code generation are enforced by the |
| 362 | // code that lowers into MipsISD::Ext. |
| 363 | // For assembly parsing, we alias dextu and dextm to dext, and match by |
| 364 | // operand were possible then check the 'pos + size' in MipsAsmParser. |
| 365 | // We override the generated decoder to enforce that dext always comes out |
| 366 | // for dextm and dextu like binutils. |
| 367 | let DecoderMethod = "DecodeDEXT" in { |
| 368 | def DEXT : ExtBase<"dext", GPR64Opnd, uimm5_report_uimm6, |
| 369 | uimm5_plus1_report_uimm6, immZExt5, immZExt5Plus1, |
| 370 | MipsExt>, EXT_FM<3>, ISA_MIPS64R2; |
| 371 | def DEXTM : ExtBase<"dextm", GPR64Opnd, uimm5, uimm5_plus33, immZExt5, |
| 372 | immZExt5Plus33, MipsExt>, EXT_FM<1>, ISA_MIPS64R2; |
| 373 | def DEXTU : ExtBase<"dextu", GPR64Opnd, uimm5_plus32, uimm5_plus1, |
| 374 | immZExt5Plus32, immZExt5Plus1, MipsExt>, EXT_FM<2>, |
| 375 | ISA_MIPS64R2; |
| 376 | } |
Simon Dardis | 6f83ae3 | 2017-09-14 15:17:50 +0000 | [diff] [blame] | 377 | // The 'pos + size' constraints for code generation are enforced by the |
| 378 | // code that lowers into MipsISD::Ins. |
| 379 | // For assembly parsing, we alias dinsu and dinsm to dins, and match by |
| 380 | // operand were possible then check the 'pos + size' in MipsAsmParser. |
| 381 | // We override the generated decoder to enforce that dins always comes out |
| 382 | // for dinsm and dinsu like binutils. |
| 383 | let DecoderMethod = "DecodeDINS" in { |
| 384 | def DINS : InsBase<"dins", GPR64Opnd, uimm6, uimm5_inssize_plus1, |
Simon Dardis | d3b9f61 | 2017-11-03 15:35:13 +0000 | [diff] [blame] | 385 | immZExt5, immZExt5Plus1>, EXT_FM<7>, |
Simon Dardis | 6f83ae3 | 2017-09-14 15:17:50 +0000 | [diff] [blame] | 386 | ISA_MIPS64R2; |
| 387 | def DINSU : InsBase<"dinsu", GPR64Opnd, uimm5_plus32, uimm5_inssize_plus1, |
Simon Dardis | d3b9f61 | 2017-11-03 15:35:13 +0000 | [diff] [blame] | 388 | immZExt5Plus32, immZExt5Plus1>, |
Simon Dardis | 6f83ae3 | 2017-09-14 15:17:50 +0000 | [diff] [blame] | 389 | EXT_FM<6>, ISA_MIPS64R2; |
| 390 | def DINSM : InsBase<"dinsm", GPR64Opnd, uimm5, uimm_range_2_64, |
Simon Dardis | d3b9f61 | 2017-11-03 15:35:13 +0000 | [diff] [blame] | 391 | immZExt5, immZExtRange2To64>, |
Simon Dardis | 6f83ae3 | 2017-09-14 15:17:50 +0000 | [diff] [blame] | 392 | EXT_FM<5>, ISA_MIPS64R2; |
| 393 | } |
Zoran Jovanovic | 366783e | 2015-08-12 12:45:16 +0000 | [diff] [blame] | 394 | } |
Akira Hatanaka | 3121353 | 2013-09-07 00:02:02 +0000 | [diff] [blame] | 395 | |
Petar Jovanovic | b71386a | 2017-03-15 13:10:08 +0000 | [diff] [blame] | 396 | let isCodeGenOnly = 1, AdditionalPredicates = [NotInMicroMips] in { |
| 397 | def DEXT64_32 : InstSE<(outs GPR64Opnd:$rt), |
| 398 | (ins GPR32Opnd:$rs, uimm5_report_uimm6:$pos, |
| 399 | uimm5_plus1:$size), |
| 400 | "dext $rt, $rs, $pos, $size", [], II_EXT, FrmR, "dext">, |
| 401 | EXT_FM<3>, ISA_MIPS64R2; |
| 402 | } |
| 403 | |
Jack Carter | f4946cf | 2012-08-07 00:35:22 +0000 | [diff] [blame] | 404 | let isCodeGenOnly = 1, rs = 0, shamt = 0 in { |
Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 405 | def DSLL64_32 : FR<0x00, 0x3c, (outs GPR64:$rd), (ins GPR32:$rt), |
Simon Dardis | 1d6254f | 2018-06-08 10:55:34 +0000 | [diff] [blame] | 406 | "dsll\t$rd, $rt, 32", [], II_DSLL>, GPR_64; |
Petar Jovanovic | c051000 | 2018-05-23 15:28:28 +0000 | [diff] [blame] | 407 | let isMoveReg = 1 in { |
| 408 | def SLL64_32 : FR<0x0, 0x00, (outs GPR64:$rd), (ins GPR32:$rt), |
Simon Dardis | 1d6254f | 2018-06-08 10:55:34 +0000 | [diff] [blame] | 409 | "sll\t$rd, $rt, 0", [], II_SLL>, GPR_64; |
Petar Jovanovic | c051000 | 2018-05-23 15:28:28 +0000 | [diff] [blame] | 410 | def SLL64_64 : FR<0x0, 0x00, (outs GPR64:$rd), (ins GPR64:$rt), |
Simon Dardis | 1d6254f | 2018-06-08 10:55:34 +0000 | [diff] [blame] | 411 | "sll\t$rd, $rt, 0", [], II_SLL>, GPR_64; |
Petar Jovanovic | c051000 | 2018-05-23 15:28:28 +0000 | [diff] [blame] | 412 | } |
Jack Carter | f4946cf | 2012-08-07 00:35:22 +0000 | [diff] [blame] | 413 | } |
Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 414 | |
Sasa Stankovic | e41db2f | 2014-05-27 18:53:06 +0000 | [diff] [blame] | 415 | // We need the following pseudo instruction to avoid offset calculation for |
Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 416 | // long branches. See the comment in file MipsLongBranch.cpp for detailed |
| 417 | // explanation. |
| 418 | |
Stefan Maksimovic | 8d7c351 | 2018-11-05 14:37:41 +0000 | [diff] [blame] | 419 | // Expands to: lui $dst, %highest/%higher/%hi/%lo($tgt) |
| 420 | def LONG_BRANCH_LUi2Op_64 : PseudoSE<(outs GPR64Opnd:$dst), |
| 421 | (ins brtarget:$tgt), []>, GPR_64; |
| 422 | // Expands to: addiu $dst, %highest/%higher/%hi/%lo($tgt) |
| 423 | def LONG_BRANCH_DADDiu2Op : PseudoSE<(outs GPR64Opnd:$dst), |
| 424 | (ins GPR64Opnd:$src, brtarget:$tgt), []>, GPR_64; |
| 425 | |
Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 426 | // Expands to: daddiu $dst, $src, %PART($tgt - $baltgt) |
Sasa Stankovic | e41db2f | 2014-05-27 18:53:06 +0000 | [diff] [blame] | 427 | // where %PART may be %hi or %lo, depending on the relocation kind |
Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 428 | // that $tgt is annotated with. |
| 429 | def LONG_BRANCH_DADDiu : PseudoSE<(outs GPR64Opnd:$dst), |
Simon Dardis | 1d6254f | 2018-06-08 10:55:34 +0000 | [diff] [blame] | 430 | (ins GPR64Opnd:$src, brtarget:$tgt, brtarget:$baltgt), []>, GPR_64; |
Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 431 | |
Kai Nacke | 3adf9b8 | 2015-05-28 16:23:16 +0000 | [diff] [blame] | 432 | // Cavium Octeon cnMIPS instructions |
| 433 | let DecoderNamespace = "CnMips", |
Daniel Sanders | f692130 | 2016-03-24 11:40:48 +0000 | [diff] [blame] | 434 | // FIXME: The lack of HasStdEnc is probably a bug |
| 435 | EncodingPredicates = []<Predicate> in { |
Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 436 | |
| 437 | class Count1s<string opstr, RegisterOperand RO>: |
| 438 | InstSE<(outs RO:$rd), (ins RO:$rs), !strconcat(opstr, "\t$rd, $rs"), |
Kai Nacke | 13673ac | 2014-04-02 18:40:43 +0000 | [diff] [blame] | 439 | [(set RO:$rd, (ctpop RO:$rs))], II_POP, FrmR, opstr> { |
| 440 | let TwoOperandAliasConstraint = "$rd = $rs"; |
| 441 | } |
| 442 | |
Petar Jovanovic | b71386a | 2017-03-15 13:10:08 +0000 | [diff] [blame] | 443 | class ExtsCins<string opstr, InstrItinClass itin, RegisterOperand RO, |
| 444 | PatFrag PosImm, SDPatternOperator Op = null_frag>: |
| 445 | InstSE<(outs RO:$rt), (ins RO:$rs, uimm5:$pos, uimm5:$lenm1), |
| 446 | !strconcat(opstr, "\t$rt, $rs, $pos, $lenm1"), |
| 447 | [(set RO:$rt, (Op RO:$rs, PosImm:$pos, imm:$lenm1))], |
Simon Dardis | f114820 | 2016-08-24 13:00:47 +0000 | [diff] [blame] | 448 | itin, FrmR, opstr> { |
Kai Nacke | 13673ac | 2014-04-02 18:40:43 +0000 | [diff] [blame] | 449 | let TwoOperandAliasConstraint = "$rt = $rs"; |
| 450 | } |
Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 451 | |
| 452 | class SetCC64_R<string opstr, PatFrag cond_op> : |
| 453 | InstSE<(outs GPR64Opnd:$rd), (ins GPR64Opnd:$rs, GPR64Opnd:$rt), |
| 454 | !strconcat(opstr, "\t$rd, $rs, $rt"), |
Vasileios Kalintiris | 36901dd | 2016-03-01 20:25:43 +0000 | [diff] [blame] | 455 | [(set GPR64Opnd:$rd, (zext (cond_op GPR64Opnd:$rs, |
| 456 | GPR64Opnd:$rt)))], |
Kai Nacke | 13673ac | 2014-04-02 18:40:43 +0000 | [diff] [blame] | 457 | II_SEQ_SNE, FrmR, opstr> { |
| 458 | let TwoOperandAliasConstraint = "$rd = $rs"; |
| 459 | } |
Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 460 | |
Kai Nacke | 6da86e8 | 2014-04-04 16:21:59 +0000 | [diff] [blame] | 461 | class SetCC64_I<string opstr, PatFrag cond_op>: |
| 462 | InstSE<(outs GPR64Opnd:$rt), (ins GPR64Opnd:$rs, simm10_64:$imm10), |
| 463 | !strconcat(opstr, "\t$rt, $rs, $imm10"), |
Vasileios Kalintiris | 36901dd | 2016-03-01 20:25:43 +0000 | [diff] [blame] | 464 | [(set GPR64Opnd:$rt, (zext (cond_op GPR64Opnd:$rs, |
| 465 | immSExt10_64:$imm10)))], |
Kai Nacke | 6da86e8 | 2014-04-04 16:21:59 +0000 | [diff] [blame] | 466 | II_SEQI_SNEI, FrmI, opstr> { |
| 467 | let TwoOperandAliasConstraint = "$rt = $rs"; |
| 468 | } |
| 469 | |
Kai Nacke | 63072f8 | 2015-01-20 16:10:51 +0000 | [diff] [blame] | 470 | class CBranchBitNum<string opstr, DAGOperand opnd, PatFrag cond_op, |
Daniel Sanders | daa4b6f | 2015-11-26 16:35:41 +0000 | [diff] [blame] | 471 | RegisterOperand RO, Operand ImmOp, bits<64> shift = 1> : |
| 472 | InstSE<(outs), (ins RO:$rs, ImmOp:$p, opnd:$offset), |
Kai Nacke | 63072f8 | 2015-01-20 16:10:51 +0000 | [diff] [blame] | 473 | !strconcat(opstr, "\t$rs, $p, $offset"), |
Vasileios Kalintiris | 36901dd | 2016-03-01 20:25:43 +0000 | [diff] [blame] | 474 | [(brcond (i32 (cond_op (and RO:$rs, (shl shift, immZExt5_64:$p)), 0)), |
Daniel Sanders | 86cce70 | 2015-09-22 13:36:28 +0000 | [diff] [blame] | 475 | bb:$offset)], II_BBIT, FrmI, opstr> { |
Kai Nacke | 63072f8 | 2015-01-20 16:10:51 +0000 | [diff] [blame] | 476 | let isBranch = 1; |
| 477 | let isTerminator = 1; |
| 478 | let hasDelaySlot = 1; |
| 479 | let Defs = [AT]; |
| 480 | } |
| 481 | |
Simon Dardis | f114820 | 2016-08-24 13:00:47 +0000 | [diff] [blame] | 482 | class MFC2OP<string asmstr, RegisterOperand RO, InstrItinClass itin> : |
Kai Nacke | 3adf9b8 | 2015-05-28 16:23:16 +0000 | [diff] [blame] | 483 | InstSE<(outs RO:$rt, uimm16:$imm16), (ins), |
Simon Dardis | f114820 | 2016-08-24 13:00:47 +0000 | [diff] [blame] | 484 | !strconcat(asmstr, "\t$rt, $imm16"), [], itin, FrmFR>; |
Kai Nacke | 3adf9b8 | 2015-05-28 16:23:16 +0000 | [diff] [blame] | 485 | |
Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 486 | // Unsigned Byte Add |
Kai Nacke | 13673ac | 2014-04-02 18:40:43 +0000 | [diff] [blame] | 487 | def BADDu : ArithLogicR<"baddu", GPR64Opnd, 1, II_BADDU>, |
Daniel Sanders | f692130 | 2016-03-24 11:40:48 +0000 | [diff] [blame] | 488 | ADD_FM<0x1c, 0x28>, ASE_CNMIPS { |
| 489 | let Pattern = [(set GPR64Opnd:$rd, |
| 490 | (and (add GPR64Opnd:$rs, GPR64Opnd:$rt), 255))]; |
| 491 | } |
Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 492 | |
Kai Nacke | 63072f8 | 2015-01-20 16:10:51 +0000 | [diff] [blame] | 493 | // Branch on Bit Clear /+32 |
Daniel Sanders | daa4b6f | 2015-11-26 16:35:41 +0000 | [diff] [blame] | 494 | def BBIT0 : CBranchBitNum<"bbit0", brtarget, seteq, GPR64Opnd, |
Daniel Sanders | f692130 | 2016-03-24 11:40:48 +0000 | [diff] [blame] | 495 | uimm5_64_report_uimm6>, BBIT_FM<0x32>, ASE_CNMIPS; |
Daniel Sanders | daa4b6f | 2015-11-26 16:35:41 +0000 | [diff] [blame] | 496 | def BBIT032: CBranchBitNum<"bbit032", brtarget, seteq, GPR64Opnd, uimm5_64, |
Daniel Sanders | f692130 | 2016-03-24 11:40:48 +0000 | [diff] [blame] | 497 | 0x100000000>, BBIT_FM<0x36>, ASE_CNMIPS; |
Kai Nacke | 63072f8 | 2015-01-20 16:10:51 +0000 | [diff] [blame] | 498 | |
| 499 | // Branch on Bit Set /+32 |
Daniel Sanders | daa4b6f | 2015-11-26 16:35:41 +0000 | [diff] [blame] | 500 | def BBIT1 : CBranchBitNum<"bbit1", brtarget, setne, GPR64Opnd, |
Daniel Sanders | f692130 | 2016-03-24 11:40:48 +0000 | [diff] [blame] | 501 | uimm5_64_report_uimm6>, BBIT_FM<0x3a>, ASE_CNMIPS; |
Daniel Sanders | daa4b6f | 2015-11-26 16:35:41 +0000 | [diff] [blame] | 502 | def BBIT132: CBranchBitNum<"bbit132", brtarget, setne, GPR64Opnd, uimm5_64, |
Daniel Sanders | f692130 | 2016-03-24 11:40:48 +0000 | [diff] [blame] | 503 | 0x100000000>, BBIT_FM<0x3e>, ASE_CNMIPS; |
Kai Nacke | 63072f8 | 2015-01-20 16:10:51 +0000 | [diff] [blame] | 504 | |
Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 505 | // Multiply Doubleword to GPR |
Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 506 | def DMUL : ArithLogicR<"dmul", GPR64Opnd, 1, II_DMUL, mul>, |
Daniel Sanders | f692130 | 2016-03-24 11:40:48 +0000 | [diff] [blame] | 507 | ADD_FM<0x1c, 0x03>, ASE_CNMIPS { |
| 508 | let Defs = [HI0, LO0, P0, P1, P2]; |
| 509 | } |
Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 510 | |
Petar Jovanovic | b71386a | 2017-03-15 13:10:08 +0000 | [diff] [blame] | 511 | let AdditionalPredicates = [NotInMicroMips] in { |
| 512 | // Extract a signed bit field /+32 |
| 513 | def EXTS : ExtsCins<"exts", II_EXT, GPR64Opnd, immZExt5>, EXTS_FM<0x3a>, |
| 514 | ASE_MIPS64_CNMIPS; |
| 515 | def EXTS32: ExtsCins<"exts32", II_EXT, GPR64Opnd, immZExt5Plus32>, |
| 516 | EXTS_FM<0x3b>, ASE_MIPS64_CNMIPS; |
Kai Nacke | 13673ac | 2014-04-02 18:40:43 +0000 | [diff] [blame] | 517 | |
Petar Jovanovic | b71386a | 2017-03-15 13:10:08 +0000 | [diff] [blame] | 518 | // Clear and insert a bit field /+32 |
| 519 | def CINS : ExtsCins<"cins", II_INS, GPR64Opnd, immZExt5, MipsCIns>, |
| 520 | EXTS_FM<0x32>, ASE_MIPS64_CNMIPS; |
| 521 | def CINS32: ExtsCins<"cins32", II_INS, GPR64Opnd, immZExt5Plus32, MipsCIns>, |
| 522 | EXTS_FM<0x33>, ASE_MIPS64_CNMIPS; |
| 523 | let isCodeGenOnly = 1 in { |
| 524 | def CINS_i32 : ExtsCins<"cins", II_INS, GPR32Opnd, immZExt5, MipsCIns>, |
| 525 | EXTS_FM<0x32>, ASE_MIPS64_CNMIPS; |
| 526 | def CINS64_32 :InstSE<(outs GPR64Opnd:$rt), |
| 527 | (ins GPR32Opnd:$rs, uimm5:$pos, uimm5:$lenm1), |
| 528 | "cins\t$rt, $rs, $pos, $lenm1", [], II_INS, FrmR, |
| 529 | "cins">, |
| 530 | EXTS_FM<0x32>, ASE_MIPS64_CNMIPS; |
| 531 | } |
| 532 | } |
Kai Nacke | 13673ac | 2014-04-02 18:40:43 +0000 | [diff] [blame] | 533 | |
Kai Nacke | af47f60 | 2014-04-01 18:35:26 +0000 | [diff] [blame] | 534 | // Move to multiplier/product register |
Daniel Sanders | f692130 | 2016-03-24 11:40:48 +0000 | [diff] [blame] | 535 | def MTM0 : MoveToLOHI<"mtm0", GPR64Opnd, [MPL0, P0, P1, P2]>, MTMR_FM<0x08>, |
| 536 | ASE_CNMIPS; |
| 537 | def MTM1 : MoveToLOHI<"mtm1", GPR64Opnd, [MPL1, P0, P1, P2]>, MTMR_FM<0x0c>, |
| 538 | ASE_CNMIPS; |
| 539 | def MTM2 : MoveToLOHI<"mtm2", GPR64Opnd, [MPL2, P0, P1, P2]>, MTMR_FM<0x0d>, |
| 540 | ASE_CNMIPS; |
| 541 | def MTP0 : MoveToLOHI<"mtp0", GPR64Opnd, [P0]>, MTMR_FM<0x09>, ASE_CNMIPS; |
| 542 | def MTP1 : MoveToLOHI<"mtp1", GPR64Opnd, [P1]>, MTMR_FM<0x0a>, ASE_CNMIPS; |
| 543 | def MTP2 : MoveToLOHI<"mtp2", GPR64Opnd, [P2]>, MTMR_FM<0x0b>, ASE_CNMIPS; |
Kai Nacke | af47f60 | 2014-04-01 18:35:26 +0000 | [diff] [blame] | 544 | |
Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 545 | // Count Ones in a Word/Doubleword |
Daniel Sanders | f692130 | 2016-03-24 11:40:48 +0000 | [diff] [blame] | 546 | def POP : Count1s<"pop", GPR32Opnd>, POP_FM<0x2c>, ASE_CNMIPS; |
| 547 | def DPOP : Count1s<"dpop", GPR64Opnd>, POP_FM<0x2d>, ASE_CNMIPS; |
Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 548 | |
| 549 | // Set on equal/not equal |
Daniel Sanders | f692130 | 2016-03-24 11:40:48 +0000 | [diff] [blame] | 550 | def SEQ : SetCC64_R<"seq", seteq>, SEQ_FM<0x2a>, ASE_CNMIPS; |
| 551 | def SEQi : SetCC64_I<"seqi", seteq>, SEQI_FM<0x2e>, ASE_CNMIPS; |
| 552 | def SNE : SetCC64_R<"sne", setne>, SEQ_FM<0x2b>, ASE_CNMIPS; |
| 553 | def SNEi : SetCC64_I<"snei", setne>, SEQI_FM<0x2f>, ASE_CNMIPS; |
Kai Nacke | 6da86e8 | 2014-04-04 16:21:59 +0000 | [diff] [blame] | 554 | |
Matheus Almeida | 583a13c | 2014-04-24 16:31:10 +0000 | [diff] [blame] | 555 | // 192-bit x 64-bit Unsigned Multiply and Add |
Daniel Sanders | f692130 | 2016-03-24 11:40:48 +0000 | [diff] [blame] | 556 | def V3MULU: ArithLogicR<"v3mulu", GPR64Opnd, 0, II_DMUL>, ADD_FM<0x1c, 0x11>, |
| 557 | ASE_CNMIPS { |
| 558 | let Defs = [P0, P1, P2]; |
| 559 | } |
Kai Nacke | 6da86e8 | 2014-04-04 16:21:59 +0000 | [diff] [blame] | 560 | |
| 561 | // 64-bit Unsigned Multiply and Add Move |
Daniel Sanders | f692130 | 2016-03-24 11:40:48 +0000 | [diff] [blame] | 562 | def VMM0 : ArithLogicR<"vmm0", GPR64Opnd, 0, II_DMUL>, ADD_FM<0x1c, 0x10>, |
| 563 | ASE_CNMIPS { |
| 564 | let Defs = [MPL0, P0, P1, P2]; |
| 565 | } |
Kai Nacke | 6da86e8 | 2014-04-04 16:21:59 +0000 | [diff] [blame] | 566 | |
| 567 | // 64-bit Unsigned Multiply and Add |
Daniel Sanders | f692130 | 2016-03-24 11:40:48 +0000 | [diff] [blame] | 568 | def VMULU : ArithLogicR<"vmulu", GPR64Opnd, 0, II_DMUL>, ADD_FM<0x1c, 0x0f>, |
| 569 | ASE_CNMIPS { |
| 570 | let Defs = [MPL1, MPL2, P0, P1, P2]; |
| 571 | } |
Kai Nacke | 6da86e8 | 2014-04-04 16:21:59 +0000 | [diff] [blame] | 572 | |
Kai Nacke | 3adf9b8 | 2015-05-28 16:23:16 +0000 | [diff] [blame] | 573 | // Move between CPU and coprocessor registers |
Simon Dardis | f114820 | 2016-08-24 13:00:47 +0000 | [diff] [blame] | 574 | def DMFC2_OCTEON : MFC2OP<"dmfc2", GPR64Opnd, II_DMFC2>, MFC2OP_FM<0x12, 1>, |
| 575 | ASE_CNMIPS; |
| 576 | def DMTC2_OCTEON : MFC2OP<"dmtc2", GPR64Opnd, II_DMTC2>, MFC2OP_FM<0x12, 5>, |
| 577 | ASE_CNMIPS; |
Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 578 | } |
| 579 | |
Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 580 | } |
Kai Nacke | 13673ac | 2014-04-02 18:40:43 +0000 | [diff] [blame] | 581 | |
Toma Tabacu | a90f144 | 2015-02-24 11:52:19 +0000 | [diff] [blame] | 582 | /// Move between CPU and coprocessor registers |
| 583 | let DecoderNamespace = "Mips64", Predicates = [HasMips64] in { |
Petar Jovanovic | d4349f3 | 2018-04-27 09:12:08 +0000 | [diff] [blame] | 584 | def DMFC0 : MFC3OP<"dmfc0", GPR64Opnd, COP0Opnd, II_DMFC0>, |
| 585 | MFC3OP_FM<0x10, 1, 0>, ISA_MIPS3; |
| 586 | def DMTC0 : MTC3OP<"dmtc0", COP0Opnd, GPR64Opnd, II_DMTC0>, |
| 587 | MFC3OP_FM<0x10, 5, 0>, ISA_MIPS3; |
| 588 | def DMFC2 : MFC3OP<"dmfc2", GPR64Opnd, COP2Opnd, II_DMFC2>, |
| 589 | MFC3OP_FM<0x12, 1, 0>, ISA_MIPS3; |
| 590 | def DMTC2 : MTC3OP<"dmtc2", COP2Opnd, GPR64Opnd, II_DMTC2>, |
| 591 | MFC3OP_FM<0x12, 5, 0>, ISA_MIPS3; |
Toma Tabacu | a90f144 | 2015-02-24 11:52:19 +0000 | [diff] [blame] | 592 | } |
| 593 | |
Petar Jovanovic | d4349f3 | 2018-04-27 09:12:08 +0000 | [diff] [blame] | 594 | /// Move between CPU and guest coprocessor registers (Virtualization ASE) |
| 595 | let DecoderNamespace = "Mips64" in { |
| 596 | def DMFGC0 : MFC3OP<"dmfgc0", GPR64Opnd, COP0Opnd, II_DMFGC0>, |
| 597 | MFC3OP_FM<0x10, 3, 1>, ISA_MIPS64R5, ASE_VIRT; |
| 598 | def DMTGC0 : MTC3OP<"dmtgc0", COP0Opnd, GPR64Opnd, II_DMTGC0>, |
| 599 | MFC3OP_FM<0x10, 3, 3>, ISA_MIPS64R5, ASE_VIRT; |
| 600 | } |
Simon Dardis | 7bc8ad5 | 2018-02-21 00:06:53 +0000 | [diff] [blame] | 601 | |
| 602 | let AdditionalPredicates = [UseIndirectJumpsHazard] in |
| 603 | def JALRHB64Pseudo : JumpLinkRegPseudo<GPR64Opnd, JALR_HB64, RA_64>; |
| 604 | |
Akira Hatanaka | 7ba8a8d | 2011-09-30 18:51:46 +0000 | [diff] [blame] | 605 | //===----------------------------------------------------------------------===// |
| 606 | // Arbitrary patterns that map to one or more instructions |
| 607 | //===----------------------------------------------------------------------===// |
| 608 | |
Simon Dardis | 6189752 | 2016-07-25 09:57:28 +0000 | [diff] [blame] | 609 | // Materialize i64 constants. |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 610 | defm : MaterializeImms<i64, ZERO_64, DADDiu, LUi64, ORi64>, ISA_MIPS3, GPR_64; |
Simon Dardis | 6189752 | 2016-07-25 09:57:28 +0000 | [diff] [blame] | 611 | |
| 612 | def : MipsPat<(i64 immZExt32Low16Zero:$imm), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 613 | (DSLL (ORi64 ZERO_64, (HI16 imm:$imm)), 16)>, ISA_MIPS3, GPR_64; |
Simon Dardis | 6189752 | 2016-07-25 09:57:28 +0000 | [diff] [blame] | 614 | |
| 615 | def : MipsPat<(i64 immZExt32:$imm), |
| 616 | (ORi64 (DSLL (ORi64 ZERO_64, (HI16 imm:$imm)), 16), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 617 | (LO16 imm:$imm))>, ISA_MIPS3, GPR_64; |
Simon Dardis | 6189752 | 2016-07-25 09:57:28 +0000 | [diff] [blame] | 618 | |
Akira Hatanaka | f93b3f4 | 2011-11-14 19:06:14 +0000 | [diff] [blame] | 619 | // extended loads |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 620 | def : MipsPat<(i64 (extloadi1 addr:$src)), (LB64 addr:$src)>, ISA_MIPS3, |
| 621 | GPR_64; |
| 622 | def : MipsPat<(i64 (extloadi8 addr:$src)), (LB64 addr:$src)>, ISA_MIPS3, |
| 623 | GPR_64; |
| 624 | def : MipsPat<(i64 (extloadi16 addr:$src)), (LH64 addr:$src)>, ISA_MIPS3, |
| 625 | GPR_64; |
| 626 | def : MipsPat<(i64 (extloadi32 addr:$src)), (LW64 addr:$src)>, ISA_MIPS3, |
| 627 | GPR_64; |
Akira Hatanaka | 09b23eb | 2011-10-11 00:55:05 +0000 | [diff] [blame] | 628 | |
| 629 | // hi/lo relocs |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 630 | let AdditionalPredicates = [NotInMicroMips] in |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 631 | defm : MipsHiLoRelocs<LUi64, DADDiu, ZERO_64, GPR64Opnd>, ISA_MIPS3, GPR_64, |
| 632 | SYM_32; |
Akira Hatanaka | 7b8547c | 2011-11-16 22:39:56 +0000 | [diff] [blame] | 633 | |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 634 | def : MipsPat<(MipsGotHi tglobaladdr:$in), (LUi64 tglobaladdr:$in)>, ISA_MIPS3, |
| 635 | GPR_64; |
| 636 | def : MipsPat<(MipsGotHi texternalsym:$in), (LUi64 texternalsym:$in)>, |
| 637 | ISA_MIPS3, GPR_64; |
Akira Hatanaka | 7b8547c | 2011-11-16 22:39:56 +0000 | [diff] [blame] | 638 | |
Simon Atanasyan | 28ded4e | 2018-07-24 13:47:52 +0000 | [diff] [blame] | 639 | def : MipsPat<(MipsTlsHi tglobaltlsaddr:$in), (LUi64 tglobaltlsaddr:$in)>, |
| 640 | ISA_MIPS3, GPR_64; |
| 641 | |
Aleksandar Beserminji | d6dada1 | 2017-12-11 11:21:40 +0000 | [diff] [blame] | 642 | // highest/higher/hi/lo relocs |
| 643 | let AdditionalPredicates = [NotInMicroMips] in { |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 644 | def : MipsPat<(MipsJmpLink (i64 texternalsym:$dst)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 645 | (JAL texternalsym:$dst)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 646 | def : MipsPat<(MipsHighest (i64 tglobaladdr:$in)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 647 | (LUi64 tglobaladdr:$in)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 648 | def : MipsPat<(MipsHighest (i64 tblockaddress:$in)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 649 | (LUi64 tblockaddress:$in)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 650 | def : MipsPat<(MipsHighest (i64 tjumptable:$in)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 651 | (LUi64 tjumptable:$in)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 652 | def : MipsPat<(MipsHighest (i64 tconstpool:$in)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 653 | (LUi64 tconstpool:$in)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 654 | def : MipsPat<(MipsHighest (i64 texternalsym:$in)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 655 | (LUi64 texternalsym:$in)>, ISA_MIPS3, GPR_64, SYM_64; |
Akira Hatanaka | f75add6 | 2011-10-11 18:53:46 +0000 | [diff] [blame] | 656 | |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 657 | def : MipsPat<(MipsHigher (i64 tglobaladdr:$in)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 658 | (DADDiu ZERO_64, tglobaladdr:$in)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 659 | def : MipsPat<(MipsHigher (i64 tblockaddress:$in)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 660 | (DADDiu ZERO_64, tblockaddress:$in)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 661 | def : MipsPat<(MipsHigher (i64 tjumptable:$in)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 662 | (DADDiu ZERO_64, tjumptable:$in)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 663 | def : MipsPat<(MipsHigher (i64 tconstpool:$in)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 664 | (DADDiu ZERO_64, tconstpool:$in)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 665 | def : MipsPat<(MipsHigher (i64 texternalsym:$in)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 666 | (DADDiu ZERO_64, texternalsym:$in)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 667 | |
| 668 | def : MipsPat<(add GPR64:$hi, (MipsHigher (i64 tglobaladdr:$lo))), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 669 | (DADDiu GPR64:$hi, tglobaladdr:$lo)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 670 | def : MipsPat<(add GPR64:$hi, (MipsHigher (i64 tblockaddress:$lo))), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 671 | (DADDiu GPR64:$hi, tblockaddress:$lo)>, ISA_MIPS3, GPR_64, |
| 672 | SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 673 | def : MipsPat<(add GPR64:$hi, (MipsHigher (i64 tjumptable:$lo))), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 674 | (DADDiu GPR64:$hi, tjumptable:$lo)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 675 | def : MipsPat<(add GPR64:$hi, (MipsHigher (i64 tconstpool:$lo))), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 676 | (DADDiu GPR64:$hi, tconstpool:$lo)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 677 | |
| 678 | def : MipsPat<(add GPR64:$hi, (MipsHi (i64 tglobaladdr:$lo))), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 679 | (DADDiu GPR64:$hi, tglobaladdr:$lo)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 680 | def : MipsPat<(add GPR64:$hi, (MipsHi (i64 tblockaddress:$lo))), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 681 | (DADDiu GPR64:$hi, tblockaddress:$lo)>, ISA_MIPS3, GPR_64, |
| 682 | SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 683 | def : MipsPat<(add GPR64:$hi, (MipsHi (i64 tjumptable:$lo))), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 684 | (DADDiu GPR64:$hi, tjumptable:$lo)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 685 | def : MipsPat<(add GPR64:$hi, (MipsHi (i64 tconstpool:$lo))), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 686 | (DADDiu GPR64:$hi, tconstpool:$lo)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 687 | |
| 688 | def : MipsPat<(add GPR64:$hi, (MipsLo (i64 tglobaladdr:$lo))), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 689 | (DADDiu GPR64:$hi, tglobaladdr:$lo)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 690 | def : MipsPat<(add GPR64:$hi, (MipsLo (i64 tblockaddress:$lo))), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 691 | (DADDiu GPR64:$hi, tblockaddress:$lo)>, ISA_MIPS3, GPR_64, |
| 692 | SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 693 | def : MipsPat<(add GPR64:$hi, (MipsLo (i64 tjumptable:$lo))), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 694 | (DADDiu GPR64:$hi, tjumptable:$lo)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 695 | def : MipsPat<(add GPR64:$hi, (MipsLo (i64 tconstpool:$lo))), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 696 | (DADDiu GPR64:$hi, tconstpool:$lo)>, ISA_MIPS3, GPR_64, SYM_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 697 | def : MipsPat<(add GPR64:$hi, (MipsLo (i64 tglobaltlsaddr:$lo))), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 698 | (DADDiu GPR64:$hi, tglobaltlsaddr:$lo)>, ISA_MIPS3, GPR_64, |
| 699 | SYM_64; |
Zlatko Buljan | 53a037f | 2016-04-08 07:27:26 +0000 | [diff] [blame] | 700 | } |
Akira Hatanaka | b2e05cb | 2011-12-07 22:11:43 +0000 | [diff] [blame] | 701 | |
Simon Dardis | ae5b53e | 2017-08-11 14:36:05 +0000 | [diff] [blame] | 702 | // gp_rel relocs |
| 703 | def : MipsPat<(add GPR64:$gp, (MipsGPRel tglobaladdr:$in)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 704 | (DADDiu GPR64:$gp, tglobaladdr:$in)>, ISA_MIPS3, ABI_N64; |
Simon Dardis | ae5b53e | 2017-08-11 14:36:05 +0000 | [diff] [blame] | 705 | def : MipsPat<(add GPR64:$gp, (MipsGPRel tconstpool:$in)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 706 | (DADDiu GPR64:$gp, tconstpool:$in)>, ISA_MIPS3, ABI_N64; |
Simon Dardis | ae5b53e | 2017-08-11 14:36:05 +0000 | [diff] [blame] | 707 | |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 708 | def : WrapperPat<tglobaladdr, DADDiu, GPR64>, ISA_MIPS3, GPR_64; |
| 709 | def : WrapperPat<tconstpool, DADDiu, GPR64>, ISA_MIPS3, GPR_64; |
| 710 | def : WrapperPat<texternalsym, DADDiu, GPR64>, ISA_MIPS3, GPR_64; |
| 711 | def : WrapperPat<tblockaddress, DADDiu, GPR64>, ISA_MIPS3, GPR_64; |
| 712 | def : WrapperPat<tjumptable, DADDiu, GPR64>, ISA_MIPS3, GPR_64; |
| 713 | def : WrapperPat<tglobaltlsaddr, DADDiu, GPR64>, ISA_MIPS3, GPR_64; |
Simon Dardis | ca74dd7 | 2017-01-27 11:36:52 +0000 | [diff] [blame] | 714 | |
| 715 | |
Hrvoje Varga | 2db00ce | 2016-07-22 07:18:33 +0000 | [diff] [blame] | 716 | defm : BrcondPats<GPR64, BEQ64, BEQ, BNE64, SLT64, SLTu64, SLTi64, SLTiu64, |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 717 | ZERO_64>, ISA_MIPS3, GPR_64; |
Vasileios Kalintiris | 36901dd | 2016-03-01 20:25:43 +0000 | [diff] [blame] | 718 | def : MipsPat<(brcond (i32 (setlt i64:$lhs, 1)), bb:$dst), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 719 | (BLEZ64 i64:$lhs, bb:$dst)>, ISA_MIPS3, GPR_64; |
Vasileios Kalintiris | 36901dd | 2016-03-01 20:25:43 +0000 | [diff] [blame] | 720 | def : MipsPat<(brcond (i32 (setgt i64:$lhs, -1)), bb:$dst), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 721 | (BGEZ64 i64:$lhs, bb:$dst)>, ISA_MIPS3, GPR_64; |
Akira Hatanaka | 6871031 | 2013-05-21 17:13:47 +0000 | [diff] [blame] | 722 | |
Akira Hatanaka | f75add6 | 2011-10-11 18:53:46 +0000 | [diff] [blame] | 723 | // setcc patterns |
Hrvoje Varga | 2db00ce | 2016-07-22 07:18:33 +0000 | [diff] [blame] | 724 | let AdditionalPredicates = [NotInMicroMips] in { |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 725 | defm : SeteqPats<GPR64, SLTiu64, XOR64, SLTu64, ZERO_64>, ISA_MIPS3, GPR_64; |
| 726 | defm : SetlePats<GPR64, XORi, SLT64, SLTu64>, ISA_MIPS3, GPR_64; |
| 727 | defm : SetgtPats<GPR64, SLT64, SLTu64>, ISA_MIPS3, GPR_64; |
| 728 | defm : SetgePats<GPR64, XORi, SLT64, SLTu64>, ISA_MIPS3, GPR_64; |
| 729 | defm : SetgeImmPats<GPR64, XORi, SLTi64, SLTiu64>, ISA_MIPS3, GPR_64; |
Hrvoje Varga | 2db00ce | 2016-07-22 07:18:33 +0000 | [diff] [blame] | 730 | } |
Akira Hatanaka | d5c1329 | 2011-11-07 18:57:41 +0000 | [diff] [blame] | 731 | // truncate |
Daniel Sanders | c43cda8 | 2014-11-07 16:54:21 +0000 | [diff] [blame] | 732 | def : MipsPat<(trunc (assertsext GPR64:$src)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 733 | (EXTRACT_SUBREG GPR64:$src, sub_32)>, ISA_MIPS3, GPR_64; |
Vasileios Kalintiris | 3751d41 | 2016-04-13 15:07:45 +0000 | [diff] [blame] | 734 | // The forward compatibility strategy employed by MIPS requires us to treat |
| 735 | // values as being sign extended to an infinite number of bits. This allows |
| 736 | // existing software to run without modification on any future MIPS |
| 737 | // implementation (e.g. 128-bit, or 1024-bit). Being compatible with this |
| 738 | // strategy requires that truncation acts as a sign-extension for values being |
| 739 | // fed into instructions operating on 32-bit values. Such instructions have |
| 740 | // undefined results if this is not true. |
| 741 | // For our case, this means that we can't issue an extract_subreg for nodes |
| 742 | // such as (trunc:i32 (assertzext:i64 X, i32)), because the sign-bit of the |
| 743 | // lower subreg would not be replicated into the upper half. |
| 744 | def : MipsPat<(trunc (assertzext_lt_i32 GPR64:$src)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 745 | (EXTRACT_SUBREG GPR64:$src, sub_32)>, ISA_MIPS3, GPR_64; |
Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 746 | def : MipsPat<(i32 (trunc GPR64:$src)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 747 | (SLL (EXTRACT_SUBREG GPR64:$src, sub_32), 0)>, ISA_MIPS3, GPR_64; |
Jia Liu | f54f60f | 2012-02-28 07:46:26 +0000 | [diff] [blame] | 748 | |
Vasileios Kalintiris | 32177d6 | 2015-04-21 10:49:03 +0000 | [diff] [blame] | 749 | // variable shift instructions patterns |
| 750 | def : MipsPat<(shl GPR64:$rt, (i32 (trunc GPR64:$rs))), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 751 | (DSLLV GPR64:$rt, (EXTRACT_SUBREG GPR64:$rs, sub_32))>, |
| 752 | ISA_MIPS3, GPR_64; |
Vasileios Kalintiris | 32177d6 | 2015-04-21 10:49:03 +0000 | [diff] [blame] | 753 | def : MipsPat<(srl GPR64:$rt, (i32 (trunc GPR64:$rs))), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 754 | (DSRLV GPR64:$rt, (EXTRACT_SUBREG GPR64:$rs, sub_32))>, |
| 755 | ISA_MIPS3, GPR_64; |
Vasileios Kalintiris | 32177d6 | 2015-04-21 10:49:03 +0000 | [diff] [blame] | 756 | def : MipsPat<(sra GPR64:$rt, (i32 (trunc GPR64:$rs))), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 757 | (DSRAV GPR64:$rt, (EXTRACT_SUBREG GPR64:$rs, sub_32))>, |
| 758 | ISA_MIPS3, GPR_64; |
| 759 | def : MipsPat<(rotr GPR64:$rt, (i32 (trunc GPR64:$rs))), |
| 760 | (DROTRV GPR64:$rt, (EXTRACT_SUBREG GPR64:$rs, sub_32))>, |
| 761 | ISA_MIPS3, GPR_64; |
Vasileios Kalintiris | 32177d6 | 2015-04-21 10:49:03 +0000 | [diff] [blame] | 762 | |
Akira Hatanaka | ae378af | 2011-12-07 23:14:41 +0000 | [diff] [blame] | 763 | // 32-to-64-bit extension |
Vasileios Kalintiris | 29620ac | 2016-02-29 15:58:12 +0000 | [diff] [blame] | 764 | def : MipsPat<(i64 (anyext GPR32:$src)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 765 | (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GPR32:$src, sub_32)>, |
| 766 | ISA_MIPS3, GPR_64; |
| 767 | def : MipsPat<(i64 (zext GPR32:$src)), (DSRL (DSLL64_32 GPR32:$src), 32)>, |
| 768 | ISA_MIPS3, GPR_64; |
| 769 | def : MipsPat<(i64 (sext GPR32:$src)), (SLL64_32 GPR32:$src)>, ISA_MIPS3, |
| 770 | GPR_64; |
Akira Hatanaka | 4e21069 | 2011-12-20 22:06:20 +0000 | [diff] [blame] | 771 | |
Petar Jovanovic | b71386a | 2017-03-15 13:10:08 +0000 | [diff] [blame] | 772 | let AdditionalPredicates = [NotInMicroMips] in { |
| 773 | def : MipsPat<(i64 (zext GPR32:$src)), (DEXT64_32 GPR32:$src, 0, 32)>, |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 774 | ISA_MIPS64R2, GPR_64; |
Petar Jovanovic | b71386a | 2017-03-15 13:10:08 +0000 | [diff] [blame] | 775 | def : MipsPat<(i64 (zext (i32 (shl GPR32:$rt, immZExt5:$imm)))), |
| 776 | (CINS64_32 GPR32:$rt, imm:$imm, (immZExt5To31 imm:$imm))>, |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 777 | ISA_MIPS64R2, GPR_64, ASE_MIPS64_CNMIPS; |
Petar Jovanovic | b71386a | 2017-03-15 13:10:08 +0000 | [diff] [blame] | 778 | } |
| 779 | |
Akira Hatanaka | 494fdf1 | 2011-12-20 22:40:40 +0000 | [diff] [blame] | 780 | // Sign extend in register |
Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 781 | def : MipsPat<(i64 (sext_inreg GPR64:$src, i32)), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 782 | (SLL64_64 GPR64:$src)>, ISA_MIPS3, GPR_64; |
Akira Hatanaka | 494fdf1 | 2011-12-20 22:40:40 +0000 | [diff] [blame] | 783 | |
Akira Hatanaka | d8ab16b | 2012-06-14 21:03:23 +0000 | [diff] [blame] | 784 | // bswap MipsPattern |
Simon Dardis | fce722e | 2018-04-24 10:19:29 +0000 | [diff] [blame] | 785 | def : MipsPat<(bswap GPR64:$rt), (DSHD (DSBH GPR64:$rt))>, ISA_MIPS64R2; |
David Chisnall | 3705125 | 2012-10-09 16:27:43 +0000 | [diff] [blame] | 786 | |
Vasileios Kalintiris | ef96a8e | 2015-01-26 12:33:22 +0000 | [diff] [blame] | 787 | // Carry pattern |
Zlatko Buljan | 53a037f | 2016-04-08 07:27:26 +0000 | [diff] [blame] | 788 | let AdditionalPredicates = [NotInMicroMips] in { |
Zlatko Buljan | de0bbe6 | 2016-04-27 11:31:44 +0000 | [diff] [blame] | 789 | def : MipsPat<(subc GPR64:$lhs, GPR64:$rhs), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 790 | (DSUBu GPR64:$lhs, GPR64:$rhs)>, ISA_MIPS3, GPR_64; |
Vasileios Kalintiris | ef96a8e | 2015-01-26 12:33:22 +0000 | [diff] [blame] | 791 | def : MipsPat<(addc GPR64:$lhs, GPR64:$rhs), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 792 | (DADDu GPR64:$lhs, GPR64:$rhs)>, ISA_MIPS3, ASE_NOT_DSP, GPR_64; |
Vasileios Kalintiris | ef96a8e | 2015-01-26 12:33:22 +0000 | [diff] [blame] | 793 | def : MipsPat<(addc GPR64:$lhs, immSExt16:$imm), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 794 | (DADDiu GPR64:$lhs, imm:$imm)>, ISA_MIPS3, ASE_NOT_DSP, GPR_64; |
Vasileios Kalintiris | ef96a8e | 2015-01-26 12:33:22 +0000 | [diff] [blame] | 795 | } |
| 796 | |
Kai Nacke | 63072f8 | 2015-01-20 16:10:51 +0000 | [diff] [blame] | 797 | // Octeon bbit0/bbit1 MipsPattern |
Vasileios Kalintiris | 36901dd | 2016-03-01 20:25:43 +0000 | [diff] [blame] | 798 | def : MipsPat<(brcond (i32 (seteq (and i64:$lhs, PowerOf2LO:$mask), 0)), bb:$dst), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 799 | (BBIT0 i64:$lhs, (Log2LO PowerOf2LO:$mask), bb:$dst)>, |
| 800 | ISA_MIPS64R2, ASE_MIPS64_CNMIPS; |
Vasileios Kalintiris | 36901dd | 2016-03-01 20:25:43 +0000 | [diff] [blame] | 801 | def : MipsPat<(brcond (i32 (seteq (and i64:$lhs, PowerOf2HI:$mask), 0)), bb:$dst), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 802 | (BBIT032 i64:$lhs, (Log2HI PowerOf2HI:$mask), bb:$dst)>, |
| 803 | ISA_MIPS64R2, ASE_MIPS64_CNMIPS; |
Vasileios Kalintiris | 36901dd | 2016-03-01 20:25:43 +0000 | [diff] [blame] | 804 | def : MipsPat<(brcond (i32 (setne (and i64:$lhs, PowerOf2LO:$mask), 0)), bb:$dst), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 805 | (BBIT1 i64:$lhs, (Log2LO PowerOf2LO:$mask), bb:$dst)>, |
| 806 | ISA_MIPS64R2, ASE_MIPS64_CNMIPS; |
Vasileios Kalintiris | 36901dd | 2016-03-01 20:25:43 +0000 | [diff] [blame] | 807 | def : MipsPat<(brcond (i32 (setne (and i64:$lhs, PowerOf2HI:$mask), 0)), bb:$dst), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 808 | (BBIT132 i64:$lhs, (Log2HI PowerOf2HI:$mask), bb:$dst)>, |
| 809 | ISA_MIPS64R2, ASE_MIPS64_CNMIPS; |
Strahinja Petrovic | 89df797 | 2017-08-30 11:25:38 +0000 | [diff] [blame] | 810 | def : MipsPat<(brcond (i32 (seteq (and i32:$lhs, PowerOf2LO_i32:$mask), 0)), bb:$dst), |
| 811 | (BBIT0 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), i32:$lhs, sub_32), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 812 | (Log2LO PowerOf2LO_i32:$mask), bb:$dst)>, ISA_MIPS64R2, |
| 813 | ASE_MIPS64_CNMIPS; |
Strahinja Petrovic | 89df797 | 2017-08-30 11:25:38 +0000 | [diff] [blame] | 814 | def : MipsPat<(brcond (i32 (setne (and i32:$lhs, PowerOf2LO_i32:$mask), 0)), bb:$dst), |
| 815 | (BBIT1 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), i32:$lhs, sub_32), |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 816 | (Log2LO PowerOf2LO_i32:$mask), bb:$dst)>, ISA_MIPS64R2, |
| 817 | ASE_MIPS64_CNMIPS; |
Kai Nacke | 63072f8 | 2015-01-20 16:10:51 +0000 | [diff] [blame] | 818 | |
Vasileios Kalintiris | b04672c | 2015-11-06 12:07:20 +0000 | [diff] [blame] | 819 | // Atomic load patterns. |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 820 | def : MipsPat<(atomic_load_8 addr:$a), (LB64 addr:$a)>, ISA_MIPS3, GPR_64; |
| 821 | def : MipsPat<(atomic_load_16 addr:$a), (LH64 addr:$a)>, ISA_MIPS3, GPR_64; |
| 822 | def : MipsPat<(atomic_load_32 addr:$a), (LW64 addr:$a)>, ISA_MIPS3, GPR_64; |
| 823 | def : MipsPat<(atomic_load_64 addr:$a), (LD addr:$a)>, ISA_MIPS3, GPR_64; |
Vasileios Kalintiris | b04672c | 2015-11-06 12:07:20 +0000 | [diff] [blame] | 824 | |
| 825 | // Atomic store patterns. |
Simon Atanasyan | 738a6e4 | 2018-07-16 13:52:41 +0000 | [diff] [blame] | 826 | def : MipsPat<(atomic_store_8 addr:$a, GPR64:$v), (SB64 GPR64:$v, addr:$a)>, |
| 827 | ISA_MIPS3, GPR_64; |
| 828 | def : MipsPat<(atomic_store_16 addr:$a, GPR64:$v), (SH64 GPR64:$v, addr:$a)>, |
| 829 | ISA_MIPS3, GPR_64; |
| 830 | def : MipsPat<(atomic_store_32 addr:$a, GPR64:$v), (SW64 GPR64:$v, addr:$a)>, |
| 831 | ISA_MIPS3, GPR_64; |
| 832 | def : MipsPat<(atomic_store_64 addr:$a, GPR64:$v), (SD GPR64:$v, addr:$a)>, |
| 833 | ISA_MIPS3, GPR_64; |
Vasileios Kalintiris | b04672c | 2015-11-06 12:07:20 +0000 | [diff] [blame] | 834 | |
Stefan Maksimovic | 4a612d4 | 2018-07-26 10:59:35 +0000 | [diff] [blame] | 835 | // Patterns used for matching away redundant sign extensions. |
| 836 | // MIPS32 arithmetic instructions sign extend their result implicitly. |
| 837 | def : MipsPat<(i64 (sext (i32 (add GPR32:$src, immSExt16:$imm16)))), |
| 838 | (INSERT_SUBREG (i64 (IMPLICIT_DEF)), |
| 839 | (ADDiu GPR32:$src, immSExt16:$imm16), sub_32)>; |
| 840 | def : MipsPat<(i64 (sext (i32 (add GPR32:$src, GPR32:$src2)))), |
| 841 | (INSERT_SUBREG (i64 (IMPLICIT_DEF)), |
| 842 | (ADDu GPR32:$src, GPR32:$src2), sub_32)>; |
| 843 | def : MipsPat<(i64 (sext (i32 (sub GPR32:$src, GPR32:$src2)))), |
| 844 | (INSERT_SUBREG (i64 (IMPLICIT_DEF)), |
| 845 | (SUBu GPR32:$src, GPR32:$src2), sub_32)>; |
| 846 | def : MipsPat<(i64 (sext (i32 (mul GPR32:$src, GPR32:$src2)))), |
| 847 | (INSERT_SUBREG (i64 (IMPLICIT_DEF)), |
Stefan Maksimovic | 90e7ff8 | 2018-09-25 06:27:49 +0000 | [diff] [blame] | 848 | (MUL GPR32:$src, GPR32:$src2), sub_32)>, ISA_MIPS3_NOT_32R6_64R6; |
Stefan Maksimovic | 4a612d4 | 2018-07-26 10:59:35 +0000 | [diff] [blame] | 849 | def : MipsPat<(i64 (sext (i32 (MipsMFHI ACC64:$src)))), |
| 850 | (INSERT_SUBREG (i64 (IMPLICIT_DEF)), |
| 851 | (PseudoMFHI ACC64:$src), sub_32)>; |
| 852 | def : MipsPat<(i64 (sext (i32 (MipsMFLO ACC64:$src)))), |
| 853 | (INSERT_SUBREG (i64 (IMPLICIT_DEF)), |
| 854 | (PseudoMFLO ACC64:$src), sub_32)>; |
| 855 | def : MipsPat<(i64 (sext (i32 (shl GPR32:$src, immZExt5:$imm5)))), |
| 856 | (INSERT_SUBREG (i64 (IMPLICIT_DEF)), |
| 857 | (SLL GPR32:$src, immZExt5:$imm5), sub_32)>; |
| 858 | def : MipsPat<(i64 (sext (i32 (shl GPR32:$src, GPR32:$src2)))), |
| 859 | (INSERT_SUBREG (i64 (IMPLICIT_DEF)), |
| 860 | (SLLV GPR32:$src, GPR32:$src2), sub_32)>; |
| 861 | def : MipsPat<(i64 (sext (i32 (srl GPR32:$src, immZExt5:$imm5)))), |
| 862 | (INSERT_SUBREG (i64 (IMPLICIT_DEF)), |
| 863 | (SRL GPR32:$src, immZExt5:$imm5), sub_32)>; |
| 864 | def : MipsPat<(i64 (sext (i32 (srl GPR32:$src, GPR32:$src2)))), |
| 865 | (INSERT_SUBREG (i64 (IMPLICIT_DEF)), |
| 866 | (SRLV GPR32:$src, GPR32:$src2), sub_32)>; |
| 867 | def : MipsPat<(i64 (sext (i32 (sra GPR32:$src, immZExt5:$imm5)))), |
| 868 | (INSERT_SUBREG (i64 (IMPLICIT_DEF)), |
| 869 | (SRA GPR32:$src, immZExt5:$imm5), sub_32)>; |
| 870 | def : MipsPat<(i64 (sext (i32 (sra GPR32:$src, GPR32:$src2)))), |
| 871 | (INSERT_SUBREG (i64 (IMPLICIT_DEF)), |
| 872 | (SRAV GPR32:$src, GPR32:$src2), sub_32)>; |
| 873 | |
David Chisnall | 3705125 | 2012-10-09 16:27:43 +0000 | [diff] [blame] | 874 | //===----------------------------------------------------------------------===// |
| 875 | // Instruction aliases |
| 876 | //===----------------------------------------------------------------------===// |
Zlatko Buljan | 53a037f | 2016-04-08 07:27:26 +0000 | [diff] [blame] | 877 | let AdditionalPredicates = [NotInMicroMips] in { |
| 878 | def : MipsInstAlias<"move $dst, $src", |
| 879 | (OR64 GPR64Opnd:$dst, GPR64Opnd:$src, ZERO_64), 1>, |
| 880 | GPR_64; |
| 881 | def : MipsInstAlias<"move $dst, $src", |
| 882 | (DADDu GPR64Opnd:$dst, GPR64Opnd:$src, ZERO_64), 1>, |
| 883 | GPR_64; |
| 884 | def : MipsInstAlias<"dadd $rs, $rt, $imm", |
| 885 | (DADDi GPR64Opnd:$rs, GPR64Opnd:$rt, simm16_64:$imm), |
| 886 | 0>, ISA_MIPS3_NOT_32R6_64R6; |
| 887 | def : MipsInstAlias<"dadd $rs, $imm", |
| 888 | (DADDi GPR64Opnd:$rs, GPR64Opnd:$rs, simm16_64:$imm), |
| 889 | 0>, ISA_MIPS3_NOT_32R6_64R6; |
| 890 | def : MipsInstAlias<"daddu $rs, $rt, $imm", |
| 891 | (DADDiu GPR64Opnd:$rs, GPR64Opnd:$rt, simm16_64:$imm), |
| 892 | 0>, ISA_MIPS3; |
| 893 | def : MipsInstAlias<"daddu $rs, $imm", |
| 894 | (DADDiu GPR64Opnd:$rs, GPR64Opnd:$rs, simm16_64:$imm), |
| 895 | 0>, ISA_MIPS3; |
Simon Dardis | aa20881 | 2017-02-24 14:34:32 +0000 | [diff] [blame] | 896 | |
| 897 | defm : OneOrTwoOperandMacroImmediateAlias<"and", ANDi64, GPR64Opnd, imm64>, |
Simon Dardis | fdc0526 | 2018-04-19 09:45:04 +0000 | [diff] [blame] | 898 | ISA_MIPS3, GPR_64; |
Simon Dardis | aa20881 | 2017-02-24 14:34:32 +0000 | [diff] [blame] | 899 | |
| 900 | defm : OneOrTwoOperandMacroImmediateAlias<"or", ORi64, GPR64Opnd, imm64>, |
Simon Dardis | fdc0526 | 2018-04-19 09:45:04 +0000 | [diff] [blame] | 901 | ISA_MIPS3, GPR_64; |
Simon Dardis | aa20881 | 2017-02-24 14:34:32 +0000 | [diff] [blame] | 902 | |
| 903 | defm : OneOrTwoOperandMacroImmediateAlias<"xor", XORi64, GPR64Opnd, imm64>, |
Simon Dardis | fdc0526 | 2018-04-19 09:45:04 +0000 | [diff] [blame] | 904 | ISA_MIPS3, GPR_64; |
Zlatko Buljan | 53a037f | 2016-04-08 07:27:26 +0000 | [diff] [blame] | 905 | } |
Zlatko Buljan | de0bbe6 | 2016-04-27 11:31:44 +0000 | [diff] [blame] | 906 | let AdditionalPredicates = [NotInMicroMips] in { |
| 907 | def : MipsInstAlias<"dneg $rt, $rs", |
| 908 | (DSUB GPR64Opnd:$rt, ZERO_64, GPR64Opnd:$rs), 1>, |
| 909 | ISA_MIPS3; |
| 910 | def : MipsInstAlias<"dneg $rt", |
Simon Dardis | 273fc26 | 2016-07-26 09:13:46 +0000 | [diff] [blame] | 911 | (DSUB GPR64Opnd:$rt, ZERO_64, GPR64Opnd:$rt), 1>, |
Zlatko Buljan | de0bbe6 | 2016-04-27 11:31:44 +0000 | [diff] [blame] | 912 | ISA_MIPS3; |
| 913 | def : MipsInstAlias<"dnegu $rt, $rs", |
| 914 | (DSUBu GPR64Opnd:$rt, ZERO_64, GPR64Opnd:$rs), 1>, |
| 915 | ISA_MIPS3; |
Simon Dardis | 273fc26 | 2016-07-26 09:13:46 +0000 | [diff] [blame] | 916 | def : MipsInstAlias<"dnegu $rt", |
| 917 | (DSUBu GPR64Opnd:$rt, ZERO_64, GPR64Opnd:$rt), 1>, |
| 918 | ISA_MIPS3; |
Zlatko Buljan | de0bbe6 | 2016-04-27 11:31:44 +0000 | [diff] [blame] | 919 | } |
Daniel Sanders | e898236 | 2014-06-13 12:49:06 +0000 | [diff] [blame] | 920 | def : MipsInstAlias<"dsubi $rs, $rt, $imm", |
| 921 | (DADDi GPR64Opnd:$rs, GPR64Opnd:$rt, |
| 922 | InvertedImOperand64:$imm), |
| 923 | 0>, ISA_MIPS3_NOT_32R6_64R6; |
| 924 | def : MipsInstAlias<"dsubi $rs, $imm", |
| 925 | (DADDi GPR64Opnd:$rs, GPR64Opnd:$rs, |
| 926 | InvertedImOperand64:$imm), |
| 927 | 0>, ISA_MIPS3_NOT_32R6_64R6; |
| 928 | def : MipsInstAlias<"dsub $rs, $rt, $imm", |
| 929 | (DADDi GPR64Opnd:$rs, GPR64Opnd:$rt, |
| 930 | InvertedImOperand64:$imm), |
| 931 | 0>, ISA_MIPS3_NOT_32R6_64R6; |
Daniel Sanders | 7d290b0 | 2014-05-08 16:12:31 +0000 | [diff] [blame] | 932 | def : MipsInstAlias<"dsub $rs, $imm", |
| 933 | (DADDi GPR64Opnd:$rs, GPR64Opnd:$rs, |
| 934 | InvertedImOperand64:$imm), |
Daniel Sanders | e898236 | 2014-06-13 12:49:06 +0000 | [diff] [blame] | 935 | 0>, ISA_MIPS3_NOT_32R6_64R6; |
Zlatko Buljan | 53a037f | 2016-04-08 07:27:26 +0000 | [diff] [blame] | 936 | let AdditionalPredicates = [NotInMicroMips] in { |
| 937 | def : MipsInstAlias<"dsubu $rt, $rs, $imm", |
| 938 | (DADDiu GPR64Opnd:$rt, GPR64Opnd:$rs, |
| 939 | InvertedImOperand64:$imm), 0>, ISA_MIPS3; |
| 940 | def : MipsInstAlias<"dsubu $rs, $imm", |
| 941 | (DADDiu GPR64Opnd:$rs, GPR64Opnd:$rs, |
| 942 | InvertedImOperand64:$imm), 0>, ISA_MIPS3; |
| 943 | } |
Daniel Sanders | 52bdd65 | 2014-05-09 09:24:49 +0000 | [diff] [blame] | 944 | def : MipsInstAlias<"dsra $rd, $rt, $rs", |
Daniel Sanders | f2056be | 2014-05-09 13:02:27 +0000 | [diff] [blame] | 945 | (DSRAV GPR64Opnd:$rd, GPR64Opnd:$rt, GPR32Opnd:$rs), 0>, |
| 946 | ISA_MIPS3; |
Hrvoje Varga | 24b975d | 2016-06-27 08:23:28 +0000 | [diff] [blame] | 947 | let AdditionalPredicates = [NotInMicroMips] in { |
Simon Dardis | 4155c8f | 2017-06-27 13:35:17 +0000 | [diff] [blame] | 948 | def : MipsInstAlias<"dsll $rd, $rt, $rs", |
| 949 | (DSLLV GPR64Opnd:$rd, GPR64Opnd:$rt, GPR32Opnd:$rs), 0>, |
| 950 | ISA_MIPS3; |
Hrvoje Varga | 24b975d | 2016-06-27 08:23:28 +0000 | [diff] [blame] | 951 | def : MipsInstAlias<"dsrl $rd, $rt, $rs", |
| 952 | (DSRLV GPR64Opnd:$rd, GPR64Opnd:$rt, GPR32Opnd:$rs), 0>, |
| 953 | ISA_MIPS3; |
Simon Dardis | 4155c8f | 2017-06-27 13:35:17 +0000 | [diff] [blame] | 954 | def : MipsInstAlias<"dsrl $rd, $rt", |
| 955 | (DSRLV GPR64Opnd:$rd, GPR64Opnd:$rd, GPR32Opnd:$rt), 0>, |
| 956 | ISA_MIPS3; |
| 957 | def : MipsInstAlias<"dsll $rd, $rt", |
| 958 | (DSLLV GPR64Opnd:$rd, GPR64Opnd:$rd, GPR32Opnd:$rt), 0>, |
| 959 | ISA_MIPS3; |
Simon Dardis | 6f83ae3 | 2017-09-14 15:17:50 +0000 | [diff] [blame] | 960 | def : MipsInstAlias<"dins $rt, $rs, $pos, $size", |
| 961 | (DINSM GPR64Opnd:$rt, GPR64Opnd:$rs, uimm5:$pos, |
| 962 | uimm_range_2_64:$size), 0>, ISA_MIPS64R2; |
| 963 | def : MipsInstAlias<"dins $rt, $rs, $pos, $size", |
| 964 | (DINSU GPR64Opnd:$rt, GPR64Opnd:$rs, uimm5_plus32:$pos, |
| 965 | uimm5_plus1:$size), 0>, ISA_MIPS64R2; |
Simon Dardis | 55e4467 | 2017-09-14 17:27:53 +0000 | [diff] [blame] | 966 | def : MipsInstAlias<"dext $rt, $rs, $pos, $size", |
| 967 | (DEXTM GPR64Opnd:$rt, GPR64Opnd:$rs, uimm5:$pos, |
| 968 | uimm5_plus33:$size), 0>, ISA_MIPS64R2; |
| 969 | def : MipsInstAlias<"dext $rt, $rs, $pos, $size", |
| 970 | (DEXTU GPR64Opnd:$rt, GPR64Opnd:$rs, uimm5_plus32:$pos, |
| 971 | uimm5_plus1:$size), 0>, ISA_MIPS64R2; |
Simon Dardis | 7bc8ad5 | 2018-02-21 00:06:53 +0000 | [diff] [blame] | 972 | def : MipsInstAlias<"jalr.hb $rs", (JALR_HB64 RA_64, GPR64Opnd:$rs), 1>, |
| 973 | ISA_MIPS64; |
David Chisnall | 6a00ab4 | 2012-10-11 10:21:34 +0000 | [diff] [blame] | 974 | // Two operand (implicit 0 selector) versions: |
Hrvoje Varga | 2cb74ac | 2016-03-24 08:02:09 +0000 | [diff] [blame] | 975 | def : MipsInstAlias<"dmtc0 $rt, $rd", |
| 976 | (DMTC0 COP0Opnd:$rd, GPR64Opnd:$rt, 0), 0>; |
Zlatko Buljan | 6221be8 | 2016-03-31 08:51:24 +0000 | [diff] [blame] | 977 | def : MipsInstAlias<"dmfc0 $rt, $rd", |
| 978 | (DMFC0 GPR64Opnd:$rt, COP0Opnd:$rd, 0), 0>; |
Petar Jovanovic | d4349f3 | 2018-04-27 09:12:08 +0000 | [diff] [blame] | 979 | def : MipsInstAlias<"dmfgc0 $rt, $rd", |
| 980 | (DMFGC0 GPR64Opnd:$rt, COP0Opnd:$rd, 0), 0>, |
| 981 | ISA_MIPS64R5, ASE_VIRT; |
| 982 | def : MipsInstAlias<"dmtgc0 $rt, $rd", |
| 983 | (DMTGC0 COP0Opnd:$rd, GPR64Opnd:$rt, 0), 0>, |
| 984 | ISA_MIPS64R5, ASE_VIRT; |
Hrvoje Varga | 2cb74ac | 2016-03-24 08:02:09 +0000 | [diff] [blame] | 985 | } |
Daniel Sanders | a3134fa | 2015-06-27 15:39:19 +0000 | [diff] [blame] | 986 | def : MipsInstAlias<"dmfc2 $rt, $rd", (DMFC2 GPR64Opnd:$rt, COP2Opnd:$rd, 0), 0>; |
| 987 | def : MipsInstAlias<"dmtc2 $rt, $rd", (DMTC2 COP2Opnd:$rd, GPR64Opnd:$rt, 0), 0>; |
David Chisnall | 6a00ab4 | 2012-10-11 10:21:34 +0000 | [diff] [blame] | 988 | |
Daniel Sanders | f692130 | 2016-03-24 11:40:48 +0000 | [diff] [blame] | 989 | def : MipsInstAlias<"synciobdma", (SYNC 0x2), 0>, ASE_MIPS64_CNMIPS; |
| 990 | def : MipsInstAlias<"syncs", (SYNC 0x6), 0>, ASE_MIPS64_CNMIPS; |
| 991 | def : MipsInstAlias<"syncw", (SYNC 0x4), 0>, ASE_MIPS64_CNMIPS; |
| 992 | def : MipsInstAlias<"syncws", (SYNC 0x5), 0>, ASE_MIPS64_CNMIPS; |
Toma Tabacu | a90f144 | 2015-02-24 11:52:19 +0000 | [diff] [blame] | 993 | |
Daniel Sanders | daa4b6f | 2015-11-26 16:35:41 +0000 | [diff] [blame] | 994 | // cnMIPS Aliases. |
| 995 | |
| 996 | // bbit* with $p 32-63 converted to bbit*32 with $p 0-31 |
| 997 | def : MipsInstAlias<"bbit0 $rs, $p, $offset", |
| 998 | (BBIT032 GPR64Opnd:$rs, uimm5_plus32_normalize_64:$p, |
| 999 | brtarget:$offset), 0>, |
| 1000 | ASE_CNMIPS; |
| 1001 | def : MipsInstAlias<"bbit1 $rs, $p, $offset", |
| 1002 | (BBIT132 GPR64Opnd:$rs, uimm5_plus32_normalize_64:$p, |
| 1003 | brtarget:$offset), 0>, |
| 1004 | ASE_CNMIPS; |
| 1005 | |
| 1006 | // exts with $pos 32-63 in converted to exts32 with $pos 0-31 |
| 1007 | def : MipsInstAlias<"exts $rt, $rs, $pos, $lenm1", |
| 1008 | (EXTS32 GPR64Opnd:$rt, GPR64Opnd:$rs, |
| 1009 | uimm5_plus32_normalize:$pos, uimm5:$lenm1), 0>, |
Petar Jovanovic | b71386a | 2017-03-15 13:10:08 +0000 | [diff] [blame] | 1010 | ASE_MIPS64_CNMIPS; |
Daniel Sanders | daa4b6f | 2015-11-26 16:35:41 +0000 | [diff] [blame] | 1011 | def : MipsInstAlias<"exts $rt, $pos, $lenm1", |
| 1012 | (EXTS32 GPR64Opnd:$rt, GPR64Opnd:$rt, |
| 1013 | uimm5_plus32_normalize:$pos, uimm5:$lenm1), 0>, |
Petar Jovanovic | b71386a | 2017-03-15 13:10:08 +0000 | [diff] [blame] | 1014 | ASE_MIPS64_CNMIPS; |
Daniel Sanders | daa4b6f | 2015-11-26 16:35:41 +0000 | [diff] [blame] | 1015 | |
| 1016 | // cins with $pos 32-63 in converted to cins32 with $pos 0-31 |
| 1017 | def : MipsInstAlias<"cins $rt, $rs, $pos, $lenm1", |
| 1018 | (CINS32 GPR64Opnd:$rt, GPR64Opnd:$rs, |
| 1019 | uimm5_plus32_normalize:$pos, uimm5:$lenm1), 0>, |
Petar Jovanovic | b71386a | 2017-03-15 13:10:08 +0000 | [diff] [blame] | 1020 | ASE_MIPS64_CNMIPS; |
Daniel Sanders | daa4b6f | 2015-11-26 16:35:41 +0000 | [diff] [blame] | 1021 | def : MipsInstAlias<"cins $rt, $pos, $lenm1", |
| 1022 | (CINS32 GPR64Opnd:$rt, GPR64Opnd:$rt, |
| 1023 | uimm5_plus32_normalize:$pos, uimm5:$lenm1), 0>, |
Petar Jovanovic | b71386a | 2017-03-15 13:10:08 +0000 | [diff] [blame] | 1024 | ASE_MIPS64_CNMIPS; |
Daniel Sanders | daa4b6f | 2015-11-26 16:35:41 +0000 | [diff] [blame] | 1025 | |
Toma Tabacu | a90f144 | 2015-02-24 11:52:19 +0000 | [diff] [blame] | 1026 | //===----------------------------------------------------------------------===// |
| 1027 | // Assembler Pseudo Instructions |
| 1028 | //===----------------------------------------------------------------------===// |
| 1029 | |
Toma Tabacu | e1e3ffe | 2015-03-04 13:01:14 +0000 | [diff] [blame] | 1030 | class LoadImmediate64<string instr_asm, Operand Od, RegisterOperand RO> : |
Toma Tabacu | a90f144 | 2015-02-24 11:52:19 +0000 | [diff] [blame] | 1031 | MipsAsmPseudoInst<(outs RO:$rt), (ins Od:$imm64), |
| 1032 | !strconcat(instr_asm, "\t$rt, $imm64")> ; |
Toma Tabacu | e1e3ffe | 2015-03-04 13:01:14 +0000 | [diff] [blame] | 1033 | def LoadImm64 : LoadImmediate64<"dli", imm64, GPR64Opnd>; |
Daniel Sanders | a39ef1c | 2015-08-17 10:11:55 +0000 | [diff] [blame] | 1034 | |
| 1035 | def LoadAddrReg64 : MipsAsmPseudoInst<(outs GPR64Opnd:$rt), (ins mem:$addr), |
| 1036 | "dla\t$rt, $addr">; |
| 1037 | def LoadAddrImm64 : MipsAsmPseudoInst<(outs GPR64Opnd:$rt), (ins imm64:$imm64), |
| 1038 | "dla\t$rt, $imm64">; |
Simon Dardis | 3c82a64 | 2017-02-08 16:25:05 +0000 | [diff] [blame] | 1039 | |
| 1040 | def DMULImmMacro : MipsAsmPseudoInst<(outs), (ins GPR64Opnd:$rs, GPR64Opnd:$rt, |
| 1041 | simm32_relaxed:$imm), |
| 1042 | "dmul\t$rs, $rt, $imm">, |
| 1043 | ISA_MIPS3_NOT_32R6_64R6; |
| 1044 | def DMULOMacro : MipsAsmPseudoInst<(outs), (ins GPR64Opnd:$rs, GPR64Opnd:$rt, |
| 1045 | GPR64Opnd:$rd), |
| 1046 | "dmulo\t$rs, $rt, $rd">, |
| 1047 | ISA_MIPS3_NOT_32R6_64R6; |
| 1048 | def DMULOUMacro : MipsAsmPseudoInst<(outs), (ins GPR64Opnd:$rs, GPR64Opnd:$rt, |
| 1049 | GPR64Opnd:$rd), |
| 1050 | "dmulou\t$rs, $rt, $rd">, |
| 1051 | ISA_MIPS3_NOT_32R6_64R6; |
| 1052 | |
| 1053 | def DMULMacro : MipsAsmPseudoInst<(outs), (ins GPR64Opnd:$rs, GPR64Opnd:$rt, |
| 1054 | GPR64Opnd:$rd), |
| 1055 | "dmul\t$rs, $rt, $rd"> { |
| 1056 | let InsnPredicates = [HasMips3, NotMips64r6, NotCnMips]; |
| 1057 | } |
Simon Dardis | 509da1a | 2017-02-13 16:06:48 +0000 | [diff] [blame] | 1058 | |
| 1059 | let AdditionalPredicates = [NotInMicroMips] in { |
| 1060 | def DSDivMacro : MipsAsmPseudoInst<(outs GPR64Opnd:$rd), |
| 1061 | (ins GPR64Opnd:$rs, GPR64Opnd:$rt), |
| 1062 | "ddiv\t$rd, $rs, $rt">, |
| 1063 | ISA_MIPS3_NOT_32R6_64R6; |
| 1064 | def DSDivIMacro : MipsAsmPseudoInst<(outs GPR64Opnd:$rd), |
| 1065 | (ins GPR64Opnd:$rs, imm64:$imm), |
| 1066 | "ddiv\t$rd, $rs, $imm">, |
| 1067 | ISA_MIPS3_NOT_32R6_64R6; |
| 1068 | def DUDivMacro : MipsAsmPseudoInst<(outs GPR64Opnd:$rd), |
| 1069 | (ins GPR64Opnd:$rs, GPR64Opnd:$rt), |
| 1070 | "ddivu\t$rd, $rs, $rt">, |
| 1071 | ISA_MIPS3_NOT_32R6_64R6; |
| 1072 | def DUDivIMacro : MipsAsmPseudoInst<(outs GPR64Opnd:$rd), |
| 1073 | (ins GPR64Opnd:$rs, imm64:$imm), |
| 1074 | "ddivu\t$rd, $rs, $imm">, |
| 1075 | ISA_MIPS3_NOT_32R6_64R6; |
| 1076 | |
| 1077 | // GAS expands 'div' and 'ddiv' differently when the destination |
| 1078 | // register is $zero and the instruction is in the two operand |
| 1079 | // form. 'ddiv' gets expanded, while 'div' is not expanded. |
| 1080 | |
| 1081 | def : MipsInstAlias<"ddiv $rs, $rt", (DSDivMacro GPR64Opnd:$rs, |
| 1082 | GPR64Opnd:$rs, |
| 1083 | GPR64Opnd:$rt), 0>, |
| 1084 | ISA_MIPS3_NOT_32R6_64R6; |
| 1085 | def : MipsInstAlias<"ddiv $rd, $imm", (DSDivIMacro GPR64Opnd:$rd, |
| 1086 | GPR64Opnd:$rd, |
| 1087 | imm64:$imm), 0>, |
| 1088 | ISA_MIPS3_NOT_32R6_64R6; |
| 1089 | |
| 1090 | // GAS expands 'divu' and 'ddivu' differently when the destination |
| 1091 | // register is $zero and the instruction is in the two operand |
| 1092 | // form. 'ddivu' gets expanded, while 'divu' is not expanded. |
| 1093 | |
| 1094 | def : MipsInstAlias<"ddivu $rt, $rs", (DUDivMacro GPR64Opnd:$rt, |
| 1095 | GPR64Opnd:$rt, |
| 1096 | GPR64Opnd:$rs), 0>, |
| 1097 | ISA_MIPS3_NOT_32R6_64R6; |
| 1098 | def : MipsInstAlias<"ddivu $rd, $imm", (DUDivIMacro GPR64Opnd:$rd, |
| 1099 | GPR64Opnd:$rd, |
| 1100 | imm64:$imm), 0>, |
| 1101 | ISA_MIPS3_NOT_32R6_64R6; |
Stefan Maksimovic | 0a23998 | 2018-07-09 13:06:44 +0000 | [diff] [blame] | 1102 | def DSRemMacro : MipsAsmPseudoInst<(outs GPR64Opnd:$rd), |
| 1103 | (ins GPR64Opnd:$rs, GPR64Opnd:$rt), |
| 1104 | "drem\t$rd, $rs, $rt">, |
| 1105 | ISA_MIPS3_NOT_32R6_64R6; |
| 1106 | def DSRemIMacro : MipsAsmPseudoInst<(outs GPR64Opnd:$rd), |
| 1107 | (ins GPR64Opnd:$rs, simm32_relaxed:$imm), |
| 1108 | "drem\t$rd, $rs, $imm">, |
| 1109 | ISA_MIPS3_NOT_32R6_64R6; |
| 1110 | def DURemMacro : MipsAsmPseudoInst<(outs GPR64Opnd:$rd), |
| 1111 | (ins GPR64Opnd:$rs, GPR64Opnd:$rt), |
| 1112 | "dremu\t$rd, $rs, $rt">, |
| 1113 | ISA_MIPS3_NOT_32R6_64R6; |
| 1114 | def DURemIMacro : MipsAsmPseudoInst<(outs GPR64Opnd:$rd), |
| 1115 | (ins GPR64Opnd:$rs, simm32_relaxed:$imm), |
| 1116 | "dremu\t$rd, $rs, $imm">, |
| 1117 | ISA_MIPS3_NOT_32R6_64R6; |
| 1118 | def : MipsInstAlias<"drem $rt, $rs", (DSRemMacro GPR64Opnd:$rt, |
| 1119 | GPR64Opnd:$rt, |
| 1120 | GPR64Opnd:$rs), 0>, |
| 1121 | ISA_MIPS3_NOT_32R6_64R6; |
| 1122 | def : MipsInstAlias<"drem $rd, $imm", (DSRemIMacro GPR64Opnd:$rd, |
| 1123 | GPR64Opnd:$rd, |
| 1124 | simm32_relaxed:$imm), 0>, |
| 1125 | ISA_MIPS3_NOT_32R6_64R6; |
| 1126 | def : MipsInstAlias<"dremu $rt, $rs", (DURemMacro GPR64Opnd:$rt, |
| 1127 | GPR64Opnd:$rt, |
| 1128 | GPR64Opnd:$rs), 0>, |
| 1129 | ISA_MIPS3_NOT_32R6_64R6; |
| 1130 | def : MipsInstAlias<"dremu $rd, $imm", (DURemIMacro GPR64Opnd:$rd, |
| 1131 | GPR64Opnd:$rd, |
| 1132 | simm32_relaxed:$imm), 0>, |
| 1133 | ISA_MIPS3_NOT_32R6_64R6; |
Simon Dardis | 509da1a | 2017-02-13 16:06:48 +0000 | [diff] [blame] | 1134 | } |
Simon Dardis | e3cceed | 2017-02-28 15:55:23 +0000 | [diff] [blame] | 1135 | |
| 1136 | def NORImm64 : NORIMM_DESC_BASE<GPR64Opnd, imm64>, GPR_64; |
| 1137 | def : MipsInstAlias<"nor\t$rs, $imm", (NORImm64 GPR64Opnd:$rs, GPR64Opnd:$rs, |
| 1138 | imm64:$imm)>, GPR_64; |
| 1139 | def SLTImm64 : MipsAsmPseudoInst<(outs GPR64Opnd:$rs), |
| 1140 | (ins GPR64Opnd:$rt, imm64:$imm), |
| 1141 | "slt\t$rs, $rt, $imm">, GPR_64; |
| 1142 | def : MipsInstAlias<"slt\t$rs, $imm", (SLTImm64 GPR64Opnd:$rs, GPR64Opnd:$rs, |
| 1143 | imm64:$imm)>, GPR_64; |
| 1144 | def SLTUImm64 : MipsAsmPseudoInst<(outs GPR64Opnd:$rs), |
| 1145 | (ins GPR64Opnd:$rt, imm64:$imm), |
| 1146 | "sltu\t$rs, $rt, $imm">, GPR_64; |
| 1147 | def : MipsInstAlias<"sltu\t$rs, $imm", (SLTUImm64 GPR64Opnd:$rs, GPR64Opnd:$rs, |
| 1148 | imm64:$imm)>, GPR_64; |
Simon Atanasyan | 32d8d1b | 2018-09-11 09:57:25 +0000 | [diff] [blame] | 1149 | |
| 1150 | def : MipsInstAlias<"rdhwr $rt, $rs", |
| 1151 | (RDHWR64 GPR64Opnd:$rt, HWRegsOpnd:$rs, 0), 1>, GPR_64; |