@@ -1757,9 +1757,7 @@ 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);
1760
+ setOperationAction (ISD::CTTZ, MVT::i64 , Expand);
1763
1761
setOperationAction (ISD::BSWAP, MVT::i64 , Expand);
1764
1762
setOperationAction (ISD::ROTL , MVT::i64 , Expand);
1765
1763
setOperationAction (ISD::ROTR , MVT::i64 , Expand);
@@ -1820,9 +1818,7 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
1820
1818
setOperationAction (ISD::FSINCOS, MVT::f32 , Expand);
1821
1819
setOperationAction (ISD::FREM , MVT::f32 , Expand);
1822
1820
setOperationAction (ISD::FMA , MVT::f32 , Expand);
1823
- setOperationAction (ISD::CTTZ , MVT::i32 , Expand);
1824
- setOperationAction (ISD::CTLZ, MVT::i32 ,
1825
- Subtarget->isVIS3 () ? Promote : LibCall);
1821
+ setOperationAction (ISD::CTTZ, MVT::i32 , Expand);
1826
1822
setOperationAction (ISD::ROTL , MVT::i32 , Expand);
1827
1823
setOperationAction (ISD::ROTR , MVT::i32 , Expand);
1828
1824
setOperationAction (ISD::BSWAP, MVT::i32 , Expand);
@@ -1994,8 +1990,21 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
1994
1990
setOperationAction (ISD::READCYCLECOUNTER, MVT::i64 , Custom);
1995
1991
1996
1992
if (Subtarget->isVIS3 ()) {
1997
- setOperationAction (ISD::CTLZ_ZERO_UNDEF, MVT::i32 , Promote);
1993
+ setOperationAction (ISD::CTLZ, MVT::i32 , Legal);
1994
+ setOperationAction (ISD::CTLZ, MVT::i64 , Legal);
1995
+ setOperationAction (ISD::CTLZ_ZERO_UNDEF, MVT::i32 , Legal);
1998
1996
setOperationAction (ISD::CTLZ_ZERO_UNDEF, MVT::i64 , Legal);
1997
+ } else if (Subtarget->usePopc ()) {
1998
+ setOperationAction (ISD::CTLZ, MVT::i32 , Expand);
1999
+ setOperationAction (ISD::CTLZ, MVT::i64 , Expand);
2000
+ setOperationAction (ISD::CTLZ_ZERO_UNDEF, MVT::i32 , Expand);
2001
+ setOperationAction (ISD::CTLZ_ZERO_UNDEF, MVT::i64 , Expand);
2002
+ } else {
2003
+ setOperationAction (ISD::CTLZ, MVT::i32 , Expand);
2004
+ setOperationAction (ISD::CTLZ, MVT::i64 , Expand);
2005
+ setOperationAction (ISD::CTLZ_ZERO_UNDEF, MVT::i32 ,
2006
+ Subtarget->is64Bit () ? Promote : LibCall);
2007
+ setOperationAction (ISD::CTLZ_ZERO_UNDEF, MVT::i64 , LibCall);
1999
2008
}
2000
2009
2001
2010
setOperationAction (ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom);
@@ -3588,6 +3597,8 @@ bool SparcTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT,
3588
3597
return false ;
3589
3598
}
3590
3599
3600
+ bool SparcTargetLowering::isCtlzFast () const { return Subtarget->isVIS3 (); }
3601
+
3591
3602
// Override to disable global variable loading on Linux.
3592
3603
void SparcTargetLowering::insertSSPDeclarations (Module &M) const {
3593
3604
if (!Subtarget->isTargetLinux ())
0 commit comments