| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 1 | //===- MipsInstrFPU.td - Mips FPU Instruction Information --*- tablegen -*-===// | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 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 | // | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 8 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 9 | // | 
| Eric Christopher | 5dc19f9 | 2011-05-09 18:16:46 +0000 | [diff] [blame] | 10 | // This file describes the Mips FPU instruction set. | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 11 | // | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 12 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 13 |  | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 14 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | 7ceec57 | 2008-07-09 04:45:36 +0000 | [diff] [blame] | 15 | // Floating Point Instructions | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 16 | // ------------------------ | 
|  | 17 | // * 64bit fp: | 
|  | 18 | //    - 32 64-bit registers (default mode) | 
|  | 19 | //    - 16 even 32-bit registers (32-bit compatible mode) for | 
|  | 20 | //      single and double access. | 
|  | 21 | // * 32bit fp: | 
|  | 22 | //    - 16 even 32-bit registers - single and double (aliased) | 
|  | 23 | //    - 32 32-bit registers (within single-only mode) | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 24 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 25 |  | 
| Bruno Cardoso Lopes | 7ceec57 | 2008-07-09 04:45:36 +0000 | [diff] [blame] | 26 | // Floating Point Compare and Branch | 
| Akira Hatanaka | a535270 | 2011-03-31 18:26:17 +0000 | [diff] [blame] | 27 | def SDT_MipsFPBrcond : SDTypeProfile<0, 2, [SDTCisInt<0>, | 
|  | 28 | SDTCisVT<1, OtherVT>]>; | 
|  | 29 | def SDT_MipsFPCmp : SDTypeProfile<0, 3, [SDTCisSameAs<0, 1>, SDTCisFP<1>, | 
| Akira Hatanaka | f25c37e | 2011-09-22 23:31:54 +0000 | [diff] [blame] | 30 | SDTCisVT<2, i32>]>; | 
| Akira Hatanaka | a535270 | 2011-03-31 18:26:17 +0000 | [diff] [blame] | 31 | def SDT_MipsCMovFP : SDTypeProfile<1, 2, [SDTCisSameAs<0, 1>, | 
|  | 32 | SDTCisSameAs<1, 2>]>; | 
| Akira Hatanaka | 2791697 | 2011-04-15 19:52:08 +0000 | [diff] [blame] | 33 | def SDT_MipsBuildPairF64 : SDTypeProfile<1, 2, [SDTCisVT<0, f64>, | 
|  | 34 | SDTCisVT<1, i32>, | 
|  | 35 | SDTCisSameAs<1, 2>]>; | 
|  | 36 | def SDT_MipsExtractElementF64 : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, | 
|  | 37 | SDTCisVT<1, f64>, | 
| Akira Hatanaka | f25c37e | 2011-09-22 23:31:54 +0000 | [diff] [blame] | 38 | SDTCisVT<2, i32>]>; | 
| Bruno Cardoso Lopes | a72a505 | 2009-05-27 17:23:44 +0000 | [diff] [blame] | 39 |  | 
| Akira Hatanaka | a535270 | 2011-03-31 18:26:17 +0000 | [diff] [blame] | 40 | def MipsFPCmp : SDNode<"MipsISD::FPCmp", SDT_MipsFPCmp, [SDNPOutGlue]>; | 
|  | 41 | def MipsCMovFP_T : SDNode<"MipsISD::CMovFP_T", SDT_MipsCMovFP, [SDNPInGlue]>; | 
|  | 42 | def MipsCMovFP_F : SDNode<"MipsISD::CMovFP_F", SDT_MipsCMovFP, [SDNPInGlue]>; | 
| Bruno Cardoso Lopes | ed874ef | 2011-03-04 17:51:39 +0000 | [diff] [blame] | 43 | def MipsFPBrcond : SDNode<"MipsISD::FPBrcond", SDT_MipsFPBrcond, | 
| Akira Hatanaka | a535270 | 2011-03-31 18:26:17 +0000 | [diff] [blame] | 44 | [SDNPHasChain, SDNPOptInGlue]>; | 
| Akira Hatanaka | 2791697 | 2011-04-15 19:52:08 +0000 | [diff] [blame] | 45 | def MipsBuildPairF64 : SDNode<"MipsISD::BuildPairF64", SDT_MipsBuildPairF64>; | 
|  | 46 | def MipsExtractElementF64 : SDNode<"MipsISD::ExtractElementF64", | 
|  | 47 | SDT_MipsExtractElementF64>; | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 48 |  | 
|  | 49 | // Operand for printing out a condition code. | 
|  | 50 | let PrintMethod = "printFCCOperand" in | 
|  | 51 | def condcode : Operand<i32>; | 
|  | 52 |  | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 53 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 54 | // Feature predicates. | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 55 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 56 |  | 
| Akira Hatanaka | 6f37b4a | 2011-09-28 18:11:19 +0000 | [diff] [blame] | 57 | def IsFP64bit        : Predicate<"Subtarget.isFP64bit()">; | 
|  | 58 | def NotFP64bit       : Predicate<"!Subtarget.isFP64bit()">; | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 59 | def IsSingleFloat    : Predicate<"Subtarget.isSingleFloat()">; | 
|  | 60 | def IsNotSingleFloat : Predicate<"!Subtarget.isSingleFloat()">; | 
|  | 61 |  | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 62 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 63 | // Instruction Class Templates | 
|  | 64 | // | 
| Bruno Cardoso Lopes | ed874ef | 2011-03-04 17:51:39 +0000 | [diff] [blame] | 65 | // A set of multiclasses is used to address the register usage. | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 66 | // | 
| Jakob Stoklund Olesen | 6728958 | 2011-09-28 23:59:28 +0000 | [diff] [blame] | 67 | // S32 - single precision in 16 32bit even fp registers | 
| Bruno Cardoso Lopes | 9b9586a | 2009-03-21 00:05:07 +0000 | [diff] [blame] | 68 | //       single precision in 32 32bit fp registers in SingleOnly mode | 
| Jakob Stoklund Olesen | 6728958 | 2011-09-28 23:59:28 +0000 | [diff] [blame] | 69 | // S64 - single precision in 32 64bit fp registers (In64BitMode) | 
| Bruno Cardoso Lopes | 9b9586a | 2009-03-21 00:05:07 +0000 | [diff] [blame] | 70 | // D32 - double precision in 16 32bit even fp registers | 
|  | 71 | // D64 - double precision in 32 64bit fp registers (In64BitMode) | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 72 | // | 
| Jakob Stoklund Olesen | 6728958 | 2011-09-28 23:59:28 +0000 | [diff] [blame] | 73 | // Only S32 and D32 are supported right now. | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 74 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 75 |  | 
| Akira Hatanaka | b6d72cb | 2011-10-11 01:12:52 +0000 | [diff] [blame] | 76 | // FP load. | 
|  | 77 | class FPLoad<bits<6> op, string opstr, PatFrag FOp, RegisterClass RC, | 
|  | 78 | Operand MemOpnd>: | 
| Bruno Cardoso Lopes | 2312a3a | 2011-10-18 17:50:36 +0000 | [diff] [blame] | 79 | FMem<op, (outs RC:$ft), (ins MemOpnd:$addr), | 
|  | 80 | !strconcat(opstr, "\t$ft, $addr"), [(set RC:$ft, (FOp addr:$addr))], | 
|  | 81 | IILoad>; | 
| Akira Hatanaka | b6d72cb | 2011-10-11 01:12:52 +0000 | [diff] [blame] | 82 |  | 
|  | 83 | // FP store. | 
|  | 84 | class FPStore<bits<6> op, string opstr, PatFrag FOp, RegisterClass RC, | 
|  | 85 | Operand MemOpnd>: | 
| Bruno Cardoso Lopes | 2312a3a | 2011-10-18 17:50:36 +0000 | [diff] [blame] | 86 | FMem<op, (outs), (ins RC:$ft, MemOpnd:$addr), | 
|  | 87 | !strconcat(opstr, "\t$ft, $addr"), [(store RC:$ft, addr:$addr)], | 
|  | 88 | IIStore>; | 
| Akira Hatanaka | b6d72cb | 2011-10-11 01:12:52 +0000 | [diff] [blame] | 89 |  | 
| Akira Hatanaka | 13ae13b | 2011-10-08 03:19:38 +0000 | [diff] [blame] | 90 | // Instructions that convert an FP value to 32-bit fixed point. | 
|  | 91 | multiclass FFR1_W_M<bits<6> funct, string opstr> { | 
|  | 92 | def _S   : FFR1<funct, 16, opstr, "w.s", FGR32, FGR32>; | 
|  | 93 | def _D32 : FFR1<funct, 17, opstr, "w.d", FGR32, AFGR64>, | 
|  | 94 | Requires<[NotFP64bit]>; | 
|  | 95 | def _D64 : FFR1<funct, 17, opstr, "w.d", FGR32, FGR64>, | 
|  | 96 | Requires<[IsFP64bit]>; | 
|  | 97 | } | 
| Jakob Stoklund Olesen | 6728958 | 2011-09-28 23:59:28 +0000 | [diff] [blame] | 98 |  | 
| Akira Hatanaka | 13ae13b | 2011-10-08 03:19:38 +0000 | [diff] [blame] | 99 | // Instructions that convert an FP value to 64-bit fixed point. | 
|  | 100 | let Predicates = [IsFP64bit] in | 
|  | 101 | multiclass FFR1_L_M<bits<6> funct, string opstr> { | 
|  | 102 | def _S   : FFR1<funct, 16, opstr, "l.s", FGR64, FGR32>; | 
|  | 103 | def _D64 : FFR1<funct, 17, opstr, "l.d", FGR64, FGR64>; | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 104 | } | 
|  | 105 |  | 
| Akira Hatanaka | c7548de | 2011-10-08 03:29:22 +0000 | [diff] [blame] | 106 | // FP-to-FP conversion instructions. | 
|  | 107 | multiclass FFR1P_M<bits<6> funct, string opstr, SDNode OpNode> { | 
|  | 108 | def _S   : FFR1P<funct, 16, opstr, "s", FGR32, FGR32, OpNode>; | 
|  | 109 | def _D32 : FFR1P<funct, 17, opstr, "d", AFGR64, AFGR64, OpNode>, | 
|  | 110 | Requires<[NotFP64bit]>; | 
|  | 111 | def _D64 : FFR1P<funct, 17, opstr, "d", FGR64, FGR64, OpNode>, | 
|  | 112 | Requires<[IsFP64bit]>; | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 113 | } | 
|  | 114 |  | 
| Akira Hatanaka | 2365f90 | 2011-10-08 03:38:41 +0000 | [diff] [blame] | 115 | multiclass FFR2P_M<bits<6> funct, string opstr, SDNode OpNode, bit isComm = 0> { | 
| Jakob Stoklund Olesen | 6728958 | 2011-09-28 23:59:28 +0000 | [diff] [blame] | 116 | let isCommutable = isComm in { | 
| Akira Hatanaka | 2365f90 | 2011-10-08 03:38:41 +0000 | [diff] [blame] | 117 | def _S   : FFR2P<funct, 16, opstr, "s", FGR32, OpNode>; | 
|  | 118 | def _D32 : FFR2P<funct, 17, opstr, "d", AFGR64, OpNode>, | 
|  | 119 | Requires<[NotFP64bit]>; | 
|  | 120 | def _D64 : FFR2P<funct, 17, opstr, "d", FGR64, OpNode>, | 
|  | 121 | Requires<[IsFP64bit]>; | 
| Jakob Stoklund Olesen | 6728958 | 2011-09-28 23:59:28 +0000 | [diff] [blame] | 122 | } | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 123 | } | 
|  | 124 |  | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 125 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | 7ceec57 | 2008-07-09 04:45:36 +0000 | [diff] [blame] | 126 | // Floating Point Instructions | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 127 | //===----------------------------------------------------------------------===// | 
| Akira Hatanaka | 13ae13b | 2011-10-08 03:19:38 +0000 | [diff] [blame] | 128 | defm ROUND_W : FFR1_W_M<0xc, "round">; | 
|  | 129 | defm ROUND_L : FFR1_L_M<0x8, "round">; | 
|  | 130 | defm TRUNC_W : FFR1_W_M<0xd, "trunc">; | 
|  | 131 | defm TRUNC_L : FFR1_L_M<0x9, "trunc">; | 
|  | 132 | defm CEIL_W  : FFR1_W_M<0xe, "ceil">; | 
|  | 133 | defm CEIL_L  : FFR1_L_M<0xa, "ceil">; | 
|  | 134 | defm FLOOR_W : FFR1_W_M<0xf, "floor">; | 
|  | 135 | defm FLOOR_L : FFR1_L_M<0xb, "floor">; | 
|  | 136 | defm CVT_W   : FFR1_W_M<0x24, "cvt">; | 
|  | 137 | defm CVT_L   : FFR1_L_M<0x25, "cvt">; | 
|  | 138 |  | 
|  | 139 | def CVT_S_W : FFR1<0x20, 20, "cvt", "s.w", FGR32, FGR32>; | 
|  | 140 |  | 
|  | 141 | let Predicates = [NotFP64bit] in { | 
|  | 142 | def CVT_S_D32 : FFR1<0x20, 17, "cvt", "s.d", FGR32, AFGR64>; | 
|  | 143 | def CVT_D32_W : FFR1<0x21, 20, "cvt", "d.w", AFGR64, FGR32>; | 
|  | 144 | def CVT_D32_S : FFR1<0x21, 16, "cvt", "d.s", AFGR64, FGR32>; | 
|  | 145 | } | 
|  | 146 |  | 
|  | 147 | let Predicates = [IsFP64bit] in { | 
|  | 148 | def CVT_S_D64 : FFR1<0x20, 17, "cvt", "s.d", FGR32, FGR64>; | 
|  | 149 | def CVT_S_L   : FFR1<0x20, 21, "cvt", "s.l", FGR32, FGR64>; | 
|  | 150 | def CVT_D64_W : FFR1<0x21, 20, "cvt", "d.w", FGR64, FGR32>; | 
|  | 151 | def CVT_D64_S : FFR1<0x21, 16, "cvt", "d.s", FGR64, FGR32>; | 
|  | 152 | def CVT_D64_L : FFR1<0x21, 21, "cvt", "d.l", FGR64, FGR64>; | 
|  | 153 | } | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 154 |  | 
| Akira Hatanaka | c7548de | 2011-10-08 03:29:22 +0000 | [diff] [blame] | 155 | defm FABS    : FFR1P_M<0x5, "abs",  fabs>; | 
|  | 156 | defm FNEG    : FFR1P_M<0x7, "neg",  fneg>; | 
|  | 157 | defm FSQRT   : FFR1P_M<0x4, "sqrt", fsqrt>; | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 158 |  | 
|  | 159 | // The odd-numbered registers are only referenced when doing loads, | 
|  | 160 | // stores, and moves between floating-point and integer registers. | 
| Bruno Cardoso Lopes | ed874ef | 2011-03-04 17:51:39 +0000 | [diff] [blame] | 161 | // When defining instructions, we reference all 32-bit registers, | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 162 | // regardless of register aliasing. | 
| Bruno Cardoso Lopes | 2312a3a | 2011-10-18 17:50:36 +0000 | [diff] [blame] | 163 |  | 
|  | 164 | class FFRGPR<bits<5> _fmt, dag outs, dag ins, string asmstr, list<dag> pattern>: | 
|  | 165 | FFR<0x11, 0x0, _fmt, outs, ins, asmstr, pattern> { | 
|  | 166 | bits<5> rt; | 
|  | 167 | let ft = rt; | 
|  | 168 | let fd = 0; | 
|  | 169 | } | 
|  | 170 |  | 
|  | 171 | /// Move Control Registers From/To CPU Registers | 
|  | 172 | def CFC1  : FFRGPR<0x2, (outs CPURegs:$rt), (ins CCR:$fs), | 
| Akira Hatanaka | dde4aac | 2011-06-07 18:16:51 +0000 | [diff] [blame] | 173 | "cfc1\t$rt, $fs", []>; | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 174 |  | 
| Bruno Cardoso Lopes | 2312a3a | 2011-10-18 17:50:36 +0000 | [diff] [blame] | 175 | def CTC1  : FFRGPR<0x6, (outs CCR:$fs), (ins CPURegs:$rt), | 
|  | 176 | "ctc1\t$rt, $fs", []>; | 
| Bruno Cardoso Lopes | ed874ef | 2011-03-04 17:51:39 +0000 | [diff] [blame] | 177 |  | 
| Bruno Cardoso Lopes | 2312a3a | 2011-10-18 17:50:36 +0000 | [diff] [blame] | 178 | def MFC1  : FFRGPR<0x00, (outs CPURegs:$rt), (ins FGR32:$fs), | 
| Akira Hatanaka | a5d18f2 | 2011-09-27 22:01:01 +0000 | [diff] [blame] | 179 | "mfc1\t$rt, $fs", | 
|  | 180 | [(set CPURegs:$rt, (bitconvert FGR32:$fs))]>; | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 181 |  | 
| Bruno Cardoso Lopes | 2312a3a | 2011-10-18 17:50:36 +0000 | [diff] [blame] | 182 | def MTC1  : FFRGPR<0x04, (outs FGR32:$fs), (ins CPURegs:$rt), | 
| Akira Hatanaka | a5d18f2 | 2011-09-27 22:01:01 +0000 | [diff] [blame] | 183 | "mtc1\t$rt, $fs", | 
|  | 184 | [(set FGR32:$fs, (bitconvert CPURegs:$rt))]>; | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 185 |  | 
| Akira Hatanaka | 1537e29 | 2011-11-07 21:32:58 +0000 | [diff] [blame] | 186 | def DMFC1 : FFRGPR<0x01, (outs CPU64Regs:$rt), (ins FGR64:$fs), | 
|  | 187 | "dmfc1\t$rt, $fs", | 
|  | 188 | [(set CPU64Regs:$rt, (bitconvert FGR64:$fs))]>; | 
|  | 189 |  | 
|  | 190 | def DMTC1 : FFRGPR<0x05, (outs FGR64:$fs), (ins CPU64Regs:$rt), | 
|  | 191 | "dmtc1\t$rt, $fs", | 
|  | 192 | [(set FGR64:$fs, (bitconvert CPU64Regs:$rt))]>; | 
|  | 193 |  | 
| Akira Hatanaka | 6be7d6c | 2011-10-08 03:50:18 +0000 | [diff] [blame] | 194 | def FMOV_S   : FFR1<0x6, 16, "mov", "s", FGR32, FGR32>; | 
|  | 195 | def FMOV_D32 : FFR1<0x6, 17, "mov", "d", AFGR64, AFGR64>, | 
|  | 196 | Requires<[NotFP64bit]>; | 
|  | 197 | def FMOV_D64 : FFR1<0x6, 17, "mov", "d", FGR64, FGR64>, | 
|  | 198 | Requires<[IsFP64bit]>; | 
| Bruno Cardoso Lopes | 7ee7191 | 2010-01-30 18:29:19 +0000 | [diff] [blame] | 199 |  | 
| Bruno Cardoso Lopes | 7ceec57 | 2008-07-09 04:45:36 +0000 | [diff] [blame] | 200 | /// Floating Point Memory Instructions | 
| Akira Hatanaka | b6d72cb | 2011-10-11 01:12:52 +0000 | [diff] [blame] | 201 | let Predicates = [IsN64] in { | 
|  | 202 | def LWC1_P8   : FPLoad<0x31, "lwc1", load, FGR32, mem64>; | 
|  | 203 | def SWC1_P8   : FPStore<0x39, "swc1", store, FGR32, mem64>; | 
|  | 204 | def LDC164_P8 : FPLoad<0x35, "ldc1", load, FGR64, mem64>; | 
|  | 205 | def SDC164_P8 : FPStore<0x3d, "sdc1", store, FGR64, mem64>; | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 206 | } | 
|  | 207 |  | 
| Akira Hatanaka | b6d72cb | 2011-10-11 01:12:52 +0000 | [diff] [blame] | 208 | let Predicates = [NotN64] in { | 
|  | 209 | def LWC1   : FPLoad<0x31, "lwc1", load, FGR32, mem>; | 
|  | 210 | def SWC1   : FPStore<0x39, "swc1", store, FGR32, mem>; | 
|  | 211 | let Predicates = [HasMips64] in { | 
|  | 212 | def LDC164 : FPLoad<0x35, "ldc1", load, FGR64, mem>; | 
|  | 213 | def SDC164 : FPStore<0x3d, "sdc1", store, FGR64, mem>; | 
|  | 214 | } | 
|  | 215 | let Predicates = [NotMips64] in { | 
|  | 216 | def LDC1   : FPLoad<0x35, "ldc1", load, AFGR64, mem>; | 
|  | 217 | def SDC1   : FPStore<0x3d, "sdc1", store, AFGR64, mem>; | 
|  | 218 | } | 
|  | 219 | } | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 220 |  | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 221 | /// Floating-point Aritmetic | 
| Bruno Cardoso Lopes | 2312a3a | 2011-10-18 17:50:36 +0000 | [diff] [blame] | 222 | defm FADD : FFR2P_M<0x00, "add", fadd, 1>; | 
| Akira Hatanaka | 2365f90 | 2011-10-08 03:38:41 +0000 | [diff] [blame] | 223 | defm FDIV : FFR2P_M<0x03, "div", fdiv>; | 
|  | 224 | defm FMUL : FFR2P_M<0x02, "mul", fmul, 1>; | 
|  | 225 | defm FSUB : FFR2P_M<0x01, "sub", fsub>; | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 226 |  | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 227 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | 7ceec57 | 2008-07-09 04:45:36 +0000 | [diff] [blame] | 228 | // Floating Point Branch Codes | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 229 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | ed874ef | 2011-03-04 17:51:39 +0000 | [diff] [blame] | 230 | // Mips branch codes. These correspond to condcode in MipsInstrInfo.h. | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 231 | // They must be kept in synch. | 
|  | 232 | def MIPS_BRANCH_F  : PatLeaf<(i32 0)>; | 
|  | 233 | def MIPS_BRANCH_T  : PatLeaf<(i32 1)>; | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 234 |  | 
| Bruno Cardoso Lopes | 7ceec57 | 2008-07-09 04:45:36 +0000 | [diff] [blame] | 235 | /// Floating Point Branch of False/True (Likely) | 
| Akira Hatanaka | a535270 | 2011-03-31 18:26:17 +0000 | [diff] [blame] | 236 | let isBranch=1, isTerminator=1, hasDelaySlot=1, base=0x8, Uses=[FCR31] in | 
| Bruno Cardoso Lopes | 2312a3a | 2011-10-18 17:50:36 +0000 | [diff] [blame] | 237 | class FBRANCH<bits<1> nd, bits<1> tf, PatLeaf op, string asmstr> : | 
|  | 238 | FFI<0x11, (outs), (ins brtarget:$dst), !strconcat(asmstr, "\t$dst"), | 
|  | 239 | [(MipsFPBrcond op, bb:$dst)]> { | 
|  | 240 | let Inst{20-18} = 0; | 
|  | 241 | let Inst{17} = nd; | 
|  | 242 | let Inst{16} = tf; | 
|  | 243 | } | 
| Akira Hatanaka | a535270 | 2011-03-31 18:26:17 +0000 | [diff] [blame] | 244 |  | 
| Bruno Cardoso Lopes | 2312a3a | 2011-10-18 17:50:36 +0000 | [diff] [blame] | 245 | def BC1F  : FBRANCH<0, 0, MIPS_BRANCH_F,  "bc1f">; | 
|  | 246 | def BC1T  : FBRANCH<0, 1, MIPS_BRANCH_T,  "bc1t">; | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 247 |  | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 248 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | 7ceec57 | 2008-07-09 04:45:36 +0000 | [diff] [blame] | 249 | // Floating Point Flag Conditions | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 250 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | ed874ef | 2011-03-04 17:51:39 +0000 | [diff] [blame] | 251 | // Mips condition codes. They must correspond to condcode in MipsInstrInfo.h. | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 252 | // They must be kept in synch. | 
|  | 253 | def MIPS_FCOND_F    : PatLeaf<(i32 0)>; | 
|  | 254 | def MIPS_FCOND_UN   : PatLeaf<(i32 1)>; | 
| Akira Hatanaka | a535270 | 2011-03-31 18:26:17 +0000 | [diff] [blame] | 255 | def MIPS_FCOND_OEQ  : PatLeaf<(i32 2)>; | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 256 | def MIPS_FCOND_UEQ  : PatLeaf<(i32 3)>; | 
|  | 257 | def MIPS_FCOND_OLT  : PatLeaf<(i32 4)>; | 
|  | 258 | def MIPS_FCOND_ULT  : PatLeaf<(i32 5)>; | 
|  | 259 | def MIPS_FCOND_OLE  : PatLeaf<(i32 6)>; | 
|  | 260 | def MIPS_FCOND_ULE  : PatLeaf<(i32 7)>; | 
|  | 261 | def MIPS_FCOND_SF   : PatLeaf<(i32 8)>; | 
|  | 262 | def MIPS_FCOND_NGLE : PatLeaf<(i32 9)>; | 
|  | 263 | def MIPS_FCOND_SEQ  : PatLeaf<(i32 10)>; | 
|  | 264 | def MIPS_FCOND_NGL  : PatLeaf<(i32 11)>; | 
|  | 265 | def MIPS_FCOND_LT   : PatLeaf<(i32 12)>; | 
|  | 266 | def MIPS_FCOND_NGE  : PatLeaf<(i32 13)>; | 
|  | 267 | def MIPS_FCOND_LE   : PatLeaf<(i32 14)>; | 
|  | 268 | def MIPS_FCOND_NGT  : PatLeaf<(i32 15)>; | 
|  | 269 |  | 
| Akira Hatanaka | b2d3776 | 2011-11-07 21:37:33 +0000 | [diff] [blame] | 270 | class FCMP<bits<5> fmt, RegisterClass RC, string typestr> : | 
|  | 271 | FCC<fmt, (outs), (ins RC:$fs, RC:$ft, condcode:$cc), | 
|  | 272 | !strconcat("c.$cc.", typestr, "\t$fs, $ft"), | 
|  | 273 | [(MipsFPCmp RC:$fs, RC:$ft, imm:$cc)]>; | 
|  | 274 |  | 
| Bruno Cardoso Lopes | c9c3f49 | 2008-07-05 19:05:21 +0000 | [diff] [blame] | 275 | /// Floating Point Compare | 
| Akira Hatanaka | 4444dae | 2011-09-09 20:45:50 +0000 | [diff] [blame] | 276 | let Defs=[FCR31] in { | 
| Akira Hatanaka | b2d3776 | 2011-11-07 21:37:33 +0000 | [diff] [blame] | 277 | def FCMP_S32 : FCMP<0x10, FGR32, "s">; | 
|  | 278 | def FCMP_D32 : FCMP<0x11, AFGR64, "d">, Requires<[NotFP64bit]>; | 
|  | 279 | def FCMP_D64 : FCMP<0x11, FGR64, "d">, Requires<[IsFP64bit]>; | 
| Akira Hatanaka | a535270 | 2011-03-31 18:26:17 +0000 | [diff] [blame] | 280 | } | 
|  | 281 |  | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 282 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | e683bba | 2008-07-29 19:05:28 +0000 | [diff] [blame] | 283 | // Floating Point Pseudo-Instructions | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 284 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | ed874ef | 2011-03-04 17:51:39 +0000 | [diff] [blame] | 285 | def MOVCCRToCCR : MipsPseudo<(outs CCR:$dst), (ins CCR:$src), | 
|  | 286 | "# MOVCCRToCCR", []>; | 
| Bruno Cardoso Lopes | a72a505 | 2009-05-27 17:23:44 +0000 | [diff] [blame] | 287 |  | 
| Akira Hatanaka | 2791697 | 2011-04-15 19:52:08 +0000 | [diff] [blame] | 288 | // This pseudo instr gets expanded into 2 mtc1 instrs after register | 
|  | 289 | // allocation. | 
|  | 290 | def BuildPairF64 : | 
|  | 291 | MipsPseudo<(outs AFGR64:$dst), | 
|  | 292 | (ins CPURegs:$lo, CPURegs:$hi), "", | 
|  | 293 | [(set AFGR64:$dst, (MipsBuildPairF64 CPURegs:$lo, CPURegs:$hi))]>; | 
|  | 294 |  | 
|  | 295 | // This pseudo instr gets expanded into 2 mfc1 instrs after register | 
|  | 296 | // allocation. | 
|  | 297 | // if n is 0, lower part of src is extracted. | 
|  | 298 | // if n is 1, higher part of src is extracted. | 
|  | 299 | def ExtractElementF64 : | 
|  | 300 | MipsPseudo<(outs CPURegs:$dst), | 
|  | 301 | (ins AFGR64:$src, i32imm:$n), "", | 
|  | 302 | [(set CPURegs:$dst, | 
|  | 303 | (MipsExtractElementF64 AFGR64:$src, imm:$n))]>; | 
|  | 304 |  | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 305 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | 7ceec57 | 2008-07-09 04:45:36 +0000 | [diff] [blame] | 306 | // Floating Point Patterns | 
| Akira Hatanaka | e248912 | 2011-04-15 21:51:11 +0000 | [diff] [blame] | 307 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | 2d7ddea | 2008-07-30 19:00:31 +0000 | [diff] [blame] | 308 | def fpimm0 : PatLeaf<(fpimm), [{ | 
| Bruno Cardoso Lopes | 626d49f | 2009-11-11 23:09:33 +0000 | [diff] [blame] | 309 | return N->isExactlyValue(+0.0); | 
|  | 310 | }]>; | 
|  | 311 |  | 
|  | 312 | def fpimm0neg : PatLeaf<(fpimm), [{ | 
|  | 313 | return N->isExactlyValue(-0.0); | 
| Bruno Cardoso Lopes | 2d7ddea | 2008-07-30 19:00:31 +0000 | [diff] [blame] | 314 | }]>; | 
|  | 315 |  | 
| Bruno Cardoso Lopes | 9b9586a | 2009-03-21 00:05:07 +0000 | [diff] [blame] | 316 | def : Pat<(f32 fpimm0), (MTC1 ZERO)>; | 
| Akira Hatanaka | c7548de | 2011-10-08 03:29:22 +0000 | [diff] [blame] | 317 | def : Pat<(f32 fpimm0neg), (FNEG_S (MTC1 ZERO))>; | 
| Bruno Cardoso Lopes | 2d7ddea | 2008-07-30 19:00:31 +0000 | [diff] [blame] | 318 |  | 
| Akira Hatanaka | 13ae13b | 2011-10-08 03:19:38 +0000 | [diff] [blame] | 319 | def : Pat<(f32 (sint_to_fp CPURegs:$src)), (CVT_S_W (MTC1 CPURegs:$src))>; | 
| Akira Hatanaka | 13ae13b | 2011-10-08 03:19:38 +0000 | [diff] [blame] | 320 | def : Pat<(i32 (fp_to_sint FGR32:$src)), (MFC1 (TRUNC_W_S FGR32:$src))>; | 
| Bruno Cardoso Lopes | 2d7ddea | 2008-07-30 19:00:31 +0000 | [diff] [blame] | 321 |  | 
| Akira Hatanaka | 6f37b4a | 2011-09-28 18:11:19 +0000 | [diff] [blame] | 322 | let Predicates = [NotFP64bit] in { | 
| Akira Hatanaka | 2216f73 | 2011-11-07 21:38:58 +0000 | [diff] [blame] | 323 | def : Pat<(f64 (sint_to_fp CPURegs:$src)), (CVT_D32_W (MTC1 CPURegs:$src))>; | 
|  | 324 | def : Pat<(i32 (fp_to_sint AFGR64:$src)), (MFC1 (TRUNC_W_D32 AFGR64:$src))>; | 
| Akira Hatanaka | 13ae13b | 2011-10-08 03:19:38 +0000 | [diff] [blame] | 325 | def : Pat<(f32 (fround AFGR64:$src)), (CVT_S_D32 AFGR64:$src)>; | 
|  | 326 | def : Pat<(f64 (fextend FGR32:$src)), (CVT_D32_S FGR32:$src)>; | 
| Bruno Cardoso Lopes | a72a505 | 2009-05-27 17:23:44 +0000 | [diff] [blame] | 327 | } | 
|  | 328 |  | 
| Akira Hatanaka | 2216f73 | 2011-11-07 21:38:58 +0000 | [diff] [blame] | 329 | let Predicates = [IsFP64bit] in { | 
|  | 330 | def : Pat<(f64 fpimm0), (DMTC1 ZERO_64)>; | 
|  | 331 | def : Pat<(f64 fpimm0neg), (FNEG_D64 (DMTC1 ZERO_64))>; | 
|  | 332 |  | 
|  | 333 | def : Pat<(f64 (sint_to_fp CPURegs:$src)), (CVT_D64_W (MTC1 CPURegs:$src))>; | 
|  | 334 | def : Pat<(f32 (sint_to_fp CPU64Regs:$src)), | 
|  | 335 | (CVT_S_L (DMTC1 CPU64Regs:$src))>; | 
|  | 336 | def : Pat<(f64 (sint_to_fp CPU64Regs:$src)), | 
|  | 337 | (CVT_D64_L (DMTC1 CPU64Regs:$src))>; | 
|  | 338 |  | 
|  | 339 | def : Pat<(i32 (fp_to_sint FGR64:$src)), (MFC1 (TRUNC_W_D64 FGR64:$src))>; | 
| Akira Hatanaka | 77dbd78 | 2012-01-24 22:05:25 +0000 | [diff] [blame^] | 340 | def : Pat<(i64 (fp_to_sint FGR32:$src)), (DMFC1 (TRUNC_L_S FGR32:$src))>; | 
| Akira Hatanaka | 2216f73 | 2011-11-07 21:38:58 +0000 | [diff] [blame] | 341 | def : Pat<(i64 (fp_to_sint FGR64:$src)), (DMFC1 (TRUNC_L_D64 FGR64:$src))>; | 
|  | 342 |  | 
|  | 343 | def : Pat<(f32 (fround FGR64:$src)), (CVT_S_D64 FGR64:$src)>; | 
|  | 344 | def : Pat<(f64 (fextend FGR32:$src)), (CVT_D64_S FGR32:$src)>; | 
|  | 345 | } |