OSDN Git Service

Added option to enable generating less precise mad (multiply addition)
authorMon P Wang <wangmp@apple.com>
Fri, 20 Mar 2009 05:06:58 +0000 (05:06 +0000)
committerMon P Wang <wangmp@apple.com>
Fri, 20 Mar 2009 05:06:58 +0000 (05:06 +0000)
for those architectures that support the instruction.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67363 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetOptions.h
lib/Target/TargetMachine.cpp

index 54468f4..276ea13 100644 (file)
@@ -26,6 +26,14 @@ namespace llvm {
   /// elimination optimization, this option should disable it.
   extern bool NoFramePointerElim;
 
+  /// LessPreciseFPMAD - This flag is enabled when the
+  /// -enable-fp-mad is specified on the command line.  When this flag is off
+  /// (the default), the code generator is not allowed to generate mad
+  /// (multiply add) if the result is "less precise" than doing those operations
+  /// individually.
+  extern bool LessPreciseFPMADOption;
+  extern bool LessPreciseFPMAD();
+
   /// NoExcessFPPrecision - This flag is enabled when the
   /// -disable-excess-fp-precision flag is specified on the command line.  When
   /// this flag is off (the default), the code generator is allowed to produce
@@ -39,7 +47,7 @@ namespace llvm {
   /// this flag is off (the default), the code generator is not allowed to
   /// produce results that are "less precise" than IEEE allows.  This includes
   /// use of X86 instructions like FSIN and FCOS instead of libcalls.
-  /// UnsafeFPMath implies FiniteOnlyFPMath.
+  /// UnsafeFPMath implies FiniteOnlyFPMath and LessPreciseFPMAD.
   extern bool UnsafeFPMath;
 
   /// FiniteOnlyFPMath - This returns true when the -enable-finite-only-fp-math
index 2aed083..870fe61 100644 (file)
@@ -22,6 +22,7 @@ using namespace llvm;
 //
 
 namespace llvm {
+  bool LessPreciseFPMADOption;
   bool PrintMachineCode;
   bool NoFramePointerElim;
   bool NoExcessFPPrecision;
@@ -59,6 +60,11 @@ DisableExcessPrecision("disable-excess-fp-precision",
   cl::location(NoExcessFPPrecision),
   cl::init(false));
 static cl::opt<bool, true>
+EnableFPMAD("enable-fp-mad",
+  cl::desc("Enable less precise MAD instructions to be generated"),
+  cl::location(LessPreciseFPMADOption),
+  cl::init(false));
+static cl::opt<bool, true>
 EnableUnsafeFPMath("enable-unsafe-fp-math",
   cl::desc("Enable optimizations that may decrease FP precision"),
   cl::location(UnsafeFPMath),
@@ -198,6 +204,12 @@ void TargetMachine::setCodeModel(CodeModel::Model Model) {
 }
 
 namespace llvm {
+  /// LessPreciseFPMAD - This flag return true when -enable-fp-mad option
+  /// is specified on the command line.  When this flag is off(default), the
+  /// code generator is not allowed to generate mad (multiply add) if the
+  /// result is "less precise" than doing those operations individually.
+  bool LessPreciseFPMAD() { return UnsafeFPMath || LessPreciseFPMADOption; }
+
   /// FiniteOnlyFPMath - This returns true when the -enable-finite-only-fp-math
   /// option is specified on the command line. If this returns false (default),
   /// the code generator is not allowed to assume that FP arithmetic arguments