68 lines
2.8 KiB
Diff
68 lines
2.8 KiB
Diff
Pull in r200141 from upstream llvm trunk (by Jakob Stoklund Olesen):
|
|
|
|
Clean up the Legal/Expand logic for SPARC popc.
|
|
|
|
Introduced here: http://svnweb.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
|