下面的代码计算两个64位有符号值:r和:y的128位乘积,并将结果存储在内存中:
typedef __int128 int128_t; void store_prod(int128_t *dest, int64_t x, int64_t y) { *dest = x * (intl28_t) y; }
GCC产出下面的汇编代码来实现计算:
store_prod: movq %rdx,%rax cqto movq %rsi,%rcx sarq $63,%rcx imulq %rax,%rcx imulq %rsi,%rdx addq %rdx,%rcx mulq %rsi addq %rcx,%rdx movq %rax,(%rdi) movq %rdx,8(%rdi) ret
为了满足在64位机器上实现128位运算所需的多精度计算,这段代码用了三个乘法。描述用来计算乘积的算法,对汇编代码加注释,说明它是如何实现你的算法的。提示:在把参数x和y扩展到128位时,它们可以重写为x=264 •xh+xl和y =264 •yh+yl,这里xh,xl,yh和yl都是64位值。类似地,128位的乘积可以写成p=261 •ph+pl,这里ph和pl是64位值。请解释这段 代码是如何用xh,xl,yh,和yl来计算ph和pl的。