summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2016-08-29 19:07:16 +0000
committerTim Northover <tnorthover@apple.com>2016-08-29 19:07:16 +0000
commitedb3c8ccb8785c90cee8b71c4ed8eb13b72f9ae4 (patch)
treed7fcadd47e44fb508c8b6b993e1874ef8237988e /llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
parentfe5f89ba144f03fa10e93307988d787309d3a744 (diff)
downloadbcm5719-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.cpp28
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.
OpenPOWER on IntegriCloud