Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2    | FileCheck %s --check-prefix=SSE2
      3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1  | FileCheck %s --check-prefix=SSE41
      4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx     | FileCheck %s --check-prefix=AVX1
      5 
      6 define float @trunc_unsigned_f32(float %x) #0 {
      7 ; SSE2-LABEL: trunc_unsigned_f32:
      8 ; SSE2:       # %bb.0:
      9 ; SSE2-NEXT:    cvttss2si %xmm0, %rax
     10 ; SSE2-NEXT:    movl %eax, %eax
     11 ; SSE2-NEXT:    xorps %xmm0, %xmm0
     12 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
     13 ; SSE2-NEXT:    retq
     14 ;
     15 ; SSE41-LABEL: trunc_unsigned_f32:
     16 ; SSE41:       # %bb.0:
     17 ; SSE41-NEXT:    roundss $11, %xmm0, %xmm0
     18 ; SSE41-NEXT:    retq
     19 ;
     20 ; AVX1-LABEL: trunc_unsigned_f32:
     21 ; AVX1:       # %bb.0:
     22 ; AVX1-NEXT:    vroundss $11, %xmm0, %xmm0, %xmm0
     23 ; AVX1-NEXT:    retq
     24   %i = fptoui float %x to i32
     25   %r = uitofp i32 %i to float
     26   ret float %r
     27 }
     28 
     29 define double @trunc_unsigned_f64(double %x) #0 {
     30 ; SSE2-LABEL: trunc_unsigned_f64:
     31 ; SSE2:       # %bb.0:
     32 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
     33 ; SSE2-NEXT:    movapd %xmm0, %xmm2
     34 ; SSE2-NEXT:    subsd %xmm1, %xmm2
     35 ; SSE2-NEXT:    cvttsd2si %xmm2, %rax
     36 ; SSE2-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
     37 ; SSE2-NEXT:    xorq %rax, %rcx
     38 ; SSE2-NEXT:    cvttsd2si %xmm0, %rax
     39 ; SSE2-NEXT:    ucomisd %xmm1, %xmm0
     40 ; SSE2-NEXT:    cmovaeq %rcx, %rax
     41 ; SSE2-NEXT:    movq %rax, %xmm1
     42 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]
     43 ; SSE2-NEXT:    subpd {{.*}}(%rip), %xmm1
     44 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
     45 ; SSE2-NEXT:    addpd %xmm1, %xmm0
     46 ; SSE2-NEXT:    retq
     47 ;
     48 ; SSE41-LABEL: trunc_unsigned_f64:
     49 ; SSE41:       # %bb.0:
     50 ; SSE41-NEXT:    roundsd $11, %xmm0, %xmm0
     51 ; SSE41-NEXT:    retq
     52 ;
     53 ; AVX1-LABEL: trunc_unsigned_f64:
     54 ; AVX1:       # %bb.0:
     55 ; AVX1-NEXT:    vroundsd $11, %xmm0, %xmm0, %xmm0
     56 ; AVX1-NEXT:    retq
     57   %i = fptoui double %x to i64
     58   %r = uitofp i64 %i to double
     59   ret double %r
     60 }
     61 
     62 define <4 x float> @trunc_unsigned_v4f32(<4 x float> %x) #0 {
     63 ; SSE2-LABEL: trunc_unsigned_v4f32:
     64 ; SSE2:       # %bb.0:
     65 ; SSE2-NEXT:    movaps %xmm0, %xmm1
     66 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,1],xmm0[2,3]
     67 ; SSE2-NEXT:    cvttss2si %xmm1, %rax
     68 ; SSE2-NEXT:    movd %eax, %xmm1
     69 ; SSE2-NEXT:    movaps %xmm0, %xmm2
     70 ; SSE2-NEXT:    movhlps {{.*#+}} xmm2 = xmm0[1],xmm2[1]
     71 ; SSE2-NEXT:    cvttss2si %xmm2, %rax
     72 ; SSE2-NEXT:    movd %eax, %xmm2
     73 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
     74 ; SSE2-NEXT:    cvttss2si %xmm0, %rax
     75 ; SSE2-NEXT:    movd %eax, %xmm1
     76 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
     77 ; SSE2-NEXT:    cvttss2si %xmm0, %rax
     78 ; SSE2-NEXT:    movd %eax, %xmm0
     79 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
     80 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
     81 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [65535,65535,65535,65535]
     82 ; SSE2-NEXT:    pand %xmm1, %xmm0
     83 ; SSE2-NEXT:    por {{.*}}(%rip), %xmm0
     84 ; SSE2-NEXT:    psrld $16, %xmm1
     85 ; SSE2-NEXT:    por {{.*}}(%rip), %xmm1
     86 ; SSE2-NEXT:    addps {{.*}}(%rip), %xmm1
     87 ; SSE2-NEXT:    addps %xmm0, %xmm1
     88 ; SSE2-NEXT:    movaps %xmm1, %xmm0
     89 ; SSE2-NEXT:    retq
     90 ;
     91 ; SSE41-LABEL: trunc_unsigned_v4f32:
     92 ; SSE41:       # %bb.0:
     93 ; SSE41-NEXT:    roundps $11, %xmm0, %xmm0
     94 ; SSE41-NEXT:    retq
     95 ;
     96 ; AVX1-LABEL: trunc_unsigned_v4f32:
     97 ; AVX1:       # %bb.0:
     98 ; AVX1-NEXT:    vroundps $11, %xmm0, %xmm0
     99 ; AVX1-NEXT:    retq
    100   %i = fptoui <4 x float> %x to <4 x i32>
    101   %r = uitofp <4 x i32> %i to <4 x float>
    102   ret <4 x float> %r
    103 }
    104 
    105 define <2 x double> @trunc_unsigned_v2f64(<2 x double> %x) #0 {
    106 ; SSE2-LABEL: trunc_unsigned_v2f64:
    107 ; SSE2:       # %bb.0:
    108 ; SSE2-NEXT:    movaps %xmm0, %xmm1
    109 ; SSE2-NEXT:    movhlps {{.*#+}} xmm1 = xmm0[1],xmm1[1]
    110 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
    111 ; SSE2-NEXT:    movaps %xmm1, %xmm3
    112 ; SSE2-NEXT:    subsd %xmm2, %xmm3
    113 ; SSE2-NEXT:    cvttsd2si %xmm3, %rax
    114 ; SSE2-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
    115 ; SSE2-NEXT:    xorq %rcx, %rax
    116 ; SSE2-NEXT:    cvttsd2si %xmm1, %rdx
    117 ; SSE2-NEXT:    ucomisd %xmm2, %xmm1
    118 ; SSE2-NEXT:    cmovaeq %rax, %rdx
    119 ; SSE2-NEXT:    movaps %xmm0, %xmm1
    120 ; SSE2-NEXT:    subsd %xmm2, %xmm1
    121 ; SSE2-NEXT:    cvttsd2si %xmm1, %rax
    122 ; SSE2-NEXT:    xorq %rcx, %rax
    123 ; SSE2-NEXT:    cvttsd2si %xmm0, %rcx
    124 ; SSE2-NEXT:    ucomisd %xmm2, %xmm0
    125 ; SSE2-NEXT:    cmovaeq %rax, %rcx
    126 ; SSE2-NEXT:    movq %rcx, %xmm1
    127 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [1127219200,1160773632,0,0]
    128 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
    129 ; SSE2-NEXT:    movapd {{.*#+}} xmm3 = [4.503600e+15,1.934281e+25]
    130 ; SSE2-NEXT:    subpd %xmm3, %xmm1
    131 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
    132 ; SSE2-NEXT:    addpd %xmm1, %xmm0
    133 ; SSE2-NEXT:    movq %rdx, %xmm1
    134 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
    135 ; SSE2-NEXT:    subpd %xmm3, %xmm1
    136 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
    137 ; SSE2-NEXT:    addpd %xmm1, %xmm2
    138 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]
    139 ; SSE2-NEXT:    retq
    140 ;
    141 ; SSE41-LABEL: trunc_unsigned_v2f64:
    142 ; SSE41:       # %bb.0:
    143 ; SSE41-NEXT:    roundpd $11, %xmm0, %xmm0
    144 ; SSE41-NEXT:    retq
    145 ;
    146 ; AVX1-LABEL: trunc_unsigned_v2f64:
    147 ; AVX1:       # %bb.0:
    148 ; AVX1-NEXT:    vroundpd $11, %xmm0, %xmm0
    149 ; AVX1-NEXT:    retq
    150   %i = fptoui <2 x double> %x to <2 x i64>
    151   %r = uitofp <2 x i64> %i to <2 x double>
    152   ret <2 x double> %r
    153 }
    154 
    155 define <4 x double> @trunc_unsigned_v4f64(<4 x double> %x) #0 {
    156 ; SSE2-LABEL: trunc_unsigned_v4f64:
    157 ; SSE2:       # %bb.0:
    158 ; SSE2-NEXT:    movaps %xmm1, %xmm3
    159 ; SSE2-NEXT:    movhlps {{.*#+}} xmm3 = xmm1[1],xmm3[1]
    160 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
    161 ; SSE2-NEXT:    movaps %xmm3, %xmm4
    162 ; SSE2-NEXT:    subsd %xmm2, %xmm4
    163 ; SSE2-NEXT:    cvttsd2si %xmm4, %rcx
    164 ; SSE2-NEXT:    movabsq $-9223372036854775808, %rdx # imm = 0x8000000000000000
    165 ; SSE2-NEXT:    xorq %rdx, %rcx
    166 ; SSE2-NEXT:    cvttsd2si %xmm3, %rax
    167 ; SSE2-NEXT:    ucomisd %xmm2, %xmm3
    168 ; SSE2-NEXT:    cmovaeq %rcx, %rax
    169 ; SSE2-NEXT:    movaps %xmm1, %xmm3
    170 ; SSE2-NEXT:    subsd %xmm2, %xmm3
    171 ; SSE2-NEXT:    cvttsd2si %xmm3, %rsi
    172 ; SSE2-NEXT:    xorq %rdx, %rsi
    173 ; SSE2-NEXT:    cvttsd2si %xmm1, %rcx
    174 ; SSE2-NEXT:    ucomisd %xmm2, %xmm1
    175 ; SSE2-NEXT:    cmovaeq %rsi, %rcx
    176 ; SSE2-NEXT:    movaps %xmm0, %xmm1
    177 ; SSE2-NEXT:    movhlps {{.*#+}} xmm1 = xmm0[1],xmm1[1]
    178 ; SSE2-NEXT:    movaps %xmm1, %xmm3
    179 ; SSE2-NEXT:    subsd %xmm2, %xmm3
    180 ; SSE2-NEXT:    cvttsd2si %xmm3, %rsi
    181 ; SSE2-NEXT:    xorq %rdx, %rsi
    182 ; SSE2-NEXT:    cvttsd2si %xmm1, %rdi
    183 ; SSE2-NEXT:    ucomisd %xmm2, %xmm1
    184 ; SSE2-NEXT:    cmovaeq %rsi, %rdi
    185 ; SSE2-NEXT:    movaps %xmm0, %xmm1
    186 ; SSE2-NEXT:    subsd %xmm2, %xmm1
    187 ; SSE2-NEXT:    cvttsd2si %xmm1, %rsi
    188 ; SSE2-NEXT:    xorq %rdx, %rsi
    189 ; SSE2-NEXT:    cvttsd2si %xmm0, %rdx
    190 ; SSE2-NEXT:    ucomisd %xmm2, %xmm0
    191 ; SSE2-NEXT:    cmovaeq %rsi, %rdx
    192 ; SSE2-NEXT:    movq %rdx, %xmm1
    193 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [1127219200,1160773632,0,0]
    194 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
    195 ; SSE2-NEXT:    movapd {{.*#+}} xmm3 = [4.503600e+15,1.934281e+25]
    196 ; SSE2-NEXT:    subpd %xmm3, %xmm1
    197 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
    198 ; SSE2-NEXT:    addpd %xmm1, %xmm0
    199 ; SSE2-NEXT:    movq %rdi, %xmm1
    200 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
    201 ; SSE2-NEXT:    subpd %xmm3, %xmm1
    202 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[2,3,0,1]
    203 ; SSE2-NEXT:    addpd %xmm1, %xmm4
    204 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm4[0]
    205 ; SSE2-NEXT:    movq %rcx, %xmm4
    206 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
    207 ; SSE2-NEXT:    subpd %xmm3, %xmm4
    208 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[2,3,0,1]
    209 ; SSE2-NEXT:    addpd %xmm4, %xmm1
    210 ; SSE2-NEXT:    movq %rax, %xmm4
    211 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
    212 ; SSE2-NEXT:    subpd %xmm3, %xmm4
    213 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[2,3,0,1]
    214 ; SSE2-NEXT:    addpd %xmm4, %xmm2
    215 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]
    216 ; SSE2-NEXT:    retq
    217 ;
    218 ; SSE41-LABEL: trunc_unsigned_v4f64:
    219 ; SSE41:       # %bb.0:
    220 ; SSE41-NEXT:    roundpd $11, %xmm0, %xmm0
    221 ; SSE41-NEXT:    roundpd $11, %xmm1, %xmm1
    222 ; SSE41-NEXT:    retq
    223 ;
    224 ; AVX1-LABEL: trunc_unsigned_v4f64:
    225 ; AVX1:       # %bb.0:
    226 ; AVX1-NEXT:    vroundpd $11, %ymm0, %ymm0
    227 ; AVX1-NEXT:    retq
    228   %i = fptoui <4 x double> %x to <4 x i64>
    229   %r = uitofp <4 x i64> %i to <4 x double>
    230   ret <4 x double> %r
    231 }
    232 
    233 define float @trunc_signed_f32(float %x) #0 {
    234 ; SSE2-LABEL: trunc_signed_f32:
    235 ; SSE2:       # %bb.0:
    236 ; SSE2-NEXT:    cvttss2si %xmm0, %eax
    237 ; SSE2-NEXT:    xorps %xmm0, %xmm0
    238 ; SSE2-NEXT:    cvtsi2ssl %eax, %xmm0
    239 ; SSE2-NEXT:    retq
    240 ;
    241 ; SSE41-LABEL: trunc_signed_f32:
    242 ; SSE41:       # %bb.0:
    243 ; SSE41-NEXT:    roundss $11, %xmm0, %xmm0
    244 ; SSE41-NEXT:    retq
    245 ;
    246 ; AVX1-LABEL: trunc_signed_f32:
    247 ; AVX1:       # %bb.0:
    248 ; AVX1-NEXT:    vroundss $11, %xmm0, %xmm0, %xmm0
    249 ; AVX1-NEXT:    retq
    250   %i = fptosi float %x to i32
    251   %r = sitofp i32 %i to float
    252   ret float %r
    253 }
    254 
    255 define double @trunc_signed_f64(double %x) #0 {
    256 ; SSE2-LABEL: trunc_signed_f64:
    257 ; SSE2:       # %bb.0:
    258 ; SSE2-NEXT:    cvttsd2si %xmm0, %rax
    259 ; SSE2-NEXT:    xorps %xmm0, %xmm0
    260 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm0
    261 ; SSE2-NEXT:    retq
    262 ;
    263 ; SSE41-LABEL: trunc_signed_f64:
    264 ; SSE41:       # %bb.0:
    265 ; SSE41-NEXT:    roundsd $11, %xmm0, %xmm0
    266 ; SSE41-NEXT:    retq
    267 ;
    268 ; AVX1-LABEL: trunc_signed_f64:
    269 ; AVX1:       # %bb.0:
    270 ; AVX1-NEXT:    vroundsd $11, %xmm0, %xmm0, %xmm0
    271 ; AVX1-NEXT:    retq
    272   %i = fptosi double %x to i64
    273   %r = sitofp i64 %i to double
    274   ret double %r
    275 }
    276 
    277 define <4 x float> @trunc_signed_v4f32(<4 x float> %x) #0 {
    278 ; SSE2-LABEL: trunc_signed_v4f32:
    279 ; SSE2:       # %bb.0:
    280 ; SSE2-NEXT:    cvttps2dq %xmm0, %xmm0
    281 ; SSE2-NEXT:    cvtdq2ps %xmm0, %xmm0
    282 ; SSE2-NEXT:    retq
    283 ;
    284 ; SSE41-LABEL: trunc_signed_v4f32:
    285 ; SSE41:       # %bb.0:
    286 ; SSE41-NEXT:    roundps $11, %xmm0, %xmm0
    287 ; SSE41-NEXT:    retq
    288 ;
    289 ; AVX1-LABEL: trunc_signed_v4f32:
    290 ; AVX1:       # %bb.0:
    291 ; AVX1-NEXT:    vroundps $11, %xmm0, %xmm0
    292 ; AVX1-NEXT:    retq
    293   %i = fptosi <4 x float> %x to <4 x i32>
    294   %r = sitofp <4 x i32> %i to <4 x float>
    295   ret <4 x float> %r
    296 }
    297 
    298 define <2 x double> @trunc_signed_v2f64(<2 x double> %x) #0 {
    299 ; SSE2-LABEL: trunc_signed_v2f64:
    300 ; SSE2:       # %bb.0:
    301 ; SSE2-NEXT:    cvttsd2si %xmm0, %rax
    302 ; SSE2-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
    303 ; SSE2-NEXT:    cvttsd2si %xmm0, %rcx
    304 ; SSE2-NEXT:    xorps %xmm0, %xmm0
    305 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm0
    306 ; SSE2-NEXT:    cvtsi2sdq %rcx, %xmm1
    307 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
    308 ; SSE2-NEXT:    retq
    309 ;
    310 ; SSE41-LABEL: trunc_signed_v2f64:
    311 ; SSE41:       # %bb.0:
    312 ; SSE41-NEXT:    roundpd $11, %xmm0, %xmm0
    313 ; SSE41-NEXT:    retq
    314 ;
    315 ; AVX1-LABEL: trunc_signed_v2f64:
    316 ; AVX1:       # %bb.0:
    317 ; AVX1-NEXT:    vroundpd $11, %xmm0, %xmm0
    318 ; AVX1-NEXT:    retq
    319   %i = fptosi <2 x double> %x to <2 x i64>
    320   %r = sitofp <2 x i64> %i to <2 x double>
    321   ret <2 x double> %r
    322 }
    323 
    324 define <4 x double> @trunc_signed_v4f64(<4 x double> %x) #0 {
    325 ; SSE2-LABEL: trunc_signed_v4f64:
    326 ; SSE2:       # %bb.0:
    327 ; SSE2-NEXT:    cvttsd2si %xmm1, %rax
    328 ; SSE2-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
    329 ; SSE2-NEXT:    cvttsd2si %xmm1, %rcx
    330 ; SSE2-NEXT:    cvttsd2si %xmm0, %rdx
    331 ; SSE2-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
    332 ; SSE2-NEXT:    cvttsd2si %xmm0, %rsi
    333 ; SSE2-NEXT:    xorps %xmm0, %xmm0
    334 ; SSE2-NEXT:    cvtsi2sdq %rdx, %xmm0
    335 ; SSE2-NEXT:    xorps %xmm1, %xmm1
    336 ; SSE2-NEXT:    cvtsi2sdq %rsi, %xmm1
    337 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
    338 ; SSE2-NEXT:    xorps %xmm1, %xmm1
    339 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm1
    340 ; SSE2-NEXT:    cvtsi2sdq %rcx, %xmm2
    341 ; SSE2-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
    342 ; SSE2-NEXT:    retq
    343 ;
    344 ; SSE41-LABEL: trunc_signed_v4f64:
    345 ; SSE41:       # %bb.0:
    346 ; SSE41-NEXT:    roundpd $11, %xmm0, %xmm0
    347 ; SSE41-NEXT:    roundpd $11, %xmm1, %xmm1
    348 ; SSE41-NEXT:    retq
    349 ;
    350 ; AVX1-LABEL: trunc_signed_v4f64:
    351 ; AVX1:       # %bb.0:
    352 ; AVX1-NEXT:    vroundpd $11, %ymm0, %ymm0
    353 ; AVX1-NEXT:    retq
    354   %i = fptosi <4 x double> %x to <4 x i64>
    355   %r = sitofp <4 x i64> %i to <4 x double>
    356   ret <4 x double> %r
    357 }
    358 
    359 ; The fold may be guarded to allow existing code to continue 
    360 ; working based on its assumptions of float->int overflow.
    361 
    362 define float @trunc_unsigned_f32_disable_via_attr(float %x) #1 {
    363 ; SSE2-LABEL: trunc_unsigned_f32_disable_via_attr:
    364 ; SSE2:       # %bb.0:
    365 ; SSE2-NEXT:    cvttss2si %xmm0, %rax
    366 ; SSE2-NEXT:    movl %eax, %eax
    367 ; SSE2-NEXT:    xorps %xmm0, %xmm0
    368 ; SSE2-NEXT:    cvtsi2ssq %rax, %xmm0
    369 ; SSE2-NEXT:    retq
    370 ;
    371 ; SSE41-LABEL: trunc_unsigned_f32_disable_via_attr:
    372 ; SSE41:       # %bb.0:
    373 ; SSE41-NEXT:    cvttss2si %xmm0, %rax
    374 ; SSE41-NEXT:    movl %eax, %eax
    375 ; SSE41-NEXT:    xorps %xmm0, %xmm0
    376 ; SSE41-NEXT:    cvtsi2ssq %rax, %xmm0
    377 ; SSE41-NEXT:    retq
    378 ;
    379 ; AVX1-LABEL: trunc_unsigned_f32_disable_via_attr:
    380 ; AVX1:       # %bb.0:
    381 ; AVX1-NEXT:    vcvttss2si %xmm0, %rax
    382 ; AVX1-NEXT:    movl %eax, %eax
    383 ; AVX1-NEXT:    vcvtsi2ssq %rax, %xmm1, %xmm0
    384 ; AVX1-NEXT:    retq
    385   %i = fptoui float %x to i32
    386   %r = uitofp i32 %i to float
    387   ret float %r
    388 }
    389 
    390 define double @trunc_signed_f64_disable_via_attr(double %x) #1 {
    391 ; SSE2-LABEL: trunc_signed_f64_disable_via_attr:
    392 ; SSE2:       # %bb.0:
    393 ; SSE2-NEXT:    cvttsd2si %xmm0, %rax
    394 ; SSE2-NEXT:    xorps %xmm0, %xmm0
    395 ; SSE2-NEXT:    cvtsi2sdq %rax, %xmm0
    396 ; SSE2-NEXT:    retq
    397 ;
    398 ; SSE41-LABEL: trunc_signed_f64_disable_via_attr:
    399 ; SSE41:       # %bb.0:
    400 ; SSE41-NEXT:    cvttsd2si %xmm0, %rax
    401 ; SSE41-NEXT:    xorps %xmm0, %xmm0
    402 ; SSE41-NEXT:    cvtsi2sdq %rax, %xmm0
    403 ; SSE41-NEXT:    retq
    404 ;
    405 ; AVX1-LABEL: trunc_signed_f64_disable_via_attr:
    406 ; AVX1:       # %bb.0:
    407 ; AVX1-NEXT:    vcvttsd2si %xmm0, %rax
    408 ; AVX1-NEXT:    vcvtsi2sdq %rax, %xmm1, %xmm0
    409 ; AVX1-NEXT:    retq
    410   %i = fptosi double %x to i64
    411   %r = sitofp i64 %i to double
    412   ret double %r
    413 }
    414 
    415 attributes #0 = { nounwind "no-signed-zeros-fp-math"="true" }
    416 attributes #1 = { nounwind "no-signed-zeros-fp-math"="true" "strict-float-cast-overflow"="false" }
    417 
    418