// For sub-128-bit vector, cast to (legal) integer and compare with zero.
if (VT.getSizeInBits() < 128) {
EVT IntVT = EVT::getIntegerVT(*DAG.getContext(), VT.getSizeInBits());
- if (!DAG.getTargetLoweringInfo().isTypeLegal(IntVT))
- return SDValue();
+ if (!DAG.getTargetLoweringInfo().isTypeLegal(IntVT)) {
+ if (IntVT != MVT::i64)
+ return SDValue();
+ auto SplitLHS = DAG.SplitScalar(DAG.getBitcast(IntVT, MaskBits(LHS)), DL,
+ MVT::i32, MVT::i32);
+ auto SplitRHS = DAG.SplitScalar(DAG.getBitcast(IntVT, MaskBits(RHS)), DL,
+ MVT::i32, MVT::i32);
+ SDValue Lo =
+ DAG.getNode(ISD::XOR, DL, MVT::i32, SplitLHS.first, SplitRHS.first);
+ SDValue Hi =
+ DAG.getNode(ISD::XOR, DL, MVT::i32, SplitLHS.second, SplitRHS.second);
+ return DAG.getNode(X86ISD::CMP, DL, MVT::i32,
+ DAG.getNode(ISD::OR, DL, MVT::i32, Lo, Hi),
+ DAG.getConstant(0, DL, MVT::i32));
+ }
return DAG.getNode(X86ISD::CMP, DL, MVT::i32,
DAG.getBitcast(IntVT, MaskBits(LHS)),
DAG.getBitcast(IntVT, MaskBits(RHS)));
; X86: # %bb.0: # %bb
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero
-; X86-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
-; X86-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
-; X86-NEXT: vpmovmskb %xmm0, %eax
-; X86-NEXT: xorb $-1, %al
+; X86-NEXT: movl (%ecx), %edx
+; X86-NEXT: movl 4(%ecx), %ecx
+; X86-NEXT: xorl 4(%eax), %ecx
+; X86-NEXT: xorl (%eax), %edx
+; X86-NEXT: orl %ecx, %edx
; X86-NEXT: sete %al
; X86-NEXT: retl
bb: