summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp28
-rw-r--r--llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp1
-rw-r--r--llvm/lib/Target/AArch64/AArch64CallLowering.cpp2
-rw-r--r--llvm/lib/Target/AArch64/AArch64CallLowering.h2
-rw-r--r--llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp3
5 files changed, 34 insertions, 2 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.
diff --git a/llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp b/llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp
index c6ee362c63f..11b04f491ee 100644
--- a/llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp
@@ -127,6 +127,7 @@ LLT MachineLegalizer::findLegalType(const InstrAspect &Aspect,
llvm_unreachable("Cannot find legal type");
case Legal:
case Lower:
+ case Libcall:
return Aspect.Type;
case NarrowScalar: {
return findLegalType(Aspect,
diff --git a/llvm/lib/Target/AArch64/AArch64CallLowering.cpp b/llvm/lib/Target/AArch64/AArch64CallLowering.cpp
index 6fa29754f70..48ff3edfc35 100644
--- a/llvm/lib/Target/AArch64/AArch64CallLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64CallLowering.cpp
@@ -131,7 +131,7 @@ bool AArch64CallLowering::lowerFormalArguments(
}
bool AArch64CallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
- MachineOperand &Callee,
+ const MachineOperand &Callee,
ArrayRef<MVT> ResTys,
ArrayRef<unsigned> ResRegs,
ArrayRef<MVT> ArgTys,
diff --git a/llvm/lib/Target/AArch64/AArch64CallLowering.h b/llvm/lib/Target/AArch64/AArch64CallLowering.h
index 1fe929d1fad..19bbb150e99 100644
--- a/llvm/lib/Target/AArch64/AArch64CallLowering.h
+++ b/llvm/lib/Target/AArch64/AArch64CallLowering.h
@@ -34,7 +34,7 @@ class AArch64CallLowering: public CallLowering {
const Function::ArgumentListType &Args,
ArrayRef<unsigned> VRegs) const override;
- bool lowerCall(MachineIRBuilder &MIRBuilder, MachineOperand &Callee,
+ bool lowerCall(MachineIRBuilder &MIRBuilder, const MachineOperand &Callee,
ArrayRef<MVT> ResTys, ArrayRef<unsigned> ResRegs,
ArrayRef<MVT> ArgTys,
ArrayRef<unsigned> ArgRegs) const override;
diff --git a/llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp b/llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp
index 0ea86733187..8a0b5b0dcac 100644
--- a/llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp
+++ b/llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp
@@ -66,6 +66,9 @@ AArch64MachineLegalizer::AArch64MachineLegalizer() {
for (auto Ty : {s32, s64})
setAction({BinOp, Ty}, Legal);
+ setAction({G_FREM, s32}, Libcall);
+ setAction({G_FREM, s64}, Libcall);
+
for (auto MemOp : {G_LOAD, G_STORE}) {
for (auto Ty : {s8, s16, s32, s64})
setAction({MemOp, Ty}, Legal);
OpenPOWER on IntegriCloud