Delta-swap
動作を表す疑似コード
code:delta-swap
for i in 0..word_size {
if maski {
desti = srci + delta
} else if i >= delta && maski-delta {
desti = srci - delta
} else {
desti = srci
}
}
ただし、 mask & (mask << delta) == 0
maskでマスクされたビットとmask << deltaでマスクされたビットを入れ替える。
動作の仕組みとしてはXOR-swapによって部分列をswapしているとみなせる。
CPU命令
実装されたアーキテクチャ、ある…?
ソフトウェア実装
code:delta_swap.cpp
#include <cassert>
uint64_t delta_swap(uint64_t x, uint64_t mask, size_t delta) {
assert((mask & (mask << delta)) == 0);
auto t = ((x >> delta) ^ x) & mask;
return t ^ (t << delta) ^ x;
}
ハードウェア実装
XOR使わずに愚直にAND maskとシフタで実装するのが良さそう?
maskとdeltaが定数ならそもそも配線だけになるはず。