replace sv_float64_t typedef with class derived from sv_regbase_t
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 27 Oct 2018 07:40:15 +0000 (08:40 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 27 Oct 2018 07:40:15 +0000 (08:40 +0100)
riscv/decode.h
riscv/insns/fmax_d.h
riscv/insns/fmin_d.h
riscv/insns/fmsub_d.h
riscv/insns/fnmadd_d.h
riscv/insns/fnmsub_d.h
riscv/sv_insn_redirect.cc
riscv/sv_insn_redirect.h
riscv/sv_reg.h

index 53e83787736721cdf69f3c077610be8d48d36d1d..e94f73e3287f6ba7d6552573b25372bc38f6c9c8 100644 (file)
@@ -252,7 +252,7 @@ inline freg_t freg(float128_t f) { return f; }
 #define fsgnj32(a, b, n, x) \
   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))
+  f64((((float64_t)f64(a)).v & ~F64_SIGN) | ((((x) ? ((float64_t)f64(a)).v : (n) ? F64_SIGN : 0) ^ ((float64_t)f64(b)).v) & F64_SIGN))
 
 #define isNaNF128(x) isNaNF128UI(x.v[1], x.v[0])
 inline float128_t defaultNaNF128()
index 11491f54bce66c61e6d8af1ee9634603238937d0..6884ce1c28288dd5d493f1c9f3ca971309174939 100644 (file)
@@ -1,9 +1,9 @@
 require_extension('D');
 require_fp;
 bool greater = f64_lt_quiet(f64(FRS2), f64(FRS1)) ||
-               (f64_eq(f64(FRS2), f64(FRS1)) && (f64(FRS2).v & F64_SIGN));
-if (isNaNF64UI(f64(FRS1).v) && isNaNF64UI(f64(FRS2).v))
+               (f64_eq(f64(FRS2), f64(FRS1)) && (((float64_t)f64(FRS2)).v & F64_SIGN));
+if (isNaNF64UI(((float64_t)f64(FRS1)).v) && isNaNF64UI(((float64_t)f64(FRS2)).v))
   WRITE_FRD(f64(defaultNaNF64UI));
 else
-  WRITE_FRD(greater || isNaNF64UI(f64(FRS2).v) ? FRS1 : FRS2);
+  WRITE_FRD(greater || isNaNF64UI(((float64_t)f64(FRS2)).v) ? FRS1 : FRS2);
 set_fp_exceptions;
index 5cf349d47ee4dda3e850942059b302d108071099..e179d3389738a5e12b584b421dc19bf50e39fc0a 100644 (file)
@@ -1,9 +1,9 @@
 require_extension('D');
 require_fp;
 bool less = f64_lt_quiet(f64(FRS1), f64(FRS2)) ||
-            (f64_eq(f64(FRS1), f64(FRS2)) && (f64(FRS1).v & F64_SIGN));
-if (isNaNF64UI(f64(FRS1).v) && isNaNF64UI(f64(FRS2).v))
+            (f64_eq(f64(FRS1), f64(FRS2)) && (((float64_t)f64(FRS1)).v & F64_SIGN));
+if (isNaNF64UI(((float64_t)f64(FRS1)).v) && isNaNF64UI(((float64_t)f64(FRS2)).v))
   WRITE_FRD(f64(defaultNaNF64UI));
 else
-  WRITE_FRD(less || isNaNF64UI(f64(FRS2).v) ? FRS1 : FRS2);
+  WRITE_FRD(less || isNaNF64UI(((float64_t)f64(FRS2)).v) ? FRS1 : FRS2);
 set_fp_exceptions;
index 5b5bc0f75e4c9c26a42b35409df98d6de063c9c3..5606213646571cb0f73148f686cdc0467b7d25d3 100644 (file)
@@ -1,5 +1,5 @@
 require_extension('D');
 require_fp;
 softfloat_roundingMode = RM;
-WRITE_FRD(f64_mulAdd(f64(FRS1), f64(FRS2), f64(f64(FRS3).v ^ F64_SIGN)));
+WRITE_FRD(f64_mulAdd(f64(FRS1), f64(FRS2), f64(((float64_t)f64(FRS3)).v ^ F64_SIGN)));
 set_fp_exceptions;
index e8dd743233cdf7ff7ef6dcc07231c003b8b98eb2..ed31a6bf221068d34b191323e2b5050ff0e7256d 100644 (file)
@@ -1,5 +1,6 @@
 require_extension('D');
 require_fp;
 softfloat_roundingMode = RM;
-WRITE_FRD(f64_mulAdd(f64(f64(FRS1).v ^ F64_SIGN), f64(FRS2), f64(f64(FRS3).v ^ F64_SIGN)));
+WRITE_FRD(f64_mulAdd(f64(((float64_t)f64(FRS1)).v ^ F64_SIGN), f64(FRS2), f64(((float64_t)f64(FRS3)).v ^ F64_SIGN)));
+
 set_fp_exceptions;
index c29a0b93ca059d7dc74cfc7e399185941bf59ecc..c2062e5b2459fd680e9e52bf85a1eaa50037452e 100644 (file)
@@ -1,5 +1,5 @@
 require_extension('D');
 require_fp;
 softfloat_roundingMode = RM;
-WRITE_FRD(f64_mulAdd(f64(f64(FRS1).v ^ F64_SIGN), f64(FRS2), f64(FRS3)));
+WRITE_FRD(f64_mulAdd(f64(((float64_t)f64(FRS1)).v ^ F64_SIGN), f64(FRS2), f64(FRS3)));
 set_fp_exceptions;
index 893a4888c8b002e88b8e2fc19730b615216734b0..2be2e17f5416c5c1c62f7c8a940abb5df451bd2f 100644 (file)
@@ -12,7 +12,8 @@ void (sv_proc_t::WRITE_FRD)(sv_float32_t value)
 
 void (sv_proc_t::WRITE_FRD)(sv_float64_t value)
 {
-    fprintf(stderr, "WRITE_FRD sv_float64_t %g\n", (double)value.v);
+    fprintf(stderr, "WRITE_FRD sv_float64_t %g\n",
+            (double)((float64_t)value).v);
     DO_WRITE_FREG( _insn->rd(), freg(value) );
 }
 
index 159a10b0a894e0765351a41cfc0746403f4992fd..a5a1c9e5f0ed7996c85a1ab06cc509c73b5b2a44 100644 (file)
@@ -57,7 +57,7 @@ class insn_t;
 //typedef reg_t sv_reg_t;
 //typedef sreg_t sv_sreg_t;
 //typedef float32_t sv_float32_t;
-typedef float64_t sv_float64_t;
+//typedef float64_t sv_float64_t;
 typedef float128_t sv_float128_t;
 //typedef freg_t sv_freg_t;
 
index 70e1533dc03e19e8dd37ec5eb1eef88985e98b6c..1c9eadeec73108148cbdaef206bffe3a06ac802d 100644 (file)
@@ -107,4 +107,20 @@ public:
   operator float32_t() const& { return reg; }
 };
 
+class sv_float64_t : public sv_regbase_t {
+public:
+    sv_float64_t(float64_t _reg) : sv_regbase_t(), reg(_reg) { } // default elwidth
+    sv_float64_t(float64_t _reg, uint8_t _elwidth) :
+                sv_regbase_t(_elwidth), reg(_reg)
+                                                {}
+    sv_float64_t(float64_t _reg, int xlen, uint8_t _elwidth) :
+                sv_regbase_t(xlen, _elwidth), reg(_reg)
+                                                {}
+
+    float64_t reg;
+public:
+
+  operator float64_t() const& { return reg; }
+};
+
 #endif