1 // Low level: multiplication.
4 #include "base/cl_sysdep.h"
7 #include "base/cl_low.h"
12 #ifdef NEED_VAR_mulu32_high
13 extern "C" { uint32 mulu32_high; }
16 #ifdef NEED_FUNCTION_mulu32_
17 extern "C" { uint32 mulu32_high; }
19 uint32 mulu32_ (uint32 x, uint32 y)
21 var uint16 x1 = high16(x);
22 var uint16 x0 = low16(x);
23 var uint16 y1 = high16(y);
24 var uint16 y0 = low16(y);
25 var uint32 hi = mulu16(x1,y1); // obere Portion
26 var uint32 lo = mulu16(x0,y0); // untere Portion
27 {var uint32 mid = mulu16(x0,y1); // 1. mittlere Portion
28 hi += high16(mid); mid = highlow32_0(low16(mid));
29 lo += mid; if (lo < mid) { hi += 1; } // 64-Bit-Addition
31 {var uint32 mid = mulu16(x1,y0); // 2. mittlere Portion
32 hi += high16(mid); mid = highlow32_0(low16(mid));
33 lo += mid; if (lo < mid) { hi += 1; } // 64-Bit-Addition
35 mulu32_high = hi; return lo;
40 #ifdef NEED_FUNCTION_mulu32_w
42 uint64 mulu32_w (uint32 arg1, uint32 arg2)
44 var uint32 lo = mulu32_(arg1,arg2);
45 var uint32 hi = mulu32_high;
46 return highlow64(hi,lo);
52 #ifdef NEED_VAR_mulu64_high
53 extern "C" { uint64 mulu64_high; }
56 #ifdef NEED_FUNCTION_mulu64_
57 extern "C" { uint64 mulu64_high; }
59 extern "C" uint64 mulu64_ (uint64 x, uint64 y);
60 uint64 mulu64_ (uint64 x, uint64 y)
62 var uint32 x1 = high32(x);
63 var uint32 x0 = low32(x);
64 var uint32 y1 = high32(y);
65 var uint32 y0 = low32(y);
66 var uint64 hi = mulu32_w(x1,y1); // obere Portion
67 var uint64 lo = mulu32_w(x0,y0); // untere Portion
68 {var uint64 mid = mulu32_w(x0,y1); // 1. mittlere Portion
69 hi += high32(mid); mid = highlow64_0(low32(mid));
70 lo += mid; if (lo < mid) { hi += 1; } // 128-Bit-Addition
72 {var uint64 mid = mulu32_w(x1,y0); // 2. mittlere Portion
73 hi += high32(mid); mid = highlow64_0(low32(mid));
74 lo += mid; if (lo < mid) { hi += 1; } // 128-Bit-Addition
76 mulu64_high = hi; return lo;