diff options
Diffstat (limited to 'src/arch/x86/isa')
-rw-r--r-- | src/arch/x86/isa/bitfields.isa | 9 | ||||
-rw-r--r-- | src/arch/x86/isa/decoder/decoder.isa | 1 | ||||
-rw-r--r-- | src/arch/x86/isa/decoder/vex_opcodes.isa | 1431 |
3 files changed, 1441 insertions, 0 deletions
diff --git a/src/arch/x86/isa/bitfields.isa b/src/arch/x86/isa/bitfields.isa index e2751a8ef..b5121f4e3 100644 --- a/src/arch/x86/isa/bitfields.isa +++ b/src/arch/x86/isa/bitfields.isa @@ -87,3 +87,12 @@ def bitfield STACKSIZE stackSize; def bitfield MODE mode; def bitfield MODE_MODE mode.mode; def bitfield MODE_SUBMODE mode.submode; + +def bitfield VEX_R vex.first.r; +def bitfield VEX_X vex.first.x; +def bitfield VEX_B vex.first.b; +def bitfield VEX_MAP vex.first.map_select; +def bitfield VEX_W vex.second.w; +def bitfield VEX_VVVV vex.second.vvvv; +def bitfield VEX_L vex.second.l; +def bitfield VEX_PP vex.second.pp; diff --git a/src/arch/x86/isa/decoder/decoder.isa b/src/arch/x86/isa/decoder/decoder.isa index eaa579817..07006fe1a 100644 --- a/src/arch/x86/isa/decoder/decoder.isa +++ b/src/arch/x86/isa/decoder/decoder.isa @@ -49,6 +49,7 @@ decode LEGACY_LOCK default Unknown::unknown() ##include "two_byte_opcodes.isa" ##include "three_byte_0f38_opcodes.isa" ##include "three_byte_0f3a_opcodes.isa" + ##include "vex_opcodes.isa" } //Lock prefix ##include "locked_opcodes.isa" diff --git a/src/arch/x86/isa/decoder/vex_opcodes.isa b/src/arch/x86/isa/decoder/vex_opcodes.isa new file mode 100644 index 000000000..0f412feee --- /dev/null +++ b/src/arch/x86/isa/decoder/vex_opcodes.isa @@ -0,0 +1,1431 @@ +// Copyright (c) 2015 Mark D. Hill and David A. Wood +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer; +// redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution; +// neither the name of the copyright holders nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Authors: Nilay Vaish + +//////////////////////////////////////////////////////////////////// +// +// Decode the opcodes with vex prefix. +// +format WarnUnimpl { + 'X86ISA::Vex': decode VEX_MAP { + 0x01: decode OPCODE_OP_TOP5 { + 0x02: decode VEX_PP { + 0x0: decode OPCODE_OP_BOTTOM3 { + 0x0: decode VEX_VVVV { + 0x15: vmovups(); + default: Inst::UD2(); + } + 0x1: decode VEX_VVVV { + 0x15: vmovups(); + default: Inst::UD2(); + } + 0x2: decode VEX_L { + 0x0: decode MODRM_MOD { + 0x03: vmovhlps(); + default: decode VEX_VVVV { + 0x15: vmovlps(); + default: Inst::UD2(); + } + } + default: Inst::UD2(); + } + 0x3: decode VEX_VVVV { + 0x15: decode VEX_L { + 0x0: vmovlps(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + 0x4: vunpcklps(); + 0x5: vunpckhps(); + 0x6: decode VEX_L { + 0x0: decode MODRM_MOD { + 0x03: vmovlhps(); + 0x0: vmovhps(); + } + default: Inst::UD2(); + } + 0x7: decode VEX_L { + 0x0: vmovhps(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: decode VEX_VVVV { + 0x15: vmovupd(); + default: Inst::UD2(); + } + 0x1: decode VEX_VVVV { + 0x15: vmovupd(); + default: Inst::UD2(); + } + 0x2: decode VEX_L { + 0x0: vmovlpd(); + default: Inst::UD2(); + } + 0x3: decode VEX_L { + 0x0: vmovlpd(); + default: Inst::UD2(); + } + 0x4: vunpcklpd(); + 0x5: vunpckhpd(); + 0x6: decode VEX_L { + 0x0: vmovhpd(); + default: Inst::UD2(); + } + 0x7: decode VEX_L { + 0x0: vmovhpd(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x2: decode OPCODE_OP_BOTTOM3 { + 0x0: decode MODRM_MOD { + 0x03: vmovss(); + default: vmovss(); + } + 0x1: decode MODRM_MOD { + 0x03: vmovss(); + default: vmovss(); + } + 0x2: decode VEX_VVVV { + 0x15: vmovsldup(); + default: Inst::UD2(); + } + 0x6: decode VEX_VVVV { + 0x15: vmovshdup(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x3: decode OPCODE_OP_BOTTOM3 { + 0x0: decode MODRM_MOD { + 0x03: vmovsd(); + default: vmovsd(); + } + 0x1: decode MODRM_MOD { + 0x03: vmovsd(); + default: vmovsd(); + } + 0x2: decode VEX_VVVV { + 0x15: decode VEX_L { + 0x0: vmovddup(); + default: vmovddup(); + } + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x0A: decode VEX_PP { + 0x0: decode OPCODE_OP_BOTTOM3 { + 0x0: decode VEX_VVVV { + 0x15: vmovmskps(); + default: Inst::UD2(); + } + 0x1: decode VEX_VVVV { + 0x015: vsqrtps(); + default: Inst::UD2(); + } + 0x2: decode VEX_VVVV { + 0x15: vrsqrtps(); + default: Inst::UD2(); + } + 0x3: decode VEX_VVVV { + 0x15: vrcpps(); + default: Inst::UD2(); + } + 0x4: vandps(); + 0x5: vandnps(); + 0x6: vorps(); + 0x7: vxorps(); + default: Inst::UD2(); + } + + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: decode VEX_VVVV { + 0x15: vmovmskpd(); + default: Inst::UD2(); + } + 0x1: decode VEX_VVVV { + 0x15: vsqrtpd(); + default: Inst::UD2(); + } + 0x4: vandpd(); + 0x5: vandnpd(); + 0x6: vorpd(); + 0x7: vxorpd(); + default: Inst::UD2(); + } + + 0x2: decode OPCODE_OP_BOTTOM3 { + 0x1: vsqrtss(); + 0x2: vrsqrtss(); + 0x3: vrcpss(); + default: Inst::UD2(); + } + + 0x3: decode OPCODE_OP_BOTTOM3 { + 0x1: vsqrtsd(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x0C: decode VEX_PP { + 0x1: decode VEX_L { + 0x0: decode OPCODE_OP_BOTTOM3 { + 0x0: vpunpcklbw(); + 0x1: vpunpcklwd(); + 0x2: vpunpckldq(); + 0x3: vpacksswb(); + 0x4: vpcmpgtb(); + 0x5: vpcmpgtw(); + 0x6: vpcmpgtd(); + 0x7: vpackuswb(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x0E: decode VEX_PP { + 0x0: decode OPCODE_OP_BOTTOM3 { + 0x7: decode VEX_L { + 0x0: vzeroupper(); + 0x1: vzeroall(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: decode VEX_VVVV { + 0x15: vpshufd(); + default: Inst::UD2(); + } + 0x1: decode VEX_L { + 0x0: decode MODRM_REG { + 0x2: vpsrlw(); + 0x4: vpsraw(); + 0x6: vpsllw(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x2: decode VEX_L { + 0x0: decode MODRM_REG { + 0x2: vpsrld(); + 0x4: vpsrad(); + 0x6: vpslld(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x3: decode VEX_L { + 0x0: decode MODRM_REG { + 0x2: vpsrlq(); + 0x3: vpsrldq(); + 0x6: vpsllq(); + 0x7: vpslldq(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x4: decode VEX_L { + 0x0: vpcmpeqb(); + default: Inst::UD2(); + } + + 0x5: decode VEX_L { + 0x0: vpcmpeqw(); + default: Inst::UD2(); + } + 0x6: decode VEX_L { + 0x0: vpcmpeqd(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + 0x2: decode OPCODE_OP_BOTTOM3 { + 0x0: decode VEX_VVVV { + 0x15: decode VEX_L { + 0x0: vpshufhw(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + default: Inst::UD2(); + } + 0x3: decode OPCODE_OP_BOTTOM3 { + 0x0: decode VEX_VVVV { + 0x15: decode VEX_L { + 0x0: vpshuflw(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x18: decode VEX_PP { + 0x0: decode OPCODE_OP_BOTTOM3 { + 0x2: vcmpccps(); + 0x6: vshufps(); + default: Inst::UD2(); + } + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x2: vcmpccpd(); + 0x4: decode MODRM_MOD { + 0x03: vpinsrw(); + default: vpinsrw(); + } + 0x5: decode VEX_VVVV { + 0x15: decode VEX_L { + 0x0: vpextrw(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + 0x6: vshufpd(); + default: Inst::UD2(); + } + 0x2: decode OPCODE_OP_BOTTOM3 { + 0x2: vcmpccss(); + default: Inst::UD2(); + } + 0x3: decode OPCODE_OP_BOTTOM3 { + 0x2: vcmpccsd(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x1A: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vaddsubpd(); + 0x1: decode VEX_L { + 0x0: vpsrlw(); + default: Inst::UD2(); + } + 0x2: decode VEX_L { + 0x0: vpsrld(); + default: Inst::UD2(); + } + 0x3: decode VEX_L { + 0x0: vpsrlq(); + default: Inst::UD2(); + } + 0x4: decode VEX_L { + 0x0: vpaddq(); + default: Inst::UD2(); + } + 0x5: decode VEX_L { + 0x0: vpmullw(); + default: Inst::UD2(); + } + 0x6: decode VEX_VVVV { + 0x15: decode VEX_L { + 0x0: vmovq(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + 0x7: decode VEX_VVVV { + 0x15: vpmovmskb(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + 0x3: decode OPCODE_OP_BOTTOM3 { + 0x0: vaddsubps(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x1C: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: decode VEX_L { + 0x0: vpavgb(); + default: Inst::UD2(); + } + 0x1: vpsraw(); + 0x2: vpsrad(); + 0x3: decode VEX_L { + 0x0: vpavgw(); + default: Inst::UD2(); + } + 0x4: vpmulhuw(); + 0x5: vpmulhw(); + 0x6: vcvttpd2dq(); + 0x7: decode VEX_VVVV { + 0x015: decode VEX_L { + 0x0: vmovntdq(); + default: vmovntdq(); + } + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x2: decode OPCODE_OP_BOTTOM3 { + 0x6: vcvtdq2pd(); + default: Inst::UD2(); + } + + 0x3: decode OPCODE_OP_BOTTOM3 { + 0x6: vcvtpd2dq(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x1E: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x1: vpsllw(); + 0x2: vpslld(); + 0x3: vpsllq(); + 0x4: vpmuludq(); + 0x5: vpmaddwd(); + 0x6: vpsadbw(); + 0x7: decode VEX_L { + 0x0: vmaskmovdqu(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x3: decode OPCODE_OP_BOTTOM3 { + 0x0: decode VEX_L { + 0x0: vlddqu(); + default: vlddqu(); + } + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x05: decode VEX_PP { + 0x0: decode VEX_VVVV { + 0x15: decode OPCODE_OP_BOTTOM3 { + 0x0: vmovaps(); + 0x1: vmovaps(); + 0x3: vmovntps(); + 0x6: vucomiss(); + 0x7: vcomiss(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x1: decode VEX_VVVV { + 0x15: decode OPCODE_OP_BOTTOM3 { + 0x0: vmovapd(); + 0x1: vmovapd(); + 0x3: vmovntpd(); + 0x6: vucomisd(); + 0x7: vcomisd(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x2: decode OPCODE_OP_BOTTOM3 { + 0x2: vcvtsi2ss(); + 0x4: vcvttss2si(); + 0x5: vcvtss2si(); + default: Inst::UD2(); + } + + 0x3: decode OPCODE_OP_BOTTOM3 { + 0x2: vcvtsi2sd(); + 0x4: vcvttsd2si(); + 0x5: vcvtsd2si(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x0B: decode VEX_PP { + 0x0: decode OPCODE_OP_BOTTOM3 { + 0x0: vaddps(); + 0x1: vmulps(); + 0x2: vcvtps2pd(); + 0x3: vcvtdq2ps(); + 0x4: vsubps(); + 0x5: vminps(); + 0x6: vdivps(); + 0x7: vmaxps(); + default: Inst::UD2(); + } + + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vaddpd(); + 0x1: vmulpd(); + 0x2: vcvtpd2ps(); + 0x3: vcvtps2dq(); + 0x4: vsubpd(); + 0x5: vminpd(); + 0x6: vdivpd(); + 0x7: vmaxpd(); + default: Inst::UD2(); + } + + 0x2: decode OPCODE_OP_BOTTOM3 { + 0x0: vaddss(); + 0x1: vmulss(); + 0x2: vcvtss2sd(); + 0x3: vcvttps2dq(); + 0x4: vsubss(); + 0x5: vminss(); + 0x6: vdivss(); + 0x7: vmaxss(); + default: Inst::UD2(); + } + + 0x3: decode OPCODE_OP_BOTTOM3 { + 0x0: vaddsd(); + 0x1: vmulsd(); + 0x2: vcvtsd2ss(); + 0x4: vsubsd(); + 0x5: vminsd(); + 0x6: vdivsd(); + 0x7: vmaxsd(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x0D: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vpunpckhbw(); + 0x1: vpunpckhbd(); + 0x2: vpunpckhdq(); + 0x3: decode VEX_L { + 0x0: vpackssdw(); + default: Inst::UD2(); + } + 0x4: vpunpcklqdq(); + 0x5: vpunpckhqdq(); + 0x6: decode VEX_L { + 0x0: vmovdvmovq(); + default: Inst::UD2(); + } + 0x7: decode VEX_VVVV { + 0x15: vmovdqa(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x2: decode OPCODE_OP_BOTTOM3 { + 0x7: vmovdqu(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x0F: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x4: vhaddpd(); + 0x5: vhsubpd(); + 0x6: decode VEX_L { + 0x1: vmovdvmovq(); + default: Inst::UD2(); + } + 0x7: decode VEX_VVVV { + 0x15: vmovdqa(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x2: decode OPCODE_OP_BOTTOM3 { + 0x6: decode VEX_L { + 0x0: vmovq(); + default: Inst::UD2(); + } + 0x7: vmovdqu(); + default: Inst::UD2(); + } + + 0x3: decode OPCODE_OP_BOTTOM3 { + 0x4: vhaddps(); + 0x5: vhsubps(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x15: decode VEX_PP { + 0x0: decode OPCODE_OP_BOTTOM3 { + 0x6: decode MODRM_REG { + 0x2: vldmxcsr(); + 0x3: vstmxcsr(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + 0x1B: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vpsubusb(); + 0x1: vpsubusw(); + 0x2: vpminub(); + 0x3: decode VEX_L { + 0x0: vpand(); + default: Inst::UD2(); + } + 0x4: vpaddusb(); + 0x5: decode VEX_L { + 0x0: vpaddusw(); + default: Inst::UD2(); + } + 0x6: vpmaxub(); + 0x7: decode VEX_L { + 0x0: vpandn(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x1D: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vpsubsb(); + 0x1: vpsubsw(); + 0x2: vpminsw(); + 0x3: vpor(); + 0x4: decode VEX_L { + 0x0: vpaddsb(); + default: Inst::UD2(); + } + 0x5: decode VEX_L { + 0x0: vpaddsw(); + default: Inst::UD2(); + } + 0x6: vpmaxsw(); + 0x7: vpxor(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x1F: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vpsubb(); + 0x1: vpsubw(); + 0x2: vpsubd(); + 0x3: vpsubq(); + 0x4: vpaddb(); + 0x5: decode VEX_L { + 0x0: vpaddw(); + default: Inst::UD2(); + } + 0x6: decode VEX_L { + 0x0: vpaddd(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x02: decode OPCODE_OP_TOP5 { + 0x00: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vpshufb(); + 0x1: vphaddw(); + 0x2: vphaddd(); + 0x3: vphaddsw(); + 0x4: vpmaddubsw(); + 0x5: vphsubw(); + 0x6: vphsubd(); + 0x7: vphsubsw(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x02: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x3: vcvtph2ps(); + 0x7: vptest(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x04: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vpmovsxbw(); + 0x1: vpmovsxbd(); + 0x2: vpmovsxbq(); + 0x3: vpmovsxwd(); + 0x4: vpmovsxwq(); + 0x5: vpmovsxdq(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x06: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vpmovzxbw(); + 0x1: vpmovzxbd(); + 0x2: vpmovzxbq(); + 0x3: vpmovzxwd(); + 0x4: vpmovzxwq(); + 0x5: vpmovzxdq(); + 0x7: vpcmpgtq(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x08: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vpmulld(); + 0x1: vphminposuw(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x12: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x6: decode VEX_W { + 0x0: vfmaddsub132ps(); + 0x1: vfmaddsub132pd(); + default: Inst::UD2(); + } + + 0x7: decode VEX_W { + 0x0: vfmsubadd132ps(); + 0x1: vfmaddsub132pd(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x14: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x6: decode VEX_W { + 0x0: vfmaddsub213ps(); + 0x1: vfmaddsub213pd(); + default: Inst::UD2(); + } + + 0x7: decode VEX_W { + 0x0: vfmsubadd213ps(); + 0x1: vfmaddsub213pd(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x16: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x6: decode VEX_W { + 0x0: vfmaddsub231ps(); + 0x1: vfmaddsub231pd(); + default: Inst::UD2(); + } + + 0x7: decode VEX_W { + 0x0: vfmsubadd231ps(); + 0x1: vfmaddsub231pd(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x1E: decode VEX_PP { + 0x0: decode OPCODE_OP_BOTTOM3 { + 0x2: andn(); + 0x3: decode MODRM_REG { + 0x1: blsr(); + 0x2: blsmsk(); + 0x3: blsi(); + default: Inst::UD2(); + } + + 0x7: bextr(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x01: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vpsignb(); + 0x1: vpsignw(); + 0x2: vpsignd(); + 0x3: vpmulhrsw(); + 0x4: vpermilps(); + 0x5: vpermilpd(); + 0x6: vtestps(); + 0x7: vtestpd(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x03: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vbroadcastss(); + 0x1: decode VEX_L { + 0x1: vbroadcastsd(); + default: Inst::UD2(); + } + + 0x2: decode VEX_L { + 0x1: vbroadcastF128(); + default: Inst::UD2(); + } + + 0x4: decode VEX_L { + 0x0: vpabsb(); + default: Inst::UD2(); + } + 0x5: decode VEX_L { + 0x0: vpabsw(); + default: Inst::UD2(); + } + 0x6: decode VEX_L { + 0x0: vpabsd(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x05: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vpmuldq(); + 0x1: vpcmpeqq(); + 0x2: decode VEX_VVVV { + 0x15: vmovntdqa(); + default: Inst::UD2(); + } + 0x3: decode VEX_L { + 0x0: vpackusdw(); + default: Inst::UD2(); + } + 0x4: vmaskmovps(); + 0x5: vmaskmovpd(); + 0x6: vmaskmovps(); + 0x7: vmaskmovpd(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x07: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vpminsb(); + 0x1: vpminsd(); + 0x2: vpminuw(); + 0x3: vpminud(); + 0x4: vpmaxsb(); + 0x5: vpmaxsd(); + 0x6: vpmaxuw(); + 0x7: vpmaxud(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x0B: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x2: vbroadcasti128(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x13: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: decode VEX_W { + 0x0: vfmadd132ps(); + 0x1: vfmadd132pd(); + default: Inst::UD2(); + } + + 0x1: decode VEX_W { + 0x0: vfmadd132ss(); + 0x1: vfmadd132sd(); + default: Inst::UD2(); + } + + 0x2: decode VEX_W { + 0x0: vfmsub132ps(); + 0x1: vfmsub132pd(); + default: Inst::UD2(); + } + + 0x3: decode VEX_W { + 0x0: vfmsub132ss(); + 0x1: vfmsub132sd(); + default: Inst::UD2(); + } + + 0x4: decode VEX_W { + 0x0: vfnmadd132ps(); + 0x1: vfnmadd132pd(); + default: Inst::UD2(); + } + + 0x5: decode VEX_W { + 0x0: vfnmadd132ss(); + 0x1: vfnmadd132sd(); + default: Inst::UD2(); + } + + 0x6: decode VEX_W { + 0x0: vfnsub132ps(); + 0x1: vfnsub132pd(); + default: Inst::UD2(); + } + + 0x7: decode VEX_W { + 0x0: vfnsub132ss(); + 0x1: vfnsub132sd(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x15: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: decode VEX_W { + 0x0: vfmadd213ps(); + 0x1: vfmadd213pd(); + default: Inst::UD2(); + } + + 0x1: decode VEX_W { + 0x0: vfmadd213ss(); + 0x1: vfmadd213sd(); + default: Inst::UD2(); + } + + 0x2: decode VEX_W { + 0x0: vfmsub213ps(); + 0x1: vfmsub213pd(); + default: Inst::UD2(); + } + + 0x3: decode VEX_W { + 0x0: vfmsub213ss(); + 0x1: vfmsub213sd(); + default: Inst::UD2(); + } + + 0x4: decode VEX_W { + 0x0: vfnmadd213ps(); + 0x1: vfnmadd213pd(); + default: Inst::UD2(); + } + + 0x5: decode VEX_W { + 0x0: vfnmadd213ss(); + 0x1: vfnmadd213sd(); + default: Inst::UD2(); + } + + 0x6: decode VEX_W { + 0x0: vfnsub213ps(); + 0x1: vfnsub213pd(); + default: Inst::UD2(); + } + + 0x7: decode VEX_W { + 0x0: vfnsub213ss(); + 0x1: vfnsub213sd(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x17: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: decode VEX_W { + 0x0: vfmadd231ps(); + 0x1: vfmadd231pd(); + default: Inst::UD2(); + } + + 0x1: decode VEX_W { + 0x0: vfmadd231ss(); + 0x1: vfmadd231sd(); + default: Inst::UD2(); + } + + 0x2: decode VEX_W { + 0x0: vfmsub231ps(); + 0x1: vfmsub231pd(); + default: Inst::UD2(); + } + + 0x3: decode VEX_W { + 0x0: vfmsub231ss(); + 0x1: vfmsub231sd(); + default: Inst::UD2(); + } + + 0x4: decode VEX_W { + 0x0: vfnmadd231ps(); + 0x1: vfnmadd231pd(); + default: Inst::UD2(); + } + + 0x5: decode VEX_W { + 0x0: vfnmadd231ss(); + 0x1: vfnmadd231sd(); + default: Inst::UD2(); + } + + 0x6: decode VEX_W { + 0x0: vfnsub231ps(); + 0x1: vfnsub231pd(); + default: Inst::UD2(); + } + + 0x7: decode VEX_W { + 0x0: vfnsub231ss(); + 0x1: vfnsub231sd(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x1B: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x3: vaesimc(); + 0x4: vaesenc(); + 0x5: vaesenclast(); + 0x6: vaesdec(); + 0x7: vaesdeclast(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x03: decode OPCODE_OP_TOP5 { + 0x00: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x4: vpermilps(); + 0x5: vpermilpd(); + 0x6: vperm2f128(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x02: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x4: decode MODRM_MOD { + 0x03: vpextrb(); + default: vpextrb(); + } + + 0x5: decode VEX_VVVV { + 0x15: decode VEX_L { + 0x0: decode MODRM_MOD { + 0x03: vpextrw(); + default: vpextrw(); + } + default: Inst::UD2(); + } + default: Inst::UD2(); + } + 0x6: decode VEX_W { + 0x0: vpextrd(); + 0x1: vpextrq(); + default: Inst::UD2(); + } + 0x7: decode MODRM_MOD { + 0x03: vextractps(); + default: vextractps(); + } + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x04: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: decode MODRM_MOD { + 0x03: vpinsrb(); + default: vpinsrb(); + } + 0x1: decode MODRM_MOD { + 0x03: vinsertps(); + default: vinsertps(); + } + 0x2: decode VEX_W { + 0x0: vpinsrd(); + 0x1: vpinsrq(); + } + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x08: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vdpps(); + 0x1: vdppd(); + 0x2: decode VEX_L { + 0x0: vmpsadbw(); + default: Inst::UD2(); + } + 0x4: vpclmulqdq(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x0C: decode VEX_PP { + 0x1: decode VEX_L { + 0x0: decode OPCODE_OP_BOTTOM3 { + 0x0: decode VEX_VVVV { + 0x15: vpcmpestrm(); + default: Inst::UD2(); + } + 0x1: decode VEX_VVVV { + 0x15: vpcmpestri(); + default: Inst::UD2(); + } + 0x2: vpcmpistrm(); + 0x3: vpcmpistri(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x01: decode VEX_PP { + 0x0: decode OPCODE_OP_BOTTOM3 { + 0x7: palignr(); + default: Inst::UD2(); + } + + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: decode VEX_VVVV { + 0x15: vroundps(); + default: Inst::UD2(); + } + 0x1: decode VEX_VVVV { + 0x15: vroundpd(); + default: Inst::UD2(); + } + 0x2: vroundss(); + 0x3: vroundsd(); + 0x4: vblendps(); + 0x5: vblendpd(); + 0x6: decode VEX_L { + 0x0: vpblendw(); + default: Inst::UD2(); + } + 0x7: decode VEX_L { + 0x0: vpalignr(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x03: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vinsertf128(); + 0x1: vextractf128(); + 0x5: vcvtps2ph(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x09: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: vpermil2ps(); + 0x1: vpermil2pd(); + 0x2: vblendvps(); + 0x3: vblendvpd(); + 0x4: decode VEX_L { + 0x0: decode VEX_W { + 0x0: vpblendvb(); + default: Inst::UD2(); + } + default: Inst::UD2(); + } + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x0B: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x4: decode VEX_W { + 0x0: vfmaddsubps(); + 0x1: vfmaddsubps(); + default: Inst::UD2(); + } + + 0x5: decode VEX_W { + 0x0: vfmaddsubpd(); + 0x1: vfmaddsubpd(); + default: Inst::UD2(); + } + + 0x6: decode VEX_W { + 0x0: vfmsubaddps(); + 0x1: vfmsubaddps(); + default: Inst::UD2(); + } + + 0x7: decode VEX_W { + 0x0: vfmsubaddpd(); + 0x1: vfmsubaddpd(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x0D: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: decode VEX_W { + 0x0: vfmaddps(); + 0x1: vfmaddps(); + default: Inst::UD2(); + } + + 0x1: decode VEX_W { + 0x0: vfmaddpd(); + 0x1: vfmaddpd(); + default: Inst::UD2(); + } + + 0x2: decode VEX_W { + 0x0: vfmaddss(); + 0x1: vfmaddss(); + default: Inst::UD2(); + } + + 0x3: decode VEX_W { + 0x0: vfmaddsd(); + 0x1: vfmaddsd(); + default: Inst::UD2(); + } + + 0x4: decode VEX_W { + 0x0: vfmsubps(); + 0x1: vfmsubps(); + default: Inst::UD2(); + } + + 0x5: decode VEX_W { + 0x0: vfmsubpd(); + 0x1: vfmsubpd(); + default: Inst::UD2(); + } + + 0x6: decode VEX_W { + 0x0: vfmsubss(); + 0x1: vfmsubss(); + default: Inst::UD2(); + } + + 0x7: decode VEX_W { + 0x0: vfmsubsd(); + 0x1: vfmsubsd(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x0F: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x0: decode VEX_W { + 0x0: vfnmaddps(); + 0x1: vfnmaddps(); + default: Inst::UD2(); + } + + 0x1: decode VEX_W { + 0x0: vfnmaddpd(); + 0x1: vfnmaddpd(); + default: Inst::UD2(); + } + + 0x2: decode VEX_W { + 0x0: vfnmaddss(); + 0x1: vfnmaddss(); + default: Inst::UD2(); + } + + 0x3: decode VEX_W { + 0x0: vfnmaddsd(); + 0x1: vfnmaddsd(); + default: Inst::UD2(); + } + + 0x4: decode VEX_W { + 0x0: vfnmsubps(); + 0x1: vfnmsubps(); + default: Inst::UD2(); + } + + 0x5: decode VEX_W { + 0x0: vfnmsubpd(); + 0x1: vfnmsubpd(); + default: Inst::UD2(); + } + + 0x6: decode VEX_W { + 0x0: vfnmsubss(); + 0x1: vfnmsubss(); + default: Inst::UD2(); + } + + 0x7: decode VEX_W { + 0x0: vfnmsubsd(); + 0x1: vfnmsubsd(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + 0x1B: decode VEX_PP { + 0x1: decode OPCODE_OP_BOTTOM3 { + 0x7: vaeskeygenassist(); + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + default: Inst::UD2(); + } + + default: Inst::UD2(); + } +} |