什么是 JKZD 和 JKNZD?

What are JKZD and JKNZD?

通过 Zydis ( https://github.com/zyantific/zydis/blob/57be5b1d1b9dd99830b89caac928add64ad5d072/include/Zydis/Generated/EnumMnemonic.h ) 助记符我发现了这些:

ZYDIS_MNEMONIC_JKNZD,
ZYDIS_MNEMONIC_JKZD,

我在别处找不到这些助记词;它们代表什么指令?

这些指令执行什么操作?

ZNZ 可能分别表示零和非零,J 可能代表跳跃,但是 KD?

编辑:我找到了这份旧的英特尔文档,但没有任何意义:

http://www.cism.ucl.ac.be/Services/Formations/ICS/ics_2013.0.028/vtune_amplifier_xe/documentation/en/instructions/327364001EN.pdf

它指出(第 75 页)JKZD 编码为 VEX.NDS.128.0F.W0 84 id.

您已经用那个 Intel Knight's Corner 回答了您自己的问题 link。 KNC 有自己的版本,后来成为 AVX-512,具有不兼容的 machine-code 编码。

如 Intel 手册中所述,KNC 有类似 jrcxz 的指令,但对于掩码寄存器(KNC 和 AVX-512 调用 k0..k7)可以让你在一条指令中 compare-and-branch在矢量 compare-into-mask 结果上。 JKZD - 如果掩码为零,则跳近。它有 2 种形式,jkzd k1, rel32jkzd k1, rel8

这些不是标准说明,不会出现在英特尔的主流手册(包括 AVX-512)中。在 AVX-512 中,您使用 ktest k1,k1kortest k1,k1 在掩码寄存器值上分支以设置常规 FLAGS,然后使用常规分支条件。 (通过展开以获得 2 个矢量比较结果,您可以在 上分支 non-zero 和 kortest k1,k2 以及 2 个单独的寄存器。)