10#ifndef RANLUXPP_HELPERS_H
11#define RANLUXPP_HELPERS_H
24static inline uint64_t
add_carry(uint64_t a, uint64_t b,
unsigned &carry) {
42static inline uint64_t
sub_carry(uint64_t a, uint64_t b,
unsigned &carry) {
58static inline int64_t
compute_r(
const uint64_t *upper, uint64_t *r) {
61 for (
int i = 0; i < 9; i++) {
65 uint64_t t1_i = upper[i];
69 int64_t c = -((int64_t)carry);
73 for (
int i = 0; i < 9; i++) {
79 t2_bits += upper[i + 5] >> 16;
81 t2_bits += upper[i + 6] << 48;
94 uint64_t t2_bits = (upper[5] >> 16) << 48;
95 uint64_t t3_bits = (upper[0] << 48);
102 for (
int i = 0; i < 3; i++) {
103 uint64_t r_i = r[i + 4];
106 uint64_t t2_bits = (upper[5 + i] >> 32) + (upper[6 + i] << 32);
107 uint64_t t3_bits = (upper[i] >> 16) + (upper[1 + i] << 48);
118 uint64_t t2_bits = (upper[8] >> 32);
119 uint64_t t3_bits = (upper[3] >> 16) + (upper[4] << 48);
130 uint64_t t3_bits = (upper[4] >> 16) + (upper[5] << 48);
143 bool greater_m = r[0] | r[1] | r[2] | (r[3] & 0x0000ffffffffffff);
144 greater_m &= (r[3] >> 48) == 0xffff;
145 for (
int i = 4; i < 9; i++) {
146 greater_m &= (r[i] == UINT64_MAX);
148 return c + (c == 0 && greater_m);
static uint64_t sub_overflow(uint64_t a, uint64_t b, unsigned &overflow)
Compute a - b and set overflow accordingly.
static uint64_t sub_carry(uint64_t a, uint64_t b, unsigned &carry)
Compute a - b and increment carry if there was an overflow.
static uint64_t add_carry(uint64_t a, uint64_t b, unsigned &carry)
Compute a + b and increment carry if there was an overflow.
static int64_t compute_r(const uint64_t *upper, uint64_t *r)
static uint64_t add_overflow(uint64_t a, uint64_t b, unsigned &overflow)
Compute a + b and set overflow accordingly.