diff options
author | Tim Northover <tnorthover@apple.com> | 2016-08-19 22:40:08 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2016-08-19 22:40:08 +0000 |
commit | a11be047696cf71bb76517d1c1d63fefa123b49b (patch) | |
tree | 51fc04c07192b0f3cd9dc23e1a201917b47c808b | |
parent | ea904f9424cc37c5ff7ac595e465ede2a10fdf0d (diff) | |
download | bcm5719-llvm-a11be047696cf71bb76517d1c1d63fefa123b49b.tar.gz bcm5719-llvm-a11be047696cf71bb76517d1c1d63fefa123b49b.zip |
GlobalISel: support legalization of G_FCONSTANTs
llvm-svn: 279341
5 files changed, 26 insertions, 0 deletions
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h index daaf511fd74..0c15e1204a1 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h @@ -302,6 +302,15 @@ public: MachineInstrBuilder buildIntrinsic(ArrayRef<LLT> Tys, Intrinsic::ID ID, unsigned Res, bool HasSideEffects); + /// Build and insert \p Res<def> = G_FPTRUNC \p Ty \p Op + /// + /// G_FPTRUNC converts a floating-point value into one with a smaller type. + /// + /// \pre setBasicBlock or setMI must have been called. + /// + /// \return The newly created instruction. + MachineInstrBuilder buildFPTrunc(LLT Ty, unsigned Res, unsigned Op); + /// Build and insert \p Res<def> = G_TRUNC \p Ty \p Op /// /// G_TRUNC extracts the low bits of a type. For a vector type each element is diff --git a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp index aa64be5a4c3..5ad75889723 100644 --- a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp +++ b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp @@ -211,6 +211,11 @@ MachineInstrBuilder MachineIRBuilder::buildTrunc(LLT Ty, unsigned Res, return buildInstr(TargetOpcode::G_TRUNC, Ty).addDef(Res).addUse(Op); } +MachineInstrBuilder MachineIRBuilder::buildFPTrunc(LLT Ty, unsigned Res, + unsigned Op) { + return buildInstr(TargetOpcode::G_FPTRUNC, Ty).addDef(Res).addUse(Op); +} + MachineInstrBuilder MachineIRBuilder::buildICmp(ArrayRef<LLT> Tys, CmpInst::Predicate Pred, unsigned Res, unsigned Op0, diff --git a/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp b/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp index 632d6292f9c..9dc2bf8864e 100644 --- a/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp @@ -141,6 +141,14 @@ MachineLegalizeHelper::widenScalar(MachineInstr &MI, LLT WideTy) { MI.eraseFromParent(); return Legalized; } + case TargetOpcode::G_FCONSTANT: { + MIRBuilder.setInstr(MI); + unsigned DstExt = MRI.createGenericVirtualRegister(WideSize); + MIRBuilder.buildFConstant(WideTy, DstExt, *MI.getOperand(1).getFPImm()); + MIRBuilder.buildFPTrunc(MI.getType(), MI.getOperand(0).getReg(), DstExt); + MI.eraseFromParent(); + return Legalized; + } } } diff --git a/llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp b/llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp index a06eee0973e..b91d6040bb6 100644 --- a/llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp +++ b/llvm/lib/Target/AArch64/AArch64MachineLegalizer.cpp @@ -63,6 +63,7 @@ AArch64MachineLegalizer::AArch64MachineLegalizer() { for (auto Ty : {s1, s8, s16}) setAction(TargetOpcode::G_CONSTANT, Ty, WidenScalar); + setAction(TargetOpcode::G_FCONSTANT, s16, WidenScalar); setAction(G_BR, LLT::unsized(), Legal); diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-constant.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-constant.mir index 1cf0e681070..355552eab54 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-constant.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-constant.mir @@ -53,7 +53,10 @@ body: | ; CHECK-LABEL: name: test_fconstant ; CHECK: %0(32) = G_FCONSTANT s32 float 1.000000e+00 ; CHECK: %1(64) = G_FCONSTANT s64 double 2.000000e+00 + ; CHECK: [[TMP:%[0-9]+]](32) = G_FCONSTANT s32 half 0xH0000 + ; CHECK; %2(16) = G_FPTRUNC s16 [[TMP]] %0(32) = G_FCONSTANT s32 float 1.0 %1(64) = G_FCONSTANT s64 double 2.0 + %2(16) = G_FCONSTANT s16 half 0.0 ... |