| 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 | 7769a77 | 2011-09-30 02:08:54 +0000 | [diff] [blame] | 18 | // Unsigned Operand | 
|  | 19 | def uimm16_64      : Operand<i64> { | 
|  | 20 | let PrintMethod = "printUnsignedImm"; | 
|  | 21 | } | 
|  | 22 |  | 
| Kai Nacke | 6da86e8 | 2014-04-04 16:21:59 +0000 | [diff] [blame] | 23 | // Signed Operand | 
|  | 24 | def simm10_64 : Operand<i64>; | 
|  | 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 |  | 
| Kai Nacke | 6da86e8 | 2014-04-04 16:21:59 +0000 | [diff] [blame] | 34 | // Node immediate fits as 10-bit sign extended on target immediate. | 
|  | 35 | // e.g. seqi, snei | 
|  | 36 | def immSExt10_64 : PatLeaf<(i64 imm), | 
|  | 37 | [{ return isInt<10>(N->getSExtValue()); }]>; | 
|  | 38 |  | 
| Akira Hatanaka | 7769a77 | 2011-09-30 02:08:54 +0000 | [diff] [blame] | 39 | //===----------------------------------------------------------------------===// | 
| Akira Hatanaka | 3603641 | 2011-09-29 20:37:56 +0000 | [diff] [blame] | 40 | // Instructions specific format | 
|  | 41 | //===----------------------------------------------------------------------===// | 
| Akira Hatanaka | 6781fc1 | 2013-08-20 21:08:22 +0000 | [diff] [blame] | 42 | let usesCustomInserter = 1 in { | 
|  | 43 | def ATOMIC_LOAD_ADD_I64  : Atomic2Ops<atomic_load_add_64, GPR64>; | 
|  | 44 | def ATOMIC_LOAD_SUB_I64  : Atomic2Ops<atomic_load_sub_64, GPR64>; | 
|  | 45 | def ATOMIC_LOAD_AND_I64  : Atomic2Ops<atomic_load_and_64, GPR64>; | 
|  | 46 | def ATOMIC_LOAD_OR_I64   : Atomic2Ops<atomic_load_or_64, GPR64>; | 
|  | 47 | def ATOMIC_LOAD_XOR_I64  : Atomic2Ops<atomic_load_xor_64, GPR64>; | 
|  | 48 | def ATOMIC_LOAD_NAND_I64 : Atomic2Ops<atomic_load_nand_64, GPR64>; | 
|  | 49 | def ATOMIC_SWAP_I64      : Atomic2Ops<atomic_swap_64, GPR64>; | 
|  | 50 | def ATOMIC_CMP_SWAP_I64  : AtomicCmpSwap<atomic_cmp_swap_64, GPR64>; | 
| Akira Hatanaka | 21cbc25 | 2011-11-11 04:14:30 +0000 | [diff] [blame] | 51 | } | 
|  | 52 |  | 
| Akira Hatanaka | 4254319 | 2013-04-30 23:22:09 +0000 | [diff] [blame] | 53 | /// Pseudo instructions for loading and storing accumulator registers. | 
| Akira Hatanaka | 21f3343 | 2013-08-01 23:14:16 +0000 | [diff] [blame] | 54 | let isPseudo = 1, isCodeGenOnly = 1 in { | 
| Akira Hatanaka | 6781fc1 | 2013-08-20 21:08:22 +0000 | [diff] [blame] | 55 | def LOAD_ACC128  : Load<"", ACC128>; | 
|  | 56 | def STORE_ACC128 : Store<"", ACC128>; | 
| Akira Hatanaka | c8d8502 | 2013-03-30 00:54:52 +0000 | [diff] [blame] | 57 | } | 
|  | 58 |  | 
| Akira Hatanaka | 3603641 | 2011-09-29 20:37:56 +0000 | [diff] [blame] | 59 | //===----------------------------------------------------------------------===// | 
|  | 60 | // Instruction definition | 
|  | 61 | //===----------------------------------------------------------------------===// | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 62 | let DecoderNamespace = "Mips64" in { | 
| Akira Hatanaka | 7769a77 | 2011-09-30 02:08:54 +0000 | [diff] [blame] | 63 | /// Arithmetic Instructions (ALU Immediate) | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 64 | def DADDi   : ArithLogicI<"daddi", simm16_64, GPR64Opnd>, ADDI_FM<0x18>; | 
| Daniel Sanders | 980589a | 2014-01-16 14:27:20 +0000 | [diff] [blame] | 65 | def DADDiu  : ArithLogicI<"daddiu", simm16_64, GPR64Opnd, II_DADDIU, | 
| Akira Hatanaka | f8fff21 | 2013-07-31 00:55:34 +0000 | [diff] [blame] | 66 | immSExt16, add>, | 
| Akira Hatanaka | ab1b715b | 2012-12-20 03:40:03 +0000 | [diff] [blame] | 67 | ADDI_FM<0x19>, IsAsCheapAsAMove; | 
| Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 68 |  | 
|  | 69 | let isCodeGenOnly = 1 in { | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 70 | def SLTi64  : SetCC_I<"slti", setlt, simm16_64, immSExt16, GPR64Opnd>, | 
| Akira Hatanaka | e7f1acc | 2012-12-20 04:27:52 +0000 | [diff] [blame] | 71 | SLTI_FM<0xa>; | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 72 | def SLTiu64 : SetCC_I<"sltiu", setult, simm16_64, immSExt16, GPR64Opnd>, | 
| Akira Hatanaka | e7f1acc | 2012-12-20 04:27:52 +0000 | [diff] [blame] | 73 | SLTI_FM<0xb>; | 
| Daniel Sanders | 306ef07 | 2014-01-16 15:57:05 +0000 | [diff] [blame] | 74 | def ANDi64 : ArithLogicI<"andi", uimm16_64, GPR64Opnd, II_AND, immZExt16, and>, | 
| Akira Hatanaka | d644568 | 2013-07-31 00:57:41 +0000 | [diff] [blame] | 75 | ADDI_FM<0xc>; | 
| Daniel Sanders | 306ef07 | 2014-01-16 15:57:05 +0000 | [diff] [blame] | 76 | def ORi64   : ArithLogicI<"ori", uimm16_64, GPR64Opnd, II_OR, immZExt16, or>, | 
| Akira Hatanaka | ab1b715b | 2012-12-20 03:40:03 +0000 | [diff] [blame] | 77 | ADDI_FM<0xd>; | 
| Daniel Sanders | 306ef07 | 2014-01-16 15:57:05 +0000 | [diff] [blame] | 78 | def XORi64  : ArithLogicI<"xori", uimm16_64, GPR64Opnd, II_XOR, immZExt16, xor>, | 
| Akira Hatanaka | ab1b715b | 2012-12-20 03:40:03 +0000 | [diff] [blame] | 79 | ADDI_FM<0xe>; | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 80 | def LUi64   : LoadUpper<"lui", GPR64Opnd, uimm16_64>, LUI_FM; | 
| Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 81 | } | 
| Akira Hatanaka | 7769a77 | 2011-09-30 02:08:54 +0000 | [diff] [blame] | 82 |  | 
| Akira Hatanaka | 3603641 | 2011-09-29 20:37:56 +0000 | [diff] [blame] | 83 | /// Arithmetic Instructions (3-Operand, R-Type) | 
| Daniel Sanders | a771fef | 2014-03-24 14:05:39 +0000 | [diff] [blame] | 84 | def DADD   : ArithLogicR<"dadd", GPR64Opnd, 1, II_DADD>, ADD_FM<0, 0x2c>; | 
| Daniel Sanders | 980589a | 2014-01-16 14:27:20 +0000 | [diff] [blame] | 85 | def DADDu  : ArithLogicR<"daddu", GPR64Opnd, 1, II_DADDU, add>, | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 86 | ADD_FM<0, 0x2d>; | 
| Daniel Sanders | 980589a | 2014-01-16 14:27:20 +0000 | [diff] [blame] | 87 | def DSUBu  : ArithLogicR<"dsubu", GPR64Opnd, 0, II_DSUBU, sub>, | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 88 | ADD_FM<0, 0x2f>; | 
| Reed Kotler | c041669 | 2014-04-25 18:05:00 +0000 | [diff] [blame] | 89 | def DSUB   : ArithLogicR<"dsub", GPR64Opnd, 0, II_DSUB>, ADD_FM<0, 0x2e>; | 
| Akira Hatanaka | e2a39e7 | 2013-08-06 22:35:29 +0000 | [diff] [blame] | 90 |  | 
|  | 91 | let isCodeGenOnly = 1 in { | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 92 | def SLT64  : SetCC_R<"slt", setlt, GPR64Opnd>, ADD_FM<0, 0x2a>; | 
|  | 93 | def SLTu64 : SetCC_R<"sltu", setult, GPR64Opnd>, ADD_FM<0, 0x2b>; | 
| Daniel Sanders | 980589a | 2014-01-16 14:27:20 +0000 | [diff] [blame] | 94 | def AND64  : ArithLogicR<"and", GPR64Opnd, 1, II_AND, and>, ADD_FM<0, 0x24>; | 
|  | 95 | def OR64   : ArithLogicR<"or", GPR64Opnd, 1, II_OR, or>, ADD_FM<0, 0x25>; | 
|  | 96 | def XOR64  : ArithLogicR<"xor", GPR64Opnd, 1, II_XOR, xor>, ADD_FM<0, 0x26>; | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 97 | def NOR64  : LogicNOR<"nor", GPR64Opnd>, ADD_FM<0, 0x27>; | 
| Akira Hatanaka | e2a39e7 | 2013-08-06 22:35:29 +0000 | [diff] [blame] | 98 | } | 
| Akira Hatanaka | 61e256a | 2011-09-30 03:18:46 +0000 | [diff] [blame] | 99 |  | 
|  | 100 | /// Shift Instructions | 
| Daniel Sanders | 980589a | 2014-01-16 14:27:20 +0000 | [diff] [blame] | 101 | def DSLL   : shift_rotate_imm<"dsll", uimm6, GPR64Opnd, II_DSLL, shl, immZExt6>, | 
| Akira Hatanaka | f412e75 | 2013-01-04 19:25:46 +0000 | [diff] [blame] | 102 | SRA_FM<0x38, 0>; | 
| Daniel Sanders | 980589a | 2014-01-16 14:27:20 +0000 | [diff] [blame] | 103 | def DSRL   : shift_rotate_imm<"dsrl", uimm6, GPR64Opnd, II_DSRL, srl, immZExt6>, | 
| Akira Hatanaka | f412e75 | 2013-01-04 19:25:46 +0000 | [diff] [blame] | 104 | SRA_FM<0x3a, 0>; | 
| Daniel Sanders | 980589a | 2014-01-16 14:27:20 +0000 | [diff] [blame] | 105 | def DSRA   : shift_rotate_imm<"dsra", uimm6, GPR64Opnd, II_DSRA, sra, immZExt6>, | 
| Akira Hatanaka | f412e75 | 2013-01-04 19:25:46 +0000 | [diff] [blame] | 106 | SRA_FM<0x3b, 0>; | 
| Daniel Sanders | 980589a | 2014-01-16 14:27:20 +0000 | [diff] [blame] | 107 | def DSLLV  : shift_rotate_reg<"dsllv", GPR64Opnd, II_DSLLV, shl>, | 
|  | 108 | SRLV_FM<0x14, 0>; | 
|  | 109 | def DSRLV  : shift_rotate_reg<"dsrlv", GPR64Opnd, II_DSRLV, srl>, | 
|  | 110 | SRLV_FM<0x16, 0>; | 
|  | 111 | def DSRAV  : shift_rotate_reg<"dsrav", GPR64Opnd, II_DSRAV, sra>, | 
|  | 112 | SRLV_FM<0x17, 0>; | 
|  | 113 | def DSLL32 : shift_rotate_imm<"dsll32", uimm5, GPR64Opnd, II_DSLL32>, | 
|  | 114 | SRA_FM<0x3c, 0>; | 
|  | 115 | def DSRL32 : shift_rotate_imm<"dsrl32", uimm5, GPR64Opnd, II_DSRL32>, | 
|  | 116 | SRA_FM<0x3e, 0>; | 
|  | 117 | def DSRA32 : shift_rotate_imm<"dsra32", uimm5, GPR64Opnd, II_DSRA32>, | 
|  | 118 | SRA_FM<0x3f, 0>; | 
| Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 119 |  | 
| Akira Hatanaka | 7ba8a8d | 2011-09-30 18:51:46 +0000 | [diff] [blame] | 120 | // Rotate Instructions | 
| Daniel Sanders | 9c1b1be | 2014-05-07 13:57:22 +0000 | [diff] [blame^] | 121 | def DROTR  : shift_rotate_imm<"drotr", uimm6, GPR64Opnd, II_DROTR, rotr, | 
|  | 122 | immZExt6>, | 
|  | 123 | SRA_FM<0x3a, 1>, ISA_MIPS64R2; | 
|  | 124 | def DROTRV : shift_rotate_reg<"drotrv", GPR64Opnd, II_DROTRV, rotr>, | 
|  | 125 | SRLV_FM<0x16, 1>, ISA_MIPS64R2; | 
|  | 126 | def DROTR32 : shift_rotate_imm<"drotr32", uimm5, GPR64Opnd, II_DROTR32>, | 
|  | 127 | SRA_FM<0x3e, 1>, ISA_MIPS64R2; | 
| Akira Hatanaka | 7ba8a8d | 2011-09-30 18:51:46 +0000 | [diff] [blame] | 128 |  | 
| Akira Hatanaka | be68f3c | 2011-10-11 00:27:28 +0000 | [diff] [blame] | 129 | /// Load and Store Instructions | 
| Jia Liu | f54f60f | 2012-02-28 07:46:26 +0000 | [diff] [blame] | 130 | ///  aligned | 
| Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 131 | let isCodeGenOnly = 1 in { | 
| Daniel Sanders | 0b385ac | 2014-01-21 15:21:14 +0000 | [diff] [blame] | 132 | def LB64  : Load<"lb", GPR64Opnd, sextloadi8, II_LB>, LW_FM<0x20>; | 
|  | 133 | def LBu64 : Load<"lbu", GPR64Opnd, zextloadi8, II_LBU>, LW_FM<0x24>; | 
|  | 134 | def LH64  : Load<"lh", GPR64Opnd, sextloadi16, II_LH>, LW_FM<0x21>; | 
|  | 135 | def LHu64 : Load<"lhu", GPR64Opnd, zextloadi16, II_LHU>, LW_FM<0x25>; | 
|  | 136 | def LW64  : Load<"lw", GPR64Opnd, sextloadi32, II_LW>, LW_FM<0x23>; | 
| Daniel Sanders | 37463f7 | 2014-01-23 10:31:31 +0000 | [diff] [blame] | 137 | def SB64  : Store<"sb", GPR64Opnd, truncstorei8, II_SB>, LW_FM<0x28>; | 
|  | 138 | def SH64  : Store<"sh", GPR64Opnd, truncstorei16, II_SH>, LW_FM<0x29>; | 
|  | 139 | def SW64  : Store<"sw", GPR64Opnd, truncstorei32, II_SW>, LW_FM<0x2b>; | 
| Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 140 | } | 
|  | 141 |  | 
| Daniel Sanders | 0b385ac | 2014-01-21 15:21:14 +0000 | [diff] [blame] | 142 | def LWu   : Load<"lwu", GPR64Opnd, zextloadi32, II_LWU>, LW_FM<0x27>; | 
|  | 143 | def LD    : Load<"ld", GPR64Opnd, load, II_LD>, LW_FM<0x37>; | 
| Daniel Sanders | 37463f7 | 2014-01-23 10:31:31 +0000 | [diff] [blame] | 144 | def SD    : Store<"sd", GPR64Opnd, store, II_SD>, LW_FM<0x3f>; | 
| Akira Hatanaka | be68f3c | 2011-10-11 00:27:28 +0000 | [diff] [blame] | 145 |  | 
| Akira Hatanaka | f11571d | 2012-06-02 00:04:19 +0000 | [diff] [blame] | 146 | /// load/store left/right | 
| Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 147 | let isCodeGenOnly = 1 in { | 
| Daniel Sanders | 0b385ac | 2014-01-21 15:21:14 +0000 | [diff] [blame] | 148 | def LWL64 : LoadLeftRight<"lwl", MipsLWL, GPR64Opnd, II_LWL>, LW_FM<0x22>; | 
|  | 149 | def LWR64 : LoadLeftRight<"lwr", MipsLWR, GPR64Opnd, II_LWR>, LW_FM<0x26>; | 
| Daniel Sanders | 37463f7 | 2014-01-23 10:31:31 +0000 | [diff] [blame] | 150 | def SWL64 : StoreLeftRight<"swl", MipsSWL, GPR64Opnd, II_SWL>, LW_FM<0x2a>; | 
|  | 151 | def SWR64 : StoreLeftRight<"swr", MipsSWR, GPR64Opnd, II_SWR>, LW_FM<0x2e>; | 
| Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 152 | } | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 153 |  | 
| Daniel Sanders | 0b385ac | 2014-01-21 15:21:14 +0000 | [diff] [blame] | 154 | def LDL   : LoadLeftRight<"ldl", MipsLDL, GPR64Opnd, II_LDL>, LW_FM<0x1a>; | 
|  | 155 | def LDR   : LoadLeftRight<"ldr", MipsLDR, GPR64Opnd, II_LDR>, LW_FM<0x1b>; | 
| Daniel Sanders | 37463f7 | 2014-01-23 10:31:31 +0000 | [diff] [blame] | 156 | def SDL   : StoreLeftRight<"sdl", MipsSDL, GPR64Opnd, II_SDL>, LW_FM<0x2c>; | 
|  | 157 | def SDR   : StoreLeftRight<"sdr", MipsSDR, GPR64Opnd, II_SDR>, LW_FM<0x2d>; | 
| Akira Hatanaka | f11571d | 2012-06-02 00:04:19 +0000 | [diff] [blame] | 158 |  | 
| Akira Hatanaka | 21cbc25 | 2011-11-11 04:14:30 +0000 | [diff] [blame] | 159 | /// Load-linked, Store-conditional | 
| Akira Hatanaka | 6781fc1 | 2013-08-20 21:08:22 +0000 | [diff] [blame] | 160 | def LLD : LLBase<"lld", GPR64Opnd>, LW_FM<0x34>; | 
|  | 161 | def SCD : SCBase<"scd", GPR64Opnd>, LW_FM<0x3c>; | 
| Akira Hatanaka | 21cbc25 | 2011-11-11 04:14:30 +0000 | [diff] [blame] | 162 |  | 
| Akira Hatanaka | 4b6ac98 | 2011-10-11 18:49:17 +0000 | [diff] [blame] | 163 | /// Jump and Branch Instructions | 
| Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 164 | let isCodeGenOnly = 1 in { | 
| Zoran Jovanovic | 507e084 | 2013-10-29 16:38:59 +0000 | [diff] [blame] | 165 | def JR64   : IndirectBranch<"jr", GPR64Opnd>, MTLO_FM<8>; | 
| Zoran Jovanovic | 8a80aa7 | 2013-11-04 14:53:22 +0000 | [diff] [blame] | 166 | def BEQ64  : CBranch<"beq", brtarget, seteq, GPR64Opnd>, BEQ_FM<4>; | 
|  | 167 | def BNE64  : CBranch<"bne", brtarget, setne, GPR64Opnd>, BEQ_FM<5>; | 
|  | 168 | def BGEZ64 : CBranchZero<"bgez", brtarget, setge, GPR64Opnd>, BGEZ_FM<1, 1>; | 
|  | 169 | def BGTZ64 : CBranchZero<"bgtz", brtarget, setgt, GPR64Opnd>, BGEZ_FM<7, 0>; | 
|  | 170 | def BLEZ64 : CBranchZero<"blez", brtarget, setle, GPR64Opnd>, BGEZ_FM<6, 0>; | 
|  | 171 | def BLTZ64 : CBranchZero<"bltz", brtarget, setlt, GPR64Opnd>, BGEZ_FM<1, 0>; | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 172 | def JALR64 : JumpLinkReg<"jalr", GPR64Opnd>, JALR_FM; | 
|  | 173 | def JALR64Pseudo : JumpLinkRegPseudo<GPR64Opnd, JALR, RA, GPR32Opnd>; | 
| Akira Hatanaka | f6109e4 | 2013-11-27 23:58:32 +0000 | [diff] [blame] | 174 | def TAILCALL64_R : TailCallReg<GPR64Opnd, JR, GPR32Opnd>; | 
| Akira Hatanaka | 34a32c0 | 2013-08-06 22:20:40 +0000 | [diff] [blame] | 175 | } | 
|  | 176 |  | 
| Akira Hatanaka | a279d9b | 2011-10-03 20:01:11 +0000 | [diff] [blame] | 177 | /// Multiply and Divide Instructions. | 
| Daniel Sanders | e95a137 | 2014-01-17 14:32:41 +0000 | [diff] [blame] | 178 | def DMULT  : Mult<"dmult", II_DMULT, GPR64Opnd, [HI0_64, LO0_64]>, | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 179 | MULT_FM<0, 0x1c>; | 
| Daniel Sanders | e95a137 | 2014-01-17 14:32:41 +0000 | [diff] [blame] | 180 | def DMULTu : Mult<"dmultu", II_DMULTU, GPR64Opnd, [HI0_64, LO0_64]>, | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 181 | MULT_FM<0, 0x1d>; | 
| Akira Hatanaka | 00fcf2e | 2013-08-08 21:54:26 +0000 | [diff] [blame] | 182 | def PseudoDMULT  : MultDivPseudo<DMULT, ACC128, GPR64Opnd, MipsMult, | 
| Daniel Sanders | e95a137 | 2014-01-17 14:32:41 +0000 | [diff] [blame] | 183 | II_DMULT>; | 
| Akira Hatanaka | 00fcf2e | 2013-08-08 21:54:26 +0000 | [diff] [blame] | 184 | def PseudoDMULTu : MultDivPseudo<DMULTu, ACC128, GPR64Opnd, MipsMultu, | 
| Daniel Sanders | e95a137 | 2014-01-17 14:32:41 +0000 | [diff] [blame] | 185 | II_DMULTU>; | 
| Daniel Sanders | c7a9f8d | 2014-01-17 14:48:06 +0000 | [diff] [blame] | 186 | def DSDIV : Div<"ddiv", II_DDIV, GPR64Opnd, [HI0_64, LO0_64]>, | 
|  | 187 | MULT_FM<0, 0x1e>; | 
|  | 188 | def DUDIV : Div<"ddivu", II_DDIVU, GPR64Opnd, [HI0_64, LO0_64]>, | 
|  | 189 | MULT_FM<0, 0x1f>; | 
| Akira Hatanaka | 00fcf2e | 2013-08-08 21:54:26 +0000 | [diff] [blame] | 190 | def PseudoDSDIV : MultDivPseudo<DSDIV, ACC128, GPR64Opnd, MipsDivRem, | 
| Daniel Sanders | c7a9f8d | 2014-01-17 14:48:06 +0000 | [diff] [blame] | 191 | II_DDIV, 0, 1, 1>; | 
| Akira Hatanaka | 00fcf2e | 2013-08-08 21:54:26 +0000 | [diff] [blame] | 192 | def PseudoDUDIV : MultDivPseudo<DUDIV, ACC128, GPR64Opnd, MipsDivRemU, | 
| Daniel Sanders | c7a9f8d | 2014-01-17 14:48:06 +0000 | [diff] [blame] | 193 | II_DDIVU, 0, 1, 1>; | 
| Akira Hatanaka | a279d9b | 2011-10-03 20:01:11 +0000 | [diff] [blame] | 194 |  | 
| Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 195 | let isCodeGenOnly = 1 in { | 
| Akira Hatanaka | 8002a3f | 2013-08-14 00:47:08 +0000 | [diff] [blame] | 196 | def MTHI64 : MoveToLOHI<"mthi", GPR64Opnd, [HI0_64]>, MTLO_FM<0x11>; | 
|  | 197 | def MTLO64 : MoveToLOHI<"mtlo", GPR64Opnd, [LO0_64]>, MTLO_FM<0x13>; | 
| Akira Hatanaka | 1604833 | 2013-10-07 18:49:46 +0000 | [diff] [blame] | 198 | def MFHI64 : MoveFromLOHI<"mfhi", GPR64Opnd, AC0_64>, MFLO_FM<0x10>; | 
|  | 199 | def MFLO64 : MoveFromLOHI<"mflo", GPR64Opnd, AC0_64>, MFLO_FM<0x12>; | 
| Akira Hatanaka | d98c99f | 2013-10-15 01:12:50 +0000 | [diff] [blame] | 200 | def PseudoMFHI64 : PseudoMFLOHI<GPR64, ACC128, MipsMFHI>; | 
|  | 201 | def PseudoMFLO64 : PseudoMFLOHI<GPR64, ACC128, MipsMFLO>; | 
| Akira Hatanaka | 06aff57 | 2013-10-15 01:48:30 +0000 | [diff] [blame] | 202 | def PseudoMTLOHI64 : PseudoMTLOHI<ACC128, GPR64>; | 
| Akira Hatanaka | cdcc745 | 2011-10-03 19:28:44 +0000 | [diff] [blame] | 203 |  | 
| Akira Hatanaka | 9f7ec15 | 2012-01-24 21:41:09 +0000 | [diff] [blame] | 204 | /// Sign Ext In Register Instructions. | 
| Daniel Sanders | 4d20f0c | 2014-01-16 16:19:38 +0000 | [diff] [blame] | 205 | def SEB64 : SignExtInReg<"seb", i8, GPR64Opnd, II_SEB>, SEB_FM<0x10, 0x20>; | 
|  | 206 | def SEH64 : SignExtInReg<"seh", i16, GPR64Opnd, II_SEH>, SEB_FM<0x18, 0x20>; | 
| Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 207 | } | 
| Akira Hatanaka | 9f7ec15 | 2012-01-24 21:41:09 +0000 | [diff] [blame] | 208 |  | 
| Akira Hatanaka | 48a72ca | 2011-10-03 21:16:50 +0000 | [diff] [blame] | 209 | /// Count Leading | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 210 | def DCLZ : CountLeading0<"dclz", GPR64Opnd>, CLO_FM<0x24>; | 
|  | 211 | def DCLO : CountLeading1<"dclo", GPR64Opnd>, CLO_FM<0x25>; | 
| Akira Hatanaka | 48a72ca | 2011-10-03 21:16:50 +0000 | [diff] [blame] | 212 |  | 
| Akira Hatanaka | 4706ac9 | 2011-12-20 23:56:43 +0000 | [diff] [blame] | 213 | /// Double Word Swap Bytes/HalfWords | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 214 | def DSBH : SubwordSwap<"dsbh", GPR64Opnd>, SEB_FM<2, 0x24>; | 
|  | 215 | def DSHD : SubwordSwap<"dshd", GPR64Opnd>, SEB_FM<5, 0x24>; | 
| Akira Hatanaka | 4706ac9 | 2011-12-20 23:56:43 +0000 | [diff] [blame] | 216 |  | 
| Akira Hatanaka | 6781fc1 | 2013-08-20 21:08:22 +0000 | [diff] [blame] | 217 | def LEA_ADDiu64 : EffectiveAddress<"daddiu", GPR64Opnd>, LW_FM<0x19>; | 
| Akira Hatanaka | 6ac2fc4 | 2012-12-21 23:21:32 +0000 | [diff] [blame] | 218 |  | 
| Akira Hatanaka | c7e3998 | 2013-08-06 23:01:10 +0000 | [diff] [blame] | 219 | let isCodeGenOnly = 1 in | 
| Akira Hatanaka | 85ccf23 | 2013-08-08 21:37:32 +0000 | [diff] [blame] | 220 | def RDHWR64 : ReadHardware<GPR64Opnd, HWRegsOpnd>, RDHWR_FM; | 
| Akira Hatanaka | 4350c18 | 2011-12-07 23:31:26 +0000 | [diff] [blame] | 221 |  | 
| Akira Hatanaka | 3121353 | 2013-09-07 00:02:02 +0000 | [diff] [blame] | 222 | def DEXT : ExtBase<"dext", GPR64Opnd, uimm6, MipsExt>, EXT_FM<3>; | 
|  | 223 | def DEXTU : ExtBase<"dextu", GPR64Opnd, uimm6>, EXT_FM<2>; | 
|  | 224 | def DEXTM : ExtBase<"dextm", GPR64Opnd, uimm5>, EXT_FM<1>; | 
|  | 225 |  | 
|  | 226 | def DINS : InsBase<"dins", GPR64Opnd, uimm6, MipsIns>, EXT_FM<7>; | 
|  | 227 | def DINSU : InsBase<"dinsu", GPR64Opnd, uimm6>, EXT_FM<6>; | 
|  | 228 | def DINSM : InsBase<"dinsm", GPR64Opnd, uimm5>, EXT_FM<5>; | 
| Akira Hatanaka | 20cee2e | 2011-12-05 21:26:34 +0000 | [diff] [blame] | 229 |  | 
| Jack Carter | f4946cf | 2012-08-07 00:35:22 +0000 | [diff] [blame] | 230 | let isCodeGenOnly = 1, rs = 0, shamt = 0 in { | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 231 | def DSLL64_32 : FR<0x00, 0x3c, (outs GPR64:$rd), (ins GPR32:$rt), | 
| Daniel Sanders | 980589a | 2014-01-16 14:27:20 +0000 | [diff] [blame] | 232 | "dsll\t$rd, $rt, 32", [], II_DSLL>; | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 233 | def SLL64_32 : FR<0x0, 0x00, (outs GPR64:$rd), (ins GPR32:$rt), | 
| Daniel Sanders | 980589a | 2014-01-16 14:27:20 +0000 | [diff] [blame] | 234 | "sll\t$rd, $rt, 0", [], II_SLL>; | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 235 | def SLL64_64 : FR<0x0, 0x00, (outs GPR64:$rd), (ins GPR64:$rt), | 
| Daniel Sanders | 980589a | 2014-01-16 14:27:20 +0000 | [diff] [blame] | 236 | "sll\t$rd, $rt, 0", [], II_SLL>; | 
| Jack Carter | f4946cf | 2012-08-07 00:35:22 +0000 | [diff] [blame] | 237 | } | 
| Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 238 |  | 
| Sasa Stankovic | 7b061a4 | 2014-04-30 15:06:25 +0000 | [diff] [blame] | 239 | // We need the following two pseudo instructions to avoid offset calculation for | 
|  | 240 | // long branches.  See the comment in file MipsLongBranch.cpp for detailed | 
|  | 241 | // explanation. | 
|  | 242 |  | 
|  | 243 | // Expands to: lui $dst, %highest($tgt - $baltgt) | 
|  | 244 | def LONG_BRANCH_LUi64 : PseudoSE<(outs GPR64Opnd:$dst), | 
|  | 245 | (ins brtarget:$tgt, brtarget:$baltgt), []>; | 
|  | 246 |  | 
|  | 247 | // Expands to: daddiu $dst, $src, %PART($tgt - $baltgt) | 
|  | 248 | // where %PART may be %higher, %hi or %lo, depending on the relocation kind | 
|  | 249 | // that $tgt is annotated with. | 
|  | 250 | def LONG_BRANCH_DADDiu : PseudoSE<(outs GPR64Opnd:$dst), | 
|  | 251 | (ins GPR64Opnd:$src, brtarget:$tgt, brtarget:$baltgt), []>; | 
|  | 252 |  | 
| Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 253 | // Cavium Octeon cmMIPS instructions | 
| Daniel Sanders | 3dc2c01 | 2014-05-07 10:27:09 +0000 | [diff] [blame] | 254 | let EncodingPredicates = []<Predicate>, // FIXME: The lack of HasStdEnc is probably a bug | 
|  | 255 | AdditionalPredicates = [HasCnMips] in { | 
| Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 256 |  | 
|  | 257 | class Count1s<string opstr, RegisterOperand RO>: | 
|  | 258 | InstSE<(outs RO:$rd), (ins RO:$rs), !strconcat(opstr, "\t$rd, $rs"), | 
| Kai Nacke | 13673ac | 2014-04-02 18:40:43 +0000 | [diff] [blame] | 259 | [(set RO:$rd, (ctpop RO:$rs))], II_POP, FrmR, opstr> { | 
|  | 260 | let TwoOperandAliasConstraint = "$rd = $rs"; | 
|  | 261 | } | 
|  | 262 |  | 
|  | 263 | class ExtsCins<string opstr, SDPatternOperator Op = null_frag>: | 
|  | 264 | InstSE<(outs GPR64Opnd:$rt), (ins GPR64Opnd:$rs, uimm5:$pos, uimm5:$lenm1), | 
|  | 265 | !strconcat(opstr, " $rt, $rs, $pos, $lenm1"), | 
|  | 266 | [(set GPR64Opnd:$rt, (Op GPR64Opnd:$rs, imm:$pos, imm:$lenm1))], | 
|  | 267 | NoItinerary, FrmR, opstr> { | 
|  | 268 | let TwoOperandAliasConstraint = "$rt = $rs"; | 
|  | 269 | } | 
| Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 270 |  | 
|  | 271 | class SetCC64_R<string opstr, PatFrag cond_op> : | 
|  | 272 | InstSE<(outs GPR64Opnd:$rd), (ins GPR64Opnd:$rs, GPR64Opnd:$rt), | 
|  | 273 | !strconcat(opstr, "\t$rd, $rs, $rt"), | 
|  | 274 | [(set GPR64Opnd:$rd, (cond_op GPR64Opnd:$rs, GPR64Opnd:$rt))], | 
| Kai Nacke | 13673ac | 2014-04-02 18:40:43 +0000 | [diff] [blame] | 275 | II_SEQ_SNE, FrmR, opstr> { | 
|  | 276 | let TwoOperandAliasConstraint = "$rd = $rs"; | 
|  | 277 | } | 
| Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 278 |  | 
| Kai Nacke | 6da86e8 | 2014-04-04 16:21:59 +0000 | [diff] [blame] | 279 | class SetCC64_I<string opstr, PatFrag cond_op>: | 
|  | 280 | InstSE<(outs GPR64Opnd:$rt), (ins GPR64Opnd:$rs, simm10_64:$imm10), | 
|  | 281 | !strconcat(opstr, "\t$rt, $rs, $imm10"), | 
|  | 282 | [(set GPR64Opnd:$rt, (cond_op GPR64Opnd:$rs, immSExt10_64:$imm10))], | 
|  | 283 | II_SEQI_SNEI, FrmI, opstr> { | 
|  | 284 | let TwoOperandAliasConstraint = "$rt = $rs"; | 
|  | 285 | } | 
|  | 286 |  | 
| Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 287 | // Unsigned Byte Add | 
| Kai Nacke | 13673ac | 2014-04-02 18:40:43 +0000 | [diff] [blame] | 288 | let Pattern = [(set GPR64Opnd:$rd, | 
|  | 289 | (and (add GPR64Opnd:$rs, GPR64Opnd:$rt), 255))] in | 
|  | 290 | def BADDu  : ArithLogicR<"baddu", GPR64Opnd, 1, II_BADDU>, | 
|  | 291 | ADD_FM<0x1c, 0x28>; | 
| Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 292 |  | 
|  | 293 | // Multiply Doubleword to GPR | 
|  | 294 | let Defs = [HI0, LO0, P0, P1, P2] in | 
|  | 295 | def DMUL  : ArithLogicR<"dmul", GPR64Opnd, 1, II_DMUL, mul>, | 
|  | 296 | ADD_FM<0x1c, 0x03>; | 
|  | 297 |  | 
| Kai Nacke | 13673ac | 2014-04-02 18:40:43 +0000 | [diff] [blame] | 298 | // Extract a signed bit field /+32 | 
|  | 299 | def EXTS  : ExtsCins<"exts">, EXTS_FM<0x3a>; | 
|  | 300 | def EXTS32: ExtsCins<"exts32">, EXTS_FM<0x3b>; | 
|  | 301 |  | 
|  | 302 | // Clear and insert a bit field /+32 | 
|  | 303 | def CINS  : ExtsCins<"cins">, EXTS_FM<0x32>; | 
|  | 304 | def CINS32: ExtsCins<"cins32">, EXTS_FM<0x33>; | 
|  | 305 |  | 
| Kai Nacke | af47f60 | 2014-04-01 18:35:26 +0000 | [diff] [blame] | 306 | // Move to multiplier/product register | 
|  | 307 | def MTM0   : MoveToLOHI<"mtm0", GPR64Opnd, [MPL0, P0, P1, P2]>, MTMR_FM<0x08>; | 
|  | 308 | def MTM1   : MoveToLOHI<"mtm1", GPR64Opnd, [MPL1, P0, P1, P2]>, MTMR_FM<0x0c>; | 
|  | 309 | def MTM2   : MoveToLOHI<"mtm2", GPR64Opnd, [MPL2, P0, P1, P2]>, MTMR_FM<0x0d>; | 
|  | 310 | def MTP0   : MoveToLOHI<"mtp0", GPR64Opnd, [P0]>, MTMR_FM<0x09>; | 
|  | 311 | def MTP1   : MoveToLOHI<"mtp1", GPR64Opnd, [P1]>, MTMR_FM<0x0a>; | 
|  | 312 | def MTP2   : MoveToLOHI<"mtp2", GPR64Opnd, [P2]>, MTMR_FM<0x0b>; | 
|  | 313 |  | 
| Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 314 | // Count Ones in a Word/Doubleword | 
|  | 315 | def POP   : Count1s<"pop", GPR32Opnd>, POP_FM<0x2c>; | 
|  | 316 | def DPOP  : Count1s<"dpop", GPR64Opnd>, POP_FM<0x2d>; | 
|  | 317 |  | 
|  | 318 | // Set on equal/not equal | 
|  | 319 | def SEQ   : SetCC64_R<"seq", seteq>, SEQ_FM<0x2a>; | 
| Kai Nacke | 6da86e8 | 2014-04-04 16:21:59 +0000 | [diff] [blame] | 320 | def SEQi  : SetCC64_I<"seqi", seteq>, SEQI_FM<0x2e>; | 
| Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 321 | def SNE   : SetCC64_R<"sne", setne>, SEQ_FM<0x2b>; | 
| Kai Nacke | 6da86e8 | 2014-04-04 16:21:59 +0000 | [diff] [blame] | 322 | def SNEi  : SetCC64_I<"snei", setne>, SEQI_FM<0x2f>; | 
|  | 323 |  | 
| Matheus Almeida | 583a13c | 2014-04-24 16:31:10 +0000 | [diff] [blame] | 324 | // 192-bit x 64-bit Unsigned Multiply and Add | 
| Kai Nacke | 6da86e8 | 2014-04-04 16:21:59 +0000 | [diff] [blame] | 325 | let Defs = [P0, P1, P2] in | 
|  | 326 | def V3MULU: ArithLogicR<"v3mulu", GPR64Opnd, 0, II_DMUL>, | 
|  | 327 | ADD_FM<0x1c, 0x11>; | 
|  | 328 |  | 
|  | 329 | // 64-bit Unsigned Multiply and Add Move | 
|  | 330 | let Defs = [MPL0, P0, P1, P2] in | 
|  | 331 | def VMM0  : ArithLogicR<"vmm0", GPR64Opnd, 0, II_DMUL>, | 
|  | 332 | ADD_FM<0x1c, 0x10>; | 
|  | 333 |  | 
|  | 334 | // 64-bit Unsigned Multiply and Add | 
|  | 335 | let Defs = [MPL1, MPL2, P0, P1, P2] in | 
|  | 336 | def VMULU : ArithLogicR<"vmulu", GPR64Opnd, 0, II_DMUL>, | 
|  | 337 | ADD_FM<0x1c, 0x0f>; | 
|  | 338 |  | 
| Kai Nacke | 93fe5e8 | 2014-03-20 11:51:58 +0000 | [diff] [blame] | 339 | } | 
|  | 340 |  | 
| Akira Hatanaka | 71928e6 | 2012-04-17 18:03:21 +0000 | [diff] [blame] | 341 | } | 
| Kai Nacke | 13673ac | 2014-04-02 18:40:43 +0000 | [diff] [blame] | 342 |  | 
| Akira Hatanaka | 7ba8a8d | 2011-09-30 18:51:46 +0000 | [diff] [blame] | 343 | //===----------------------------------------------------------------------===// | 
|  | 344 | //  Arbitrary patterns that map to one or more instructions | 
|  | 345 | //===----------------------------------------------------------------------===// | 
|  | 346 |  | 
| Akira Hatanaka | f93b3f4 | 2011-11-14 19:06:14 +0000 | [diff] [blame] | 347 | // extended loads | 
| Daniel Sanders | f562582 | 2014-04-29 16:24:10 +0000 | [diff] [blame] | 348 | def : MipsPat<(i64 (extloadi1  addr:$src)), (LB64 addr:$src)>; | 
|  | 349 | def : MipsPat<(i64 (extloadi8  addr:$src)), (LB64 addr:$src)>; | 
|  | 350 | def : MipsPat<(i64 (extloadi16 addr:$src)), (LH64 addr:$src)>; | 
|  | 351 | def : MipsPat<(i64 (extloadi32 addr:$src)), (LW64 addr:$src)>; | 
| Akira Hatanaka | 09b23eb | 2011-10-11 00:55:05 +0000 | [diff] [blame] | 352 |  | 
|  | 353 | // hi/lo relocs | 
| Akira Hatanaka | d8ab16b | 2012-06-14 21:03:23 +0000 | [diff] [blame] | 354 | def : MipsPat<(MipsHi tglobaladdr:$in), (LUi64 tglobaladdr:$in)>; | 
|  | 355 | def : MipsPat<(MipsHi tblockaddress:$in), (LUi64 tblockaddress:$in)>; | 
|  | 356 | def : MipsPat<(MipsHi tjumptable:$in), (LUi64 tjumptable:$in)>; | 
|  | 357 | def : MipsPat<(MipsHi tconstpool:$in), (LUi64 tconstpool:$in)>; | 
|  | 358 | def : MipsPat<(MipsHi tglobaltlsaddr:$in), (LUi64 tglobaltlsaddr:$in)>; | 
| Akira Hatanaka | bb6e74a | 2012-11-21 20:40:38 +0000 | [diff] [blame] | 359 | def : MipsPat<(MipsHi texternalsym:$in), (LUi64 texternalsym:$in)>; | 
| Akira Hatanaka | 7b8547c | 2011-11-16 22:39:56 +0000 | [diff] [blame] | 360 |  | 
| Akira Hatanaka | d8ab16b | 2012-06-14 21:03:23 +0000 | [diff] [blame] | 361 | def : MipsPat<(MipsLo tglobaladdr:$in), (DADDiu ZERO_64, tglobaladdr:$in)>; | 
|  | 362 | def : MipsPat<(MipsLo tblockaddress:$in), (DADDiu ZERO_64, tblockaddress:$in)>; | 
|  | 363 | def : MipsPat<(MipsLo tjumptable:$in), (DADDiu ZERO_64, tjumptable:$in)>; | 
|  | 364 | def : MipsPat<(MipsLo tconstpool:$in), (DADDiu ZERO_64, tconstpool:$in)>; | 
|  | 365 | def : MipsPat<(MipsLo tglobaltlsaddr:$in), | 
|  | 366 | (DADDiu ZERO_64, tglobaltlsaddr:$in)>; | 
| Akira Hatanaka | bb6e74a | 2012-11-21 20:40:38 +0000 | [diff] [blame] | 367 | def : MipsPat<(MipsLo texternalsym:$in), (DADDiu ZERO_64, texternalsym:$in)>; | 
| Akira Hatanaka | 7b8547c | 2011-11-16 22:39:56 +0000 | [diff] [blame] | 368 |  | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 369 | def : MipsPat<(add GPR64:$hi, (MipsLo tglobaladdr:$lo)), | 
|  | 370 | (DADDiu GPR64:$hi, tglobaladdr:$lo)>; | 
|  | 371 | def : MipsPat<(add GPR64:$hi, (MipsLo tblockaddress:$lo)), | 
|  | 372 | (DADDiu GPR64:$hi, tblockaddress:$lo)>; | 
|  | 373 | def : MipsPat<(add GPR64:$hi, (MipsLo tjumptable:$lo)), | 
|  | 374 | (DADDiu GPR64:$hi, tjumptable:$lo)>; | 
|  | 375 | def : MipsPat<(add GPR64:$hi, (MipsLo tconstpool:$lo)), | 
|  | 376 | (DADDiu GPR64:$hi, tconstpool:$lo)>; | 
|  | 377 | def : MipsPat<(add GPR64:$hi, (MipsLo tglobaltlsaddr:$lo)), | 
|  | 378 | (DADDiu GPR64:$hi, tglobaltlsaddr:$lo)>; | 
| Akira Hatanaka | f75add6 | 2011-10-11 18:53:46 +0000 | [diff] [blame] | 379 |  | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 380 | def : WrapperPat<tglobaladdr, DADDiu, GPR64>; | 
|  | 381 | def : WrapperPat<tconstpool, DADDiu, GPR64>; | 
|  | 382 | def : WrapperPat<texternalsym, DADDiu, GPR64>; | 
|  | 383 | def : WrapperPat<tblockaddress, DADDiu, GPR64>; | 
|  | 384 | def : WrapperPat<tjumptable, DADDiu, GPR64>; | 
|  | 385 | def : WrapperPat<tglobaltlsaddr, DADDiu, GPR64>; | 
| Akira Hatanaka | b2e05cb | 2011-12-07 22:11:43 +0000 | [diff] [blame] | 386 |  | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 387 | defm : BrcondPats<GPR64, BEQ64, BNE64, SLT64, SLTu64, SLTi64, SLTiu64, | 
| Akira Hatanaka | 7148bce | 2011-10-11 19:09:09 +0000 | [diff] [blame] | 388 | ZERO_64>; | 
|  | 389 |  | 
| Akira Hatanaka | 6871031 | 2013-05-21 17:13:47 +0000 | [diff] [blame] | 390 | def : MipsPat<(brcond (i32 (setlt i64:$lhs, 1)), bb:$dst), | 
|  | 391 | (BLEZ64 i64:$lhs, bb:$dst)>; | 
|  | 392 | def : MipsPat<(brcond (i32 (setgt i64:$lhs, -1)), bb:$dst), | 
|  | 393 | (BGEZ64 i64:$lhs, bb:$dst)>; | 
|  | 394 |  | 
| Akira Hatanaka | f75add6 | 2011-10-11 18:53:46 +0000 | [diff] [blame] | 395 | // setcc patterns | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 396 | defm : SeteqPats<GPR64, SLTiu64, XOR64, SLTu64, ZERO_64>; | 
|  | 397 | defm : SetlePats<GPR64, SLT64, SLTu64>; | 
|  | 398 | defm : SetgtPats<GPR64, SLT64, SLTu64>; | 
|  | 399 | defm : SetgePats<GPR64, SLT64, SLTu64>; | 
|  | 400 | defm : SetgeImmPats<GPR64, SLTi64, SLTiu64>; | 
| Akira Hatanaka | d5c1329 | 2011-11-07 18:57:41 +0000 | [diff] [blame] | 401 |  | 
|  | 402 | // truncate | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 403 | def : MipsPat<(i32 (trunc GPR64:$src)), | 
| Daniel Sanders | 3dc2c01 | 2014-05-07 10:27:09 +0000 | [diff] [blame] | 404 | (SLL (EXTRACT_SUBREG GPR64:$src, sub_32), 0)>; | 
| Jia Liu | f54f60f | 2012-02-28 07:46:26 +0000 | [diff] [blame] | 405 |  | 
| Akira Hatanaka | ae378af | 2011-12-07 23:14:41 +0000 | [diff] [blame] | 406 | // 32-to-64-bit extension | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 407 | def : MipsPat<(i64 (anyext GPR32:$src)), (SLL64_32 GPR32:$src)>; | 
|  | 408 | def : MipsPat<(i64 (zext GPR32:$src)), (DSRL (DSLL64_32 GPR32:$src), 32)>; | 
|  | 409 | def : MipsPat<(i64 (sext GPR32:$src)), (SLL64_32 GPR32:$src)>; | 
| Akira Hatanaka | 4e21069 | 2011-12-20 22:06:20 +0000 | [diff] [blame] | 410 |  | 
| Akira Hatanaka | 494fdf1 | 2011-12-20 22:40:40 +0000 | [diff] [blame] | 411 | // Sign extend in register | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 412 | def : MipsPat<(i64 (sext_inreg GPR64:$src, i32)), | 
|  | 413 | (SLL64_64 GPR64:$src)>; | 
| Akira Hatanaka | 494fdf1 | 2011-12-20 22:40:40 +0000 | [diff] [blame] | 414 |  | 
| Akira Hatanaka | d8ab16b | 2012-06-14 21:03:23 +0000 | [diff] [blame] | 415 | // bswap MipsPattern | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 416 | def : MipsPat<(bswap GPR64:$rt), (DSHD (DSBH GPR64:$rt))>; | 
| David Chisnall | 3705125 | 2012-10-09 16:27:43 +0000 | [diff] [blame] | 417 |  | 
|  | 418 | //===----------------------------------------------------------------------===// | 
|  | 419 | // Instruction aliases | 
|  | 420 | //===----------------------------------------------------------------------===// | 
| Jack Carter | 9c1a027 | 2013-02-05 08:32:10 +0000 | [diff] [blame] | 421 | def : InstAlias<"move $dst, $src", | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 422 | (DADDu GPR64Opnd:$dst,  GPR64Opnd:$src, ZERO_64), 1>, | 
| Daniel Sanders | 77277ea | 2014-04-10 15:00:28 +0000 | [diff] [blame] | 423 | Requires<[IsGP64]>; | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 424 | def : InstAlias<"daddu $rs, $rt, $imm", | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 425 | (DADDiu GPR64Opnd:$rs, GPR64Opnd:$rt, simm16_64:$imm), | 
| Akira Hatanaka | e2a39e7 | 2013-08-06 22:35:29 +0000 | [diff] [blame] | 426 | 0>; | 
| Jack Carter | 873c724 | 2013-01-12 01:03:14 +0000 | [diff] [blame] | 427 | def : InstAlias<"dadd $rs, $rt, $imm", | 
| Akira Hatanaka | 13e6ccf | 2013-08-06 23:08:38 +0000 | [diff] [blame] | 428 | (DADDi GPR64Opnd:$rs, GPR64Opnd:$rt, simm16_64:$imm), | 
| Akira Hatanaka | e2a39e7 | 2013-08-06 22:35:29 +0000 | [diff] [blame] | 429 | 0>; | 
| Daniel Sanders | a771fef | 2014-03-24 14:05:39 +0000 | [diff] [blame] | 430 | def : InstAlias<"daddu $rs, $imm", | 
|  | 431 | (DADDiu GPR64Opnd:$rs, GPR64Opnd:$rs, simm16_64:$imm), | 
|  | 432 | 0>; | 
|  | 433 | def : InstAlias<"dadd $rs, $imm", | 
|  | 434 | (DADDi GPR64Opnd:$rs, GPR64Opnd:$rs, simm16_64:$imm), | 
|  | 435 | 0>; | 
| Daniel Sanders | a771fef | 2014-03-24 14:05:39 +0000 | [diff] [blame] | 436 | def : InstAlias<"add $rs, $imm", | 
|  | 437 | (ADDi GPR32Opnd:$rs, GPR32Opnd:$rs, simm16:$imm), | 
|  | 438 | 0>; | 
|  | 439 | def : InstAlias<"addu $rs, $imm", | 
|  | 440 | (ADDiu GPR32Opnd:$rs, GPR32Opnd:$rs, simm16:$imm), | 
|  | 441 | 0>; | 
| Matheus Almeida | 56df6ff | 2014-04-30 16:00:49 +0000 | [diff] [blame] | 442 | def : InstAlias<"dsll $rd, $rt, $rs", | 
|  | 443 | (DSLLV GPR64Opnd:$rd, GPR64Opnd:$rt, GPR32Opnd:$rs), 0>; | 
| Daniel Sanders | 01f9fc0 | 2014-03-24 15:38:00 +0000 | [diff] [blame] | 444 | def : InstAlias<"dsubu $rt, $rs, $imm", | 
| Vladimir Medic | 16d671a | 2014-04-15 10:14:49 +0000 | [diff] [blame] | 445 | (DADDiu GPR64Opnd:$rt, GPR64Opnd:$rs, | 
|  | 446 | InvertedImOperand64: $imm),0>; | 
| Daniel Sanders | a771fef | 2014-03-24 14:05:39 +0000 | [diff] [blame] | 447 | def : InstAlias<"dsub $rs, $imm", | 
| Vladimir Medic | 16d671a | 2014-04-15 10:14:49 +0000 | [diff] [blame] | 448 | (DADDi GPR64Opnd:$rs, GPR64Opnd:$rs, InvertedImOperand64:$imm), | 
| Daniel Sanders | a771fef | 2014-03-24 14:05:39 +0000 | [diff] [blame] | 449 | 0>; | 
|  | 450 | def : InstAlias<"dsubu $rs, $imm", | 
| Vladimir Medic | 16d671a | 2014-04-15 10:14:49 +0000 | [diff] [blame] | 451 | (DADDiu GPR64Opnd:$rs, GPR64Opnd:$rs, InvertedImOperand64:$imm), | 
| Daniel Sanders | a771fef | 2014-03-24 14:05:39 +0000 | [diff] [blame] | 452 | 0>; | 
| Matheus Almeida | 56df6ff | 2014-04-30 16:00:49 +0000 | [diff] [blame] | 453 | def : InstAlias<"dsrl $rd, $rt, $rs", | 
|  | 454 | (DSRLV GPR64Opnd:$rd, GPR64Opnd:$rt, GPR32Opnd:$rs), 0>; | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 455 |  | 
| Jack Carter | 51785c4 | 2013-05-16 19:40:19 +0000 | [diff] [blame] | 456 | /// Move between CPU and coprocessor registers | 
| Akira Hatanaka | 37e9b0d | 2013-08-28 00:42:50 +0000 | [diff] [blame] | 457 | let DecoderNamespace = "Mips64", Predicates = [HasMips64] in { | 
|  | 458 | def DMFC0 : MFC3OP<"dmfc0", GPR64Opnd>, MFC3OP_FM<0x10, 1>; | 
|  | 459 | def DMTC0 : MFC3OP<"dmtc0", GPR64Opnd>, MFC3OP_FM<0x10, 5>; | 
|  | 460 | def DMFC2 : MFC3OP<"dmfc2", GPR64Opnd>, MFC3OP_FM<0x12, 1>; | 
|  | 461 | def DMTC2 : MFC3OP<"dmtc2", GPR64Opnd>, MFC3OP_FM<0x12, 5>; | 
| David Chisnall | 6a00ab4 | 2012-10-11 10:21:34 +0000 | [diff] [blame] | 462 | } | 
| Jack Carter | 86c2c56 | 2013-01-18 20:15:06 +0000 | [diff] [blame] | 463 |  | 
| David Chisnall | 6a00ab4 | 2012-10-11 10:21:34 +0000 | [diff] [blame] | 464 | // Two operand (implicit 0 selector) versions: | 
| Akira Hatanaka | 37e9b0d | 2013-08-28 00:42:50 +0000 | [diff] [blame] | 465 | def : InstAlias<"dmfc0 $rt, $rd", (DMFC0 GPR64Opnd:$rt, GPR64Opnd:$rd, 0), 0>; | 
|  | 466 | def : InstAlias<"dmtc0 $rt, $rd", (DMTC0 GPR64Opnd:$rt, GPR64Opnd:$rd, 0), 0>; | 
|  | 467 | def : InstAlias<"dmfc2 $rt, $rd", (DMFC2 GPR64Opnd:$rt, GPR64Opnd:$rd, 0), 0>; | 
|  | 468 | def : InstAlias<"dmtc2 $rt, $rd", (DMTC2 GPR64Opnd:$rt, GPR64Opnd:$rd, 0), 0>; | 
| David Chisnall | 6a00ab4 | 2012-10-11 10:21:34 +0000 | [diff] [blame] | 469 |  |