diff options
| author | Tim Northover <tnorthover@apple.com> | 2017-02-08 23:23:39 +0000 |
|---|---|---|
| committer | Tim Northover <tnorthover@apple.com> | 2017-02-08 23:23:39 +0000 |
| commit | e0418418116ec089d11091bff0820694c20a7954 (patch) | |
| tree | d04649e45b1bcb0e015eaaf2188dc958045780c3 /llvm/lib | |
| parent | b38b4e2464c9c88b332ca11914be73c50736ee86 (diff) | |
| download | bcm5719-llvm-e0418418116ec089d11091bff0820694c20a7954.tar.gz bcm5719-llvm-e0418418116ec089d11091bff0820694c20a7954.zip | |
GlobalISel: legalize G_FPOW to a libcall on AArch64.
There's no instruction to implement it.
llvm-svn: 294531
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 15 | ||||
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp | 6 |
2 files changed, 16 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index f41af0547a3..1f78243e115 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -92,6 +92,16 @@ void LegalizerHelper::extractParts(unsigned Reg, LLT Ty, int NumParts, MIRBuilder.buildExtract(VRegs, Indexes, Reg); } +static RTLIB::Libcall getRTLibDesc(unsigned Opcode, unsigned Size) { + switch (Opcode) { + case TargetOpcode::G_FREM: + return Size == 64 ? RTLIB::REM_F64 : RTLIB::REM_F32; + case TargetOpcode::G_FPOW: + return Size == 64 ? RTLIB::POW_F64 : RTLIB::POW_F32; + } + llvm_unreachable("Unknown libcall function"); +} + LegalizerHelper::LegalizeResult LegalizerHelper::libcall(MachineInstr &MI) { LLT Ty = MRI.getType(MI.getOperand(0).getReg()); @@ -101,14 +111,13 @@ LegalizerHelper::libcall(MachineInstr &MI) { switch (MI.getOpcode()) { default: return UnableToLegalize; + case TargetOpcode::G_FPOW: case TargetOpcode::G_FREM: { auto &Ctx = MIRBuilder.getMF().getFunction()->getContext(); Type *Ty = Size == 64 ? Type::getDoubleTy(Ctx) : Type::getFloatTy(Ctx); 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); - + const char *Name = TLI.getLibcallName(getRTLibDesc(MI.getOpcode(), Size)); CLI.lowerCall( MIRBuilder, MachineOperand::CreateES(Name), {MI.getOperand(0).getReg(), Ty}, diff --git a/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp index 32f9c5f80d0..c978be9ab10 100644 --- a/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp @@ -78,8 +78,10 @@ AArch64LegalizerInfo::AArch64LegalizerInfo() { for (auto Ty : {s32, s64}) setAction({BinOp, Ty}, Legal); - setAction({G_FREM, s32}, Libcall); - setAction({G_FREM, s64}, Libcall); + for (unsigned BinOp : {G_FREM, G_FPOW}) { + setAction({BinOp, s32}, Libcall); + setAction({BinOp, s64}, Libcall); + } // FIXME: what should we do about G_INSERTs with more than one source value? // For now the default of not specifying means we'll fall back. |

