首页 > 解决方案 > 什么是 JKZD 和 JKNZD?

问题描述

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

ZYDIS_MNEMONIC_JKNZD,
ZYDIS_MNEMONIC_JKZD,

我在其他任何地方都找不到这些助记符;它们代表什么指令?

这些指令执行什么操作?

Z并且NZ可能分别表示零和非零,并且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。

标签: assemblyx86x86-64disassemblyxeon-phi

解决方案


您已经通过 Intel Knight's Corner 链接回答了您自己的问题。KNC 有自己的版本,后来成为 AVX-512,具有不兼容的机器代码编码。

正如英特尔手册中所述,KNC 有类似jrcxz但用于掩码寄存器(KNC 和 AVX-512 调用k0..k7)的指令,可让您在向量比较到掩码结果的一条指令中进行比较和分支。JKZD - 如果掩码为零,则跳近。它有 2 种形式,jkzd k1, rel32并且jkzd k1, rel8

这些不是标准指令,也不会出现在英特尔的主流手册(包括 AVX-512)中。ktest k1,k1在 AVX-512 中,您使用或设置常规 FLAGS在掩码寄存器值上进行kortest k1,k1分支,然后使用常规分支条件。(展开以获得 2 个向量比较结果,您可以使用 2 个单独的寄存器在其中任何一个非零的情况下进行分支。)kortest k1,k2


推荐阅读