From bff8d8792a587458a34d32efc894c501a27f1756 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Sat, 11 Feb 2017 13:51:14 +0000 Subject: [PATCH] [X86][3DNow!] Enable PFSUB<->PFSUBR commutation git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294847 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86Instr3DNow.td | 4 ++-- lib/Target/X86/X86InstrInfo.cpp | 12 ++++++++++++ test/CodeGen/X86/commute-3dnow.ll | 22 ++++++++-------------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/lib/Target/X86/X86Instr3DNow.td b/lib/Target/X86/X86Instr3DNow.td index 49ac822b0da..08b501ff20b 100644 --- a/lib/Target/X86/X86Instr3DNow.td +++ b/lib/Target/X86/X86Instr3DNow.td @@ -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>; diff --git a/lib/Target/X86/X86InstrInfo.cpp b/lib/Target/X86/X86InstrInfo.cpp index eb606ba3214..2ad522318d5 100644 --- a/lib/Target/X86/X86InstrInfo.cpp +++ b/lib/Target/X86/X86InstrInfo.cpp @@ -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: diff --git a/test/CodeGen/X86/commute-3dnow.ll b/test/CodeGen/X86/commute-3dnow.ll index aefb57bcb16..647cbee9656 100644 --- a/test/CodeGen/X86/commute-3dnow.ll +++ b/test/CodeGen/X86/commute-3dnow.ll @@ -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 -- 2.11.0