Home | History | Annotate | Download | only in PTX
      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