create base/fenv.c to standerdize fenv across platforms. It's a c file and not a...
authorAli Saidi <saidi@eecs.umich.edu>
Sat, 21 Apr 2007 21:50:47 +0000 (17:50 -0400)
committerAli Saidi <saidi@eecs.umich.edu>
Sat, 21 Apr 2007 21:50:47 +0000 (17:50 -0400)
(which defines fenv) doesn't necessarily extend to c++ and it is a problem with solaris. If really
desired this could wrap the ieeefp interface found in bsd* as well, but I see no need at the moment.

src/arch/alpha/isa/fp.isa:
src/arch/sparc/isa/formats/basic.isa:
    use m5_fesetround()/m5_fegetround() istead of fenv interface directly
src/arch/sparc/isa/includes.isa:
    use base/fenv instead of fenv directly
src/base/SConscript:
    add fenv to sconscript
src/base/fenv.hh:
src/base/random.cc:
    m5 implementation to standerdize fenv across platforms.

--HG--
extra : convert_revision : 38d2629affd964dcd1a5ab0db4ac3cb21438e72c

src/arch/alpha/isa/fp.isa
src/arch/sparc/isa/formats/basic.isa
src/arch/sparc/isa/includes.isa
src/base/SConscript
src/base/fenv.c [new file with mode: 0644]
src/base/fenv.hh
src/base/random.cc

