| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 1 | //===- SparcInstrInfo.td - Target Description for Sparc Target ------------===// | 
|  | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
| Chris Lattner | f3ebc3f | 2007-12-29 20:36:04 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 | // | 
|  | 10 | // This file describes the Sparc instructions in TableGen format. | 
|  | 11 | // | 
|  | 12 | //===----------------------------------------------------------------------===// | 
|  | 13 |  | 
|  | 14 | //===----------------------------------------------------------------------===// | 
|  | 15 | // Instruction format superclass | 
|  | 16 | //===----------------------------------------------------------------------===// | 
|  | 17 |  | 
|  | 18 | include "SparcInstrFormats.td" | 
|  | 19 |  | 
|  | 20 | //===----------------------------------------------------------------------===// | 
|  | 21 | // Feature predicates. | 
|  | 22 | //===----------------------------------------------------------------------===// | 
|  | 23 |  | 
|  | 24 | // HasV9 - This predicate is true when the target processor supports V9 | 
|  | 25 | // instructions.  Note that the machine may be running in 32-bit mode. | 
|  | 26 | def HasV9   : Predicate<"Subtarget.isV9()">; | 
|  | 27 |  | 
|  | 28 | // HasNoV9 - This predicate is true when the target doesn't have V9 | 
|  | 29 | // instructions.  Use of this is just a hack for the isel not having proper | 
|  | 30 | // costs for V8 instructions that are more expensive than their V9 ones. | 
|  | 31 | def HasNoV9 : Predicate<"!Subtarget.isV9()">; | 
|  | 32 |  | 
|  | 33 | // HasVIS - This is true when the target processor has VIS extensions. | 
|  | 34 | def HasVIS : Predicate<"Subtarget.isVIS()">; | 
|  | 35 |  | 
|  | 36 | // UseDeprecatedInsts - This predicate is true when the target processor is a | 
|  | 37 | // V8, or when it is V9 but the V8 deprecated instructions are efficient enough | 
|  | 38 | // to use when appropriate.  In either of these cases, the instruction selector | 
|  | 39 | // will pick deprecated instructions. | 
|  | 40 | def UseDeprecatedInsts : Predicate<"Subtarget.useDeprecatedV8Instructions()">; | 
|  | 41 |  | 
|  | 42 | //===----------------------------------------------------------------------===// | 
|  | 43 | // Instruction Pattern Stuff | 
|  | 44 | //===----------------------------------------------------------------------===// | 
|  | 45 |  | 
| Jakob Stoklund Olesen | f02b4a6 | 2010-08-17 18:17:12 +0000 | [diff] [blame] | 46 | def simm11  : PatLeaf<(imm), [{ return isInt<11>(N->getSExtValue()); }]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 47 |  | 
| Jakob Stoklund Olesen | f02b4a6 | 2010-08-17 18:17:12 +0000 | [diff] [blame] | 48 | def simm13  : PatLeaf<(imm), [{ return isInt<13>(N->getSExtValue()); }]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 49 |  | 
|  | 50 | def LO10 : SDNodeXForm<imm, [{ | 
| Dan Gohman | effb894 | 2008-09-12 16:56:44 +0000 | [diff] [blame] | 51 | return CurDAG->getTargetConstant((unsigned)N->getZExtValue() & 1023, | 
| Owen Anderson | 9f94459 | 2009-08-11 20:47:22 +0000 | [diff] [blame] | 52 | MVT::i32); | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 53 | }]>; | 
|  | 54 |  | 
|  | 55 | def HI22 : SDNodeXForm<imm, [{ | 
|  | 56 | // Transformation function: shift the immediate value down into the low bits. | 
| Owen Anderson | 9f94459 | 2009-08-11 20:47:22 +0000 | [diff] [blame] | 57 | return CurDAG->getTargetConstant((unsigned)N->getZExtValue() >> 10, MVT::i32); | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 58 | }]>; | 
|  | 59 |  | 
|  | 60 | def SETHIimm : PatLeaf<(imm), [{ | 
| Dan Gohman | effb894 | 2008-09-12 16:56:44 +0000 | [diff] [blame] | 61 | return (((unsigned)N->getZExtValue() >> 10) << 10) == | 
|  | 62 | (unsigned)N->getZExtValue(); | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 63 | }], HI22>; | 
|  | 64 |  | 
|  | 65 | // Addressing modes. | 
| Evan Cheng | 577ef76 | 2006-10-11 21:03:53 +0000 | [diff] [blame] | 66 | def ADDRrr : ComplexPattern<i32, 2, "SelectADDRrr", [], []>; | 
|  | 67 | def ADDRri : ComplexPattern<i32, 2, "SelectADDRri", [frameindex], []>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 68 |  | 
|  | 69 | // Address operands | 
|  | 70 | def MEMrr : Operand<i32> { | 
|  | 71 | let PrintMethod = "printMemOperand"; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 72 | let MIOperandInfo = (ops IntRegs, IntRegs); | 
|  | 73 | } | 
|  | 74 | def MEMri : Operand<i32> { | 
|  | 75 | let PrintMethod = "printMemOperand"; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 76 | let MIOperandInfo = (ops IntRegs, i32imm); | 
|  | 77 | } | 
|  | 78 |  | 
|  | 79 | // Branch targets have OtherVT type. | 
|  | 80 | def brtarget : Operand<OtherVT>; | 
|  | 81 | def calltarget : Operand<i32>; | 
|  | 82 |  | 
|  | 83 | // Operand for printing out a condition code. | 
|  | 84 | let PrintMethod = "printCCOperand" in | 
|  | 85 | def CCOp : Operand<i32>; | 
|  | 86 |  | 
|  | 87 | def SDTSPcmpfcc : | 
| Chris Lattner | 0c4dea4 | 2006-02-10 06:58:25 +0000 | [diff] [blame] | 88 | SDTypeProfile<0, 2, [SDTCisFP<0>, SDTCisSameAs<0, 1>]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 89 | def SDTSPbrcc : | 
| Chris Lattner | 0c4dea4 | 2006-02-10 06:58:25 +0000 | [diff] [blame] | 90 | SDTypeProfile<0, 2, [SDTCisVT<0, OtherVT>, SDTCisVT<1, i32>]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 91 | def SDTSPselectcc : | 
| Chris Lattner | 0c4dea4 | 2006-02-10 06:58:25 +0000 | [diff] [blame] | 92 | SDTypeProfile<1, 3, [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, SDTCisVT<3, i32>]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 93 | def SDTSPFTOI : | 
|  | 94 | SDTypeProfile<1, 1, [SDTCisVT<0, f32>, SDTCisFP<1>]>; | 
|  | 95 | def SDTSPITOF : | 
|  | 96 | SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisVT<1, f32>]>; | 
|  | 97 |  | 
| Chris Lattner | 2a0a3b4 | 2010-12-23 18:28:41 +0000 | [diff] [blame] | 98 | def SPcmpicc : SDNode<"SPISD::CMPICC", SDTIntBinOp, [SDNPOutGlue]>; | 
|  | 99 | def SPcmpfcc : SDNode<"SPISD::CMPFCC", SDTSPcmpfcc, [SDNPOutGlue]>; | 
|  | 100 | def SPbricc : SDNode<"SPISD::BRICC", SDTSPbrcc, [SDNPHasChain, SDNPInGlue]>; | 
|  | 101 | def SPbrfcc : SDNode<"SPISD::BRFCC", SDTSPbrcc, [SDNPHasChain, SDNPInGlue]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 102 |  | 
|  | 103 | def SPhi    : SDNode<"SPISD::Hi", SDTIntUnaryOp>; | 
|  | 104 | def SPlo    : SDNode<"SPISD::Lo", SDTIntUnaryOp>; | 
|  | 105 |  | 
|  | 106 | def SPftoi  : SDNode<"SPISD::FTOI", SDTSPFTOI>; | 
|  | 107 | def SPitof  : SDNode<"SPISD::ITOF", SDTSPITOF>; | 
|  | 108 |  | 
| Chris Lattner | 2a0a3b4 | 2010-12-23 18:28:41 +0000 | [diff] [blame] | 109 | def SPselecticc : SDNode<"SPISD::SELECT_ICC", SDTSPselectcc, [SDNPInGlue]>; | 
|  | 110 | def SPselectfcc : SDNode<"SPISD::SELECT_FCC", SDTSPselectcc, [SDNPInGlue]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 111 |  | 
| Venkatraman Govindaraju | 7142508 | 2009-08-26 04:50:17 +0000 | [diff] [blame] | 112 | //  These are target-independent nodes, but have target-specific formats. | 
| Bill Wendling | 77b13af | 2007-11-13 09:19:02 +0000 | [diff] [blame] | 113 | def SDT_SPCallSeqStart : SDCallSeqStart<[ SDTCisVT<0, i32> ]>; | 
|  | 114 | def SDT_SPCallSeqEnd   : SDCallSeqEnd<[ SDTCisVT<0, i32>, | 
|  | 115 | SDTCisVT<1, i32> ]>; | 
| Bill Wendling | f359fed | 2007-11-13 00:44:25 +0000 | [diff] [blame] | 116 |  | 
| Bill Wendling | 77b13af | 2007-11-13 09:19:02 +0000 | [diff] [blame] | 117 | def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_SPCallSeqStart, | 
| Chris Lattner | 2a0a3b4 | 2010-12-23 18:28:41 +0000 | [diff] [blame] | 118 | [SDNPHasChain, SDNPOutGlue]>; | 
| Bill Wendling | 77b13af | 2007-11-13 09:19:02 +0000 | [diff] [blame] | 119 | def callseq_end   : SDNode<"ISD::CALLSEQ_END",   SDT_SPCallSeqEnd, | 
| Chris Lattner | 2a0a3b4 | 2010-12-23 18:28:41 +0000 | [diff] [blame] | 120 | [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 121 |  | 
| Venkatraman Govindaraju | 3b71b0a | 2011-01-12 03:18:21 +0000 | [diff] [blame] | 122 | def SDT_SPCall    : SDTypeProfile<0, -1, [SDTCisVT<0, i32>]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 123 | def call          : SDNode<"SPISD::CALL", SDT_SPCall, | 
| Venkatraman Govindaraju | 3b71b0a | 2011-01-12 03:18:21 +0000 | [diff] [blame] | 124 | [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue, | 
|  | 125 | SDNPVariadic]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 126 |  | 
| Dan Gohman | eac0c96 | 2008-03-13 23:07:40 +0000 | [diff] [blame] | 127 | def retflag       : SDNode<"SPISD::RET_FLAG", SDTNone, | 
| Chris Lattner | 2a0a3b4 | 2010-12-23 18:28:41 +0000 | [diff] [blame] | 128 | [SDNPHasChain, SDNPOptInGlue]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 129 |  | 
| Venkatraman Govindaraju | ef8cf45 | 2011-01-21 22:00:00 +0000 | [diff] [blame] | 130 | def flushw        : SDNode<"SPISD::FLUSHW", SDTNone, | 
| Venkatraman Govindaraju | d964580 | 2011-01-12 05:08:36 +0000 | [diff] [blame] | 131 | [SDNPHasChain]>; | 
|  | 132 |  | 
| Chris Lattner | 840c700 | 2009-09-15 17:46:24 +0000 | [diff] [blame] | 133 | def getPCX        : Operand<i32> { | 
|  | 134 | let PrintMethod = "printGetPCX"; | 
|  | 135 | } | 
|  | 136 |  | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 137 | //===----------------------------------------------------------------------===// | 
|  | 138 | // SPARC Flag Conditions | 
|  | 139 | //===----------------------------------------------------------------------===// | 
|  | 140 |  | 
|  | 141 | // Note that these values must be kept in sync with the CCOp::CondCode enum | 
|  | 142 | // values. | 
|  | 143 | class ICC_VAL<int N> : PatLeaf<(i32 N)>; | 
|  | 144 | def ICC_NE  : ICC_VAL< 9>;  // Not Equal | 
|  | 145 | def ICC_E   : ICC_VAL< 1>;  // Equal | 
|  | 146 | def ICC_G   : ICC_VAL<10>;  // Greater | 
|  | 147 | def ICC_LE  : ICC_VAL< 2>;  // Less or Equal | 
|  | 148 | def ICC_GE  : ICC_VAL<11>;  // Greater or Equal | 
|  | 149 | def ICC_L   : ICC_VAL< 3>;  // Less | 
|  | 150 | def ICC_GU  : ICC_VAL<12>;  // Greater Unsigned | 
|  | 151 | def ICC_LEU : ICC_VAL< 4>;  // Less or Equal Unsigned | 
|  | 152 | def ICC_CC  : ICC_VAL<13>;  // Carry Clear/Great or Equal Unsigned | 
|  | 153 | def ICC_CS  : ICC_VAL< 5>;  // Carry Set/Less Unsigned | 
|  | 154 | def ICC_POS : ICC_VAL<14>;  // Positive | 
|  | 155 | def ICC_NEG : ICC_VAL< 6>;  // Negative | 
|  | 156 | def ICC_VC  : ICC_VAL<15>;  // Overflow Clear | 
|  | 157 | def ICC_VS  : ICC_VAL< 7>;  // Overflow Set | 
|  | 158 |  | 
|  | 159 | class FCC_VAL<int N> : PatLeaf<(i32 N)>; | 
|  | 160 | def FCC_U   : FCC_VAL<23>;  // Unordered | 
|  | 161 | def FCC_G   : FCC_VAL<22>;  // Greater | 
|  | 162 | def FCC_UG  : FCC_VAL<21>;  // Unordered or Greater | 
|  | 163 | def FCC_L   : FCC_VAL<20>;  // Less | 
|  | 164 | def FCC_UL  : FCC_VAL<19>;  // Unordered or Less | 
|  | 165 | def FCC_LG  : FCC_VAL<18>;  // Less or Greater | 
|  | 166 | def FCC_NE  : FCC_VAL<17>;  // Not Equal | 
|  | 167 | def FCC_E   : FCC_VAL<25>;  // Equal | 
|  | 168 | def FCC_UE  : FCC_VAL<24>;  // Unordered or Equal | 
|  | 169 | def FCC_GE  : FCC_VAL<25>;  // Greater or Equal | 
|  | 170 | def FCC_UGE : FCC_VAL<26>;  // Unordered or Greater or Equal | 
|  | 171 | def FCC_LE  : FCC_VAL<27>;  // Less or Equal | 
|  | 172 | def FCC_ULE : FCC_VAL<28>;  // Unordered or Less or Equal | 
|  | 173 | def FCC_O   : FCC_VAL<29>;  // Ordered | 
|  | 174 |  | 
| Chris Lattner | bad9d2e | 2006-09-01 22:28:02 +0000 | [diff] [blame] | 175 | //===----------------------------------------------------------------------===// | 
|  | 176 | // Instruction Class Templates | 
|  | 177 | //===----------------------------------------------------------------------===// | 
|  | 178 |  | 
|  | 179 | /// F3_12 multiclass - Define a normal F3_1/F3_2 pattern in one shot. | 
|  | 180 | multiclass F3_12<string OpcStr, bits<6> Op3Val, SDNode OpNode> { | 
|  | 181 | def rr  : F3_1<2, Op3Val, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 182 | (outs IntRegs:$dst), (ins IntRegs:$b, IntRegs:$c), | 
| Chris Lattner | bad9d2e | 2006-09-01 22:28:02 +0000 | [diff] [blame] | 183 | !strconcat(OpcStr, " $b, $c, $dst"), | 
|  | 184 | [(set IntRegs:$dst, (OpNode IntRegs:$b, IntRegs:$c))]>; | 
|  | 185 | def ri  : F3_2<2, Op3Val, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 186 | (outs IntRegs:$dst), (ins IntRegs:$b, i32imm:$c), | 
| Chris Lattner | bad9d2e | 2006-09-01 22:28:02 +0000 | [diff] [blame] | 187 | !strconcat(OpcStr, " $b, $c, $dst"), | 
|  | 188 | [(set IntRegs:$dst, (OpNode IntRegs:$b, simm13:$c))]>; | 
|  | 189 | } | 
|  | 190 |  | 
|  | 191 | /// F3_12np multiclass - Define a normal F3_1/F3_2 pattern in one shot, with no | 
|  | 192 | /// pattern. | 
|  | 193 | multiclass F3_12np<string OpcStr, bits<6> Op3Val> { | 
|  | 194 | def rr  : F3_1<2, Op3Val, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 195 | (outs IntRegs:$dst), (ins IntRegs:$b, IntRegs:$c), | 
| Chris Lattner | bad9d2e | 2006-09-01 22:28:02 +0000 | [diff] [blame] | 196 | !strconcat(OpcStr, " $b, $c, $dst"), []>; | 
|  | 197 | def ri  : F3_2<2, Op3Val, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 198 | (outs IntRegs:$dst), (ins IntRegs:$b, i32imm:$c), | 
| Chris Lattner | bad9d2e | 2006-09-01 22:28:02 +0000 | [diff] [blame] | 199 | !strconcat(OpcStr, " $b, $c, $dst"), []>; | 
|  | 200 | } | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 201 |  | 
|  | 202 | //===----------------------------------------------------------------------===// | 
|  | 203 | // Instructions | 
|  | 204 | //===----------------------------------------------------------------------===// | 
|  | 205 |  | 
|  | 206 | // Pseudo instructions. | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 207 | class Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | 208 | : InstSP<outs, ins, asmstr, pattern>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 209 |  | 
| Chris Lattner | 840c700 | 2009-09-15 17:46:24 +0000 | [diff] [blame] | 210 | // GETPCX for PIC | 
| Venkatraman Govindaraju | ee347f8 | 2011-01-12 03:52:59 +0000 | [diff] [blame] | 211 | let Defs = [O7] in { | 
| Chris Lattner | 840c700 | 2009-09-15 17:46:24 +0000 | [diff] [blame] | 212 | def GETPCX : Pseudo<(outs getPCX:$getpcseq), (ins), "$getpcseq", [] >; | 
|  | 213 | } | 
|  | 214 |  | 
| Evan Cheng | 3e18e50 | 2007-09-11 19:55:27 +0000 | [diff] [blame] | 215 | let Defs = [O6], Uses = [O6] in { | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 216 | def ADJCALLSTACKDOWN : Pseudo<(outs), (ins i32imm:$amt), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 217 | "!ADJCALLSTACKDOWN $amt", | 
| Chris Lattner | 2753955 | 2008-10-11 22:08:30 +0000 | [diff] [blame] | 218 | [(callseq_start timm:$amt)]>; | 
| Bill Wendling | f359fed | 2007-11-13 00:44:25 +0000 | [diff] [blame] | 219 | def ADJCALLSTACKUP : Pseudo<(outs), (ins i32imm:$amt1, i32imm:$amt2), | 
|  | 220 | "!ADJCALLSTACKUP $amt1", | 
| Chris Lattner | 2753955 | 2008-10-11 22:08:30 +0000 | [diff] [blame] | 221 | [(callseq_end timm:$amt1, timm:$amt2)]>; | 
| Evan Cheng | 3e18e50 | 2007-09-11 19:55:27 +0000 | [diff] [blame] | 222 | } | 
| Evan Cheng | 6e68381 | 2007-12-12 23:12:09 +0000 | [diff] [blame] | 223 |  | 
| Venkatraman Govindaraju | ef8cf45 | 2011-01-21 22:00:00 +0000 | [diff] [blame] | 224 | let hasSideEffects = 1, mayStore = 1 in { | 
|  | 225 | let rd = 0, rs1 = 0, rs2 = 0 in | 
|  | 226 | def FLUSHW : F3_1<0b10, 0b101011, (outs), (ins), | 
|  | 227 | "flushw", | 
|  | 228 | [(flushw)]>, Requires<[HasV9]>; | 
|  | 229 | let rd = 0, rs1 = 1, simm13 = 3 in | 
|  | 230 | def TA3 : F3_2<0b10, 0b111010, (outs), (ins), | 
|  | 231 | "ta 3", | 
|  | 232 | [(flushw)]>; | 
|  | 233 | } | 
| Venkatraman Govindaraju | d964580 | 2011-01-12 05:08:36 +0000 | [diff] [blame] | 234 |  | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 235 | // FpMOVD/FpNEGD/FpABSD - These are lowered to single-precision ops by the | 
|  | 236 | // fpmover pass. | 
| Chris Lattner | 747cf60 | 2006-02-21 18:04:32 +0000 | [diff] [blame] | 237 | let Predicates = [HasNoV9] in {  // Only emit these in V8 mode. | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 238 | def FpMOVD : Pseudo<(outs DFPRegs:$dst), (ins DFPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 239 | "!FpMOVD $src, $dst", []>; | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 240 | def FpNEGD : Pseudo<(outs DFPRegs:$dst), (ins DFPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 241 | "!FpNEGD $src, $dst", | 
|  | 242 | [(set DFPRegs:$dst, (fneg DFPRegs:$src))]>; | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 243 | def FpABSD : Pseudo<(outs DFPRegs:$dst), (ins DFPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 244 | "!FpABSD $src, $dst", | 
|  | 245 | [(set DFPRegs:$dst, (fabs DFPRegs:$src))]>; | 
|  | 246 | } | 
|  | 247 |  | 
| Dan Gohman | 453d64c | 2009-10-29 18:10:34 +0000 | [diff] [blame] | 248 | // SELECT_CC_* - Used to implement the SELECT_CC DAG operation.  Expanded after | 
|  | 249 | // instruction selection into a branch sequence.  This has to handle all | 
|  | 250 | // permutations of selection between i32/f32/f64 on ICC and FCC. | 
| Venkatraman Govindaraju | 4d6ade0 | 2011-01-11 22:38:28 +0000 | [diff] [blame] | 251 | // Expanded after instruction selection. | 
|  | 252 | let Uses = [ICC], usesCustomInserter = 1 in { | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 253 | def SELECT_CC_Int_ICC | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 254 | : Pseudo<(outs IntRegs:$dst), (ins IntRegs:$T, IntRegs:$F, i32imm:$Cond), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 255 | "; SELECT_CC_Int_ICC PSEUDO!", | 
|  | 256 | [(set IntRegs:$dst, (SPselecticc IntRegs:$T, IntRegs:$F, | 
| Chris Lattner | 0c4dea4 | 2006-02-10 06:58:25 +0000 | [diff] [blame] | 257 | imm:$Cond))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 258 | def SELECT_CC_FP_ICC | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 259 | : Pseudo<(outs FPRegs:$dst), (ins FPRegs:$T, FPRegs:$F, i32imm:$Cond), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 260 | "; SELECT_CC_FP_ICC PSEUDO!", | 
|  | 261 | [(set FPRegs:$dst, (SPselecticc FPRegs:$T, FPRegs:$F, | 
| Chris Lattner | 0c4dea4 | 2006-02-10 06:58:25 +0000 | [diff] [blame] | 262 | imm:$Cond))]>; | 
| Venkatraman Govindaraju | 4d6ade0 | 2011-01-11 22:38:28 +0000 | [diff] [blame] | 263 |  | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 264 | def SELECT_CC_DFP_ICC | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 265 | : Pseudo<(outs DFPRegs:$dst), (ins DFPRegs:$T, DFPRegs:$F, i32imm:$Cond), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 266 | "; SELECT_CC_DFP_ICC PSEUDO!", | 
|  | 267 | [(set DFPRegs:$dst, (SPselecticc DFPRegs:$T, DFPRegs:$F, | 
| Chris Lattner | 0c4dea4 | 2006-02-10 06:58:25 +0000 | [diff] [blame] | 268 | imm:$Cond))]>; | 
| Venkatraman Govindaraju | 4d6ade0 | 2011-01-11 22:38:28 +0000 | [diff] [blame] | 269 | } | 
|  | 270 |  | 
|  | 271 | let usesCustomInserter = 1, Uses = [FCC] in { | 
|  | 272 |  | 
|  | 273 | def SELECT_CC_Int_FCC | 
|  | 274 | : Pseudo<(outs IntRegs:$dst), (ins IntRegs:$T, IntRegs:$F, i32imm:$Cond), | 
|  | 275 | "; SELECT_CC_Int_FCC PSEUDO!", | 
|  | 276 | [(set IntRegs:$dst, (SPselectfcc IntRegs:$T, IntRegs:$F, | 
|  | 277 | imm:$Cond))]>; | 
|  | 278 |  | 
|  | 279 | def SELECT_CC_FP_FCC | 
|  | 280 | : Pseudo<(outs FPRegs:$dst), (ins FPRegs:$T, FPRegs:$F, i32imm:$Cond), | 
|  | 281 | "; SELECT_CC_FP_FCC PSEUDO!", | 
|  | 282 | [(set FPRegs:$dst, (SPselectfcc FPRegs:$T, FPRegs:$F, | 
|  | 283 | imm:$Cond))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 284 | def SELECT_CC_DFP_FCC | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 285 | : Pseudo<(outs DFPRegs:$dst), (ins DFPRegs:$T, DFPRegs:$F, i32imm:$Cond), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 286 | "; SELECT_CC_DFP_FCC PSEUDO!", | 
|  | 287 | [(set DFPRegs:$dst, (SPselectfcc DFPRegs:$T, DFPRegs:$F, | 
| Chris Lattner | 0c4dea4 | 2006-02-10 06:58:25 +0000 | [diff] [blame] | 288 | imm:$Cond))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 289 | } | 
|  | 290 |  | 
|  | 291 |  | 
|  | 292 | // Section A.3 - Synthetic Instructions, p. 85 | 
|  | 293 | // special cases of JMPL: | 
| Dan Gohman | 9fd22f68 | 2009-11-11 18:11:07 +0000 | [diff] [blame] | 294 | let isReturn = 1, isTerminator = 1, hasDelaySlot = 1, isBarrier = 1 in { | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 295 | let rd = O7.Num, rs1 = G0.Num, simm13 = 8 in | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 296 | def RETL: F3_2<2, 0b111000, (outs), (ins), "retl", [(retflag)]>; | 
| Venkatraman Govindaraju | 058e124 | 2011-01-20 05:08:26 +0000 | [diff] [blame] | 297 |  | 
|  | 298 | let rd = I7.Num, rs1 = G0.Num, simm13 = 8 in | 
|  | 299 | def RET: F3_2<2, 0b111000, (outs), (ins), "ret", []>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 300 | } | 
|  | 301 |  | 
|  | 302 | // Section B.1 - Load Integer Instructions, p. 90 | 
|  | 303 | def LDSBrr : F3_1<3, 0b001001, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 304 | (outs IntRegs:$dst), (ins MEMrr:$addr), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 305 | "ldsb [$addr], $dst", | 
| Evan Cheng | e71fe34d | 2006-10-09 20:57:25 +0000 | [diff] [blame] | 306 | [(set IntRegs:$dst, (sextloadi8 ADDRrr:$addr))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 307 | def LDSBri : F3_2<3, 0b001001, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 308 | (outs IntRegs:$dst), (ins MEMri:$addr), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 309 | "ldsb [$addr], $dst", | 
| Evan Cheng | e71fe34d | 2006-10-09 20:57:25 +0000 | [diff] [blame] | 310 | [(set IntRegs:$dst, (sextloadi8 ADDRri:$addr))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 311 | def LDSHrr : F3_1<3, 0b001010, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 312 | (outs IntRegs:$dst), (ins MEMrr:$addr), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 313 | "ldsh [$addr], $dst", | 
| Evan Cheng | e71fe34d | 2006-10-09 20:57:25 +0000 | [diff] [blame] | 314 | [(set IntRegs:$dst, (sextloadi16 ADDRrr:$addr))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 315 | def LDSHri : F3_2<3, 0b001010, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 316 | (outs IntRegs:$dst), (ins MEMri:$addr), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 317 | "ldsh [$addr], $dst", | 
| Evan Cheng | e71fe34d | 2006-10-09 20:57:25 +0000 | [diff] [blame] | 318 | [(set IntRegs:$dst, (sextloadi16 ADDRri:$addr))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 319 | def LDUBrr : F3_1<3, 0b000001, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 320 | (outs IntRegs:$dst), (ins MEMrr:$addr), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 321 | "ldub [$addr], $dst", | 
| Evan Cheng | e71fe34d | 2006-10-09 20:57:25 +0000 | [diff] [blame] | 322 | [(set IntRegs:$dst, (zextloadi8 ADDRrr:$addr))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 323 | def LDUBri : F3_2<3, 0b000001, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 324 | (outs IntRegs:$dst), (ins MEMri:$addr), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 325 | "ldub [$addr], $dst", | 
| Evan Cheng | e71fe34d | 2006-10-09 20:57:25 +0000 | [diff] [blame] | 326 | [(set IntRegs:$dst, (zextloadi8 ADDRri:$addr))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 327 | def LDUHrr : F3_1<3, 0b000010, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 328 | (outs IntRegs:$dst), (ins MEMrr:$addr), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 329 | "lduh [$addr], $dst", | 
| Evan Cheng | e71fe34d | 2006-10-09 20:57:25 +0000 | [diff] [blame] | 330 | [(set IntRegs:$dst, (zextloadi16 ADDRrr:$addr))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 331 | def LDUHri : F3_2<3, 0b000010, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 332 | (outs IntRegs:$dst), (ins MEMri:$addr), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 333 | "lduh [$addr], $dst", | 
| Evan Cheng | e71fe34d | 2006-10-09 20:57:25 +0000 | [diff] [blame] | 334 | [(set IntRegs:$dst, (zextloadi16 ADDRri:$addr))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 335 | def LDrr   : F3_1<3, 0b000000, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 336 | (outs IntRegs:$dst), (ins MEMrr:$addr), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 337 | "ld [$addr], $dst", | 
|  | 338 | [(set IntRegs:$dst, (load ADDRrr:$addr))]>; | 
|  | 339 | def LDri   : F3_2<3, 0b000000, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 340 | (outs IntRegs:$dst), (ins MEMri:$addr), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 341 | "ld [$addr], $dst", | 
|  | 342 | [(set IntRegs:$dst, (load ADDRri:$addr))]>; | 
|  | 343 |  | 
|  | 344 | // Section B.2 - Load Floating-point Instructions, p. 92 | 
|  | 345 | def LDFrr  : F3_1<3, 0b100000, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 346 | (outs FPRegs:$dst), (ins MEMrr:$addr), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 347 | "ld [$addr], $dst", | 
|  | 348 | [(set FPRegs:$dst, (load ADDRrr:$addr))]>; | 
|  | 349 | def LDFri  : F3_2<3, 0b100000, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 350 | (outs FPRegs:$dst), (ins MEMri:$addr), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 351 | "ld [$addr], $dst", | 
|  | 352 | [(set FPRegs:$dst, (load ADDRri:$addr))]>; | 
|  | 353 | def LDDFrr : F3_1<3, 0b100011, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 354 | (outs DFPRegs:$dst), (ins MEMrr:$addr), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 355 | "ldd [$addr], $dst", | 
|  | 356 | [(set DFPRegs:$dst, (load ADDRrr:$addr))]>; | 
|  | 357 | def LDDFri : F3_2<3, 0b100011, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 358 | (outs DFPRegs:$dst), (ins MEMri:$addr), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 359 | "ldd [$addr], $dst", | 
|  | 360 | [(set DFPRegs:$dst, (load ADDRri:$addr))]>; | 
|  | 361 |  | 
|  | 362 | // Section B.4 - Store Integer Instructions, p. 95 | 
|  | 363 | def STBrr : F3_1<3, 0b000101, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 364 | (outs), (ins MEMrr:$addr, IntRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 365 | "stb $src, [$addr]", | 
| Evan Cheng | ab51cf2 | 2006-10-13 21:14:26 +0000 | [diff] [blame] | 366 | [(truncstorei8 IntRegs:$src, ADDRrr:$addr)]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 367 | def STBri : F3_2<3, 0b000101, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 368 | (outs), (ins MEMri:$addr, IntRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 369 | "stb $src, [$addr]", | 
| Evan Cheng | ab51cf2 | 2006-10-13 21:14:26 +0000 | [diff] [blame] | 370 | [(truncstorei8 IntRegs:$src, ADDRri:$addr)]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 371 | def STHrr : F3_1<3, 0b000110, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 372 | (outs), (ins MEMrr:$addr, IntRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 373 | "sth $src, [$addr]", | 
| Evan Cheng | ab51cf2 | 2006-10-13 21:14:26 +0000 | [diff] [blame] | 374 | [(truncstorei16 IntRegs:$src, ADDRrr:$addr)]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 375 | def STHri : F3_2<3, 0b000110, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 376 | (outs), (ins MEMri:$addr, IntRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 377 | "sth $src, [$addr]", | 
| Evan Cheng | ab51cf2 | 2006-10-13 21:14:26 +0000 | [diff] [blame] | 378 | [(truncstorei16 IntRegs:$src, ADDRri:$addr)]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 379 | def STrr  : F3_1<3, 0b000100, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 380 | (outs), (ins MEMrr:$addr, IntRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 381 | "st $src, [$addr]", | 
|  | 382 | [(store IntRegs:$src, ADDRrr:$addr)]>; | 
|  | 383 | def STri  : F3_2<3, 0b000100, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 384 | (outs), (ins MEMri:$addr, IntRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 385 | "st $src, [$addr]", | 
|  | 386 | [(store IntRegs:$src, ADDRri:$addr)]>; | 
|  | 387 |  | 
|  | 388 | // Section B.5 - Store Floating-point Instructions, p. 97 | 
|  | 389 | def STFrr   : F3_1<3, 0b100100, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 390 | (outs), (ins MEMrr:$addr, FPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 391 | "st $src, [$addr]", | 
|  | 392 | [(store FPRegs:$src, ADDRrr:$addr)]>; | 
|  | 393 | def STFri   : F3_2<3, 0b100100, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 394 | (outs), (ins MEMri:$addr, FPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 395 | "st $src, [$addr]", | 
|  | 396 | [(store FPRegs:$src, ADDRri:$addr)]>; | 
|  | 397 | def STDFrr  : F3_1<3, 0b100111, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 398 | (outs), (ins MEMrr:$addr, DFPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 399 | "std  $src, [$addr]", | 
|  | 400 | [(store DFPRegs:$src, ADDRrr:$addr)]>; | 
|  | 401 | def STDFri  : F3_2<3, 0b100111, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 402 | (outs), (ins MEMri:$addr, DFPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 403 | "std $src, [$addr]", | 
|  | 404 | [(store DFPRegs:$src, ADDRri:$addr)]>; | 
|  | 405 |  | 
|  | 406 | // Section B.9 - SETHI Instruction, p. 104 | 
|  | 407 | def SETHIi: F2_1<0b100, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 408 | (outs IntRegs:$dst), (ins i32imm:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 409 | "sethi $src, $dst", | 
|  | 410 | [(set IntRegs:$dst, SETHIimm:$src)]>; | 
|  | 411 |  | 
|  | 412 | // Section B.10 - NOP Instruction, p. 105 | 
|  | 413 | // (It's a special case of SETHI) | 
|  | 414 | let rd = 0, imm22 = 0 in | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 415 | def NOP : F2_1<0b100, (outs), (ins), "nop", []>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 416 |  | 
|  | 417 | // Section B.11 - Logical Instructions, p. 106 | 
| Chris Lattner | bad9d2e | 2006-09-01 22:28:02 +0000 | [diff] [blame] | 418 | defm AND    : F3_12<"and", 0b000001, and>; | 
|  | 419 |  | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 420 | def ANDNrr  : F3_1<2, 0b000101, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 421 | (outs IntRegs:$dst), (ins IntRegs:$b, IntRegs:$c), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 422 | "andn $b, $c, $dst", | 
|  | 423 | [(set IntRegs:$dst, (and IntRegs:$b, (not IntRegs:$c)))]>; | 
|  | 424 | def ANDNri  : F3_2<2, 0b000101, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 425 | (outs IntRegs:$dst), (ins IntRegs:$b, i32imm:$c), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 426 | "andn $b, $c, $dst", []>; | 
| Chris Lattner | bad9d2e | 2006-09-01 22:28:02 +0000 | [diff] [blame] | 427 |  | 
|  | 428 | defm OR     : F3_12<"or", 0b000010, or>; | 
|  | 429 |  | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 430 | def ORNrr   : F3_1<2, 0b000110, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 431 | (outs IntRegs:$dst), (ins IntRegs:$b, IntRegs:$c), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 432 | "orn $b, $c, $dst", | 
|  | 433 | [(set IntRegs:$dst, (or IntRegs:$b, (not IntRegs:$c)))]>; | 
|  | 434 | def ORNri   : F3_2<2, 0b000110, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 435 | (outs IntRegs:$dst), (ins IntRegs:$b, i32imm:$c), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 436 | "orn $b, $c, $dst", []>; | 
| Chris Lattner | bad9d2e | 2006-09-01 22:28:02 +0000 | [diff] [blame] | 437 | defm XOR    : F3_12<"xor", 0b000011, xor>; | 
|  | 438 |  | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 439 | def XNORrr  : F3_1<2, 0b000111, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 440 | (outs IntRegs:$dst), (ins IntRegs:$b, IntRegs:$c), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 441 | "xnor $b, $c, $dst", | 
|  | 442 | [(set IntRegs:$dst, (not (xor IntRegs:$b, IntRegs:$c)))]>; | 
|  | 443 | def XNORri  : F3_2<2, 0b000111, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 444 | (outs IntRegs:$dst), (ins IntRegs:$b, i32imm:$c), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 445 | "xnor $b, $c, $dst", []>; | 
|  | 446 |  | 
|  | 447 | // Section B.12 - Shift Instructions, p. 107 | 
| Chris Lattner | bad9d2e | 2006-09-01 22:28:02 +0000 | [diff] [blame] | 448 | defm SLL : F3_12<"sll", 0b100101, shl>; | 
|  | 449 | defm SRL : F3_12<"srl", 0b100110, srl>; | 
|  | 450 | defm SRA : F3_12<"sra", 0b100111, sra>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 451 |  | 
|  | 452 | // Section B.13 - Add Instructions, p. 108 | 
| Chris Lattner | bad9d2e | 2006-09-01 22:28:02 +0000 | [diff] [blame] | 453 | defm ADD   : F3_12<"add", 0b000000, add>; | 
| Chris Lattner | fcb8a3a | 2006-02-10 07:35:42 +0000 | [diff] [blame] | 454 |  | 
|  | 455 | // "LEA" forms of add (patterns to make tblgen happy) | 
|  | 456 | def LEA_ADDri   : F3_2<2, 0b000000, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 457 | (outs IntRegs:$dst), (ins MEMri:$addr), | 
| Chris Lattner | fcb8a3a | 2006-02-10 07:35:42 +0000 | [diff] [blame] | 458 | "add ${addr:arith}, $dst", | 
|  | 459 | [(set IntRegs:$dst, ADDRri:$addr)]>; | 
| Chris Lattner | 840c700 | 2009-09-15 17:46:24 +0000 | [diff] [blame] | 460 |  | 
|  | 461 | let Defs = [ICC] in | 
|  | 462 | defm ADDCC  : F3_12<"addcc", 0b010000, addc>; | 
|  | 463 |  | 
| Venkatraman Govindaraju | 4d6ade0 | 2011-01-11 22:38:28 +0000 | [diff] [blame] | 464 | let Uses = [ICC] in | 
|  | 465 | defm ADDX  : F3_12<"addx", 0b001000, adde>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 466 |  | 
|  | 467 | // Section B.15 - Subtract Instructions, p. 110 | 
| Chris Lattner | bad9d2e | 2006-09-01 22:28:02 +0000 | [diff] [blame] | 468 | defm SUB    : F3_12  <"sub"  , 0b000100, sub>; | 
| Venkatraman Govindaraju | 2f15503 | 2010-12-28 20:39:17 +0000 | [diff] [blame] | 469 | let Uses = [ICC] in | 
|  | 470 | defm SUBX   : F3_12  <"subx" , 0b001100, sube>; | 
| Chris Lattner | bad9d2e | 2006-09-01 22:28:02 +0000 | [diff] [blame] | 471 |  | 
| Venkatraman Govindaraju | 2f15503 | 2010-12-28 20:39:17 +0000 | [diff] [blame] | 472 | let Defs = [ICC] in | 
| Chris Lattner | 840c700 | 2009-09-15 17:46:24 +0000 | [diff] [blame] | 473 | defm SUBCC  : F3_12  <"subcc", 0b010100, SPcmpicc>; | 
|  | 474 |  | 
| Venkatraman Govindaraju | 2f15503 | 2010-12-28 20:39:17 +0000 | [diff] [blame] | 475 | let Uses = [ICC], Defs = [ICC] in | 
| Chris Lattner | 840c700 | 2009-09-15 17:46:24 +0000 | [diff] [blame] | 476 | def SUBXCCrr: F3_1<2, 0b011100, | 
|  | 477 | (outs IntRegs:$dst), (ins IntRegs:$b, IntRegs:$c), | 
|  | 478 | "subxcc $b, $c, $dst", []>; | 
| Venkatraman Govindaraju | 2f15503 | 2010-12-28 20:39:17 +0000 | [diff] [blame] | 479 |  | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 480 |  | 
|  | 481 | // Section B.18 - Multiply Instructions, p. 113 | 
| Venkatraman Govindaraju | 2f15503 | 2010-12-28 20:39:17 +0000 | [diff] [blame] | 482 | let Defs = [Y] in { | 
|  | 483 | defm UMUL : F3_12np<"umul", 0b001010>; | 
|  | 484 | defm SMUL : F3_12  <"smul", 0b001011, mul>; | 
|  | 485 | } | 
| Chris Lattner | c75d5b0 | 2006-02-09 05:06:36 +0000 | [diff] [blame] | 486 |  | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 487 | // Section B.19 - Divide Instructions, p. 115 | 
| Venkatraman Govindaraju | 2f15503 | 2010-12-28 20:39:17 +0000 | [diff] [blame] | 488 | let Defs = [Y] in { | 
|  | 489 | defm UDIV : F3_12np<"udiv", 0b001110>; | 
|  | 490 | defm SDIV : F3_12np<"sdiv", 0b001111>; | 
|  | 491 | } | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 492 |  | 
|  | 493 | // Section B.20 - SAVE and RESTORE, p. 117 | 
| Chris Lattner | bad9d2e | 2006-09-01 22:28:02 +0000 | [diff] [blame] | 494 | defm SAVE    : F3_12np<"save"   , 0b111100>; | 
|  | 495 | defm RESTORE : F3_12np<"restore", 0b111101>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 496 |  | 
|  | 497 | // Section B.21 - Branch on Integer Condition Codes Instructions, p. 119 | 
|  | 498 |  | 
|  | 499 | // conditional branch class: | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 500 | class BranchSP<bits<4> cc, dag ins, string asmstr, list<dag> pattern> | 
|  | 501 | : F2_2<cc, 0b010, (outs), ins, asmstr, pattern> { | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 502 | let isBranch = 1; | 
|  | 503 | let isTerminator = 1; | 
|  | 504 | let hasDelaySlot = 1; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 505 | } | 
|  | 506 |  | 
|  | 507 | let isBarrier = 1 in | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 508 | def BA   : BranchSP<0b1000, (ins brtarget:$dst), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 509 | "ba $dst", | 
|  | 510 | [(br bb:$dst)]>; | 
| Chris Lattner | 840c700 | 2009-09-15 17:46:24 +0000 | [diff] [blame] | 511 |  | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 512 | // FIXME: the encoding for the JIT should look at the condition field. | 
| Chris Lattner | 840c700 | 2009-09-15 17:46:24 +0000 | [diff] [blame] | 513 | let Uses = [ICC] in | 
|  | 514 | def BCOND : BranchSP<0, (ins brtarget:$dst, CCOp:$cc), | 
|  | 515 | "b$cc $dst", | 
|  | 516 | [(SPbricc bb:$dst, imm:$cc)]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 517 |  | 
|  | 518 |  | 
|  | 519 | // Section B.22 - Branch on Floating-point Condition Codes Instructions, p. 121 | 
|  | 520 |  | 
|  | 521 | // floating-point conditional branch class: | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 522 | class FPBranchSP<bits<4> cc, dag ins, string asmstr, list<dag> pattern> | 
|  | 523 | : F2_2<cc, 0b110, (outs), ins, asmstr, pattern> { | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 524 | let isBranch = 1; | 
|  | 525 | let isTerminator = 1; | 
|  | 526 | let hasDelaySlot = 1; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 527 | } | 
|  | 528 |  | 
|  | 529 | // FIXME: the encoding for the JIT should look at the condition field. | 
| Chris Lattner | 840c700 | 2009-09-15 17:46:24 +0000 | [diff] [blame] | 530 | let Uses = [FCC] in | 
|  | 531 | def FBCOND  : FPBranchSP<0, (ins brtarget:$dst, CCOp:$cc), | 
|  | 532 | "fb$cc $dst", | 
|  | 533 | [(SPbrfcc bb:$dst, imm:$cc)]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 534 |  | 
|  | 535 |  | 
|  | 536 | // Section B.24 - Call and Link Instruction, p. 125 | 
|  | 537 | // This is the only Format 1 instruction | 
| Venkatraman Govindaraju | 3b71b0a | 2011-01-12 03:18:21 +0000 | [diff] [blame] | 538 | let Uses = [O6], | 
| Evan Cheng | ac1591b | 2007-07-21 00:34:19 +0000 | [diff] [blame] | 539 | hasDelaySlot = 1, isCall = 1, | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 540 | Defs = [O0, O1, O2, O3, O4, O5, O7, G1, G2, G3, G4, G5, G6, G7, | 
| Venkatraman Govindaraju | 058e124 | 2011-01-20 05:08:26 +0000 | [diff] [blame] | 541 | D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15, | 
|  | 542 | ICC, FCC, Y] in { | 
| Venkatraman Govindaraju | 3b71b0a | 2011-01-12 03:18:21 +0000 | [diff] [blame] | 543 | def CALL : InstSP<(outs), (ins calltarget:$dst, variable_ops), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 544 | "call $dst", []> { | 
|  | 545 | bits<30> disp; | 
|  | 546 | let op = 1; | 
|  | 547 | let Inst{29-0} = disp; | 
|  | 548 | } | 
|  | 549 |  | 
|  | 550 | // indirect calls | 
|  | 551 | def JMPLrr : F3_1<2, 0b111000, | 
| Venkatraman Govindaraju | 3b71b0a | 2011-01-12 03:18:21 +0000 | [diff] [blame] | 552 | (outs), (ins MEMrr:$ptr, variable_ops), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 553 | "call $ptr", | 
| Chris Lattner | 8e9b895 | 2010-03-18 23:57:57 +0000 | [diff] [blame] | 554 | [(call ADDRrr:$ptr)]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 555 | def JMPLri : F3_2<2, 0b111000, | 
| Venkatraman Govindaraju | 3b71b0a | 2011-01-12 03:18:21 +0000 | [diff] [blame] | 556 | (outs), (ins MEMri:$ptr, variable_ops), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 557 | "call $ptr", | 
| Chris Lattner | 8e9b895 | 2010-03-18 23:57:57 +0000 | [diff] [blame] | 558 | [(call ADDRri:$ptr)]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 559 | } | 
|  | 560 |  | 
|  | 561 | // Section B.28 - Read State Register Instructions | 
| Venkatraman Govindaraju | 2f15503 | 2010-12-28 20:39:17 +0000 | [diff] [blame] | 562 | let Uses = [Y] in | 
|  | 563 | def RDY : F3_1<2, 0b101000, | 
|  | 564 | (outs IntRegs:$dst), (ins), | 
|  | 565 | "rd %y, $dst", []>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 566 |  | 
|  | 567 | // Section B.29 - Write State Register Instructions | 
| Venkatraman Govindaraju | 2f15503 | 2010-12-28 20:39:17 +0000 | [diff] [blame] | 568 | let Defs = [Y] in { | 
|  | 569 | def WRYrr : F3_1<2, 0b110000, | 
|  | 570 | (outs), (ins IntRegs:$b, IntRegs:$c), | 
|  | 571 | "wr $b, $c, %y", []>; | 
|  | 572 | def WRYri : F3_2<2, 0b110000, | 
|  | 573 | (outs), (ins IntRegs:$b, i32imm:$c), | 
|  | 574 | "wr $b, $c, %y", []>; | 
|  | 575 | } | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 576 | // Convert Integer to Floating-point Instructions, p. 141 | 
|  | 577 | def FITOS : F3_3<2, 0b110100, 0b011000100, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 578 | (outs FPRegs:$dst), (ins FPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 579 | "fitos $src, $dst", | 
|  | 580 | [(set FPRegs:$dst, (SPitof FPRegs:$src))]>; | 
|  | 581 | def FITOD : F3_3<2, 0b110100, 0b011001000, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 582 | (outs DFPRegs:$dst), (ins FPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 583 | "fitod $src, $dst", | 
|  | 584 | [(set DFPRegs:$dst, (SPitof FPRegs:$src))]>; | 
|  | 585 |  | 
|  | 586 | // Convert Floating-point to Integer Instructions, p. 142 | 
|  | 587 | def FSTOI : F3_3<2, 0b110100, 0b011010001, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 588 | (outs FPRegs:$dst), (ins FPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 589 | "fstoi $src, $dst", | 
|  | 590 | [(set FPRegs:$dst, (SPftoi FPRegs:$src))]>; | 
|  | 591 | def FDTOI : F3_3<2, 0b110100, 0b011010010, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 592 | (outs FPRegs:$dst), (ins DFPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 593 | "fdtoi $src, $dst", | 
|  | 594 | [(set FPRegs:$dst, (SPftoi DFPRegs:$src))]>; | 
|  | 595 |  | 
|  | 596 | // Convert between Floating-point Formats Instructions, p. 143 | 
|  | 597 | def FSTOD : F3_3<2, 0b110100, 0b011001001, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 598 | (outs DFPRegs:$dst), (ins FPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 599 | "fstod $src, $dst", | 
|  | 600 | [(set DFPRegs:$dst, (fextend FPRegs:$src))]>; | 
|  | 601 | def FDTOS : F3_3<2, 0b110100, 0b011000110, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 602 | (outs FPRegs:$dst), (ins DFPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 603 | "fdtos $src, $dst", | 
|  | 604 | [(set FPRegs:$dst, (fround DFPRegs:$src))]>; | 
|  | 605 |  | 
|  | 606 | // Floating-point Move Instructions, p. 144 | 
|  | 607 | def FMOVS : F3_3<2, 0b110100, 0b000000001, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 608 | (outs FPRegs:$dst), (ins FPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 609 | "fmovs $src, $dst", []>; | 
|  | 610 | def FNEGS : F3_3<2, 0b110100, 0b000000101, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 611 | (outs FPRegs:$dst), (ins FPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 612 | "fnegs $src, $dst", | 
|  | 613 | [(set FPRegs:$dst, (fneg FPRegs:$src))]>; | 
|  | 614 | def FABSS : F3_3<2, 0b110100, 0b000001001, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 615 | (outs FPRegs:$dst), (ins FPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 616 | "fabss $src, $dst", | 
|  | 617 | [(set FPRegs:$dst, (fabs FPRegs:$src))]>; | 
|  | 618 |  | 
|  | 619 |  | 
|  | 620 | // Floating-point Square Root Instructions, p.145 | 
|  | 621 | def FSQRTS : F3_3<2, 0b110100, 0b000101001, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 622 | (outs FPRegs:$dst), (ins FPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 623 | "fsqrts $src, $dst", | 
|  | 624 | [(set FPRegs:$dst, (fsqrt FPRegs:$src))]>; | 
|  | 625 | def FSQRTD : F3_3<2, 0b110100, 0b000101010, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 626 | (outs DFPRegs:$dst), (ins DFPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 627 | "fsqrtd $src, $dst", | 
|  | 628 | [(set DFPRegs:$dst, (fsqrt DFPRegs:$src))]>; | 
|  | 629 |  | 
|  | 630 |  | 
|  | 631 |  | 
|  | 632 | // Floating-point Add and Subtract Instructions, p. 146 | 
|  | 633 | def FADDS  : F3_3<2, 0b110100, 0b001000001, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 634 | (outs FPRegs:$dst), (ins FPRegs:$src1, FPRegs:$src2), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 635 | "fadds $src1, $src2, $dst", | 
|  | 636 | [(set FPRegs:$dst, (fadd FPRegs:$src1, FPRegs:$src2))]>; | 
|  | 637 | def FADDD  : F3_3<2, 0b110100, 0b001000010, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 638 | (outs DFPRegs:$dst), (ins DFPRegs:$src1, DFPRegs:$src2), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 639 | "faddd $src1, $src2, $dst", | 
|  | 640 | [(set DFPRegs:$dst, (fadd DFPRegs:$src1, DFPRegs:$src2))]>; | 
|  | 641 | def FSUBS  : F3_3<2, 0b110100, 0b001000101, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 642 | (outs FPRegs:$dst), (ins FPRegs:$src1, FPRegs:$src2), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 643 | "fsubs $src1, $src2, $dst", | 
|  | 644 | [(set FPRegs:$dst, (fsub FPRegs:$src1, FPRegs:$src2))]>; | 
|  | 645 | def FSUBD  : F3_3<2, 0b110100, 0b001000110, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 646 | (outs DFPRegs:$dst), (ins DFPRegs:$src1, DFPRegs:$src2), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 647 | "fsubd $src1, $src2, $dst", | 
|  | 648 | [(set DFPRegs:$dst, (fsub DFPRegs:$src1, DFPRegs:$src2))]>; | 
|  | 649 |  | 
|  | 650 | // Floating-point Multiply and Divide Instructions, p. 147 | 
|  | 651 | def FMULS  : F3_3<2, 0b110100, 0b001001001, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 652 | (outs FPRegs:$dst), (ins FPRegs:$src1, FPRegs:$src2), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 653 | "fmuls $src1, $src2, $dst", | 
|  | 654 | [(set FPRegs:$dst, (fmul FPRegs:$src1, FPRegs:$src2))]>; | 
|  | 655 | def FMULD  : F3_3<2, 0b110100, 0b001001010, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 656 | (outs DFPRegs:$dst), (ins DFPRegs:$src1, DFPRegs:$src2), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 657 | "fmuld $src1, $src2, $dst", | 
|  | 658 | [(set DFPRegs:$dst, (fmul DFPRegs:$src1, DFPRegs:$src2))]>; | 
|  | 659 | def FSMULD : F3_3<2, 0b110100, 0b001101001, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 660 | (outs DFPRegs:$dst), (ins FPRegs:$src1, FPRegs:$src2), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 661 | "fsmuld $src1, $src2, $dst", | 
|  | 662 | [(set DFPRegs:$dst, (fmul (fextend FPRegs:$src1), | 
|  | 663 | (fextend FPRegs:$src2)))]>; | 
|  | 664 | def FDIVS  : F3_3<2, 0b110100, 0b001001101, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 665 | (outs FPRegs:$dst), (ins FPRegs:$src1, FPRegs:$src2), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 666 | "fdivs $src1, $src2, $dst", | 
|  | 667 | [(set FPRegs:$dst, (fdiv FPRegs:$src1, FPRegs:$src2))]>; | 
|  | 668 | def FDIVD  : F3_3<2, 0b110100, 0b001001110, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 669 | (outs DFPRegs:$dst), (ins DFPRegs:$src1, DFPRegs:$src2), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 670 | "fdivd $src1, $src2, $dst", | 
|  | 671 | [(set DFPRegs:$dst, (fdiv DFPRegs:$src1, DFPRegs:$src2))]>; | 
|  | 672 |  | 
|  | 673 | // Floating-point Compare Instructions, p. 148 | 
|  | 674 | // Note: the 2nd template arg is different for these guys. | 
|  | 675 | // Note 2: the result of a FCMP is not available until the 2nd cycle | 
|  | 676 | // after the instr is retired, but there is no interlock. This behavior | 
|  | 677 | // is modelled with a forced noop after the instruction. | 
| Chris Lattner | 840c700 | 2009-09-15 17:46:24 +0000 | [diff] [blame] | 678 | let Defs = [FCC] in { | 
|  | 679 | def FCMPS  : F3_3<2, 0b110101, 0b001010001, | 
|  | 680 | (outs), (ins FPRegs:$src1, FPRegs:$src2), | 
|  | 681 | "fcmps $src1, $src2\n\tnop", | 
|  | 682 | [(SPcmpfcc FPRegs:$src1, FPRegs:$src2)]>; | 
|  | 683 | def FCMPD  : F3_3<2, 0b110101, 0b001010010, | 
|  | 684 | (outs), (ins DFPRegs:$src1, DFPRegs:$src2), | 
|  | 685 | "fcmpd $src1, $src2\n\tnop", | 
|  | 686 | [(SPcmpfcc DFPRegs:$src1, DFPRegs:$src2)]>; | 
|  | 687 | } | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 688 |  | 
|  | 689 | //===----------------------------------------------------------------------===// | 
|  | 690 | // V9 Instructions | 
|  | 691 | //===----------------------------------------------------------------------===// | 
|  | 692 |  | 
|  | 693 | // V9 Conditional Moves. | 
| Eric Christopher | d7a7356 | 2010-06-21 20:22:35 +0000 | [diff] [blame] | 694 | let Predicates = [HasV9], Constraints = "$T = $dst" in { | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 695 | // Move Integer Register on Condition (MOVcc) p. 194 of the V9 manual. | 
|  | 696 | // FIXME: Add instruction encodings for the JIT some day. | 
|  | 697 | def MOVICCrr | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 698 | : Pseudo<(outs IntRegs:$dst), (ins IntRegs:$T, IntRegs:$F, CCOp:$cc), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 699 | "mov$cc %icc, $F, $dst", | 
|  | 700 | [(set IntRegs:$dst, | 
| Chris Lattner | 0c4dea4 | 2006-02-10 06:58:25 +0000 | [diff] [blame] | 701 | (SPselecticc IntRegs:$F, IntRegs:$T, imm:$cc))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 702 | def MOVICCri | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 703 | : Pseudo<(outs IntRegs:$dst), (ins IntRegs:$T, i32imm:$F, CCOp:$cc), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 704 | "mov$cc %icc, $F, $dst", | 
|  | 705 | [(set IntRegs:$dst, | 
| Chris Lattner | 0c4dea4 | 2006-02-10 06:58:25 +0000 | [diff] [blame] | 706 | (SPselecticc simm11:$F, IntRegs:$T, imm:$cc))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 707 |  | 
|  | 708 | def MOVFCCrr | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 709 | : Pseudo<(outs IntRegs:$dst), (ins IntRegs:$T, IntRegs:$F, CCOp:$cc), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 710 | "mov$cc %fcc0, $F, $dst", | 
|  | 711 | [(set IntRegs:$dst, | 
| Chris Lattner | 0c4dea4 | 2006-02-10 06:58:25 +0000 | [diff] [blame] | 712 | (SPselectfcc IntRegs:$F, IntRegs:$T, imm:$cc))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 713 | def MOVFCCri | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 714 | : Pseudo<(outs IntRegs:$dst), (ins IntRegs:$T, i32imm:$F, CCOp:$cc), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 715 | "mov$cc %fcc0, $F, $dst", | 
|  | 716 | [(set IntRegs:$dst, | 
| Chris Lattner | 0c4dea4 | 2006-02-10 06:58:25 +0000 | [diff] [blame] | 717 | (SPselectfcc simm11:$F, IntRegs:$T, imm:$cc))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 718 |  | 
|  | 719 | def FMOVS_ICC | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 720 | : Pseudo<(outs FPRegs:$dst), (ins FPRegs:$T, FPRegs:$F, CCOp:$cc), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 721 | "fmovs$cc %icc, $F, $dst", | 
|  | 722 | [(set FPRegs:$dst, | 
| Chris Lattner | 0c4dea4 | 2006-02-10 06:58:25 +0000 | [diff] [blame] | 723 | (SPselecticc FPRegs:$F, FPRegs:$T, imm:$cc))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 724 | def FMOVD_ICC | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 725 | : Pseudo<(outs DFPRegs:$dst), (ins DFPRegs:$T, DFPRegs:$F, CCOp:$cc), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 726 | "fmovd$cc %icc, $F, $dst", | 
|  | 727 | [(set DFPRegs:$dst, | 
| Chris Lattner | 0c4dea4 | 2006-02-10 06:58:25 +0000 | [diff] [blame] | 728 | (SPselecticc DFPRegs:$F, DFPRegs:$T, imm:$cc))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 729 | def FMOVS_FCC | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 730 | : Pseudo<(outs FPRegs:$dst), (ins FPRegs:$T, FPRegs:$F, CCOp:$cc), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 731 | "fmovs$cc %fcc0, $F, $dst", | 
|  | 732 | [(set FPRegs:$dst, | 
| Chris Lattner | 0c4dea4 | 2006-02-10 06:58:25 +0000 | [diff] [blame] | 733 | (SPselectfcc FPRegs:$F, FPRegs:$T, imm:$cc))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 734 | def FMOVD_FCC | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 735 | : Pseudo<(outs DFPRegs:$dst), (ins DFPRegs:$T, DFPRegs:$F, CCOp:$cc), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 736 | "fmovd$cc %fcc0, $F, $dst", | 
|  | 737 | [(set DFPRegs:$dst, | 
| Chris Lattner | 0c4dea4 | 2006-02-10 06:58:25 +0000 | [diff] [blame] | 738 | (SPselectfcc DFPRegs:$F, DFPRegs:$T, imm:$cc))]>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 739 |  | 
|  | 740 | } | 
|  | 741 |  | 
|  | 742 | // Floating-Point Move Instructions, p. 164 of the V9 manual. | 
|  | 743 | let Predicates = [HasV9] in { | 
|  | 744 | def FMOVD : F3_3<2, 0b110100, 0b000000010, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 745 | (outs DFPRegs:$dst), (ins DFPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 746 | "fmovd $src, $dst", []>; | 
|  | 747 | def FNEGD : F3_3<2, 0b110100, 0b000000110, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 748 | (outs DFPRegs:$dst), (ins DFPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 749 | "fnegd $src, $dst", | 
|  | 750 | [(set DFPRegs:$dst, (fneg DFPRegs:$src))]>; | 
|  | 751 | def FABSD : F3_3<2, 0b110100, 0b000001010, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 752 | (outs DFPRegs:$dst), (ins DFPRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 753 | "fabsd $src, $dst", | 
|  | 754 | [(set DFPRegs:$dst, (fabs DFPRegs:$src))]>; | 
|  | 755 | } | 
|  | 756 |  | 
|  | 757 | // POPCrr - This does a ctpop of a 64-bit register.  As such, we have to clear | 
|  | 758 | // the top 32-bits before using it.  To do this clearing, we use a SLLri X,0. | 
|  | 759 | def POPCrr : F3_1<2, 0b101110, | 
| Evan Cheng | 94b5a80 | 2007-07-19 01:14:50 +0000 | [diff] [blame] | 760 | (outs IntRegs:$dst), (ins IntRegs:$src), | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 761 | "popc $src, $dst", []>, Requires<[HasV9]>; | 
|  | 762 | def : Pat<(ctpop IntRegs:$src), | 
|  | 763 | (POPCrr (SLLri IntRegs:$src, 0))>; | 
|  | 764 |  | 
|  | 765 | //===----------------------------------------------------------------------===// | 
|  | 766 | // Non-Instruction Patterns | 
|  | 767 | //===----------------------------------------------------------------------===// | 
|  | 768 |  | 
|  | 769 | // Small immediates. | 
|  | 770 | def : Pat<(i32 simm13:$val), | 
|  | 771 | (ORri G0, imm:$val)>; | 
|  | 772 | // Arbitrary immediates. | 
|  | 773 | def : Pat<(i32 imm:$val), | 
|  | 774 | (ORri (SETHIi (HI22 imm:$val)), (LO10 imm:$val))>; | 
|  | 775 |  | 
| Nate Begeman | 5965bd1 | 2006-02-17 05:43:56 +0000 | [diff] [blame] | 776 | // subc | 
|  | 777 | def : Pat<(subc IntRegs:$b, IntRegs:$c), | 
|  | 778 | (SUBCCrr IntRegs:$b, IntRegs:$c)>; | 
|  | 779 | def : Pat<(subc IntRegs:$b, simm13:$val), | 
|  | 780 | (SUBCCri IntRegs:$b, imm:$val)>; | 
|  | 781 |  | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 782 | // Global addresses, constant pool entries | 
|  | 783 | def : Pat<(SPhi tglobaladdr:$in), (SETHIi tglobaladdr:$in)>; | 
|  | 784 | def : Pat<(SPlo tglobaladdr:$in), (ORri G0, tglobaladdr:$in)>; | 
|  | 785 | def : Pat<(SPhi tconstpool:$in), (SETHIi tconstpool:$in)>; | 
|  | 786 | def : Pat<(SPlo tconstpool:$in), (ORri G0, tconstpool:$in)>; | 
|  | 787 |  | 
|  | 788 | // Add reg, lo.  This is used when taking the addr of a global/constpool entry. | 
|  | 789 | def : Pat<(add IntRegs:$r, (SPlo tglobaladdr:$in)), | 
|  | 790 | (ADDri IntRegs:$r, tglobaladdr:$in)>; | 
|  | 791 | def : Pat<(add IntRegs:$r, (SPlo tconstpool:$in)), | 
|  | 792 | (ADDri IntRegs:$r, tconstpool:$in)>; | 
|  | 793 |  | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 794 | // Calls: | 
|  | 795 | def : Pat<(call tglobaladdr:$dst), | 
|  | 796 | (CALL tglobaladdr:$dst)>; | 
| Chris Lattner | fcb8a3a | 2006-02-10 07:35:42 +0000 | [diff] [blame] | 797 | def : Pat<(call texternalsym:$dst), | 
|  | 798 | (CALL texternalsym:$dst)>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 799 |  | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 800 | // Map integer extload's to zextloads. | 
| Evan Cheng | e71fe34d | 2006-10-09 20:57:25 +0000 | [diff] [blame] | 801 | def : Pat<(i32 (extloadi1 ADDRrr:$src)), (LDUBrr ADDRrr:$src)>; | 
|  | 802 | def : Pat<(i32 (extloadi1 ADDRri:$src)), (LDUBri ADDRri:$src)>; | 
|  | 803 | def : Pat<(i32 (extloadi8 ADDRrr:$src)), (LDUBrr ADDRrr:$src)>; | 
|  | 804 | def : Pat<(i32 (extloadi8 ADDRri:$src)), (LDUBri ADDRri:$src)>; | 
|  | 805 | def : Pat<(i32 (extloadi16 ADDRrr:$src)), (LDUHrr ADDRrr:$src)>; | 
|  | 806 | def : Pat<(i32 (extloadi16 ADDRri:$src)), (LDUHri ADDRri:$src)>; | 
| Chris Lattner | 158e1f5 | 2006-02-05 05:50:24 +0000 | [diff] [blame] | 807 |  | 
|  | 808 | // zextload bool -> zextload byte | 
| Evan Cheng | e71fe34d | 2006-10-09 20:57:25 +0000 | [diff] [blame] | 809 | def : Pat<(i32 (zextloadi1 ADDRrr:$src)), (LDUBrr ADDRrr:$src)>; | 
|  | 810 | def : Pat<(i32 (zextloadi1 ADDRri:$src)), (LDUBri ADDRri:$src)>; |