轩胡 has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/68421?usp=email )

Change subject: arch-riscv: simplify implementation of multiply insts
......................................................................

arch-riscv: simplify implementation of multiply insts

Change-Id: I9e9d5252256f0453c9c4897717748d45e138cb9b
---
M src/arch/riscv/isa/decoder.isa
1 file changed, 12 insertions(+), 54 deletions(-)



diff --git a/src/arch/riscv/isa/decoder.isa b/src/arch/riscv/isa/decoder.isa
index ddaf233..84ae243 100644
--- a/src/arch/riscv/isa/decoder.isa
+++ b/src/arch/riscv/isa/decoder.isa
@@ -1278,27 +1278,7 @@
                             Rd_sw = ((int64_t)Rs1_sw * Rs2_sw) >> 32;
                         }}, IntMultOp);
                         0x1: mulh({{
-                            bool negate = (Rs1_sd < 0) != (Rs2_sd < 0);
-
-                            uint64_t Rs1_lo = (uint32_t)std::abs(Rs1_sd);
- uint64_t Rs1_hi = (uint64_t)std::abs(Rs1_sd)
32;
-                            uint64_t Rs2_lo = (uint32_t)std::abs(Rs2_sd);
- uint64_t Rs2_hi = (uint64_t)std::abs(Rs2_sd)
32;
-
-                            uint64_t hi = Rs1_hi*Rs2_hi;
-                            uint64_t mid1 = Rs1_hi*Rs2_lo;
-                            uint64_t mid2 = Rs1_lo*Rs2_hi;
-                            uint64_t lo = Rs2_lo*Rs1_lo;
-                            uint64_t carry = ((uint64_t)(uint32_t)mid1
-                                    + (uint64_t)(uint32_t)mid2
-                                    + (lo >> 32)) >> 32;
-
-                            uint64_t res = hi +
-                                          (mid1 >> 32) +
-                                          (mid2 >> 32) +
-                                          carry;
- Rd = negate ? ~res + (Rs1_sd*Rs2_sd == 0 ? 1 : 0)
-                                        : res;
+                            Rd_sd = mulh(Rs1_sd, Rs2_sd);
                         }}, IntMultOp);
                     }
                     0x5: clmul({{
@@ -1338,25 +1318,7 @@
                             Rd_sw = ((int64_t)Rs1_sw * Rs2_uw) >> 32;
                         }}, IntMultOp);
                         0x1: mulhsu({{
-                            bool negate = Rs1_sd < 0;
-                            uint64_t Rs1_lo = (uint32_t)std::abs(Rs1_sd);
- uint64_t Rs1_hi = (uint64_t)std::abs(Rs1_sd)
32;
-                            uint64_t Rs2_lo = (uint32_t)Rs2;
-                            uint64_t Rs2_hi = Rs2 >> 32;
-
-                            uint64_t hi = Rs1_hi*Rs2_hi;
-                            uint64_t mid1 = Rs1_hi*Rs2_lo;
-                            uint64_t mid2 = Rs1_lo*Rs2_hi;
-                            uint64_t lo = Rs1_lo*Rs2_lo;
-                            uint64_t carry = ((uint64_t)(uint32_t)mid1
-                                    + (uint64_t)(uint32_t)mid2
-                                    + (lo >> 32)) >> 32;
-
-                            uint64_t res = hi +
-                                          (mid1 >> 32) +
-                                          (mid2 >> 32) +
-                                          carry;
- Rd = negate ? ~res + (Rs1_sd*Rs2 == 0 ? 1 : 0) : res;
+                            Rd_sd = mulhsu(Rs1_sd, Rs2);
                         }}, IntMultOp);
                     }
                     0x5: clmulr({{
@@ -1386,20 +1348,7 @@
                             Rd_sw = ((uint64_t)Rs1_uw * Rs2_uw) >> 32;
                         }}, IntMultOp);
                         0x1: mulhu({{
-                            uint64_t Rs1_lo = (uint32_t)Rs1;
-                            uint64_t Rs1_hi = Rs1 >> 32;
-                            uint64_t Rs2_lo = (uint32_t)Rs2;
-                            uint64_t Rs2_hi = Rs2 >> 32;
-
-                            uint64_t hi = Rs1_hi*Rs2_hi;
-                            uint64_t mid1 = Rs1_hi*Rs2_lo;
-                            uint64_t mid2 = Rs1_lo*Rs2_hi;
-                            uint64_t lo = Rs1_lo*Rs2_lo;
-                            uint64_t carry = ((uint64_t)(uint32_t)mid1
-                                    + (uint64_t)(uint32_t)mid2
-                                    + (lo >> 32)) >> 32;
-
-                            Rd = hi + (mid1 >> 32) + (mid2 >> 32) + carry;
+                            Rd = mulhu(Rs1, Rs2);
                         }}, IntMultOp);
                     }
                     0x5: clmulh({{

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/68421?usp=email To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I9e9d5252256f0453c9c4897717748d45e138cb9b
Gerrit-Change-Number: 68421
Gerrit-PatchSet: 1
Gerrit-Owner: 轩胡 <huxuan0...@gmail.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org

Reply via email to