33 __host__ __device__
Uint operator+(
Uint rhs)
const {
34 if constexpr (mod == 0)
return {
static_cast<T
>(val + rhs.val)};
36 if (val >= mod - rhs.val)
return {
static_cast<T
>(val + rhs.val - mod)};
37 else return {
static_cast<T
>(val + rhs.val)};
40 __host__ __device__
Uint operator-()
const {
41 if constexpr (mod == 0)
return {
static_cast<T
>(-val)};
43 if (val == 0)
return {0};
44 else return {
static_cast<T
>(mod - val)};
47 __host__ __device__
Uint() : val(0) {}
49 __host__ __device__
static Uint From(int4 buf) {
50 assert((buf.w & 1) == 0);
53 if constexpr (
sizeof(T) < 4) val = buf.x & ((1 << 8 *
sizeof(T)) - 1);
55 else if constexpr (
sizeof(T) == 4) val =
static_cast<unsigned int>(buf.x);
56 else if constexpr (
sizeof(T) == 8)
57 val =
static_cast<T
>(
static_cast<unsigned int>(buf.x)) |
58 static_cast<T
>(
static_cast<unsigned int>(buf.y)) << 32;
59 else if constexpr (
sizeof(T) == 16)
60 val =
static_cast<T
>(
static_cast<unsigned int>(buf.x)) |
61 static_cast<T
>(
static_cast<unsigned int>(buf.y)) << 32 |
62 static_cast<T
>(
static_cast<unsigned int>(buf.z)) << 64 |
64 static_cast<T
>(
static_cast<unsigned int>(buf.w) >> 1) << 96;
65 else __builtin_unreachable();
67 if constexpr (mod > 0) val %= mod;
72 __host__ __device__ int4 Into()
const {
73 int4 buf = {0, 0, 0, 0};
74 if constexpr (
sizeof(T) <= 4) buf.x =
static_cast<int>(val);
75 else if constexpr (
sizeof(T) == 8) {
76 buf.x =
static_cast<int>(val & 0xffffffff);
77 buf.y =
static_cast<int>(val >> 32);
78 }
else if constexpr (
sizeof(T) == 16) {
79 buf.x =
static_cast<int>(val & 0xffffffff);
80 buf.y =
static_cast<int>((val >> 32) & 0xffffffff);
81 buf.z =
static_cast<int>((val >> 64) & 0xffffffff);
83 buf.w =
static_cast<int>((val >> 96) << 1);
84 }
else __builtin_unreachable();
89 __host__ __device__
Uint(T v) : val(v) {}