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