@@ -60,6 +60,9 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
60
60
auto LegalScalars24 = {s8, s16, s24};
61
61
auto LegalScalars16 = {s8, s16};
62
62
auto LegalScalars = Is24Bit ? LegalScalars24 : LegalScalars16;
63
+ auto LegalLargeScalars24 = {s32, s48, s64};
64
+ auto LegalLargeScalars16 = {s32, s64};
65
+ auto LegalLargeScalars = Is24Bit ? LegalLargeScalars24 : LegalLargeScalars16;
63
66
auto LegalLibcallScalars24 = {s8, s16, s24, s32, s48, s64};
64
67
auto LegalLibcallScalars16 = {s8, s16, s32, s64};
65
68
auto LegalLibcallScalars =
@@ -158,7 +161,6 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
158
161
159
162
getActionDefinitionsBuilder ({G_ADD, G_SUB})
160
163
.legalFor ({s8})
161
- .narrowScalarIf (all (pred24Bit, typeIs (0 , s48)), changeTo (0 , s24))
162
164
.customFor (LegalLibcallScalars)
163
165
.clampScalar (0 , s8, sMax );
164
166
@@ -194,6 +196,7 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
194
196
.minScalar (0 , s16)
195
197
.minScalarIf (pred24Bit, 0 , s24)
196
198
.minScalar (0 , s32)
199
+ .minScalarIf (pred24Bit, 0 , s48)
197
200
.minScalar (0 , s64)
198
201
.maxScalar (0 , s64);
199
202
@@ -273,7 +276,7 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
273
276
274
277
getActionDefinitionsBuilder (G_ICMP)
275
278
.legalForCartesianProduct ({s1}, LegalTypes)
276
- .customForCartesianProduct ({s1}, {s32, s64} )
279
+ .customForCartesianProduct ({s1}, LegalLargeScalars )
277
280
.clampScalar (1 , s8, s64);
278
281
279
282
getActionDefinitionsBuilder (G_FCMP)
@@ -310,7 +313,7 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
310
313
311
314
getActionDefinitionsBuilder (G_BSWAP)
312
315
.legalFor ({s16})
313
- .libcallFor ({s32, s64} )
316
+ .libcallFor (LegalLargeScalars )
314
317
.clampScalar (0 , s16, s64);
315
318
316
319
getActionDefinitionsBuilder (G_BITREVERSE)
@@ -408,6 +411,9 @@ Z80LegalizerInfo::legalizeAddSub(LegalizerHelper &Helper, MachineInstr &MI,
408
411
case 32 :
409
412
Libcall = RTLIB::NEG_I32;
410
413
break ;
414
+ case 48 :
415
+ Libcall = RTLIB::NEG_I48;
416
+ break ;
411
417
case 64 :
412
418
Libcall = RTLIB::NEG_I64;
413
419
break ;
@@ -422,6 +428,9 @@ Z80LegalizerInfo::legalizeAddSub(LegalizerHelper &Helper, MachineInstr &MI,
422
428
}
423
429
if (LegalSize)
424
430
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 ));
425
434
return Helper.libcall (MI, LocObserver);
426
435
}
427
436
@@ -456,6 +465,7 @@ Z80LegalizerInfo::legalizeBitwise(LegalizerHelper &Helper, MachineInstr &MI,
456
465
case 16 : Libcall = RTLIB::NOT_I16; break ;
457
466
case 24 : Libcall = RTLIB::NOT_I24; break ;
458
467
case 32 : Libcall = RTLIB::NOT_I32; break ;
468
+ case 48 : Libcall = RTLIB::NOT_I48; break ;
459
469
case 64 : Libcall = RTLIB::NOT_I64; break ;
460
470
}
461
471
Type *Ty = IntegerType::get (Ctx, Size);
@@ -472,6 +482,7 @@ Z80LegalizerInfo::legalizeBitwise(LegalizerHelper &Helper, MachineInstr &MI,
472
482
case 16 : Libcall = RTLIB::AND_I16; break ;
473
483
case 24 : Libcall = RTLIB::AND_I24; break ;
474
484
case 32 : Libcall = RTLIB::AND_I32; break ;
485
+ case 48 : Libcall = RTLIB::AND_I48; break ;
475
486
case 64 : Libcall = RTLIB::AND_I64; break ;
476
487
}
477
488
Type *Ty = IntegerType::get (Ctx, Size);
@@ -620,6 +631,11 @@ Z80LegalizerInfo::legalizeCompare(LegalizerHelper &Helper,
620
631
: IsSigned ? RTLIB::SCMP_I32
621
632
: RTLIB::CMP_I32;
622
633
break ;
634
+ case 48 :
635
+ Libcall = ZeroRHS ? RTLIB::CMP_I48_0
636
+ : IsSigned ? RTLIB::SCMP_I48
637
+ : RTLIB::CMP_I48;
638
+ break ;
623
639
case 64 :
624
640
Libcall = ZeroRHS ? RTLIB::CMP_I64_0
625
641
: IsSigned ? RTLIB::SCMP_I64
@@ -901,6 +917,7 @@ Z80LegalizerInfo::legalizeCtlz(LegalizerHelper &Helper,
901
917
case 16 : Libcall = RTLIB::CTLZ_I16; break ;
902
918
case 24 : Libcall = RTLIB::CTLZ_I24; break ;
903
919
case 32 : Libcall = RTLIB::CTLZ_I32; break ;
920
+ case 48 : Libcall = RTLIB::CTLZ_I48; break ;
904
921
case 64 : Libcall = RTLIB::CTLZ_I64; break ;
905
922
}
906
923
auto Result = createLibcall (MIRBuilder, Libcall,
0 commit comments