ST64B 和 MOVDIR64B 的临时性

Mon*_*nad 4 assembly x86-64 cpu-architecture arm64 micro-architecture

x86_64 有一条指令movdir64b,据我了解,它是 64 字节(高速缓存行)的非临时副本(好吧,至少是存储)。AArch64 似乎有类似的指令st64b,它执行相同大小的原子存储。但是,官方 ARMv9 文档并不清楚 是否st64b也是非临时存储。

英特尔的指令集参考文档要movdir64b详细得多,但我的研究还不够深入,无法完全理解每种内存类型协议所代表的含义。

据我目前所知, x86_64 指令movntdq大致相当于stnp, ,并且是写组合。由此看来,似乎就像movdir64b一个原子存储中的四个,因此我对 的猜测st64b

这几乎肯定是对实际情况的过度简化(当然,可能是错误/不准确的),但这是迄今为止可以推断出的。

是否st64b可以将其视为四个stnp指令的原子序列,以这种方式作为缓存行的非临时写入?

Had*_*ais 5

ST64B//指令旨在有效地将工作项添加到支持该接口的 I/O 设备的工作队列中ST64BVST64BV0当目标地址映射到 I/O 设备时,存储将被转换为非发布写入事务,这意味着必须有一个包含文档中描述的状态代码的完成消息。该ST64B指令只是丢弃状态代码,而其他两条指令将其存储在操作数指定的寄存器中Xs

如果您查看伪代码,这些指令要求目标地址位于不可缓存的内存中:

if acctype == AccType_ATOMICLS64 && memattrs.memtype == MemType_Normal then
    if memattrs.inner.attrs != MemAttr_NC || memattrs.outer.attrs != MemAttr_NC then
        fault.statuscode = Fault_Exclusive;
        return (fault, AddressDescriptor UNKNOWN);
Run Code Online (Sandbox Code Playgroud)

否则,生成的状态代码为0xFFFFFFFF_FFFFFFFF,如文档中所述,这表明目标地址不支持原子 64 字节存储。请注意,这与表示失败的状态代码 1 不同。发生这种情况的原因有多种。例如,目标设备的工作队列已满。

我对伪代码的理解是,只要目标地址位于不可缓存的内存中,这些指令就可以在普通内存和设备内存上使用。您应该通过检查状态代码来通过实验检查它们是否真的在正常内存上工作。

这些指令与 ARMSTNP和 x86完全不同MOVNTDQ。x86 中对应的指令是MOVDIR64BENQCMD、 和ENQCMDS。尽管 ARM 和 x86 之间存在重大差异。如果你的目的是为了目的而不是行为,那么你在这些指令之间做出的“心理对等”是可以的。