Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/40878 )

Change subject: base,arch-sparc: Overhaul the small fenv wrapper in base.
......................................................................

base,arch-sparc: Overhaul the small fenv wrapper in base.

This was written in C, broke the style guide, used macros, used an
obsolete m5_ prefix, and used extern "C" in an odd way.

Change-Id: If38f9a1bca6fd4a4f7f533ddb1e81d6207bc9c44
---
M src/arch/sparc/isa/formats/basic.isa
M src/base/SConscript
R src/base/fenv.cc
M src/base/fenv.hh
4 files changed, 47 insertions(+), 37 deletions(-)



diff --git a/src/arch/sparc/isa/formats/basic.isa b/src/arch/sparc/isa/formats/basic.isa
index 8a3f174..d387066 100644
--- a/src/arch/sparc/isa/formats/basic.isa
+++ b/src/arch/sparc/isa/formats/basic.isa
@@ -156,19 +156,27 @@
     exec_code = """
     Fsr |= bits(Fsr, 4, 0) << 5;
     Fsr = insertBits(Fsr, 4, 0, 0);
-    int newrnd = M5_FE_TONEAREST;
+    Gem5Rm newrnd = Gem5Rm::ToNearest;
     switch (Fsr<31:30>) {
-      case 0: newrnd = M5_FE_TONEAREST; break;
-      case 1: newrnd = M5_FE_TOWARDZERO; break;
-      case 2: newrnd = M5_FE_UPWARD; break;
-      case 3: newrnd = M5_FE_DOWNWARD; break;
+      case 0:
+        newrnd = Gem5Rm::ToNearest;
+        break;
+      case 1:
+        newrnd = Gem5Rm::TowardZero;
+        break;
+      case 2:
+        newrnd = Gem5Rm::Upward;
+        break;
+      case 3:
+        newrnd = Gem5Rm::Downward;
+        break;
     }
-    int oldrnd = m5_fegetround();
-    m5_fesetround(newrnd);
+    Gem5Rm oldrnd = gem5_fegetround();
+    gem5_fesetround(newrnd);
     __asm__ __volatile__("" ::: "memory");
     fault = doFpOp(xc, traceData);
     __asm__ __volatile__("" ::: "memory");
-    m5_fesetround(oldrnd);
+    gem5_fesetround(oldrnd);
     return fault;
 """
     fp_code = filterDoubles(code)
diff --git a/src/base/SConscript b/src/base/SConscript
index 5646a4f..d7aa2df 100644
--- a/src/base/SConscript
+++ b/src/base/SConscript
@@ -43,7 +43,7 @@
 Source('debug.cc')
 GTest('debug.test', 'debug.test.cc', 'debug.cc')
 if env['USE_FENV']:
-    Source('fenv.c')
+    Source('fenv.cc')
 else:
     warning("No IEEE FP rounding mode control.\n"
             "FP results may deviate slightly from other platforms.")
diff --git a/src/base/fenv.c b/src/base/fenv.cc
similarity index 78%
rename from src/base/fenv.c
rename to src/base/fenv.cc
index 2539079..02c1b57 100644
--- a/src/base/fenv.c
+++ b/src/base/fenv.cc
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2021 Google Inc.
  * Copyright (c) 2007 The Regents of The University of Michigan
  * All rights reserved.
  *
@@ -26,29 +27,27 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */

-#include <assert.h>
+#include "base/fenv.hh"
+
 #include <fenv.h>
-#include <stdlib.h>

-void m5_fesetround(int rm);
-int m5_fegetround();
+#include <cassert>
+#include <cstdlib>

-static const int m5_round_ops[] = {FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD};
+void gem5_fesetround(Gem5Rm rm);
+Gem5Rm gem5_fegetround();

-void m5_fesetround(int rm)
+static const int gem5_round_ops[] =
+    { FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD };
+
+void gem5_fesetround(Gem5Rm rm) { fesetround(gem5_round_ops[(int)rm]); }
+
+Gem5Rm
+gem5_fegetround()
 {
-    assert(rm >= 0 && rm < 4);
-    fesetround(m5_round_ops[rm]);
-}
-
-int m5_fegetround()
-{
-    int x;
     int rm = fegetround();
-    for (x = 0; x < 4; x++)
-        if (m5_round_ops[x] == rm)
-            return x;
+    for (int x = 0; x < 4; x++)
+        if (gem5_round_ops[x] == rm)
+            return (Gem5Rm)x;
     abort();
-    return 0;
 }
-
diff --git a/src/base/fenv.hh b/src/base/fenv.hh
index 406356b..e7b93da 100644
--- a/src/base/fenv.hh
+++ b/src/base/fenv.hh
@@ -31,21 +31,24 @@

 #include "config/use_fenv.hh"

-#define M5_FE_DOWNWARD     0
-#define M5_FE_TONEAREST    1
-#define M5_FE_TOWARDZERO   2
-#define M5_FE_UPWARD       3
+enum class Gem5Rm
+{
+    Downward = 0,
+    ToNearest = 1,
+    TowardZero = 2,
+    Upward = 3
+};

 #if USE_FENV
-extern "C" {
-void m5_fesetround(int rm);
-int m5_fegetround();
-}
+
+void gem5_fesetround(Gem5Rm rm);
+Gem5Rm gem5_fegetround();
+
 #else

 // Dummy definitions to allow code to compile w/o a real <fenv.h>.
-inline void m5_fesetround(int rm) { ; }
-inline int m5_fegetround() {return 0; }
+static inline void gem5_fesetround(Gem5Rm rm) {}
+static inline Gem5Rm gem5_fegetround() { return Gem5Rm::Downward; }

 #endif // USE_FENV


--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/40878
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: If38f9a1bca6fd4a4f7f533ddb1e81d6207bc9c44
Gerrit-Change-Number: 40878
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to