]> www.ginac.de Git - cln.git/blob - src/base/low/cl_low_mul.cc
Replace CL_REQUIRE/CL_PROVIDE(cl_symbol) with portable code.
[cln.git] / src / base / low / cl_low_mul.cc
1 // Low level: multiplication.
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cl_low.h"
8
9
10 // Implementation.
11
12 #ifdef NEED_VAR_mulu32_high
13 uint32 mulu32_high;
14 #endif
15
16 #ifdef NEED_FUNCTION_mulu32_
17 uint32 mulu32_high;
18 namespace cln {
19 uint32 mulu32_ (uint32 x, uint32 y)
20 {
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
30         }
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
34         }
35         mulu32_high = hi; return lo;
36 }
37 }  // namespace cln
38 #endif
39
40 #ifdef NEED_FUNCTION_mulu32_w
41 namespace cln {
42 uint64 mulu32_w (uint32 arg1, uint32 arg2)
43 {
44         var uint32 lo = mulu32_(arg1,arg2);
45         var uint32 hi = mulu32_high;
46         return highlow64(hi,lo);
47 }
48 }  // namespace cln
49 #endif
50
51
52 #ifdef NEED_VAR_mulu64_high
53 uint64 mulu64_high;
54 #endif
55
56 #ifdef NEED_FUNCTION_mulu64_
57 uint64 mulu64_high;
58 namespace cln {
59 extern "C" uint64 mulu64_ (uint64 x, uint64 y);
60 uint64 mulu64_ (uint64 x, uint64 y)
61 {
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
71         }
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
75         }
76         mulu64_high = hi; return lo;
77 }
78 }  // namespace cln
79 #endif
80