我在 HLSL 中有 2 个不同的 64 位添加实现。如果我想设置 A += B,其中 al、ah、bl 和 bh 分别是 A 和 B 的低 32 位和高 32 位,那么我要么
(1):
#define pluseq64(al, ah, bl, bh) do {\
uint tadd0 = al >> 1;\
uint tadd1 = bl >> 1;\
tadd0 += al & bl & 0x00000001;\
tadd0 += tadd1;\
tadd0 >>= 31;\
al += bl;\
ah += bh;\
ah += tadd0;
或 (2):
#define pluseq64(al, ah, bl, bh) do {\
uint t = al;\
al += bl;\
ah += bh;\
if (al < t) { \
ah += 1; \
} } while(0)
现在,有趣的是,(1)总是产生正确的输出,而(2)则不会。鉴于(1)是一种混乱的操作(3个班次,5个加法来做一个64位+=),我更喜欢沿着(2)到(1)的路线,除了(2)不能正常工作。
作为(2)的替代方案,我尝试过:
#define pluseq64(al, ah, bl, bh) do {\
uint t = al;\
al += bl;\
ah += bh;\
ah += (al < t); } while(0)
这也不太有效(可能出于相同的原因,不管那个原因是什么,如果我有我的猜测)。
为什么(2)不能正常工作?奖励:有没有更好的方法在 HLSL 中添加 64 位?
谢谢!