[llvm] r283060 - [PowerPC] Refactor soft-float support, and enable PPC64 soft float
Eric Christopher via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 2 13:48:27 PDT 2016
Could you add some tests (both front and backend) that test
with +/-hard-float (in particular the latter of course) in the target
feature attributes? That you didn't have to change any testcases here is a
bit disheartening :)
-eric
On Sat, Oct 1, 2016 at 7:19 PM Hal Finkel via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: hfinkel
> Date: Sat Oct 1 21:10:20 2016
> New Revision: 283060
>
> URL: http://llvm.org/viewvc/llvm-project?rev=283060&view=rev
> Log:
> [PowerPC] Refactor soft-float support, and enable PPC64 soft float
>
> This change enables soft-float for PowerPC64, and also makes soft-float
> disable
> all vector instruction sets for both 32-bit and 64-bit modes. This latter
> part
> is necessary because the PPC backend canonicalizes many Altivec vector
> types to
> floating-point types, and so soft-float breaks scalarization support for
> many
> operations. Both for embedded targets and for operating-system kernels
> desiring
> soft-float support, it seems reasonable that disabling hardware
> floating-point
> also disables vector instructions (embedded targets without hardware
> floating
> point support are unlikely to have Altivec, etc. and operating system
> kernels
> desiring not to use floating-point registers to lower syscall cost are
> unlikely
> to want to use vector registers either). If someone needs this to work,
> we'll
> need to change the fact that we promote many Altivec operations to act on
> v4f32. To make it possible to disable Altivec when soft-float is enabled,
> hardware floating-point support needs to be expressed as a positive
> feature,
> like the others, and not a negative feature, because target features cannot
> have dependencies on the disabling of some other feature. So +soft-float
> has
> now become -hard-float.
>
> Fixes PR26970.
>
> Modified:
> llvm/trunk/lib/Target/PowerPC/PPC.td
> llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp
> llvm/trunk/lib/Target/PowerPC/PPCSubtarget.cpp
> llvm/trunk/lib/Target/PowerPC/PPCSubtarget.h
> llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.cpp
> llvm/trunk/test/CodeGen/PowerPC/ppcsoftops.ll
>
> Modified: llvm/trunk/lib/Target/PowerPC/PPC.td
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPC.td?rev=283060&r1=283059&r2=283060&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPC.td (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPC.td Sat Oct 1 21:10:20 2016
> @@ -53,40 +53,52 @@ def DirectivePwr9: SubtargetFeature<"",
>
> def Feature64Bit : SubtargetFeature<"64bit","Has64BitSupport", "true",
> "Enable 64-bit instructions">;
> -def FeatureSoftFloat : SubtargetFeature<"soft-float", "UseSoftFloat",
> "true",
> - "Use software emulation for floating
> point">;
> +def FeatureHardFloat : SubtargetFeature<"hard-float", "HasHardFloat",
> "true",
> + "Enable floating-point instructions">;
> def Feature64BitRegs : SubtargetFeature<"64bitregs","Use64BitRegs",
> "true",
> "Enable 64-bit registers usage for ppc32
> [beta]">;
> def FeatureCRBits : SubtargetFeature<"crbits", "UseCRBits", "true",
> "Use condition-register bits individually">;
> def FeatureAltivec : SubtargetFeature<"altivec","HasAltivec", "true",
> - "Enable Altivec instructions">;
> + "Enable Altivec instructions",
> + [FeatureHardFloat]>;
> def FeatureSPE : SubtargetFeature<"spe","HasSPE", "true",
> - "Enable SPE instructions">;
> + "Enable SPE instructions",
> + [FeatureHardFloat]>;
> def FeatureMFOCRF : SubtargetFeature<"mfocrf","HasMFOCRF", "true",
> "Enable the MFOCRF instruction">;
> def FeatureFSqrt : SubtargetFeature<"fsqrt","HasFSQRT", "true",
> - "Enable the fsqrt instruction">;
> + "Enable the fsqrt instruction",
> + [FeatureHardFloat]>;
> def FeatureFCPSGN : SubtargetFeature<"fcpsgn", "HasFCPSGN", "true",
> - "Enable the fcpsgn instruction">;
> + "Enable the fcpsgn instruction",
> + [FeatureHardFloat]>;
> def FeatureFRE : SubtargetFeature<"fre", "HasFRE", "true",
> - "Enable the fre instruction">;
> + "Enable the fre instruction",
> + [FeatureHardFloat]>;
> def FeatureFRES : SubtargetFeature<"fres", "HasFRES", "true",
> - "Enable the fres instruction">;
> + "Enable the fres instruction",
> + [FeatureHardFloat]>;
> def FeatureFRSQRTE : SubtargetFeature<"frsqrte", "HasFRSQRTE", "true",
> - "Enable the frsqrte instruction">;
> + "Enable the frsqrte instruction",
> + [FeatureHardFloat]>;
> def FeatureFRSQRTES : SubtargetFeature<"frsqrtes", "HasFRSQRTES", "true",
> - "Enable the frsqrtes
> instruction">;
> + "Enable the frsqrtes instruction",
> + [FeatureHardFloat]>;
> def FeatureRecipPrec : SubtargetFeature<"recipprec", "HasRecipPrec",
> "true",
> "Assume higher precision reciprocal
> estimates">;
> def FeatureSTFIWX : SubtargetFeature<"stfiwx","HasSTFIWX", "true",
> - "Enable the stfiwx instruction">;
> + "Enable the stfiwx instruction",
> + [FeatureHardFloat]>;
> def FeatureLFIWAX : SubtargetFeature<"lfiwax","HasLFIWAX", "true",
> - "Enable the lfiwax instruction">;
> + "Enable the lfiwax instruction",
> + [FeatureHardFloat]>;
> def FeatureFPRND : SubtargetFeature<"fprnd", "HasFPRND", "true",
> - "Enable the fri[mnpz]
> instructions">;
> + "Enable the fri[mnpz]
> instructions",
> + [FeatureHardFloat]>;
> def FeatureFPCVT : SubtargetFeature<"fpcvt", "HasFPCVT", "true",
> - "Enable fc[ft]* (unsigned and single-precision) and lfiwzx
> instructions">;
> + "Enable fc[ft]* (unsigned and single-precision) and lfiwzx
> instructions",
> + [FeatureHardFloat]>;
> def FeatureISEL : SubtargetFeature<"isel","HasISEL", "true",
> "Enable the isel instruction">;
> def FeatureBPERMD : SubtargetFeature<"bpermd", "HasBPERMD", "true",
> @@ -112,7 +124,8 @@ def FeaturePPC4xx : SubtargetFeature<
> def FeaturePPC6xx : SubtargetFeature<"ppc6xx", "IsPPC6xx", "true",
> "Enable PPC 6xx instructions">;
> def FeatureQPX : SubtargetFeature<"qpx","HasQPX", "true",
> - "Enable QPX instructions">;
> + "Enable QPX instructions",
> + [FeatureHardFloat]>;
> def FeatureVSX : SubtargetFeature<"vsx","HasVSX", "true",
> "Enable VSX instructions",
> [FeatureAltivec]>;
> @@ -282,7 +295,8 @@ include "PPCInstrInfo.td"
> // PowerPC processors supported.
> //
>
> -def : Processor<"generic", G3Itineraries, [Directive32, FeatureMFTB]>;
> +def : Processor<"generic", G3Itineraries, [Directive32, FeatureHardFloat,
> + FeatureMFTB]>;
> def : ProcessorModel<"440", PPC440Model, [Directive440, FeatureISEL,
> FeatureFRES, FeatureFRSQRTE,
> FeatureICBT, FeatureBookE,
> @@ -291,8 +305,8 @@ def : ProcessorModel<"450", PPC440Model,
> FeatureFRES, FeatureFRSQRTE,
> FeatureICBT, FeatureBookE,
> FeatureMSYNC, FeatureMFTB]>;
> -def : Processor<"601", G3Itineraries, [Directive601]>;
> -def : Processor<"602", G3Itineraries, [Directive602,
> +def : Processor<"601", G3Itineraries, [Directive601, FeatureHardFloat]>;
> +def : Processor<"602", G3Itineraries, [Directive602, FeatureHardFloat,
> FeatureMFTB]>;
> def : Processor<"603", G3Itineraries, [Directive603,
> FeatureFRES, FeatureFRSQRTE,
> @@ -406,7 +420,10 @@ def : ProcessorModel<"pwr7", P7Model, Pr
> def : ProcessorModel<"pwr8", P8Model,
> ProcessorFeatures.Power8FeatureList>;
> // FIXME: Same as P8 until the POWER9 scheduling info is available
> def : ProcessorModel<"pwr9", P8Model,
> ProcessorFeatures.Power9FeatureList>;
> -def : Processor<"ppc", G3Itineraries, [Directive32, FeatureMFTB]>;
> +def : Processor<"ppc", G3Itineraries, [Directive32, FeatureHardFloat,
> + FeatureMFTB]>;
> +def : Processor<"ppc32", G3Itineraries, [Directive32, FeatureHardFloat,
> + FeatureMFTB]>;
> def : ProcessorModel<"ppc64", G5Model,
> [Directive64, FeatureAltivec,
> FeatureMFOCRF, FeatureFSqrt, FeatureFRES,
>
> Modified: llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp?rev=283060&r1=283059&r2=283060&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp Sat Oct 1 21:10:20
> 2016
> @@ -3175,7 +3175,7 @@ SDValue PPCTargetLowering::LowerFormalAr
> };
>
> const unsigned Num_GPR_Regs = array_lengthof(GPR);
> - const unsigned Num_FPR_Regs = 13;
> + const unsigned Num_FPR_Regs = useSoftFloat() ? 0 : 13;
> const unsigned Num_VR_Regs = array_lengthof(VR);
> const unsigned Num_QFPR_Regs = Num_FPR_Regs;
>
> @@ -3588,7 +3588,7 @@ SDValue PPCTargetLowering::LowerFormalAr
> };
>
> const unsigned Num_GPR_Regs = array_lengthof(GPR_32);
> - const unsigned Num_FPR_Regs = 13;
> + const unsigned Num_FPR_Regs = useSoftFloat() ? 0 : 13;
> const unsigned Num_VR_Regs = array_lengthof( VR);
>
> unsigned GPR_idx = 0, FPR_idx = 0, VR_idx = 0;
> @@ -10564,7 +10564,7 @@ SDValue PPCTargetLowering::combineFPToIn
> N->getOpcode() == ISD::UINT_TO_FP) &&
> "Need an int -> FP conversion node here");
>
> - if (!Subtarget.has64BitSupport())
> + if (useSoftFloat() || !Subtarget.has64BitSupport())
> return SDValue();
>
> SelectionDAG &DAG = DCI.DAG;
>
> Modified: llvm/trunk/lib/Target/PowerPC/PPCSubtarget.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCSubtarget.cpp?rev=283060&r1=283059&r2=283060&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCSubtarget.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCSubtarget.cpp Sat Oct 1 21:10:20 2016
> @@ -62,7 +62,7 @@ void PPCSubtarget::initializeEnvironment
> Has64BitSupport = false;
> Use64BitRegs = false;
> UseCRBits = false;
> - UseSoftFloat = false;
> + HasHardFloat = false;
> HasAltivec = false;
> HasSPE = false;
> HasQPX = false;
>
> Modified: llvm/trunk/lib/Target/PowerPC/PPCSubtarget.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCSubtarget.h?rev=283060&r1=283059&r2=283060&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCSubtarget.h (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCSubtarget.h Sat Oct 1 21:10:20 2016
> @@ -91,7 +91,7 @@ protected:
> bool Has64BitSupport;
> bool Use64BitRegs;
> bool UseCRBits;
> - bool UseSoftFloat;
> + bool HasHardFloat;
> bool IsPPC64;
> bool HasAltivec;
> bool HasSPE;
> @@ -205,7 +205,7 @@ public:
> /// instructions, regardless of whether we are in 32-bit or 64-bit mode.
> bool has64BitSupport() const { return Has64BitSupport; }
> // useSoftFloat - Return true if soft-float option is turned on.
> - bool useSoftFloat() const { return UseSoftFloat; }
> + bool useSoftFloat() const { return !HasHardFloat; }
>
> /// use64BitRegs - Return true if in 64-bit mode or if we should use
> 64-bit
> /// registers in 32-bit mode when possible. This can only true if
>
> Modified: llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.cpp?rev=283060&r1=283059&r2=283060&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.cpp Sat Oct 1 21:10:20
> 2016
> @@ -268,7 +268,7 @@ PPCTargetMachine::getSubtargetImpl(const
> // If the soft float attribute is set on the function turn on the soft
> float
> // subtarget feature.
> if (SoftFloat)
> - FS += FS.empty() ? "+soft-float" : ",+soft-float";
> + FS += FS.empty() ? "-hard-float" : ",-hard-float";
>
> auto &I = SubtargetMap[CPU + FS];
> if (!I) {
>
> Modified: llvm/trunk/test/CodeGen/PowerPC/ppcsoftops.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/ppcsoftops.ll?rev=283060&r1=283059&r2=283060&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/PowerPC/ppcsoftops.ll (original)
> +++ llvm/trunk/test/CodeGen/PowerPC/ppcsoftops.ll Sat Oct 1 21:10:20 2016
> @@ -1,4 +1,6 @@
> ; RUN: llc -verify-machineinstrs -mtriple=powerpc-unknown-linux-gnu -O0
> < %s | FileCheck %s
> +; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu
> -O0 < %s | FileCheck %s
> +; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu
> -O0 < %s | FileCheck %s
>
> ; Testing operations in soft-float mode
> define double @foo() #0 {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161002/d94b27d9/attachment.html>
More information about the llvm-commits
mailing list