25namespace shamrock::sfc::bmi {
27 template<
class inttype,
int interleaving>
28 inttype expand_bits(inttype);
32 inline u64 expand_bits<u64, 2>(
u64 x) {
34 x = (x | x << 32Ull) & 0x1f00000000ffffUll;
35 x = (x | x << 16Ull) & 0x1f0000ff0000ffUll;
36 x = (x | x << 8Ull) & 0x100f00f00f00f00fUll;
37 x = (x | x << 4Ull) & 0x10c30c30c30c30c3Ull;
38 x = (x | x << 2Ull) & 0x1249249249249249Ull;
44 inline u32 expand_bits<u32, 2>(
u32 x) {
46 x = (x | x << 16U) & 0x30000ffU;
47 x = (x | x << 8U) & 0x300f00fU;
48 x = (x | x << 4U) & 0x30c30c3U;
49 x = (x | x << 2U) & 0x9249249U;
55 inline u32 expand_bits<u32, 1>(
u32 x) {
56 x = (x | (x << 8U)) & 0x00FF00FFU;
57 x = (x | (x << 4U)) & 0x0F0F0F0FU;
58 x = (x | (x << 2U)) & 0x33333333U;
59 x = (x | (x << 1U)) & 0x55555555U;
65 inline u64 expand_bits<u64, 1>(
u64 x) {
66 x = (x | (x << 16Ull)) & 0x0000FFFF0000FFFFull;
67 x = (x | (x << 8Ull)) & 0x00FF00FF00FF00FFull;
68 x = (x | (x << 4Ull)) & 0x0F0F0F0F0F0F0F0Full;
69 x = (x | (x << 2Ull)) & 0x3333333333333333ull;
70 x = (x | (x << 1Ull)) & 0x5555555555555555ull;
75 inline u32 expand_bits<u32, 0>(
u32 x) {
80 inline u64 expand_bits<u64, 0>(
u64 x) {
84 template<
class inttype,
int interleaving>
85 inttype contract_bits(inttype);
88 inline u64 contract_bits<u64, 2>(
u64 src) {
90 src = (src | (src >> 2Ull)) & 0x30c30c30c30c30c3Ull;
91 src = (src | (src >> 4Ull)) & 0xf00f00f00f00f00fUll;
92 src = (src | (src >> 8Ull)) & 0x00ff0000ff0000ffUll;
93 src = (src | (src >> 16Ull)) & 0xffff00000000ffffUll;
94 src = (src | (src >> 32Ull)) & 0x00000000ffffffffUll;
99 inline u64 contract_bits<u64, 1>(
u64 src) {
100 src = (src | (src >> 1Ull)) & 0x3333333333333333Ull;
101 src = (src | (src >> 2Ull)) & 0x0f0f0f0f0f0f0f0fUll;
102 src = (src | (src >> 4Ull)) & 0x00ff00ff00ff00ffUll;
103 src = (src | (src >> 8Ull)) & 0x0000ffff0000ffffUll;
104 src = (src | (src >> 16Ull)) & 0x00000000ffffffffUll;
109 inline u64 contract_bits<u64, 0>(
u64 src) {
114 inline u32 contract_bits<u32, 2>(
u32 src) {
115 src = (src | src >> 2U) & 0x30C30C3U;
116 src = (src | src >> 4U) & 0xF00F00FU;
117 src = (src | src >> 8U) & 0xFF0000FFU;
118 src = (src | src >> 16U) & 0xFFFFU;
123 inline u32 contract_bits<u32, 1>(
u32 src) {
124 src = (src | (src >> 1U)) & 0x33333333U;
125 src = (src | (src >> 2U)) & 0x0f0f0f0fU;
126 src = (src | (src >> 4U)) & 0x00ff00ffU;
127 src = (src | (src >> 8U)) & 0x0000ffffU;
132 inline u32 contract_bits<u32, 0>(
u32 src) {
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer