Skip to content

Commit 021b6cb

Browse files
committed
[Z80] Legalize G_FFREXP/G_FLDEXP for {s32,s24}
1 parent 05fc960 commit 021b6cb

2 files changed

Lines changed: 86 additions & 0 deletions

File tree

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

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,10 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
328328

329329
getActionDefinitionsBuilder(G_FCOPYSIGN).libcallFor({{s32, s32}, {s64, s64}});
330330

331+
getActionDefinitionsBuilder(G_FFREXP).customFor({{s32, s24}});
332+
333+
getActionDefinitionsBuilder(G_FLDEXP).customFor({{s32, s24}});
334+
331335
getActionDefinitionsBuilder({G_LOAD, G_STORE})
332336
.legalForCartesianProduct(LegalTypes, {p[0]})
333337
.legalForCartesianProduct(LegalTypesOther, {p[1]})
@@ -459,6 +463,10 @@ LegalizerHelper::LegalizeResult Z80LegalizerInfo::legalizeCustomMaybeLegal(
459463
return legalizeFixedDivide(Helper, MI);
460464
case G_FCANONICALIZE:
461465
return legalizeFCanonicalize(Helper, MI);
466+
case G_FFREXP:
467+
return legalizeFFrexp(Helper, MI);
468+
case G_FLDEXP:
469+
return legalizeFLdexp(Helper, MI);
462470
case G_CTLZ:
463471
case G_CTTZ:
464472
return legalizeCtz(Helper, MI);
@@ -1420,6 +1428,80 @@ Z80LegalizerInfo::legalizeFCanonicalize(LegalizerHelper &Helper,
14201428
return LegalizerHelper::Legalized;
14211429
}
14221430

1431+
LegalizerHelper::LegalizeResult
1432+
Z80LegalizerInfo::legalizeFFrexp(LegalizerHelper &Helper,
1433+
MachineInstr &MI) const {
1434+
assert(MI.getOpcode() == G_FFREXP && "Unexpected opcode");
1435+
MachineIRBuilder &MIRBuilder = Helper.MIRBuilder;
1436+
MachineRegisterInfo &MRI = *MIRBuilder.getMRI();
1437+
1438+
Register DstMantReg = MI.getOperand(0).getReg();
1439+
Register DstExpReg = MI.getOperand(1).getReg();
1440+
Register SrcReg = MI.getOperand(2).getReg();
1441+
1442+
LLT MantTy = MRI.getType(DstMantReg);
1443+
LLT ExpTy = MRI.getType(DstExpReg);
1444+
if (MantTy != LLT::scalar(32) || ExpTy != LLT::scalar(24))
1445+
return LegalizerHelper::UnableToLegalize;
1446+
1447+
LLVMContext &Ctx = MIRBuilder.getMF().getFunction().getContext();
1448+
Type *MantIRTy = Type::getFloatTy(Ctx);
1449+
Type *PtrIRTy = PointerType::get(Ctx, 0);
1450+
1451+
MachineFunction &MF = MIRBuilder.getMF();
1452+
MachineFrameInfo &MFI = MF.getFrameInfo();
1453+
int ExpFI = MFI.CreateStackObject(/*Size=*/3, Align(1),
1454+
/*IsSpillSlot=*/false);
1455+
Register ExpAddr =
1456+
MIRBuilder
1457+
.buildFrameIndex(LLT::pointer(0, TM.getPointerSizeInBits(0)), ExpFI)
1458+
.getReg(0);
1459+
1460+
auto CallResult = createLibcall(
1461+
MIRBuilder, RTLIB::FREXP_F32, {DstMantReg, MantIRTy, 0},
1462+
{{SrcReg, MantIRTy, 0}, {ExpAddr, PtrIRTy, 1}});
1463+
if (CallResult != LegalizerHelper::Legalized)
1464+
return CallResult;
1465+
1466+
MachinePointerInfo MPO = MachinePointerInfo::getFixedStack(MF, ExpFI);
1467+
auto *MMO = MF.getMachineMemOperand(MPO, MachineMemOperand::MOLoad, 3,
1468+
Align(1));
1469+
MIRBuilder.buildLoad(DstExpReg, ExpAddr, *MMO);
1470+
1471+
MI.eraseFromParent();
1472+
return LegalizerHelper::Legalized;
1473+
}
1474+
1475+
LegalizerHelper::LegalizeResult
1476+
Z80LegalizerInfo::legalizeFLdexp(LegalizerHelper &Helper,
1477+
MachineInstr &MI) const {
1478+
assert(MI.getOpcode() == G_FLDEXP && "Unexpected opcode");
1479+
MachineIRBuilder &MIRBuilder = Helper.MIRBuilder;
1480+
MachineRegisterInfo &MRI = *MIRBuilder.getMRI();
1481+
1482+
Register DstReg = MI.getOperand(0).getReg();
1483+
Register SrcReg = MI.getOperand(1).getReg();
1484+
Register ExpReg = MI.getOperand(2).getReg();
1485+
1486+
LLT DstTy = MRI.getType(DstReg);
1487+
LLT ExpTy = MRI.getType(ExpReg);
1488+
if (DstTy != LLT::scalar(32) || ExpTy != LLT::scalar(24))
1489+
return LegalizerHelper::UnableToLegalize;
1490+
1491+
LLVMContext &Ctx = MIRBuilder.getMF().getFunction().getContext();
1492+
Type *FloatTy = Type::getFloatTy(Ctx);
1493+
Type *ExpIRTy = IntegerType::get(Ctx, 24);
1494+
1495+
auto CallResult = createLibcall(
1496+
MIRBuilder, RTLIB::LDEXP_F32, {DstReg, FloatTy, 0},
1497+
{{SrcReg, FloatTy, 0}, {ExpReg, ExpIRTy, 1}});
1498+
if (CallResult != LegalizerHelper::Legalized)
1499+
return CallResult;
1500+
1501+
MI.eraseFromParent();
1502+
return LegalizerHelper::Legalized;
1503+
}
1504+
14231505
LegalizerHelper::LegalizeResult
14241506
Z80LegalizerInfo::legalizeCtz(LegalizerHelper &Helper, MachineInstr &MI) const {
14251507
assert((MI.getOpcode() == G_CTLZ || MI.getOpcode() == G_CTTZ) &&

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ class Z80LegalizerInfo : public LegalizerInfo {
7272
legalizeMultiplyWithOverflow(LegalizerHelper &Helper, MachineInstr &MI) const;
7373
LegalizerHelper::LegalizeResult legalizeFCanonicalize(LegalizerHelper &Helper,
7474
MachineInstr &MI) const;
75+
LegalizerHelper::LegalizeResult legalizeFFrexp(LegalizerHelper &Helper,
76+
MachineInstr &MI) const;
77+
LegalizerHelper::LegalizeResult legalizeFLdexp(LegalizerHelper &Helper,
78+
MachineInstr &MI) const;
7579
LegalizerHelper::LegalizeResult legalizeCtz(LegalizerHelper &Helper,
7680
MachineInstr &MI) const;
7781
LegalizerHelper::LegalizeResult

0 commit comments

Comments
 (0)