Skip to content

Commit e1486dc

Browse files
calc84maniacadriweb
authored andcommitted
Add CTTZ libcalls and use them on Z80 targets
1 parent 1dacf03 commit e1486dc

File tree

6 files changed

+84
-345
lines changed

6 files changed

+84
-345
lines changed

llvm/include/llvm/IR/RuntimeLibcalls.def

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,13 @@ HANDLE_LIBCALL(CTLZ_I32, "__clzsi2")
189189
HANDLE_LIBCALL(CTLZ_I48, nullptr)
190190
HANDLE_LIBCALL(CTLZ_I64, "__clzdi2")
191191
HANDLE_LIBCALL(CTLZ_I128, "__clzti2")
192+
HANDLE_LIBCALL(CTTZ_I8, nullptr)
193+
HANDLE_LIBCALL(CTTZ_I16, nullptr)
194+
HANDLE_LIBCALL(CTTZ_I24, nullptr)
195+
HANDLE_LIBCALL(CTTZ_I32, nullptr)
196+
HANDLE_LIBCALL(CTTZ_I48, nullptr)
197+
HANDLE_LIBCALL(CTTZ_I64, nullptr)
198+
HANDLE_LIBCALL(CTTZ_I128, nullptr)
192199
HANDLE_LIBCALL(POPCNT_I8, nullptr)
193200
HANDLE_LIBCALL(POPCNT_I16, nullptr)
194201
HANDLE_LIBCALL(POPCNT_I24, nullptr)

llvm/lib/Target/Z80/GISel/Z80LegalizerInfo.cpp

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -299,11 +299,11 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
299299
G_USUBSAT, G_SSUBSAT, G_USHLSAT, G_SSHLSAT, G_FPOWI})
300300
.lower();
301301

302-
getActionDefinitionsBuilder({G_CTTZ, G_CTTZ_ZERO_UNDEF, G_CTLZ_ZERO_UNDEF})
302+
getActionDefinitionsBuilder({G_CTTZ_ZERO_UNDEF, G_CTLZ_ZERO_UNDEF})
303303
.lowerForCartesianProduct({s8}, LegalLibcallScalars)
304304
.clampScalar(0, s8, s8);
305305

306-
getActionDefinitionsBuilder(G_CTLZ)
306+
getActionDefinitionsBuilder({G_CTLZ, G_CTTZ})
307307
.customForCartesianProduct({s8}, LegalLibcallScalars)
308308
.clampScalar(0, s8, s8);
309309

