X86 现代处理器中是否有128位整数的硬件支持?

X86 现代处理器中是否有128位整数的硬件支持?,x86,cpu,int128,X86,Cpu,Int128,我们是否仍然需要在软件中模拟128位整数,或者这些天在普通桌面处理器中是否有对它们的硬件支持?简而言之,答案是:没有 更详细地说,SSE寄存器是128位宽的,但没有将它们视为128位整数的指令。充其量,这些寄存器被视为两个64位(非)有符号整数。像addition/…这样的操作。。。可以通过并行添加这两个64位值并手动处理溢出来构造,但不能使用单个指令。实现这一点可能会变得非常复杂和“丑陋”,请看这里: 与使用64位通用寄存器(软件中的“仿真”)的实现相比,每一个基本操作都必须这样做,其优点可

我们是否仍然需要在软件中模拟128位整数,或者这些天在普通桌面处理器中是否有对它们的硬件支持?

简而言之,答案是:没有

更详细地说,SSE寄存器是128位宽的,但没有将它们视为128位整数的指令。充其量,这些寄存器被视为两个64位(非)有符号整数。像addition/…这样的操作。。。可以通过并行添加这两个64位值并手动处理溢出来构造,但不能使用单个指令。实现这一点可能会变得非常复杂和“丑陋”,请看这里:


与使用64位通用寄存器(软件中的“仿真”)的实现相比,每一个基本操作都必须这样做,其优点可能值得怀疑。另一方面,这种SSE方法的一个优点是,一旦实现,它也可以用于256位整数(AVX2)和512位整数(AVX-512),只需稍作修改。

x86-64指令集可以使用一条指令执行64位*64位到128位的操作(
mul
表示无符号
imul
表示有符号的每个操作数都有一个操作数),因此我认为x86指令集在某种程度上确实支持128位整数

如果您的指令集没有执行64位*64位到128位的指令,则需要

这就是为什么使用x86-64只需很少的指令就可以完成128位*128位到较低128位的操作

__int128 mul(__int128 a, __int128 b) {
    return a*b;
}
生成此程序集

imulq   %rdx, %rsi
movq    %rdi, %rax
imulq   %rdi, %rcx
mulq    %rdx
addq    %rsi, %rcx
addq    %rcx, %rdx

它使用一个64位*64位到128位指令,两个64位*64位到低位64位指令,以及两个64位加法。

由于算术逻辑单元(ALU)的操作类似,我将通过将桌面处理器与简单微控制器进行比较来解释它,这是CPU中的计算器,短答案的vs.滚动到末尾,但长答案是,通过比较x86/x64与ARM和AVR,最容易看出差异:

长话短说 本机双字整数乘法体系结构支持比较

中央处理器 单词x单词=>dword dword x dword=>dword M0 否(仅32x32=>32) 不 AVR 8x8=>16(仅限某些版本) 不 M3/M4/A 是(32x32=>64) 不 x86/x64 是(高达64x64=>128) 是(最多64x64=>64对于x64) SSE/SSE2/AVX/AVX2 是(32x32=>64个SIMD元素) 否(最多32x32=>32个SIMD元素)
5年后,这个问题的答案仍然是“不”

具体来说,让我们将其分解为80x86的各种操作:

整数加法

不支持128位。始终支持“大于本机支持的”整数运算(例如,
add
then
adc
)。几年前,Intel ADX(多精度加法进位指令扩展)的引入改善了对“大于本机支持的”整数运算的支持这样就可以在保留其他标志(这在循环中可能很重要-例如,在其他标志控制退出条件的情况下)的同时完成

整数减法

不支持128位。始终支持“大于本机支持的”整数运算(例如
sub
then
sbb
)。这一点没有改变(英特尔的ADX扩展不包括减法)

整数乘法

不支持128位(将128位整数与128位整数相乘)。始终支持“大于本机支持的”整数操作(例如,将64位整数相乘并获得128位结果)

整数除法

不支持128位(将128位整数除以128位整数)。始终部分支持“大于本机支持的”整数操作(例如,将128位整数除以64位整数并获得64位结果),但当除数为128位时,这没有帮助

整数移位

不支持128位。始终支持“大于本机支持的”整数运算(例如
shld
shrd
,以及
rcr
rcl

原子学

大多数情况下不支持128位。有一条
锁cmpxchg16b
指令(在引入长模式后不久引入),可用于在一条指令中模拟128位“原子负载”,或在一条指令中模拟128位“原子比较(如果相等)”(“原子存储”和“原子交换”)注意:对齐的SSE和AVX加载/存储不能保证是原子的(实际上,对于所有读写大小相同的简单情况,它们可能是或可能不是“伪原子的”)

按位运算(AND、OR、XOR)

对于通用寄存器,没有。对于SIMD,自2000年引入SSE2以来(从支持long模式和64位通用寄存器之前开始),就支持128位寄存器;但这种情况很少有用(例如,您不进行128位操作的混合,可以避免将值移动到SSE寄存器或从SSE寄存器移动值的成本)

位字段/位字符串操作(设置、清除和测试位字段中的单个位)

“部分支持排序”。如果该位字段位于寄存器/s中,则不支持128位位字段。如果该位字段位于内存中,则80x86支持的大小会大得多(16位代码中最多65536位位字段,32位代码中最多4294967296位字段,等等)。这包括对位字段的原子操作(
锁定基站..
等)

寻址

不支持(物理地址或虚拟地址)。我们甚至都没有完整的64位地址。有一个“5级”