diff options
author | Tim Northover <tnorthover@apple.com> | 2016-08-29 19:07:16 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2016-08-29 19:07:16 +0000 |
commit | edb3c8ccb8785c90cee8b71c4ed8eb13b72f9ae4 (patch) | |
tree | d7fcadd47e44fb508c8b6b993e1874ef8237988e /llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp | |
parent | fe5f89ba144f03fa10e93307988d787309d3a744 (diff) | |
download | bcm5719-llvm-edb3c8ccb8785c90cee8b71c4ed8eb13b72f9ae4.tar.gz bcm5719-llvm-edb3c8ccb8785c90cee8b71c4ed8eb13b72f9ae4.zip |
GlobalISel: legalize frem to a libcall on AArch64.
llvm-svn: 279988
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp b/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp index b6ec2b89ad6..afc8289640b 100644 --- a/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp @@ -14,10 +14,12 @@ //===----------------------------------------------------------------------===// #include "llvm/CodeGen/GlobalISel/MachineLegalizeHelper.h" +#include "llvm/CodeGen/GlobalISel/CallLowering.h" #include "llvm/CodeGen/GlobalISel/MachineLegalizer.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/Target/TargetLowering.h" #include "llvm/Target/TargetSubtargetInfo.h" #include <sstream> @@ -38,6 +40,8 @@ MachineLegalizeHelper::legalizeInstrStep(MachineInstr &MI, switch (std::get<0>(Action)) { case MachineLegalizer::Legal: return AlreadyLegal; + case MachineLegalizer::Libcall: + return libcall(MI); case MachineLegalizer::NarrowScalar: return narrowScalar(MI, std::get<1>(Action), std::get<2>(Action)); case MachineLegalizer::WidenScalar: @@ -90,6 +94,30 @@ void MachineLegalizeHelper::extractParts(unsigned Reg, LLT Ty, int NumParts, } MachineLegalizeHelper::LegalizeResult +MachineLegalizeHelper::libcall(MachineInstr &MI) { + unsigned Size = MI.getType().getSizeInBits(); + MIRBuilder.setInstr(MI); + + switch (MI.getOpcode()) { + default: + return UnableToLegalize; + case TargetOpcode::G_FREM: { + MVT Ty = MVT::getFloatingPointVT(MI.getType().getSizeInBits()); + auto &CLI = *MIRBuilder.getMF().getSubtarget().getCallLowering(); + auto &TLI = *MIRBuilder.getMF().getSubtarget().getTargetLowering(); + const char *Name = + TLI.getLibcallName(Size == 64 ? RTLIB::REM_F64 : RTLIB::REM_F32); + + CLI.lowerCall(MIRBuilder, MachineOperand::CreateES(Name), Ty, + MI.getOperand(0).getReg(), {Ty, Ty}, + {MI.getOperand(1).getReg(), MI.getOperand(2).getReg()}); + MI.eraseFromParent(); + return Legalized; + } + } +} + +MachineLegalizeHelper::LegalizeResult MachineLegalizeHelper::narrowScalar(MachineInstr &MI, unsigned TypeIdx, LLT NarrowTy) { // FIXME: Don't know how to handle secondary types yet. |