@@ -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,
0 commit comments