CLWB

缓存行回写

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
66 0F AE /6CLWB m8 Op/En M ModRM:r/m (w)M有效有效写入包含 m8 的已修改缓存行, 并可能在未修改状态下保留缓存结构中的行。 在 struction Opera nd Encoding1 操作数 1 操作数 2 操作数 3 操作数 4 N/A N/A N/A

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

M

  1. modrm.rm escrituraModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

实测开销

正在从 arch-data 加载实测数据...

说明

从缓存一致性域中缓存层次的任意级别写入包含以 内存操作数 指定的线性地址的缓存行(如果修改了),返回内存. 该行可能在未修改状态的缓存等级中保留. 保留缓存层级中的行是一种性能优化(作为硬件的提示处理),以减少在后续访问中缓存丢失的可能性. 硬件可能选择在缓存层级中的任何一级保留线条,在某些情况下可能会使缓存层级中的线条无效. 源操作数是一个字节内存位置.

CLWB指令的可用性由CPUID.07H.00H:EBX.CLWB[24]表示. 受影响的对齐缓存行大小也用CPUID.01H:EBX[15:8]中的值表示.

包含受影响行的页面的内存属性对本指令的行为没有影响. 应当指出的是,处理器可以自由地从系统内存区域投机获取和缓存数据,这些区域被分配到一种内存类型,允许投机读取(如WB,WC,和WT内存类型). PREFETCHh 指令可用于为处理器提供这种投机行为的提示. 由于这种投机性抓取可以随时发生,并且不与指令执行捆绑,CLWB指令没有针对PREFETCHh指令或任何投机性抓取机制(即数据可以在CLWB指令执行之前,期间或执行之后被投机性地加载到缓存行中,引用缓存行)的命令.

CLWB指令的执行命令涉及栅栏指示和锁定的读-修改-写指示;还涉及往回写缓存行的旧写。 对CLWB的其他处决,对CLFLUSH和CLFLUSHOPT的处决,或对小于写回的缓存行,都没有下达命令。 软件可以使用SFENCE指令命令执行CLWB相对于其中一项操作.

对于仅要求从缓存行回写修改后的数据到内存(不要求该行无效)并期望随后访问数据的用法,建议软件使用CLWB(带有适当的栅栏)而不是CLFLUSH或CLFLUSHOPT来改进性能.

CLWB指令可以在所有特权级别使用,并受所有权限检查和与字节负载相关的断层. 和负载一样,CLWB指令设定了访问的旗帜,而不是页面表中的脏旗.

在一些执行中,CLWB指令可能总是用交易同步扩展(TSX)导致交易中止. CLWB指令预计不会在典型的交易区域内被普遍使用. 然而,程序员不得依赖CLWB指令强制交易中止,因为他们是否导致交易中止取决于执行.

行动

Cache_Line_Write_Back(m8);

1. The Mod field of the ModR/M byte cannot have value 11B.

受影响的旗帜

None.

C/C++ 编译器内置等效CLWB空格 mm clwb(void const *p);

异常

保护模式
#UD如果使用 LOCK 前缀。如果 CPUID.07H.00H: EBX.CLWB[24] = 0.
#GP(0)对于非法的内存操作数在CS,DS,ES,FS或GS部分的有效地址.
#SS(0)用于在党卫军部分的一个非法地址. #PF(fault-code) for a 页面错误.
实地址模式
#UD如果使用 LOCK 前缀。如果 CPUID.07H.00H: EBX.CLWB[24] = 0.
#GP如果操作数的任何部分位于有效地址空间之外,从0到FFFFH.
虚拟 8086 模式
与真实地址模式相同的例外 。
兼容模式
与保护模式中的例外相同.
64 位模式
#UD如果使用 LOCK 前缀。如果 CPUID.07H.00H: EBX.CLWB[24] = 0.
#SS(0)如果引用SS部分的内存地址是非冠状的.
#GP(0)如果内存地址为非冠状形式. #PF(fault-code) for a 页面错误.

来源