@@ -1757,9 +1757,6 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
1757
1757
1758
1758
setOperationAction (ISD::CTPOP, MVT::i64 ,
1759
1759
Subtarget->usePopc () ? Legal : Expand);
1760
- setOperationAction (ISD::CTTZ , MVT::i64 , Expand);
1761
- setOperationAction (ISD::CTLZ, MVT::i64 ,
1762
- Subtarget->isVIS3 () ? Legal : LibCall);
1763
1760
setOperationAction (ISD::BSWAP, MVT::i64 , Expand);
1764
1761
setOperationAction (ISD::ROTL , MVT::i64 , Expand);
1765
1762
setOperationAction (ISD::ROTR , MVT::i64 , Expand);
@@ -1819,11 +1816,7 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
1819
1816
setOperationAction (ISD::FCOS , MVT::f32 , Expand);
1820
1817
setOperationAction (ISD::FSINCOS, MVT::f32 , Expand);
1821
1818
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);
1827
1820
setOperationAction (ISD::ROTL , MVT::i32 , Expand);
1828
1821
setOperationAction (ISD::ROTR , MVT::i32 , Expand);
1829
1822
setOperationAction (ISD::BSWAP, MVT::i32 , Expand);
@@ -1995,9 +1988,38 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
1995
1988
setOperationAction (ISD::READCYCLECOUNTER, MVT::i64 , Custom);
1996
1989
1997
1990
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);
1999
1994
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);
2001
2023
setOperationAction (ISD::CTTZ_ZERO_UNDEF, MVT::i64 , Expand);
2002
2024
}
2003
2025
@@ -3591,6 +3613,17 @@ bool SparcTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT,
3591
3613
return false ;
3592
3614
}
3593
3615
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
+
3594
3627
// Override to disable global variable loading on Linux.
3595
3628
void SparcTargetLowering::insertSSPDeclarations (Module &M) const {
3596
3629
if (!Subtarget->isTargetLinux ())
0 commit comments