Skip to content

Commit 5b150a8

Browse files
committed
Add missing logic for some 48-bit libcalls
1 parent 23b7826 commit 5b150a8

File tree

4 files changed

+27
-4
lines changed

4 files changed

+27
-4
lines changed

llvm/include/llvm/IR/RuntimeLibcalls.def

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,11 @@ HANDLE_LIBCALL(SCMP_I64, nullptr)
103103
HANDLE_LIBCALL(SCMP, nullptr)
104104
HANDLE_LIBCALL(ADD_I32, nullptr)
105105
HANDLE_LIBCALL(ADD_I32_I8, nullptr)
106+
HANDLE_LIBCALL(ADD_I48, nullptr)
106107
HANDLE_LIBCALL(ADD_I64, nullptr)
107108
HANDLE_LIBCALL(ADD_I128, nullptr)
108109
HANDLE_LIBCALL(SUB_I32, nullptr)
110+
HANDLE_LIBCALL(SUB_I48, nullptr)
109111
HANDLE_LIBCALL(SUB_I64, nullptr)
110112
HANDLE_LIBCALL(SUB_I128, nullptr)
111113
HANDLE_LIBCALL(MUL_I8, "__mulqi3")
@@ -203,8 +205,8 @@ HANDLE_LIBCALL(BITREV_I48, nullptr)
203205
HANDLE_LIBCALL(BITREV_I64, nullptr)
204206
HANDLE_LIBCALL(BITREV_I128, nullptr)
205207
HANDLE_LIBCALL(BSWAP_I32, nullptr)
206-
HANDLE_LIBCALL(BSWAP_I64, nullptr)
207208
HANDLE_LIBCALL(BSWAP_I48, nullptr)
209+
HANDLE_LIBCALL(BSWAP_I64, nullptr)
208210
HANDLE_LIBCALL(BSWAP_I128, nullptr)
209211

