================
@@ -2235,6 +2236,115 @@ void Clang::AddX86TargetArgs(const ArgList &Args,
   }
 }
 
+static StringRef getOptionName(StringRef Option, const char Delimiter = '=') {
+  size_t Index = Option.find(Delimiter);
+  if (Index != StringRef::npos)
+    Option = Option.substr(0, Index);
+  return Option;
+}
+
+static void checkAndRemoveLLVMArg(ArgStringList &CmdArgs, StringRef Opt) {
+  Opt = getOptionName(Opt);
+  if (CmdArgs.size() < 2)
+    return;
+
+  for (auto It = std::next(CmdArgs.begin()); It != CmdArgs.end(); ++It) {
+    StringRef Option = *It;
+    if (!Option.starts_with(Opt))
+      continue;
+    Option = getOptionName(Option);
+    if (Option != Opt)
+      continue;
+    if (StringRef(*(It - 1)) != "-mllvm")
+      continue;
+
+    It = CmdArgs.erase(It);
+    CmdArgs.erase(It - 1);
+    return;
+  }
+}
+
+static void pushBackLLVMArg(ArgStringList &CmdArgs, const char *A) {
+  checkAndRemoveLLVMArg(CmdArgs, A);
+  CmdArgs.push_back("-mllvm");
+  CmdArgs.push_back(A);
+}
+
+static void addQFloatLossyFastMathArgs(ArgStringList &CmdArgs) {
+  for (auto It = CmdArgs.begin(), Ie = CmdArgs.end(); It != Ie;) {
+    StringRef Option = *It;
+    if (Option == "-fmath-errno" || Option == "-ffp-contract=on") {
+      It = CmdArgs.erase(It);
+      Ie = CmdArgs.end();
+    } else {
+      ++It;
+    }
+  }
+
+  CmdArgs.push_back("-menable-no-infs");
+  CmdArgs.push_back("-menable-no-nans");
+  CmdArgs.push_back("-fapprox-func");
+  CmdArgs.push_back("-funsafe-math-optimizations");
+  CmdArgs.push_back("-fno-signed-zeros");
+  CmdArgs.push_back("-mreassociate");
+  CmdArgs.push_back("-freciprocal-math");
+  CmdArgs.push_back("-ffp-contract=fast");
+  CmdArgs.push_back("-ffast-math");
+  CmdArgs.push_back("-ffinite-math-only");
+  CmdArgs.push_back("-D__FAST_MATH__");
+  pushBackLLVMArg(CmdArgs, "-fast-math=true");
+}
+
+static void addQFloatBackendArg(const Driver &D, const ArgList &Args,
+                                ArgStringList &CmdArgs) {
+  auto HvxVerOpt = toolchains::HexagonToolChain::GetHVXVersion(Args);
+  bool HasHVX = HvxVerOpt.has_value();
+  std::string HvxVer = HasHVX ? *HvxVerOpt : std::string();
+  if (Args.hasArg(options::OPT_mhexagon_hvx, options::OPT_mhexagon_hvx_EQ,
+                  options::OPT_mhexagon_hvx_ieee_fp) &&
+      HasHVX) {
+    unsigned HvxVerNum = 0;
+    if (StringRef(HvxVer).drop_front(1).getAsInteger(10, HvxVerNum))
+      HvxVerNum = 0;
+
+    if (Arg *A = Args.getLastArg(options::OPT_mhexagon_hvx_qfloat,
+                                 options::OPT_mhexagon_hvx_qfloat_EQ,
+                                 options::OPT_mhexagon_hvx_ieee_fp)) {
+      if (HvxVerNum >= 79) {
+        if (A->getOption().matches(options::OPT_mhexagon_hvx_qfloat_EQ)) {
+          const char *Mode =
+              llvm::StringSwitch<const char 
*>(StringRef(A->getValue()).lower())
+                  .Case("strict-ieee", "-hexagon-qfloat-mode=strict-ieee")
+                  .Case("ieee", "-hexagon-qfloat-mode=ieee")
+                  .Case("lossy", "-hexagon-qfloat-mode=lossy")
+                  .Case("legacy", "-hexagon-qfloat-mode=legacy")
+                  .Default("-hexagon-qfloat-mode=lossy");
+          pushBackLLVMArg(CmdArgs, Mode);
+          if (strcmp(Mode, "-hexagon-qfloat-mode=lossy") == 0)
+            addQFloatLossyFastMathArgs(CmdArgs);
+        } else if (A->getOption().matches(options::OPT_mhexagon_hvx_qfloat)) {
+          pushBackLLVMArg(CmdArgs, "-hexagon-qfloat-mode=lossy");
+          addQFloatLossyFastMathArgs(CmdArgs);
+        } else {
+          pushBackLLVMArg(CmdArgs, "-hexagon-qfloat-mode=ieee");
+        }
+      } else {
+        if (Arg *QFloatArg =
+                Args.getLastArg(options::OPT_mhexagon_hvx_qfloat,
+                                options::OPT_mhexagon_hvx_qfloat_EQ,
+                                options::OPT_mno_hexagon_hvx_qfloat);
+            QFloatArg && QFloatArg->getOption().matches(
+                             options::OPT_mhexagon_hvx_qfloat_EQ)) {
+          D.Diag(diag::warn_drv_unsupported_option_part_for_target)
+              << QFloatArg->getValue() << QFloatArg->getAsString(Args)
+              << (std::string("HVX ") + HvxVer +
+                  "; falling back to legacy qfloat mode");
----------------
androm3da wrote:

sure

https://github.com/llvm/llvm-project/pull/198902
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to