Skip to content

Commit a5b9996

Browse files
RKSimonmemfrob
authored and
memfrob
committed
[X86][SSE] X86ISD::FSETCC nodes (cmpss/cmpsd) return a 0/-1 allbits signbits result (REAPPLIED)
Annoyingly, i686 cmpsd handling still fails to remove the unnecessary neg(and(x,1)) Reapplied rGe4aa6ad13216 with fix for intrinsic variants of the opcode which uses a vector return type
1 parent b93f4d0 commit a5b9996

File tree

2 files changed

+7
-9
lines changed

2 files changed

+7
-9
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34922,6 +34922,13 @@ unsigned X86TargetLowering::ComputeNumSignBitsForTargetNode(
3492234922
return ShiftVal.uge(VTBits) ? VTBits : ShiftVal.getZExtValue();
3492334923
}
3492434924

34925+
case X86ISD::FSETCC:
34926+
// cmpss/cmpsd return zero/all-bits result values in the bottom element.
34927+
if (VT == MVT::f32 || VT == MVT::f64 ||
34928+
((VT == MVT::v4f32 || VT == MVT::v2f64) && DemandedElts == 1))
34929+
return VTBits;
34930+
break;
34931+
3492534932
case X86ISD::PCMPGT:
3492634933
case X86ISD::PCMPEQ:
3492734934
case X86ISD::CMPP:

llvm/test/CodeGen/X86/known-signbits-vector.ll

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -666,16 +666,12 @@ define i32 @signbits_cmpss(float %0, float %1) {
666666
; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
667667
; X86-NEXT: vcmpeqss {{[0-9]+}}(%esp), %xmm0, %xmm0
668668
; X86-NEXT: vmovd %xmm0, %eax
669-
; X86-NEXT: andl $1, %eax
670-
; X86-NEXT: negl %eax
671669
; X86-NEXT: retl
672670
;
673671
; X64-LABEL: signbits_cmpss:
674672
; X64: # %bb.0:
675673
; X64-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0
676674
; X64-NEXT: vmovd %xmm0, %eax
677-
; X64-NEXT: andl $1, %eax
678-
; X64-NEXT: negl %eax
679675
; X64-NEXT: retq
680676
%3 = fcmp oeq float %0, %1
681677
%4 = sext i1 %3 to i32
@@ -687,7 +683,6 @@ define i32 @signbits_cmpss_int(<4 x float> %0, <4 x float> %1) {
687683
; CHECK: # %bb.0:
688684
; CHECK-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0
689685
; CHECK-NEXT: vextractps $0, %xmm0, %eax
690-
; CHECK-NEXT: sarl $31, %eax
691686
; CHECK-NEXT: ret{{[l|q]}}
692687
%3 = tail call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> %0, <4 x float> %1, i8 0)
693688
%4 = bitcast <4 x float> %3 to <4 x i32>
@@ -712,8 +707,6 @@ define i64 @signbits_cmpsd(double %0, double %1) {
712707
; X64: # %bb.0:
713708
; X64-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0
714709
; X64-NEXT: vmovq %xmm0, %rax
715-
; X64-NEXT: andl $1, %eax
716-
; X64-NEXT: negq %rax
717710
; X64-NEXT: retq
718711
%3 = fcmp oeq double %0, %1
719712
%4 = sext i1 %3 to i64
@@ -725,15 +718,13 @@ define i64 @signbits_cmpsd_int(<2 x double> %0, <2 x double> %1) {
725718
; X86: # %bb.0:
726719
; X86-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0
727720
; X86-NEXT: vextractps $1, %xmm0, %eax
728-
; X86-NEXT: sarl $31, %eax
729721
; X86-NEXT: movl %eax, %edx
730722
; X86-NEXT: retl
731723
;
732724
; X64-LABEL: signbits_cmpsd_int:
733725
; X64: # %bb.0:
734726
; X64-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0
735727
; X64-NEXT: vmovq %xmm0, %rax
736-
; X64-NEXT: sarq $63, %rax
737728
; X64-NEXT: retq
738729
%3 = tail call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %0, <2 x double> %1, i8 0)
739730
%4 = bitcast <2 x double> %3 to <2 x i64>

0 commit comments

Comments
 (0)