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