用于 x86_64 上 32 位和 64 位值的非临时加载的 C/C++ 内在函数?

Ser*_*tch 2 c c++ assembly intrinsics cpu-cache

x86_64 上是否有针对 32 位和 64 位值的非临时加载(即直接从 DRAM 加载,无需缓存)的 C/C++ 内在函数?

我的编译器是MSVC++2017工具集v141。但其他编译器的内在函数以及对底层汇编指令的引用也是受欢迎的。

Mar*_*oom 5

截至撰写本文时(2017 年 8 月),GP 寄存器没有非临时负载


唯一可用的非临时指令是:

整数域

(v)movntdqa (加载)尽管名称如此,该指令将 128/256/512 位(在其自然边界上对齐)xmm/ymm/zmm分别移动到寄存器中。
(v)movntdq (存储)尽管名称如此,但该指令将xmm/ymm/zmm寄存器移动到 128/256/512 位,并在其自然边界、内存位置上对齐。

全科医生登记册

movnti (store)将 32/64 位 GP 寄存器存储到内存中的 DWORD/QWORD 中。

MMX寄存器

movntq (store)将 MMX 寄存器存储到内存中的 QWORD 中。

浮点域

(v)movntpd/s (存储) (传统和 VEX 编码)将寄存器存储xmm/ymm/zmm到对齐的 128/256/512 位内存位置。类似movntdq,但在 FP 域中。

(v)movntpd/s (存储) (EVEX 编码)将寄存器存储xmm/ymm/zmm到对齐的 512 位内存位置,清除高位未使用的位。类似movntdq,但在 FP 域中。
英特尔手册在这方面是矛盾的

蒙面 movs

(v)maskmovdqu (store)xmm根据掩码将一个寄存器的字节存储到另一个xmm寄存器中。

(v)maskmovq (store)根据掩码将一个 MMX 寄存器的字节存储到另一个 MMX 寄存器中。