add mul elwidth redirection
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 7 Nov 2018 11:42:10 +0000 (11:42 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 7 Nov 2018 11:42:10 +0000 (11:42 +0000)
riscv/sv_insn_redirect.cc
riscv/sv_insn_redirect.h

index d3461163ae7331417b39c2477d23f4022384d2e8..b06f270d664b493e1f560a706b6ce4dc37cb9236 100644 (file)
@@ -468,6 +468,7 @@ SRESTYPE sv_proc_t::rv_int_op_finish(SLHSTYPE const & lhs,                 \
 
 
 OP_PREP_FINISH(sv_reg_t, sv_reg_t, sv_reg_t, uint64_t, uint64_t, uint64_t)
+OP_PREP_FINISH(sv_sreg_t, sv_reg_t, sv_sreg_t, int64_t, uint64_t, int64_t)
 OP_PREP_FINISH(sv_sreg_t, sv_sreg_t, sv_sreg_t, int64_t, int64_t, int64_t)
 
 sv_reg_t sv_proc_t::rv_add(sv_reg_t const & lhs, sv_reg_t const & rhs)
@@ -558,12 +559,32 @@ sv_reg_t sv_proc_t::rv_rem(sv_reg_t const & lhs, sv_reg_t const & rhs)
 
 sv_reg_t sv_proc_t::rv_mul(sv_reg_t const & lhs, sv_reg_t const & rhs)
 {
-    return lhs * rhs;
+    uint8_t bitwidth = _insn->src_bitwidth;
+    uint64_t vlhs = 0;
+    uint64_t vrhs = 0;
+    if (rv_int_op_prepare(lhs, rhs, vlhs, vrhs, bitwidth)) {
+        sv_reg_t result = lhs * rhs;
+        fprintf(stderr, "mul result %lx %lx %lx\n",
+                (uint64_t)lhs, (uint64_t)rhs, (uint64_t)result);
+        return result;
+    }
+    uint64_t result = vlhs * vrhs;
+    return rv_int_op_finish(lhs, rhs, result, bitwidth);
 }
 
 sv_sreg_t sv_proc_t::rv_mul(sv_sreg_t const & lhs, sv_reg_t const & rhs)
 {
-    return lhs * rhs;
+    uint8_t bitwidth = _insn->src_bitwidth;
+    int64_t vlhs = 0;
+    uint64_t vrhs = 0;
+    if (rv_int_op_prepare(lhs, rhs, vlhs, vrhs, bitwidth)) {
+        sv_sreg_t result = lhs * rhs;
+        fprintf(stderr, "mul result %lx %lx %lx\n",
+                (int64_t)lhs, (uint64_t)rhs, (uint64_t)result);
+        return result;
+    }
+    int64_t result = vlhs * vrhs;
+    return rv_int_op_finish(lhs, rhs, result, bitwidth);
 }
 
 sv_sreg_t sv_proc_t::rv_mul(sv_sreg_t const & lhs, sv_sreg_t const & rhs)
@@ -571,6 +592,7 @@ sv_sreg_t sv_proc_t::rv_mul(sv_sreg_t const & lhs, sv_sreg_t const & rhs)
     return lhs * rhs;
 }
 
+/* 32-bit mulh/mulhu/mulhsu */
 sv_reg_t sv_proc_t::rv_mulhu(sv_reg_t const & lhs, sv_reg_t const & rhs)
 {
     return (lhs * rhs) >> 32;
@@ -586,6 +608,22 @@ sv_sreg_t sv_proc_t::rv_mulh(sv_sreg_t const & lhs, sv_sreg_t const & rhs)
     return (lhs * rhs) >> 32;
 }
 
+/* 64-bit mulh/mulhu/mulhsu */
+sv_sreg_t (sv_proc_t::mulhsu)(sv_sreg_t const& a, sv_reg_t const& b)
+{
+    return sv_sreg_t(::mulhsu(a, b));
+}
+
+sv_sreg_t (sv_proc_t::mulh)(sv_sreg_t const& a, sv_sreg_t const& b)
+{
+    return sv_sreg_t(::mulh(a, b));
+}
+
+sv_reg_t (sv_proc_t::mulhu)(sv_reg_t const& a, sv_reg_t const& b)
+{
+    return sv_reg_t(::mulhu(a, b));
+}
+
 sv_reg_t sv_proc_t::rv_and(sv_reg_t const & lhs, sv_reg_t const & rhs)
 {
     return lhs & rhs;
@@ -989,21 +1027,6 @@ sv_reg_t (sv_proc_t::f128_to_i64)( sv_float128_t a, uint_fast8_t roundingMode,
     return sv_reg_t(::f128_to_i64(a, roundingMode, exact));
 }
 
-sv_sreg_t (sv_proc_t::mulhsu)(sv_sreg_t const& a, sv_reg_t const& b)
-{
-    return sv_sreg_t(::mulhsu(a, b));
-}
-
-sv_sreg_t (sv_proc_t::mulh)(sv_sreg_t const& a, sv_sreg_t const& b)
-{
-    return sv_sreg_t(::mulh(a, b));
-}
-
-sv_reg_t (sv_proc_t::mulhu)(sv_reg_t const& a, sv_reg_t const& b)
-{
-    return sv_reg_t(::mulhu(a, b));
-}
-
 // --------
 
 sv_float64_t (sv_proc_t::f64_add)( sv_float64_t a, sv_float64_t b )
index 4056c5fa0dd0470bd4895469048264cd353680b5..ebac58f9db57a3d0e34ae458598b6f43c4a3a36b 100644 (file)
@@ -272,11 +272,16 @@ public:
     bool rv_int_op_prepare(sv_reg_t const & lhs, sv_reg_t const & rhs,
                            uint64_t &vlhs, uint64_t &vrhs,
                            uint8_t &bitwidth);
+    bool rv_int_op_prepare(sv_sreg_t const & lhs, sv_reg_t const & rhs,
+                           int64_t &vlhs, uint64_t &vrhs,
+                           uint8_t &bitwidth);
     bool rv_int_op_prepare(sv_sreg_t const & lhs, sv_sreg_t const & rhs,
                            int64_t &vlhs, int64_t &vrhs,
                            uint8_t &bitwidth);
     sv_reg_t rv_int_op_finish(sv_reg_t const & lhs, sv_reg_t const & rhs,
                                  uint64_t &result, uint8_t &bitwidth);
+    sv_sreg_t rv_int_op_finish(sv_sreg_t const & lhs, sv_reg_t const & rhs,
+                                 int64_t &result, uint8_t &bitwidth);
     sv_sreg_t rv_int_op_finish(sv_sreg_t const & lhs, sv_sreg_t const & rhs,
                                  int64_t &result, uint8_t &bitwidth);