Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl --show-mc-encoding | FileCheck %s
      2 
      3 ; CHECK-LABEL: sitof32
      4 ; CHECK: vcvtdq2ps %zmm
      5 ; CHECK: ret
      6 define <16 x float> @sitof32(<16 x i32> %a) nounwind {
      7   %b = sitofp <16 x i32> %a to <16 x float>
      8   ret <16 x float> %b
      9 }
     10 
     11 ; CHECK-LABEL: fptosi00
     12 ; CHECK: vcvttps2dq %zmm
     13 ; CHECK: ret
     14 define <16 x i32> @fptosi00(<16 x float> %a) nounwind {
     15   %b = fptosi <16 x float> %a to <16 x i32>
     16   ret <16 x i32> %b
     17 }
     18 
     19 ; CHECK-LABEL: fptoui00
     20 ; CHECK: vcvttps2udq
     21 ; CHECK: ret
     22 define <16 x i32> @fptoui00(<16 x float> %a) nounwind {
     23   %b = fptoui <16 x float> %a to <16 x i32>
     24   ret <16 x i32> %b
     25 }
     26 
     27 ; CHECK-LABEL: fptoui_256
     28 ; CHECK: vcvttps2udq
     29 ; CHECK: ret
     30 define <8 x i32> @fptoui_256(<8 x float> %a) nounwind {
     31   %b = fptoui <8 x float> %a to <8 x i32>
     32   ret <8 x i32> %b
     33 }
     34 
     35 ; CHECK-LABEL: fptoui_128
     36 ; CHECK: vcvttps2udq
     37 ; CHECK: ret
     38 define <4 x i32> @fptoui_128(<4 x float> %a) nounwind {
     39   %b = fptoui <4 x float> %a to <4 x i32>
     40   ret <4 x i32> %b
     41 }
     42 
     43 ; CHECK-LABEL: fptoui01
     44 ; CHECK: vcvttpd2udq
     45 ; CHECK: ret
     46 define <8 x i32> @fptoui01(<8 x double> %a) nounwind {
     47   %b = fptoui <8 x double> %a to <8 x i32>
     48   ret <8 x i32> %b
     49 }
     50 
     51 ; CHECK-LABEL: sitof64
     52 ; CHECK: vcvtdq2pd %ymm
     53 ; CHECK: ret
     54 define <8 x double> @sitof64(<8 x i32> %a) {
     55   %b = sitofp <8 x i32> %a to <8 x double>
     56   ret <8 x double> %b
     57 }
     58 
     59 ; CHECK-LABEL: fptosi01
     60 ; CHECK: vcvttpd2dq %zmm
     61 ; CHECK: ret
     62 define <8 x i32> @fptosi01(<8 x double> %a) {
     63   %b = fptosi <8 x double> %a to <8 x i32>
     64   ret <8 x i32> %b
     65 }
     66 
     67 ; CHECK-LABEL: fptrunc00
     68 ; CHECK: vcvtpd2ps %zmm
     69 ; CHECK-NEXT: vcvtpd2ps %zmm
     70 ; CHECK-NEXT: vinsertf64x4    $1
     71 ; CHECK: ret
     72 define <16 x float> @fptrunc00(<16 x double> %b) nounwind {
     73   %a = fptrunc <16 x double> %b to <16 x float>
     74   ret <16 x float> %a
     75 }
     76 
     77 ; CHECK-LABEL: fpext00
     78 ; CHECK: vcvtps2pd %ymm0, %zmm0
     79 ; CHECK: ret
     80 define <8 x double> @fpext00(<8 x float> %b) nounwind {
     81   %a = fpext <8 x float> %b to <8 x double>
     82   ret <8 x double> %a
     83 }
     84 
     85 ; CHECK-LABEL: funcA
     86 ; CHECK: vcvtsi2sdq (%rdi){{.*}} encoding: [0x62
     87 ; CHECK: ret
     88 define double @funcA(i64* nocapture %e) {
     89 entry:
     90   %tmp1 = load i64* %e, align 8
     91   %conv = sitofp i64 %tmp1 to double
     92   ret double %conv
     93 }
     94 
     95 ; CHECK-LABEL: funcB
     96 ; CHECK: vcvtsi2sdl (%{{.*}} encoding: [0x62
     97 ; CHECK: ret
     98 define double @funcB(i32* %e) {
     99 entry:
    100   %tmp1 = load i32* %e, align 4
    101   %conv = sitofp i32 %tmp1 to double
    102   ret double %conv
    103 }
    104 
    105 ; CHECK-LABEL: funcC
    106 ; CHECK: vcvtsi2ssl (%{{.*}} encoding: [0x62
    107 ; CHECK: ret
    108 define float @funcC(i32* %e) {
    109 entry:
    110   %tmp1 = load i32* %e, align 4
    111   %conv = sitofp i32 %tmp1 to float
    112   ret float %conv
    113 }
    114 
    115 ; CHECK-LABEL: i64tof32
    116 ; CHECK: vcvtsi2ssq  (%{{.*}} encoding: [0x62
    117 ; CHECK: ret
    118 define float @i64tof32(i64* %e) {
    119 entry:
    120   %tmp1 = load i64* %e, align 8
    121   %conv = sitofp i64 %tmp1 to float
    122   ret float %conv
    123 }
    124 
    125 ; CHECK-LABEL: fpext
    126 ; CHECK: vcvtss2sd {{.*}} encoding: [0x62
    127 ; CHECK: ret
    128 define void @fpext() {
    129 entry:
    130   %f = alloca float, align 4
    131   %d = alloca double, align 8
    132   %tmp = load float* %f, align 4
    133   %conv = fpext float %tmp to double
    134   store double %conv, double* %d, align 8
    135   ret void
    136 }
    137 
    138 ; CHECK-LABEL: fpround_scalar
    139 ; CHECK: vmovsd {{.*}} encoding: [0x62
    140 ; CHECK: vcvtsd2ss {{.*}} encoding: [0x62
    141 ; CHECK: vmovss {{.*}} encoding: [0x62
    142 ; CHECK: ret
    143 define void @fpround_scalar() nounwind uwtable {
    144 entry:
    145   %f = alloca float, align 4
    146   %d = alloca double, align 8
    147   %tmp = load double* %d, align 8
    148   %conv = fptrunc double %tmp to float
    149   store float %conv, float* %f, align 4
    150   ret void
    151 }
    152 
    153 ; CHECK-LABEL: long_to_double
    154 ; CHECK: vmovq {{.*}} encoding: [0x62
    155 ; CHECK: ret
    156 define double @long_to_double(i64 %x) {
    157    %res = bitcast i64 %x to double
    158    ret double %res
    159 }
    160 
    161 ; CHECK-LABEL: double_to_long
    162 ; CHECK: vmovq {{.*}} encoding: [0x62
    163 ; CHECK: ret
    164 define i64 @double_to_long(double %x) {
    165    %res = bitcast double %x to i64
    166    ret i64 %res
    167 }
    168 
    169 ; CHECK-LABEL: int_to_float
    170 ; CHECK: vmovd {{.*}} encoding: [0x62
    171 ; CHECK: ret
    172 define float @int_to_float(i32 %x) {
    173    %res = bitcast i32 %x to float
    174    ret float %res
    175 }
    176 
    177 ; CHECK-LABEL: float_to_int
    178 ; CHECK: vmovd {{.*}} encoding: [0x62
    179 ; CHECK: ret
    180 define i32 @float_to_int(float %x) {
    181    %res = bitcast float %x to i32
    182    ret i32 %res
    183 }
    184 
    185 ; CHECK-LABEL: uitof64
    186 ; CHECK: vcvtudq2pd
    187 ; CHECK: vextracti64x4
    188 ; CHECK: vcvtudq2pd
    189 ; CHECK: ret
    190 define <16 x double> @uitof64(<16 x i32> %a) nounwind {
    191   %b = uitofp <16 x i32> %a to <16 x double>
    192   ret <16 x double> %b
    193 }
    194 
    195 ; CHECK-LABEL: uitof64_256
    196 ; CHECK: vcvtudq2pd
    197 ; CHECK: ret
    198 define <4 x double> @uitof64_256(<4 x i32> %a) nounwind {
    199   %b = uitofp <4 x i32> %a to <4 x double>
    200   ret <4 x double> %b
    201 }
    202 
    203 ; CHECK-LABEL: uitof32
    204 ; CHECK: vcvtudq2ps
    205 ; CHECK: ret
    206 define <16 x float> @uitof32(<16 x i32> %a) nounwind {
    207   %b = uitofp <16 x i32> %a to <16 x float>
    208   ret <16 x float> %b
    209 }
    210 
    211 ; CHECK-LABEL: uitof32_256
    212 ; CHECK: vcvtudq2ps
    213 ; CHECK: ret
    214 define <8 x float> @uitof32_256(<8 x i32> %a) nounwind {
    215   %b = uitofp <8 x i32> %a to <8 x float>
    216   ret <8 x float> %b
    217 }
    218 
    219 ; CHECK-LABEL: uitof32_128
    220 ; CHECK: vcvtudq2ps
    221 ; CHECK: ret
    222 define <4 x float> @uitof32_128(<4 x i32> %a) nounwind {
    223   %b = uitofp <4 x i32> %a to <4 x float>
    224   ret <4 x float> %b
    225 }
    226 
    227 ; CHECK-LABEL: @fptosi02
    228 ; CHECK: vcvttss2si {{.*}} encoding: [0x62
    229 ; CHECK: ret
    230 define i32 @fptosi02(float %a) nounwind {
    231   %b = fptosi float %a to i32
    232   ret i32 %b
    233 }
    234 
    235 ; CHECK-LABEL: @fptoui02
    236 ; CHECK: vcvttss2usi {{.*}} encoding: [0x62
    237 ; CHECK: ret
    238 define i32 @fptoui02(float %a) nounwind {
    239   %b = fptoui float %a to i32
    240   ret i32 %b
    241 }
    242 
    243 ; CHECK-LABEL: @uitofp02
    244 ; CHECK: vcvtusi2ss
    245 ; CHECK: ret
    246 define float @uitofp02(i32 %a) nounwind {
    247   %b = uitofp i32 %a to float
    248   ret float %b
    249 }
    250 
    251 ; CHECK-LABEL: @uitofp03
    252 ; CHECK: vcvtusi2sd
    253 ; CHECK: ret
    254 define double @uitofp03(i32 %a) nounwind {
    255   %b = uitofp i32 %a to double
    256   ret double %b
    257 }
    258