源英特尔手册在这里:https://cdrdv2.intel.com/v1/dl/getContent/671110
The registers are specified as m32bcst or m64bcst
Example of an instruction that has a variant that uses this operand
我对编写在实际汇编中使用此操作数的指令的变体感兴趣。
如果不是操作数m32 bcst,我们有一个操作数为m32的变体,例如使用MASM汇编,可以写:VMINPS YMM1{k1}{z}、YMM2、DWORD PTR[EAX]
但是,我不知道在m32 bcst操作数的情况下该怎么办。
2条答案
按热度按时间qncylg1j1#
它因汇编程序而异。一些支持slides from a 2014 talk中的
{1to16}
/{1to8}
/{1to4}
语法,该语法由Intel的Kirill Yukhin在GCC会议上介绍AVX-512。(尽管这是一个GCC演讲,但幻灯片使用Intel语法。)其他人支持该语法和/或其他语法。vminps zmm1, zmm2, DWORD bcst [rax]
vminps zmm1, zmm2, [rax] {1to16}
(可选的dword
或qword
说明符在通常的地方,如dword [rax]{1to16}
NASM不支持bcst
关键字。vminps ymm1,ymm2,[rax],Bcst=on
.intel_syntax
通常与MASM类似,支持dword bcst [rax]
。但也支持[rax]{1to16}
。(objdump -drwC -Mintel
使用dword bcst [rax]
)vminps (%rax){1to16},%zmm2,%zmm1
机器码只有1位来编码广播和常规,因此无法广播
vminps
的64位浮点数对;广播元素大小必须匹配SIMD元素大小。因此,€ASM的最小语法就足够了;其他的仅仅为汇编器提供了一种方法来检查人类认为指令将做什么的不匹配。与embedded rounding + suppress-all-exceptions不同,embedded rounding + suppress-all-exceptions只适用于标量(如
vmulss
)或512位指令1,广播内存操作数 * 也适用于256和128位位向量(AVX 512 VL)。支持32位和64位的广播元素大小;并非巧合的是,这些是Intel CPU上的加载端口可以作为加载uop的一部分免费完成的元素大小。(注意,
vpbroadcastb/w vec, [mem]
需要ALU uop,vpbroadcastd/q
只需要加载uop。)脚注1:例如
vmulps zmm0,zmm1,zmm2{rz-sae}
(GAS .intel_syntax / MASM)或
vmulps zmm0, zmm1, zmm2, {rz-sae}
(NASM,在{}前多加一个逗号)xwmevbvl2#
指定的指令可以写成
VMINPS ZMM1, ZMM2, DWORD bcst [EAX]
此处可以看到一个示例