index a350aa05fa90cc49d0cafe6257569ff153f00a02..773e7d10c4a7708e6b60098ac105f646810f7844 100644 (file)
@@ -192,10 +192,10 @@ output decoder {{
     }
 
     const int AlphaFP::alphaToC99RoundingMode[] = {
-        FE_TOWARDZERO, // Chopped
-        FE_DOWNWARD,   // Minus_Infinity
-        FE_TONEAREST,  // Normal
-        FE_UPWARD      // Dynamic in inst, Plus_Infinity in FPCR
+        M5_FE_TOWARDZERO,      // Chopped
+        M5_FE_DOWNWARD,        // Minus_Infinity
+        M5_FE_TONEAREST,       // Normal
+        M5_FE_UPWARD   // Dynamic in inst, Plus_Infinity in FPCR
     };
 
     const char *AlphaFP::roundingModeSuffix[] = { "c", "m", "", "d" };
@@ -228,10 +228,10 @@ def template FloatingPointExecute {{
         if (roundingMode == Normal) {
             %(code)s;
         } else {
-            fesetround(getC99RoundingMode(
+            m5_fesetround(getC99RoundingMode(
                            xc->readMiscRegNoEffect(AlphaISA::MISCREG_FPCR)));
             %(code)s;
-            fesetround(FE_TONEAREST);
+            m5_fesetround(M5_FE_TONEAREST);
         }
 #else
         if (roundingMode != Normal && !warnedOnRounding) {
index 7665d2d4fa7e13105c858cd12de39e0f34ed3499..5b0868132ce33c75003def3b212c4df4fb81d882 100644 (file)
@@ -109,37 +109,22 @@ def format FpBasic(code, *flags) {{
         fp_code = """
     Fsr |= bits(Fsr,4,0) << 5;
     Fsr = insertBits(Fsr,4,0,0);
-#if defined(__sun) || defined (__OpenBSD__)
-    fp_rnd newrnd = FP_RN;
+    int newrnd = M5_FE_TONEAREST;
     switch (Fsr<31:30>) {
-      case 0: newrnd = FP_RN; break;
-      case 1: newrnd = FP_RZ; break;
-      case 2: newrnd = FP_RP; break;
-      case 3: newrnd = FP_RM; break;
+      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;
     }
-    fp_rnd oldrnd = fpsetround(newrnd);
-#else
-    int newrnd = FE_TONEAREST;
-    switch (Fsr<31:30>) {
-      case 0: newrnd = FE_TONEAREST; break;
-      case 1: newrnd = FE_TOWARDZERO; break;
-      case 2: newrnd = FE_UPWARD; break;
-      case 3: newrnd = FE_DOWNWARD; break;
-    }
-    int oldrnd = fegetround();
-    fesetround(newrnd);
-#endif
+    int oldrnd = m5_fegetround();
+    m5_fesetround(newrnd);
 """
 
         fp_code += code
 
 
         fp_code += """
-#if defined(__sun) || defined (__OpenBSD__)
-    fpsetround(oldrnd);
-#else
-    fesetround(oldrnd);
-#endif
+   m5_fesetround(oldrnd);
 """
         fp_code = filterDoubles(fp_code)
         iop = InstObjParams(name, Name, 'SparcStaticInst', fp_code, flags)
index 05e9e873136c4ad21c40cbe0bdc18cef1fe1abb3..e9cd660b5453e72110c6aa6bea3742ef4dd69512 100644 (file)
@@ -53,22 +53,14 @@ output decoder {{
 #include "cpu/thread_context.hh"  // for Jump::branchTarget()
 #include "mem/packet.hh"
 
-#if defined(linux) || defined(__APPLE__)
-#include <fenv.h>
-#endif
+#include "base/fenv.hh"
 #include <algorithm>
 
 using namespace SparcISA;
 }};
 
 output exec {{
-#if defined(linux) || defined(__APPLE__)
-#include <fenv.h>
-#endif
-
-#if defined(__sun) || defined (__OpenBSD__)
-#include <ieeefp.h>
-#endif
+#include "base/fenv.hh"
 
 #if FULL_SYSTEM
 #include "sim/pseudo_inst.hh"
index 5e4aaafc27e1c6f57290fe427418026a3a321532..cc9d06a0eee6330c1c6ffed8bd728a8bc14bf214 100644 (file)
@@ -57,6 +57,7 @@ Source('circlebuf.cc')
 Source('cprintf.cc')
 Source('crc.cc')
 Source('fast_alloc.cc')
+Source('fenv.c')
 Source('fifo_buffer.cc')
 Source('hostinfo.cc')
 Source('hybrid_pred.cc')
diff --git a/src/base/fenv.c b/src/base/fenv.c
new file mode 100644 (file)
index 0000000..269913a
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2007 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Ali Saidi
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include <fenv.h>
+
+void m5_fesetround(int rm);
+int m5_fegetround();
+
+static const int m5_round_ops[] =  {FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD};
+
+void m5_fesetround(int rm)
+{
+    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;
+    abort();
+    return 0;
+}
+
index 013d2f09bfd9c8b8c75eaef826863a7bc5dd9d4e..42b383888646995e91e251553d4dfa03bf3e9d2f 100644 (file)
 
 #include "config/use_fenv.hh"
 
-#if USE_FENV
-
-#include <fenv.h>
+#define M5_FE_DOWNWARD     0
+#define M5_FE_TONEAREST    1
+#define M5_FE_TOWARDZERO   2
+#define M5_FE_UPWARD       3
 
+#if USE_FENV
+extern "C" {
+void m5_fesetround(int rm);
+int m5_fegetround();
+}
 #else
 
 // Dummy definitions to allow code to compile w/o a real <fenv.h>.
-
-#define FE_TONEAREST    0
-#define FE_DOWNWARD     0
-#define FE_UPWARD       0
-#define FE_TOWARDZERO   0
-
-inline int fesetround(int rounding_mode) { return 0; }
+inline void m5_fesetround(int rm) { ; }
+inline int m5_fegetround() {return 0; }
 
 #endif // USE_FENV
 
index ceab337d9cd0b396282099c3181d490286fba4b2..5390ceb463fe8c51b62fcf1ec0affa750dac3689 100644 (file)
@@ -29,9 +29,6 @@
  *          Ali Saidi
  */
 
-#if defined(__sun)
-#include <ieeefp.h>
-#endif
 #ifdef __SUNPRO_CC
 #include <stdlib.h>
 #include <math.h>
@@ -61,9 +58,10 @@ m5round(double r)
 {
 #if defined(__sun)
     double val;
-    fp_rnd oldrnd = fpsetround(FP_RN);
+    int oldrnd = m5_fegetround();
+    m5_fesetround(M5_FP_TONEAREST);
     val = rint(r);
-    fpsetround(oldrnd);
+    m5_fesetround(oldrnd);
     return val;
 #else
     return round(r);