1 //===- NVPTXIntrinsics.td - PTX Intrinsics Instructions -------*- tblgen -*-==// 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 def immFloat0 : PatLeaf<(fpimm), [{ 11 float f = (float)N->getValueAPF().convertToFloat(); 12 return (f==0.0f); 13 }]>; 14 15 def immFloat1 : PatLeaf<(fpimm), [{ 16 float f = (float)N->getValueAPF().convertToFloat(); 17 return (f==1.0f); 18 }]>; 19 20 def immDouble0 : PatLeaf<(fpimm), [{ 21 double d = (double)N->getValueAPF().convertToDouble(); 22 return (d==0.0); 23 }]>; 24 25 def immDouble1 : PatLeaf<(fpimm), [{ 26 double d = (double)N->getValueAPF().convertToDouble(); 27 return (d==1.0); 28 }]>; 29 30 31 32 //----------------------------------- 33 // Synchronization Functions 34 //----------------------------------- 35 def INT_CUDA_SYNCTHREADS : NVPTXInst<(outs), (ins), 36 "bar.sync \t0;", 37 [(int_cuda_syncthreads)]>; 38 def INT_BARRIER0 : NVPTXInst<(outs), (ins), 39 "bar.sync \t0;", 40 [(int_nvvm_barrier0)]>; 41 def INT_BARRIER0_POPC : NVPTXInst<(outs Int32Regs:$dst), (ins Int32Regs:$pred), 42 !strconcat("{{ \n\t", 43 !strconcat(".reg .pred \t%p1; \n\t", 44 !strconcat("setp.ne.u32 \t%p1, $pred, 0; \n\t", 45 !strconcat("bar.red.popc.u32 \t$dst, 0, %p1; \n\t", 46 !strconcat("}}", ""))))), 47 [(set Int32Regs:$dst, (int_nvvm_barrier0_popc Int32Regs:$pred))]>; 48 def INT_BARRIER0_AND : NVPTXInst<(outs Int32Regs:$dst), (ins Int32Regs:$pred), 49 !strconcat("{{ \n\t", 50 !strconcat(".reg .pred \t%p1; \n\t", 51 !strconcat(".reg .pred \t%p2; \n\t", 52 !strconcat("setp.ne.u32 \t%p1, $pred, 0; \n\t", 53 !strconcat("bar.red.and.pred \t%p2, 0, %p1; \n\t", 54 !strconcat("selp.u32 \t$dst, 1, 0, %p2; \n\t", 55 !strconcat("}}", ""))))))), 56 [(set Int32Regs:$dst, (int_nvvm_barrier0_and Int32Regs:$pred))]>; 57 def INT_BARRIER0_OR : NVPTXInst<(outs Int32Regs:$dst), (ins Int32Regs:$pred), 58 !strconcat("{{ \n\t", 59 !strconcat(".reg .pred \t%p1; \n\t", 60 !strconcat(".reg .pred \t%p2; \n\t", 61 !strconcat("setp.ne.u32 \t%p1, $pred, 0; \n\t", 62 !strconcat("bar.red.or.pred \t%p2, 0, %p1; \n\t", 63 !strconcat("selp.u32 \t$dst, 1, 0, %p2; \n\t", 64 !strconcat("}}", ""))))))), 65 [(set Int32Regs:$dst, (int_nvvm_barrier0_or Int32Regs:$pred))]>; 66 67 68 //----------------------------------- 69 // Explicit Memory Fence Functions 70 //----------------------------------- 71 class MEMBAR<string StrOp, Intrinsic IntOP> : 72 NVPTXInst<(outs), (ins), 73 StrOp, [(IntOP)]>; 74 75 def INT_MEMBAR_CTA : MEMBAR<"membar.cta;", int_nvvm_membar_cta>; 76 def INT_MEMBAR_GL : MEMBAR<"membar.gl;", int_nvvm_membar_gl>; 77 def INT_MEMBAR_SYS : MEMBAR<"membar.sys;", int_nvvm_membar_sys>; 78 79 80 //----------------------------------- 81 // Math Functions 82 //----------------------------------- 83 84 // Map min(1.0, max(0.0, x)) to sat(x) 85 multiclass SAT<NVPTXRegClass regclass, Operand fimm, Intrinsic IntMinOp, 86 Intrinsic IntMaxOp, PatLeaf f0, PatLeaf f1, string OpStr> { 87 88 // fmin(1.0, fmax(0.0, x)) => sat(x) 89 def SAT11 : NVPTXInst<(outs regclass:$dst), 90 (ins fimm:$srcf0, fimm:$srcf1, regclass:$src), 91 OpStr, 92 [(set regclass:$dst, (IntMinOp f1:$srcf0 , 93 (IntMaxOp f0:$srcf1, regclass:$src)))]>; 94 95 // fmin(1.0, fmax(x, 0.0)) => sat(x) 96 def SAT12 : NVPTXInst<(outs regclass:$dst), 97 (ins fimm:$srcf0, fimm:$srcf1, regclass:$src), 98 OpStr, 99 [(set regclass:$dst, (IntMinOp f1:$srcf0 , 100 (IntMaxOp regclass:$src, f0:$srcf1)))]>; 101 102 // fmin(fmax(0.0, x), 1.0) => sat(x) 103 def SAT13 : NVPTXInst<(outs regclass:$dst), 104 (ins fimm:$srcf0, fimm:$srcf1, regclass:$src), 105 OpStr, 106 [(set regclass:$dst, (IntMinOp 107 (IntMaxOp f0:$srcf0, regclass:$src), f1:$srcf1))]>; 108 109 // fmin(fmax(x, 0.0), 1.0) => sat(x) 110 def SAT14 : NVPTXInst<(outs regclass:$dst), 111 (ins fimm:$srcf0, fimm:$srcf1, regclass:$src), 112 OpStr, 113 [(set regclass:$dst, (IntMinOp 114 (IntMaxOp regclass:$src, f0:$srcf0), f1:$srcf1))]>; 115 116 } 117 // Note that max(0.0, min(x, 1.0)) cannot be mapped to sat(x) because when x 118 // is NaN 119 // max(0.0, min(x, 1.0)) is 1.0 while sat(x) is 0. 120 // Same story for fmax, fmin. 121 122 defm SAT_fmin_fmax_f : SAT<Float32Regs, f32imm, int_nvvm_fmin_f, 123 int_nvvm_fmax_f, immFloat0, immFloat1, 124 "cvt.sat.f32.f32 \t$dst, $src; \n">; 125 defm SAT_fmin_fmax_d : SAT<Float64Regs, f64imm, int_nvvm_fmin_d, 126 int_nvvm_fmax_d, immDouble0, immDouble1, 127 "cvt.sat.f64.f64 \t$dst, $src; \n">; 128 129 130 // We need a full string for OpcStr here because we need to deal with case like 131 // INT_PTX_RECIP. 132 class F_MATH_1<string OpcStr, NVPTXRegClass target_regclass, 133 NVPTXRegClass src_regclass, Intrinsic IntOP> 134 : NVPTXInst<(outs target_regclass:$dst), (ins src_regclass:$src0), 135 OpcStr, 136 [(set target_regclass:$dst, (IntOP src_regclass:$src0))]>; 137 138 // We need a full string for OpcStr here because we need to deal with the case 139 // like INT_PTX_NATIVE_POWR_F. 140 class F_MATH_2<string OpcStr, NVPTXRegClass t_regclass, 141 NVPTXRegClass s0_regclass, NVPTXRegClass s1_regclass, Intrinsic IntOP> 142 : NVPTXInst<(outs t_regclass:$dst), 143 (ins s0_regclass:$src0, s1_regclass:$src1), 144 OpcStr, 145 [(set t_regclass:$dst, (IntOP s0_regclass:$src0, s1_regclass:$src1))]>; 146 147 class F_MATH_3<string OpcStr, NVPTXRegClass t_regclass, 148 NVPTXRegClass s0_regclass, NVPTXRegClass s1_regclass, 149 NVPTXRegClass s2_regclass, Intrinsic IntOP> 150 : NVPTXInst<(outs t_regclass:$dst), 151 (ins s0_regclass:$src0, s1_regclass:$src1, s2_regclass:$src2), 152 OpcStr, 153 [(set t_regclass:$dst, 154 (IntOP s0_regclass:$src0, s1_regclass:$src1, s2_regclass:$src2))]>; 155 156 // 157 // MISC 158 // 159 160 def INT_NVVM_CLZ_I : F_MATH_1<"clz.b32 \t$dst, $src0;", Int32Regs, Int32Regs, 161 int_nvvm_clz_i>; 162 def INT_NVVM_CLZ_LL : F_MATH_1<"clz.b64 \t$dst, $src0;", Int32Regs, Int64Regs, 163 int_nvvm_clz_ll>; 164 165 def INT_NVVM_POPC_I : F_MATH_1<"popc.b32 \t$dst, $src0;", Int32Regs, Int32Regs, 166 int_nvvm_popc_i>; 167 def INT_NVVM_POPC_LL : F_MATH_1<"popc.b64 \t$dst, $src0;", Int32Regs, Int64Regs, 168 int_nvvm_popc_ll>; 169 170 def INT_NVVM_PRMT : F_MATH_3<"prmt.b32 \t$dst, $src0, $src1, $src2;", Int32Regs, 171 Int32Regs, Int32Regs, Int32Regs, int_nvvm_prmt>; 172 173 // 174 // Min Max 175 // 176 177 def INT_NVVM_MIN_I : F_MATH_2<"min.s32 \t$dst, $src0, $src1;", Int32Regs, 178 Int32Regs, Int32Regs, int_nvvm_min_i>; 179 def INT_NVVM_MIN_UI : F_MATH_2<"min.u32 \t$dst, $src0, $src1;", Int32Regs, 180 Int32Regs, Int32Regs, int_nvvm_min_ui>; 181 182 def INT_NVVM_MIN_LL : F_MATH_2<"min.s64 \t$dst, $src0, $src1;", Int64Regs, 183 Int64Regs, Int64Regs, int_nvvm_min_ll>; 184 def INT_NVVM_MIN_ULL : F_MATH_2<"min.u64 \t$dst, $src0, $src1;", Int64Regs, 185 Int64Regs, Int64Regs, int_nvvm_min_ull>; 186 187 def INT_NVVM_MAX_I : F_MATH_2<"max.s32 \t$dst, $src0, $src1;", Int32Regs, 188 Int32Regs, Int32Regs, int_nvvm_max_i>; 189 def INT_NVVM_MAX_UI : F_MATH_2<"max.u32 \t$dst, $src0, $src1;", Int32Regs, 190 Int32Regs, Int32Regs, int_nvvm_max_ui>; 191 192 def INT_NVVM_MAX_LL : F_MATH_2<"max.s64 \t$dst, $src0, $src1;", Int64Regs, 193 Int64Regs, Int64Regs, int_nvvm_max_ll>; 194 def INT_NVVM_MAX_ULL : F_MATH_2<"max.u64 \t$dst, $src0, $src1;", Int64Regs, 195 Int64Regs, Int64Regs, int_nvvm_max_ull>; 196 197 def INT_NVVM_FMIN_F : F_MATH_2<"min.f32 \t$dst, $src0, $src1;", Float32Regs, 198 Float32Regs, Float32Regs, int_nvvm_fmin_f>; 199 def INT_NVVM_FMIN_FTZ_F : F_MATH_2<"min.ftz.f32 \t$dst, $src0, $src1;", 200 Float32Regs, Float32Regs, Float32Regs, int_nvvm_fmin_ftz_f>; 201 202 def INT_NVVM_FMAX_F : F_MATH_2<"max.f32 \t$dst, $src0, $src1;", Float32Regs, 203 Float32Regs, Float32Regs, int_nvvm_fmax_f>; 204 def INT_NVVM_FMAX_FTZ_F : F_MATH_2<"max.ftz.f32 \t$dst, $src0, $src1;", 205 Float32Regs, Float32Regs, Float32Regs, int_nvvm_fmax_ftz_f>; 206 207 def INT_NVVM_FMIN_D : F_MATH_2<"min.f64 \t$dst, $src0, $src1;", Float64Regs, 208 Float64Regs, Float64Regs, int_nvvm_fmin_d>; 209 def INT_NVVM_FMAX_D : F_MATH_2<"max.f64 \t$dst, $src0, $src1;", Float64Regs, 210 Float64Regs, Float64Regs, int_nvvm_fmax_d>; 211 212 // 213 // Multiplication 214 // 215 216 def INT_NVVM_MULHI_I : F_MATH_2<"mul.hi.s32 \t$dst, $src0, $src1;", Int32Regs, 217 Int32Regs, Int32Regs, int_nvvm_mulhi_i>; 218 def INT_NVVM_MULHI_UI : F_MATH_2<"mul.hi.u32 \t$dst, $src0, $src1;", Int32Regs, 219 Int32Regs, Int32Regs, int_nvvm_mulhi_ui>; 220 221 def INT_NVVM_MULHI_LL : F_MATH_2<"mul.hi.s64 \t$dst, $src0, $src1;", Int64Regs, 222 Int64Regs, Int64Regs, int_nvvm_mulhi_ll>; 223 def INT_NVVM_MULHI_ULL : F_MATH_2<"mul.hi.u64 \t$dst, $src0, $src1;", Int64Regs, 224 Int64Regs, Int64Regs, int_nvvm_mulhi_ull>; 225 226 def INT_NVVM_MUL_RN_FTZ_F : F_MATH_2<"mul.rn.ftz.f32 \t$dst, $src0, $src1;", 227 Float32Regs, Float32Regs, Float32Regs, int_nvvm_mul_rn_ftz_f>; 228 def INT_NVVM_MUL_RN_F : F_MATH_2<"mul.rn.f32 \t$dst, $src0, $src1;", 229 Float32Regs, Float32Regs, Float32Regs, int_nvvm_mul_rn_f>; 230 def INT_NVVM_MUL_RZ_FTZ_F : F_MATH_2<"mul.rz.ftz.f32 \t$dst, $src0, $src1;", 231 Float32Regs, Float32Regs, Float32Regs, int_nvvm_mul_rz_ftz_f>; 232 def INT_NVVM_MUL_RZ_F : F_MATH_2<"mul.rz.f32 \t$dst, $src0, $src1;", 233 Float32Regs, Float32Regs, Float32Regs, int_nvvm_mul_rz_f>; 234 def INT_NVVM_MUL_RM_FTZ_F : F_MATH_2<"mul.rm.ftz.f32 \t$dst, $src0, $src1;", 235 Float32Regs, Float32Regs, Float32Regs, int_nvvm_mul_rm_ftz_f>; 236 def INT_NVVM_MUL_RM_F : F_MATH_2<"mul.rm.f32 \t$dst, $src0, $src1;", 237 Float32Regs, Float32Regs, Float32Regs, int_nvvm_mul_rm_f>; 238 def INT_NVVM_MUL_RP_FTZ_F : F_MATH_2<"mul.rp.ftz.f32 \t$dst, $src0, $src1;", 239 Float32Regs, Float32Regs, Float32Regs, int_nvvm_mul_rp_ftz_f>; 240 def INT_NVVM_MUL_RP_F : F_MATH_2<"mul.rp.f32 \t$dst, $src0, $src1;", 241 Float32Regs, Float32Regs, Float32Regs, int_nvvm_mul_rp_f>; 242 243 def INT_NVVM_MUL_RN_D : F_MATH_2<"mul.rn.f64 \t$dst, $src0, $src1;", 244 Float64Regs, Float64Regs, Float64Regs, int_nvvm_mul_rn_d>; 245 def INT_NVVM_MUL_RZ_D : F_MATH_2<"mul.rz.f64 \t$dst, $src0, $src1;", 246 Float64Regs, Float64Regs, Float64Regs, int_nvvm_mul_rz_d>; 247 def INT_NVVM_MUL_RM_D : F_MATH_2<"mul.rm.f64 \t$dst, $src0, $src1;", 248 Float64Regs, Float64Regs, Float64Regs, int_nvvm_mul_rm_d>; 249 def INT_NVVM_MUL_RP_D : F_MATH_2<"mul.rp.f64 \t$dst, $src0, $src1;", 250 Float64Regs, Float64Regs, Float64Regs, int_nvvm_mul_rp_d>; 251 252 def INT_NVVM_MUL24_I : F_MATH_2<"mul24.lo.s32 \t$dst, $src0, $src1;", 253 Int32Regs, Int32Regs, Int32Regs, int_nvvm_mul24_i>; 254 def INT_NVVM_MUL24_UI : F_MATH_2<"mul24.lo.u32 \t$dst, $src0, $src1;", 255 Int32Regs, Int32Regs, Int32Regs, int_nvvm_mul24_ui>; 256 257 // 258 // Div 259 // 260 261 def INT_NVVM_DIV_APPROX_FTZ_F 262 : F_MATH_2<"div.approx.ftz.f32 \t$dst, $src0, $src1;", Float32Regs, 263 Float32Regs, Float32Regs, int_nvvm_div_approx_ftz_f>; 264 def INT_NVVM_DIV_APPROX_F : F_MATH_2<"div.approx.f32 \t$dst, $src0, $src1;", 265 Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_approx_f>; 266 267 def INT_NVVM_DIV_RN_FTZ_F : F_MATH_2<"div.rn.ftz.f32 \t$dst, $src0, $src1;", 268 Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_rn_ftz_f>; 269 def INT_NVVM_DIV_RN_F : F_MATH_2<"div.rn.f32 \t$dst, $src0, $src1;", 270 Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_rn_f>; 271 def INT_NVVM_DIV_RZ_FTZ_F : F_MATH_2<"div.rz.ftz.f32 \t$dst, $src0, $src1;", 272 Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_rz_ftz_f>; 273 def INT_NVVM_DIV_RZ_F : F_MATH_2<"div.rz.f32 \t$dst, $src0, $src1;", 274 Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_rz_f>; 275 def INT_NVVM_DIV_RM_FTZ_F : F_MATH_2<"div.rm.ftz.f32 \t$dst, $src0, $src1;", 276 Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_rm_ftz_f>; 277 def INT_NVVM_DIV_RM_F : F_MATH_2<"div.rm.f32 \t$dst, $src0, $src1;", 278 Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_rm_f>; 279 def INT_NVVM_DIV_RP_FTZ_F : F_MATH_2<"div.rp.ftz.f32 \t$dst, $src0, $src1;", 280 Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_rp_ftz_f>; 281 def INT_NVVM_DIV_RP_F : F_MATH_2<"div.rp.f32 \t$dst, $src0, $src1;", 282 Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_rp_f>; 283 284 def INT_NVVM_DIV_RN_D : F_MATH_2<"div.rn.f64 \t$dst, $src0, $src1;", 285 Float64Regs, Float64Regs, Float64Regs, int_nvvm_div_rn_d>; 286 def INT_NVVM_DIV_RZ_D : F_MATH_2<"div.rz.f64 \t$dst, $src0, $src1;", 287 Float64Regs, Float64Regs, Float64Regs, int_nvvm_div_rz_d>; 288 def INT_NVVM_DIV_RM_D : F_MATH_2<"div.rm.f64 \t$dst, $src0, $src1;", 289 Float64Regs, Float64Regs, Float64Regs, int_nvvm_div_rm_d>; 290 def INT_NVVM_DIV_RP_D : F_MATH_2<"div.rp.f64 \t$dst, $src0, $src1;", 291 Float64Regs, Float64Regs, Float64Regs, int_nvvm_div_rp_d>; 292 293 // 294 // Brev 295 // 296 297 def INT_NVVM_BREV32 : F_MATH_1<"brev.b32 \t$dst, $src0;", Int32Regs, Int32Regs, 298 int_nvvm_brev32>; 299 def INT_NVVM_BREV64 : F_MATH_1<"brev.b64 \t$dst, $src0;", Int64Regs, Int64Regs, 300 int_nvvm_brev64>; 301 302 // 303 // Sad 304 // 305 306 def INT_NVVM_SAD_I : F_MATH_3<"sad.s32 \t$dst, $src0, $src1, $src2;", 307 Int32Regs, Int32Regs, Int32Regs, Int32Regs, int_nvvm_sad_i>; 308 def INT_NVVM_SAD_UI : F_MATH_3<"sad.u32 \t$dst, $src0, $src1, $src2;", 309 Int32Regs, Int32Regs, Int32Regs, Int32Regs, int_nvvm_sad_ui>; 310 311 // 312 // Floor Ceil 313 // 314 315 def INT_NVVM_FLOOR_FTZ_F : F_MATH_1<"cvt.rmi.ftz.f32.f32 \t$dst, $src0;", 316 Float32Regs, Float32Regs, int_nvvm_floor_ftz_f>; 317 def INT_NVVM_FLOOR_F : F_MATH_1<"cvt.rmi.f32.f32 \t$dst, $src0;", 318 Float32Regs, Float32Regs, int_nvvm_floor_f>; 319 def INT_NVVM_FLOOR_D : F_MATH_1<"cvt.rmi.f64.f64 \t$dst, $src0;", 320 Float64Regs, Float64Regs, int_nvvm_floor_d>; 321 322 def INT_NVVM_CEIL_FTZ_F : F_MATH_1<"cvt.rpi.ftz.f32.f32 \t$dst, $src0;", 323 Float32Regs, Float32Regs, int_nvvm_ceil_ftz_f>; 324 def INT_NVVM_CEIL_F : F_MATH_1<"cvt.rpi.f32.f32 \t$dst, $src0;", 325 Float32Regs, Float32Regs, int_nvvm_ceil_f>; 326 def INT_NVVM_CEIL_D : F_MATH_1<"cvt.rpi.f64.f64 \t$dst, $src0;", 327 Float64Regs, Float64Regs, int_nvvm_ceil_d>; 328 329 // 330 // Abs 331 // 332 333 def INT_NVVM_ABS_I : F_MATH_1<"abs.s32 \t$dst, $src0;", Int32Regs, Int32Regs, 334 int_nvvm_abs_i>; 335 def INT_NVVM_ABS_LL : F_MATH_1<"abs.s64 \t$dst, $src0;", Int64Regs, Int64Regs, 336 int_nvvm_abs_ll>; 337 338 def INT_NVVM_FABS_FTZ_F : F_MATH_1<"abs.ftz.f32 \t$dst, $src0;", Float32Regs, 339 Float32Regs, int_nvvm_fabs_ftz_f>; 340 def INT_NVVM_FABS_F : F_MATH_1<"abs.f32 \t$dst, $src0;", Float32Regs, 341 Float32Regs, int_nvvm_fabs_f>; 342 343 def INT_NVVM_FABS_D : F_MATH_1<"abs.f64 \t$dst, $src0;", Float64Regs, 344 Float64Regs, int_nvvm_fabs_d>; 345 346 // 347 // Round 348 // 349 350 def INT_NVVM_ROUND_FTZ_F : F_MATH_1<"cvt.rni.ftz.f32.f32 \t$dst, $src0;", 351 Float32Regs, Float32Regs, int_nvvm_round_ftz_f>; 352 def INT_NVVM_ROUND_F : F_MATH_1<"cvt.rni.f32.f32 \t$dst, $src0;", Float32Regs, 353 Float32Regs, int_nvvm_round_f>; 354 355 def INT_NVVM_ROUND_D : F_MATH_1<"cvt.rni.f64.f64 \t$dst, $src0;", Float64Regs, 356 Float64Regs, int_nvvm_round_d>; 357 358 // 359 // Trunc 360 // 361 362 def INT_NVVM_TRUNC_FTZ_F : F_MATH_1<"cvt.rzi.ftz.f32.f32 \t$dst, $src0;", 363 Float32Regs, Float32Regs, int_nvvm_trunc_ftz_f>; 364 def INT_NVVM_TRUNC_F : F_MATH_1<"cvt.rzi.f32.f32 \t$dst, $src0;", Float32Regs, 365 Float32Regs, int_nvvm_trunc_f>; 366 367 def INT_NVVM_TRUNC_D : F_MATH_1<"cvt.rzi.f64.f64 \t$dst, $src0;", Float64Regs, 368 Float64Regs, int_nvvm_trunc_d>; 369 370 // 371 // Saturate 372 // 373 374 def INT_NVVM_SATURATE_FTZ_F : F_MATH_1<"cvt.sat.ftz.f32.f32 \t$dst, $src0;", 375 Float32Regs, Float32Regs, int_nvvm_saturate_ftz_f>; 376 def INT_NVVM_SATURATE_F : F_MATH_1<"cvt.sat.f32.f32 \t$dst, $src0;", 377 Float32Regs, Float32Regs, int_nvvm_saturate_f>; 378 379 def INT_NVVM_SATURATE_D : F_MATH_1<"cvt.sat.f64.f64 \t$dst, $src0;", 380 Float64Regs, Float64Regs, int_nvvm_saturate_d>; 381 382 // 383 // Exp2 Log2 384 // 385 386 def INT_NVVM_EX2_APPROX_FTZ_F : F_MATH_1<"ex2.approx.ftz.f32 \t$dst, $src0;", 387 Float32Regs, Float32Regs, int_nvvm_ex2_approx_ftz_f>; 388 def INT_NVVM_EX2_APPROX_F : F_MATH_1<"ex2.approx.f32 \t$dst, $src0;", 389 Float32Regs, Float32Regs, int_nvvm_ex2_approx_f>; 390 def INT_NVVM_EX2_APPROX_D : F_MATH_1<"ex2.approx.f64 \t$dst, $src0;", 391 Float64Regs, Float64Regs, int_nvvm_ex2_approx_d>; 392 393 def INT_NVVM_LG2_APPROX_FTZ_F : F_MATH_1<"lg2.approx.ftz.f32 \t$dst, $src0;", 394 Float32Regs, Float32Regs, int_nvvm_lg2_approx_ftz_f>; 395 def INT_NVVM_LG2_APPROX_F : F_MATH_1<"lg2.approx.f32 \t$dst, $src0;", 396 Float32Regs, Float32Regs, int_nvvm_lg2_approx_f>; 397 def INT_NVVM_LG2_APPROX_D : F_MATH_1<"lg2.approx.f64 \t$dst, $src0;", 398 Float64Regs, Float64Regs, int_nvvm_lg2_approx_d>; 399 400 // 401 // Sin Cos 402 // 403 404 def INT_NVVM_SIN_APPROX_FTZ_F : F_MATH_1<"sin.approx.ftz.f32 \t$dst, $src0;", 405 Float32Regs, Float32Regs, int_nvvm_sin_approx_ftz_f>; 406 def INT_NVVM_SIN_APPROX_F : F_MATH_1<"sin.approx.f32 \t$dst, $src0;", 407 Float32Regs, Float32Regs, int_nvvm_sin_approx_f>; 408 409 def INT_NVVM_COS_APPROX_FTZ_F : F_MATH_1<"cos.approx.ftz.f32 \t$dst, $src0;", 410 Float32Regs, Float32Regs, int_nvvm_cos_approx_ftz_f>; 411 def INT_NVVM_COS_APPROX_F : F_MATH_1<"cos.approx.f32 \t$dst, $src0;", 412 Float32Regs, Float32Regs, int_nvvm_cos_approx_f>; 413 414 // 415 // Fma 416 // 417 418 def INT_NVVM_FMA_RN_FTZ_F 419 : F_MATH_3<"fma.rn.ftz.f32 \t$dst, $src0, $src1, $src2;", Float32Regs, 420 Float32Regs, Float32Regs, Float32Regs, int_nvvm_fma_rn_ftz_f>; 421 def INT_NVVM_FMA_RN_F : F_MATH_3<"fma.rn.f32 \t$dst, $src0, $src1, $src2;", 422 Float32Regs, Float32Regs, Float32Regs, Float32Regs, int_nvvm_fma_rn_f>; 423 def INT_NVVM_FMA_RZ_FTZ_F 424 : F_MATH_3<"fma.rz.ftz.f32 \t$dst, $src0, $src1, $src2;", Float32Regs, 425 Float32Regs, Float32Regs, Float32Regs, int_nvvm_fma_rz_ftz_f>; 426 def INT_NVVM_FMA_RZ_F : F_MATH_3<"fma.rz.f32 \t$dst, $src0, $src1, $src2;", 427 Float32Regs, Float32Regs, Float32Regs, Float32Regs, int_nvvm_fma_rz_f>; 428 def INT_NVVM_FMA_RM_FTZ_F 429 : F_MATH_3<"fma.rm.ftz.f32 \t$dst, $src0, $src1, $src2;", Float32Regs, 430 Float32Regs, Float32Regs, Float32Regs, int_nvvm_fma_rm_ftz_f>; 431 def INT_NVVM_FMA_RM_F : F_MATH_3<"fma.rm.f32 \t$dst, $src0, $src1, $src2;", 432 Float32Regs, Float32Regs, Float32Regs, Float32Regs, int_nvvm_fma_rm_f>; 433 def INT_NVVM_FMA_RP_FTZ_F 434 : F_MATH_3<"fma.rp.ftz.f32 \t$dst, $src0, $src1, $src2;", Float32Regs, 435 Float32Regs, Float32Regs, Float32Regs, int_nvvm_fma_rp_ftz_f>; 436 def INT_NVVM_FMA_RP_F : F_MATH_3<"fma.rp.f32 \t$dst, $src0, $src1, $src2;", 437 Float32Regs, Float32Regs, Float32Regs, Float32Regs, int_nvvm_fma_rp_f>; 438 439 def INT_NVVM_FMA_RN_D : F_MATH_3<"fma.rn.f64 \t$dst, $src0, $src1, $src2;", 440 Float64Regs, Float64Regs, Float64Regs, Float64Regs, int_nvvm_fma_rn_d>; 441 def INT_NVVM_FMA_RZ_D : F_MATH_3<"fma.rz.f64 \t$dst, $src0, $src1, $src2;", 442 Float64Regs, Float64Regs, Float64Regs, Float64Regs, int_nvvm_fma_rz_d>; 443 def INT_NVVM_FMA_RM_D : F_MATH_3<"fma.rm.f64 \t$dst, $src0, $src1, $src2;", 444 Float64Regs, Float64Regs, Float64Regs, Float64Regs, int_nvvm_fma_rm_d>; 445 def INT_NVVM_FMA_RP_D : F_MATH_3<"fma.rp.f64 \t$dst, $src0, $src1, $src2;", 446 Float64Regs, Float64Regs, Float64Regs, Float64Regs, int_nvvm_fma_rp_d>; 447 448 // 449 // Rcp 450 // 451 452 def INT_NVVM_RCP_RN_FTZ_F : F_MATH_1<"rcp.rn.ftz.f32 \t$dst, $src0;", 453 Float32Regs, Float32Regs, int_nvvm_rcp_rn_ftz_f>; 454 def INT_NVVM_RCP_RN_F : F_MATH_1<"rcp.rn.f32 \t$dst, $src0;", 455 Float32Regs, Float32Regs, int_nvvm_rcp_rn_f>; 456 def INT_NVVM_RCP_RZ_FTZ_F : F_MATH_1<"rcp.rz.ftz.f32 \t$dst, $src0;", 457 Float32Regs, Float32Regs, int_nvvm_rcp_rz_ftz_f>; 458 def INT_NVVM_RCP_RZ_F : F_MATH_1<"rcp.rz.f32 \t$dst, $src0;", 459 Float32Regs, Float32Regs, int_nvvm_rcp_rz_f>; 460 def INT_NVVM_RCP_RM_FTZ_F : F_MATH_1<"rcp.rm.ftz.f32 \t$dst, $src0;", 461 Float32Regs, Float32Regs, int_nvvm_rcp_rm_ftz_f>; 462 def INT_NVVM_RCP_RM_F : F_MATH_1<"rcp.rm.f32 \t$dst, $src0;", 463 Float32Regs, Float32Regs, int_nvvm_rcp_rm_f>; 464 def INT_NVVM_RCP_RP_FTZ_F : F_MATH_1<"rcp.rp.ftz.f32 \t$dst, $src0;", 465 Float32Regs, Float32Regs, int_nvvm_rcp_rp_ftz_f>; 466 def INT_NVVM_RCP_RP_F : F_MATH_1<"rcp.rp.f32 \t$dst, $src0;", 467 Float32Regs, Float32Regs, int_nvvm_rcp_rp_f>; 468 469 def INT_NVVM_RCP_RN_D : F_MATH_1<"rcp.rn.f64 \t$dst, $src0;", Float64Regs, 470 Float64Regs, int_nvvm_rcp_rn_d>; 471 def INT_NVVM_RCP_RZ_D : F_MATH_1<"rcp.rz.f64 \t$dst, $src0;", Float64Regs, 472 Float64Regs, int_nvvm_rcp_rz_d>; 473 def INT_NVVM_RCP_RM_D : F_MATH_1<"rcp.rm.f64 \t$dst, $src0;", Float64Regs, 474 Float64Regs, int_nvvm_rcp_rm_d>; 475 def INT_NVVM_RCP_RP_D : F_MATH_1<"rcp.rp.f64 \t$dst, $src0;", Float64Regs, 476 Float64Regs, int_nvvm_rcp_rp_d>; 477 478 def INT_NVVM_RCP_APPROX_FTZ_D : F_MATH_1<"rcp.approx.ftz.f64 \t$dst, $src0;", 479 Float64Regs, Float64Regs, int_nvvm_rcp_approx_ftz_d>; 480 481 // 482 // Sqrt 483 // 484 485 def INT_NVVM_SQRT_RN_FTZ_F : F_MATH_1<"sqrt.rn.ftz.f32 \t$dst, $src0;", 486 Float32Regs, Float32Regs, int_nvvm_sqrt_rn_ftz_f>; 487 def INT_NVVM_SQRT_RN_F : F_MATH_1<"sqrt.rn.f32 \t$dst, $src0;", Float32Regs, 488 Float32Regs, int_nvvm_sqrt_rn_f>; 489 def INT_NVVM_SQRT_RZ_FTZ_F : F_MATH_1<"sqrt.rz.ftz.f32 \t$dst, $src0;", 490 Float32Regs, Float32Regs, int_nvvm_sqrt_rz_ftz_f>; 491 def INT_NVVM_SQRT_RZ_F : F_MATH_1<"sqrt.rz.f32 \t$dst, $src0;", Float32Regs, 492 Float32Regs, int_nvvm_sqrt_rz_f>; 493 def INT_NVVM_SQRT_RM_FTZ_F : F_MATH_1<"sqrt.rm.ftz.f32 \t$dst, $src0;", 494 Float32Regs, Float32Regs, int_nvvm_sqrt_rm_ftz_f>; 495 def INT_NVVM_SQRT_RM_F : F_MATH_1<"sqrt.rm.f32 \t$dst, $src0;", Float32Regs, 496 Float32Regs, int_nvvm_sqrt_rm_f>; 497 def INT_NVVM_SQRT_RP_FTZ_F : F_MATH_1<"sqrt.rp.ftz.f32 \t$dst, $src0;", 498 Float32Regs, Float32Regs, int_nvvm_sqrt_rp_ftz_f>; 499 def INT_NVVM_SQRT_RP_F : F_MATH_1<"sqrt.rp.f32 \t$dst, $src0;", Float32Regs, 500 Float32Regs, int_nvvm_sqrt_rp_f>; 501 def INT_NVVM_SQRT_APPROX_FTZ_F : F_MATH_1<"sqrt.approx.ftz.f32 \t$dst, $src0;", 502 Float32Regs, Float32Regs, int_nvvm_sqrt_approx_ftz_f>; 503 def INT_NVVM_SQRT_APPROX_F : F_MATH_1<"sqrt.approx.f32 \t$dst, $src0;", 504 Float32Regs, Float32Regs, int_nvvm_sqrt_approx_f>; 505 506 def INT_NVVM_SQRT_RN_D : F_MATH_1<"sqrt.rn.f64 \t$dst, $src0;", Float64Regs, 507 Float64Regs, int_nvvm_sqrt_rn_d>; 508 def INT_NVVM_SQRT_RZ_D : F_MATH_1<"sqrt.rz.f64 \t$dst, $src0;", Float64Regs, 509 Float64Regs, int_nvvm_sqrt_rz_d>; 510 def INT_NVVM_SQRT_RM_D : F_MATH_1<"sqrt.rm.f64 \t$dst, $src0;", Float64Regs, 511 Float64Regs, int_nvvm_sqrt_rm_d>; 512 def INT_NVVM_SQRT_RP_D : F_MATH_1<"sqrt.rp.f64 \t$dst, $src0;", Float64Regs, 513 Float64Regs, int_nvvm_sqrt_rp_d>; 514 515 // 516 // Rsqrt 517 // 518 519 def INT_NVVM_RSQRT_APPROX_FTZ_F 520 : F_MATH_1<"rsqrt.approx.ftz.f32 \t$dst, $src0;", Float32Regs, Float32Regs, 521 int_nvvm_rsqrt_approx_ftz_f>; 522 def INT_NVVM_RSQRT_APPROX_F : F_MATH_1<"rsqrt.approx.f32 \t$dst, $src0;", 523 Float32Regs, Float32Regs, int_nvvm_rsqrt_approx_f>; 524 def INT_NVVM_RSQRT_APPROX_D : F_MATH_1<"rsqrt.approx.f64 \t$dst, $src0;", 525 Float64Regs, Float64Regs, int_nvvm_rsqrt_approx_d>; 526 527 // 528 // Add 529 // 530 531 def INT_NVVM_ADD_RN_FTZ_F : F_MATH_2<"add.rn.ftz.f32 \t$dst, $src0, $src1;", 532 Float32Regs, Float32Regs, Float32Regs, int_nvvm_add_rn_ftz_f>; 533 def INT_NVVM_ADD_RN_F : F_MATH_2<"add.rn.f32 \t$dst, $src0, $src1;", 534 Float32Regs, Float32Regs, Float32Regs, int_nvvm_add_rn_f>; 535 def INT_NVVM_ADD_RZ_FTZ_F : F_MATH_2<"add.rz.ftz.f32 \t$dst, $src0, $src1;", 536 Float32Regs, Float32Regs, Float32Regs, int_nvvm_add_rz_ftz_f>; 537 def INT_NVVM_ADD_RZ_F : F_MATH_2<"add.rz.f32 \t$dst, $src0, $src1;", 538 Float32Regs, Float32Regs, Float32Regs, int_nvvm_add_rz_f>; 539 def INT_NVVM_ADD_RM_FTZ_F : F_MATH_2<"add.rm.ftz.f32 \t$dst, $src0, $src1;", 540 Float32Regs, Float32Regs, Float32Regs, int_nvvm_add_rm_ftz_f>; 541 def INT_NVVM_ADD_RM_F : F_MATH_2<"add.rm.f32 \t$dst, $src0, $src1;", 542 Float32Regs, Float32Regs, Float32Regs, int_nvvm_add_rm_f>; 543 def INT_NVVM_ADD_RP_FTZ_F : F_MATH_2<"add.rp.ftz.f32 \t$dst, $src0, $src1;", 544 Float32Regs, Float32Regs, Float32Regs, int_nvvm_add_rp_ftz_f>; 545 def INT_NVVM_ADD_RP_F : F_MATH_2<"add.rp.f32 \t$dst, $src0, $src1;", 546 Float32Regs, Float32Regs, Float32Regs, int_nvvm_add_rp_f>; 547 548 def INT_NVVM_ADD_RN_D : F_MATH_2<"add.rn.f64 \t$dst, $src0, $src1;", 549 Float64Regs, Float64Regs, Float64Regs, int_nvvm_add_rn_d>; 550 def INT_NVVM_ADD_RZ_D : F_MATH_2<"add.rz.f64 \t$dst, $src0, $src1;", 551 Float64Regs, Float64Regs, Float64Regs, int_nvvm_add_rz_d>; 552 def INT_NVVM_ADD_RM_D : F_MATH_2<"add.rm.f64 \t$dst, $src0, $src1;", 553 Float64Regs, Float64Regs, Float64Regs, int_nvvm_add_rm_d>; 554 def INT_NVVM_ADD_RP_D : F_MATH_2<"add.rp.f64 \t$dst, $src0, $src1;", 555 Float64Regs, Float64Regs, Float64Regs, int_nvvm_add_rp_d>; 556 557 // 558 // Convert 559 // 560 561 def INT_NVVM_D2F_RN_FTZ : F_MATH_1<"cvt.rn.ftz.f32.f64 \t$dst, $src0;", 562 Float32Regs, Float64Regs, int_nvvm_d2f_rn_ftz>; 563 def INT_NVVM_D2F_RN : F_MATH_1<"cvt.rn.f32.f64 \t$dst, $src0;", 564 Float32Regs, Float64Regs, int_nvvm_d2f_rn>; 565 def INT_NVVM_D2F_RZ_FTZ : F_MATH_1<"cvt.rz.ftz.f32.f64 \t$dst, $src0;", 566 Float32Regs, Float64Regs, int_nvvm_d2f_rz_ftz>; 567 def INT_NVVM_D2F_RZ : F_MATH_1<"cvt.rz.f32.f64 \t$dst, $src0;", 568 Float32Regs, Float64Regs, int_nvvm_d2f_rz>; 569 def INT_NVVM_D2F_RM_FTZ : F_MATH_1<"cvt.rm.ftz.f32.f64 \t$dst, $src0;", 570 Float32Regs, Float64Regs, int_nvvm_d2f_rm_ftz>; 571 def INT_NVVM_D2F_RM : F_MATH_1<"cvt.rm.f32.f64 \t$dst, $src0;", 572 Float32Regs, Float64Regs, int_nvvm_d2f_rm>; 573 def INT_NVVM_D2F_RP_FTZ : F_MATH_1<"cvt.rp.ftz.f32.f64 \t$dst, $src0;", 574 Float32Regs, Float64Regs, int_nvvm_d2f_rp_ftz>; 575 def INT_NVVM_D2F_RP : F_MATH_1<"cvt.rp.f32.f64 \t$dst, $src0;", 576 Float32Regs, Float64Regs, int_nvvm_d2f_rp>; 577 578 def INT_NVVM_D2I_RN : F_MATH_1<"cvt.rni.s32.f64 \t$dst, $src0;", 579 Int32Regs, Float64Regs, int_nvvm_d2i_rn>; 580 def INT_NVVM_D2I_RZ : F_MATH_1<"cvt.rzi.s32.f64 \t$dst, $src0;", 581 Int32Regs, Float64Regs, int_nvvm_d2i_rz>; 582 def INT_NVVM_D2I_RM : F_MATH_1<"cvt.rmi.s32.f64 \t$dst, $src0;", 583 Int32Regs, Float64Regs, int_nvvm_d2i_rm>; 584 def INT_NVVM_D2I_RP : F_MATH_1<"cvt.rpi.s32.f64 \t$dst, $src0;", 585 Int32Regs, Float64Regs, int_nvvm_d2i_rp>; 586 587 def INT_NVVM_D2UI_RN : F_MATH_1<"cvt.rni.u32.f64 \t$dst, $src0;", 588 Int32Regs, Float64Regs, int_nvvm_d2ui_rn>; 589 def INT_NVVM_D2UI_RZ : F_MATH_1<"cvt.rzi.u32.f64 \t$dst, $src0;", 590 Int32Regs, Float64Regs, int_nvvm_d2ui_rz>; 591 def INT_NVVM_D2UI_RM : F_MATH_1<"cvt.rmi.u32.f64 \t$dst, $src0;", 592 Int32Regs, Float64Regs, int_nvvm_d2ui_rm>; 593 def INT_NVVM_D2UI_RP : F_MATH_1<"cvt.rpi.u32.f64 \t$dst, $src0;", 594 Int32Regs, Float64Regs, int_nvvm_d2ui_rp>; 595 596 def INT_NVVM_I2D_RN : F_MATH_1<"cvt.rn.f64.s32 \t$dst, $src0;", 597 Float64Regs, Int32Regs, int_nvvm_i2d_rn>; 598 def INT_NVVM_I2D_RZ : F_MATH_1<"cvt.rz.f64.s32 \t$dst, $src0;", 599 Float64Regs, Int32Regs, int_nvvm_i2d_rz>; 600 def INT_NVVM_I2D_RM : F_MATH_1<"cvt.rm.f64.s32 \t$dst, $src0;", 601 Float64Regs, Int32Regs, int_nvvm_i2d_rm>; 602 def INT_NVVM_I2D_RP : F_MATH_1<"cvt.rp.f64.s32 \t$dst, $src0;", 603 Float64Regs, Int32Regs, int_nvvm_i2d_rp>; 604 605 def INT_NVVM_UI2D_RN : F_MATH_1<"cvt.rn.f64.u32 \t$dst, $src0;", 606 Float64Regs, Int32Regs, int_nvvm_ui2d_rn>; 607 def INT_NVVM_UI2D_RZ : F_MATH_1<"cvt.rz.f64.u32 \t$dst, $src0;", 608 Float64Regs, Int32Regs, int_nvvm_ui2d_rz>; 609 def INT_NVVM_UI2D_RM : F_MATH_1<"cvt.rm.f64.u32 \t$dst, $src0;", 610 Float64Regs, Int32Regs, int_nvvm_ui2d_rm>; 611 def INT_NVVM_UI2D_RP : F_MATH_1<"cvt.rp.f64.u32 \t$dst, $src0;", 612 Float64Regs, Int32Regs, int_nvvm_ui2d_rp>; 613 614 def INT_NVVM_F2I_RN_FTZ : F_MATH_1<"cvt.rni.ftz.s32.f32 \t$dst, $src0;", 615 Int32Regs, Float32Regs, int_nvvm_f2i_rn_ftz>; 616 def INT_NVVM_F2I_RN : F_MATH_1<"cvt.rni.s32.f32 \t$dst, $src0;", Int32Regs, 617 Float32Regs, int_nvvm_f2i_rn>; 618 def INT_NVVM_F2I_RZ_FTZ : F_MATH_1<"cvt.rzi.ftz.s32.f32 \t$dst, $src0;", 619 Int32Regs, Float32Regs, int_nvvm_f2i_rz_ftz>; 620 def INT_NVVM_F2I_RZ : F_MATH_1<"cvt.rzi.s32.f32 \t$dst, $src0;", Int32Regs, 621 Float32Regs, int_nvvm_f2i_rz>; 622 def INT_NVVM_F2I_RM_FTZ : F_MATH_1<"cvt.rmi.ftz.s32.f32 \t$dst, $src0;", 623 Int32Regs, Float32Regs, int_nvvm_f2i_rm_ftz>; 624 def INT_NVVM_F2I_RM : F_MATH_1<"cvt.rmi.s32.f32 \t$dst, $src0;", Int32Regs, 625 Float32Regs, int_nvvm_f2i_rm>; 626 def INT_NVVM_F2I_RP_FTZ : F_MATH_1<"cvt.rpi.ftz.s32.f32 \t$dst, $src0;", 627 Int32Regs, Float32Regs, int_nvvm_f2i_rp_ftz>; 628 def INT_NVVM_F2I_RP : F_MATH_1<"cvt.rpi.s32.f32 \t$dst, $src0;", Int32Regs, 629 Float32Regs, int_nvvm_f2i_rp>; 630 631 def INT_NVVM_F2UI_RN_FTZ : F_MATH_1<"cvt.rni.ftz.u32.f32 \t$dst, $src0;", 632 Int32Regs, Float32Regs, int_nvvm_f2ui_rn_ftz>; 633 def INT_NVVM_F2UI_RN : F_MATH_1<"cvt.rni.u32.f32 \t$dst, $src0;", Int32Regs, 634 Float32Regs, int_nvvm_f2ui_rn>; 635 def INT_NVVM_F2UI_RZ_FTZ : F_MATH_1<"cvt.rzi.ftz.u32.f32 \t$dst, $src0;", 636 Int32Regs, Float32Regs, int_nvvm_f2ui_rz_ftz>; 637 def INT_NVVM_F2UI_RZ : F_MATH_1<"cvt.rzi.u32.f32 \t$dst, $src0;", Int32Regs, 638 Float32Regs, int_nvvm_f2ui_rz>; 639 def INT_NVVM_F2UI_RM_FTZ : F_MATH_1<"cvt.rmi.ftz.u32.f32 \t$dst, $src0;", 640 Int32Regs, Float32Regs, int_nvvm_f2ui_rm_ftz>; 641 def INT_NVVM_F2UI_RM : F_MATH_1<"cvt.rmi.u32.f32 \t$dst, $src0;", Int32Regs, 642 Float32Regs, int_nvvm_f2ui_rm>; 643 def INT_NVVM_F2UI_RP_FTZ : F_MATH_1<"cvt.rpi.ftz.u32.f32 \t$dst, $src0;", 644 Int32Regs, Float32Regs, int_nvvm_f2ui_rp_ftz>; 645 def INT_NVVM_F2UI_RP : F_MATH_1<"cvt.rpi.u32.f32 \t$dst, $src0;", Int32Regs, 646 Float32Regs, int_nvvm_f2ui_rp>; 647 648 def INT_NVVM_I2F_RN : F_MATH_1<"cvt.rn.f32.s32 \t$dst, $src0;", Float32Regs, 649 Int32Regs, int_nvvm_i2f_rn>; 650 def INT_NVVM_I2F_RZ : F_MATH_1<"cvt.rz.f32.s32 \t$dst, $src0;", Float32Regs, 651 Int32Regs, int_nvvm_i2f_rz>; 652 def INT_NVVM_I2F_RM : F_MATH_1<"cvt.rm.f32.s32 \t$dst, $src0;", Float32Regs, 653 Int32Regs, int_nvvm_i2f_rm>; 654 def INT_NVVM_I2F_RP : F_MATH_1<"cvt.rp.f32.s32 \t$dst, $src0;", Float32Regs, 655 Int32Regs, int_nvvm_i2f_rp>; 656 657 def INT_NVVM_UI2F_RN : F_MATH_1<"cvt.rn.f32.u32 \t$dst, $src0;", Float32Regs, 658 Int32Regs, int_nvvm_ui2f_rn>; 659 def INT_NVVM_UI2F_RZ : F_MATH_1<"cvt.rz.f32.u32 \t$dst, $src0;", Float32Regs, 660 Int32Regs, int_nvvm_ui2f_rz>; 661 def INT_NVVM_UI2F_RM : F_MATH_1<"cvt.rm.f32.u32 \t$dst, $src0;", Float32Regs, 662 Int32Regs, int_nvvm_ui2f_rm>; 663 def INT_NVVM_UI2F_RP : F_MATH_1<"cvt.rp.f32.u32 \t$dst, $src0;", Float32Regs, 664 Int32Regs, int_nvvm_ui2f_rp>; 665 666 def INT_NVVM_LOHI_I2D : F_MATH_2<"mov.b64 \t$dst, {{$src0, $src1}};", 667 Float64Regs, Int32Regs, Int32Regs, int_nvvm_lohi_i2d>; 668 669 def INT_NVVM_D2I_LO : F_MATH_1<!strconcat("{{\n\t", 670 !strconcat(".reg .b32 %temp; \n\t", 671 !strconcat("mov.b64 \t{$dst, %temp}, $src0;\n\t", 672 "}}"))), 673 Int32Regs, Float64Regs, int_nvvm_d2i_lo>; 674 def INT_NVVM_D2I_HI : F_MATH_1<!strconcat("{{\n\t", 675 !strconcat(".reg .b32 %temp; \n\t", 676 !strconcat("mov.b64 \t{%temp, $dst}, $src0;\n\t", 677 "}}"))), 678 Int32Regs, Float64Regs, int_nvvm_d2i_hi>; 679 680 def INT_NVVM_F2LL_RN_FTZ : F_MATH_1<"cvt.rni.ftz.s64.f32 \t$dst, $src0;", 681 Int64Regs, Float32Regs, int_nvvm_f2ll_rn_ftz>; 682 def INT_NVVM_F2LL_RN : F_MATH_1<"cvt.rni.s64.f32 \t$dst, $src0;", Int64Regs, 683 Float32Regs, int_nvvm_f2ll_rn>; 684 def INT_NVVM_F2LL_RZ_FTZ : F_MATH_1<"cvt.rzi.ftz.s64.f32 \t$dst, $src0;", 685 Int64Regs, Float32Regs, int_nvvm_f2ll_rz_ftz>; 686 def INT_NVVM_F2LL_RZ : F_MATH_1<"cvt.rzi.s64.f32 \t$dst, $src0;", Int64Regs, 687 Float32Regs, int_nvvm_f2ll_rz>; 688 def INT_NVVM_F2LL_RM_FTZ : F_MATH_1<"cvt.rmi.ftz.s64.f32 \t$dst, $src0;", 689 Int64Regs, Float32Regs, int_nvvm_f2ll_rm_ftz>; 690 def INT_NVVM_F2LL_RM : F_MATH_1<"cvt.rmi.s64.f32 \t$dst, $src0;", Int64Regs, 691 Float32Regs, int_nvvm_f2ll_rm>; 692 def INT_NVVM_F2LL_RP_FTZ : F_MATH_1<"cvt.rpi.ftz.s64.f32 \t$dst, $src0;", 693 Int64Regs, Float32Regs, int_nvvm_f2ll_rp_ftz>; 694 def INT_NVVM_F2LL_RP : F_MATH_1<"cvt.rpi.s64.f32 \t$dst, $src0;", Int64Regs, 695 Float32Regs, int_nvvm_f2ll_rp>; 696 697 def INT_NVVM_F2ULL_RN_FTZ : F_MATH_1<"cvt.rni.ftz.u64.f32 \t$dst, $src0;", 698 Int64Regs, Float32Regs, int_nvvm_f2ull_rn_ftz>; 699 def INT_NVVM_F2ULL_RN : F_MATH_1<"cvt.rni.u64.f32 \t$dst, $src0;", Int64Regs, 700 Float32Regs, int_nvvm_f2ull_rn>; 701 def INT_NVVM_F2ULL_RZ_FTZ : F_MATH_1<"cvt.rzi.ftz.u64.f32 \t$dst, $src0;", 702 Int64Regs, Float32Regs, int_nvvm_f2ull_rz_ftz>; 703 def INT_NVVM_F2ULL_RZ : F_MATH_1<"cvt.rzi.u64.f32 \t$dst, $src0;", Int64Regs, 704 Float32Regs, int_nvvm_f2ull_rz>; 705 def INT_NVVM_F2ULL_RM_FTZ : F_MATH_1<"cvt.rmi.ftz.u64.f32 \t$dst, $src0;", 706 Int64Regs, Float32Regs, int_nvvm_f2ull_rm_ftz>; 707 def INT_NVVM_F2ULL_RM : F_MATH_1<"cvt.rmi.u64.f32 \t$dst, $src0;", Int64Regs, 708 Float32Regs, int_nvvm_f2ull_rm>; 709 def INT_NVVM_F2ULL_RP_FTZ : F_MATH_1<"cvt.rpi.ftz.u64.f32 \t$dst, $src0;", 710 Int64Regs, Float32Regs, int_nvvm_f2ull_rp_ftz>; 711 def INT_NVVM_F2ULL_RP : F_MATH_1<"cvt.rpi.u64.f32 \t$dst, $src0;", Int64Regs, 712 Float32Regs, int_nvvm_f2ull_rp>; 713 714 def INT_NVVM_D2LL_RN : F_MATH_1<"cvt.rni.s64.f64 \t$dst, $src0;", Int64Regs, 715 Float64Regs, int_nvvm_d2ll_rn>; 716 def INT_NVVM_D2LL_RZ : F_MATH_1<"cvt.rzi.s64.f64 \t$dst, $src0;", Int64Regs, 717 Float64Regs, int_nvvm_d2ll_rz>; 718 def INT_NVVM_D2LL_RM : F_MATH_1<"cvt.rmi.s64.f64 \t$dst, $src0;", Int64Regs, 719 Float64Regs, int_nvvm_d2ll_rm>; 720 def INT_NVVM_D2LL_RP : F_MATH_1<"cvt.rpi.s64.f64 \t$dst, $src0;", Int64Regs, 721 Float64Regs, int_nvvm_d2ll_rp>; 722 723 def INT_NVVM_D2ULL_RN : F_MATH_1<"cvt.rni.u64.f64 \t$dst, $src0;", Int64Regs, 724 Float64Regs, int_nvvm_d2ull_rn>; 725 def INT_NVVM_D2ULL_RZ : F_MATH_1<"cvt.rzi.u64.f64 \t$dst, $src0;", Int64Regs, 726 Float64Regs, int_nvvm_d2ull_rz>; 727 def INT_NVVM_D2ULL_RM : F_MATH_1<"cvt.rmi.u64.f64 \t$dst, $src0;", Int64Regs, 728 Float64Regs, int_nvvm_d2ull_rm>; 729 def INT_NVVM_D2ULL_RP : F_MATH_1<"cvt.rpi.u64.f64 \t$dst, $src0;", Int64Regs, 730 Float64Regs, int_nvvm_d2ull_rp>; 731 732 def INT_NVVM_LL2F_RN : F_MATH_1<"cvt.rn.f32.s64 \t$dst, $src0;", Float32Regs, 733 Int64Regs, int_nvvm_ll2f_rn>; 734 def INT_NVVM_LL2F_RZ : F_MATH_1<"cvt.rz.f32.s64 \t$dst, $src0;", Float32Regs, 735 Int64Regs, int_nvvm_ll2f_rz>; 736 def INT_NVVM_LL2F_RM : F_MATH_1<"cvt.rm.f32.s64 \t$dst, $src0;", Float32Regs, 737 Int64Regs, int_nvvm_ll2f_rm>; 738 def INT_NVVM_LL2F_RP : F_MATH_1<"cvt.rp.f32.s64 \t$dst, $src0;", Float32Regs, 739 Int64Regs, int_nvvm_ll2f_rp>; 740 def INT_NVVM_ULL2F_RN : F_MATH_1<"cvt.rn.f32.u64 \t$dst, $src0;", Float32Regs, 741 Int64Regs, int_nvvm_ull2f_rn>; 742 def INT_NVVM_ULL2F_RZ : F_MATH_1<"cvt.rz.f32.u64 \t$dst, $src0;", Float32Regs, 743 Int64Regs, int_nvvm_ull2f_rz>; 744 def INT_NVVM_ULL2F_RM : F_MATH_1<"cvt.rm.f32.u64 \t$dst, $src0;", Float32Regs, 745 Int64Regs, int_nvvm_ull2f_rm>; 746 def INT_NVVM_ULL2F_RP : F_MATH_1<"cvt.rp.f32.u64 \t$dst, $src0;", Float32Regs, 747 Int64Regs, int_nvvm_ull2f_rp>; 748 749 def INT_NVVM_LL2D_RN : F_MATH_1<"cvt.rn.f64.s64 \t$dst, $src0;", Float64Regs, 750 Int64Regs, int_nvvm_ll2d_rn>; 751 def INT_NVVM_LL2D_RZ : F_MATH_1<"cvt.rz.f64.s64 \t$dst, $src0;", Float64Regs, 752 Int64Regs, int_nvvm_ll2d_rz>; 753 def INT_NVVM_LL2D_RM : F_MATH_1<"cvt.rm.f64.s64 \t$dst, $src0;", Float64Regs, 754 Int64Regs, int_nvvm_ll2d_rm>; 755 def INT_NVVM_LL2D_RP : F_MATH_1<"cvt.rp.f64.s64 \t$dst, $src0;", Float64Regs, 756 Int64Regs, int_nvvm_ll2d_rp>; 757 def INT_NVVM_ULL2D_RN : F_MATH_1<"cvt.rn.f64.u64 \t$dst, $src0;", Float64Regs, 758 Int64Regs, int_nvvm_ull2d_rn>; 759 def INT_NVVM_ULL2D_RZ : F_MATH_1<"cvt.rz.f64.u64 \t$dst, $src0;", Float64Regs, 760 Int64Regs, int_nvvm_ull2d_rz>; 761 def INT_NVVM_ULL2D_RM : F_MATH_1<"cvt.rm.f64.u64 \t$dst, $src0;", Float64Regs, 762 Int64Regs, int_nvvm_ull2d_rm>; 763 def INT_NVVM_ULL2D_RP : F_MATH_1<"cvt.rp.f64.u64 \t$dst, $src0;", Float64Regs, 764 Int64Regs, int_nvvm_ull2d_rp>; 765 766 def INT_NVVM_F2H_RN_FTZ : F_MATH_1<!strconcat("{{\n\t", 767 !strconcat(".reg .b16 %temp;\n\t", 768 !strconcat("cvt.rn.ftz.f16.f32 \t%temp, $src0;\n\t", 769 !strconcat("mov.b16 \t$dst, %temp;\n", 770 "}}")))), 771 Int16Regs, Float32Regs, int_nvvm_f2h_rn_ftz>; 772 def INT_NVVM_F2H_RN : F_MATH_1<!strconcat("{{\n\t", 773 !strconcat(".reg .b16 %temp;\n\t", 774 !strconcat("cvt.rn.f16.f32 \t%temp, $src0;\n\t", 775 !strconcat("mov.b16 \t$dst, %temp;\n", 776 "}}")))), 777 Int16Regs, Float32Regs, int_nvvm_f2h_rn>; 778 779 def INT_NVVM_H2F : F_MATH_1<!strconcat("{{\n\t", 780 !strconcat(".reg .b16 %temp;\n\t", 781 !strconcat("mov.b16 \t%temp, $src0;\n\t", 782 !strconcat("cvt.f32.f16 \t$dst, %temp;\n\t", 783 "}}")))), 784 Float32Regs, Int16Regs, int_nvvm_h2f>; 785 786 // 787 // Bitcast 788 // 789 790 def INT_NVVM_BITCAST_F2I : F_MATH_1<"mov.b32 \t$dst, $src0;", Int32Regs, 791 Float32Regs, int_nvvm_bitcast_f2i>; 792 def INT_NVVM_BITCAST_I2F : F_MATH_1<"mov.b32 \t$dst, $src0;", Float32Regs, 793 Int32Regs, int_nvvm_bitcast_i2f>; 794 795 def INT_NVVM_BITCAST_LL2D : F_MATH_1<"mov.b64 \t$dst, $src0;", Float64Regs, 796 Int64Regs, int_nvvm_bitcast_ll2d>; 797 def INT_NVVM_BITCAST_D2LL : F_MATH_1<"mov.b64 \t$dst, $src0;", Int64Regs, 798 Float64Regs, int_nvvm_bitcast_d2ll>; 799 800 //----------------------------------- 801 // Atomic Functions 802 //----------------------------------- 803 804 class ATOMIC_GLOBAL_CHK <dag ops, dag frag> 805 : PatFrag<ops, frag, [{ 806 return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_GLOBAL); 807 }]>; 808 class ATOMIC_SHARED_CHK <dag ops, dag frag> 809 : PatFrag<ops, frag, [{ 810 return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_SHARED); 811 }]>; 812 class ATOMIC_GENERIC_CHK <dag ops, dag frag> 813 : PatFrag<ops, frag, [{ 814 return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_GENERIC); 815 }]>; 816 817 multiclass F_ATOMIC_2_imp<NVPTXRegClass ptrclass, NVPTXRegClass regclass, 818 string SpaceStr, string TypeStr, string OpcStr, PatFrag IntOp, 819 Operand IMMType, SDNode IMM, Predicate Pred> { 820 def reg : NVPTXInst<(outs regclass:$dst), (ins ptrclass:$addr, regclass:$b), 821 !strconcat("atom", 822 !strconcat(SpaceStr, 823 !strconcat(OpcStr, 824 !strconcat(TypeStr, 825 !strconcat(" \t$dst, [$addr], $b;", ""))))), 826 [(set regclass:$dst, (IntOp ptrclass:$addr, regclass:$b))]>, 827 Requires<[Pred]>; 828 def imm : NVPTXInst<(outs regclass:$dst), (ins ptrclass:$addr, IMMType:$b), 829 !strconcat("atom", 830 !strconcat(SpaceStr, 831 !strconcat(OpcStr, 832 !strconcat(TypeStr, 833 !strconcat(" \t$dst, [$addr], $b;", ""))))), 834 [(set regclass:$dst, (IntOp ptrclass:$addr, IMM:$b))]>, 835 Requires<[Pred]>; 836 } 837 multiclass F_ATOMIC_2<NVPTXRegClass regclass, string SpaceStr, string TypeStr, 838 string OpcStr, PatFrag IntOp, Operand IMMType, SDNode IMM, Predicate Pred> { 839 defm p32 : F_ATOMIC_2_imp<Int32Regs, regclass, SpaceStr, TypeStr, OpcStr, 840 IntOp, IMMType, IMM, Pred>; 841 defm p64 : F_ATOMIC_2_imp<Int64Regs, regclass, SpaceStr, TypeStr, OpcStr, 842 IntOp, IMMType, IMM, Pred>; 843 } 844 845 // has 2 operands, neg the second one 846 multiclass F_ATOMIC_2_NEG_imp<NVPTXRegClass ptrclass, NVPTXRegClass regclass, 847 string SpaceStr, string TypeStr, string OpcStr, PatFrag IntOp, 848 Operand IMMType, Predicate Pred> { 849 def reg : NVPTXInst<(outs regclass:$dst), (ins ptrclass:$addr, regclass:$b), 850 !strconcat("{{ \n\t", 851 !strconcat(".reg \t.s", 852 !strconcat(TypeStr, 853 !strconcat(" temp; \n\t", 854 !strconcat("neg.s", 855 !strconcat(TypeStr, 856 !strconcat(" \ttemp, $b; \n\t", 857 !strconcat("atom", 858 !strconcat(SpaceStr, 859 !strconcat(OpcStr, 860 !strconcat(".u", 861 !strconcat(TypeStr, 862 !strconcat(" \t$dst, [$addr], temp; \n\t", 863 !strconcat("}}", "")))))))))))))), 864 [(set regclass:$dst, (IntOp ptrclass:$addr, regclass:$b))]>, 865 Requires<[Pred]>; 866 } 867 multiclass F_ATOMIC_2_NEG<NVPTXRegClass regclass, string SpaceStr, 868 string TypeStr, string OpcStr, PatFrag IntOp, Operand IMMType, 869 Predicate Pred> { 870 defm p32: F_ATOMIC_2_NEG_imp<Int32Regs, regclass, SpaceStr, TypeStr, OpcStr, 871 IntOp, IMMType, Pred> ; 872 defm p64: F_ATOMIC_2_NEG_imp<Int64Regs, regclass, SpaceStr, TypeStr, OpcStr, 873 IntOp, IMMType, Pred> ; 874 } 875 876 // has 3 operands 877 multiclass F_ATOMIC_3_imp<NVPTXRegClass ptrclass, NVPTXRegClass regclass, 878 string SpaceStr, string TypeStr, string OpcStr, PatFrag IntOp, 879 Operand IMMType, Predicate Pred> { 880 def reg : NVPTXInst<(outs regclass:$dst), 881 (ins ptrclass:$addr, regclass:$b, regclass:$c), 882 !strconcat("atom", 883 !strconcat(SpaceStr, 884 !strconcat(OpcStr, 885 !strconcat(TypeStr, 886 !strconcat(" \t$dst, [$addr], $b, $c;", ""))))), 887 [(set regclass:$dst, 888 (IntOp ptrclass:$addr, regclass:$b, regclass:$c))]>, 889 Requires<[Pred]>; 890 def imm1 : NVPTXInst<(outs regclass:$dst), 891 (ins ptrclass:$addr, IMMType:$b, regclass:$c), 892 !strconcat("atom", 893 !strconcat(SpaceStr, 894 !strconcat(OpcStr, 895 !strconcat(TypeStr, 896 !strconcat(" \t$dst, [$addr], $b, $c;", ""))))), 897 [(set regclass:$dst, (IntOp ptrclass:$addr, imm:$b, regclass:$c))]>, 898 Requires<[Pred]>; 899 def imm2 : NVPTXInst<(outs regclass:$dst), 900 (ins ptrclass:$addr, regclass:$b, IMMType:$c), 901 !strconcat("atom", 902 !strconcat(SpaceStr, 903 !strconcat(OpcStr, 904 !strconcat(TypeStr, 905 !strconcat(" \t$dst, [$addr], $b, $c;", ""))))), 906 [(set regclass:$dst, (IntOp ptrclass:$addr, regclass:$b, imm:$c))]>, 907 Requires<[Pred]>; 908 def imm3 : NVPTXInst<(outs regclass:$dst), 909 (ins ptrclass:$addr, IMMType:$b, IMMType:$c), 910 !strconcat("atom", 911 !strconcat(SpaceStr, 912 !strconcat(OpcStr, 913 !strconcat(TypeStr, 914 !strconcat(" \t$dst, [$addr], $b, $c;", ""))))), 915 [(set regclass:$dst, (IntOp ptrclass:$addr, imm:$b, imm:$c))]>, 916 Requires<[Pred]>; 917 } 918 multiclass F_ATOMIC_3<NVPTXRegClass regclass, string SpaceStr, string TypeStr, 919 string OpcStr, PatFrag IntOp, Operand IMMType, Predicate Pred> { 920 defm p32 : F_ATOMIC_3_imp<Int32Regs, regclass, SpaceStr, TypeStr, OpcStr, 921 IntOp, IMMType, Pred>; 922 defm p64 : F_ATOMIC_3_imp<Int64Regs, regclass, SpaceStr, TypeStr, OpcStr, 923 IntOp, IMMType, Pred>; 924 } 925 926 // atom_add 927 928 def atomic_load_add_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), 929 (atomic_load_add_32 node:$a, node:$b)>; 930 def atomic_load_add_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), 931 (atomic_load_add_32 node:$a, node:$b)>; 932 def atomic_load_add_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), 933 (atomic_load_add_32 node:$a, node:$b)>; 934 def atomic_load_add_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), 935 (atomic_load_add_64 node:$a, node:$b)>; 936 def atomic_load_add_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), 937 (atomic_load_add_64 node:$a, node:$b)>; 938 def atomic_load_add_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), 939 (atomic_load_add_64 node:$a, node:$b)>; 940 def atomic_load_add_f32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), 941 (int_nvvm_atomic_load_add_f32 node:$a, node:$b)>; 942 def atomic_load_add_f32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), 943 (int_nvvm_atomic_load_add_f32 node:$a, node:$b)>; 944 def atomic_load_add_f32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), 945 (int_nvvm_atomic_load_add_f32 node:$a, node:$b)>; 946 947 defm INT_PTX_ATOM_ADD_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".u32", ".add", 948 atomic_load_add_32_g, i32imm, imm, hasAtomRedG32>; 949 defm INT_PTX_ATOM_ADD_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".u32", ".add", 950 atomic_load_add_32_s, i32imm, imm, hasAtomRedS32>; 951 defm INT_PTX_ATOM_ADD_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".u32", ".add", 952 atomic_load_add_32_gen, i32imm, imm, hasAtomRedGen32>; 953 defm INT_PTX_ATOM_ADD_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".u32", 954 ".add", atomic_load_add_32_gen, i32imm, imm, useAtomRedG32forGen32>; 955 956 defm INT_PTX_ATOM_ADD_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".u64", ".add", 957 atomic_load_add_64_g, i64imm, imm, hasAtomRedG64>; 958 defm INT_PTX_ATOM_ADD_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".u64", ".add", 959 atomic_load_add_64_s, i64imm, imm, hasAtomRedS64>; 960 defm INT_PTX_ATOM_ADD_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".u64", ".add", 961 atomic_load_add_64_gen, i64imm, imm, hasAtomRedGen64>; 962 defm INT_PTX_ATOM_ADD_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global", ".u64", 963 ".add", atomic_load_add_64_gen, i64imm, imm, useAtomRedG64forGen64>; 964 965 defm INT_PTX_ATOM_ADD_G_F32 : F_ATOMIC_2<Float32Regs, ".global", ".f32", ".add", 966 atomic_load_add_f32_g, f32imm, fpimm, hasAtomAddF32>; 967 defm INT_PTX_ATOM_ADD_S_F32 : F_ATOMIC_2<Float32Regs, ".shared", ".f32", ".add", 968 atomic_load_add_f32_s, f32imm, fpimm, hasAtomAddF32>; 969 defm INT_PTX_ATOM_ADD_GEN_F32 : F_ATOMIC_2<Float32Regs, "", ".f32", ".add", 970 atomic_load_add_f32_gen, f32imm, fpimm, hasAtomAddF32>; 971 972 // atom_sub 973 974 def atomic_load_sub_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), 975 (atomic_load_sub_32 node:$a, node:$b)>; 976 def atomic_load_sub_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), 977 (atomic_load_sub_32 node:$a, node:$b)>; 978 def atomic_load_sub_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), 979 (atomic_load_sub_32 node:$a, node:$b)>; 980 def atomic_load_sub_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), 981 (atomic_load_sub_64 node:$a, node:$b)>; 982 def atomic_load_sub_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), 983 (atomic_load_sub_64 node:$a, node:$b)>; 984 def atomic_load_sub_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), 985 (atomic_load_sub_64 node:$a, node:$b)>; 986 987 defm INT_PTX_ATOM_SUB_G_32 : F_ATOMIC_2_NEG<Int32Regs, ".global", "32", ".add", 988 atomic_load_sub_32_g, i32imm, hasAtomRedG32>; 989 defm INT_PTX_ATOM_SUB_G_64 : F_ATOMIC_2_NEG<Int64Regs, ".global", "64", ".add", 990 atomic_load_sub_64_g, i64imm, hasAtomRedG64>; 991 defm INT_PTX_ATOM_SUB_GEN_32 : F_ATOMIC_2_NEG<Int32Regs, "", "32", ".add", 992 atomic_load_sub_32_gen, i32imm, hasAtomRedGen32>; 993 defm INT_PTX_ATOM_SUB_GEN_32_USE_G : F_ATOMIC_2_NEG<Int32Regs, ".global", "32", 994 ".add", atomic_load_sub_32_gen, i32imm, useAtomRedG32forGen32>; 995 defm INT_PTX_ATOM_SUB_S_32 : F_ATOMIC_2_NEG<Int32Regs, ".shared", "32", ".add", 996 atomic_load_sub_32_s, i32imm, hasAtomRedS32>; 997 defm INT_PTX_ATOM_SUB_S_64 : F_ATOMIC_2_NEG<Int64Regs, ".shared", "64", ".add", 998 atomic_load_sub_64_s, i64imm, hasAtomRedS64>; 999 defm INT_PTX_ATOM_SUB_GEN_64 : F_ATOMIC_2_NEG<Int64Regs, "", "64", ".add", 1000 atomic_load_sub_64_gen, i64imm, hasAtomRedGen64>; 1001 defm INT_PTX_ATOM_SUB_GEN_64_USE_G : F_ATOMIC_2_NEG<Int64Regs, ".global", "64", 1002 ".add", atomic_load_sub_64_gen, i64imm, useAtomRedG64forGen64>; 1003 1004 // atom_swap 1005 1006 def atomic_swap_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), 1007 (atomic_swap_32 node:$a, node:$b)>; 1008 def atomic_swap_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), 1009 (atomic_swap_32 node:$a, node:$b)>; 1010 def atomic_swap_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), 1011 (atomic_swap_32 node:$a, node:$b)>; 1012 def atomic_swap_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), 1013 (atomic_swap_64 node:$a, node:$b)>; 1014 def atomic_swap_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), 1015 (atomic_swap_64 node:$a, node:$b)>; 1016 def atomic_swap_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), 1017 (atomic_swap_64 node:$a, node:$b)>; 1018 1019 defm INT_PTX_ATOM_SWAP_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".b32", ".exch", 1020 atomic_swap_32_g, i32imm, imm, hasAtomRedG32>; 1021 defm INT_PTX_ATOM_SWAP_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".b32", ".exch", 1022 atomic_swap_32_s, i32imm, imm, hasAtomRedS32>; 1023 defm INT_PTX_ATOM_SWAP_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".b32", ".exch", 1024 atomic_swap_32_gen, i32imm, imm, hasAtomRedGen32>; 1025 defm INT_PTX_ATOM_SWAP_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".b32", 1026 ".exch", atomic_swap_32_gen, i32imm, imm, useAtomRedG32forGen32>; 1027 defm INT_PTX_ATOM_SWAP_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".b64", ".exch", 1028 atomic_swap_64_g, i64imm, imm, hasAtomRedG64>; 1029 defm INT_PTX_ATOM_SWAP_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".b64", ".exch", 1030 atomic_swap_64_s, i64imm, imm, hasAtomRedS64>; 1031 defm INT_PTX_ATOM_SWAP_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".b64", ".exch", 1032 atomic_swap_64_gen, i64imm, imm, hasAtomRedGen64>; 1033 defm INT_PTX_ATOM_SWAP_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global", ".b64", 1034 ".exch", atomic_swap_64_gen, i64imm, imm, useAtomRedG64forGen64>; 1035 1036 // atom_max 1037 1038 def atomic_load_max_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b) 1039 , (atomic_load_max_32 node:$a, node:$b)>; 1040 def atomic_load_max_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), 1041 (atomic_load_max_32 node:$a, node:$b)>; 1042 def atomic_load_max_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), 1043 (atomic_load_max_32 node:$a, node:$b)>; 1044 def atomic_load_umax_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), 1045 (atomic_load_umax_32 node:$a, node:$b)>; 1046 def atomic_load_umax_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), 1047 (atomic_load_umax_32 node:$a, node:$b)>; 1048 def atomic_load_umax_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), 1049 (atomic_load_umax_32 node:$a, node:$b)>; 1050 1051 defm INT_PTX_ATOM_LOAD_MAX_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".s32", 1052 ".max", atomic_load_max_32_g, i32imm, imm, hasAtomRedG32>; 1053 defm INT_PTX_ATOM_LOAD_MAX_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".s32", 1054 ".max", atomic_load_max_32_s, i32imm, imm, hasAtomRedS32>; 1055 defm INT_PTX_ATOM_LOAD_MAX_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".s32", ".max", 1056 atomic_load_max_32_gen, i32imm, imm, hasAtomRedGen32>; 1057 defm INT_PTX_ATOM_LOAD_MAX_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", 1058 ".s32", ".max", atomic_load_max_32_gen, i32imm, imm, useAtomRedG32forGen32>; 1059 defm INT_PTX_ATOM_LOAD_UMAX_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".u32", 1060 ".max", atomic_load_umax_32_g, i32imm, imm, hasAtomRedG32>; 1061 defm INT_PTX_ATOM_LOAD_UMAX_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".u32", 1062 ".max", atomic_load_umax_32_s, i32imm, imm, hasAtomRedS32>; 1063 defm INT_PTX_ATOM_LOAD_UMAX_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".u32", ".max", 1064 atomic_load_umax_32_gen, i32imm, imm, hasAtomRedGen32>; 1065 defm INT_PTX_ATOM_LOAD_UMAX_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", 1066 ".u32", ".max", atomic_load_umax_32_gen, i32imm, imm, useAtomRedG32forGen32>; 1067 1068 // atom_min 1069 1070 def atomic_load_min_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), 1071 (atomic_load_min_32 node:$a, node:$b)>; 1072 def atomic_load_min_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), 1073 (atomic_load_min_32 node:$a, node:$b)>; 1074 def atomic_load_min_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), 1075 (atomic_load_min_32 node:$a, node:$b)>; 1076 def atomic_load_umin_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), 1077 (atomic_load_umin_32 node:$a, node:$b)>; 1078 def atomic_load_umin_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), 1079 (atomic_load_umin_32 node:$a, node:$b)>; 1080 def atomic_load_umin_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), 1081 (atomic_load_umin_32 node:$a, node:$b)>; 1082 1083 defm INT_PTX_ATOM_LOAD_MIN_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".s32", 1084 ".min", atomic_load_min_32_g, i32imm, imm, hasAtomRedG32>; 1085 defm INT_PTX_ATOM_LOAD_MIN_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".s32", 1086 ".min", atomic_load_min_32_s, i32imm, imm, hasAtomRedS32>; 1087 defm INT_PTX_ATOM_LOAD_MIN_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".s32", ".min", 1088 atomic_load_min_32_gen, i32imm, imm, hasAtomRedGen32>; 1089 defm INT_PTX_ATOM_LOAD_MIN_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", 1090 ".s32", ".min", atomic_load_min_32_gen, i32imm, imm, useAtomRedG32forGen32>; 1091 defm INT_PTX_ATOM_LOAD_UMIN_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".u32", 1092 ".min", atomic_load_umin_32_g, i32imm, imm, hasAtomRedG32>; 1093 defm INT_PTX_ATOM_LOAD_UMIN_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".u32", 1094 ".min", atomic_load_umin_32_s, i32imm, imm, hasAtomRedS32>; 1095 defm INT_PTX_ATOM_LOAD_UMIN_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".u32", ".min", 1096 atomic_load_umin_32_gen, i32imm, imm, hasAtomRedGen32>; 1097 defm INT_PTX_ATOM_LOAD_UMIN_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", 1098 ".u32", ".min", atomic_load_umin_32_gen, i32imm, imm, useAtomRedG32forGen32>; 1099 1100 // atom_inc atom_dec 1101 1102 def atomic_load_inc_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), 1103 (int_nvvm_atomic_load_inc_32 node:$a, node:$b)>; 1104 def atomic_load_inc_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), 1105 (int_nvvm_atomic_load_inc_32 node:$a, node:$b)>; 1106 def atomic_load_inc_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), 1107 (int_nvvm_atomic_load_inc_32 node:$a, node:$b)>; 1108 def atomic_load_dec_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), 1109 (int_nvvm_atomic_load_dec_32 node:$a, node:$b)>; 1110 def atomic_load_dec_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), 1111 (int_nvvm_atomic_load_dec_32 node:$a, node:$b)>; 1112 def atomic_load_dec_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), 1113 (int_nvvm_atomic_load_dec_32 node:$a, node:$b)>; 1114 1115 defm INT_PTX_ATOM_INC_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".u32", ".inc", 1116 atomic_load_inc_32_g, i32imm, imm, hasAtomRedG32>; 1117 defm INT_PTX_ATOM_INC_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".u32", ".inc", 1118 atomic_load_inc_32_s, i32imm, imm, hasAtomRedS32>; 1119 defm INT_PTX_ATOM_INC_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".u32", ".inc", 1120 atomic_load_inc_32_gen, i32imm, imm, hasAtomRedGen32>; 1121 defm INT_PTX_ATOM_INC_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".u32", 1122 ".inc", atomic_load_inc_32_gen, i32imm, imm, useAtomRedG32forGen32>; 1123 defm INT_PTX_ATOM_DEC_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".u32", ".dec", 1124 atomic_load_dec_32_g, i32imm, imm, hasAtomRedG32>; 1125 defm INT_PTX_ATOM_DEC_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".u32", ".dec", 1126 atomic_load_dec_32_s, i32imm, imm, hasAtomRedS32>; 1127 defm INT_PTX_ATOM_DEC_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".u32", ".dec", 1128 atomic_load_dec_32_gen, i32imm, imm, hasAtomRedGen32>; 1129 defm INT_PTX_ATOM_DEC_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".u32", 1130 ".dec", atomic_load_dec_32_gen, i32imm, imm, useAtomRedG32forGen32>; 1131 1132 // atom_and 1133 1134 def atomic_load_and_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), 1135 (atomic_load_and_32 node:$a, node:$b)>; 1136 def atomic_load_and_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), 1137 (atomic_load_and_32 node:$a, node:$b)>; 1138 def atomic_load_and_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), 1139 (atomic_load_and_32 node:$a, node:$b)>; 1140 1141 defm INT_PTX_ATOM_AND_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".b32", ".and", 1142 atomic_load_and_32_g, i32imm, imm, hasAtomRedG32>; 1143 defm INT_PTX_ATOM_AND_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".b32", ".and", 1144 atomic_load_and_32_s, i32imm, imm, hasAtomRedS32>; 1145 defm INT_PTX_ATOM_AND_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".b32", ".and", 1146 atomic_load_and_32_gen, i32imm, imm, hasAtomRedGen32>; 1147 defm INT_PTX_ATOM_AND_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".b32", 1148 ".and", atomic_load_and_32_gen, i32imm, imm, useAtomRedG32forGen32>; 1149 1150 // atom_or 1151 1152 def atomic_load_or_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), 1153 (atomic_load_or_32 node:$a, node:$b)>; 1154 def atomic_load_or_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), 1155 (atomic_load_or_32 node:$a, node:$b)>; 1156 def atomic_load_or_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), 1157 (atomic_load_or_32 node:$a, node:$b)>; 1158 1159 defm INT_PTX_ATOM_OR_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".b32", ".or", 1160 atomic_load_or_32_g, i32imm, imm, hasAtomRedG32>; 1161 defm INT_PTX_ATOM_OR_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".b32", ".or", 1162 atomic_load_or_32_gen, i32imm, imm, hasAtomRedGen32>; 1163 defm INT_PTX_ATOM_OR_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".b32", 1164 ".or", atomic_load_or_32_gen, i32imm, imm, useAtomRedG32forGen32>; 1165 defm INT_PTX_ATOM_OR_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".b32", ".or", 1166 atomic_load_or_32_s, i32imm, imm, hasAtomRedS32>; 1167 1168 // atom_xor 1169 1170 def atomic_load_xor_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), 1171 (atomic_load_xor_32 node:$a, node:$b)>; 1172 def atomic_load_xor_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), 1173 (atomic_load_xor_32 node:$a, node:$b)>; 1174 def atomic_load_xor_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), 1175 (atomic_load_xor_32 node:$a, node:$b)>; 1176 1177 defm INT_PTX_ATOM_XOR_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".b32", ".xor", 1178 atomic_load_xor_32_g, i32imm, imm, hasAtomRedG32>; 1179 defm INT_PTX_ATOM_XOR_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".b32", ".xor", 1180 atomic_load_xor_32_s, i32imm, imm, hasAtomRedS32>; 1181 defm INT_PTX_ATOM_XOR_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".b32", ".xor", 1182 atomic_load_xor_32_gen, i32imm, imm, hasAtomRedGen32>; 1183 defm INT_PTX_ATOM_XOR_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".b32", 1184 ".xor", atomic_load_xor_32_gen, i32imm, imm, useAtomRedG32forGen32>; 1185 1186 // atom_cas 1187 1188 def atomic_cmp_swap_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b, node:$c), 1189 (atomic_cmp_swap_32 node:$a, node:$b, node:$c)>; 1190 def atomic_cmp_swap_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b, node:$c), 1191 (atomic_cmp_swap_32 node:$a, node:$b, node:$c)>; 1192 def atomic_cmp_swap_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b, node:$c), 1193 (atomic_cmp_swap_32 node:$a, node:$b, node:$c)>; 1194 def atomic_cmp_swap_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b, node:$c), 1195 (atomic_cmp_swap_64 node:$a, node:$b, node:$c)>; 1196 def atomic_cmp_swap_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b, node:$c), 1197 (atomic_cmp_swap_64 node:$a, node:$b, node:$c)>; 1198 def atomic_cmp_swap_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b, node:$c), 1199 (atomic_cmp_swap_64 node:$a, node:$b, node:$c)>; 1200 1201 defm INT_PTX_ATOM_CAS_G_32 : F_ATOMIC_3<Int32Regs, ".global", ".b32", ".cas", 1202 atomic_cmp_swap_32_g, i32imm, hasAtomRedG32>; 1203 defm INT_PTX_ATOM_CAS_S_32 : F_ATOMIC_3<Int32Regs, ".shared", ".b32", ".cas", 1204 atomic_cmp_swap_32_s, i32imm, hasAtomRedS32>; 1205 defm INT_PTX_ATOM_CAS_GEN_32 : F_ATOMIC_3<Int32Regs, "", ".b32", ".cas", 1206 atomic_cmp_swap_32_gen, i32imm, hasAtomRedGen32>; 1207 defm INT_PTX_ATOM_CAS_GEN_32_USE_G : F_ATOMIC_3<Int32Regs, ".global", ".b32", 1208 ".cas", atomic_cmp_swap_32_gen, i32imm, useAtomRedG32forGen32>; 1209 defm INT_PTX_ATOM_CAS_G_64 : F_ATOMIC_3<Int64Regs, ".global", ".b64", ".cas", 1210 atomic_cmp_swap_64_g, i64imm, hasAtomRedG64>; 1211 defm INT_PTX_ATOM_CAS_S_64 : F_ATOMIC_3<Int64Regs, ".shared", ".b64", ".cas", 1212 atomic_cmp_swap_64_s, i64imm, hasAtomRedS64>; 1213 defm INT_PTX_ATOM_CAS_GEN_64 : F_ATOMIC_3<Int64Regs, "", ".b64", ".cas", 1214 atomic_cmp_swap_64_gen, i64imm, hasAtomRedGen64>; 1215 defm INT_PTX_ATOM_CAS_GEN_64_USE_G : F_ATOMIC_3<Int64Regs, ".global", ".b64", 1216 ".cas", atomic_cmp_swap_64_gen, i64imm, useAtomRedG64forGen64>; 1217 1218 1219 //----------------------------------- 1220 // Read Special Registers 1221 //----------------------------------- 1222 class F_SREG<string OpStr, NVPTXRegClass regclassOut, Intrinsic IntOp> : 1223 NVPTXInst<(outs regclassOut:$dst), (ins), 1224 OpStr, 1225 [(set regclassOut:$dst, (IntOp))]>; 1226 1227 def INT_PTX_SREG_TID_X : F_SREG<"mov.u32 \t$dst, %tid.x;", Int32Regs, 1228 int_nvvm_read_ptx_sreg_tid_x>; 1229 def INT_PTX_SREG_TID_Y : F_SREG<"mov.u32 \t$dst, %tid.y;", Int32Regs, 1230 int_nvvm_read_ptx_sreg_tid_y>; 1231 def INT_PTX_SREG_TID_Z : F_SREG<"mov.u32 \t$dst, %tid.z;", Int32Regs, 1232 int_nvvm_read_ptx_sreg_tid_z>; 1233 1234 def INT_PTX_SREG_NTID_X : F_SREG<"mov.u32 \t$dst, %ntid.x;", Int32Regs, 1235 int_nvvm_read_ptx_sreg_ntid_x>; 1236 def INT_PTX_SREG_NTID_Y : F_SREG<"mov.u32 \t$dst, %ntid.y;", Int32Regs, 1237 int_nvvm_read_ptx_sreg_ntid_y>; 1238 def INT_PTX_SREG_NTID_Z : F_SREG<"mov.u32 \t$dst, %ntid.z;", Int32Regs, 1239 int_nvvm_read_ptx_sreg_ntid_z>; 1240 1241 def INT_PTX_SREG_CTAID_X : F_SREG<"mov.u32 \t$dst, %ctaid.x;", Int32Regs, 1242 int_nvvm_read_ptx_sreg_ctaid_x>; 1243 def INT_PTX_SREG_CTAID_Y : F_SREG<"mov.u32 \t$dst, %ctaid.y;", Int32Regs, 1244 int_nvvm_read_ptx_sreg_ctaid_y>; 1245 def INT_PTX_SREG_CTAID_Z : F_SREG<"mov.u32 \t$dst, %ctaid.z;", Int32Regs, 1246 int_nvvm_read_ptx_sreg_ctaid_z>; 1247 1248 def INT_PTX_SREG_NCTAID_X : F_SREG<"mov.u32 \t$dst, %nctaid.x;", Int32Regs, 1249 int_nvvm_read_ptx_sreg_nctaid_x>; 1250 def INT_PTX_SREG_NCTAID_Y : F_SREG<"mov.u32 \t$dst, %nctaid.y;", Int32Regs, 1251 int_nvvm_read_ptx_sreg_nctaid_y>; 1252 def INT_PTX_SREG_NCTAID_Z : F_SREG<"mov.u32 \t$dst, %nctaid.z;", Int32Regs, 1253 int_nvvm_read_ptx_sreg_nctaid_z>; 1254 1255 def INT_PTX_SREG_WARPSIZE : F_SREG<"mov.u32 \t$dst, WARP_SZ;", Int32Regs, 1256 int_nvvm_read_ptx_sreg_warpsize>; 1257 1258 1259 //----------------------------------- 1260 // Support for ldu on sm_20 or later 1261 //----------------------------------- 1262 1263 // Scalar 1264 // @TODO: Revisit this, Changed imemAny to imem 1265 multiclass LDU_G<string TyStr, NVPTXRegClass regclass, Intrinsic IntOp> { 1266 def areg: NVPTXInst<(outs regclass:$result), (ins Int32Regs:$src), 1267 !strconcat("ldu.global.", TyStr), 1268 [(set regclass:$result, (IntOp Int32Regs:$src))]>, Requires<[hasLDU]>; 1269 def areg64: NVPTXInst<(outs regclass:$result), (ins Int64Regs:$src), 1270 !strconcat("ldu.global.", TyStr), 1271 [(set regclass:$result, (IntOp Int64Regs:$src))]>, Requires<[hasLDU]>; 1272 def avar: NVPTXInst<(outs regclass:$result), (ins imem:$src), 1273 !strconcat("ldu.global.", TyStr), 1274 [(set regclass:$result, (IntOp (Wrapper tglobaladdr:$src)))]>, 1275 Requires<[hasLDU]>; 1276 def ari : NVPTXInst<(outs regclass:$result), (ins MEMri:$src), 1277 !strconcat("ldu.global.", TyStr), 1278 [(set regclass:$result, (IntOp ADDRri:$src))]>, Requires<[hasLDU]>; 1279 def ari64 : NVPTXInst<(outs regclass:$result), (ins MEMri64:$src), 1280 !strconcat("ldu.global.", TyStr), 1281 [(set regclass:$result, (IntOp ADDRri64:$src))]>, Requires<[hasLDU]>; 1282 } 1283 1284 defm INT_PTX_LDU_GLOBAL_i8 : LDU_G<"u8 \t$result, [$src];", Int8Regs, 1285 int_nvvm_ldu_global_i>; 1286 defm INT_PTX_LDU_GLOBAL_i16 : LDU_G<"u16 \t$result, [$src];", Int16Regs, 1287 int_nvvm_ldu_global_i>; 1288 defm INT_PTX_LDU_GLOBAL_i32 : LDU_G<"u32 \t$result, [$src];", Int32Regs, 1289 int_nvvm_ldu_global_i>; 1290 defm INT_PTX_LDU_GLOBAL_i64 : LDU_G<"u64 \t$result, [$src];", Int64Regs, 1291 int_nvvm_ldu_global_i>; 1292 defm INT_PTX_LDU_GLOBAL_f32 : LDU_G<"f32 \t$result, [$src];", Float32Regs, 1293 int_nvvm_ldu_global_f>; 1294 defm INT_PTX_LDU_GLOBAL_f64 : LDU_G<"f64 \t$result, [$src];", Float64Regs, 1295 int_nvvm_ldu_global_f>; 1296 defm INT_PTX_LDU_GLOBAL_p32 : LDU_G<"u32 \t$result, [$src];", Int32Regs, 1297 int_nvvm_ldu_global_p>; 1298 defm INT_PTX_LDU_GLOBAL_p64 : LDU_G<"u64 \t$result, [$src];", Int64Regs, 1299 int_nvvm_ldu_global_p>; 1300 1301 // vector 1302 1303 // Elementized vector ldu 1304 multiclass VLDU_G_ELE_V2<string TyStr, NVPTXRegClass regclass> { 1305 def _32: NVPTXInst<(outs regclass:$dst1, regclass:$dst2), 1306 (ins Int32Regs:$src), 1307 !strconcat("ldu.global.", TyStr), []>; 1308 def _64: NVPTXInst<(outs regclass:$dst1, regclass:$dst2), 1309 (ins Int64Regs:$src), 1310 !strconcat("ldu.global.", TyStr), []>; 1311 } 1312 1313 multiclass VLDU_G_ELE_V4<string TyStr, NVPTXRegClass regclass> { 1314 def _32: NVPTXInst<(outs regclass:$dst1, regclass:$dst2, regclass:$dst3, 1315 regclass:$dst4), (ins Int32Regs:$src), 1316 !strconcat("ldu.global.", TyStr), []>; 1317 def _64: NVPTXInst<(outs regclass:$dst1, regclass:$dst2, regclass:$dst3, 1318 regclass:$dst4), (ins Int64Regs:$src), 1319 !strconcat("ldu.global.", TyStr), []>; 1320 } 1321 1322 defm INT_PTX_LDU_G_v2i8_ELE 1323 : VLDU_G_ELE_V2<"v2.u8 \t{{$dst1, $dst2}}, [$src];", Int8Regs>; 1324 defm INT_PTX_LDU_G_v2i16_ELE 1325 : VLDU_G_ELE_V2<"v2.u16 \t{{$dst1, $dst2}}, [$src];", Int16Regs>; 1326 defm INT_PTX_LDU_G_v2i32_ELE 1327 : VLDU_G_ELE_V2<"v2.u32 \t{{$dst1, $dst2}}, [$src];", Int32Regs>; 1328 defm INT_PTX_LDU_G_v2f32_ELE 1329 : VLDU_G_ELE_V2<"v2.f32 \t{{$dst1, $dst2}}, [$src];", Float32Regs>; 1330 defm INT_PTX_LDU_G_v2i64_ELE 1331 : VLDU_G_ELE_V2<"v2.u64 \t{{$dst1, $dst2}}, [$src];", Int64Regs>; 1332 defm INT_PTX_LDU_G_v2f64_ELE 1333 : VLDU_G_ELE_V2<"v2.f64 \t{{$dst1, $dst2}}, [$src];", Float64Regs>; 1334 defm INT_PTX_LDU_G_v4i8_ELE 1335 : VLDU_G_ELE_V4<"v4.u8 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];", Int8Regs>; 1336 defm INT_PTX_LDU_G_v4i16_ELE 1337 : VLDU_G_ELE_V4<"v4.u16 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];", 1338 Int16Regs>; 1339 defm INT_PTX_LDU_G_v4i32_ELE 1340 : VLDU_G_ELE_V4<"v4.u32 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];", 1341 Int32Regs>; 1342 defm INT_PTX_LDU_G_v4f32_ELE 1343 : VLDU_G_ELE_V4<"v4.f32 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];", 1344 Float32Regs>; 1345 1346 1347 //----------------------------------- 1348 // Support for ldg on sm_35 or later 1349 //----------------------------------- 1350 1351 def ldg_i8 : PatFrag<(ops node:$ptr), (int_nvvm_ldg_global_i node:$ptr), [{ 1352 MemIntrinsicSDNode *M = cast<MemIntrinsicSDNode>(N); 1353 return M->getMemoryVT() == MVT::i8; 1354 }]>; 1355 1356 multiclass LDG_G<string TyStr, NVPTXRegClass regclass, Intrinsic IntOp> { 1357 def areg: NVPTXInst<(outs regclass:$result), (ins Int32Regs:$src), 1358 !strconcat("ld.global.nc.", TyStr), 1359 [(set regclass:$result, (IntOp Int32Regs:$src))]>, Requires<[hasLDG]>; 1360 def areg64: NVPTXInst<(outs regclass:$result), (ins Int64Regs:$src), 1361 !strconcat("ld.global.nc.", TyStr), 1362 [(set regclass:$result, (IntOp Int64Regs:$src))]>, Requires<[hasLDG]>; 1363 def avar: NVPTXInst<(outs regclass:$result), (ins imem:$src), 1364 !strconcat("ld.global.nc.", TyStr), 1365 [(set regclass:$result, (IntOp (Wrapper tglobaladdr:$src)))]>, 1366 Requires<[hasLDG]>; 1367 def ari : NVPTXInst<(outs regclass:$result), (ins MEMri:$src), 1368 !strconcat("ld.global.nc.", TyStr), 1369 [(set regclass:$result, (IntOp ADDRri:$src))]>, Requires<[hasLDG]>; 1370 def ari64 : NVPTXInst<(outs regclass:$result), (ins MEMri64:$src), 1371 !strconcat("ld.global.nc.", TyStr), 1372 [(set regclass:$result, (IntOp ADDRri64:$src))]>, Requires<[hasLDG]>; 1373 } 1374 1375 multiclass LDG_G_NOINTRIN<string TyStr, NVPTXRegClass regclass, PatFrag IntOp> { 1376 def areg: NVPTXInst<(outs regclass:$result), (ins Int32Regs:$src), 1377 !strconcat("ld.global.nc.", TyStr), 1378 [(set regclass:$result, (IntOp Int32Regs:$src))]>, Requires<[hasLDG]>; 1379 def areg64: NVPTXInst<(outs regclass:$result), (ins Int64Regs:$src), 1380 !strconcat("ld.global.nc.", TyStr), 1381 [(set regclass:$result, (IntOp Int64Regs:$src))]>, Requires<[hasLDG]>; 1382 def avar: NVPTXInst<(outs regclass:$result), (ins imem:$src), 1383 !strconcat("ld.global.nc.", TyStr), 1384 [(set regclass:$result, (IntOp (Wrapper tglobaladdr:$src)))]>, 1385 Requires<[hasLDG]>; 1386 def ari : NVPTXInst<(outs regclass:$result), (ins MEMri:$src), 1387 !strconcat("ld.global.nc.", TyStr), 1388 [(set regclass:$result, (IntOp ADDRri:$src))]>, Requires<[hasLDG]>; 1389 def ari64 : NVPTXInst<(outs regclass:$result), (ins MEMri64:$src), 1390 !strconcat("ld.global.nc.", TyStr), 1391 [(set regclass:$result, (IntOp ADDRri64:$src))]>, Requires<[hasLDG]>; 1392 } 1393 1394 defm INT_PTX_LDG_GLOBAL_i8 1395 : LDG_G_NOINTRIN<"u8 \t$result, [$src];", Int16Regs, ldg_i8>; 1396 defm INT_PTX_LDG_GLOBAL_i16 1397 : LDG_G<"u16 \t$result, [$src];", Int16Regs, int_nvvm_ldg_global_i>; 1398 defm INT_PTX_LDG_GLOBAL_i32 1399 : LDG_G<"u32 \t$result, [$src];", Int32Regs, int_nvvm_ldg_global_i>; 1400 defm INT_PTX_LDG_GLOBAL_i64 1401 : LDG_G<"u64 \t$result, [$src];", Int64Regs, int_nvvm_ldg_global_i>; 1402 defm INT_PTX_LDG_GLOBAL_f32 1403 : LDG_G<"f32 \t$result, [$src];", Float32Regs, int_nvvm_ldg_global_f>; 1404 defm INT_PTX_LDG_GLOBAL_f64 1405 : LDG_G<"f64 \t$result, [$src];", Float64Regs, int_nvvm_ldg_global_f>; 1406 defm INT_PTX_LDG_GLOBAL_p32 1407 : LDG_G<"u32 \t$result, [$src];", Int32Regs, int_nvvm_ldg_global_p>; 1408 defm INT_PTX_LDG_GLOBAL_p64 1409 : LDG_G<"u64 \t$result, [$src];", Int64Regs, int_nvvm_ldg_global_p>; 1410 1411 // vector 1412 1413 // Elementized vector ldg 1414 multiclass VLDG_G_ELE_V2<string TyStr, NVPTXRegClass regclass> { 1415 def _32: NVPTXInst<(outs regclass:$dst1, regclass:$dst2), 1416 (ins Int32Regs:$src), 1417 !strconcat("ld.global.nc.", TyStr), []>; 1418 def _64: NVPTXInst<(outs regclass:$dst1, regclass:$dst2), 1419 (ins Int64Regs:$src), 1420 !strconcat("ld.global.nc.", TyStr), []>; 1421 } 1422 1423 multiclass VLDG_G_ELE_V4<string TyStr, NVPTXRegClass regclass> { 1424 def _32: NVPTXInst<(outs regclass:$dst1, regclass:$dst2, 1425 regclass:$dst3, regclass:$dst4), (ins Int32Regs:$src), 1426 !strconcat("ld.global.nc.", TyStr), []>; 1427 def _64: NVPTXInst<(outs regclass:$dst1, regclass:$dst2, 1428 regclass:$dst3, regclass:$dst4), (ins Int64Regs:$src), 1429 !strconcat("ld.global.nc.", TyStr), []>; 1430 } 1431 1432 // FIXME: 8-bit LDG should be fixed once LDG/LDU nodes are made into proper loads. 1433 defm INT_PTX_LDG_G_v2i8_ELE 1434 : VLDG_G_ELE_V2<"v2.u8 \t{{$dst1, $dst2}}, [$src];", Int16Regs>; 1435 defm INT_PTX_LDG_G_v2i16_ELE 1436 : VLDG_G_ELE_V2<"v2.u16 \t{{$dst1, $dst2}}, [$src];", Int16Regs>; 1437 defm INT_PTX_LDG_G_v2i32_ELE 1438 : VLDG_G_ELE_V2<"v2.u32 \t{{$dst1, $dst2}}, [$src];", Int32Regs>; 1439 defm INT_PTX_LDG_G_v2f32_ELE 1440 : VLDG_G_ELE_V2<"v2.f32 \t{{$dst1, $dst2}}, [$src];", Float32Regs>; 1441 defm INT_PTX_LDG_G_v2i64_ELE 1442 : VLDG_G_ELE_V2<"v2.u64 \t{{$dst1, $dst2}}, [$src];", Int64Regs>; 1443 defm INT_PTX_LDG_G_v2f64_ELE 1444 : VLDG_G_ELE_V2<"v2.f64 \t{{$dst1, $dst2}}, [$src];", Float64Regs>; 1445 defm INT_PTX_LDG_G_v4i8_ELE 1446 : VLDG_G_ELE_V4<"v4.u8 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];", Int16Regs>; 1447 defm INT_PTX_LDG_G_v4i16_ELE 1448 : VLDG_G_ELE_V4<"v4.u16 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];", Int16Regs>; 1449 defm INT_PTX_LDG_G_v4i32_ELE 1450 : VLDG_G_ELE_V4<"v4.u32 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];", Int32Regs>; 1451 defm INT_PTX_LDG_G_v4f32_ELE 1452 : VLDG_G_ELE_V4<"v4.f32 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];", Float32Regs>; 1453 1454 1455 multiclass NG_TO_G<string Str, Intrinsic Intrin> { 1456 def _yes : NVPTXInst<(outs Int32Regs:$result), (ins Int32Regs:$src), 1457 !strconcat("cvta.", !strconcat(Str, ".u32 \t$result, $src;")), 1458 [(set Int32Regs:$result, (Intrin Int32Regs:$src))]>, 1459 Requires<[hasGenericLdSt]>; 1460 def _yes_64 : NVPTXInst<(outs Int64Regs:$result), (ins Int64Regs:$src), 1461 !strconcat("cvta.", !strconcat(Str, ".u64 \t$result, $src;")), 1462 [(set Int64Regs:$result, (Intrin Int64Regs:$src))]>, 1463 Requires<[hasGenericLdSt]>; 1464 1465 // @TODO: Are these actually needed? I believe global addresses will be copied 1466 // to register values anyway. 1467 /*def __addr_yes : NVPTXInst<(outs Int32Regs:$result), (ins imemAny:$src), 1468 !strconcat("cvta.", !strconcat(Str, ".u32 \t$result, $src;")), 1469 [(set Int32Regs:$result, (Intrin (Wrapper tglobaladdr:$src)))]>, 1470 Requires<[hasGenericLdSt]>; 1471 def __addr_yes_64 : NVPTXInst<(outs Int64Regs:$result), (ins imemAny:$src), 1472 !strconcat("cvta.", !strconcat(Str, ".u64 \t$result, $src;")), 1473 [(set Int64Regs:$result, (Intrin (Wrapper tglobaladdr:$src)))]>, 1474 Requires<[hasGenericLdSt]>;*/ 1475 1476 def _no : NVPTXInst<(outs Int32Regs:$result), (ins Int32Regs:$src), 1477 "mov.u32 \t$result, $src;", 1478 [(set Int32Regs:$result, (Intrin Int32Regs:$src))]>; 1479 def _no_64 : NVPTXInst<(outs Int64Regs:$result), (ins Int64Regs:$src), 1480 "mov.u64 \t$result, $src;", 1481 [(set Int64Regs:$result, (Intrin Int64Regs:$src))]>; 1482 1483 // @TODO: Are these actually needed? I believe global addresses will be copied 1484 // to register values anyway. 1485 /*def _addr_no : NVPTXInst<(outs Int32Regs:$result), (ins imem:$src), 1486 "mov.u32 \t$result, $src;", 1487 [(set Int32Regs:$result, (Intrin (Wrapper tglobaladdr:$src)))]>; 1488 def _addr_no_64 : NVPTXInst<(outs Int64Regs:$result), (ins imem:$src), 1489 "mov.u64 \t$result, $src;", 1490 [(set Int64Regs:$result, (Intrin (Wrapper tglobaladdr:$src)))]>;*/ 1491 } 1492 1493 multiclass G_TO_NG<string Str, Intrinsic Intrin> { 1494 def _yes : NVPTXInst<(outs Int32Regs:$result), (ins Int32Regs:$src), 1495 !strconcat("cvta.to.", !strconcat(Str, ".u32 \t$result, $src;")), 1496 [(set Int32Regs:$result, (Intrin Int32Regs:$src))]>, 1497 Requires<[hasGenericLdSt]>; 1498 def _yes_64 : NVPTXInst<(outs Int64Regs:$result), (ins Int64Regs:$src), 1499 !strconcat("cvta.to.", !strconcat(Str, ".u64 \t$result, $src;")), 1500 [(set Int64Regs:$result, (Intrin Int64Regs:$src))]>, 1501 Requires<[hasGenericLdSt]>; 1502 def _no : NVPTXInst<(outs Int32Regs:$result), (ins Int32Regs:$src), 1503 "mov.u32 \t$result, $src;", 1504 [(set Int32Regs:$result, (Intrin Int32Regs:$src))]>; 1505 def _no_64 : NVPTXInst<(outs Int64Regs:$result), (ins Int64Regs:$src), 1506 "mov.u64 \t$result, $src;", 1507 [(set Int64Regs:$result, (Intrin Int64Regs:$src))]>; 1508 } 1509 1510 defm cvta_local : NG_TO_G<"local", int_nvvm_ptr_local_to_gen>; 1511 defm cvta_shared : NG_TO_G<"shared", int_nvvm_ptr_shared_to_gen>; 1512 defm cvta_global : NG_TO_G<"global", int_nvvm_ptr_global_to_gen>; 1513 1514 defm cvta_to_local : G_TO_NG<"local", int_nvvm_ptr_gen_to_local>; 1515 defm cvta_to_shared : G_TO_NG<"shared", int_nvvm_ptr_gen_to_shared>; 1516 defm cvta_to_global : G_TO_NG<"global", int_nvvm_ptr_gen_to_global>; 1517 1518 def cvta_const : NVPTXInst<(outs Int32Regs:$result), (ins Int32Regs:$src), 1519 "mov.u32 \t$result, $src;", 1520 [(set Int32Regs:$result, (int_nvvm_ptr_constant_to_gen Int32Regs:$src))]>; 1521 def cvta_const_64 : NVPTXInst<(outs Int64Regs:$result), (ins Int64Regs:$src), 1522 "mov.u64 \t$result, $src;", 1523 [(set Int64Regs:$result, (int_nvvm_ptr_constant_to_gen Int64Regs:$src))]>; 1524 1525 1526 1527 // @TODO: Revisit this. There is a type 1528 // contradiction between iPTRAny and iPTR for the def. 1529 /*def cvta_const_addr : NVPTXInst<(outs Int32Regs:$result), (ins imemAny:$src), 1530 "mov.u32 \t$result, $src;", 1531 [(set Int32Regs:$result, (int_nvvm_ptr_constant_to_gen 1532 (Wrapper tglobaladdr:$src)))]>; 1533 def cvta_const_addr_64 : NVPTXInst<(outs Int64Regs:$result), (ins imemAny:$src), 1534 "mov.u64 \t$result, $src;", 1535 [(set Int64Regs:$result, (int_nvvm_ptr_constant_to_gen 1536 (Wrapper tglobaladdr:$src)))]>;*/ 1537 1538 1539 def cvta_to_const : NVPTXInst<(outs Int32Regs:$result), (ins Int32Regs:$src), 1540 "mov.u32 \t$result, $src;", 1541 [(set Int32Regs:$result, (int_nvvm_ptr_gen_to_constant Int32Regs:$src))]>; 1542 def cvta_to_const_64 : NVPTXInst<(outs Int64Regs:$result), (ins Int64Regs:$src), 1543 "mov.u64 \t$result, $src;", 1544 [(set Int64Regs:$result, (int_nvvm_ptr_gen_to_constant Int64Regs:$src))]>; 1545 1546 1547 // nvvm.ptr.gen.to.param 1548 def nvvm_ptr_gen_to_param : NVPTXInst<(outs Int32Regs:$result), 1549 (ins Int32Regs:$src), 1550 "mov.u32 \t$result, $src;", 1551 [(set Int32Regs:$result, 1552 (int_nvvm_ptr_gen_to_param Int32Regs:$src))]>; 1553 def nvvm_ptr_gen_to_param_64 : NVPTXInst<(outs Int64Regs:$result), 1554 (ins Int64Regs:$src), 1555 "mov.u64 \t$result, $src;", 1556 [(set Int64Regs:$result, 1557 (int_nvvm_ptr_gen_to_param Int64Regs:$src))]>; 1558 1559 1560 // nvvm.move intrinsicc 1561 def nvvm_move_i8 : NVPTXInst<(outs Int8Regs:$r), (ins Int8Regs:$s), 1562 "mov.b16 \t$r, $s;", 1563 [(set Int8Regs:$r, 1564 (int_nvvm_move_i8 Int8Regs:$s))]>; 1565 def nvvm_move_i16 : NVPTXInst<(outs Int16Regs:$r), (ins Int16Regs:$s), 1566 "mov.b16 \t$r, $s;", 1567 [(set Int16Regs:$r, 1568 (int_nvvm_move_i16 Int16Regs:$s))]>; 1569 def nvvm_move_i32 : NVPTXInst<(outs Int32Regs:$r), (ins Int32Regs:$s), 1570 "mov.b32 \t$r, $s;", 1571 [(set Int32Regs:$r, 1572 (int_nvvm_move_i32 Int32Regs:$s))]>; 1573 def nvvm_move_i64 : NVPTXInst<(outs Int64Regs:$r), (ins Int64Regs:$s), 1574 "mov.b64 \t$r, $s;", 1575 [(set Int64Regs:$r, 1576 (int_nvvm_move_i64 Int64Regs:$s))]>; 1577 def nvvm_move_float : NVPTXInst<(outs Float32Regs:$r), (ins Float32Regs:$s), 1578 "mov.f32 \t$r, $s;", 1579 [(set Float32Regs:$r, 1580 (int_nvvm_move_float Float32Regs:$s))]>; 1581 def nvvm_move_double : NVPTXInst<(outs Float64Regs:$r), (ins Float64Regs:$s), 1582 "mov.f64 \t$r, $s;", 1583 [(set Float64Regs:$r, 1584 (int_nvvm_move_double Float64Regs:$s))]>; 1585 def nvvm_move_ptr32 : NVPTXInst<(outs Int32Regs:$r), (ins Int32Regs:$s), 1586 "mov.u32 \t$r, $s;", 1587 [(set Int32Regs:$r, 1588 (int_nvvm_move_ptr Int32Regs:$s))]>; 1589 def nvvm_move_ptr64 : NVPTXInst<(outs Int64Regs:$r), (ins Int64Regs:$s), 1590 "mov.u64 \t$r, $s;", 1591 [(set Int64Regs:$r, 1592 (int_nvvm_move_ptr Int64Regs:$s))]>; 1593 1594 // @TODO: Are these actually needed, or will we always just see symbols 1595 // copied to registers first? 1596 /*def nvvm_move_sym32 : NVPTXInst<(outs Int32Regs:$r), (ins imem:$s), 1597 "mov.u32 \t$r, $s;", 1598 [(set Int32Regs:$r, 1599 (int_nvvm_move_ptr texternalsym:$s))]>; 1600 def nvvm_move_sym64 : NVPTXInst<(outs Int64Regs:$r), (ins imem:$s), 1601 "mov.u64 \t$r, $s;", 1602 [(set Int64Regs:$r, 1603 (int_nvvm_move_ptr texternalsym:$s))]>;*/ 1604 1605 1606 // MoveParam %r1, param 1607 // ptr_local_to_gen %r2, %r1 1608 // ptr_gen_to_local %r3, %r2 1609 // -> 1610 // mov %r1, param 1611 1612 // @TODO: Revisit this. There is a type 1613 // contradiction between iPTRAny and iPTR for the addr defs, so the move_sym 1614 // instructions are not currently defined. However, we can use the ptr 1615 // variants and the asm printer will do the right thing. 1616 def : Pat<(i64 (int_nvvm_ptr_gen_to_local (int_nvvm_ptr_local_to_gen 1617 (MoveParam texternalsym:$src)))), 1618 (nvvm_move_ptr64 texternalsym:$src)>; 1619 def : Pat<(i32 (int_nvvm_ptr_gen_to_local (int_nvvm_ptr_local_to_gen 1620 (MoveParam texternalsym:$src)))), 1621 (nvvm_move_ptr32 texternalsym:$src)>; 1622 1623 1624 //----------------------------------- 1625 // Compiler Error Warn 1626 // - Just ignore them in codegen 1627 //----------------------------------- 1628 1629 def INT_NVVM_COMPILER_WARN_32 : NVPTXInst<(outs), (ins Int32Regs:$a), 1630 "// llvm.nvvm.compiler.warn()", 1631 [(int_nvvm_compiler_warn Int32Regs:$a)]>; 1632 def INT_NVVM_COMPILER_WARN_64 : NVPTXInst<(outs), (ins Int64Regs:$a), 1633 "// llvm.nvvm.compiler.warn()", 1634 [(int_nvvm_compiler_warn Int64Regs:$a)]>; 1635 def INT_NVVM_COMPILER_ERROR_32 : NVPTXInst<(outs), (ins Int32Regs:$a), 1636 "// llvm.nvvm.compiler.error()", 1637 [(int_nvvm_compiler_error Int32Regs:$a)]>; 1638 def INT_NVVM_COMPILER_ERROR_64 : NVPTXInst<(outs), (ins Int64Regs:$a), 1639 "// llvm.nvvm.compiler.error()", 1640 [(int_nvvm_compiler_error Int64Regs:$a)]>; 1641 1642 1643 1644 //===-- Old PTX Back-end Intrinsics ---------------------------------------===// 1645 1646 // These intrinsics are handled to retain compatibility with the old backend. 1647 1648 // PTX Special Purpose Register Accessor Intrinsics 1649 1650 class PTX_READ_SPECIAL_REGISTER_R64<string regname, Intrinsic intop> 1651 : NVPTXInst<(outs Int64Regs:$d), (ins), 1652 !strconcat(!strconcat("mov.u64\t$d, %", regname), ";"), 1653 [(set Int64Regs:$d, (intop))]>; 1654 1655 class PTX_READ_SPECIAL_REGISTER_R32<string regname, Intrinsic intop> 1656 : NVPTXInst<(outs Int32Regs:$d), (ins), 1657 !strconcat(!strconcat("mov.u32\t$d, %", regname), ";"), 1658 [(set Int32Regs:$d, (intop))]>; 1659 1660 // TODO Add read vector-version of special registers 1661 1662 def PTX_READ_TID_X : PTX_READ_SPECIAL_REGISTER_R32<"tid.x", 1663 int_ptx_read_tid_x>; 1664 def PTX_READ_TID_Y : PTX_READ_SPECIAL_REGISTER_R32<"tid.y", 1665 int_ptx_read_tid_y>; 1666 def PTX_READ_TID_Z : PTX_READ_SPECIAL_REGISTER_R32<"tid.z", 1667 int_ptx_read_tid_z>; 1668 def PTX_READ_TID_W : PTX_READ_SPECIAL_REGISTER_R32<"tid.w", 1669 int_ptx_read_tid_w>; 1670 1671 def PTX_READ_NTID_X : PTX_READ_SPECIAL_REGISTER_R32<"ntid.x", 1672 int_ptx_read_ntid_x>; 1673 def PTX_READ_NTID_Y : PTX_READ_SPECIAL_REGISTER_R32<"ntid.y", 1674 int_ptx_read_ntid_y>; 1675 def PTX_READ_NTID_Z : PTX_READ_SPECIAL_REGISTER_R32<"ntid.z", 1676 int_ptx_read_ntid_z>; 1677 def PTX_READ_NTID_W : PTX_READ_SPECIAL_REGISTER_R32<"ntid.w", 1678 int_ptx_read_ntid_w>; 1679 1680 def PTX_READ_LANEID : PTX_READ_SPECIAL_REGISTER_R32<"laneid", 1681 int_ptx_read_laneid>; 1682 def PTX_READ_WARPID : PTX_READ_SPECIAL_REGISTER_R32<"warpid", 1683 int_ptx_read_warpid>; 1684 def PTX_READ_NWARPID : PTX_READ_SPECIAL_REGISTER_R32<"nwarpid", 1685 int_ptx_read_nwarpid>; 1686 1687 def PTX_READ_CTAID_X : PTX_READ_SPECIAL_REGISTER_R32<"ctaid.x", 1688 int_ptx_read_ctaid_x>; 1689 def PTX_READ_CTAID_Y : PTX_READ_SPECIAL_REGISTER_R32<"ctaid.y", 1690 int_ptx_read_ctaid_y>; 1691 def PTX_READ_CTAID_Z : PTX_READ_SPECIAL_REGISTER_R32<"ctaid.z", 1692 int_ptx_read_ctaid_z>; 1693 def PTX_READ_CTAID_W : PTX_READ_SPECIAL_REGISTER_R32<"ctaid.w", 1694 int_ptx_read_ctaid_w>; 1695 1696 def PTX_READ_NCTAID_X : PTX_READ_SPECIAL_REGISTER_R32<"nctaid.x", 1697 int_ptx_read_nctaid_x>; 1698 def PTX_READ_NCTAID_Y : PTX_READ_SPECIAL_REGISTER_R32<"nctaid.y", 1699 int_ptx_read_nctaid_y>; 1700 def PTX_READ_NCTAID_Z : PTX_READ_SPECIAL_REGISTER_R32<"nctaid.z", 1701 int_ptx_read_nctaid_z>; 1702 def PTX_READ_NCTAID_W : PTX_READ_SPECIAL_REGISTER_R32<"nctaid.w", 1703 int_ptx_read_nctaid_w>; 1704 1705 def PTX_READ_SMID : PTX_READ_SPECIAL_REGISTER_R32<"smid", 1706 int_ptx_read_smid>; 1707 def PTX_READ_NSMID : PTX_READ_SPECIAL_REGISTER_R32<"nsmid", 1708 int_ptx_read_nsmid>; 1709 def PTX_READ_GRIDID : PTX_READ_SPECIAL_REGISTER_R32<"gridid", 1710 int_ptx_read_gridid>; 1711 1712 def PTX_READ_LANEMASK_EQ 1713 : PTX_READ_SPECIAL_REGISTER_R32<"lanemask_eq", int_ptx_read_lanemask_eq>; 1714 def PTX_READ_LANEMASK_LE 1715 : PTX_READ_SPECIAL_REGISTER_R32<"lanemask_le", int_ptx_read_lanemask_le>; 1716 def PTX_READ_LANEMASK_LT 1717 : PTX_READ_SPECIAL_REGISTER_R32<"lanemask_lt", int_ptx_read_lanemask_lt>; 1718 def PTX_READ_LANEMASK_GE 1719 : PTX_READ_SPECIAL_REGISTER_R32<"lanemask_ge", int_ptx_read_lanemask_ge>; 1720 def PTX_READ_LANEMASK_GT 1721 : PTX_READ_SPECIAL_REGISTER_R32<"lanemask_gt", int_ptx_read_lanemask_gt>; 1722 1723 def PTX_READ_CLOCK 1724 : PTX_READ_SPECIAL_REGISTER_R32<"clock", int_ptx_read_clock>; 1725 def PTX_READ_CLOCK64 1726 : PTX_READ_SPECIAL_REGISTER_R64<"clock64", int_ptx_read_clock64>; 1727 1728 def PTX_READ_PM0 : PTX_READ_SPECIAL_REGISTER_R32<"pm0", int_ptx_read_pm0>; 1729 def PTX_READ_PM1 : PTX_READ_SPECIAL_REGISTER_R32<"pm1", int_ptx_read_pm1>; 1730 def PTX_READ_PM2 : PTX_READ_SPECIAL_REGISTER_R32<"pm2", int_ptx_read_pm2>; 1731 def PTX_READ_PM3 : PTX_READ_SPECIAL_REGISTER_R32<"pm3", int_ptx_read_pm3>; 1732 1733 // PTX Parallel Synchronization and Communication Intrinsics 1734 1735 def PTX_BAR_SYNC : NVPTXInst<(outs), (ins i32imm:$i), "bar.sync\t$i;", 1736 [(int_ptx_bar_sync imm:$i)]>; 1737