@@ -47,8 +47,17 @@ define zeroext i8 @oeq_f64_u32(double %x) nounwind readnone {
4747; SSE-LABEL: oeq_f64_u32:
4848; SSE: # %bb.0: # %entry
4949; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
50- ; SSE-NEXT: cvttpd2dq %xmm0, %xmm1
51- ; SSE-NEXT: cvtdq2pd %xmm1, %xmm1
50+ ; SSE-NEXT: cvttsd2si %xmm0, %eax
51+ ; SSE-NEXT: movl %eax, %ecx
52+ ; SSE-NEXT: sarl $31, %ecx
53+ ; SSE-NEXT: movapd %xmm0, %xmm1
54+ ; SSE-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
55+ ; SSE-NEXT: cvttsd2si %xmm1, %edx
56+ ; SSE-NEXT: andl %ecx, %edx
57+ ; SSE-NEXT: orl %eax, %edx
58+ ; SSE-NEXT: movd %edx, %xmm1
59+ ; SSE-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
60+ ; SSE-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
5261; SSE-NEXT: cmpeqsd %xmm0, %xmm1
5362; SSE-NEXT: movd %xmm1, %eax
5463; SSE-NEXT: andl $1, %eax
@@ -58,8 +67,16 @@ define zeroext i8 @oeq_f64_u32(double %x) nounwind readnone {
5867; AVX-LABEL: oeq_f64_u32:
5968; AVX: # %bb.0: # %entry
6069; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
61- ; AVX-NEXT: vcvttpd2dq %xmm0, %xmm1
62- ; AVX-NEXT: vcvtdq2pd %xmm1, %xmm1
70+ ; AVX-NEXT: vcvttsd2si %xmm0, %eax
71+ ; AVX-NEXT: movl %eax, %ecx
72+ ; AVX-NEXT: sarl $31, %ecx
73+ ; AVX-NEXT: vsubsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm1
74+ ; AVX-NEXT: vcvttsd2si %xmm1, %edx
75+ ; AVX-NEXT: andl %ecx, %edx
76+ ; AVX-NEXT: orl %eax, %edx
77+ ; AVX-NEXT: vmovd %edx, %xmm1
78+ ; AVX-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1
79+ ; AVX-NEXT: vsubsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1
6380; AVX-NEXT: vcmpeqsd %xmm0, %xmm1, %xmm0
6481; AVX-NEXT: vmovd %xmm0, %eax
6582; AVX-NEXT: andl $1, %eax
@@ -69,8 +86,8 @@ define zeroext i8 @oeq_f64_u32(double %x) nounwind readnone {
6986; AVX512-LABEL: oeq_f64_u32:
7087; AVX512: # %bb.0: # %entry
7188; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
72- ; AVX512-NEXT: vcvttpd2dq %xmm0, %xmm1
73- ; AVX512-NEXT: vcvtdq2pd %xmm1 , %xmm1
89+ ; AVX512-NEXT: vcvttsd2usi %xmm0, %eax
90+ ; AVX512-NEXT: vcvtusi2sd %eax, %xmm7 , %xmm1
7491; AVX512-NEXT: vcmpeqsd %xmm0, %xmm1, %k0
7592; AVX512-NEXT: kmovd %k0, %eax
7693; AVX512-NEXT: # kill: def $al killed $al killed $eax
@@ -294,8 +311,17 @@ define zeroext i8 @une_f64_u32(double %x) nounwind readnone {
294311; SSE-LABEL: une_f64_u32:
295312; SSE: # %bb.0: # %entry
296313; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
297- ; SSE-NEXT: cvttpd2dq %xmm0, %xmm1
298- ; SSE-NEXT: cvtdq2pd %xmm1, %xmm1
314+ ; SSE-NEXT: cvttsd2si %xmm0, %eax
315+ ; SSE-NEXT: movl %eax, %ecx
316+ ; SSE-NEXT: sarl $31, %ecx
317+ ; SSE-NEXT: movapd %xmm0, %xmm1
318+ ; SSE-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
319+ ; SSE-NEXT: cvttsd2si %xmm1, %edx
320+ ; SSE-NEXT: andl %ecx, %edx
321+ ; SSE-NEXT: orl %eax, %edx
322+ ; SSE-NEXT: movd %edx, %xmm1
323+ ; SSE-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
324+ ; SSE-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
299325; SSE-NEXT: cmpneqsd %xmm0, %xmm1
300326; SSE-NEXT: movd %xmm1, %eax
301327; SSE-NEXT: andl $1, %eax
@@ -305,8 +331,16 @@ define zeroext i8 @une_f64_u32(double %x) nounwind readnone {
305331; AVX-LABEL: une_f64_u32:
306332; AVX: # %bb.0: # %entry
307333; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
308- ; AVX-NEXT: vcvttpd2dq %xmm0, %xmm1
309- ; AVX-NEXT: vcvtdq2pd %xmm1, %xmm1
334+ ; AVX-NEXT: vcvttsd2si %xmm0, %eax
335+ ; AVX-NEXT: movl %eax, %ecx
336+ ; AVX-NEXT: sarl $31, %ecx
337+ ; AVX-NEXT: vsubsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm1
338+ ; AVX-NEXT: vcvttsd2si %xmm1, %edx
339+ ; AVX-NEXT: andl %ecx, %edx
340+ ; AVX-NEXT: orl %eax, %edx
341+ ; AVX-NEXT: vmovd %edx, %xmm1
342+ ; AVX-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1
343+ ; AVX-NEXT: vsubsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1
310344; AVX-NEXT: vcmpneqsd %xmm0, %xmm1, %xmm0
311345; AVX-NEXT: vmovd %xmm0, %eax
312346; AVX-NEXT: andl $1, %eax
@@ -316,8 +350,8 @@ define zeroext i8 @une_f64_u32(double %x) nounwind readnone {
316350; AVX512-LABEL: une_f64_u32:
317351; AVX512: # %bb.0: # %entry
318352; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
319- ; AVX512-NEXT: vcvttpd2dq %xmm0, %xmm1
320- ; AVX512-NEXT: vcvtdq2pd %xmm1 , %xmm1
353+ ; AVX512-NEXT: vcvttsd2usi %xmm0, %eax
354+ ; AVX512-NEXT: vcvtusi2sd %eax, %xmm7 , %xmm1
321355; AVX512-NEXT: vcmpneqsd %xmm0, %xmm1, %k0
322356; AVX512-NEXT: kmovd %k0, %eax
323357; AVX512-NEXT: # kill: def $al killed $al killed $eax
0 commit comments