add sv_float32_t override, use explicit float32_t typecast for now
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 27 Oct 2018 06:50:08 +0000 (07:50 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 27 Oct 2018 06:50:08 +0000 (07:50 +0100)
riscv/decode.h
riscv/insns/fmax_s.h
riscv/insns/fmin_s.h
riscv/insns/fmsub_s.h
riscv/insns/fnmadd_s.h
riscv/insns/fnmsub_s.h
riscv/sv_insn_redirect.cc
riscv/sv_insn_redirect.h
riscv/sv_reg.h

index 22573275fd5d59d85af4a2617d560c890e00b834..53e83787736721cdf69f3c077610be8d48d36d1d 100644 (file)
@@ -250,7 +250,7 @@ inline freg_t freg(float128_t f) { return f; }
 #define F32_SIGN ((uint32_t)1 << 31)
 #define F64_SIGN ((uint64_t)1 << 63)
 #define fsgnj32(a, b, n, x) \
-  f32((f32(a).v & ~F32_SIGN) | ((((x) ? f32(a).v : (n) ? F32_SIGN : 0) ^ f32(b).v) & F32_SIGN))
+  f32((((float32_t)f32(a)).v & ~F32_SIGN) | ((((x) ? ((float32_t)f32(a)).v : (n) ? F32_SIGN : 0) ^ ((float32_t)f32(b)).v) & F32_SIGN))
 #define fsgnj64(a, b, n, x) \
   f64((f64(a).v & ~F64_SIGN) | ((((x) ? f64(a).v : (n) ? F64_SIGN : 0) ^ f64(b).v) & F64_SIGN))
 
index 41d8f921fdec4eba9eb7f42cb4a58597ae6d6c87..2d1f7ccb66c959cdff54022e18c9b458071e8ed4 100644 (file)
@@ -1,9 +1,9 @@
 require_extension('F');
 require_fp;
 bool greater = f32_lt_quiet(f32(FRS2), f32(FRS1)) ||
-               (f32_eq(f32(FRS2), f32(FRS1)) && (f32(FRS2).v & F32_SIGN));
-if (isNaNF32UI(f32(FRS1).v) && isNaNF32UI(f32(FRS2).v))
+               (f32_eq(f32(FRS2), f32(FRS1)) && (((float32_t)f32(FRS2)).v & F32_SIGN));
+if (isNaNF32UI(((float32_t)f32(FRS1)).v) && isNaNF32UI(((float32_t)f32(FRS2)).v))
   WRITE_FRD(f32(defaultNaNF32UI));
 else
-  WRITE_FRD(greater || isNaNF32UI(f32(FRS2).v) ? FRS1 : FRS2);
+  WRITE_FRD(greater || isNaNF32UI(((float32_t)f32(FRS2)).v) ? FRS1 : FRS2);
 set_fp_exceptions;
index 19e119381df1c2ae64d2e9d26c799080b8c580e0..4bc595ba334656df19b0e592ebfd35fb1a1fb0fb 100644 (file)
@@ -1,9 +1,9 @@
 require_extension('F');
 require_fp;
 bool less = f32_lt_quiet(f32(FRS1), f32(FRS2)) ||
-            (f32_eq(f32(FRS1), f32(FRS2)) && (f32(FRS1).v & F32_SIGN));
-if (isNaNF32UI(f32(FRS1).v) && isNaNF32UI(f32(FRS2).v))
+            (f32_eq(f32(FRS1), f32(FRS2)) && (((float32_t)f32(FRS1)).v & F32_SIGN));
+if (isNaNF32UI(((float32_t)f32(FRS1)).v) && isNaNF32UI(((float32_t)f32(FRS2)).v))
   WRITE_FRD(f32(defaultNaNF32UI));
 else
-  WRITE_FRD(less || isNaNF32UI(f32(FRS2).v) ? FRS1 : FRS2);
+  WRITE_FRD(less || isNaNF32UI(((float32_t)f32(FRS2)).v) ? FRS1 : FRS2);
 set_fp_exceptions;
index d46c887e7c746137aebe24e64880fadb3fa34fdb..f48d974ca8d3c4d42c7c97838e1c64a75ec60732 100644 (file)
@@ -1,5 +1,5 @@
 require_extension('F');
 require_fp;
 softfloat_roundingMode = RM;
-WRITE_FRD(f32_mulAdd(f32(FRS1), f32(FRS2), f32(f32(FRS3).v ^ F32_SIGN)));
+WRITE_FRD(f32_mulAdd(f32(FRS1), f32(FRS2), f32(((float32_t)f32(FRS3)).v ^ F32_SIGN)));
 set_fp_exceptions;
index 1c2996e3125909af3f6408f1798c5b717df4ae66..476c9a44faba658663ba34e164d0a8d3dffb326a 100644 (file)
@@ -1,5 +1,5 @@
 require_extension('F');
 require_fp;
 softfloat_roundingMode = RM;
-WRITE_FRD(f32_mulAdd(f32(f32(FRS1).v ^ F32_SIGN), f32(FRS2), f32(f32(FRS3).v ^ F32_SIGN)));
+WRITE_FRD(f32_mulAdd(f32(((float32_t)f32(FRS1)).v ^ F32_SIGN), f32(FRS2), f32(((float32_t)f32(FRS3)).v ^ F32_SIGN)));
 set_fp_exceptions;
index 4c61fc7c81170175929bd556095ed97481e9c135..132d970ecb92cc85e6a9ce5956ddc952d49da5ad 100644 (file)
@@ -1,5 +1,5 @@
 require_extension('F');
 require_fp;
 softfloat_roundingMode = RM;
-WRITE_FRD(f32_mulAdd(f32(f32(FRS1).v ^ F32_SIGN), f32(FRS2), f32(FRS3)));
+WRITE_FRD(f32_mulAdd(f32(((float32_t)f32(FRS1)).v ^ F32_SIGN), f32(FRS2), f32(FRS3)));
 set_fp_exceptions;
index e93ace47245c4143f40c8f1bed8aedf028079612..d94671ee5cefc4d7efe03b4342813484eb3482eb 100644 (file)
@@ -5,7 +5,8 @@
 
 void (sv_proc_t::WRITE_FRD)(sv_float32_t value)
 {
-    fprintf(stderr, "WRITE_FRD sv_float32_t %f\n", (float)value.v);
+    fprintf(stderr, "WRITE_FRD sv_float32_t %f\n",
+            (float)((float32_t)value).v);
     DO_WRITE_FREG( _insn->rd(), freg(value) );
 }
 
index 56cf9a86441827474cf322fc95c6e00d6c2067a4..bbf62f3cb523c63ac184f0060f26604acbb25aa0 100644 (file)
@@ -56,7 +56,7 @@ class insn_t;
 
 //typedef reg_t sv_reg_t;
 //typedef sreg_t sv_sreg_t;
-typedef float32_t sv_float32_t;
+//typedef float32_t sv_float32_t;
 typedef float64_t sv_float64_t;
 typedef float128_t sv_float128_t;
 //typedef freg_t sv_freg_t;
index b6f003e5d67741abf7624240466caae5263121d1..70e1533dc03e19e8dd37ec5eb1eef88985e98b6c 100644 (file)
@@ -91,4 +91,20 @@ public:
   operator freg_t() const& { return reg; }
 };
 
+class sv_float32_t : public sv_regbase_t {
+public:
+    sv_float32_t(float32_t _reg) : sv_regbase_t(), reg(_reg) { } // default elwidth
+    sv_float32_t(float32_t _reg, uint8_t _elwidth) :
+                sv_regbase_t(_elwidth), reg(_reg)
+                                                {}
+    sv_float32_t(float32_t _reg, int xlen, uint8_t _elwidth) :
+                sv_regbase_t(xlen, _elwidth), reg(_reg)
+                                                {}
+
+    float32_t reg;
+public:
+
+  operator float32_t() const& { return reg; }
+};
+
 #endif