Ser*_*tch 2 c c++ assembly intrinsics cpu-cache
x86_64 上是否有针对 32 位和 64 位值的非临时加载(即直接从 DRAM 加载,无需缓存)的 C/C++ 内在函数?
我的编译器是MSVC++2017工具集v141。但其他编译器的内在函数以及对底层汇编指令的引用也是受欢迎的。
截至撰写本文时(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 寄存器中。
| 归档时间: |
|
| 查看次数: |
3721 次 |
| 最近记录: |