![我有 PCLMUL 指令集支持吗?](https://linux22.com/image/43482/%E6%88%91%E6%9C%89%20PCLMUL%20%E6%8C%87%E4%BB%A4%E9%9B%86%E6%94%AF%E6%8C%81%E5%90%97%EF%BC%9F.png)
以下是flags
来自/proc/cpuinfo
:
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36
clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm
constant_tsc arch_perfmon pebs bts nopl xtopology nonstop_tsc aperfmperf
pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid
sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida
arat epb xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid
我显然有一个pclmulqdq
标志,但我不确定这是否意味着 PCLMUL 指令集支持。如何找到该标志的含义,或者 PCLMUL 对应的标志是什么?
答案1
答案2
在 Intel 64 IA-32 指令集参考中,没有给出 PCLMUL 指令的列表。然而,Intel确实列出了一条PCLMULQDQ指令,描述如下:
描述
执行两个四字的无进位乘法,根据立即字节的值从第一个源操作数和第二个源操作数中选择。位 4 和 0 用于根据表 4-13 选择要使用每个操作数的 64 位一半,立即字节的其他位将被忽略(Intel 64 IA-32 指令集参考,卷 II)。
因此,当您看到 PCLMUL 支持时,假设它只是 PCLMULQDQ 的缩写形式。不是使用两个 64 位寄存器来存储两个 64 位寄存器相乘的结果,而是将结果存储在一个 128 位寄存器中。因此,名称为无进位乘法。其他指令将使用两个不同的寄存器来存储结果,汇编程序员必须执行额外的步骤来计算出在其程序中使用的最终结果。但对于无进位乘法,结果存储在一个更大的寄存器中。在该指令(PCLMULQDQ)中,两个 64 位数字相乘的结果存储在一个 128 位寄存器中。该指令使用 128 位 XMM 寄存器,CPU 也有此类寄存器可供使用。