#9638·ghidra

x86: Support for AVX NE-CONVERT and VNNI

Author: CUB3DCreated Sep 14, 2026Updated Sep 16, 2026
LabelsFeature: Processor/x86Status: Triage

Is your feature request related to a problem? Please describe. Ghidra currently can't disassemble the following instructions from the AVX_NE_CONVERT, AVX_VNNI_INT8 and AVX_VNNI_INT16 extensions.

Example:

int main() {
    asm("VCVTNEEBF162PS (%rax), %ymm0");
    asm("VCVTNEEBF162PS (%rax), %xmm0");
    asm("VBCSTNEBF162PS (%rax), %xmm0");
    asm("VBCSTNEBF162PS (%rax), %ymm0");
    asm("VCVTNEEPH2PS (%rax), %ymm0");
    asm("VCVTNEEPH2PS (%rax), %xmm0");
    asm("VCVTNEOBF162PS (%rax), %xmm0");
    asm("VCVTNEOBF162PS (%rax), %ymm0");
    asm("VCVTNEOPH2PS (%rax), %ymm0");
    asm("VCVTNEOPH2PS (%rax), %xmm0");
    asm("VBCSTNEBF162PS (%rax), %ymm0");
    asm("VBCSTNEBF162PS (%rax), %xmm0");
    asm("VBCSTNESH2PS (%rax), %ymm0");
    asm("VBCSTNESH2PS (%rax), %xmm0");

    asm("VPDPBSSD (%rax), %xmm0, %xmm1");
    asm("VPDPBSSD %xmm0, %xmm1, %xmm2");
    asm("VPDPBSSD (%rax), %ymm0, %ymm1");
    asm("VPDPBSSD %ymm0, %ymm1, %ymm2");

    asm("VPDPBSSDS (%rax), %xmm0, %xmm1");
    asm("VPDPBSSDS %xmm0, %xmm1, %xmm2");
    asm("VPDPBSSDS (%rax), %ymm0, %ymm1");
    asm("VPDPBSSDS %ymm0, %ymm1, %ymm2");

    asm("VPDPBSUD (%rax), %xmm0, %xmm1");
    asm("VPDPBSUD %xmm0, %xmm1, %xmm2");
    asm("VPDPBSUD (%rax), %ymm0, %ymm1");
    asm("VPDPBSUD %ymm0, %ymm1, %ymm2");

    asm("VPDPBSUDS (%rax), %xmm0, %xmm1");
    asm("VPDPBSUDS %xmm0, %xmm1, %xmm2");
    asm("VPDPBSUDS (%rax), %ymm0, %ymm1");
    asm("VPDPBSUDS %ymm0, %ymm1, %ymm2");

    asm("VPDPBUUD (%rax), %xmm0, %xmm1");
    asm("VPDPBUUD %xmm0, %xmm1, %xmm2");
    asm("VPDPBUUD (%rax), %ymm0, %ymm1");
    asm("VPDPBUUD %ymm0, %ymm1, %ymm2");

    asm("VPDPBUUDS (%rax), %xmm0, %xmm1");
    asm("VPDPBUUDS %xmm0, %xmm1, %xmm2");
    asm("VPDPBUUDS (%rax), %ymm0, %ymm1");
    asm("VPDPBUUDS %ymm0, %ymm1, %ymm2");

    asm("VPDPWSSD (%rax), %xmm0, %xmm1");
    asm("VPDPWSSD %xmm0, %xmm1, %xmm2");
    asm("VPDPWSSD (%rax), %ymm0, %ymm1");
    asm("VPDPWSSD %ymm0, %ymm1, %ymm2");

    asm("VPDPWSSDS (%rax), %xmm0, %xmm1");
    asm("VPDPWSSDS %xmm0, %xmm1, %xmm2");
    asm("VPDPWSSDS (%rax), %ymm0, %ymm1");
    asm("VPDPWSSDS %ymm0, %ymm1, %ymm2");

    asm("VPDPWSUD (%rax), %xmm0, %xmm1");
    asm("VPDPWSUD %xmm0, %xmm1, %xmm2");
    asm("VPDPWSUD (%rax), %ymm0, %ymm1");
    asm("VPDPWSUD %ymm0, %ymm1, %ymm2");

    asm("VPDPWSUDS (%rax), %xmm0, %xmm1");
    asm("VPDPWSUDS %xmm0, %xmm1, %xmm2");
    asm("VPDPWSUDS (%rax), %ymm0, %ymm1");
    asm("VPDPWSUDS %ymm0, %ymm1, %ymm2");
   
    asm("VPDPWUSD (%rax), %xmm0, %xmm1");
    asm("VPDPWUSD %xmm0, %xmm1, %xmm2");
    asm("VPDPWUSD (%rax), %ymm0, %ymm1");
    asm("VPDPWUSD %ymm0, %ymm1, %ymm2");

    asm("VPDPWUSDS (%rax), %xmm0, %xmm1");
    asm("VPDPWUSDS %xmm0, %xmm1, %xmm2");
    asm("VPDPWUSDS (%rax), %ymm0, %ymm1");
    asm("VPDPWUSDS %ymm0, %ymm1, %ymm2");

    asm("VPDPWUUD (%rax), %xmm0, %xmm1");
    asm("VPDPWUUD %xmm0, %xmm1, %xmm2");
    asm("VPDPWUUD (%rax), %ymm0, %ymm1");
    asm("VPDPWUUD %ymm0, %ymm1, %ymm2");

    asm("VPDPWUUDS (%rax), %xmm0, %xmm1");
    asm("VPDPWUUDS %xmm0, %xmm1, %xmm2");
    asm("VPDPWUUDS (%rax), %ymm0, %ymm1");
    asm("VPDPWUUDS %ymm0, %ymm1, %ymm2");
   
    return 0;
}

Build with clang -c -O3 test.c test.zip

Describe the solution you'd like Support for disassembling these instructions.

Describe alternatives you've considered Multiple other decompilers and disassemblers support these instructions.

Source: NationalSecurityAgency/ghidra