diff options
author | Kai Nacke <kai@redstar.de> | 2022-07-12 22:40:46 -0400 |
---|---|---|
committer | Kai Nacke <kai@redstar.de> | 2022-11-13 11:07:33 -0500 |
commit | 3ab2f6224d7e7d0d8d2e288ac1d3b207bcb1d031 (patch) | |
tree | 41d3ac77aad4ba61a4944f1e7417ceb69fc77262 | |
parent | 30ace16d45cabb5ebd7e384e2c6e5dbb6465db71 (diff) | |
download | llvm-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.cpp | 29 |
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: |