override elwidth in sv_proc_t::f64
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 31 Oct 2018 13:14:51 +0000 (13:14 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 31 Oct 2018 13:14:51 +0000 (13:14 +0000)
riscv/sv_insn_redirect.cc

index b995c788bf571fa051cb89d13fd5b49e3269d92a..e270a99c59eddd90b9135eb11eb72d206c8c7c35 100644 (file)
@@ -561,9 +561,30 @@ sv_float32_t (sv_proc_t::f32)(sv_reg_t const& v)
     return ::f32(x);
 }
 
-sv_float64_t (sv_proc_t::f64)(sv_freg_t v)
+sv_float64_t (sv_proc_t::f64)(sv_freg_t x)
 {
-    return ::f64(v);
+    switch (x.get_elwidth())
+    {
+        // 8-bit
+        case 1: throw trap_illegal_instruction(0); // XXX for now
+        // 16-bit data, up-convert to f32
+        case 2:
+        {
+            sv_reg_t x64(x.to_uint64());
+            float16_t f_16 = f16(x);
+            fprintf(stderr, "f16-to-f64 %lx\n", (uint64_t)x64);
+            return f16_to_f64(f_16);
+        }
+        case 3:
+        {
+            sv_reg_t x64(x.to_uint64());
+            float32_t f_32 = f32(x);
+            fprintf(stderr, "f32-to-f64 %lx\n", (uint64_t)x64);
+            return f32_to_f64(f_32);
+        }
+        default: break;
+    }
+    return ::f64(x);
 }
 
 sv_float64_t (sv_proc_t::f64)(sv_reg_t const& v)