1; RUN: llc < %s -march=ptx32 | FileCheck %s 2 3; preds 4; (note: we convert back to i32 to return) 5 6define ptx_device i32 @cvt_pred_i16(i16 %x, i1 %y) { 7; CHECK: setp.gt.u16 %p[[P0:[0-9]+]], %rh{{[0-9]+}}, 0 8; CHECK: and.pred %p2, %p[[P0:[0-9]+]], %p{{[0-9]+}}; 9; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0:[0-9]+]]; 10; CHECK: ret; 11 %a = trunc i16 %x to i1 12 %b = and i1 %a, %y 13 %c = zext i1 %b to i32 14 ret i32 %c 15} 16 17define ptx_device i32 @cvt_pred_i32(i32 %x, i1 %y) { 18; CHECK: setp.gt.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, 0 19; CHECK: and.pred %p2, %p[[P0:[0-9]+]], %p{{[0-9]+}}; 20; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0:[0-9]+]]; 21; CHECK: ret; 22 %a = trunc i32 %x to i1 23 %b = and i1 %a, %y 24 %c = zext i1 %b to i32 25 ret i32 %c 26} 27 28define ptx_device i32 @cvt_pred_i64(i64 %x, i1 %y) { 29; CHECK: setp.gt.u64 %p[[P0:[0-9]+]], %rd{{[0-9]+}}, 0 30; CHECK: and.pred %p2, %p[[P0:[0-9]+]], %p{{[0-9]+}}; 31; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0:[0-9]+]]; 32; CHECK: ret; 33 %a = trunc i64 %x to i1 34 %b = and i1 %a, %y 35 %c = zext i1 %b to i32 36 ret i32 %c 37} 38 39define ptx_device i32 @cvt_pred_f32(float %x, i1 %y) { 40; CHECK: setp.gt.u32 %p[[P0:[0-9]+]], %r{{[0-9]+}}, 0 41; CHECK: and.pred %p2, %p[[P0:[0-9]+]], %p{{[0-9]+}}; 42; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0:[0-9]+]]; 43; CHECK: ret; 44 %a = fptoui float %x to i1 45 %b = and i1 %a, %y 46 %c = zext i1 %b to i32 47 ret i32 %c 48} 49 50define ptx_device i32 @cvt_pred_f64(double %x, i1 %y) { 51; CHECK: setp.gt.u64 %p[[P0:[0-9]+]], %rd{{[0-9]+}}, 0 52; CHECK: and.pred %p2, %p[[P0:[0-9]+]], %p{{[0-9]+}}; 53; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p[[P0:[0-9]+]]; 54; CHECK: ret; 55 %a = fptoui double %x to i1 56 %b = and i1 %a, %y 57 %c = zext i1 %b to i32 58 ret i32 %c 59} 60 61; i16 62 63define ptx_device i16 @cvt_i16_preds(i1 %x) { 64; CHECK: selp.u16 %ret{{[0-9]+}}, 1, 0, %p{{[0-9]+}}; 65; CHECK: ret; 66 %a = zext i1 %x to i16 67 ret i16 %a 68} 69 70define ptx_device i16 @cvt_i16_i32(i32 %x) { 71; CHECK: cvt.u16.u32 %ret{{[0-9]+}}, %r{{[0-9]+}}; 72; CHECK: ret; 73 %a = trunc i32 %x to i16 74 ret i16 %a 75} 76 77define ptx_device i16 @cvt_i16_i64(i64 %x) { 78; CHECK: cvt.u16.u64 %ret{{[0-9]+}}, %rd{{[0-9]+}}; 79; CHECK: ret; 80 %a = trunc i64 %x to i16 81 ret i16 %a 82} 83 84define ptx_device i16 @cvt_i16_f32(float %x) { 85; CHECK: cvt.rzi.u16.f32 %ret{{[0-9]+}}, %f{{[0-9]+}}; 86; CHECK: ret; 87 %a = fptoui float %x to i16 88 ret i16 %a 89} 90 91define ptx_device i16 @cvt_i16_f64(double %x) { 92; CHECK: cvt.rzi.u16.f64 %ret{{[0-9]+}}, %fd{{[0-9]+}}; 93; CHECK: ret; 94 %a = fptoui double %x to i16 95 ret i16 %a 96} 97 98; i32 99 100define ptx_device i32 @cvt_i32_preds(i1 %x) { 101; CHECK: selp.u32 %ret{{[0-9]+}}, 1, 0, %p{{[0-9]+}}; 102; CHECK: ret; 103 %a = zext i1 %x to i32 104 ret i32 %a 105} 106 107define ptx_device i32 @cvt_i32_i16(i16 %x) { 108; CHECK: cvt.u32.u16 %ret{{[0-9]+}}, %rh{{[0-9]+}}; 109; CHECK: ret; 110 %a = zext i16 %x to i32 111 ret i32 %a 112} 113 114define ptx_device i32 @cvt_i32_i64(i64 %x) { 115; CHECK: cvt.u32.u64 %ret{{[0-9]+}}, %rd{{[0-9]+}}; 116; CHECK: ret; 117 %a = trunc i64 %x to i32 118 ret i32 %a 119} 120 121define ptx_device i32 @cvt_i32_f32(float %x) { 122; CHECK: cvt.rzi.u32.f32 %ret{{[0-9]+}}, %f{{[0-9]+}}; 123; CHECK: ret; 124 %a = fptoui float %x to i32 125 ret i32 %a 126} 127 128define ptx_device i32 @cvt_i32_f64(double %x) { 129; CHECK: cvt.rzi.u32.f64 %ret{{[0-9]+}}, %fd{{[0-9]+}}; 130; CHECK: ret; 131 %a = fptoui double %x to i32 132 ret i32 %a 133} 134 135; i64 136 137define ptx_device i64 @cvt_i64_preds(i1 %x) { 138; CHECK: selp.u64 %ret{{[0-9]+}}, 1, 0, %p{{[0-9]+}}; 139; CHECK: ret; 140 %a = zext i1 %x to i64 141 ret i64 %a 142} 143 144define ptx_device i64 @cvt_i64_i16(i16 %x) { 145; CHECK: cvt.u64.u16 %ret{{[0-9]+}}, %rh{{[0-9]+}}; 146; CHECK: ret; 147 %a = zext i16 %x to i64 148 ret i64 %a 149} 150 151define ptx_device i64 @cvt_i64_i32(i32 %x) { 152; CHECK: cvt.u64.u32 %ret{{[0-9]+}}, %r{{[0-9]+}}; 153; CHECK: ret; 154 %a = zext i32 %x to i64 155 ret i64 %a 156} 157 158define ptx_device i64 @cvt_i64_f32(float %x) { 159; CHECK: cvt.rzi.u64.f32 %ret{{[0-9]+}}, %f{{[0-9]+}}; 160; CHECK: ret; 161 %a = fptoui float %x to i64 162 ret i64 %a 163} 164 165define ptx_device i64 @cvt_i64_f64(double %x) { 166; CHECK: cvt.rzi.u64.f64 %ret{{[0-9]+}}, %fd{{[0-9]+}}; 167; CHECK: ret; 168 %a = fptoui double %x to i64 169 ret i64 %a 170} 171 172; f32 173 174define ptx_device float @cvt_f32_preds(i1 %x) { 175; CHECK: mov.b32 %f0, 0; 176; CHECK: mov.b32 %f1, 1065353216; 177; CHECK: selp.f32 %ret{{[0-9]+}}, %f1, %f0, %p{{[0-9]+}}; 178; CHECK: ret; 179 %a = uitofp i1 %x to float 180 ret float %a 181} 182 183define ptx_device float @cvt_f32_i16(i16 %x) { 184; CHECK: cvt.rn.f32.u16 %ret{{[0-9]+}}, %rh{{[0-9]+}}; 185; CHECK: ret; 186 %a = uitofp i16 %x to float 187 ret float %a 188} 189 190define ptx_device float @cvt_f32_i32(i32 %x) { 191; CHECK: cvt.rn.f32.u32 %ret{{[0-9]+}}, %r{{[0-9]+}}; 192; CHECK: ret; 193 %a = uitofp i32 %x to float 194 ret float %a 195} 196 197define ptx_device float @cvt_f32_i64(i64 %x) { 198; CHECK: cvt.rn.f32.u64 %ret{{[0-9]+}}, %rd{{[0-9]+}}; 199; CHECK: ret; 200 %a = uitofp i64 %x to float 201 ret float %a 202} 203 204define ptx_device float @cvt_f32_f64(double %x) { 205; CHECK: cvt.rn.f32.f64 %ret{{[0-9]+}}, %fd{{[0-9]+}}; 206; CHECK: ret; 207 %a = fptrunc double %x to float 208 ret float %a 209} 210 211define ptx_device float @cvt_f32_s16(i16 %x) { 212; CHECK: cvt.rn.f32.s16 %ret{{[0-9]+}}, %rh{{[0-9]+}} 213; CHECK: ret 214 %a = sitofp i16 %x to float 215 ret float %a 216} 217 218define ptx_device float @cvt_f32_s32(i32 %x) { 219; CHECK: cvt.rn.f32.s32 %ret{{[0-9]+}}, %r{{[0-9]+}} 220; CHECK: ret 221 %a = sitofp i32 %x to float 222 ret float %a 223} 224 225define ptx_device float @cvt_f32_s64(i64 %x) { 226; CHECK: cvt.rn.f32.s64 %ret{{[0-9]+}}, %rd{{[0-9]+}} 227; CHECK: ret 228 %a = sitofp i64 %x to float 229 ret float %a 230} 231 232; f64 233 234define ptx_device double @cvt_f64_preds(i1 %x) { 235; CHECK: mov.b64 %fd0, 0; 236; CHECK: mov.b64 %fd1, 4575657221408423936; 237; CHECK: selp.f64 %ret{{[0-9]+}}, %fd1, %fd0, %p{{[0-9]+}}; 238; CHECK: ret; 239 %a = uitofp i1 %x to double 240 ret double %a 241} 242 243define ptx_device double @cvt_f64_i16(i16 %x) { 244; CHECK: cvt.rn.f64.u16 %ret{{[0-9]+}}, %rh{{[0-9]+}}; 245; CHECK: ret; 246 %a = uitofp i16 %x to double 247 ret double %a 248} 249 250define ptx_device double @cvt_f64_i32(i32 %x) { 251; CHECK: cvt.rn.f64.u32 %ret{{[0-9]+}}, %r{{[0-9]+}}; 252; CHECK: ret; 253 %a = uitofp i32 %x to double 254 ret double %a 255} 256 257define ptx_device double @cvt_f64_i64(i64 %x) { 258; CHECK: cvt.rn.f64.u64 %ret{{[0-9]+}}, %rd{{[0-9]+}}; 259; CHECK: ret; 260 %a = uitofp i64 %x to double 261 ret double %a 262} 263 264define ptx_device double @cvt_f64_f32(float %x) { 265; CHECK: cvt.f64.f32 %ret{{[0-9]+}}, %f{{[0-9]+}}; 266; CHECK: ret; 267 %a = fpext float %x to double 268 ret double %a 269} 270 271define ptx_device double @cvt_f64_s16(i16 %x) { 272; CHECK: cvt.rn.f64.s16 %ret{{[0-9]+}}, %rh{{[0-9]+}} 273; CHECK: ret 274 %a = sitofp i16 %x to double 275 ret double %a 276} 277 278define ptx_device double @cvt_f64_s32(i32 %x) { 279; CHECK: cvt.rn.f64.s32 %ret{{[0-9]+}}, %r{{[0-9]+}} 280; CHECK: ret 281 %a = sitofp i32 %x to double 282 ret double %a 283} 284 285define ptx_device double @cvt_f64_s64(i64 %x) { 286; CHECK: cvt.rn.f64.s64 %ret{{[0-9]+}}, %rd{{[0-9]+}} 287; CHECK: ret 288 %a = sitofp i64 %x to double 289 ret double %a 290} 291