#ifndef __BEE2_U64_H
#define __BEE2_U64_H
#include "bee2/defs.h"
#include "bee2/core/safe.h"
#ifndef U64_SUPPORT
#error "Cannot proceed without u64"
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define U64_0 ((u64)0)
#define U64_1 ((u64)1)
#define U64_MAX ((u64)(U64_0 - U64_1))
#define u64RotHi(w, d)\
((u64)((w) << (d) | (w) >> (64 - (d))))
#define u64RotLo(w, d)\
((u64)((w) >> (d) | (w) << (64 - (d))))
#define u64Rev_(w)\
((u64)((w) << 56 | ((w) & 0xFF00) << 40 | ((w) & 0xFF0000) << 24 |\
((w) & 0xFF000000) << 8 | ((w) >> 8 & 0xFF000000) |\
((w) >> 24 & 0xFF0000) | ((w) >> 40 & 0xFF00) | (w) >> 56))
u64 u64Rev(
register u64 w
);
void u64Rev2(
u64 buf[],
size_t count
);
u64 u64Bitrev(
register u64 w
);
size_t u64Weight(
register u64 w
);
bool_t u64Parity(
register u64 w
);
size_t u64CTZ(
register u64 w
);
size_t SAFE(u64CTZ)(register u64 w);
size_t FAST(u64CTZ)(register u64 w);
size_t u64CLZ(
register u64 w
);
size_t SAFE(u64CLZ)(register u64 w);
size_t FAST(u64CLZ)(register u64 w);
u64 u64Shuffle(
register u64 w
);
u64 u64Deshuffle(
register u64 w
);
u64 u64NegInv(
register u64 w
);
void u64From(
u64 dest[],
const void* src,
size_t count
);
void u64To(
void* dest,
size_t count,
const u64 src[]
);
#ifdef __cplusplus
}
#endif
#endif