| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 1 | //===-- AMDGPUInstructions.td - Common instruction defs ---*- 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 contains instruction defs that are common to all hw codegen | 
|  | 11 | // targets. | 
|  | 12 | // | 
|  | 13 | //===----------------------------------------------------------------------===// | 
|  | 14 |  | 
|  | 15 | class AMDGPUInst <dag outs, dag ins, string asm, list<dag> pattern> : Instruction { | 
| Tom Stellard | f3b2a1e | 2013-02-06 17:32:29 +0000 | [diff] [blame] | 16 | field bit isRegisterLoad = 0; | 
|  | 17 | field bit isRegisterStore = 0; | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 18 |  | 
|  | 19 | let Namespace = "AMDGPU"; | 
|  | 20 | let OutOperandList = outs; | 
|  | 21 | let InOperandList = ins; | 
|  | 22 | let AsmString = asm; | 
|  | 23 | let Pattern = pattern; | 
|  | 24 | let Itinerary = NullALU; | 
| Tom Stellard | f3b2a1e | 2013-02-06 17:32:29 +0000 | [diff] [blame] | 25 |  | 
|  | 26 | let TSFlags{63} = isRegisterLoad; | 
|  | 27 | let TSFlags{62} = isRegisterStore; | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 28 | } | 
|  | 29 |  | 
|  | 30 | class AMDGPUShaderInst <dag outs, dag ins, string asm, list<dag> pattern> | 
|  | 31 | : AMDGPUInst<outs, ins, asm, pattern> { | 
|  | 32 |  | 
|  | 33 | field bits<32> Inst = 0xffffffff; | 
|  | 34 |  | 
|  | 35 | } | 
|  | 36 |  | 
| Matt Arsenault | f171cf2 | 2014-07-14 23:40:49 +0000 | [diff] [blame] | 37 | def FP32Denormals : Predicate<"Subtarget.hasFP32Denormals()">; | 
|  | 38 | def FP64Denormals : Predicate<"Subtarget.hasFP64Denormals()">; | 
| Matt Arsenault | 1d07774 | 2014-07-15 20:18:24 +0000 | [diff] [blame] | 39 | def UnsafeFPMath : Predicate<"TM.Options.UnsafeFPMath">; | 
| Matt Arsenault | f171cf2 | 2014-07-14 23:40:49 +0000 | [diff] [blame] | 40 |  | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 41 | def InstFlag : OperandWithDefaultOps <i32, (ops (i32 0))>; | 
| Tom Stellard | 81d871d | 2013-11-13 23:36:50 +0000 | [diff] [blame] | 42 | def ADDRIndirect : ComplexPattern<iPTR, 2, "SelectADDRIndirect", [], []>; | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 43 |  | 
| Tom Stellard | b02094e | 2014-07-21 15:45:01 +0000 | [diff] [blame] | 44 | let OperandType = "OPERAND_IMMEDIATE" in { | 
|  | 45 |  | 
| Matt Arsenault | 4d7d383 | 2014-04-15 22:32:49 +0000 | [diff] [blame] | 46 | def u32imm : Operand<i32> { | 
|  | 47 | let PrintMethod = "printU32ImmOperand"; | 
|  | 48 | } | 
|  | 49 |  | 
|  | 50 | def u16imm : Operand<i16> { | 
|  | 51 | let PrintMethod = "printU16ImmOperand"; | 
|  | 52 | } | 
|  | 53 |  | 
|  | 54 | def u8imm : Operand<i8> { | 
|  | 55 | let PrintMethod = "printU8ImmOperand"; | 
|  | 56 | } | 
|  | 57 |  | 
| Tom Stellard | b02094e | 2014-07-21 15:45:01 +0000 | [diff] [blame] | 58 | } // End OperandType = "OPERAND_IMMEDIATE" | 
|  | 59 |  | 
| Tom Stellard | bc5b537 | 2014-06-13 16:38:59 +0000 | [diff] [blame] | 60 | //===--------------------------------------------------------------------===// | 
|  | 61 | // Custom Operands | 
|  | 62 | //===--------------------------------------------------------------------===// | 
|  | 63 | def brtarget   : Operand<OtherVT>; | 
|  | 64 |  | 
| Tom Stellard | c084533 | 2013-11-22 23:07:58 +0000 | [diff] [blame] | 65 | //===----------------------------------------------------------------------===// | 
|  | 66 | // PatLeafs for floating-point comparisons | 
|  | 67 | //===----------------------------------------------------------------------===// | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 68 |  | 
| Tom Stellard | 0351ea2 | 2013-09-28 02:50:50 +0000 | [diff] [blame] | 69 | def COND_OEQ : PatLeaf < | 
|  | 70 | (cond), | 
|  | 71 | [{return N->get() == ISD::SETOEQ || N->get() == ISD::SETEQ;}] | 
|  | 72 | >; | 
|  | 73 |  | 
| Tom Stellard | 0351ea2 | 2013-09-28 02:50:50 +0000 | [diff] [blame] | 74 | def COND_OGT : PatLeaf < | 
|  | 75 | (cond), | 
|  | 76 | [{return N->get() == ISD::SETOGT || N->get() == ISD::SETGT;}] | 
|  | 77 | >; | 
|  | 78 |  | 
| Tom Stellard | 0351ea2 | 2013-09-28 02:50:50 +0000 | [diff] [blame] | 79 | def COND_OGE : PatLeaf < | 
|  | 80 | (cond), | 
|  | 81 | [{return N->get() == ISD::SETOGE || N->get() == ISD::SETGE;}] | 
|  | 82 | >; | 
|  | 83 |  | 
| Tom Stellard | c084533 | 2013-11-22 23:07:58 +0000 | [diff] [blame] | 84 | def COND_OLT : PatLeaf < | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 85 | (cond), | 
| Tom Stellard | c084533 | 2013-11-22 23:07:58 +0000 | [diff] [blame] | 86 | [{return N->get() == ISD::SETOLT || N->get() == ISD::SETLT;}] | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 87 | >; | 
|  | 88 |  | 
| Tom Stellard | c084533 | 2013-11-22 23:07:58 +0000 | [diff] [blame] | 89 | def COND_OLE : PatLeaf < | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 90 | (cond), | 
| Tom Stellard | c084533 | 2013-11-22 23:07:58 +0000 | [diff] [blame] | 91 | [{return N->get() == ISD::SETOLE || N->get() == ISD::SETLE;}] | 
|  | 92 | >; | 
|  | 93 |  | 
|  | 94 | def COND_UNE : PatLeaf < | 
|  | 95 | (cond), | 
|  | 96 | [{return N->get() == ISD::SETUNE || N->get() == ISD::SETNE;}] | 
|  | 97 | >; | 
|  | 98 |  | 
|  | 99 | def COND_O : PatLeaf <(cond), [{return N->get() == ISD::SETO;}]>; | 
|  | 100 | def COND_UO : PatLeaf <(cond), [{return N->get() == ISD::SETUO;}]>; | 
|  | 101 |  | 
|  | 102 | //===----------------------------------------------------------------------===// | 
|  | 103 | // PatLeafs for unsigned comparisons | 
|  | 104 | //===----------------------------------------------------------------------===// | 
|  | 105 |  | 
|  | 106 | def COND_UGT : PatLeaf <(cond), [{return N->get() == ISD::SETUGT;}]>; | 
|  | 107 | def COND_UGE : PatLeaf <(cond), [{return N->get() == ISD::SETUGE;}]>; | 
|  | 108 | def COND_ULT : PatLeaf <(cond), [{return N->get() == ISD::SETULT;}]>; | 
|  | 109 | def COND_ULE : PatLeaf <(cond), [{return N->get() == ISD::SETULE;}]>; | 
|  | 110 |  | 
|  | 111 | //===----------------------------------------------------------------------===// | 
|  | 112 | // PatLeafs for signed comparisons | 
|  | 113 | //===----------------------------------------------------------------------===// | 
|  | 114 |  | 
|  | 115 | def COND_SGT : PatLeaf <(cond), [{return N->get() == ISD::SETGT;}]>; | 
|  | 116 | def COND_SGE : PatLeaf <(cond), [{return N->get() == ISD::SETGE;}]>; | 
|  | 117 | def COND_SLT : PatLeaf <(cond), [{return N->get() == ISD::SETLT;}]>; | 
|  | 118 | def COND_SLE : PatLeaf <(cond), [{return N->get() == ISD::SETLE;}]>; | 
|  | 119 |  | 
|  | 120 | //===----------------------------------------------------------------------===// | 
|  | 121 | // PatLeafs for integer equality | 
|  | 122 | //===----------------------------------------------------------------------===// | 
|  | 123 |  | 
|  | 124 | def COND_EQ : PatLeaf < | 
|  | 125 | (cond), | 
|  | 126 | [{return N->get() == ISD::SETEQ || N->get() == ISD::SETUEQ;}] | 
|  | 127 | >; | 
|  | 128 |  | 
|  | 129 | def COND_NE : PatLeaf < | 
|  | 130 | (cond), | 
|  | 131 | [{return N->get() == ISD::SETNE || N->get() == ISD::SETUNE;}] | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 132 | >; | 
|  | 133 |  | 
| Christian Konig | b19849a | 2013-02-21 15:17:04 +0000 | [diff] [blame] | 134 | def COND_NULL : PatLeaf < | 
|  | 135 | (cond), | 
| Tom Stellard | aa9a1a8 | 2014-08-01 02:05:57 +0000 | [diff] [blame] | 136 | [{(void)N; return false;}] | 
| Christian Konig | b19849a | 2013-02-21 15:17:04 +0000 | [diff] [blame] | 137 | >; | 
|  | 138 |  | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 139 | //===----------------------------------------------------------------------===// | 
|  | 140 | // Load/Store Pattern Fragments | 
|  | 141 | //===----------------------------------------------------------------------===// | 
|  | 142 |  | 
| Tom Stellard | b02094e | 2014-07-21 15:45:01 +0000 | [diff] [blame] | 143 | class PrivateMemOp <dag ops, dag frag> : PatFrag <ops, frag, [{ | 
|  | 144 | return cast<MemSDNode>(N)->getAddressSpace() == AMDGPUAS::PRIVATE_ADDRESS; | 
|  | 145 | }]>; | 
|  | 146 |  | 
|  | 147 | class PrivateLoad <SDPatternOperator op> : PrivateMemOp < | 
|  | 148 | (ops node:$ptr), (op node:$ptr) | 
|  | 149 | >; | 
|  | 150 |  | 
|  | 151 | class PrivateStore <SDPatternOperator op> : PrivateMemOp < | 
|  | 152 | (ops node:$value, node:$ptr), (op node:$value, node:$ptr) | 
|  | 153 | >; | 
|  | 154 |  | 
|  | 155 | def extloadi8_private : PrivateLoad <extloadi8>; | 
|  | 156 | def sextloadi8_private : PrivateLoad <sextloadi8>; | 
|  | 157 | def extloadi16_private : PrivateLoad <extloadi16>; | 
|  | 158 | def sextloadi16_private : PrivateLoad <sextloadi16>; | 
|  | 159 | def load_private : PrivateLoad <load>; | 
|  | 160 |  | 
|  | 161 | def truncstorei8_private : PrivateStore <truncstorei8>; | 
|  | 162 | def truncstorei16_private : PrivateStore <truncstorei16>; | 
|  | 163 | def store_private : PrivateStore <store>; | 
|  | 164 |  | 
| Tom Stellard | bc5b537 | 2014-06-13 16:38:59 +0000 | [diff] [blame] | 165 | def global_store : PatFrag<(ops node:$val, node:$ptr), | 
|  | 166 | (store node:$val, node:$ptr), [{ | 
|  | 167 | return isGlobalStore(dyn_cast<StoreSDNode>(N)); | 
|  | 168 | }]>; | 
|  | 169 |  | 
|  | 170 | // Global address space loads | 
|  | 171 | def global_load : PatFrag<(ops node:$ptr), (load node:$ptr), [{ | 
|  | 172 | return isGlobalLoad(dyn_cast<LoadSDNode>(N)); | 
|  | 173 | }]>; | 
|  | 174 |  | 
|  | 175 | // Constant address space loads | 
|  | 176 | def constant_load : PatFrag<(ops node:$ptr), (load node:$ptr), [{ | 
|  | 177 | return isConstantLoad(dyn_cast<LoadSDNode>(N), -1); | 
|  | 178 | }]>; | 
|  | 179 |  | 
| Tom Stellard | 31209cc | 2013-07-15 19:00:09 +0000 | [diff] [blame] | 180 | def az_extload : PatFrag<(ops node:$ptr), (unindexedload node:$ptr), [{ | 
|  | 181 | LoadSDNode *L = cast<LoadSDNode>(N); | 
|  | 182 | return L->getExtensionType() == ISD::ZEXTLOAD || | 
|  | 183 | L->getExtensionType() == ISD::EXTLOAD; | 
|  | 184 | }]>; | 
|  | 185 |  | 
| Tom Stellard | 33dd04b | 2013-07-23 01:47:52 +0000 | [diff] [blame] | 186 | def az_extloadi8 : PatFrag<(ops node:$ptr), (az_extload node:$ptr), [{ | 
|  | 187 | return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8; | 
|  | 188 | }]>; | 
|  | 189 |  | 
| Tom Stellard | c6f4a29 | 2013-08-26 15:05:59 +0000 | [diff] [blame] | 190 | def az_extloadi8_global : PatFrag<(ops node:$ptr), (az_extloadi8 node:$ptr), [{ | 
|  | 191 | return isGlobalLoad(dyn_cast<LoadSDNode>(N)); | 
|  | 192 | }]>; | 
|  | 193 |  | 
| Tom Stellard | 9f95033 | 2013-07-23 01:48:35 +0000 | [diff] [blame] | 194 | def sextloadi8_global : PatFrag<(ops node:$ptr), (sextloadi8 node:$ptr), [{ | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 195 | return isGlobalLoad(dyn_cast<LoadSDNode>(N)); | 
|  | 196 | }]>; | 
|  | 197 |  | 
| Matt Arsenault | 3f98140 | 2014-09-15 15:41:53 +0000 | [diff] [blame] | 198 | def az_extloadi8_flat : PatFrag<(ops node:$ptr), (az_extloadi8 node:$ptr), [{ | 
|  | 199 | return isFlatLoad(dyn_cast<LoadSDNode>(N)); | 
|  | 200 | }]>; | 
|  | 201 |  | 
|  | 202 | def sextloadi8_flat : PatFrag<(ops node:$ptr), (sextloadi8 node:$ptr), [{ | 
|  | 203 | return isFlatLoad(dyn_cast<LoadSDNode>(N)); | 
|  | 204 | }]>; | 
|  | 205 |  | 
| Tom Stellard | 33dd04b | 2013-07-23 01:47:52 +0000 | [diff] [blame] | 206 | def az_extloadi8_constant : PatFrag<(ops node:$ptr), (az_extloadi8 node:$ptr), [{ | 
| Tom Stellard | 9f95033 | 2013-07-23 01:48:35 +0000 | [diff] [blame] | 207 | return isConstantLoad(dyn_cast<LoadSDNode>(N), -1); | 
|  | 208 | }]>; | 
|  | 209 |  | 
|  | 210 | def sextloadi8_constant : PatFrag<(ops node:$ptr), (sextloadi8 node:$ptr), [{ | 
|  | 211 | return isConstantLoad(dyn_cast<LoadSDNode>(N), -1); | 
|  | 212 | }]>; | 
|  | 213 |  | 
| Tom Stellard | c6f4a29 | 2013-08-26 15:05:59 +0000 | [diff] [blame] | 214 | def az_extloadi8_local : PatFrag<(ops node:$ptr), (az_extloadi8 node:$ptr), [{ | 
|  | 215 | return isLocalLoad(dyn_cast<LoadSDNode>(N)); | 
|  | 216 | }]>; | 
|  | 217 |  | 
|  | 218 | def sextloadi8_local : PatFrag<(ops node:$ptr), (sextloadi8 node:$ptr), [{ | 
|  | 219 | return isLocalLoad(dyn_cast<LoadSDNode>(N)); | 
| Tom Stellard | 33dd04b | 2013-07-23 01:47:52 +0000 | [diff] [blame] | 220 | }]>; | 
|  | 221 |  | 
|  | 222 | def az_extloadi16 : PatFrag<(ops node:$ptr), (az_extload node:$ptr), [{ | 
|  | 223 | return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16; | 
|  | 224 | }]>; | 
|  | 225 |  | 
|  | 226 | def az_extloadi16_global : PatFrag<(ops node:$ptr), (az_extloadi16 node:$ptr), [{ | 
|  | 227 | return isGlobalLoad(dyn_cast<LoadSDNode>(N)); | 
|  | 228 | }]>; | 
|  | 229 |  | 
| Tom Stellard | 9f95033 | 2013-07-23 01:48:35 +0000 | [diff] [blame] | 230 | def sextloadi16_global : PatFrag<(ops node:$ptr), (sextloadi16 node:$ptr), [{ | 
| Tom Stellard | 07a10a3 | 2013-06-03 17:39:43 +0000 | [diff] [blame] | 231 | return isGlobalLoad(dyn_cast<LoadSDNode>(N)); | 
|  | 232 | }]>; | 
|  | 233 |  | 
| Matt Arsenault | 3f98140 | 2014-09-15 15:41:53 +0000 | [diff] [blame] | 234 | def az_extloadi16_flat : PatFrag<(ops node:$ptr), (az_extloadi16 node:$ptr), [{ | 
|  | 235 | return isFlatLoad(dyn_cast<LoadSDNode>(N)); | 
|  | 236 | }]>; | 
|  | 237 |  | 
|  | 238 | def sextloadi16_flat : PatFrag<(ops node:$ptr), (sextloadi16 node:$ptr), [{ | 
|  | 239 | return isFlatLoad(dyn_cast<LoadSDNode>(N)); | 
|  | 240 | }]>; | 
|  | 241 |  | 
| Tom Stellard | 9f95033 | 2013-07-23 01:48:35 +0000 | [diff] [blame] | 242 | def az_extloadi16_constant : PatFrag<(ops node:$ptr), (az_extloadi16 node:$ptr), [{ | 
|  | 243 | return isConstantLoad(dyn_cast<LoadSDNode>(N), -1); | 
|  | 244 | }]>; | 
|  | 245 |  | 
|  | 246 | def sextloadi16_constant : PatFrag<(ops node:$ptr), (sextloadi16 node:$ptr), [{ | 
|  | 247 | return isConstantLoad(dyn_cast<LoadSDNode>(N), -1); | 
|  | 248 | }]>; | 
|  | 249 |  | 
| Tom Stellard | c6f4a29 | 2013-08-26 15:05:59 +0000 | [diff] [blame] | 250 | def az_extloadi16_local : PatFrag<(ops node:$ptr), (az_extloadi16 node:$ptr), [{ | 
|  | 251 | return isLocalLoad(dyn_cast<LoadSDNode>(N)); | 
|  | 252 | }]>; | 
|  | 253 |  | 
|  | 254 | def sextloadi16_local : PatFrag<(ops node:$ptr), (sextloadi16 node:$ptr), [{ | 
|  | 255 | return isLocalLoad(dyn_cast<LoadSDNode>(N)); | 
|  | 256 | }]>; | 
|  | 257 |  | 
| Tom Stellard | 31209cc | 2013-07-15 19:00:09 +0000 | [diff] [blame] | 258 | def az_extloadi32 : PatFrag<(ops node:$ptr), (az_extload node:$ptr), [{ | 
|  | 259 | return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32; | 
|  | 260 | }]>; | 
|  | 261 |  | 
|  | 262 | def az_extloadi32_global : PatFrag<(ops node:$ptr), | 
|  | 263 | (az_extloadi32 node:$ptr), [{ | 
|  | 264 | return isGlobalLoad(dyn_cast<LoadSDNode>(N)); | 
|  | 265 | }]>; | 
|  | 266 |  | 
| Matt Arsenault | 3f98140 | 2014-09-15 15:41:53 +0000 | [diff] [blame] | 267 | def az_extloadi32_flat : PatFrag<(ops node:$ptr), | 
|  | 268 | (az_extloadi32 node:$ptr), [{ | 
|  | 269 | return isFlatLoad(dyn_cast<LoadSDNode>(N)); | 
|  | 270 | }]>; | 
|  | 271 |  | 
| Tom Stellard | 31209cc | 2013-07-15 19:00:09 +0000 | [diff] [blame] | 272 | def az_extloadi32_constant : PatFrag<(ops node:$ptr), | 
|  | 273 | (az_extloadi32 node:$ptr), [{ | 
|  | 274 | return isConstantLoad(dyn_cast<LoadSDNode>(N), -1); | 
|  | 275 | }]>; | 
|  | 276 |  | 
| Tom Stellard | d3ee8c1 | 2013-08-16 01:12:06 +0000 | [diff] [blame] | 277 | def truncstorei8_global : PatFrag<(ops node:$val, node:$ptr), | 
|  | 278 | (truncstorei8 node:$val, node:$ptr), [{ | 
|  | 279 | return isGlobalStore(dyn_cast<StoreSDNode>(N)); | 
|  | 280 | }]>; | 
|  | 281 |  | 
|  | 282 | def truncstorei16_global : PatFrag<(ops node:$val, node:$ptr), | 
|  | 283 | (truncstorei16 node:$val, node:$ptr), [{ | 
|  | 284 | return isGlobalStore(dyn_cast<StoreSDNode>(N)); | 
|  | 285 | }]>; | 
|  | 286 |  | 
| Matt Arsenault | 3f98140 | 2014-09-15 15:41:53 +0000 | [diff] [blame] | 287 | def truncstorei8_flat : PatFrag<(ops node:$val, node:$ptr), | 
|  | 288 | (truncstorei8 node:$val, node:$ptr), [{ | 
|  | 289 | return isFlatStore(dyn_cast<StoreSDNode>(N)); | 
|  | 290 | }]>; | 
|  | 291 |  | 
|  | 292 | def truncstorei16_flat : PatFrag<(ops node:$val, node:$ptr), | 
|  | 293 | (truncstorei16 node:$val, node:$ptr), [{ | 
|  | 294 | return isFlatStore(dyn_cast<StoreSDNode>(N)); | 
|  | 295 | }]>; | 
|  | 296 |  | 
| Tom Stellard | c026e8b | 2013-06-28 15:47:08 +0000 | [diff] [blame] | 297 | def local_store : PatFrag<(ops node:$val, node:$ptr), | 
|  | 298 | (store node:$val, node:$ptr), [{ | 
| Tom Stellard | f3d166a | 2013-08-26 15:05:49 +0000 | [diff] [blame] | 299 | return isLocalStore(dyn_cast<StoreSDNode>(N)); | 
|  | 300 | }]>; | 
|  | 301 |  | 
|  | 302 | def truncstorei8_local : PatFrag<(ops node:$val, node:$ptr), | 
|  | 303 | (truncstorei8 node:$val, node:$ptr), [{ | 
|  | 304 | return isLocalStore(dyn_cast<StoreSDNode>(N)); | 
|  | 305 | }]>; | 
|  | 306 |  | 
|  | 307 | def truncstorei16_local : PatFrag<(ops node:$val, node:$ptr), | 
|  | 308 | (truncstorei16 node:$val, node:$ptr), [{ | 
|  | 309 | return isLocalStore(dyn_cast<StoreSDNode>(N)); | 
|  | 310 | }]>; | 
|  | 311 |  | 
|  | 312 | def local_load : PatFrag<(ops node:$ptr), (load node:$ptr), [{ | 
|  | 313 | return isLocalLoad(dyn_cast<LoadSDNode>(N)); | 
| Tom Stellard | c026e8b | 2013-06-28 15:47:08 +0000 | [diff] [blame] | 314 | }]>; | 
|  | 315 |  | 
| Tom Stellard | f3fc555 | 2014-08-22 18:49:35 +0000 | [diff] [blame] | 316 | class Aligned8Bytes <dag ops, dag frag> : PatFrag <ops, frag, [{ | 
|  | 317 | return cast<MemSDNode>(N)->getAlignment() % 8 == 0; | 
|  | 318 | }]>; | 
|  | 319 |  | 
|  | 320 | def local_load_aligned8bytes : Aligned8Bytes < | 
|  | 321 | (ops node:$ptr), (local_load node:$ptr) | 
|  | 322 | >; | 
|  | 323 |  | 
|  | 324 | def local_store_aligned8bytes : Aligned8Bytes < | 
|  | 325 | (ops node:$val, node:$ptr), (local_store node:$val, node:$ptr) | 
|  | 326 | >; | 
| Matt Arsenault | 7257410 | 2014-06-11 18:08:34 +0000 | [diff] [blame] | 327 |  | 
|  | 328 | class local_binary_atomic_op<SDNode atomic_op> : | 
|  | 329 | PatFrag<(ops node:$ptr, node:$value), | 
|  | 330 | (atomic_op node:$ptr, node:$value), [{ | 
|  | 331 | return cast<MemSDNode>(N)->getAddressSpace() == AMDGPUAS::LOCAL_ADDRESS; | 
| Tom Stellard | 13c68ef | 2013-09-05 18:38:09 +0000 | [diff] [blame] | 332 | }]>; | 
|  | 333 |  | 
| Matt Arsenault | 7257410 | 2014-06-11 18:08:34 +0000 | [diff] [blame] | 334 |  | 
|  | 335 | def atomic_swap_local : local_binary_atomic_op<atomic_swap>; | 
|  | 336 | def atomic_load_add_local : local_binary_atomic_op<atomic_load_add>; | 
|  | 337 | def atomic_load_sub_local : local_binary_atomic_op<atomic_load_sub>; | 
|  | 338 | def atomic_load_and_local : local_binary_atomic_op<atomic_load_and>; | 
|  | 339 | def atomic_load_or_local : local_binary_atomic_op<atomic_load_or>; | 
|  | 340 | def atomic_load_xor_local : local_binary_atomic_op<atomic_load_xor>; | 
|  | 341 | def atomic_load_nand_local : local_binary_atomic_op<atomic_load_nand>; | 
|  | 342 | def atomic_load_min_local : local_binary_atomic_op<atomic_load_min>; | 
|  | 343 | def atomic_load_max_local : local_binary_atomic_op<atomic_load_max>; | 
|  | 344 | def atomic_load_umin_local : local_binary_atomic_op<atomic_load_umin>; | 
|  | 345 | def atomic_load_umax_local : local_binary_atomic_op<atomic_load_umax>; | 
| Aaron Watry | 372cecf | 2013-09-06 20:17:42 +0000 | [diff] [blame] | 346 |  | 
| Tom Stellard | d3ee8c1 | 2013-08-16 01:12:06 +0000 | [diff] [blame] | 347 | def mskor_global : PatFrag<(ops node:$val, node:$ptr), | 
|  | 348 | (AMDGPUstore_mskor node:$val, node:$ptr), [{ | 
|  | 349 | return dyn_cast<MemSDNode>(N)->getAddressSpace() == AMDGPUAS::GLOBAL_ADDRESS; | 
|  | 350 | }]>; | 
|  | 351 |  | 
| Matt Arsenault | 3f98140 | 2014-09-15 15:41:53 +0000 | [diff] [blame] | 352 |  | 
| Matt Arsenault | c793e1d | 2014-06-11 18:08:48 +0000 | [diff] [blame] | 353 | def atomic_cmp_swap_32_local : | 
|  | 354 | PatFrag<(ops node:$ptr, node:$cmp, node:$swap), | 
|  | 355 | (atomic_cmp_swap node:$ptr, node:$cmp, node:$swap), [{ | 
|  | 356 | AtomicSDNode *AN = cast<AtomicSDNode>(N); | 
|  | 357 | return AN->getMemoryVT() == MVT::i32 && | 
|  | 358 | AN->getAddressSpace() == AMDGPUAS::LOCAL_ADDRESS; | 
|  | 359 | }]>; | 
|  | 360 |  | 
| Matt Arsenault | caa0ec2 | 2014-06-11 18:08:54 +0000 | [diff] [blame] | 361 | def atomic_cmp_swap_64_local : | 
|  | 362 | PatFrag<(ops node:$ptr, node:$cmp, node:$swap), | 
|  | 363 | (atomic_cmp_swap node:$ptr, node:$cmp, node:$swap), [{ | 
|  | 364 | AtomicSDNode *AN = cast<AtomicSDNode>(N); | 
|  | 365 | return AN->getMemoryVT() == MVT::i64 && | 
|  | 366 | AN->getAddressSpace() == AMDGPUAS::LOCAL_ADDRESS; | 
|  | 367 | }]>; | 
|  | 368 |  | 
| Matt Arsenault | 3f98140 | 2014-09-15 15:41:53 +0000 | [diff] [blame] | 369 | def flat_load : PatFrag<(ops node:$ptr), (load node:$ptr), [{ | 
|  | 370 | return isFlatLoad(dyn_cast<LoadSDNode>(N)); | 
|  | 371 | }]>; | 
|  | 372 |  | 
|  | 373 | def flat_store : PatFrag<(ops node:$val, node:$ptr), | 
|  | 374 | (store node:$val, node:$ptr), [{ | 
|  | 375 | return isFlatStore(dyn_cast<StoreSDNode>(N)); | 
|  | 376 | }]>; | 
|  | 377 |  | 
|  | 378 | def mskor_flat : PatFrag<(ops node:$val, node:$ptr), | 
|  | 379 | (AMDGPUstore_mskor node:$val, node:$ptr), [{ | 
|  | 380 | return dyn_cast<MemSDNode>(N)->getAddressSpace() == AMDGPUAS::FLAT_ADDRESS; | 
|  | 381 | }]>; | 
|  | 382 |  | 
| Tom Stellard | b4a313a | 2014-08-01 00:32:39 +0000 | [diff] [blame] | 383 | //===----------------------------------------------------------------------===// | 
|  | 384 | // Misc Pattern Fragments | 
|  | 385 | //===----------------------------------------------------------------------===// | 
|  | 386 |  | 
|  | 387 | def fmad : PatFrag < | 
|  | 388 | (ops node:$src0, node:$src1, node:$src2), | 
|  | 389 | (fadd (fmul node:$src0, node:$src1), node:$src2) | 
|  | 390 | >; | 
| Matt Arsenault | c793e1d | 2014-06-11 18:08:48 +0000 | [diff] [blame] | 391 |  | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 392 | class Constants { | 
|  | 393 | int TWO_PI = 0x40c90fdb; | 
|  | 394 | int PI = 0x40490fdb; | 
|  | 395 | int TWO_PI_INV = 0x3e22f983; | 
| NAKAMURA Takumi | 4bb85f9 | 2013-10-28 04:07:23 +0000 | [diff] [blame] | 396 | int FP_UINT_MAX_PLUS_1 = 0x4f800000;    // 1 << 32 in floating point encoding | 
| Matt Arsenault | aeca2fa | 2014-05-31 06:47:42 +0000 | [diff] [blame] | 397 | int FP32_NEG_ONE = 0xbf800000; | 
|  | 398 | int FP32_ONE = 0x3f800000; | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 399 | } | 
|  | 400 | def CONST : Constants; | 
|  | 401 |  | 
|  | 402 | def FP_ZERO : PatLeaf < | 
|  | 403 | (fpimm), | 
|  | 404 | [{return N->getValueAPF().isZero();}] | 
|  | 405 | >; | 
|  | 406 |  | 
|  | 407 | def FP_ONE : PatLeaf < | 
|  | 408 | (fpimm), | 
|  | 409 | [{return N->isExactlyValue(1.0);}] | 
|  | 410 | >; | 
|  | 411 |  | 
| Tom Stellard | f3b2a1e | 2013-02-06 17:32:29 +0000 | [diff] [blame] | 412 | let isCodeGenOnly = 1, isPseudo = 1 in { | 
|  | 413 |  | 
|  | 414 | let usesCustomInserter = 1  in { | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 415 |  | 
|  | 416 | class CLAMP <RegisterClass rc> : AMDGPUShaderInst < | 
|  | 417 | (outs rc:$dst), | 
|  | 418 | (ins rc:$src0), | 
|  | 419 | "CLAMP $dst, $src0", | 
| Matt Arsenault | 5d47d4a | 2014-06-12 21:15:44 +0000 | [diff] [blame] | 420 | [(set f32:$dst, (AMDGPUclamp f32:$src0, (f32 FP_ZERO), (f32 FP_ONE)))] | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 421 | >; | 
|  | 422 |  | 
|  | 423 | class FABS <RegisterClass rc> : AMDGPUShaderInst < | 
|  | 424 | (outs rc:$dst), | 
|  | 425 | (ins rc:$src0), | 
|  | 426 | "FABS $dst, $src0", | 
| Tom Stellard | 40b7f1f | 2013-05-02 15:30:12 +0000 | [diff] [blame] | 427 | [(set f32:$dst, (fabs f32:$src0))] | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 428 | >; | 
|  | 429 |  | 
|  | 430 | class FNEG <RegisterClass rc> : AMDGPUShaderInst < | 
|  | 431 | (outs rc:$dst), | 
|  | 432 | (ins rc:$src0), | 
|  | 433 | "FNEG $dst, $src0", | 
| Tom Stellard | 40b7f1f | 2013-05-02 15:30:12 +0000 | [diff] [blame] | 434 | [(set f32:$dst, (fneg f32:$src0))] | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 435 | >; | 
|  | 436 |  | 
| Tom Stellard | f3b2a1e | 2013-02-06 17:32:29 +0000 | [diff] [blame] | 437 | } // usesCustomInserter = 1 | 
|  | 438 |  | 
|  | 439 | multiclass RegisterLoadStore <RegisterClass dstClass, Operand addrClass, | 
|  | 440 | ComplexPattern addrPat> { | 
| Tom Stellard | 81d871d | 2013-11-13 23:36:50 +0000 | [diff] [blame] | 441 | let UseNamedOperandTable = 1 in { | 
|  | 442 |  | 
| Tom Stellard | f3b2a1e | 2013-02-06 17:32:29 +0000 | [diff] [blame] | 443 | def RegisterLoad : AMDGPUShaderInst < | 
|  | 444 | (outs dstClass:$dst), | 
|  | 445 | (ins addrClass:$addr, i32imm:$chan), | 
|  | 446 | "RegisterLoad $dst, $addr", | 
| Tom Stellard | 40b7f1f | 2013-05-02 15:30:12 +0000 | [diff] [blame] | 447 | [(set i32:$dst, (AMDGPUregister_load addrPat:$addr, (i32 timm:$chan)))] | 
| Tom Stellard | f3b2a1e | 2013-02-06 17:32:29 +0000 | [diff] [blame] | 448 | > { | 
|  | 449 | let isRegisterLoad = 1; | 
|  | 450 | } | 
|  | 451 |  | 
|  | 452 | def RegisterStore : AMDGPUShaderInst < | 
|  | 453 | (outs), | 
|  | 454 | (ins dstClass:$val, addrClass:$addr, i32imm:$chan), | 
|  | 455 | "RegisterStore $val, $addr", | 
| Tom Stellard | 40b7f1f | 2013-05-02 15:30:12 +0000 | [diff] [blame] | 456 | [(AMDGPUregister_store i32:$val, addrPat:$addr, (i32 timm:$chan))] | 
| Tom Stellard | f3b2a1e | 2013-02-06 17:32:29 +0000 | [diff] [blame] | 457 | > { | 
|  | 458 | let isRegisterStore = 1; | 
|  | 459 | } | 
|  | 460 | } | 
| Tom Stellard | 81d871d | 2013-11-13 23:36:50 +0000 | [diff] [blame] | 461 | } | 
| Tom Stellard | f3b2a1e | 2013-02-06 17:32:29 +0000 | [diff] [blame] | 462 |  | 
|  | 463 | } // End isCodeGenOnly = 1, isPseudo = 1 | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 464 |  | 
|  | 465 | /* Generic helper patterns for intrinsics */ | 
|  | 466 | /* -------------------------------------- */ | 
|  | 467 |  | 
| Tom Stellard | 40b7f1f | 2013-05-02 15:30:12 +0000 | [diff] [blame] | 468 | class POW_Common <AMDGPUInst log_ieee, AMDGPUInst exp_ieee, AMDGPUInst mul> | 
|  | 469 | : Pat < | 
|  | 470 | (fpow f32:$src0, f32:$src1), | 
|  | 471 | (exp_ieee (mul f32:$src1, (log_ieee f32:$src0))) | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 472 | >; | 
|  | 473 |  | 
|  | 474 | /* Other helper patterns */ | 
|  | 475 | /* --------------------- */ | 
|  | 476 |  | 
|  | 477 | /* Extract element pattern */ | 
| Matt Arsenault | 530dde4 | 2014-02-26 23:00:58 +0000 | [diff] [blame] | 478 | class Extract_Element <ValueType sub_type, ValueType vec_type, int sub_idx, | 
| Tom Stellard | 40b7f1f | 2013-05-02 15:30:12 +0000 | [diff] [blame] | 479 | SubRegIndex sub_reg> | 
|  | 480 | : Pat< | 
|  | 481 | (sub_type (vector_extract vec_type:$src, sub_idx)), | 
|  | 482 | (EXTRACT_SUBREG $src, sub_reg) | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 483 | >; | 
|  | 484 |  | 
|  | 485 | /* Insert element pattern */ | 
|  | 486 | class Insert_Element <ValueType elem_type, ValueType vec_type, | 
| Tom Stellard | 40b7f1f | 2013-05-02 15:30:12 +0000 | [diff] [blame] | 487 | int sub_idx, SubRegIndex sub_reg> | 
|  | 488 | : Pat < | 
|  | 489 | (vector_insert vec_type:$vec, elem_type:$elem, sub_idx), | 
|  | 490 | (INSERT_SUBREG $vec, $elem, sub_reg) | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 491 | >; | 
|  | 492 |  | 
| Tom Stellard | 40b7f1f | 2013-05-02 15:30:12 +0000 | [diff] [blame] | 493 | // XXX: Convert to new syntax and use COPY_TO_REG, once the DFAPacketizer | 
|  | 494 | // can handle COPY instructions. | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 495 | // bitconvert pattern | 
|  | 496 | class BitConvert <ValueType dt, ValueType st, RegisterClass rc> : Pat < | 
|  | 497 | (dt (bitconvert (st rc:$src0))), | 
|  | 498 | (dt rc:$src0) | 
|  | 499 | >; | 
|  | 500 |  | 
| Tom Stellard | 40b7f1f | 2013-05-02 15:30:12 +0000 | [diff] [blame] | 501 | // XXX: Convert to new syntax and use COPY_TO_REG, once the DFAPacketizer | 
|  | 502 | // can handle COPY instructions. | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 503 | class DwordAddrPat<ValueType vt, RegisterClass rc> : Pat < | 
|  | 504 | (vt (AMDGPUdwordaddr (vt rc:$addr))), | 
|  | 505 | (vt rc:$addr) | 
|  | 506 | >; | 
|  | 507 |  | 
| Tom Stellard | 9d10c4c | 2013-04-19 02:11:06 +0000 | [diff] [blame] | 508 | // BFI_INT patterns | 
|  | 509 |  | 
| Matt Arsenault | 6e43965 | 2014-06-10 19:00:20 +0000 | [diff] [blame] | 510 | multiclass BFIPatterns <Instruction BFI_INT, Instruction LoadImm32> { | 
| Tom Stellard | 9d10c4c | 2013-04-19 02:11:06 +0000 | [diff] [blame] | 511 |  | 
|  | 512 | // Definition from ISA doc: | 
|  | 513 | // (y & x) | (z & ~x) | 
|  | 514 | def : Pat < | 
|  | 515 | (or (and i32:$y, i32:$x), (and i32:$z, (not i32:$x))), | 
|  | 516 | (BFI_INT $x, $y, $z) | 
|  | 517 | >; | 
|  | 518 |  | 
|  | 519 | // SHA-256 Ch function | 
|  | 520 | // z ^ (x & (y ^ z)) | 
|  | 521 | def : Pat < | 
|  | 522 | (xor i32:$z, (and i32:$x, (xor i32:$y, i32:$z))), | 
|  | 523 | (BFI_INT $x, $y, $z) | 
|  | 524 | >; | 
|  | 525 |  | 
| Matt Arsenault | 6e43965 | 2014-06-10 19:00:20 +0000 | [diff] [blame] | 526 | def : Pat < | 
|  | 527 | (fcopysign f32:$src0, f32:$src1), | 
|  | 528 | (BFI_INT (LoadImm32 0x7fffffff), $src0, $src1) | 
|  | 529 | >; | 
|  | 530 |  | 
|  | 531 | def : Pat < | 
|  | 532 | (f64 (fcopysign f64:$src0, f64:$src1)), | 
|  | 533 | (INSERT_SUBREG (INSERT_SUBREG (f64 (IMPLICIT_DEF)), | 
|  | 534 | (i32 (EXTRACT_SUBREG $src0, sub0)), sub0), | 
|  | 535 | (BFI_INT (LoadImm32 0x7fffffff), | 
|  | 536 | (i32 (EXTRACT_SUBREG $src0, sub1)), | 
|  | 537 | (i32 (EXTRACT_SUBREG $src1, sub1))), sub1) | 
|  | 538 | >; | 
| Tom Stellard | 9d10c4c | 2013-04-19 02:11:06 +0000 | [diff] [blame] | 539 | } | 
|  | 540 |  | 
| Tom Stellard | eac65dd | 2013-05-03 17:21:20 +0000 | [diff] [blame] | 541 | // SHA-256 Ma patterns | 
|  | 542 |  | 
|  | 543 | // ((x & z) | (y & (x | z))) -> BFI_INT (XOR x, y), z, y | 
|  | 544 | class SHA256MaPattern <Instruction BFI_INT, Instruction XOR> : Pat < | 
|  | 545 | (or (and i32:$x, i32:$z), (and i32:$y, (or i32:$x, i32:$z))), | 
|  | 546 | (BFI_INT (XOR i32:$x, i32:$y), i32:$z, i32:$y) | 
|  | 547 | >; | 
|  | 548 |  | 
| Tom Stellard | 2b971eb | 2013-05-10 02:09:45 +0000 | [diff] [blame] | 549 | // Bitfield extract patterns | 
|  | 550 |  | 
| Tom Stellard | a2a4b8e | 2014-01-23 18:49:33 +0000 | [diff] [blame] | 551 | /* | 
|  | 552 |  | 
|  | 553 | XXX: The BFE pattern is not working correctly because the XForm is not being | 
|  | 554 | applied. | 
|  | 555 |  | 
| Tom Stellard | 2b971eb | 2013-05-10 02:09:45 +0000 | [diff] [blame] | 556 | def legalshift32 : ImmLeaf <i32, [{return Imm >=0 && Imm < 32;}]>; | 
|  | 557 | def bfemask : PatLeaf <(imm), [{return isMask_32(N->getZExtValue());}], | 
|  | 558 | SDNodeXForm<imm, [{ return CurDAG->getTargetConstant(CountTrailingOnes_32(N->getZExtValue()), MVT::i32);}]>>; | 
|  | 559 |  | 
|  | 560 | class BFEPattern <Instruction BFE> : Pat < | 
|  | 561 | (and (srl i32:$x, legalshift32:$y), bfemask:$z), | 
|  | 562 | (BFE $x, $y, $z) | 
|  | 563 | >; | 
|  | 564 |  | 
| Tom Stellard | a2a4b8e | 2014-01-23 18:49:33 +0000 | [diff] [blame] | 565 | */ | 
|  | 566 |  | 
| Tom Stellard | 5643c4a | 2013-05-20 15:02:19 +0000 | [diff] [blame] | 567 | // rotr pattern | 
|  | 568 | class ROTRPattern <Instruction BIT_ALIGN> : Pat < | 
|  | 569 | (rotr i32:$src0, i32:$src1), | 
|  | 570 | (BIT_ALIGN $src0, $src0, $src1) | 
|  | 571 | >; | 
|  | 572 |  | 
| Tom Stellard | 41fc785 | 2013-07-23 01:48:42 +0000 | [diff] [blame] | 573 | // 24-bit arithmetic patterns | 
|  | 574 | def umul24 : PatFrag <(ops node:$x, node:$y), (mul node:$x, node:$y)>; | 
|  | 575 |  | 
|  | 576 | /* | 
|  | 577 | class UMUL24Pattern <Instruction UMUL24> : Pat < | 
|  | 578 | (mul U24:$x, U24:$y), | 
|  | 579 | (UMUL24 $x, $y) | 
|  | 580 | >; | 
|  | 581 | */ | 
|  | 582 |  | 
| Matt Arsenault | eb26020 | 2014-05-22 18:00:15 +0000 | [diff] [blame] | 583 | class IMad24Pat<Instruction Inst> : Pat < | 
|  | 584 | (add (AMDGPUmul_i24 i32:$src0, i32:$src1), i32:$src2), | 
|  | 585 | (Inst $src0, $src1, $src2) | 
|  | 586 | >; | 
|  | 587 |  | 
|  | 588 | class UMad24Pat<Instruction Inst> : Pat < | 
|  | 589 | (add (AMDGPUmul_u24 i32:$src0, i32:$src1), i32:$src2), | 
|  | 590 | (Inst $src0, $src1, $src2) | 
|  | 591 | >; | 
|  | 592 |  | 
| Matt Arsenault | 493c5f1 | 2014-05-22 18:00:24 +0000 | [diff] [blame] | 593 | multiclass Expand24IBitOps<Instruction MulInst, Instruction AddInst> { | 
|  | 594 | def _expand_imad24 : Pat < | 
|  | 595 | (AMDGPUmad_i24 i32:$src0, i32:$src1, i32:$src2), | 
|  | 596 | (AddInst (MulInst $src0, $src1), $src2) | 
|  | 597 | >; | 
| Matt Arsenault | f15a056 | 2014-05-22 18:00:20 +0000 | [diff] [blame] | 598 |  | 
| Matt Arsenault | 493c5f1 | 2014-05-22 18:00:24 +0000 | [diff] [blame] | 599 | def _expand_imul24 : Pat < | 
|  | 600 | (AMDGPUmul_i24 i32:$src0, i32:$src1), | 
|  | 601 | (MulInst $src0, $src1) | 
|  | 602 | >; | 
|  | 603 | } | 
| Matt Arsenault | f15a056 | 2014-05-22 18:00:20 +0000 | [diff] [blame] | 604 |  | 
| Matt Arsenault | 493c5f1 | 2014-05-22 18:00:24 +0000 | [diff] [blame] | 605 | multiclass Expand24UBitOps<Instruction MulInst, Instruction AddInst> { | 
|  | 606 | def _expand_umad24 : Pat < | 
|  | 607 | (AMDGPUmad_u24 i32:$src0, i32:$src1, i32:$src2), | 
|  | 608 | (AddInst (MulInst $src0, $src1), $src2) | 
|  | 609 | >; | 
|  | 610 |  | 
|  | 611 | def _expand_umul24 : Pat < | 
|  | 612 | (AMDGPUmul_u24 i32:$src0, i32:$src1), | 
|  | 613 | (MulInst $src0, $src1) | 
|  | 614 | >; | 
|  | 615 | } | 
| Matt Arsenault | eb26020 | 2014-05-22 18:00:15 +0000 | [diff] [blame] | 616 |  | 
| Matt Arsenault | a0050b0 | 2014-06-19 01:19:19 +0000 | [diff] [blame] | 617 | class RcpPat<Instruction RcpInst, ValueType vt> : Pat < | 
|  | 618 | (fdiv FP_ONE, vt:$src), | 
|  | 619 | (RcpInst $src) | 
|  | 620 | >; | 
|  | 621 |  | 
| Matt Arsenault | 257d48d | 2014-06-24 22:13:39 +0000 | [diff] [blame] | 622 | multiclass RsqPat<Instruction RsqInst, ValueType vt> { | 
|  | 623 | def : Pat < | 
|  | 624 | (fdiv FP_ONE, (fsqrt vt:$src)), | 
|  | 625 | (RsqInst $src) | 
|  | 626 | >; | 
|  | 627 |  | 
|  | 628 | def : Pat < | 
|  | 629 | (AMDGPUrcp (fsqrt vt:$src)), | 
|  | 630 | (RsqInst $src) | 
|  | 631 | >; | 
|  | 632 | } | 
| Matt Arsenault | a0050b0 | 2014-06-19 01:19:19 +0000 | [diff] [blame] | 633 |  | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 634 | include "R600Instructions.td" | 
| Tom Stellard | 2c1c9de | 2014-03-24 16:07:25 +0000 | [diff] [blame] | 635 | include "R700Instructions.td" | 
|  | 636 | include "EvergreenInstructions.td" | 
|  | 637 | include "CaymanInstructions.td" | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 638 |  | 
|  | 639 | include "SIInstrInfo.td" | 
|  | 640 |  |