aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Nacke <kai@redstar.de>2022-07-12 22:40:46 -0400
committerKai Nacke <kai@redstar.de>2022-11-13 11:07:33 -0500
commit3ab2f6224d7e7d0d8d2e288ac1d3b207bcb1d031 (patch)
tree41d3ac77aad4ba61a4944f1e7417ceb69fc77262
parent30ace16d45cabb5ebd7e384e2c6e5dbb6465db71 (diff)
downloadllvm-3ab2f6224d7e7d0d8d2e288ac1d3b207bcb1d031.zip
llvm-3ab2f6224d7e7d0d8d2e288ac1d3b207bcb1d031.tar.gz
llvm-3ab2f6224d7e7d0d8d2e288ac1d3b207bcb1d031.tar.bz2
[m88k] Implement isel for G_FPTOSI and G_SITOFP
-rw-r--r--llvm/lib/Target/M88k/GISel/M88kInstructionSelector.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/llvm/lib/Target/M88k/GISel/M88kInstructionSelector.cpp b/llvm/lib/Target/M88k/GISel/M88kInstructionSelector.cpp
index 8dde934..f2e510b 100644
--- a/llvm/lib/Target/M88k/GISel/M88kInstructionSelector.cpp
+++ b/llvm/lib/Target/M88k/GISel/M88kInstructionSelector.cpp
@@ -66,6 +66,8 @@ private:
MachineRegisterInfo &MRI) const;
bool selectGlobalValue(MachineInstr &I, MachineBasicBlock &MBB,
MachineRegisterInfo &MRI) const;
+ bool selectFPtoSI(MachineInstr &I, MachineBasicBlock &MBB,
+ MachineRegisterInfo &MRI) const;
bool selectUbfx(MachineInstr &I, MachineBasicBlock &MBB,
MachineRegisterInfo &MRI) const;
bool selectICmp(MachineInstr &I, MachineBasicBlock &MBB,
@@ -233,6 +235,30 @@ bool M88kInstructionSelector::selectGlobalValue(
return constrainSelectedInstRegOperands(*MI, TII, TRI, RBI);
}
+bool M88kInstructionSelector::selectFPtoSI(MachineInstr &I,
+ MachineBasicBlock &MBB,
+ MachineRegisterInfo &MRI) const {
+ assert(I.getOpcode() == TargetOpcode::G_FPTOSI ||
+ I.getOpcode() == TargetOpcode::G_SITOFP && "Unexpected G code");
+
+ static unsigned Opx[2][2] = {
+ {M88k::FLTgss, M88k::FLTgds},
+ {M88k::TRNCgss, M88k::TRNCgsd},
+ };
+
+ bool ToInt = I.getOpcode() == TargetOpcode::G_FPTOSI;
+ bool IsDblType =
+ MRI.getType(I.getOperand(ToInt ? 1 : 0).getReg()).getSizeInBits() == 64;
+ const unsigned NewOpc = Opx[ToInt][IsDblType];
+
+ MachineInstr *MI;
+ MI = BuildMI(MBB, I, I.getDebugLoc(), TII.get(NewOpc),
+ I.getOperand(0).getReg())
+ .addReg(I.getOperand(1).getReg());
+ I.eraseFromParent();
+ return constrainSelectedInstRegOperands(*MI, TII, TRI, RBI);
+}
+
bool M88kInstructionSelector::selectUbfx(MachineInstr &I,
MachineBasicBlock &MBB,
MachineRegisterInfo &MRI) const {
@@ -956,6 +982,9 @@ bool M88kInstructionSelector::select(MachineInstr &I) {
return selectPtrAdd(I, MBB, MRI);
case TargetOpcode::G_FRAME_INDEX:
return selectFrameIndex(I, MBB, MRI);
+ case TargetOpcode::G_SITOFP:
+ case TargetOpcode::G_FPTOSI:
+ return selectFPtoSI(I, MBB, MRI);
case TargetOpcode::G_UBFX:
case TargetOpcode::G_SBFX:
case TargetOpcode::G_SEXT_INREG: