您可以在x86中本地添加两个64位整数吗?

Tom*_*Tom 3 x86 assembly sse

x86中的“常规”寄存器只有32位大小,因此您不能使用它们将两个64位整数相加(除非您分步进行加法操作)。

但是,您可以使用另一种方式(例如使用SSE)以本机方式添加两个64位整数吗?

fuz*_*fuz 9

在32位模式下,有四种方法可以执行此操作:

  • 最值得推荐的方法是做在与两个步骤的增加add,然后在adc对通用寄存器
  • 如果您的CPU有FPU,则还可以使用x87 FPU进行64位算术运算。由于x87 FPU保留64位尾数,因此只要不超过64位范围,就可以对64位整数进行精确计算。
  • 如果您的CPU至少支持SSE2,则可以在MMX寄存器上执行64位算术运算
  • 如果您的CPU至少支持SSE2,则还可以在XMM寄存器上执行64位算术运算

对于单个64位操作,最快的可能是add/ adc 方法。对于多种操作,SSE2将是最快的,然后是MMX(如果您可以承受过渡罚款并且在MMX状态下无法使用x87 FPU),最后是x87。

在64位模式(长模式)下,您还可以简单地对64位通用寄存器执行64位算术运算。

让我知道是否需要更多详细信息或示例。

  • 如果不需要整数寄存器中的结果,则MMX或SSE2`paddd'非常便宜,并且可以减少标量代码的寄存器压力。如果您想基于结果或其他内容,`add / adc`显然是不错的选择,否则,`movq` +`paddd`非常有用,尤其是在Intel Haswell和更早的版本(其中adc`为2 uops)上。通常,您不希望在现代Intel上使用内存目标地址“ adc”,因此如果最终目标是内存而不是其他64位操作,则需要2条存储指令。MMX Paddd甚至可以使用64位内存源进行添加(例如标量添加/ adc) (3认同)