首页 > 试题广场 >

下面的代码计算两个64位有符号值:r和:y的128位乘积,并

[问答题]

下面的代码计算两个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的。


这道题你会答吗?花几分钟告诉大家答案吧!