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