cyberchef
Version:
The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.
967 lines (942 loc) • 311 kB
JavaScript
/*-------------------------------------------------------------------------------------------------------------------------
Created by Damian Recoskie (https://github.com/Recoskie/X86-64-Disassembler-JS)
& exported for CyberChef by Matt [me@mitt.dev]
---------------------------------------------------------------------------------------------------------------------------
MIT License
Copyright (c) 2019 Damian Recoskie
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-------------------------------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------------------------------
Binary byte code array.
---------------------------------------------------------------------------------------------------------------------------
Function ^LoadBinCode()^ takes a string input of hex and loads it into the BinCode array it is recommended that the location
the hex string is read from a file, or sector matches the disassemblers set base address using function ^SetBasePosition()^.
-------------------------------------------------------------------------------------------------------------------------*/
var BinCode = [];
/*-------------------------------------------------------------------------------------------------------------------------
When Bit Mode is 2 the disassembler will default to decoding 64 bit binary code possible settings are 0=16 bit, 1=32 bit, 2=64 bit.
-------------------------------------------------------------------------------------------------------------------------*/
var BitMode = 2;
/*-------------------------------------------------------------------------------------------------------------------------
The variable CodePos is the position in the BinCode array starts at 0 for each new section loaded in by ^LoadBinCode()^.
---------------------------------------------------------------------------------------------------------------------------
The function ^NextByte()^ moves CodePos, and the Disassemblers Base address by one stored in Pos64, Pos32.
The BinCode array is designed for loading in a section of binary that is supposed to be from the set Base address in Pos64, and Pos32.
-------------------------------------------------------------------------------------------------------------------------*/
var CodePos = 0x00000000;
/*-------------------------------------------------------------------------------------------------------------------------
The Pos64, and Pos32 is the actual base address that instructions are supposed to be from in memory when they are loaded
into the BinCode array using the Function ^LoadBinCode()^.
---------------------------------------------------------------------------------------------------------------------------
The function ^SetBasePosition()^ sets the base location in Pos64, and Pos32, and Code Segment.
-------------------------------------------------------------------------------------------------------------------------*/
var Pos64 = 0x00000000, Pos32 = 0x00000000;
/*-------------------------------------------------------------------------------------------------------------------------
Code Segment is used in 16 bit binaries in which the segment is times 16 (Left Shift 4) added to the 16 bit address position.
This was done to load more programs in 16 bit space at an selected segment location. In 16 bit X86 processors the instruction
pointer register counts from 0000 hex to FFFF hex and starts over at 0000 hex. Allowing a program to be a max length of
65535 bytes long. The Code Segment is multiplied by 16 then is added to the instruction pointer position in memory.
---------------------------------------------------------------------------------------------------------------------------
In 32 bit, and 64 bit the address combination is large enough that segmented program loading was no longer required.
However 32 bit still supports Segmented addressing if used, but 64 bit binaries do not. Also if the code segment is set
36, or higher in 32 bit binaries this sets SEG:OFFSET address format for each instructions Memory position.
---------------------------------------------------------------------------------------------------------------------------
In 64 bit mode, an programs instructions are in a 64 bit address using the processors full instruction pointer, but in 32
bit instructions the first 32 bit of the instruction pointer is used. In 16 bit the first 16 bits of the instruction pointer
is used, but with the code segment. Each instruction is executed in order by the Instruction pointer that goes in sectional sizes
"RIP (64)/EIP (32)/IP (16)" Depending on the Bit mode the 64 bit CPU is set in, or if the CPU is 32 bit to begin with.
-------------------------------------------------------------------------------------------------------------------------*/
var CodeSeg = 0x0000;
/*-------------------------------------------------------------------------------------------------------------------------
The InstructionHex String stores the Bytes of decoded instructions. It is shown to the left side of the disassembled instruction.
-------------------------------------------------------------------------------------------------------------------------*/
var InstructionHex = "";
/*-------------------------------------------------------------------------------------------------------------------------
The InstructionPos String stores the start position of a decoded binary instruction in memory from the function ^GetPosition()^.
-------------------------------------------------------------------------------------------------------------------------*/
var InstructionPos = "";
/*-------------------------------------------------------------------------------------------------------------------------
Decoding display options.
-------------------------------------------------------------------------------------------------------------------------*/
var ShowInstructionHex = true; //setting to show the hex code of the instruction beside the decoded instruction output.
var ShowInstructionPos = true; //setting to show the instruction address position.
/*-------------------------------------------------------------------------------------------------------------------------
The Opcode, and Opcode map.
---------------------------------------------------------------------------------------------------------------------------
The first 0 to 255 (Byte) value that is read is the selected instruction code, however some codes are used as Adjustment to
remove limitations that are read by the function ^DecodePrefixAdjustments()^.
---------------------------------------------------------------------------------------------------------------------------
Because X86 was limited to 255 instructions An number was sacrificed to add more instructions.
By using one of the 0 to 255 instructions like 15 which is "0F" as an hex number the next 0 to 255 value is an hole
new set of 0 to 255 instructions these are called escape code prefixes.
---------------------------------------------------------------------------------------------------------------------------
Bellow XX is the opcode combined with the adjustment escape codes thus how opcode is used numerically in the disassembler.
---------------------------------------------------------------------------------------------------------------------------
00,00000000 = 0, lower 8 bit opcode at max 00,11111111 = 255. (First byte opcodes XX) Opcodes values 0 to 255.
01,00000000 = 256, lower 8 bit opcode at max 01,11111111 = 511. (Two byte opcodes 0F XX) Opcodes values 256 to 511.
10,00000000 = 512, lower 8 bit opcode at max 10,11111111 = 767. (Three byte opcodes 0F 38 XX) Opcodes values 512 to 767.
11,00000000 = 768, lower 8 bit opcode at max 11,11111111 = 1023. (Three byte opcodes 0F 3A XX) Opcodes values 768 to 1023.
---------------------------------------------------------------------------------------------------------------------------
The lower 8 bits is the selectable opcode 0 to 255 plus one from 255 is 1,00000000 = 256 thus 256 acts as the place holder.
The vector adjustment codes contain an map bit selection the map bits go in order to the place holder map bits are in.
This makes it so the map bits can be placed where the place holder bits are.
---------------------------------------------------------------------------------------------------------------------------
VEX.mmmmm = 000_00b (1-byte map), 000_01b (2-byte map), 000_10b (0Fh,38h), 000_11b (0Fh,3Ah)
EVEX.mm = 00b (1-byte map), 01b (2-byte map), 10b (0Fh,38h), 11b (0Fh,3Ah)
--------------------------------------------------------------------------------------------------------------------------
Function ^DecodePrefixAdjustments()^ reads opcodes that act as settings it only ends when Opcode is an actual
instruction code value 0 to 1023 inducing escape codes. Opcode is Used by function ^DecodeOpcode()^ with the Mnemonic array.
-------------------------------------------------------------------------------------------------------------------------*/
var Opcode = 0;
/*-------------------------------------------------------------------------------------------------------------------------
Opcode is used as the index for the point in the structure to land on in the "Mnemonics".
---------------------------------------------------------------------------------------------------------------------------
X86 has an amazing architectural pattern that is like an fractal in many ways. Previously an experiment was done to make
this an one dimensional array, but after testing it proved that it was slower because each of the branches had to be
calculated to an unique index in memory in which lots of combinations map to the same instructions well some changed.
The calculation took more time than comparing if an index is an reference to another array to optionally use an encoding.
---------------------------------------------------------------------------------------------------------------------------
The first branch is an array 2 in size which separates opcodes that change between register, and memory mode.
---------------------------------------------------------------------------------------------------------------------------
The second branch is an array 8 in size which uses an register as an 0 to 7 value for the selected instruction code called grouped opcodes.
The second branch can be branched into another array 8 in size this covers the last three bits of the ModR/M byte for static opcodes.
---------------------------------------------------------------------------------------------------------------------------
The third branch is an array 4 in size which is the SIMD modes. The third branch can branch to an array 4 in size again under
any of the 4 elements in the SIMD modes for instructions that change by vector extension type.
---------------------------------------------------------------------------------------------------------------------------
The fifth branch is an array 3 in size which branches to encoding's that change by the set size attribute.
---------------------------------------------------------------------------------------------------------------------------
Each branch can be combined in any combination, but only in order. If we branch to an array 2 in size under an specific opcode
like this ["",""] then decide to branch memory mode to an array 4 in size we end up with ["",["","","",""]] for making it only
active in memory mode and controlled by SIMD modes, but then if we decide to branch one of the 4 SIMD modes to an array 8
in size for register opcode separation under one SIMD mode, or an few we can't. We can only branch to an array 3 in size
as that comes next after the array 4 in size. WE also do not need the first branch to be an array it can be an single opcode
encoding. We also do not need the first branch to be an array 2 in size it can be any starting branch then the rest must go
in order from that branch point.
---------------------------------------------------------------------------------------------------------------------------
Opcode is used by the function ^DecodeOpcode()^ after ^DecodePrefixAdjustments()^.
The function ^DecodeOpcode()^ Gives back the instructions name.
--------------------------------------------------------------------------------------------------------------------------*/
const Mnemonics = [
/*------------------------------------------------------------------------------------------------------------------------
First Byte operations 0 to 255.
------------------------------------------------------------------------------------------------------------------------*/
"ADD","ADD","ADD","ADD","ADD","ADD","PUSH ES","POP ES",
"OR","OR","OR","OR","OR","OR","PUSH CS"
,
"" //*Two byte instructions prefix sets opcode 01,000000000 next byte read is added to the lower 8 bit's.
,
"ADC","ADC","ADC","ADC","ADC","ADC","PUSH SS","POP SS",
"SBB","SBB","SBB","SBB","SBB","SBB","PUSH DS","POP DS",
"AND","AND","AND","AND","AND","AND",
"ES:[", //Extra segment override sets SegOveride "ES:[".
"DAA",
"SUB","SUB","SUB","SUB","SUB","SUB",
"CS:[", //Code segment override sets SegOveride "CS:[".
"DAS",
"XOR","XOR","XOR","XOR","XOR","XOR",
"SS:[", //Stack segment override sets SegOveride "SS:[".
"AAA",
"CMP","CMP","CMP","CMP","CMP","CMP",
"DS:[", //Data Segment override sets SegOveride "DS:[".
"AAS",
/*------------------------------------------------------------------------------------------------------------------------
Start of Rex Prefix adjustment setting uses opcodes 40 to 4F. These opcodes are only decoded as adjustment settings
by the function ^DecodePrefixAdjustments()^ while in 64 bit mode. If not in 64 bit mode the codes are not read
by the function ^DecodePrefixAdjustments()^ which allows the opcode to be set 40 to 4F hex in which the defined
instructions bellow are used by ^DecodeOpcode()^.
------------------------------------------------------------------------------------------------------------------------*/
"INC","INC","INC","INC","INC","INC","INC","INC",
"DEC","DEC","DEC","DEC","DEC","DEC","DEC","DEC",
/*------------------------------------------------------------------------------------------------------------------------
End of the Rex Prefix adjustment setting opcodes.
------------------------------------------------------------------------------------------------------------------------*/
"PUSH","PUSH","PUSH","PUSH","PUSH","PUSH","PUSH","PUSH",
"POP","POP","POP","POP","POP","POP","POP","POP",
["PUSHA","PUSHAD",""],["POPA","POPAD",""],
["BOUND","BOUND",""], //EVEX prefix adjustment settings only if used in register to register, or in 64 bit mode, otherwise the defined BOUND instruction is used.
"MOVSXD",
"FS:[","GS:[", //Sets SegOveride "FS:[" next opcode sets "GS:[".
"","", //Operand Size, and Address size adjustment to ModR/M.
"PUSH","IMUL","PUSH","IMUL",
"INS","INS","OUTS","OUTS",
"JO","JNO","JB","JAE","JE","JNE","JBE","JA",
"JS","JNS","JP","JNP","JL","JGE","JLE","JG",
["ADD","OR","ADC","SBB","AND","SUB","XOR","CMP"], //Group opcode uses the ModR/M register selection 0 though 7 giving 8 instruction in one opcode.
["ADD","OR","ADC","SBB","AND","SUB","XOR","CMP"],
["ADD","OR","ADC","SBB","AND","SUB","XOR","CMP"],
["ADD","OR","ADC","SBB","AND","SUB","XOR","CMP"],
"TEST","TEST","XCHG","XCHG",
"MOV","MOV","MOV","MOV","MOV",
["LEA","???"], //*ModR/M Register, and memory mode separation.
"MOV",
["POP","???","???","???","???","???","???","???"],
[["NOP","","",""],["NOP","","",""],["PAUSE","","",""],["NOP","","",""]],
"XCHG","XCHG","XCHG","XCHG","XCHG","XCHG","XCHG",
["CWDE","CBW","CDQE"], //*Opcode 0 to 3 for instructions that change name by size setting.
["CDQ","CWD","CQO"],
"CALL","WAIT",
["PUSHFQ","PUSHF","PUSHFQ"],
["POPFQ","POPF","POPFQ"],
"SAHF","LAHF",
"MOV","MOV","MOV","MOV",
"MOVS","MOVS",
"CMPS","CMPS",
"TEST","TEST",
"STOS","STOS",
"LODS","LODS",
"SCAS","SCAS",
"MOV","MOV","MOV","MOV","MOV","MOV","MOV","MOV",
"MOV","MOV","MOV","MOV","MOV","MOV","MOV","MOV",
["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"],
["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"],
"RET","RET",
"LES", //VEX prefix adjustment settings only if used in register to register, or in 64 bit mode, otherwise the defined instruction is used.
"LDS", //VEX prefix adjustment settings only if used in register to register, or in 64 bit mode, otherwise the defined instruction is used.
[
"MOV","???","???","???","???","???","???",
["XABORT","XABORT","XABORT","XABORT","XABORT","XABORT","XABORT","XABORT"]
],
[
"MOV","???","???","???","???","???","???",
["XBEGIN","XBEGIN","XBEGIN","XBEGIN","XBEGIN","XBEGIN","XBEGIN","XBEGIN"]
],
"ENTER","LEAVE","RETF","RETF","INT","INT","INTO",
["IRETD","IRET","IRETQ"],
["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"],
["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"],
["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"],
["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"],
"AAMB","AADB","???",
"XLAT",
/*------------------------------------------------------------------------------------------------------------------------
X87 FPU.
------------------------------------------------------------------------------------------------------------------------*/
[
["FADD","FMUL","FCOM","FCOMP","FSUB","FSUBR","FDIV","FDIVR"],
["FADD","FMUL","FCOM","FCOMP","FSUB","FSUBR","FDIV","FDIVR"]
],
[
["FLD","???","FST","FSTP","FLDENV","FLDCW","FNSTENV","FNSTCW"],
[
"FLD","FXCH",
["FNOP","???","???","???","???","???","???","???"],
"FSTP1",
["FCHS","FABS","???","???","FTST","FXAM","???","???"],
["FLD1","FLDL2T","FLDL2E","FLDPI","FLDLG2","FLDLN2","FLDZ","???"],
["F2XM1","FYL2X","FPTAN","FPATAN","FXTRACT","FPREM1","FDECSTP","FINCSTP"],
["FPREM","FYL2XP1","FSQRT","FSINCOS","FRNDINT","FSCALE","FSIN","FCOS"]
]
],
[
["FIADD","FIMUL","FICOM","FICOMP","FISUB","FISUBR","FIDIV","FIDIVR"],
[
"FCMOVB","FCMOVE","FCMOVBE","FCMOVU","???",
["???","FUCOMPP","???","???","???","???","???","???"],
"???","???"
]
],
[
["FILD","FISTTP","FIST","FISTP","???","FLD","???","FSTP"],
[
"CMOVNB","FCMOVNE","FCMOVNBE","FCMOVNU",
["FENI","FDISI","FNCLEX","FNINIT","FSETPM","???","???","???"],
"FUCOMI","FCOMI","???"
]
],
[
["FADD","FMUL","FCOM","DCOMP","FSUB","FSUBR","FDIV","FDIVR"],
["FADD","FMUL","FCOM2","FCOMP3","FSUBR","FSUB","FDIVR","FDIV"]
],
[
["FLD","FISTTP","FST","FSTP","FRSTOR","???","FNSAVE","FNSTSW"],
["FFREE","FXCH4","FST","FSTP","FUCOM","FUCOMP","???","???"]
],
[
["FIADD","FIMUL","FICOM","FICOMP","FISUB","FISUBR","FIDIV","FIDIVR"],
[
"FADDP","FMULP","FCOMP5",
["???","FCOMPP","???","???","???","???","???","???"],
"FSUBRP","FSUBP","FDIVRP","FDIVP"
]
],
[
["FILD","FISTTP","FIST","FISTP","FBLD","FILD","FBSTP","FISTP"],
[
"FFREEP","FXCH7","FSTP8","FSTP9",
["FNSTSW","???","???","???","???","???","???","???"],
"FUCOMIP","FCOMIP","???"
]
],
/*------------------------------------------------------------------------------------------------------------------------
End of X87 FPU.
------------------------------------------------------------------------------------------------------------------------*/
"LOOPNE","LOOPE","LOOP","JRCXZ",
"IN","IN","OUT","OUT",
"CALL","JMP","JMP","JMP",
"IN","IN","OUT","OUT",
/*------------------------------------------------------------------------------------------------------------------------
The Repeat, and lock prefix opcodes apply to the next opcode.
------------------------------------------------------------------------------------------------------------------------*/
"LOCK", //Adds LOCK to the start of instruction. When Opcode F0 hex is read by function ^DecodePrefixAdjustments()^ sets PrefixG2 to LOCK.
"ICEBP", //Instruction ICEBP.
"REPNE", //Adds REPNE (Opcode F2 hex) to the start of instruction. Read by function ^DecodePrefixAdjustments()^ sets PrefixG1 to REPNE.
"REP", //Adds REP (Opcode F3 hex) to the start of instruction. Read by function ^DecodePrefixAdjustments()^ sets PrefixG1 to REP.
/*------------------------------------------------------------------------------------------------------------------------
End of Repeat, and lock instruction adjustment codes.
------------------------------------------------------------------------------------------------------------------------*/
"HLT","CMC",
["TEST","???","NOT","NEG","MUL","IMUL","DIV","IDIV"],
["TEST","???","NOT","NEG","MUL","IMUL","DIV","IDIV"],
"CLC","STC","CLI","STI","CLD","STD",
["INC","DEC","???","???","???","???","???","???"],
[
["INC","DEC","CALL","CALL","JMP","JMP","PUSH","???"],
["INC","DEC","CALL","???","JMP","???","PUSH","???"]
],
/*------------------------------------------------------------------------------------------------------------------------
Two Byte Opcodes 256 to 511. Opcodes plus 256 goes to 511 used by escape code "0F", Or
set directly by adding map bits "01" because "01 00000000" bin = 256 plus opcode.
------------------------------------------------------------------------------------------------------------------------*/
[
["SLDT","STR","LLDT","LTR","VERR","VERW","JMPE","???"],
["SLDT","STR","LLDT","LTR","VERR","VERW","JMPE","???"]
],
[
["SGDT","SIDT","LGDT","LIDT","SMSW","???","LMSW","INVLPG"],
[
["???","VMCALL","VMLAUNCH","VMRESUME","VMXOFF","???","???","???"],
["MONITOR","MWAIT","CLAC","STAC","???","???","???","ENCLS"],
["XGETBV","XSETBV","???","???","VMFUNC","XEND","XTEST","ENCLU"],
["VMRUN","VMMCALL","VMLOAD","VMSAVE","STGI","CLGI","SKINIT","INVLPGA"],
"SMSW","???","LMSW",
["SWAPGS","RDTSCP","MONITORX","MWAITX","???","???","???","???"]
]
],
["LAR","LAR"],["LSL","LSL"],"???",
"SYSCALL","CLTS","SYSRET","INVD",
"WBINVD","???","UD2","???",
[["PREFETCH","PREFETCHW","???","???","???","???","???","???"],"???"],
"FEMMS",
"", //3DNow Instruction name is encoded by the IMM8 operand.
[
["MOVUPS","MOVUPD","MOVSS","MOVSD"],
["MOVUPS","MOVUPD","MOVSS","MOVSD"]
],
[
["MOVUPS","MOVUPD","MOVSS","MOVSD"],
["MOVUPS","MOVUPD","MOVSS","MOVSD"]
],
[
["MOVLPS","MOVLPD","MOVSLDUP","MOVDDUP"],
["MOVHLPS","???","MOVSLDUP","MOVDDUP"]
],
[["MOVLPS","MOVLPD","???","???"],"???"],
["UNPCKLPS","UNPCKLPD","???","???"], //An instruction with 4 operations uses the 4 SIMD modes as an Vector instruction.
["UNPCKHPS","UNPCKHPD","???","???"],
[["MOVHPS","MOVHPD","MOVSHDUP","???"],["MOVLHPS","???","MOVSHDUP","???"]],
[["MOVHPS","MOVHPD","???","???"],"???"],
[["PREFETCHNTA","PREFETCHT0","PREFETCHT1","PREFETCHT2","???","???","???","???"],"???"],
"???",
[[["BNDLDX","","",""],["BNDMOV","","",""],["BNDCL","","",""],["BNDCU","","",""]],
["???",["BNDMOV","","",""],["BNDCL","","",""],["BNDCU","","",""]]],
[[["BNDSTX","","",""],["BNDMOV","","",""],["BNDMK","","",""],["BNDCN","","",""]],
["???",["BNDMOV","","",""],"???",["BNDCN","","",""]]],
"???","???","???",
"NOP",
["???","MOV"],["???","MOV"], //CR and DR register Move
["???","MOV"],["???","MOV"], //CR and DR register Move
["???","MOV"],"???", //TR (TEST REGISTER) register Move
["???","MOV"],"???", //TR (TEST REGISTER) register Move
[
["MOVAPS","MOVAPS","MOVAPS","MOVAPS"],
["MOVAPD","MOVAPD","MOVAPD","MOVAPD"],
"???","???"
],
[
[
["MOVAPS","MOVAPS","MOVAPS","MOVAPS"],
["MOVAPD","MOVAPD","MOVAPD","MOVAPD"],
["","","",["MOVNRAPS","MOVNRNGOAPS","MOVNRAPS"]],
["","","",["MOVNRAPD","MOVNRNGOAPD","MOVNRAPD"]]
],
[
["MOVAPS","MOVAPS","MOVAPS","MOVAPS"],
["MOVAPD","MOVAPD","MOVAPD","MOVAPD"],
"???","???"
]
],
[
["CVTPI2PS","","",""],["CVTPI2PD","","",""], //Is not allowed to be Vector encoded.
"CVTSI2SS","CVTSI2SD"
],
[
[
"MOVNTPS","MOVNTPD",
["MOVNTSS","","",""],["MOVNTSD","","",""] //SSE4a can not be vector encoded.
],"???"
],
[
["CVTTPS2PI","","",""],["CVTTPD2PI","","",""], //Is not allowed to be Vector encoded.
"CVTTSS2SI","CVTTSD2SI"
],
[
["CVTPS2PI","","",""],["CVTPD2PI","","",""], //Is not allowed to be Vector encoded.
"CVTSS2SI","CVTSD2SI"
],
["UCOMISS","UCOMISD","???","???"],
["COMISS","COMISD","???","???"],
"WRMSR","RDTSC","RDMSR","RDPMC",
"SYSENTER","SYSEXIT","???",
"GETSEC",
"", //*Three byte instructions prefix combo 0F 38 (Opcode = 01,00111000) sets opcode 10,000000000 next byte read is added to the lower 8 bit's.
"???",
"", //*Three byte instructions prefix combo 0F 3A (Opcode = 01,00111010) sets opcode 11,000000000 next byte read is added to the lower 8 bit's.
"???","???","???","???","???",
"CMOVO",
[
["CMOVNO",["KANDW","","KANDQ"],"",""],
["CMOVNO",["KANDB","","KANDD"],"",""],"",""
],
[
["CMOVB",["KANDNW","","KANDNQ"],"",""],
["CMOVB",["KANDNB","","KANDND"],"",""],"",""
],
[["CMOVAE","KANDNR","",""],"","",""],
[
["CMOVE",["KNOTW","","KNOTQ"],"",""],
["CMOVE",["KNOTB","","KNOTD"],"",""],"",""
],
[
["CMOVNE",["KORW","","KORQ"],"",""],
["CMOVNE",["KORB","","KORD"],"",""],"",""
],
[
["CMOVBE",["KXNORW","","KXNORQ"],"",""],
["CMOVBE",["KXNORB","","KXNORD"],"",""],"",""
],
[
["CMOVA",["KXORW","","KXORQ"],"",""],
["CMOVA",["KXORB","","KXORD"],"",""],"",""
],
[["CMOVS","KMERGE2L1H","",""],"","",""],
[["CMOVNS","KMERGE2L1L","",""],"","",""],
[
["CMOVP",["KADDW","","KADDQ"],"",""],
["CMOVP",["KADDB","","KADDD"],"",""],"",""
],
[
["CMOVNP",["KUNPCKWD","","KUNPCKDQ"],"",""],
["CMOVNP",["KUNPCKBW","","???"],"",""],"",""
],
"CMOVL","CMOVGE","CMOVLE","CMOVG",
[
"???",
[
["MOVMSKPS","MOVMSKPS","",""],["MOVMSKPD","MOVMSKPD","",""],
"???","???"
]
],
["SQRTPS","SQRTPD","SQRTSS","SQRTSD"],
[
["RSQRTPS","RSQRTPS","",""],"???",
["RSQRTSS","RSQRTSS","",""],"???"
],
[
["RCPPS","RCPPS","",""],"???",
["RCPSS","RCPSS","",""],"???"
],
["ANDPS","ANDPD","???","???"],
["ANDNPS","ANDNPD","???","???"],
["ORPS","ORPD","???","???"],
["XORPS","XORPD","???","???"],
[
["ADDPS","ADDPS","ADDPS","ADDPS"],
["ADDPD","ADDPD","ADDPD","ADDPD"],
"ADDSS","ADDSD"
],
[
["MULPS","MULPS","MULPS","MULPS"],
["MULPD","MULPD","MULPD","MULPD"],
"MULSS","MULSD"
],
[
["CVTPS2PD","CVTPS2PD","CVTPS2PD","CVTPS2PD"],
["CVTPD2PS","CVTPD2PS","CVTPD2PS","CVTPD2PS"],
"CVTSS2SD","CVTSD2SS"
],
[["CVTDQ2PS","","CVTQQ2PS"],["CVTPS2DQ","","???"],"CVTTPS2DQ","???"],
[
["SUBPS","SUBPS","SUBPS","SUBPS"],
["SUBPD","SUBPD","SUBPD","SUBPD"],
"SUBSS","SUBSD"
],
["MINPS","MINPD","MINSS","MINSD"],
["DIVPS","DIVPD","DIVSS","DIVSD"],
["MAXPS","MAXPD","MAXSS","MAXSD"],
[["PUNPCKLBW","","",""],"PUNPCKLBW","",""],
[["PUNPCKLWD","","",""],"PUNPCKLWD","",""],
[["PUNPCKLDQ","","",""],"PUNPCKLDQ","",""],
[["PACKSSWB","","",""],"PACKSSWB","",""],
[["PCMPGTB","","",""],["PCMPGTB","PCMPGTB","PCMPGTB",""],"",""],
[["PCMPGTW","","",""],["PCMPGTW","PCMPGTW","PCMPGTW",""],"",""],
[["PCMPGTD","","",""],["PCMPGTD","PCMPGTD",["PCMPGTD","","???"],["PCMPGTD","","???"]],"",""],
[["PACKUSWB","","",""],"PACKUSWB","",""],
[["PUNPCKHBW","","",""],"PUNPCKHBW","",""],
[["PUNPCKHWD","","",""],"PUNPCKHWD","",""],
[["PUNPCKHDQ","","",""],["PUNPCKHDQ","","???"],"",""],
[["PACKSSDW","","",""],["PACKSSDW","","???"],"",""],
["???","PUNPCKLQDQ","???","???"],
["???","PUNPCKHQDQ","???","???"],
[["MOVD","","",""],["MOVD","","MOVQ"],"",""],
[
[
["MOVQ","","",""],
["MOVDQA","MOVDQA",["MOVDQA32","","MOVDQA64"],["MOVDQA32","","MOVDQA64"]],
["MOVDQU","MOVDQU",["MOVDQU32","","MOVDQU64"],""],
["","",["MOVDQU8","","MOVDQU16"],""]
],
[
["MOVQ","","",""],
["MOVDQA","MOVDQA",["MOVDQA32","","MOVDQA64"],["MOVDQA32","","MOVDQA64"]],
["MOVDQU","MOVDQU",["MOVDQU32","","MOVDQU64"],""],
["","",["MOVDQU8","","MOVDQU16"],""]
]
],
[
["PSHUFW","","",""],
["PSHUFD","PSHUFD",["PSHUFD","","???"],["PSHUFD","","???"]],
"PSHUFHW",
"PSHUFLW"
],
[
"???",
[
"???","???",
[["PSRLW","","",""],"PSRLW","",""],"???",
[["PSRAW","","",""],"PSRAW","",""],"???",
[["PSLLW","","",""],"PSLLW","",""],"???"
]
],
[
["???",["","",["PRORD","","PRORQ"],""],"???","???"],
["???",["","",["PROLD","","PROLQ"],""],"???","???"],
[["PSRLD","","",""],["PSRLD","PSRLD",["PSRLD","","???"],["PSRLD","","???"]],"",""],
"???",
[["PSRAD","","",""],["PSRAD","PSRAD",["PSRAD","","PSRAQ"],["PSRAD","","???"]],"",""],
"???",
[["PSLLD","","",""],["PSLLD","PSLLD",["PSLLD","","???"],["PSLLD","","???"]],"",""],
"???"
],
[
"???",
[
"???","???",
[["PSRLQ","PSRLQ","",""],"PSRLQ","",""],["???","PSRLDQ","???","???"],
"???","???",
[["PSLLQ","PSLLQ","",""],"PSLLQ","",""],["???","PSLLDQ","???","???"]
]
],
[["PCMPEQB","","",""],["PCMPEQB","PCMPEQB","PCMPEQB",""],"",""],
[["PCMPEQW","","",""],["PCMPEQW","PCMPEQW","PCMPEQW",""],"",""],
[["PCMPEQD","","",""],["PCMPEQD","PCMPEQD",["PCMPEQD","","???"],["PCMPEQD","","???"]],"",""],
[["EMMS",["ZEROUPPER","ZEROALL",""],"",""],"???","???","???"],
[
["VMREAD","",["CVTTPS2UDQ","","CVTTPD2UDQ"],""],
["EXTRQ","",["CVTTPS2UQQ","","CVTTPD2UQQ"],""],
["???","","CVTTSS2USI",""],
["INSERTQ","","CVTTSD2USI",""]
],
[
["VMWRITE","",["CVTPS2UDQ","","CVTPD2UDQ"], ""],
["EXTRQ","",["CVTPS2UQQ","","CVTPD2UQQ"],""],
["???","","CVTSS2USI",""],
["INSERTQ","","CVTSD2USI",""]
],
[
"???",
["","",["CVTTPS2QQ","","CVTTPD2QQ"],""],
["","",["CVTUDQ2PD","","CVTUQQ2PD"],"CVTUDQ2PD"],
["","",["CVTUDQ2PS","","CVTUQQ2PS"],""]
],
[
"???",
["","",["CVTPS2QQ","","CVTPD2QQ"],""],
["","","CVTUSI2SS",""],
["","","CVTUSI2SD",""]
],
[
"???",["HADDPD","HADDPD","",""],
"???",["HADDPS","HADDPS","",""]
],
[
"???",["HSUBPD","HSUBPD","",""],
"???",["HSUBPS","HSUBPS","",""]
],
[["MOVD","","",""],["MOVD","","MOVQ"],["MOVQ","MOVQ",["???","","MOVQ"],""],"???"],
[
["MOVQ","","",""],
["MOVDQA","MOVDQA",["MOVDQA32","","MOVDQA64"],["MOVDQA32","","MOVDQA64"]],
["MOVDQU","MOVDQU",["MOVDQU32","","MOVDQU64"],""],
["???","",["MOVDQU8","","MOVDQU16"],""]
],
"JO","JNO","JB","JAE",
[["JE","JKZD","",""],"","",""],[["JNE","JKNZD","",""],"","",""], //K1OM.
"JBE","JA","JS","JNS","JP","JNP","JL","JGE","JLE","JG",
[
["SETO",["KMOVW","","KMOVQ"],"",""],
["SETO",["KMOVB","","KMOVD"],"",""],"",""
],
[
["SETNO",["KMOVW","","KMOVQ"],"",""],
["SETNO",["KMOVB","","KMOVD"],"",""],"",""
],
[
["SETB",["KMOVW","","???"],"",""],
["SETB",["KMOVB","","???"],"",""],"",
["SETB",["KMOVD","","KMOVQ"],"",""]
],
[
["SETAE",["KMOVW","","???"],"",""],
["SETAE",["KMOVB","","???"],"",""],"",
["SETAE",["KMOVD","","KMOVQ"],"",""]
],
"SETE",[["SETNE","KCONCATH","",""],"","",""],
"SETBE",[["SETA","KCONCATL","",""],"","",""],
[
["SETS",["KORTESTW","","KORTESTQ"],"",""],
["SETS",["KORTESTB","","KORTESTD"],"",""],"",""
],
[
["SETNS",["KTESTW","","KTESTQ"],"",""],
["SETNS",["KTESTB","","KTESTD"],"",""],"",""
],
"SETP","SETNP","SETL","SETGE","SETLE","SETG",
"PUSH","POP",
"CPUID", //Identifies the CPU and which Instructions the current CPU can use.
"BT",
"SHLD","SHLD",
"XBTS","IBTS",
"PUSH","POP",
"RSM",
"BTS",
"SHRD","SHRD",
[
[
["FXSAVE","???","FXSAVE64"],["FXRSTOR","???","FXRSTOR64"],
"LDMXCSR","STMXCSR",
["XSAVE","","XSAVE64"],["XRSTOR","","XRSTOR64"],
["XSAVEOPT","CLWB","XSAVEOPT64"],
["CLFLUSHOPT","CLFLUSH",""]
],
[
["???","???",["RDFSBASE","","",""],"???"],["???","???",["RDGSBASE","","",""],"???"],
["???","???",["WRFSBASE","","",""],"???"],["???","???",["WRGSBASE","","",""],"???"],
"???",
["LFENCE","???","???","???","???","???","???","???"],
["MFENCE","???","???","???","???","???","???","???"],
["SFENCE","???","???","???","???","???","???","???"]
]
],
"IMUL",
"CMPXCHG","CMPXCHG",
["LSS","???"],
"BTR",
["LFS","???"],
["LGS","???"],
"MOVZX","MOVZX",
[
["JMPE","","",""],"???",
["POPCNT","POPCNT","",""],"???"
],
"???",
["???","???","???","???","BT","BTS","BTR","BTC"],
"BTC",
[
["BSF","","",""],"???",
["TZCNT","TZCNT","",""],["BSF","TZCNTI","",""]
],
[
["BSR","","",""],"???",
["LZCNT","LZCNT","",""],["BSR","","",""]
],
"MOVSX","MOVSX",
"XADD","XADD",
[
["CMP,PS,","CMP,PS,","CMP,PS,","CMP,PS,"],
["CMP,PD,","CMP,PD,","CMP,PD,","CMP,PD,"],
["CMP,SS,","CMP,SS,","CMP,SS,",""],
["CMP,SD,","CMP,SD,","CMP,SD,",""]
],
["MOVNTI","???"],
[["PINSRW","","",""],"PINSRW","",""],
["???",[["PEXTRW","","",""],"PEXTRW","",""]],
["SHUFPS","SHUFPD","???","???"],
[
[
"???",
["CMPXCHG8B","","CMPXCHG16B"],
"???",
["XRSTORS","","XRSTORS64"],
["XSAVEC","","XSAVEC64"],
["XSAVES","","XSAVES64"],
["VMPTRLD","VMCLEAR","VMXON","???"],["VMPTRST","???","???","???"]
],
[
"???",
["SSS","???","???","???","???","???","???","???"], //Synthetic virtual machine operation codes.
"???","???","???","???",
"RDRAND","RDSEED"
]
],
"BSWAP","BSWAP","BSWAP","BSWAP","BSWAP","BSWAP","BSWAP","BSWAP",
["???",["ADDSUBPD","ADDSUBPD","",""],"???",["ADDSUBPS","ADDSUBPS","",""]],
[["PSRLW","","",""],"PSRLW","",""],
[["PSRLD","","",""],["PSRLD","PSRLD",["PSRLD","","???"],""],"",""],
[["PSRLQ","","",""],"PSRLQ","",""],
[["PADDQ","","",""],"PADDQ","",""],
[["PMULLW","","",""],"PMULLW","",""],
[
["???","MOVQ","???","???"],
["???","MOVQ",["MOVQ2DQ","","",""],["MOVDQ2Q","","",""]]
],
["???",[["PMOVMSKB","","",""],["PMOVMSKB","PMOVMSKB","",""],"???","???"]],
[["PSUBUSB","","",""],"PSUBUSB","",""],
[["PSUBUSW","","",""],"PSUBUSW","",""],
[["PMINUB","","",""],"PMINUB","",""],
[["PAND","","",""],["PAND","PAND",["PANDD","","PANDQ"],["PANDD","","PANDQ"]],"",""],
[["PADDUSB","","",""],"PADDUSB","",""],
[["PADDUSW","","",""],"PADDUSW","",""],
[["PMAXUB","","",""],"PMAXUB","",""],
[["PANDN","","",""],["PANDN","PANDN",["PANDND","","PANDNQ"],["PANDND","","PANDNQ"]],"",""],
[["PAVGB","","",""],"PAVGB","",""],
[
[["PSRAW","","",""],["PSRAW","PSRAW","PSRAW",""],"",""],
[["PSRAW","","",""],["PSRAW","PSRAW","PSRAW",""],"",""]
],
[["PSRAD","","",""],["PSRAD","PSRAD",["PSRAD","","PSRAQ"],""],"",""],
[["PAVGW","","",""],"PAVGW","",""],
[["PMULHUW","","",""],"PMULHUW","",""],
[["PMULHW","","",""],"PMULHW","",""],
[
"???",
["CVTTPD2DQ","CVTTPD2DQ","CVTTPD2DQ",""],
["CVTDQ2PD","CVTDQ2PD",["CVTDQ2PD","CVTDQ2PD","CVTQQ2PD"],"CVTDQ2PD"],
"CVTPD2DQ"
],
[[["MOVNTQ","","",""],["MOVNTDQ","","???"],"???","???"],"???"],
[["PSUBSB","","",""],"PSUBSB","",""],
[["PSUBSW","","",""],"PSUBSW","",""],
[["PMINSW","","",""],"PMINSW","",""],
[["POR","","",""],["POR","POR",["PORD","","PORQ"],["PORD","","PORQ"]],"",""],
[["PADDSB","","",""],"PADDSB","",""],
[["PADDSW","","",""],"PADDSW","",""],
[["PMAXSW","","",""],"PMAXSW","",""],
[["PXOR","","",""],["PXOR","PXOR",["PXORD","","PXORQ"],["PXORD","","PXORQ"]],"",""],
[["???","???","???",["LDDQU","LDDQU","",""]],"???"],
[["PSLLW","","",""],"PSLLW","",""],
[["PSLLD","","",""],["PSLLD","","???"],"",""],
[["PSLLQ","","",""],"PSLLQ","",""],
[["PMULUDQ","","",""],"PMULUDQ","",""],
[["PMADDWD","","",""],"PMADDWD","",""],
[["PSADBW","","",""],"PSADBW","",""],
["???",[["MASKMOVQ","","",""],["MASKMOVDQU","MASKMOVDQU","",""],"???","???"]],
[["PSUBB","","",""],"PSUBB","",""],
[["PSUBW","","",""],"PSUBW","",""],
[["PSUBD","","",""],["PSUBD","PSUBD",["PSUBD","","???"],["PSUBD","","???"]],"",""],
[["PSUBQ","","",""],"PSUBQ","",""],
[["PADDB","","",""],"PADDB","",""],
[["PADDW","","",""],"PADDW","",""],
[["PADDD","","",""],["PADDD","PADDD",["PADDD","","???"],["PADDD","","???"]],"",""],
"???",
/*------------------------------------------------------------------------------------------------------------------------
Three Byte operations 0F38. Opcodes plus 512 goes to 767 used by escape codes "0F,38", Or
set directly by adding map bits "10" because "10 00000000" bin = 512 plus opcode.
------------------------------------------------------------------------------------------------------------------------*/
[["PSHUFB","","",""],"PSHUFB","???","???"],
[["PHADDW","","",""],["PHADDW","PHADDW","",""],"???","???"],
[["PHADDD","","",""],["PHADDD","PHADDD","",""],"???","???"],
[["PHADDSW","","",""],["PHADDSW","PHADDSW","",""],"???","???"],
[["PMADDUBSW","","",""],"PMADDUBSW","???","???"],
[["PHSUBW","","",""],["PHSUBW","PHSUBW","",""],"???","???"],
[["PHSUBD","","",""],["PHSUBD","PHSUBD","",""],"???","???"],
[["PHSUBSW","","",""],["PHSUBSW","PHSUBSW","",""],"???","???"],
[["PSIGNB","","",""],["PSIGNB","PSIGNB","",""],"???","???"],
[["PSIGNW","","",""],["PSIGNW","PSIGNW","",""],"???","???"],
[["PSIGND","","",""],["PSIGND","PSIGND","",""],"???","???"],
[["PMULHRSW","","",""],"PMULHRSW","???","???"],
["???",["","PERMILPS",["PERMILPS","","???"],""],"???","???"],
["???",["","PERMILPD","PERMILPD",""],"???","???"],
["???",["","TESTPS","",""],"???","???"],
["???",["","TESTPD","",""],"???","???"],
["???",["PBLENDVB","PBLENDVB","PSRLVW",""],["","","PMOVUSWB",""],"???"],
["???",["","","PSRAVW",""],["","","PMOVUSDB",""],"???"],
["???",["","","PSLLVW",""],["","","PMOVUSQB",""],"???"],
["???",["","CVTPH2PS",["CVTPH2PS","","???"],""],["","","PMOVUSDW",""],"???"],
["???",["BLENDVPS","BLENDVPS",["PRORVD","","PRORVQ"],""],["","","PMOVUSQW",""],"???"],
["???",["BLENDVPD","BLENDVPD",["PROLVD","","PROLVQ"],""],["","","PMOVUSQD",""],"???"],
["???",["","PERMPS",["PERMPS","","PERMPD"],""],"???","???"],
["???",["PTEST","PTEST","",""],"???","???"],
["???",["","BROADCASTSS",["BROADCASTSS","","???"],["BROADCASTSS","","???"]],"???","???"],
["???",["","BROADCASTSD",["BROADCASTF32X2","","BROADCASTSD"],["???","","BROADCASTSD"]],"???","???"],
["???",["","BROADCASTF128",["BROADCASTF32X4","","BROADCASTF64X2"],["BROADCASTF32X4","","???"]],"???","???"],
["???",["","",["BROADCASTF32X8","","BROADCASTF64X4"],["???","","BROADCASTF64X4"]],"???","???"],
[["PABSB","","",""],"PABSB","???","???"],
[["PABSW","","",""],"PABSW","???","???"],
[["PABSD","","",""],["PABSD","","???"],"???","???"],
["???",["","","PABSQ",""],"???","???"],
["???","PMOVSXBW",["","","PMOVSWB",""],"???"],
["???","PMOVSXBD",["","","PMOVSDB",""],"???"],
["???","PMOVSXBQ",["","","PMOVSQB",""],"???"],
["???","PMOVSXWD",["","","PMOVSDW",""],"???"],
["???","PMOVSXWQ",["","","PMOVSQW",""],"???"],
["???","PMOVSXDQ",["","","PMOVSQD",""],"???"],
["???",["","",["PTESTMB","","PTESTMW"],""],["","",["PTESTNMB","","PTESTNMW"],""],"???"],
["???",["","",["PTESTMD","","PTESTMQ"],["PTESTMD","","???"]],["","",["PTESTNMD","","PTESTNMQ"],""],"???"],
["???","PMULDQ",["","",["PMOVM2B","","PMOVM2W"],""],"???"],
["???",["PCMPEQQ","PCMPEQQ","PCMPEQQ",""],["","",["PMOVB2M","","PMOVW2M"],""],"???"],
[["???",["MOVNTDQA","","???"],"???","???"],["???","???",["","",["???","","PBROADCASTMB2Q"],""],"???"]],
["???",["PACKUSDW","","???"],"???","???"],
["???",["","MASKMOVPS",["SCALEFPS","","SCALEFPD"],""],"???","???"],
["???",["","MASKMOVPD",["SCALEFSS","","SCALEFSD"],""],"???","???"],
["???",["","MASKMOVPS","",""],"???","???"],
["???",["","MASKMOVPD","",""],"???","???"],
["???","PMOVZXBW",["","","PMOVWB",""],"???"],
["???","PMOVZXBD",["","","PMOVDB",""],"???"],
["???","PMOVZXBQ",["","","PMOVQB",""],"???"],
["???","PMOVZXWD",["","","PMOVDW",""],"???"],
["???","PMOVZXWQ",["","","PMOVQW",""],"???"],
["???","PMOVZXDQ",["","",["PMOVQD","PMOVQD",""],""],"???"],
["???",["","PERMD",["PERMD","","PERMQ"],["PERMD","","???"]],"???","???"],
["???",["PCMPGTQ","PCMPGTQ","PCMPGTQ",""],"???","???"],
["???","PMINSB",["","",["PMOVM2D","","PMOVM2Q"],""],"???"],
["???",["PMINSD","PMINSD",["PMINSD","","PMINSQ"],["PMINSD","","???"]],["","",["PMOVD2M","","PMOVQ2M"],""],"???"],
["???","PMINUW",["","","PBROADCASTMW2D",""],"???"],
["???",["PMINUD","PMINUD",["PMINUD","","PMINUQ"],["PMINUD","","???"]],"???","???"],
["???","PMAXSB","???","???"],
["???",["PMAXSD","PMAXSD",["PMAXSD","","PMAXSQ"],["PMAXSD","","???"]],"???","???"],
["???","PMAXUW","???","???"],
["???",["PMAXUD","PMAXUD",["PMAXUD","","PMAXUQ"],["PMAXUD","","???"]],"???","???"],
["???",["PMULLD","PMULLD",["PMULLD","","PMULLQ"],["PMULLD","",""]],"???","???"],
["???",["PHMINPOSUW",["PHMINPOSUW","PHMINPOSUW",""],"",""],"???","???"],
["???",["","",["GETEXPPS","","GETEXPPD"],["GETEXPPS","","GETEXPPD"]],"???","???"],
["???",["","",["GETEXPSS","","GETEXPSD"],""],"???","???"],
["???",["","",["PLZCNTD","","PLZCNTQ"],""],"???","???"],
["???",["",["PSRLVD","","PSRLVQ"],["PSRLVD","","PSRLVQ"],["PSRLVD","","???"]],"???","???"],
["???",["",["PSRAVD","",""],["PSRAVD","","PSRAVQ"],["PSRAVD","","???"]],"???","???"],
["???",["",["PSLLVD","","PSLLVQ"],["PSLLVD","","PSLLVQ"],["PSLLVD","","???"]],"???","???"],
"???","???","???","???",
["???",["","",["RCP14PS","","RCP14PD"],""],"???","???"],
["???",["","",["RCP14SS","","RCP14SD"],""],"???","???"],
["???",["","",["RSQRT14PS","","RSQRT14PD"],""],"???","???"],
["???",["","",["RSQRT14SS","","RSQRT14SD"],""],"???","???"],
["???",["","","",["ADDNPS","","ADDNPD"]],"???","???"],
["???",["","","",["GMAXABSPS","","???"]],"???","???"],
["???",["","","",["GMINPS","","GMINPD"]],"???","???"],
["???",["","","",["GMAXPS","","GMAXPD"]],"???","???"],
"",
["???",["","","",["FIXUPNANPS","","FIXUPNANPD"]],"???","???"],
"","",
["???",["","PBROADCASTD",["PBROADCASTD","","???"],["PBROADCASTD","","???"]],"???","???"],
["???",["","PBROADCASTQ",["BROADCASTI32X2","","PBROADCASTQ"],["???","","PBROADCASTQ"]],"???","???"],
["???",["","BROADCASTI128",["BROADCASTI32X4","","BROADCASTI64X2"],["BROADCASTI32X4","","???"]],"???","???"],
["???",["","",["BROADCASTI32X8","","BROADCASTI64X4"],["???","","BROADCASTI64X4"]],"???","???"],
["???",["","","",["PADCD","","???"]],"???","???"],
["???",["","","",["PADDSETCD","","???"]],"???","???"],
["???",["","","",["PSBBD","","???"]],"???","???"],
["???",["","","",["PSUBSETBD","","???"]],"???","???"],
"???","???","???","???",
["???",["","",["PBLENDMD","","PBLENDMQ"],["PBLENDMD","","PBLENDMQ"]],"???","???"],
["???",["","",["BLENDMPS","","BLENDMPD"],["BLENDMPS","","BLENDMPD"]],"???","???"],
["???",["","",["PBLENDMB","","PBLENDMW"],""],"???","???"],
"???","???","???","???","???",
["???",["","","",["PSUBRD","","???"]],"???","???"],
["???",["","","",["SUBRPS","","SUBRPD"]],"???","???"],
["???",["","","",["PSBBRD","","???"]],"???","???"],
["???",["","","",["PSUBRSETBD","","???"]],"???","???"],
"???","???","???","???",
["???",["","","",["PCMPLTD","","???"]],"???","???"],
["???",["","",["PERMI2B","","PERMI2W"],""],"???","???"],
["???",["","",["PERMI2D","","PERMI2Q"],""],"???","???"],
["???",["","",["PERMI2PS","","PERMI2PD"],""],"???","???"],
["???",["","PBROADCASTB",["PBROADCASTB","","???"],""],"???","???"],
["???",["","PBROADCASTW",["PBROADCASTW","","???"],""],"???","???"],
["???",["???",["","",["PBROADCASTB","","???"],""],"???","???"]],
["???",["???",["","",["PBROADCASTW","","???"],""],"???","???"]],
["???",["","",["PBROADCASTD","","PBROADCASTQ"],""],"???","???"],
["???",["","",["PERMT2B","","PERMT2W"],""],"???","???"],
["???",["","",["PERMT2D","","PERMT2Q"],""],"???","???"],
["???",["","",["PERMT2PS","","PERMT2PD"],""],"???","???"],
[["???","INVEPT","???","???"],"???"],
[["???","INVVPID","???","???"],"???"],
[["???","INVPCID","???","???"],"???"],
["???",["???","???","PMULTISHIFTQB","???"],"???","???"],
["???",["","","",["SCALEPS","","???"]],"???","???"],
"???",
["???",["","","",["PMULHUD","","???"]],"???","???"],
["???",["","","",["PMULHD","","???"]],"???","???"],
["???",["","",["EXPANDPS","","EXPANDPD"],""],"???","???"],
["???",["","",["PEXPANDD","","PEXPANDQ"],""],"???","???"],
["???",["","",["COMPRESSPS","","COMPRESSPD"],""],"???","???"],
["???",["","",["PCOMPRESSD","","PCOMPRESSQ"],""],"???","???"],
"???",
["???",["","",["PERMB","","PERMW"],""],"???","???"],
"???","???",
["???",["",["PGATHERDD","","PGATHERDQ"],["PGATHERDD","","PGATHERDQ"],["PGATHERDD","","PGATHERDQ"]],"???","???"],
["???",["",["PGATHERQD","","PGATHERQQ"],["PGATHERQD","","PGATHERQQ"],""],"???","???"],
["???",["",["GATHERDPS","","GATHERDPD"],["GATHERDPS","","GATHERDPD"],["GATHERDPS","","GATHERDPD"]],"???","???"],
["???",["",["GATHERQPS","","GATHERQPD"],["GATHERQPS","","GATHERQPD"],""],"???","???"],
"???","???",
["???",["",["FMADDSUB132PS","","FMADDSUB132PD"],["FMADDSUB132PS","","FMADDSUB132PD"],""],"???","???"],
["???",["",["FMSUBADD132PS","","FMSUBADD132PD"],["FMSUBADD132PS","","FMSUBADD132PD"],""],"???","???"],
["???",["",["FMADD132PS","","FMADD132PD"],["FMADD132PS","","FMADD132PD"],["FMADD132PS","","FMADD132PD"]],"???","???"],
["???",["",["FMADD132SS","","FMADD132SD"],["FMADD132SS","","FMADD132SD"],""],"???","???"],
["???",["",["FMSUB132PS","","FMSUB132PD"],["FMSUB132PS","","FMSUB132PD"],["FMSUB132PS","","FMSUB132PD"]],"???","???"],
["???",["",["FMSUB132SS","","FMSUB132SD"],["FMSUB132SS","","FMSUB132SD"],""],"???","???"],
["???",["",["FNMADD132PS","","FNMADD132PD"],["FNMADD132PS","","FNMADD132PD"],["NMADD132PS","","FNMADD132PD"]],"???","???"],
["???",["",["FNMADD132SS","","FNMADD132SD"],["FNMADD132SS","","FNMADD132SD"],""],"???","???"],
["???",["",["FNMSUB132PS","","FNMSUB132PD"],["FNMSUB132PS","","FNMSUB132PD"],["FNMSUB132PS","","FNMSUB132PS"]],"???","???"],
["???",["",["FNMSUB132SS","","FNMSUB132SD"],["FNMSUB132SS","","FNMSUB132SD"],""],"???","???"],
["???",["","",["PSCATTERDD","","PSCATTERDQ"],["PSCATTERDD","","PSCATTERDQ"]],"???","???"],
["???",["","",["PSCATTERQD","","PSCATTERQQ"],""],"???","???"],
["???",["","",["SCATTERDPS","","SCATTERDPD"],["SCATTERDPS","","SCATTERDPD"]],"???","???"],
["???",["","",["SCATTERQPS","","SCATTERQPD"],""],"???","???"],
["???",["","","",["FMADD233PS","","???"]],"???","???"],
"???",
["???",["",["FMADDSUB213PS","","FMADDSUB213PD"],["FMADDSUB213PS","","FMADDSUB213PD"],""],"???","???"],
["???",["",["FMSUBADD213PS","","FMSUBADD213PD"],["FMSUBADD213PS","","FMSUBADD213PD"],""],"???","???"],
["???",["",["FMADD213PS","","FMADD213PD"],["FMADD213PS","","FMADD213PD"],["FMADD213PS","","FMADD213PD"]],"???","???"],
["???",["",["FMADD213SS","","FMADD213SD"],["FMADD213SS","","FMADD213SD"],""],"???","???"],
["???",["",["FMSUB213PS","","FMSUB213PD"],["FMSUB213PS","","FMSUB213PD"],["FMSUB213PS","","FMSUB213PD"]],"???","???"],
["???",["",["FMSUB213SS","","FMSUB213SD"],["FMSUB213SS","","FMSUB213SD"],""],"???","???"],
["???",["",["FNMADD213PS","","FNMADD213PD"],["FNMADD213PS","","FNMADD213PD"],["FNMADD213PS","","FNMADD213PD"]],"???","???"],
["???",["",["FNMADD213SS","","FNMADD213SD"],["FNMADD213SS","","FNMADD213SD"],""],"???","???"],
["???",["",["FNMSUB213PS","","FNMSUB213PD"],["FNMSUB213PS","","FNMSUB213PD"],["FNMSUB213PS","","FNMSUB213PD"]],"???","???"],
["???",["",["FNMSUB213SS","","FNMSUB213SD"],["FNMSUB213SS","","FNMSUB213SD"],""],"???","???"],
"???","???","???","???",
["???",["","","PMADD52LUQ",["PMADD233D","","???"]],"???","???"],
["???",["","","PMADD52HUQ",["PMADD231D","","???"]],"???","???"],
["???",["",["FMADDSUB231PS","","FMADDSUB231PD"],["FMADDSUB231PS","","FMADDSUB231PD"],""],"???","???"],
["???",["",["FMSUBADD231PS","","FMSUBADD231PD"],["FMSUBADD231PS","","FMSUBADD231PD"],""],"???","???"],
["???",["",["FMADD231PS","","FMADD231PD"],["FMADD231PS","","FMADD231PD"],["FMADD231PS","","FMADD231PD"]],"???","???"],
["???",["",["FMADD231SS","","FMADD231SD"],["FMADD231SS","","FMADD231SD"],""],"???","???"],
["???",["",["FMSUB231PS","","FMSUB231PD"],["FMSUB231PS","","FMSUB231PD"],["FMSUB231PS","","FMSUB231PD"]],"???","???"],
["???",["",["FMSUB231SS","","FMSUB231SD"],["FMSUB231SS","","FMSUB231SD"],""],"???","???"],
["???",["",["FNMADD231PS","","FNMADD231PD"],["FNMADD231PS","","FNMADD231PD"],["FNMADD231PS","","FNMADD231PD"]],"???","???"],
["???",["",["FNMADD231SS","","FNMADD231SD"],["FNMADD231SS","","FNMADD231SD"],""],"???","???"],
["???",["",["FNMSUB231PS","","FNMSUB231PD"],["FNMSUB231PS","","FNMSUB231PD"],["FNMSUB231PS","","FNMSUB231PD"]],"???","???"],
["???",["",["FN