Add substarget feature for FP16
authorAnton Korobeynikov <asl@math.spbu.ru>
Sun, 14 Mar 2010 18:42:38 +0000 (18:42 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Sun, 14 Mar 2010 18:42:38 +0000 (18:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98503 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARM.td
lib/Target/ARM/ARMISelLowering.cpp
lib/Target/ARM/ARMSubtarget.cpp
lib/Target/ARM/ARMSubtarget.h

index 70338612d9c42b626bc538e4ae46e5486818163c..bbb1dbdc9a4a9c59037ca116f6dd03850d8f52e4 100644 (file)
@@ -40,6 +40,8 @@ def FeatureNEON : SubtargetFeature<"neon", "ARMFPUType", "NEON",
                                    "Enable NEON instructions">;
 def FeatureThumb2 : SubtargetFeature<"thumb2", "ThumbMode", "Thumb2",
                                      "Enable Thumb2 instructions">;
+def FeatureFP16   : SubtargetFeature<"fp16", "HasFP16", "true",
+                                     "Enable half-precision floating point">;
 
 //===----------------------------------------------------------------------===//
 // ARM Processors supported.
index d37a36eb7b312f78d3b7d22f86b50f4b5c28e35a..ac210685c06cb66e9b24868979baffa55159e9a9 100644 (file)
@@ -436,7 +436,7 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)
       setOperationAction(ISD::FP_TO_SINT, MVT::i32, Custom);
     }
     // Special handling for half-precision FP.
-    if (Subtarget->hasVFP3()) {
+    if (Subtarget->hasVFP3() && Subtarget->hasFP16()) {
       setOperationAction(ISD::FP16_TO_FP32, MVT::f32, Custom);
       setOperationAction(ISD::FP32_TO_FP16, MVT::i32, Custom);
     }
index 622034bd2d99145cee9279b1e78ec6e63cf115da..2dad7f110621d054f9f805f9ef9df13986e70db7 100644 (file)
@@ -41,6 +41,7 @@ ARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &FS,
   , PostRAScheduler(false)
   , IsR9Reserved(ReserveR9)
   , UseMovt(UseMOVT)
+  , HasFP16(false)
   , stackAlignment(4)
   , CPUString("generic")
   , TargetType(isELF) // Default to ELF unless otherwise specified.
index 4d36036b189db190e5ef306d3dbc80aa11b47a33..2dc81a4d6d261bf3e60e8ffd385a203f21b81c44 100644 (file)
@@ -66,6 +66,10 @@ protected:
   /// imms (including global addresses).
   bool UseMovt;
 
+  /// HasFP16 - True if subtarget supports half-precision FP (We support VFP+HF
+  /// only so far)
+  bool HasFP16;
+
   /// stackAlignment - The minimum alignment known to hold of the stack frame on
   /// entry to the function and which must be maintained by every function.
   unsigned stackAlignment;
@@ -116,6 +120,8 @@ protected:
   bool useNEONForSinglePrecisionFP() const {
     return hasNEON() && UseNEONForSinglePrecisionFP; }
 
+  bool hasFP16() const { return HasFP16; }
+
   bool isTargetDarwin() const { return TargetType == isDarwin; }
   bool isTargetELF() const { return TargetType == isELF; }