push [mem]
: 读取[mem]
,将其写入隐含的[rsp]
(在更新rsp
之后)。pop [mem]
call [mem]
:从[mem]
读取新的RIP,将返回地址推送到堆栈上。movsb/w/d/q
:读取DS:(E)SI
,将其写入ES:(E)DI
(或在64位模式下为RSI和RDI)。两者都是隐含的;只有DS
段寄存器可以被覆盖。可与rep
一起使用。cmpsb/w/d/q
:读取DS:(E)SI
和ES:(E)DI
(或在64位模式下为RSI和RDI)。两者都是隐含的;只有DS
段寄存器可以被覆盖。可与repe
/repne
一起使用。
MPX bndstx mib, bnd
:"将边界存储在bnd中,并将mib的索引寄存器中的指针值存储到使用mib的基地址进行地址转换的边界表项(BTE)中。" 操作部分显示了一次加载和存储操作,但我对MPX知之甚少,无法理解。
movdir64b r16/r32/r64, m512
。拥有自己的特性位,在即将推出的Tremont(Goldmont Plus Atom的继任者)中可用。将64字节作为直接存储(WC)以64字节写原子性从源内存地址移动到目标内存地址。目标操作数是来自ModRM的(对齐的原子)es:
/r
,源是(非对齐非原子)来自ModRM的/m
。
使用写合并进行存储,请参阅描述。这是x86 CPU供应商首次保证8字节之外的原子性,而不需要使用lock cmpxchg16b
。但不幸的是,它实际上并不适合多线程,因为它强制执行类似于NT的缓存驱逐/旁路行为,因此其他核心将不得不从DRAM中读取它,而不是从共享的外部缓存中读取。
AVX2 gather 和 AVX512 scatter 指令是有争议的。它们显然会执行多次加载和存储操作,但所有指针都来自于一个 SIMD 向量(以及一个标量基地址)。
我没有计算诸如 pusha
、fldenv
、xsaveopt
, iret
或嵌套级别 > 1 的 enter
等进行多个连续块的存储或加载的指令。
我也不会计算 ins
/ outs
字符串指令,因为它们将内存复制到 / 从 I/O 空间。I/O 空间不是内存。
我没有查看 http://felixcloutier.com/x86/index.html 上的 VMX 或 SGX 指令列表,只是主要列表。我不认为我错过了任何内容,但我当然可能有所疏漏。
vpblendvb
/vblendvps/pd
,但仍然只能使用一个内存。x86 CPU有什么样的地址指令?请注意,https://www.felixcloutier.com/x86/ 只是从英特尔的PDF手册中提取的。 - Peter Cordes
movsb
、movsw
和movsd
这几个字符串指令。不过它们的内存操作数是隐式的。 - fuzlock cmpxchg16b
以外的任何其他东西?)在实践中,SKX可能具有64字节的载入/存储原子性,但没有干净的方法来利用更大的无锁原子对象,因为没有保证的方法来检测它。所以太糟糕了,movdir64b
只能用于绕过缓存的版本中,这可能会降低在线程之间共享数据时的性能。 - Peter Cordes