4

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

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

从到目前为止我可以推断出的, x86_64 指令movntdq大致相当于stnp,并且是写组合。从那看来,似乎movdir64b就像一个原子商店中的四个,因此我猜测st64b.

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

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

4

1 回答 1

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);

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

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

STNP这些指令与 ARM和 x86完全不同MOVNTDQ。x86 中对应的指令是MOVDIR64BENQCMDENQCMDS。尽管 ARM 和 x86 之间存在重大差异。如果您打算就目的而非行为而言,那么您在这些说明之间所做的“心理等价”是可以的。

于 2022-02-17T01:40:34.230 回答