Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=generic -mattr=+sse2 -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=SSE2
      3 ; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=generic -mattr=+avx -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=AVX
      4 ; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=generic -mattr=+avx512f -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=AVX
      5 ; RUN: llc -mtriple=i686-unknown-unknown -mcpu=generic -mattr=+sse2 -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=SSE2_X86
      6 ; RUN: llc -mtriple=i686-unknown-unknown -mcpu=generic -mattr=+avx -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=AVX_X86
      7 ; RUN: llc -mtriple=i686-unknown-unknown -mcpu=generic -mattr=+avx512f -fast-isel --fast-isel-abort=1 < %s | FileCheck %s --check-prefix=AVX_X86
      8 
      9 
     10 define double @int_to_double_rr(i32 %a) {
     11 ; SSE2-LABEL: int_to_double_rr:
     12 ; SSE2:       # %bb.0: # %entry
     13 ; SSE2-NEXT:    cvtsi2sdl %edi, %xmm0
     14 ; SSE2-NEXT:    retq
     15 ;
     16 ; AVX-LABEL: int_to_double_rr:
     17 ; AVX:       # %bb.0: # %entry
     18 ; AVX-NEXT:    vcvtsi2sdl %edi, %xmm0, %xmm0
     19 ; AVX-NEXT:    retq
     20 ;
     21 ; SSE2_X86-LABEL: int_to_double_rr:
     22 ; SSE2_X86:       # %bb.0: # %entry
     23 ; SSE2_X86-NEXT:    pushl %ebp
     24 ; SSE2_X86-NEXT:    .cfi_def_cfa_offset 8
     25 ; SSE2_X86-NEXT:    .cfi_offset %ebp, -8
     26 ; SSE2_X86-NEXT:    movl %esp, %ebp
     27 ; SSE2_X86-NEXT:    .cfi_def_cfa_register %ebp
     28 ; SSE2_X86-NEXT:    andl $-8, %esp
     29 ; SSE2_X86-NEXT:    subl $8, %esp
     30 ; SSE2_X86-NEXT:    movl 8(%ebp), %eax
     31 ; SSE2_X86-NEXT:    cvtsi2sdl %eax, %xmm0
     32 ; SSE2_X86-NEXT:    movsd %xmm0, (%esp)
     33 ; SSE2_X86-NEXT:    fldl (%esp)
     34 ; SSE2_X86-NEXT:    movl %ebp, %esp
     35 ; SSE2_X86-NEXT:    popl %ebp
     36 ; SSE2_X86-NEXT:    .cfi_def_cfa %esp, 4
     37 ; SSE2_X86-NEXT:    retl
     38 ;
     39 ; AVX_X86-LABEL: int_to_double_rr:
     40 ; AVX_X86:       # %bb.0: # %entry
     41 ; AVX_X86-NEXT:    pushl %ebp
     42 ; AVX_X86-NEXT:    .cfi_def_cfa_offset 8
     43 ; AVX_X86-NEXT:    .cfi_offset %ebp, -8
     44 ; AVX_X86-NEXT:    movl %esp, %ebp
     45 ; AVX_X86-NEXT:    .cfi_def_cfa_register %ebp
     46 ; AVX_X86-NEXT:    andl $-8, %esp
     47 ; AVX_X86-NEXT:    subl $8, %esp
     48 ; AVX_X86-NEXT:    movl 8(%ebp), %eax
     49 ; AVX_X86-NEXT:    vcvtsi2sdl %eax, %xmm0, %xmm0
     50 ; AVX_X86-NEXT:    vmovsd %xmm0, (%esp)
     51 ; AVX_X86-NEXT:    fldl (%esp)
     52 ; AVX_X86-NEXT:    movl %ebp, %esp
     53 ; AVX_X86-NEXT:    popl %ebp
     54 ; AVX_X86-NEXT:    .cfi_def_cfa %esp, 4
     55 ; AVX_X86-NEXT:    retl
     56 entry:
     57   %0 = sitofp i32 %a to double
     58   ret double %0
     59 }
     60 
     61 define double @int_to_double_rm(i32* %a) {
     62 ; SSE2-LABEL: int_to_double_rm:
     63 ; SSE2:       # %bb.0: # %entry
     64 ; SSE2-NEXT:    movl (%rdi), %eax
     65 ; SSE2-NEXT:    cvtsi2sdl %eax, %xmm0
     66 ; SSE2-NEXT:    retq
     67 ;
     68 ; AVX-LABEL: int_to_double_rm:
     69 ; AVX:       # %bb.0: # %entry
     70 ; AVX-NEXT:    movl (%rdi), %eax
     71 ; AVX-NEXT:    vcvtsi2sdl %eax, %xmm0, %xmm0
     72 ; AVX-NEXT:    retq
     73 ;
     74 ; SSE2_X86-LABEL: int_to_double_rm:
     75 ; SSE2_X86:       # %bb.0: # %entry
     76 ; SSE2_X86-NEXT:    pushl %ebp
     77 ; SSE2_X86-NEXT:    .cfi_def_cfa_offset 8
     78 ; SSE2_X86-NEXT:    .cfi_offset %ebp, -8
     79 ; SSE2_X86-NEXT:    movl %esp, %ebp
     80 ; SSE2_X86-NEXT:    .cfi_def_cfa_register %ebp
     81 ; SSE2_X86-NEXT:    andl $-8, %esp
     82 ; SSE2_X86-NEXT:    subl $8, %esp
     83 ; SSE2_X86-NEXT:    movl 8(%ebp), %eax
     84 ; SSE2_X86-NEXT:    cvtsi2sdl (%eax), %xmm0
     85 ; SSE2_X86-NEXT:    movsd %xmm0, (%esp)
     86 ; SSE2_X86-NEXT:    fldl (%esp)
     87 ; SSE2_X86-NEXT:    movl %ebp, %esp
     88 ; SSE2_X86-NEXT:    popl %ebp
     89 ; SSE2_X86-NEXT:    .cfi_def_cfa %esp, 4
     90 ; SSE2_X86-NEXT:    retl
     91 ;
     92 ; AVX_X86-LABEL: int_to_double_rm:
     93 ; AVX_X86:       # %bb.0: # %entry
     94 ; AVX_X86-NEXT:    pushl %ebp
     95 ; AVX_X86-NEXT:    .cfi_def_cfa_offset 8
     96 ; AVX_X86-NEXT:    .cfi_offset %ebp, -8
     97 ; AVX_X86-NEXT:    movl %esp, %ebp
     98 ; AVX_X86-NEXT:    .cfi_def_cfa_register %ebp
     99 ; AVX_X86-NEXT:    andl $-8, %esp
    100 ; AVX_X86-NEXT:    subl $8, %esp
    101 ; AVX_X86-NEXT:    movl 8(%ebp), %eax
    102 ; AVX_X86-NEXT:    vcvtsi2sdl (%eax), %xmm0, %xmm0
    103 ; AVX_X86-NEXT:    vmovsd %xmm0, (%esp)
    104 ; AVX_X86-NEXT:    fldl (%esp)
    105 ; AVX_X86-NEXT:    movl %ebp, %esp
    106 ; AVX_X86-NEXT:    popl %ebp
    107 ; AVX_X86-NEXT:    .cfi_def_cfa %esp, 4
    108 ; AVX_X86-NEXT:    retl
    109 entry:
    110   %0 = load i32, i32* %a
    111   %1 = sitofp i32 %0 to double
    112   ret double %1
    113 }
    114 
    115 define double @int_to_double_rm_optsize(i32* %a) optsize {
    116 ; SSE2-LABEL: int_to_double_rm_optsize:
    117 ; SSE2:       # %bb.0: # %entry
    118 ; SSE2-NEXT:    cvtsi2sdl (%rdi), %xmm0
    119 ; SSE2-NEXT:    retq
    120 ;
    121 ; AVX-LABEL: int_to_double_rm_optsize:
    122 ; AVX:       # %bb.0: # %entry
    123 ; AVX-NEXT:    vcvtsi2sdl (%rdi), %xmm0, %xmm0
    124 ; AVX-NEXT:    retq
    125 ;
    126 ; SSE2_X86-LABEL: int_to_double_rm_optsize:
    127 ; SSE2_X86:       # %bb.0: # %entry
    128 ; SSE2_X86-NEXT:    pushl %ebp
    129 ; SSE2_X86-NEXT:    .cfi_def_cfa_offset 8
    130 ; SSE2_X86-NEXT:    .cfi_offset %ebp, -8
    131 ; SSE2_X86-NEXT:    movl %esp, %ebp
    132 ; SSE2_X86-NEXT:    .cfi_def_cfa_register %ebp
    133 ; SSE2_X86-NEXT:    andl $-8, %esp
    134 ; SSE2_X86-NEXT:    subl $8, %esp
    135 ; SSE2_X86-NEXT:    movl 8(%ebp), %eax
    136 ; SSE2_X86-NEXT:    cvtsi2sdl (%eax), %xmm0
    137 ; SSE2_X86-NEXT:    movsd %xmm0, (%esp)
    138 ; SSE2_X86-NEXT:    fldl (%esp)
    139 ; SSE2_X86-NEXT:    movl %ebp, %esp
    140 ; SSE2_X86-NEXT:    popl %ebp
    141 ; SSE2_X86-NEXT:    .cfi_def_cfa %esp, 4
    142 ; SSE2_X86-NEXT:    retl
    143 ;
    144 ; AVX_X86-LABEL: int_to_double_rm_optsize:
    145 ; AVX_X86:       # %bb.0: # %entry
    146 ; AVX_X86-NEXT:    pushl %ebp
    147 ; AVX_X86-NEXT:    .cfi_def_cfa_offset 8
    148 ; AVX_X86-NEXT:    .cfi_offset %ebp, -8
    149 ; AVX_X86-NEXT:    movl %esp, %ebp
    150 ; AVX_X86-NEXT:    .cfi_def_cfa_register %ebp
    151 ; AVX_X86-NEXT:    andl $-8, %esp
    152 ; AVX_X86-NEXT:    subl $8, %esp
    153 ; AVX_X86-NEXT:    movl 8(%ebp), %eax
    154 ; AVX_X86-NEXT:    vcvtsi2sdl (%eax), %xmm0, %xmm0
    155 ; AVX_X86-NEXT:    vmovsd %xmm0, (%esp)
    156 ; AVX_X86-NEXT:    fldl (%esp)
    157 ; AVX_X86-NEXT:    movl %ebp, %esp
    158 ; AVX_X86-NEXT:    popl %ebp
    159 ; AVX_X86-NEXT:    .cfi_def_cfa %esp, 4
    160 ; AVX_X86-NEXT:    retl
    161 entry:
    162   %0 = load i32, i32* %a
    163   %1 = sitofp i32 %0 to double
    164   ret double %1
    165 }
    166 
    167 define float @int_to_float_rr(i32 %a) {
    168 ; SSE2-LABEL: int_to_float_rr:
    169 ; SSE2:       # %bb.0: # %entry
    170 ; SSE2-NEXT:    cvtsi2ssl %edi, %xmm0
    171 ; SSE2-NEXT:    retq
    172 ;
    173 ; AVX-LABEL: int_to_float_rr:
    174 ; AVX:       # %bb.0: # %entry
    175 ; AVX-NEXT:    vcvtsi2ssl %edi, %xmm0, %xmm0
    176 ; AVX-NEXT:    retq
    177 ;
    178 ; SSE2_X86-LABEL: int_to_float_rr:
    179 ; SSE2_X86:       # %bb.0: # %entry
    180 ; SSE2_X86-NEXT:    pushl %eax
    181 ; SSE2_X86-NEXT:    .cfi_def_cfa_offset 8
    182 ; SSE2_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    183 ; SSE2_X86-NEXT:    cvtsi2ssl %eax, %xmm0
    184 ; SSE2_X86-NEXT:    movss %xmm0, (%esp)
    185 ; SSE2_X86-NEXT:    flds (%esp)
    186 ; SSE2_X86-NEXT:    popl %eax
    187 ; SSE2_X86-NEXT:    .cfi_def_cfa_offset 4
    188 ; SSE2_X86-NEXT:    retl
    189 ;
    190 ; AVX_X86-LABEL: int_to_float_rr:
    191 ; AVX_X86:       # %bb.0: # %entry
    192 ; AVX_X86-NEXT:    pushl %eax
    193 ; AVX_X86-NEXT:    .cfi_def_cfa_offset 8
    194 ; AVX_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    195 ; AVX_X86-NEXT:    vcvtsi2ssl %eax, %xmm0, %xmm0
    196 ; AVX_X86-NEXT:    vmovss %xmm0, (%esp)
    197 ; AVX_X86-NEXT:    flds (%esp)
    198 ; AVX_X86-NEXT:    popl %eax
    199 ; AVX_X86-NEXT:    .cfi_def_cfa_offset 4
    200 ; AVX_X86-NEXT:    retl
    201 entry:
    202   %0 = sitofp i32 %a to float
    203   ret float %0
    204 }
    205 
    206 define float @int_to_float_rm(i32* %a) {
    207 ; SSE2-LABEL: int_to_float_rm:
    208 ; SSE2:       # %bb.0: # %entry
    209 ; SSE2-NEXT:    movl (%rdi), %eax
    210 ; SSE2-NEXT:    cvtsi2ssl %eax, %xmm0
    211 ; SSE2-NEXT:    retq
    212 ;
    213 ; AVX-LABEL: int_to_float_rm:
    214 ; AVX:       # %bb.0: # %entry
    215 ; AVX-NEXT:    movl (%rdi), %eax
    216 ; AVX-NEXT:    vcvtsi2ssl %eax, %xmm0, %xmm0
    217 ; AVX-NEXT:    retq
    218 ;
    219 ; SSE2_X86-LABEL: int_to_float_rm:
    220 ; SSE2_X86:       # %bb.0: # %entry
    221 ; SSE2_X86-NEXT:    pushl %eax
    222 ; SSE2_X86-NEXT:    .cfi_def_cfa_offset 8
    223 ; SSE2_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    224 ; SSE2_X86-NEXT:    cvtsi2ssl (%eax), %xmm0
    225 ; SSE2_X86-NEXT:    movss %xmm0, (%esp)
    226 ; SSE2_X86-NEXT:    flds (%esp)
    227 ; SSE2_X86-NEXT:    popl %eax
    228 ; SSE2_X86-NEXT:    .cfi_def_cfa_offset 4
    229 ; SSE2_X86-NEXT:    retl
    230 ;
    231 ; AVX_X86-LABEL: int_to_float_rm:
    232 ; AVX_X86:       # %bb.0: # %entry
    233 ; AVX_X86-NEXT:    pushl %eax
    234 ; AVX_X86-NEXT:    .cfi_def_cfa_offset 8
    235 ; AVX_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    236 ; AVX_X86-NEXT:    vcvtsi2ssl (%eax), %xmm0, %xmm0
    237 ; AVX_X86-NEXT:    vmovss %xmm0, (%esp)
    238 ; AVX_X86-NEXT:    flds (%esp)
    239 ; AVX_X86-NEXT:    popl %eax
    240 ; AVX_X86-NEXT:    .cfi_def_cfa_offset 4
    241 ; AVX_X86-NEXT:    retl
    242 entry:
    243   %0 = load i32, i32* %a
    244   %1 = sitofp i32 %0 to float
    245   ret float %1
    246 }
    247 
    248 define float @int_to_float_rm_optsize(i32* %a) optsize {
    249 ; SSE2-LABEL: int_to_float_rm_optsize:
    250 ; SSE2:       # %bb.0: # %entry
    251 ; SSE2-NEXT:    cvtsi2ssl (%rdi), %xmm0
    252 ; SSE2-NEXT:    retq
    253 ;
    254 ; AVX-LABEL: int_to_float_rm_optsize:
    255 ; AVX:       # %bb.0: # %entry
    256 ; AVX-NEXT:    vcvtsi2ssl (%rdi), %xmm0, %xmm0
    257 ; AVX-NEXT:    retq
    258 ;
    259 ; SSE2_X86-LABEL: int_to_float_rm_optsize:
    260 ; SSE2_X86:       # %bb.0: # %entry
    261 ; SSE2_X86-NEXT:    pushl %eax
    262 ; SSE2_X86-NEXT:    .cfi_def_cfa_offset 8
    263 ; SSE2_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    264 ; SSE2_X86-NEXT:    cvtsi2ssl (%eax), %xmm0
    265 ; SSE2_X86-NEXT:    movss %xmm0, (%esp)
    266 ; SSE2_X86-NEXT:    flds (%esp)
    267 ; SSE2_X86-NEXT:    popl %eax
    268 ; SSE2_X86-NEXT:    .cfi_def_cfa_offset 4
    269 ; SSE2_X86-NEXT:    retl
    270 ;
    271 ; AVX_X86-LABEL: int_to_float_rm_optsize:
    272 ; AVX_X86:       # %bb.0: # %entry
    273 ; AVX_X86-NEXT:    pushl %eax
    274 ; AVX_X86-NEXT:    .cfi_def_cfa_offset 8
    275 ; AVX_X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    276 ; AVX_X86-NEXT:    vcvtsi2ssl (%eax), %xmm0, %xmm0
    277 ; AVX_X86-NEXT:    vmovss %xmm0, (%esp)
    278 ; AVX_X86-NEXT:    flds (%esp)
    279 ; AVX_X86-NEXT:    popl %eax
    280 ; AVX_X86-NEXT:    .cfi_def_cfa_offset 4
    281 ; AVX_X86-NEXT:    retl
    282 entry:
    283   %0 = load i32, i32* %a
    284   %1 = sitofp i32 %0 to float
    285   ret float %1
    286 }
    287