问题描述
通过Zydis(https://github.com/zyantific/zydis/blob/57be5b1d1b9dd99830b89caac928add64ad5d072/include/Zydis/Generated/EnumMnemonic.h)助记符,我发现了这些:
ZYDIS_MNEMONIC_JKNZD,ZYDIS_MNEMONIC_JKZD,
在其他任何地方都找不到这些助记符;它们代表什么指示?
这些说明会执行哪些操作?
Z
和NZ
可能分别表示零和不为零,并且J
可能表示跳跃,但是K
和D
?
编辑:我找到了这个旧的intel文档,但这没有任何意义:
声明(第75页)JKZD被编码为VEX.NDS.128.0F.W0 84 id。
解决方法
您已经使用该Intel Knight's Corner链接回答了自己的问题。 KNC拥有自己的后来的AVX-512版本,具有不兼容的机器代码编码。
如该英特尔手册中所述,KNC的指令类似于jrcxz
,但掩码寄存器(KNC和AVX-512称为k0..k7
)使您可以在一个指令上进行比较和分支。向量比较掩码结果。 JKZD-如果mask为零,则跳近。它有两种形式,jkzd k1,rel32
和jkzd k1,rel8
这些不是标准说明,不会出现在Intel的主流手册(包括AVX-512)中。在AVX-512中,使用ktest k1,k1
或kortest k1,k1
在掩码寄存器值上分支以设置常规标记,然后使用常规分支条件。 (通过展开以获得2个向量比较结果,您可以使用带有两个单独寄存器的kortest k1,k2
将它们中的 设为非零)。