Skip to content

Commit 4038262

Browse files
committed
[𝘀𝗽𝗿] changes introduced through rebase
Created using spr 1.3.5 [skip ci]
1 parent 7275f2f commit 4038262

File tree

4 files changed

+407
-291
lines changed

4 files changed

+407
-291
lines changed

llvm/lib/Target/Sparc/SparcISelLowering.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1757,9 +1757,7 @@ 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);
1760+
setOperationAction(ISD::CTTZ, MVT::i64, Expand);
17631761
setOperationAction(ISD::BSWAP, MVT::i64, Expand);
17641762
setOperationAction(ISD::ROTL , MVT::i64, Expand);
17651763
setOperationAction(ISD::ROTR , MVT::i64, Expand);
@@ -1820,9 +1818,7 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
18201818
setOperationAction(ISD::FSINCOS, MVT::f32, Expand);
18211819
setOperationAction(ISD::FREM , MVT::f32, Expand);
18221820
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);
18261822
setOperationAction(ISD::ROTL , MVT::i32, Expand);
18271823
setOperationAction(ISD::ROTR , MVT::i32, Expand);
18281824
setOperationAction(ISD::BSWAP, MVT::i32, Expand);
@@ -1994,8 +1990,21 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
19941990
setOperationAction(ISD::READCYCLECOUNTER, MVT::i64, Custom);
19951991

19961992
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);
19981996
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);
19992008
}
20002009

20012010
setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom);
@@ -3588,6 +3597,8 @@ bool SparcTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT,
35883597
return false;
35893598
}
35903599

3600+
bool SparcTargetLowering::isCtlzFast() const { return Subtarget->isVIS3(); }
3601+
35913602
// Override to disable global variable loading on Linux.
35923603
void SparcTargetLowering::insertSSPDeclarations(Module &M) const {
35933604
if (!Subtarget->isTargetLinux())

llvm/lib/Target/Sparc/SparcISelLowering.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,12 @@ namespace llvm {
210210
bool isFPImmLegal(const APFloat &Imm, EVT VT,
211211
bool ForCodeSize) const override;
212212

213+
bool isCtlzFast() const override;
214+
215+
bool isCheapToSpeculateCtlz(Type *Ty) const override {
216+
return isCtlzFast();
217+
}
218+
213219
bool shouldInsertFencesForAtomic(const Instruction *I) const override {
214220
// FIXME: We insert fences for each atomics and generate
215221
// sub-optimal code for PSO/TSO. (Approximately nobody uses any

llvm/lib/Target/Sparc/SparcInstrVIS.td

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,13 @@ def : Pat<(i64 (adde i64:$lhs, i64:$rhs)), (ADDXCCC $lhs, $rhs)>;
309309

310310
def : Pat<(i64 (ctlz i64:$src)), (LZCNT $src)>;
311311
def : Pat<(i64 (ctlz_zero_undef i64:$src)), (LZCNT $src)>;
312+
// 32-bit LZCNT.
313+
// The zero extension will leave us with 32 extra leading zeros,
314+
// so we need to compensate for it.
315+
// FIXME remove this when the codegen supports using 64-bit values directly
316+
// in V8+ mode.
317+
def : Pat<(i32 (ctlz i32:$src)), (ADDri (LZCNT (SRLri $src, 0)), (i32 -32))>;
318+
def : Pat<(i32 (ctlz_zero_undef i32:$src)), (ADDri (LZCNT (SRLri $src, 0)), (i32 -32))>;
312319

313320
def : Pat<(i32 (bitconvert f32:$src)), (MOVSTOUW $src)>;
314321
def : Pat<(i64 (zanyext (i32 (bitconvert f32:$src)))), (MOVSTOUW $src)>;

0 commit comments

Comments
 (0)