1 ; RUN: llc < %s -march=ptx32 | FileCheck %s 2 3 ; preds 4 ; (note: we convert back to i32 to return) 5 6 define 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 17 define 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 28 define 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 39 define 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 50 define 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 63 define 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 70 define 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 77 define 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 84 define 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 91 define 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 100 define 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 107 define 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 114 define 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 121 define 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 128 define 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 137 define 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 144 define 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 151 define 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 158 define 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 165 define 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 174 define ptx_device float @cvt_f32_preds(i1 %x) { 175 ; CHECK: mov.b32 %f0, 1065353216; 176 ; CHECK: mov.b32 %f1, 0; 177 ; CHECK: selp.f32 %ret{{[0-9]+}}, %f0, %f1, %p{{[0-9]+}}; 178 ; CHECK: ret; 179 %a = uitofp i1 %x to float 180 ret float %a 181 } 182 183 define 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 190 define 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 197 define 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 204 define 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 211 define 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 218 define 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 225 define 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 234 define ptx_device double @cvt_f64_preds(i1 %x) { 235 ; CHECK: mov.b64 %fd0, 4575657221408423936; 236 ; CHECK: mov.b64 %fd1, 0; 237 ; CHECK: selp.f64 %ret{{[0-9]+}}, %fd0, %fd1, %p{{[0-9]+}}; 238 ; CHECK: ret; 239 %a = uitofp i1 %x to double 240 ret double %a 241 } 242 243 define 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 250 define 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 257 define 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 264 define 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 271 define 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 278 define 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 285 define 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