Avoid use of __int128_t
authorAndrew Waterman <waterman@cs.berkeley.edu>
Sat, 27 Sep 2014 18:01:22 +0000 (11:01 -0700)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Sat, 27 Sep 2014 18:10:49 +0000 (11:10 -0700)
It is nonstandard, and GCC doesn't support it on 32-bit platforms. The
resulting code for MULH[[S]U] is crappier, but that doesn't really matter,
as these instructions are dynamically infrequent.

hwacha/insn_template_hwacha_ut.h
riscv/cachesim.h
riscv/decode.h
riscv/dummy-rocc-test.c
riscv/insn_template.h
riscv/insns/mulh.h
riscv/insns/mulhsu.h
riscv/insns/mulhu.h
riscv/memtracer.h
riscv/mulhi.h [new file with mode: 0644]
riscv/riscv.mk.in

index a26e528d1428f6d354e6c35a568488971852f8e4..d585f9b2ed3dde7a74e77210466f3a22be2b6632 100644 (file)
@@ -1,4 +1,5 @@
 #include "hwacha.h"
+#include "mulhi.h"
 #include "decode_hwacha_ut.h"
 #include "softfloat.h"
 #include "platform.h" // softfloat isNaNF32UI, etc.
index 51044c32be740252c0b429bffe18b960e5353038..a52900785feb330c64c47bc05607f5fd31443477 100644 (file)
@@ -7,7 +7,7 @@
 #include <cstring>
 #include <string>
 #include <map>
-#include <stdint.h>
+#include <cstdint>
 
 class lfsr_t
 {
index d647b2cbfc429d512824faddfe151ebda9d82183..b32c6e48a49e3237a57d449c7fb54ff97833b116 100644 (file)
@@ -7,17 +7,13 @@
 # error spike requires a two''s-complement c++ implementation
 #endif
 
-#define __STDC_LIMIT_MACROS
-#include <stdint.h>
+#include <cstdint>
 #include <string.h>
 #include "encoding.h"
 #include "config.h"
 #include "common.h"
 #include <cinttypes>
 
-typedef int int128_t __attribute__((mode(TI)));
-typedef unsigned int uint128_t __attribute__((mode(TI)));
-
 typedef int64_t sreg_t;
 typedef uint64_t reg_t;
 typedef uint64_t freg_t;
index ba362a46aadaa7cf107894025a05c158b08a9704..4071ece829a849d245feaf9dc5813ba448a65ae2 100644 (file)
@@ -5,7 +5,7 @@
 
 #include <assert.h>
 #include <stdio.h>
-#include <stdint.h>
+#include <cstdint>
 
 int main() {
   uint64_t x = 123, y = 456, z = 0;
index 109b4c4918d596a19a8953cb9f2ae0922faee3f5..56a9c7fc2d399a6942c91637d6ea78bb7bd476cb 100644 (file)
@@ -1,4 +1,5 @@
 #include "mmu.h"
+#include "mulhi.h"
 #include "softfloat.h"
 #include "platform.h" // softfloat isNaNF32UI, etc.
 #include "internals.h" // ditto
index f63869d7b60aef8605ed86bbe9676460ac345178..8ae75209f5c3ff84e2ab37321ea7b4cff002a1a3 100644 (file)
@@ -1,8 +1,4 @@
-if(xpr64)
-{
-  int64_t a = RS1;
-  int64_t b = RS2;
-  WRITE_RD((int128_t(a) * int128_t(b)) >> 64);
-}
+if (xpr64)
+  WRITE_RD(mulh(RS1, RS2));
 else
   WRITE_RD(sext32((sext32(RS1) * sext32(RS2)) >> 32));
index d62256eacb0272722ff80d1c3ff2a6820e7e5c55..3168ade2145f506b0ac7ad10d4ed07523e6ee6ec 100644 (file)
@@ -1,8 +1,4 @@
-if(xpr64)
-{
-  int64_t a = RS1;
-  uint64_t b = RS2;
-  WRITE_RD((int128_t(a) * uint128_t(b)) >> 64);
-}
+if (xpr64)
+  WRITE_RD(mulhsu(RS1, RS2));
 else
   WRITE_RD(sext32((sext32(RS1) * reg_t((uint32_t)RS2)) >> 32));
index 2d6f48c7e6db30d1a4361afc724f37c0f0b5ba77..b03b870accd5fb6fc4099987d26272c3a2215428 100644 (file)
@@ -1,4 +1,4 @@
-if(xpr64)
-  WRITE_RD((uint128_t(RS1) * uint128_t(RS2)) >> 64);
+if (xpr64)
+  WRITE_RD(mulhu(RS1, RS2));
 else
   WRITE_RD(sext32(((uint64_t)(uint32_t)RS1 * (uint64_t)(uint32_t)RS2) >> 32));
index e223c43c71ce6473268d8b7e467d48f439625ec6..f2f1b1ce22cfa72e1e3de4e4783cd542ceee0adc 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef _MEMTRACER_H
 #define _MEMTRACER_H
 
-#include <stdint.h>
+#include <cstdint>
 #include <string.h>
 #include <vector>
 
diff --git a/riscv/mulhi.h b/riscv/mulhi.h
new file mode 100644 (file)
index 0000000..f0a5d7b
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef _RISCV_MULHI_H
+#define _RISCV_MULHI_H
+
+#include <cstdint>
+
+inline uint64_t mulhu(uint64_t a, uint64_t b)
+{
+  uint64_t t;
+  uint32_t y1, y2, y3;
+  uint64_t a0 = (uint32_t)a, a1 = a >> 32;
+  uint64_t b0 = (uint32_t)b, b1 = b >> 32;
+
+  t = a1*b0 + ((a0*b0) >> 32);
+  y1 = t;
+  y2 = t >> 32;
+
+  t = a0*b1 + y1;
+  y1 = t;
+
+  t = a1*b1 + y2 + (t >> 32);
+  y2 = t;
+  y3 = t >> 32;
+
+  return ((uint64_t)y3 << 32) | y2;
+}
+
+inline int64_t mulh(int64_t a, int64_t b)
+{
+  int negate = (a < 0) != (b < 0);
+  uint64_t res = mulhu(a < 0 ? -a : a, b < 0 ? -b : b);
+  return negate ? ~res + (a * b == 0) : res;
+}
+
+inline int64_t mulhsu(int64_t a, uint64_t b)
+{
+  int negate = a < 0;
+  uint64_t res = mulhu(a < 0 ? -a : a, b);
+  return negate ? ~res + (a * b == 0) : res;
+}
+
+#endif
index 0fd5eafeb04ceaaac13f1d839cd515d87e1eb289..e9ca63fb3ea18057c143ff9dc5f49eb4354de6a0 100644 (file)
@@ -21,6 +21,7 @@ riscv_hdrs = \
        rocc.h \
        dummy-rocc.h \
        insn_template.h \
+       mulhi.h \
 
 riscv_precompiled_hdrs = \
        insn_template.h \