assembly 如何在x86汇编中写入从N位内存位置加载的512位向量操作数

kulphzqa  于 2023-03-23  发布在  其他
关注(0)|答案(2)|浏览(151)

源英特尔手册在这里: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操作数的情况下该怎么办。

qncylg1j

qncylg1j1#

它因汇编程序而异。一些支持slides from a 2014 talk中的{1to16}/{1to8}/{1to4}语法,该语法由Intel的Kirill Yukhin在GCC会议上介绍AVX-512。(尽管这是一个GCC演讲,但幻灯片使用Intel语法。)其他人支持该语法和/或其他语法。

  • MASM:vminps zmm1, zmm2, DWORD bcst [rax]
  • NASM vminps zmm1, zmm2, [rax] {1to16}(可选的dwordqword说明符在通常的地方,如dword [rax]{1to16} NASM不支持bcst关键字。
  • €ASM aka Euro Assembly:vminps ymm1,ymm2,[rax],Bcst=on
  • GAS/clang .intel_syntax通常与MASM类似,支持dword bcst [rax]。但也支持[rax]{1to16}。(objdump -drwC -Mintel使用dword bcst [rax]
  • AT&T语法: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,在{}前多加一个逗号)

xwmevbvl

xwmevbvl2#

指定的指令可以写成VMINPS ZMM1, ZMM2, DWORD bcst [EAX]
此处可以看到一个示例

相关问题