如果我有一个64位整数,我将它解释为一个包含8个元素的8位整数数组。我需要从每个打包的整数中减去常量 1
,同时处理溢出,而不会导致一个元素影响另一个元素的结果。
我目前有这个代码,它工作,但我需要一个解决方案,做每个打包8位整数并行减法,并没有内存访问。在 x86上,我可以使用像 psubb
这样的 SIMD 指令,它可以并行地减去包装好的8位整数,但是我正在编写代码的平台不支持 SIMD 指令。(本例中为 RISC-V)。
因此,我尝试用 SWAR (寄存器内的 SIMD)手动取消 uint64_t
字节之间的进位传播,所做的事情类似于下面这样:
uint64_t sub(uint64_t arg) {
uint8_t* packed = (uint8_t*) &arg;
for (size_t i = 0; i < sizeof(uint64_t); ++i) {
packed[i] -= 1;
}
return arg;
}
我认为你可以用按位运算符做到这一点,但我不确定。我正在寻找一种不使用 SIMD 指令的解决方案。我正在寻找一个 C 或 C + + 的解决方案,这是相当可移植的,或只是它背后的理论,这样我就可以实现我自己的解决方案。