[x86] replace integer 'xor' ops with packed SSE FP 'xor' ops when operating on FP...
authorSanjay Patel <spatel@rotateright.com>
Wed, 23 Sep 2015 18:33:42 +0000 (18:33 +0000)
committerSanjay Patel <spatel@rotateright.com>
Wed, 23 Sep 2015 18:33:42 +0000 (18:33 +0000)
Turn this:

movd %xmm0, %eax
movd %xmm1, %ecx
xorl %eax, %ecx
movd %ecx, %xmm0

into this:

xorps %xmm1, %xmm0

This is related to, but does not solve:
https://llvm.org/bugs/show_bug.cgi?id=22428

This is an extension of:
http://reviews.llvm.org/rL248395

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@248415 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/fp-logic.ll

index a8a4672606100295efaacb93377530f8898ffcb8..f27340488733ac1c0a97cf08ef43dd846baa779b 100644 (file)
@@ -24787,6 +24787,9 @@ static SDValue PerformXorCombine(SDNode *N, SelectionDAG &DAG,
     if (SDValue RV = performIntegerAbsCombine(N, DAG))
       return RV;
 
+  if (SDValue FPLogic = convertIntLogicToFPLogic(N, DAG, Subtarget))
+    return FPLogic;
+
   return SDValue();
 }
 
index 95f15789789fbb3662475d9350c88c8888efbbc0..e45e48dfa985a683f25cf2fb1fb313055cd57684 100644 (file)
@@ -183,10 +183,7 @@ define float @or(float %x, float %y) {
 define float @xor(float %x, float %y) {
 ; CHECK-LABEL: xor:
 ; CHECK:       # BB#0:
-; CHECK-NEXT:    movd %xmm0, %eax
-; CHECK-NEXT:    movd %xmm1, %ecx
-; CHECK-NEXT:    xorl %eax, %ecx
-; CHECK-NEXT:    movd %ecx, %xmm0
+; CHECK-NEXT:    xorps %xmm1, %xmm0
 ; CHECK-NEXT:    retq
 
   %bc1 = bitcast float %x to i32