210212
// Floating-point

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,8 @@ static RTLIB::Libcall getRTLibDesc(unsigned Opcode, unsigned Size) {
485485
switch (Size) { \
486486
case 32: \
487487
return RTLIB::LibcallPrefix##32; \
488+
case 48: \
489+
return RTLIB::LibcallPrefix##48; \
488490
case 64: \
489491
return RTLIB::LibcallPrefix##64; \
490492
case 128: \

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
6060
auto LegalScalars24 = {s8, s16, s24};
6161
auto LegalScalars16 = {s8, s16};
6262
auto LegalScalars = Is24Bit ? LegalScalars24 : LegalScalars16;
63+
auto LegalLargeScalars24 = {s32, s48, s64};
64+
auto LegalLargeScalars16 = {s32, s64};
65+
auto LegalLargeScalars = Is24Bit ? LegalLargeScalars24 : LegalLargeScalars16;
6366
auto LegalLibcallScalars24 = {s8, s16, s24, s32, s48, s64};
6467
auto LegalLibcallScalars16 = {s8, s16, s32, s64};
6568
auto LegalLibcallScalars =
@@ -158,7 +161,6 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
158161

159162
getActionDefinitionsBuilder({G_ADD, G_SUB})
160163
.legalFor({s8})
161-
.narrowScalarIf(all(pred24Bit, typeIs(0, s48)), changeTo(0, s24))
162164
.customFor(LegalLibcallScalars)
163165
.clampScalar(0, s8, sMax);
164166

@@ -194,6 +196,7 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
194196
.minScalar(0, s16)
195197
.minScalarIf(pred24Bit, 0, s24)
196198
.minScalar(0, s32)
199+
.minScalarIf(pred24Bit, 0, s48)
197200
.minScalar(0, s64)
198201
.maxScalar(0, s64);
199202

@@ -273,7 +276,7 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
273276

274277
getActionDefinitionsBuilder(G_ICMP)
275278
.legalForCartesianProduct({s1}, LegalTypes)
276-
.customForCartesianProduct({s1}, {s32, s64})
279+
.customForCartesianProduct({s1}, LegalLargeScalars)
277280
.clampScalar(1, s8, s64);
278281

279282
getActionDefinitionsBuilder(G_FCMP)
@@ -310,7 +313,7 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
310313

311314
getActionDefinitionsBuilder(G_BSWAP)
312315
.legalFor({s16})
313-
.libcallFor({s32, s64})
316+
.libcallFor(LegalLargeScalars)
314317
.clampScalar(0, s16, s64);
315318

316319
getActionDefinitionsBuilder(G_BITREVERSE)
@@ -408,6 +411,9 @@ Z80LegalizerInfo::legalizeAddSub(LegalizerHelper &Helper, MachineInstr &MI,
408411
case 32:
409412
Libcall = RTLIB::NEG_I32;
410413
break;
414+
case 48:
415+
Libcall = RTLIB::NEG_I48;
416+
break;
411417
case 64:
412418
Libcall = RTLIB::NEG_I64;
413419
break;
@@ -422,6 +428,9 @@ Z80LegalizerInfo::legalizeAddSub(LegalizerHelper &Helper, MachineInstr &MI,
422428
}
423429
if (LegalSize)
424430
return LegalizerHelper::Legalized;
431+
if ((!F.hasOptSize() || MI.getOpcode() == G_ADD) &&
432+
Size == (Subtarget.is24Bit() ? 48 : 32))
433+
return Helper.narrowScalar(MI, 0, LLT::scalar(Size / 2));
425434
return Helper.libcall(MI, LocObserver);
426435
}
427436

@@ -456,6 +465,7 @@ Z80LegalizerInfo::legalizeBitwise(LegalizerHelper &Helper, MachineInstr &MI,
456465
case 16: Libcall = RTLIB::NOT_I16; break;
457466
case 24: Libcall = RTLIB::NOT_I24; break;
458467
case 32: Libcall = RTLIB::NOT_I32; break;
468+
case 48: Libcall = RTLIB::NOT_I48; break;
459469
case 64: Libcall = RTLIB::NOT_I64; break;
460470
}
461471
Type *Ty = IntegerType::get(Ctx, Size);
@@ -472,6 +482,7 @@ Z80LegalizerInfo::legalizeBitwise(LegalizerHelper &Helper, MachineInstr &MI,
472482
case 16: Libcall = RTLIB::AND_I16; break;
473483
case 24: Libcall = RTLIB::AND_I24; break;
474484
case 32: Libcall = RTLIB::AND_I32; break;
485+
case 48: Libcall = RTLIB::AND_I48; break;
475486
case 64: Libcall = RTLIB::AND_I64; break;
476487
}
477488
Type *Ty = IntegerType::get(Ctx, Size);
@@ -620,6 +631,11 @@ Z80LegalizerInfo::legalizeCompare(LegalizerHelper &Helper,
620631
: IsSigned ? RTLIB::SCMP_I32
621632
: RTLIB::CMP_I32;
622633
break;
634+
case 48:
635+
Libcall = ZeroRHS ? RTLIB::CMP_I48_0
636+
: IsSigned ? RTLIB::SCMP_I48
637+
: RTLIB::CMP_I48;
638+
break;
623639
case 64:
624640
Libcall = ZeroRHS ? RTLIB::CMP_I64_0
625641
: IsSigned ? RTLIB::SCMP_I64
@@ -901,6 +917,7 @@ Z80LegalizerInfo::legalizeCtlz(LegalizerHelper &Helper,
901917
case 16: Libcall = RTLIB::CTLZ_I16; break;
902918
case 24: Libcall = RTLIB::CTLZ_I24; break;
903919
case 32: Libcall = RTLIB::CTLZ_I32; break;
920+
case 48: Libcall = RTLIB::CTLZ_I48; break;
904921
case 64: Libcall = RTLIB::CTLZ_I64; break;
905922
}
906923
auto Result = createLibcall(MIRBuilder, Libcall,

llvm/lib/Target/Z80/Z80ISelLowering.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,10 @@ Z80TargetLowering::Z80TargetLowering(const Z80TargetMachine &TM,
112112
setLibcall(RTLIB::NEG_I64, "_llneg", CallingConv::Z80_LibCall );
113113
setLibcall(RTLIB::ADD_I32, "_ladd", CallingConv::Z80_LibCall );
114114
setLibcall(RTLIB::ADD_I32_I8, "_ladd_b", CallingConv::Z80_LibCall_AC);
115+
setLibcall(RTLIB::ADD_I48, "_i48add", CallingConv::Z80_LibCall );
115116
setLibcall(RTLIB::ADD_I64, "_lladd", CallingConv::Z80_LibCall );
116117
setLibcall(RTLIB::SUB_I32, "_lsub", CallingConv::Z80_LibCall );
118+
setLibcall(RTLIB::SUB_I48, "_i48sub", CallingConv::Z80_LibCall );
117119
setLibcall(RTLIB::SUB_I64, "_llsub", CallingConv::Z80_LibCall );
118120
setLibcall(RTLIB::MUL_I8, "_bmulu", CallingConv::Z80_LibCall_BC);
119121
setLibcall(RTLIB::MUL_I16, "_smulu", CallingConv::Z80_LibCall );

0 commit comments

Comments
 (0)