@@ -1757,9 +1757,6 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
17571757
17581758 setOperationAction (ISD::CTPOP, MVT::i64 ,
17591759 Subtarget->usePopc () ? Legal : Expand);
1760- setOperationAction (ISD::CTTZ , MVT::i64 , Expand);
1761- setOperationAction (ISD::CTLZ, MVT::i64 ,
1762- Subtarget->isVIS3 () ? Legal : LibCall);
17631760 setOperationAction (ISD::BSWAP, MVT::i64 , Expand);
17641761 setOperationAction (ISD::ROTL , MVT::i64 , Expand);
17651762 setOperationAction (ISD::ROTR , MVT::i64 , Expand);
@@ -1819,11 +1816,7 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
18191816 setOperationAction (ISD::FCOS , MVT::f32 , Expand);
18201817 setOperationAction (ISD::FSINCOS, MVT::f32 , Expand);
18211818 setOperationAction (ISD::FREM , MVT::f32 , Expand);
1822- setOperationAction (ISD::FMA , MVT::f32 , Expand);
1823- setOperationAction (ISD::CTTZ, MVT::i32 ,
1824- Subtarget->isVIS3 () ? Promote : Expand);
1825- setOperationAction (ISD::CTLZ, MVT::i32 ,
1826- Subtarget->isVIS3 () ? Promote : LibCall);
1819+ setOperationAction (ISD::FMA, MVT::f32 , Expand);
18271820 setOperationAction (ISD::ROTL , MVT::i32 , Expand);
18281821 setOperationAction (ISD::ROTR , MVT::i32 , Expand);
18291822 setOperationAction (ISD::BSWAP, MVT::i32 , Expand);
@@ -1995,9 +1988,38 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
19951988 setOperationAction (ISD::READCYCLECOUNTER, MVT::i64 , Custom);
19961989
19971990 if (Subtarget->isVIS3 ()) {
1998- setOperationAction (ISD::CTLZ_ZERO_UNDEF, MVT::i32 , Promote);
1991+ setOperationAction (ISD::CTLZ, MVT::i32 , Legal);
1992+ setOperationAction (ISD::CTLZ, MVT::i64 , Legal);
1993+ setOperationAction (ISD::CTLZ_ZERO_UNDEF, MVT::i32 , Legal);
19991994 setOperationAction (ISD::CTLZ_ZERO_UNDEF, MVT::i64 , Legal);
2000- setOperationAction (ISD::CTTZ_ZERO_UNDEF, MVT::i32 , Promote);
1995+
1996+ setOperationAction (ISD::CTTZ, MVT::i32 ,
1997+ Subtarget->is64Bit () ? Promote : Expand);
1998+ setOperationAction (ISD::CTTZ, MVT::i64 , Expand);
1999+ setOperationAction (ISD::CTTZ_ZERO_UNDEF, MVT::i32 ,
2000+ Subtarget->is64Bit () ? Promote : Expand);
2001+ setOperationAction (ISD::CTTZ_ZERO_UNDEF, MVT::i64 , Expand);
2002+ } else if (Subtarget->usePopc ()) {
2003+ setOperationAction (ISD::CTLZ, MVT::i32 , Expand);
2004+ setOperationAction (ISD::CTLZ, MVT::i64 , Expand);
2005+ setOperationAction (ISD::CTLZ_ZERO_UNDEF, MVT::i32 , Expand);
2006+ setOperationAction (ISD::CTLZ_ZERO_UNDEF, MVT::i64 , Expand);
2007+
2008+ setOperationAction (ISD::CTTZ, MVT::i32 , Expand);
2009+ setOperationAction (ISD::CTTZ, MVT::i64 , Expand);
2010+ setOperationAction (ISD::CTTZ_ZERO_UNDEF, MVT::i32 , Expand);
2011+ setOperationAction (ISD::CTTZ_ZERO_UNDEF, MVT::i64 , Expand);
2012+ } else {
2013+ setOperationAction (ISD::CTLZ, MVT::i32 , Expand);
2014+ setOperationAction (ISD::CTLZ, MVT::i64 , Expand);
2015+ setOperationAction (ISD::CTLZ_ZERO_UNDEF, MVT::i32 ,
2016+ Subtarget->is64Bit () ? Promote : LibCall);
2017+ setOperationAction (ISD::CTLZ_ZERO_UNDEF, MVT::i64 , LibCall);
2018+
2019+ // FIXME make these LibCalls.
2020+ setOperationAction (ISD::CTTZ, MVT::i32 , Expand);
2021+ setOperationAction (ISD::CTTZ, MVT::i64 , Expand);
2022+ setOperationAction (ISD::CTTZ_ZERO_UNDEF, MVT::i32 , Expand);
20012023 setOperationAction (ISD::CTTZ_ZERO_UNDEF, MVT::i64 , Expand);
20022024 }
20032025
@@ -3591,6 +3613,17 @@ bool SparcTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT,
35913613 return false ;
35923614}
35933615
3616+ bool SparcTargetLowering::isCtlzFast () const { return Subtarget->isVIS3 (); }
3617+
3618+ bool SparcTargetLowering::isCheapToSpeculateCttz (Type *Ty) const {
3619+ // We lack native cttz, however,
3620+ // On 64-bit targets it is cheap to implement it in terms of popc.
3621+ if (Subtarget->is64Bit () && Subtarget->usePopc ())
3622+ return true ;
3623+ // Otherwise, implementing cttz in terms of ctlz is still cheap.
3624+ return isCheapToSpeculateCtlz (Ty);
3625+ }
3626+
35943627// Override to disable global variable loading on Linux.
35953628void SparcTargetLowering::insertSSPDeclarations (Module &M) const {
35963629 if (!Subtarget->isTargetLinux ())
0 commit comments