diff options
Diffstat (limited to 'contrib/llvm/patches/patch-r262261-llvm-r200141-sparc.diff')
-rw-r--r-- | contrib/llvm/patches/patch-r262261-llvm-r200141-sparc.diff | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/contrib/llvm/patches/patch-r262261-llvm-r200141-sparc.diff b/contrib/llvm/patches/patch-r262261-llvm-r200141-sparc.diff new file mode 100644 index 0000000..d8016e8 --- /dev/null +++ b/contrib/llvm/patches/patch-r262261-llvm-r200141-sparc.diff @@ -0,0 +1,67 @@ +Pull in r200141 from upstream llvm trunk (by Jakob Stoklund Olesen): + + Clean up the Legal/Expand logic for SPARC popc. + +Introduced here: http://svn.freebsd.org/changeset/base/262261 + +Index: lib/Target/Sparc/SparcSubtarget.cpp +=================================================================== +--- lib/Target/Sparc/SparcSubtarget.cpp ++++ lib/Target/Sparc/SparcSubtarget.cpp +@@ -41,6 +41,10 @@ SparcSubtarget::SparcSubtarget(const std::string & + + // Parse features string. + ParseSubtargetFeatures(CPUName, FS); ++ ++ // Popc is a v9-only instruction. ++ if (!IsV9) ++ UsePopc = false; + } + + +Index: lib/Target/Sparc/SparcISelLowering.cpp +=================================================================== +--- lib/Target/Sparc/SparcISelLowering.cpp ++++ lib/Target/Sparc/SparcISelLowering.cpp +@@ -1461,8 +1461,8 @@ SparcTargetLowering::SparcTargetLowering(TargetMac + setOperationAction(ISD::BR_CC, MVT::i64, Custom); + setOperationAction(ISD::SELECT_CC, MVT::i64, Custom); + +- if (Subtarget->usePopc()) +- setOperationAction(ISD::CTPOP, MVT::i64, Legal); ++ setOperationAction(ISD::CTPOP, MVT::i64, ++ Subtarget->usePopc() ? Legal : Expand); + setOperationAction(ISD::CTTZ , MVT::i64, Expand); + setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i64, Expand); + setOperationAction(ISD::CTLZ , MVT::i64, Expand); +@@ -1518,7 +1518,6 @@ SparcTargetLowering::SparcTargetLowering(TargetMac + setOperationAction(ISD::FSINCOS, MVT::f32, Expand); + setOperationAction(ISD::FREM , MVT::f32, Expand); + setOperationAction(ISD::FMA , MVT::f32, Expand); +- setOperationAction(ISD::CTPOP, MVT::i32, Expand); + setOperationAction(ISD::CTTZ , MVT::i32, Expand); + setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i32, Expand); + setOperationAction(ISD::CTLZ , MVT::i32, Expand); +@@ -1568,8 +1567,8 @@ SparcTargetLowering::SparcTargetLowering(TargetMac + + setStackPointerRegisterToSaveRestore(SP::O6); + +- if (Subtarget->isV9() && Subtarget->usePopc()) +- setOperationAction(ISD::CTPOP, MVT::i32, Legal); ++ setOperationAction(ISD::CTPOP, MVT::i32, ++ Subtarget->usePopc() ? Legal : Expand); + + if (Subtarget->isV9() && Subtarget->hasHardQuad()) { + setOperationAction(ISD::LOAD, MVT::f128, Legal); +Index: test/CodeGen/SPARC/64bit.ll +=================================================================== +--- test/CodeGen/SPARC/64bit.ll ++++ test/CodeGen/SPARC/64bit.ll +@@ -1,5 +1,5 @@ +-; RUN: llc < %s -march=sparcv9 -disable-sparc-delay-filler -disable-sparc-leaf-proc | FileCheck %s +-; RUN: llc < %s -march=sparcv9 | FileCheck %s -check-prefix=OPT ++; RUN: llc < %s -march=sparcv9 -mattr=+popc -disable-sparc-delay-filler -disable-sparc-leaf-proc | FileCheck %s ++; RUN: llc < %s -march=sparcv9 -mattr=+popc | FileCheck %s -check-prefix=OPT + + ; CHECK-LABEL: ret2: + ; CHECK: or %g0, %i1, %i0 |