@@ -374,7 +374,8 @@ LegalizerHelper::LegalizeResult Z80LegalizerInfo::legalizeCustomMaybeLegal(
374374
case G_FCANONICALIZE:
375375
return legalizeFCanonicalize(Helper, MI);
376376
case G_CTLZ:
377-
return legalizeCtlz(Helper, MI);
377+
case G_CTTZ:
378+
return legalizeCtz(Helper, MI);
378379
case G_MEMCPY:
379380
case G_MEMCPY_INLINE:
380381
case G_MEMMOVE:
@@ -892,9 +893,9 @@ Z80LegalizerInfo::legalizeFCanonicalize(LegalizerHelper &Helper,
892893
}
893894

894895
LegalizerHelper::LegalizeResult
895-
Z80LegalizerInfo::legalizeCtlz(LegalizerHelper &Helper,
896-
MachineInstr &MI) const {
897-
assert(MI.getOpcode() == G_CTLZ);
896+
Z80LegalizerInfo::legalizeCtz(LegalizerHelper &Helper,
897+
MachineInstr &MI) const {
898+
assert(MI.getOpcode() == G_CTLZ || MI.getOpcode() == G_CTTZ);
898899
MachineIRBuilder &MIRBuilder = Helper.MIRBuilder;
899900
MachineRegisterInfo &MRI = *MIRBuilder.getMRI();
900901
auto &Ctx = MIRBuilder.getMF().getFunction().getContext();
@@ -910,14 +911,15 @@ Z80LegalizerInfo::legalizeCtlz(LegalizerHelper &Helper,
910911
return LegalizerHelper::UnableToLegalize;
911912

912913
RTLIB::Libcall Libcall;
914+
bool Leading = MI.getOpcode() == G_CTLZ;
913915
switch (SrcSize) {
914916
default: return LegalizerHelper::UnableToLegalize;
915-
case 8: Libcall = RTLIB::CTLZ_I8 ; break;
916-
case 16: Libcall = RTLIB::CTLZ_I16; break;
917-
case 24: Libcall = RTLIB::CTLZ_I24; break;
918-
case 32: Libcall = RTLIB::CTLZ_I32; break;
919-
case 48: Libcall = RTLIB::CTLZ_I48; break;
920-
case 64: Libcall = RTLIB::CTLZ_I64; break;
917+
case 8: Libcall = Leading ? RTLIB::CTLZ_I8 : RTLIB::CTTZ_I8; break;
918+
case 16: Libcall = Leading ? RTLIB::CTLZ_I16 : RTLIB::CTTZ_I16; break;
919+
case 24: Libcall = Leading ? RTLIB::CTLZ_I24 : RTLIB::CTTZ_I24; break;
920+
case 32: Libcall = Leading ? RTLIB::CTLZ_I32 : RTLIB::CTTZ_I32; break;
921+
case 48: Libcall = Leading ? RTLIB::CTLZ_I48 : RTLIB::CTTZ_I48; break;
922+
case 64: Libcall = Leading ? RTLIB::CTLZ_I64 : RTLIB::CTTZ_I64; break;
921923
}
922924
auto Result = createLibcall(MIRBuilder, Libcall,
923925
{DstReg, IntegerType::get(Ctx, DstSize), 0},

llvm/lib/Target/Z80/GISel/Z80LegalizerInfo.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ class Z80LegalizerInfo : public LegalizerInfo {
6767
legalizeMultiplyWithOverflow(LegalizerHelper &Helper, MachineInstr &MI) const;
6868
LegalizerHelper::LegalizeResult legalizeFCanonicalize(LegalizerHelper &Helper,
6969
MachineInstr &MI) const;
70-
LegalizerHelper::LegalizeResult legalizeCtlz(LegalizerHelper &Helper,
71-
MachineInstr &MI) const;
70+
LegalizerHelper::LegalizeResult legalizeCtz(LegalizerHelper &Helper,
71+
MachineInstr &MI) const;
7272
LegalizerHelper::LegalizeResult
7373
legalizeMemIntrinsic(LegalizerHelper &Helper, MachineInstr &MI,
7474
LostDebugLocObserver &LocObserver) const;

llvm/lib/Target/Z80/Z80ISelLowering.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ Z80TargetLowering::Z80TargetLowering(const Z80TargetMachine &TM,
158158
setLibcall(RTLIB::CTLZ_I32, "_lctlz", CallingConv::Z80_LibCall );
159159
setLibcall(RTLIB::CTLZ_I48, "_i48ctlz", CallingConv::Z80_LibCall );
160160
setLibcall(RTLIB::CTLZ_I64, "_llctlz", CallingConv::Z80_LibCall );
161+
setLibcall(RTLIB::CTTZ_I8, "_bcttz", CallingConv::Z80_LibCall_AC);
162+
setLibcall(RTLIB::CTTZ_I16, "_scttz", CallingConv::Z80_LibCall );
163+
setLibcall(RTLIB::CTTZ_I24, "_icttz", CallingConv::Z80_LibCall );
164+
setLibcall(RTLIB::CTTZ_I32, "_lcttz", CallingConv::Z80_LibCall );
165+
setLibcall(RTLIB::CTTZ_I48, "_i48cttz", CallingConv::Z80_LibCall );
166+
setLibcall(RTLIB::CTTZ_I64, "_llcttz", CallingConv::Z80_LibCall );
161167
setLibcall(RTLIB::POPCNT_I8, "_bpopcnt", CallingConv::Z80_LibCall_AC);
162168
setLibcall(RTLIB::POPCNT_I16, "_spopcnt", CallingConv::Z80_LibCall );
163169
setLibcall(RTLIB::POPCNT_I24, "_ipopcnt", CallingConv::Z80_LibCall );

0 commit comments

Comments
 (0)