rcx

library of miscellaneous bits of C code
git clone git://git.rr3.xyz/rcx
Log | Files | Refs | README | LICENSE

commit 857f48aa6b8543a5891d4cbcc2d8b4c5a1b9054b
parent b6237da857b79577287cf4eaa08d1bbd156fe936
Author: Robert Russell <robertrussell.72001@gmail.com>
Date:   Sun, 21 May 2023 15:56:01 -0700

Add mul64 function

Diffstat:
Minc/bits.h | 3+++
Msrc/bits.c | 20++++++++++++++++++++
2 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/inc/bits.h b/inc/bits.h @@ -6,3 +6,5 @@ int r_popcnt_8(u8 n); int r_popcnt_16(u16 n); int r_popcnt_32(u32 n); int r_popcnt_64(u64 n); + +void r_mul64(u64 *h, u64 *l, u64 x, u64 y); +\ No newline at end of file diff --git a/src/bits.c b/src/bits.c @@ -41,3 +41,23 @@ r_popcnt_64(u64 n) { n = (n & U64_C(0x00000000ffffffff)) + ((n>>32) & U64_C(0x00000000ffffffff)); return n; } + +void +r_mul64(u64 *h, u64 *l, u64 x, u64 y) { + const u64 m = (U64_C(1)<<32) - 1; + + u64 x0 = x & m; + u64 x1 = x >> 32; + u64 y0 = y & m; + u64 y1 = y >> 32; + + u64 x0y0 = x0 * y0; + u64 x0y1 = x0 * y1; + u64 x1y0 = x1 * y0; + u64 x1y1 = x1 * y1; + + u64 c = ((x0y1&m) + (x1y0&m) + (x0y0>>32)) >> 32; + + *l = x0y0 + (x0y1<<32) + (x1y0<<32); + *h = x1y1 + (x0y1>>32) + (x1y0>>32) + c; +}