OSDN Git Service

[X86][3DNow!] Enable PFSUB<->PFSUBR commutation
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Sat, 11 Feb 2017 13:51:14 +0000 (13:51 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Sat, 11 Feb 2017 13:51:14 +0000 (13:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294847 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86Instr3DNow.td
lib/Target/X86/X86InstrInfo.cpp
test/CodeGen/X86/commute-3dnow.ll

index 49ac822..08b501f 100644 (file)
@@ -80,8 +80,8 @@ defm PFRCPIT1 : I3DNow_binop_rm_int<0xA6, "pfrcpit1">;
 defm PFRCPIT2 : I3DNow_binop_rm_int<0xB6, "pfrcpit2">;
 defm PFRSQIT1 : I3DNow_binop_rm_int<0xA7, "pfrsqit1">;
 defm PFRSQRT  : I3DNow_conv_rm_int<0x97, "pfrsqrt">;
-defm PFSUB    : I3DNow_binop_rm_int<0x9A, "pfsub">;
-defm PFSUBR   : I3DNow_binop_rm_int<0xAA, "pfsubr">;
+defm PFSUB    : I3DNow_binop_rm_int<0x9A, "pfsub", 1>;
+defm PFSUBR   : I3DNow_binop_rm_int<0xAA, "pfsubr", 1>;
 defm PI2FD    : I3DNow_conv_rm_int<0x0D, "pi2fd">;
 defm PMULHRW  : I3DNow_binop_rm_int<0xB7, "pmulhrw", 1>;
 
index eb606ba..2ad5223 100644 (file)
@@ -4813,6 +4813,18 @@ MachineInstr *X86InstrInfo::commuteInstructionImpl(MachineInstr &MI, bool NewMI,
     return TargetInstrInfo::commuteInstructionImpl(WorkingMI, /*NewMI=*/false,
                                                    OpIdx1, OpIdx2);
   }
+  case X86::PFSUBrr:
+  case X86::PFSUBRrr: {
+    // PFSUB  x, y: x = x - y
+    // PFSUBR x, y: x = y - x
+    unsigned Opc =
+        (X86::PFSUBRrr == MI.getOpcode() ? X86::PFSUBrr : X86::PFSUBRrr);
+    auto &WorkingMI = cloneIfNew(MI);
+    WorkingMI.setDesc(get(Opc));
+    return TargetInstrInfo::commuteInstructionImpl(WorkingMI, /*NewMI=*/false,
+                                                   OpIdx1, OpIdx2);
+    break;
+  }
   case X86::BLENDPDrri:
   case X86::BLENDPSrri:
   case X86::PBLENDWrri:
index aefb57b..647cbee 100644 (file)
@@ -31,7 +31,6 @@ define void @commute_m_pfadd(x86_mmx *%a0, x86_mmx *%a1, x86_mmx *%a2) nounwind
 }
 declare x86_mmx @llvm.x86.3dnow.pfadd(x86_mmx, x86_mmx)
 
-; FIXME - missed PFSUB commutation.
 define void @commute_m_pfsub(x86_mmx *%a0, x86_mmx *%a1, x86_mmx *%a2) nounwind {
 ; X32-LABEL: commute_m_pfsub:
 ; X32:       # BB#0:
@@ -39,19 +38,17 @@ define void @commute_m_pfsub(x86_mmx *%a0, x86_mmx *%a1, x86_mmx *%a2) nounwind
 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
 ; X32-NEXT:    movq (%edx), %mm0
-; X32-NEXT:    movq (%ecx), %mm1
 ; X32-NEXT:    pfsub (%eax), %mm0
-; X32-NEXT:    pfsub %mm0, %mm1
-; X32-NEXT:    movq %mm1, (%ecx)
+; X32-NEXT:    pfsubr (%ecx), %mm0
+; X32-NEXT:    movq %mm0, (%ecx)
 ; X32-NEXT:    retl
 ;
 ; X64-LABEL: commute_m_pfsub:
 ; X64:       # BB#0:
 ; X64-NEXT:    movq (%rdi), %mm0
-; X64-NEXT:    movq (%rdx), %mm1
 ; X64-NEXT:    pfsub (%rsi), %mm0
-; X64-NEXT:    pfsub %mm0, %mm1
-; X64-NEXT:    movq %mm1, (%rdx)
+; X64-NEXT:    pfsubr (%rdx), %mm0
+; X64-NEXT:    movq %mm0, (%rdx)
 ; X64-NEXT:    retq
   %1 = load x86_mmx, x86_mmx* %a0
   %2 = load x86_mmx, x86_mmx* %a1
@@ -63,7 +60,6 @@ define void @commute_m_pfsub(x86_mmx *%a0, x86_mmx *%a1, x86_mmx *%a2) nounwind
 }
 declare x86_mmx @llvm.x86.3dnow.pfsub(x86_mmx, x86_mmx)
 
-; FIXME - missed PFSUBR commutation.
 define void @commute_m_pfsubr(x86_mmx *%a0, x86_mmx *%a1, x86_mmx *%a2) nounwind {
 ; X32-LABEL: commute_m_pfsubr:
 ; X32:       # BB#0:
@@ -71,19 +67,17 @@ define void @commute_m_pfsubr(x86_mmx *%a0, x86_mmx *%a1, x86_mmx *%a2) nounwind
 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
 ; X32-NEXT:    movq (%edx), %mm0
-; X32-NEXT:    movq (%ecx), %mm1
 ; X32-NEXT:    pfsubr (%eax), %mm0
-; X32-NEXT:    pfsubr %mm0, %mm1
-; X32-NEXT:    movq %mm1, (%ecx)
+; X32-NEXT:    pfsub (%ecx), %mm0
+; X32-NEXT:    movq %mm0, (%ecx)
 ; X32-NEXT:    retl
 ;
 ; X64-LABEL: commute_m_pfsubr:
 ; X64:       # BB#0:
 ; X64-NEXT:    movq (%rdi), %mm0
-; X64-NEXT:    movq (%rdx), %mm1
 ; X64-NEXT:    pfsubr (%rsi), %mm0
-; X64-NEXT:    pfsubr %mm0, %mm1
-; X64-NEXT:    movq %mm1, (%rdx)
+; X64-NEXT:    pfsub (%rdx), %mm0
+; X64-NEXT:    movq %mm0, (%rdx)
 ; X64-NEXT:    retq
   %1 = load x86_mmx, x86_mmx* %a0
   %2 = load x86_mmx, x86_mmx* %a1