Browse Source

working on new testmethods avx512-memref-operands - 'compressed disp8*N'

git-svn-id: branches/tg74/avx512-0037785@48877 -
tg74 4 years ago
parent
commit
da4be71fc8
1 changed files with 0 additions and 6407 deletions
  1. 0 6407
      tests/utils/avx/asmtestgenerator.pas

+ 0 - 6407
tests/utils/avx/asmtestgenerator.pas

@@ -1,6407 +0,0 @@
-{
-
-  Copyright (C) <avx-testfile-generator> <Torsten Grundke>
-
-  This source is free software; you can redistribute it and/or modify it under
-  the terms of the GNU General Public License as published by the Free
-  Software Foundation; either version 2 of the License, or (at your option)
-  any later version.
-
-  This code is distributed in the hope that it will be useful, but WITHOUT ANY
-  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-  details.
-
-  A copy of the GNU General Public License is available on the World Wide Web
-  at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing
-  to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-  MA 02110-1301, USA.
-}
-
-{$mode objfpc}
-
-unit asmtestgenerator;
-
-interface
-
-uses BaseList, Classes;
-
-type
-  TOpType = (otUnknown, otXMMReg, otXMMRM, otXMMRM16, otXMMRM8, otYMMReg, otYMMRM, otZMMReg, otZMMRM, otEAX, otRAX, otMem32,
-             otMem8, otMem16, otMem64, otMem128, otMem256, otMem512, otREG64, otREG32, otREG16, otREG8, otRM32, otRM64, otIMM8,
-             otXMEM32, otXMEM64, otYMEM32, otYMEM64, otZMEM32, otZMEM64,
-             otB32, otB64, otKREG);
-
-  TOpMemType = Set of TOpType;
-
-  TAsmCompareMode = (cmKORTESTNC, cmXORTestNZ);
-
-  TOpMode = (omUnknown,
-             omMX, omMY, omMZ,
-             omXB32, omXB64, omYB32, omYB64, omZB32, omZB64,
-             omXM, omYM, omZM,
-
-
-             omKXM, omKYM, omKZM,
-             omKXB32, omKXB64, omKYB32, omKYB64, omKZB32, omKZB64,
-             omKXB32I, omKXB64I, omKXMI, omKYB32I, omKYB64I, omKYMI, omKZB32I, omKZB64I, omKZMI,
-
-             omKMI, omKB32I, omKB64I,
-             omMXI, omMYI, omMZI,
-             omXXM, omXXB32, omXXB64, omXMI, omXB32I, omXB64I,
-             omXXMI, omXXB32I, omXXB64I,
-
-             omYYM, omYYB32, omYYB64, omYMI, omYB32I, omYB64I,
-             omYYMI, omYYB32I, omYYB64I,
-             omZZM, omZZB32, omZZB64, omZMI, omZB32I, omZB64I,
-             omZZMI, omZZB32I, omZZB64I);
-
-  TOperandListItem = class(TObject)
-  private
-    FOpActive: boolean;
-    FOpNumber: integer;
-    FOpTyp: TOpType;
-    FValues: TStringList;
-  public
-    constructor Create;
-    destructor Destroy; override;
-
-    property OpNumber: integer read FOpNumber write FOpNumber;
-    property OpTyp: TOpType read FOpTyp write FOpTyp;
-    property OpActive: boolean read FOpActive write FOpActive;
-
-    property Values: TStringList read FValues;
-  end;
-
-  TOperandList = class(TBaseList)
-  private
-    function GetItems(aIndex: integer): TOperandListItem;
-
-  public
-    function Add(aItem: TOperandListItem): integer;
-
-    property Items[aIndex: integer]: TOperandListItem read GetItems;
-  end;
-
-
-  { TAsmTestGenerator }
-
-  TAsmTestGenerator = class(TObject)
-  private
-    FReg8          : TStringList;
-    FReg16         : TStringList;
-    FReg32Base     : TStringList;
-    FReg32Index    : TStringList;
-    FReg64Base     : TStringList;
-    FReg64Index    : TStringList;
-    FReg6432Base   : TStringList;
-    FReg6432Index  : TStringList;
-    FReg32XMMIndex : TStringList;
-    FReg32YMMIndex : TStringList;
-    FReg32ZMMIndex : TStringList;
-    FReg64XMMIndex : TStringList;
-    FReg64YMMIndex : TStringList;
-    FReg64ZMMIndex : TStringList;
-    FRegKREG       : TStringList;
-
-    Fx64: boolean;
-    FAVX512: boolean;
-    FSAE: boolean;
-
-    procedure MemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
-    procedure MemRegBaseIndexCombiCDISP8N(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
-    procedure VectorMemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
-    function ParseBaseIndexReg(const aOp: string; var aBaseReg, aIndexReg: string): boolean;
-
-    function InternalCalcTestData(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList;
-    function InternalCalcTestDataMREF(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList;
-    function InternalCalcTestDataCDISP8(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList;
-  public
-    constructor Create;
-    destructor Destroy; override;
-
-    class procedure CalcTestData(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
-    class procedure CalcTestDataMREF(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
-    class procedure CalcTestDataCDisp8(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
-
-
-    class procedure CalcTestInstFile;
-    class procedure ListMemRefState;
-
-    property x64: boolean read Fx64;
-  end;
-
-implementation
-
-uses SysUtils, Dialogs, typinfo;
-
-type
-  TAsmOp={$i ../../../compiler/x86_64/x8664op.inc}
-  TAttSuffix = (AttSufNONE,AttSufINT,AttSufFPU,AttSufFPUint,AttSufINTdual,AttSufMM,AttSufMMX,AttSufMMS);
-
-  TMemRefSizeInfo = (msiUnknown, msiUnsupported, msiNoSize, msiNoMemRef,
-                     msiMultiple, msiMultipleMinSize8, msiMultipleMinSize16, msiMultipleMinSize32,
-                     msiMultipleMinSize64, msiMultipleMinSize128, msiMultipleminSize256, msiMultipleMinSize512,
-                     msiMemRegSize, msiMemRegx16y32, msiMemRegx16y32z64, msiMemRegx32y64, msiMemRegx32y64z128, msiMemRegx64y128, msiMemRegx64y128z256,
-                     msiMemRegx64y256, msiMemRegx64y256z512,
-                     msiMem8, msiMem16, msiMem32, msiBMem32, msiMem64, msiBMem64, msiMem128, msiMem256, msiMem512,
-                     msiXMem32, msiXMem64, msiYMem32, msiYMem64, msiZMem32, msiZMem64,
-                     msiVMemMultiple, msiVMemRegSize,
-                     msiMemRegConst128,msiMemRegConst256,msiMemRegConst512);
-
-  TMemRefSizeInfoBCST = (msbUnknown, msbBCST32, msbBCST64, msbMultiple);
-  TMemRefSizeInfoBCSTType = (btUnknown, bt1to2, bt1to4, bt1to8, bt1to16);
-
-  TEVEXTupleState = (etsUnknown, etsIsTuple, etsNotTuple);
-  TConstSizeInfo  = (csiUnknown, csiMultiple, csiNoSize, csiMem8, csiMem16, csiMem32, csiMem64);
-
-
-  TInsTabMemRefSizeInfoRec = record
-    MemRefSize               : TMemRefSizeInfo;
-    MemRefSizeBCST           : TMemRefSizeInfoBCST;
-    BCSTXMMMultiplicator     : byte;
-    ExistsSSEAVX             : boolean;
-    ConstSize                : TConstSizeInfo;
-    BCSTTypes                : Set of TMemRefSizeInfoBCSTType;
-    RegXMMSizeMask           : int64;
-    RegYMMSizeMask           : int64;
-    RegZMMSizeMask           : int64;
-  end;
-
-
-  TInsTabMemRefSizeInfoCache=array[TasmOp] of TInsTabMemRefSizeInfoRec;
-  PInsTabMemRefSizeInfoCache=^TInsTabMemRefSizeInfoCache;
-
-  TInsTabCache=array[TasmOp] of longint;
-  PInsTabCache=^TInsTabCache;
-
-
-const
-  instabentries = {$i ../../../compiler/x86_64/x8664nop.inc}
-  gas_needsuffix:array[tasmop] of TAttSuffix={$i ../../../compiler/x86_64/x8664ats.inc}
-
-  MemRefMultiples: set of TMemRefSizeInfo = [msiMultiple, msiMultipleMinSize8,
-                                             msiMultipleMinSize16, msiMultipleMinSize32,
-                                             msiMultipleMinSize64, msiMultipleMinSize128,
-                                             msiMultipleMinSize256, msiMultipleMinSize512,
-                                             msiVMemMultiple];
-
-  MemRefSizeInfoVMems: Set of TMemRefSizeInfo = [msiXMem32, msiXMem64, msiYMem32, msiYMem64,
-                                                 msiZMem32, msiZMem64,
-                                                 msiVMemMultiple, msiVMemRegSize];
-
-  MEMTYPES: TOpMemType = [otXMMRM, otXMMRM16, otXMMRM8, otYMMRM, otZMMRM,
-                          otMem8, otMem16, otMem32, otMem64, otMem128, otMem256, otMem512,
-                          otRM32, otRM64];
-  BMEMTYPES: TOpMemType = [otB32, otB64];
-
-var
-  InsTabCache : PInsTabCache;
-  InsTabMemRefSizeInfoCache: PInsTabMemRefSizeInfoCache;
-
-type
-
-
-    op2strtable=array[tasmop] of string[16];
-
-    {Instruction flags }
-    tinsflag = (
-      { please keep these in order and in sync with IF_SMASK }
-      IF_SM,                  { size match first two operands  }
-      IF_SM2,
-      IF_SB,                  { unsized operands can't be non-byte  }
-      IF_SW,                  { unsized operands can't be non-word  }
-      IF_SD,                  { unsized operands can't be nondword  }
-
-      { unsized argument spec }
-      { please keep these in order and in sync with IF_ARMASK }
-      IF_AR0,                 { SB, SW, SD applies to argument 0  }
-      IF_AR1,                 { SB, SW, SD applies to argument 1  }
-      IF_AR2,                 { SB, SW, SD applies to argument 2  }
-
-      IF_PRIV,                { it's a privileged instruction  }
-      IF_SMM,                 { it's only valid in SMM  }
-      IF_PROT,                { it's protected mode only  }
-      IF_NOX86_64,            { removed instruction in x86_64  }
-      IF_UNDOC,               { it's an undocumented instruction  }
-      IF_FPU,                 { it's an FPU instruction  }
-      IF_MMX,                 { it's an MMX instruction  }
-      { it's a 3DNow! instruction  }
-      IF_3DNOW,
-      { it's a SSE (KNI, MMX2) instruction  }
-      IF_SSE,
-      { SSE2 instructions  }
-      IF_SSE2,
-      { SSE3 instructions  }
-      IF_SSE3,
-      { SSE64 instructions  }
-      IF_SSE64,
-      { SVM instructions  }
-      IF_SVM,
-      { SSE4 instructions  }
-      IF_SSE4,
-      IF_SSSE3,
-      IF_SSE41,
-      IF_SSE42,
-      IF_MOVBE,
-      IF_CLMUL,
-      IF_AVX,
-      IF_AVX2,
-      IF_AVX512,
-      IF_BMI1,
-      IF_BMI2,
-      { Intel ADX (Multi-Precision Add-Carry Instruction Extensions) }
-      IF_ADX,
-      IF_16BITONLY,
-      IF_FMA,
-      IF_FMA4,
-      IF_TSX,
-      IF_RAND,
-      IF_XSAVE,
-      IF_PREFETCHWT1,
-
-      { mask for processor level }
-      { please keep these in order and in sync with IF_PLEVEL }
-      IF_8086,                { 8086 instruction  }
-      IF_186,                 { 186+ instruction  }
-      IF_286,                 { 286+ instruction  }
-      IF_386,                 { 386+ instruction  }
-      IF_486,                 { 486+ instruction  }
-      IF_PENT,                { Pentium instruction  }
-      IF_P6,                  { P6 instruction  }
-      IF_KATMAI,              { Katmai instructions  }
-      IF_WILLAMETTE,          { Willamette instructions }
-      IF_PRESCOTT,            { Prescott instructions }
-      IF_X86_64,
-      IF_SANDYBRIDGE,         { Sandybridge-specific instruction }
-      IF_NEC,                 { NEC V20/V30 instruction }
-
-      { the following are not strictly part of the processor level, because
-        they are never used standalone, but always in combination with a
-        separate processor level flag. Therefore, they use bits outside of
-        IF_PLEVEL, otherwise they would mess up the processor level they're
-        used in combination with.
-        The following combinations are currently used:
-        [IF_AMD, IF_P6],
-        [IF_CYRIX, IF_486],
-        [IF_CYRIX, IF_PENT],
-        [IF_CYRIX, IF_P6] }
-      IF_CYRIX,               { Cyrix, Centaur or VIA-specific instruction }
-      IF_AMD,                 { AMD-specific instruction  }
-
-      { added flags }
-      IF_PRE,                 { it's a prefix instruction }
-      IF_PASS2,               { if the instruction can change in a second pass }
-      IF_IMM4,                { immediate operand is a nibble (must be in range [0..15]) }
-      IF_IMM3,                 { immediate operand is a triad (must be in range [0..7]) }
-
-      IF_BCST2,
-      IF_BCST4,
-      IF_BCST8,
-      IF_BCST16,
-      IF_T2,                  { disp8 - tuple - 2 }
-      IF_T4,                  { disp8 - tuple - 4 }
-      IF_T8,                  { disp8 - tuple - 8 }
-      IF_T1S,                 { disp8 - tuple - 1 scalar }
-      IF_T1S8,
-      IF_T1S16,
-      IF_T1F32,
-      IF_T1F64,
-      IF_TMDDUP,
-      IF_TFV,                 { disp8 - tuple - full vector }
-      IF_TFVM,                { disp8 - tuple - full vector memory }
-      IF_TQVM,
-      IF_TMEM128,
-      IF_THV,
-      IF_THVM,
-      IF_TOVM,
-
-      IF_SCL32,
-      IF_SCL64
-
-
-    );
-    tinsflags=set of tinsflag;
-
-
-      tinsentry=packed record
-        opcode  : tasmop;
-        ops     : byte;
-        //optypes : array[0..max_operands-1] of longint;
-        optypes : array[0..3] of int64; //TG
-        code    : array[0..11] of char;
-        flags   : tinsflags;
-      end;
-      pinsentry=^tinsentry;
-
-const
-      OT_NONE      = $00000000;
-
-      { Bits 0..7: sizes }
-      OT_BITS8     = $00000001;
-      OT_BITS16    = $00000002;
-      OT_BITS32    = $00000004;
-      OT_BITS64    = $00000008;  { x86_64 and FPU }
-      //OT_BITS128   = $10000000;  { 16 byte SSE }
-      //OT_BITS256   = $20000000;  { 32 byte AVX }
-      //OT_BITS512   = $40000000;  { 64 byte AVX512 }
-      OT_BITS128   = $20000000;  { 16 byte SSE }
-      OT_BITS256   = $40000000;  { 32 byte AVX }
-      OT_BITS512   = $80000000;  { 64 byte AVX512 }
-
-      OT_VECTORMASK = $1000000000;  { OPTIONAL VECTORMASK AVX512}
-      OT_VECTORZERO = $2000000000;  { OPTIONAL ZERO-FLAG  AVX512}
-      OT_VECTORBCST = $4000000000;  { BROADCAST-MEM-FLAG  AVX512}
-      OT_VECTORSAE  = $8000000000;  { OPTIONAL SAE-FLAG  AVX512}
-      OT_VECTORER   = $10000000000; { OPTIONAL ER-FLAG-FLAG  AVX512}
-
-
-      OT_BITSB32    = OT_BITS32 or OT_VECTORBCST;
-      OT_BITSB64    = OT_BITS64 or OT_VECTORBCST;
-
-
-      OT_VECTOR_EXT_MASK = OT_VECTORMASK or OT_VECTORZERO or OT_VECTORBCST;
-
-      OT_BITS80    = $00000010;  { FPU only  }
-      OT_FAR       = $00000020;  { this means 16:16 or 16:32, like in CALL/JMP }
-      OT_NEAR      = $00000040;
-      OT_SHORT     = $00000080;
-
-      { TODO: FAR/NEAR/SHORT are sizes too, they should be included into size mask,
-        but this requires adjusting the opcode table }
-      //OT_SIZE_MASK = $3000001F;  { all the size attributes  }
-      OT_SIZE_MASK = $E000001F;  { all the size attributes  }
-      OT_NON_SIZE  = int64(not int64(OT_SIZE_MASK));
-
-      { Bits 8..11: modifiers }
-      OT_SIGNED    = $00000100;  { the operand need to be signed -128-127 }
-      OT_TO        = $00000200;  { reverse effect in FADD, FSUB &c  }
-      OT_COLON     = $00000400;  { operand is followed by a colon  }
-      OT_MODIFIER_MASK = $00000F00;
-
-      { Bits 12..15: type of operand }
-      OT_REGISTER  = $00001000;
-      OT_IMMEDIATE = $00002000;
-      OT_MEMORY    = $0000C000;  { always includes 'OT_REGMEM' bit as well }
-      OT_REGMEM    = $00008000;  { for r/m, ie EA, operands  }
-      OT_TYPE_MASK = OT_REGISTER or OT_IMMEDIATE or OT_MEMORY or OT_REGMEM;
-
-      OT_REGNORM   = OT_REGISTER or OT_REGMEM;  { 'normal' reg, qualifies as EA  }
-
-      { Bits 20..22, 24..26: register classes
-        otf_* consts are not used alone, only to build other constants. }
-      otf_reg_cdt  = $00100000;
-      otf_reg_gpr  = $00200000;
-      otf_reg_sreg = $00400000;
-      otf_reg_k    = $00800000;
-      otf_reg_fpu  = $01000000;
-      otf_reg_mmx  = $02000000;
-      otf_reg_xmm  = $04000000;
-      otf_reg_ymm  = $08000000;
-      otf_reg_zmm  = $10000000;
-
-
-      otf_reg_extra_mask = $0F000000;
-      { Bits 16..19: subclasses, meaning depends on classes field }
-      otf_sub0     = $00010000;
-      otf_sub1     = $00020000;
-      otf_sub2     = $00040000;
-      otf_sub3     = $00080000;
-      OT_REG_SMASK = otf_sub0 or otf_sub1 or otf_sub2 or otf_sub3;
-
-      //OT_REG_EXTRA_MASK = $0F000000;
-      OT_REG_EXTRA_MASK = $1F000000;
-
-      OT_REG_TYPMASK = otf_reg_cdt or otf_reg_gpr or otf_reg_sreg or otf_reg_k or otf_reg_extra_mask;
-      { register class 0: CRx, DRx and TRx }
-      OT_REG_CDT   = OT_REGISTER or otf_reg_cdt or OT_BITS64;
-      OT_REG_CREG  = OT_REG_CDT or otf_sub0;  { CRn  }
-      OT_REG_DREG  = OT_REG_CDT or otf_sub1;  { DRn  }
-      OT_REG_TREG  = OT_REG_CDT or otf_sub2;  { TRn  }
-      OT_REG_CR4   = OT_REG_CDT or otf_sub3;  { CR4 (Pentium only)  }
-
-      { register class 1: general-purpose registers }
-      OT_REG_GPR   = OT_REGNORM or otf_reg_gpr;
-      OT_RM_GPR    = OT_REGMEM or otf_reg_gpr;
-      OT_REG8      = OT_REG_GPR or OT_BITS8;  { 8-bit GPR }
-      OT_REG16     = OT_REG_GPR or OT_BITS16;
-      OT_REG32     = OT_REG_GPR or OT_BITS32;
-      OT_REG64     = OT_REG_GPR or OT_BITS64;
-
-      { GPR subclass 0: accumulator: AL, AX, EAX or RAX }
-      OT_REG_ACCUM = OT_REG_GPR or otf_sub0;
-      OT_REG_AL    = OT_REG_ACCUM or OT_BITS8;
-      OT_REG_AX    = OT_REG_ACCUM or OT_BITS16;
-      OT_REG_EAX   = OT_REG_ACCUM or OT_BITS32;
-      OT_REG_RAX   = OT_REG_ACCUM or OT_BITS64;
-      { GPR subclass 1: counter: CL, CX, ECX or RCX }
-      OT_REG_COUNT = OT_REG_GPR or otf_sub1;
-      OT_REG_CL    = OT_REG_COUNT or OT_BITS8;
-      OT_REG_CX    = OT_REG_COUNT or OT_BITS16;
-      OT_REG_ECX   = OT_REG_COUNT or OT_BITS32;
-      OT_REG_RCX   = OT_REG_COUNT or OT_BITS64;
-      { GPR subclass 2: data register: DL, DX, EDX or RDX }
-      OT_REG_DX    = OT_REG_GPR or otf_sub2 or OT_BITS16;
-      OT_REG_EDX   = OT_REG_GPR or otf_sub2 or OT_BITS32;
-
-      { register class 2: Segment registers }
-      OT_REG_SREG  = OT_REGISTER or otf_reg_sreg or OT_BITS16;
-      OT_REG_CS    = OT_REG_SREG or otf_sub0;  { CS  }
-      OT_REG_DESS  = OT_REG_SREG or otf_sub1;  { DS, ES, SS (non-CS 86 registers)  }
-      OT_REG_FSGS  = OT_REG_SREG or otf_sub2;  { FS, GS (386 extended registers)  }
-
-      { register class 3: FPU registers }
-      OT_FPUREG    = OT_REGISTER or otf_reg_fpu;
-      OT_FPU0      = OT_FPUREG or otf_sub0;    { FPU stack register zero  }
-
-      { register class 4: MMX (both reg and r/m) }
-      OT_MMXREG    = OT_REGNORM or otf_reg_mmx;
-      OT_MMXRM     = OT_REGMEM or otf_reg_mmx;
-
-      { register class 5: XMM (both reg and r/m) }
-      OT_XMMREG    = OT_REGNORM or otf_reg_xmm;
-      OT_XMMRM     = OT_REGMEM or otf_reg_xmm;
-      OT_XMEM32    = OT_REGNORM or otf_reg_xmm or otf_reg_gpr or OT_BITS32;
-      OT_XMEM32_M  = OT_XMEM32 or OT_VECTORMASK;
-      OT_XMEM64    = OT_REGNORM or otf_reg_xmm or otf_reg_gpr or OT_BITS64;
-      OT_XMEM64_M  = OT_XMEM64 or OT_VECTORMASK;
-
-      OT_XMMREG_M   = OT_XMMREG or OT_VECTORMASK;
-      OT_XMMREG_MZ  = OT_XMMREG or OT_VECTORMASK or OT_VECTORZERO;
-      OT_XMMRM_MZ   = OT_XMMRM  or OT_VECTORMASK or OT_VECTORZERO;
-      OT_XMMREG_SAE = OT_XMMREG or OT_VECTORSAE;
-      OT_XMMRM_SAE  = OT_XMMRM  or OT_VECTORSAE;
-      OT_XMMREG_ER  = OT_XMMREG or OT_VECTORER;
-      OT_XMMRM_ER   = OT_XMMRM  or OT_VECTORER;
-
-
-
-      { register class 5: YMM (both reg and r/m) }
-      OT_YMMREG     = OT_REGNORM or otf_reg_ymm;
-      OT_YMMRM      = OT_REGMEM or otf_reg_ymm;
-      OT_YMEM32     = OT_REGNORM or otf_reg_ymm or otf_reg_gpr or OT_BITS32;
-      OT_YMEM32_M   = OT_YMEM32 or OT_VECTORMASK;
-      OT_YMEM64     = OT_REGNORM or otf_reg_ymm or otf_reg_gpr or OT_BITS64;
-      OT_YMEM64_M   = OT_YMEM64 or OT_VECTORMASK;
-
-      OT_YMMREG_M   = OT_YMMREG or OT_VECTORMASK;
-      OT_YMMREG_MZ  = OT_YMMREG or OT_VECTORMASK or OT_VECTORZERO;
-      OT_YMMRM_MZ   = OT_YMMRM  or OT_VECTORMASK or OT_VECTORZERO;
-      OT_YMMREG_SAE = OT_YMMREG or OT_VECTORSAE;
-      OT_YMMRM_SAE  = OT_YMMRM  or OT_VECTORSAE;
-      OT_YMMREG_ER  = OT_YMMREG or OT_VECTORER;
-      OT_YMMRM_ER   = OT_YMMRM  or OT_VECTORER;
-
-
-      { register class 5: ZMM (both reg and r/m) }
-      OT_ZMMREG     = OT_REGNORM or otf_reg_zmm;
-      OT_ZMMRM      = OT_REGMEM or otf_reg_zmm;
-      OT_ZMEM32     = OT_REGNORM or otf_reg_zmm or otf_reg_gpr or OT_BITS32;
-      OT_ZMEM32_M   = OT_ZMEM32 or OT_VECTORMASK;
-      OT_ZMEM64     = OT_REGNORM or otf_reg_zmm or otf_reg_gpr or OT_BITS64;
-      OT_ZMEM64_M   = OT_ZMEM64 or OT_VECTORMASK;
-
-      OT_ZMMREG_M   = OT_ZMMREG or OT_VECTORMASK;
-      OT_ZMMREG_MZ  = OT_ZMMREG or OT_VECTORMASK or OT_VECTORZERO;
-      OT_ZMMRM_MZ   = OT_ZMMRM  or OT_VECTORMASK or OT_VECTORZERO;
-      OT_ZMMREG_SAE = OT_ZMMREG or OT_VECTORSAE;
-      OT_ZMMRM_SAE  = OT_ZMMRM  or OT_VECTORSAE;
-      OT_ZMMREG_ER  = OT_ZMMREG or OT_VECTORER;
-      OT_ZMMRM_ER   = OT_ZMMRM  or OT_VECTORER;
-
-
-      OT_KREG       = OT_REGNORM or otf_reg_k;
-      OT_KREG_M     = OT_KREG or OT_VECTORMASK;
-
-      { Vector-Memory operands }
-      OT_VMEM_ANY  = OT_XMEM32 or OT_XMEM64 or OT_YMEM32 or OT_YMEM64 or OT_ZMEM32 or OT_ZMEM64;
-
-      { Memory operands }
-      OT_MEM8      = OT_MEMORY or OT_BITS8;
-      OT_MEM16     = OT_MEMORY or OT_BITS16;
-      OT_MEM16_M   = OT_MEM16  or OT_VECTORMASK;
-      OT_MEM32     = OT_MEMORY or OT_BITS32;
-      OT_MEM32_M   = OT_MEMORY or OT_BITS32 or OT_VECTORMASK;
-      OT_BMEM32    = OT_MEMORY or OT_BITS32 or OT_VECTORBCST;
-      OT_BMEM32_SAE= OT_MEMORY or OT_BITS32 or OT_VECTORBCST or OT_VECTORSAE;
-      OT_MEM64     = OT_MEMORY or OT_BITS64;
-      OT_MEM64_M   = OT_MEMORY or OT_BITS64 or OT_VECTORMASK;
-      OT_BMEM64    = OT_MEMORY or OT_BITS64 or OT_VECTORBCST;
-      OT_BMEM64_SAE= OT_MEMORY or OT_BITS64 or OT_VECTORBCST or OT_VECTORSAE;
-      OT_MEM128    = OT_MEMORY or OT_BITS128;
-      OT_MEM128_M  = OT_MEMORY or OT_BITS128 or OT_VECTORMASK;
-      OT_MEM256    = OT_MEMORY or OT_BITS256;
-      OT_MEM256_M  = OT_MEMORY or OT_BITS256 or OT_VECTORMASK;
-      OT_MEM512    = OT_MEMORY or OT_BITS512;
-      OT_MEM512_M  = OT_MEMORY or OT_BITS512 or OT_VECTORMASK;
-      OT_MEM80     = OT_MEMORY or OT_BITS80;
-
-
-
-
-      OT_MEM_OFFS  = OT_MEMORY or otf_sub0;  { special type of EA  }
-                                             { simple [address] offset  }
-
-      { Matches any type of r/m operand }
-      OT_MEMORY_ANY = OT_MEMORY or OT_RM_GPR or OT_XMMRM or OT_MMXRM or OT_YMMRM or OT_ZMMRM or OT_REG_EXTRA_MASK;
-
-      { Immediate operands }
-      OT_IMM8      = OT_IMMEDIATE or OT_BITS8;
-      OT_IMM16     = OT_IMMEDIATE or OT_BITS16;
-      OT_IMM32     = OT_IMMEDIATE or OT_BITS32;
-      OT_IMM64     = OT_IMMEDIATE or OT_BITS64;
-
-      OT_ONENESS   = otf_sub0;  { special type of immediate operand  }
-      OT_UNITY     = OT_IMMEDIATE or OT_ONENESS;  { for shift/rotate instructions  }
-
-      std_op2str:op2strtable={$i ../../../compiler/x86_64/x8664int.inc}
-
-  InsTab:array[0..instabentries-1] of TInsEntry={$i ../../../compiler/x86_64/x8664tab.inc}
-
-  procedure BuildInsTabCache;
-  var
-    i : longint;
-  begin
-    new(instabcache);
-    FillChar(instabcache^,sizeof(tinstabcache),$ff);
-    i:=0;
-    while (i<InsTabEntries) do
-     begin
-       if InsTabCache^[InsTab[i].OPcode]=-1 then
-        InsTabCache^[InsTab[i].OPcode]:=i;
-       inc(i);
-     end;
-  end;
-
-  procedure BuildInsTabMemRefSizeInfoCache;
-  var
-    AsmOp: TasmOp;
-    i,j: longint;
-    insentry  : PInsEntry;
-
-    MRefInfo: TMemRefSizeInfo;
-    SConstInfo: TConstSizeInfo;
-    actRegSize: int64;
-    actMemSize: int64;
-    actConstSize: int64;
-    actRegCount: integer;
-    actMemCount: integer;
-    actConstCount: integer;
-    actRegTypes  : int64;
-    actRegMemTypes: int64;
-    NewRegSize: int64;
-
-    actVMemCount  : integer;
-    actVMemTypes  : int64;
-
-    RegMMXSizeMask: int64;
-    RegXMMSizeMask: int64;
-    RegYMMSizeMask: int64;
-    RegZMMSizeMask: int64;
-
-    RegMMXConstSizeMask: int64;
-    RegXMMConstSizeMask: int64;
-    RegYMMConstSizeMask: int64;
-    RegZMMConstSizeMask: int64;
-
-    RegBCSTSizeMask: int64;
-    RegBCSTXMMSizeMask: int64;
-    RegBCSTYMMSizeMask: int64;
-    RegBCSTZMMSizeMask: int64;
-    ExistsMemRef      : boolean;
-
-    bitcount          : integer;
-    ExistsCode336     : boolean;
-    ExistsCode337     : boolean;
-    ExistsSSEAVXReg   : boolean;
-
-    function bitcnt(aValue: int64): integer;
-    var
-      i: integer;
-    begin
-      result := 0;
-
-      for i := 0 to 63 do
-      begin
-        if (aValue mod 2) = 1 then
-        begin
-          inc(result);
-        end;
-
-        aValue := aValue shr 1;
-      end;
-    end;
-
-  begin
-    new(InsTabMemRefSizeInfoCache);
-    FillChar(InsTabMemRefSizeInfoCache^,sizeof(TInsTabMemRefSizeInfoCache),0);
-
-    for AsmOp := low(TAsmOp) to high(TAsmOp) do
-    begin
-      i := InsTabCache^[AsmOp];
-
-      if i >= 0 then
-      begin
-
-
-        InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize           := msiUnknown;
-        InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST       := msbUnknown;
-        InsTabMemRefSizeInfoCache^[AsmOp].BCSTXMMMultiplicator := 0;
-        InsTabMemRefSizeInfoCache^[AsmOp].ConstSize            := csiUnknown;
-        InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX         := false;
-        InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes            := [];
-
-        insentry:=@instab[i];
-
-        RegMMXSizeMask := 0;
-        RegXMMSizeMask := 0;
-        RegYMMSizeMask := 0;
-        RegZMMSizeMask := 0;
-
-        RegMMXConstSizeMask := 0;
-        RegXMMConstSizeMask := 0;
-        RegYMMConstSizeMask := 0;
-        RegZMMConstSizeMask := 0;
-
-        RegBCSTSizeMask:= 0;
-        RegBCSTXMMSizeMask := 0;
-        RegBCSTYMMSizeMask := 0;
-        RegBCSTZMMSizeMask := 0;
-        ExistsMemRef       := false;
-
-        while (insentry^.opcode=AsmOp) do
-        begin
-          MRefInfo         := msiUnknown;
-
-          actRegSize       := 0;
-          actRegCount      := 0;
-          actRegTypes      := 0;
-          NewRegSize       := 0;
-
-          actMemSize       := 0;
-          actMemCount      := 0;
-          actRegMemTypes   := 0;
-
-          actVMemCount     := 0;
-          actVMemTypes     := 0;
-
-          actConstSize     := 0;
-          actConstCount    := 0;
-
-          ExistsCode336   := false; // indicate fixed operand size 32 bit
-          ExistsCode337   := false; // indicate fixed operand size 64 bit
-          ExistsSSEAVXReg := false;
-
-          // parse insentry^.code for &336 and &337
-          // &336 (octal) = 222 (decimal) == fixed operand size 32 bit
-          // &337 (octal) = 223 (decimal) == fixed operand size 64 bit
-          for i := low(insentry^.code) to high(insentry^.code) do
-          begin
-            case insentry^.code[i] of
-              #222: ExistsCode336 := true;
-              #223: ExistsCode337 := true;
-              #0,#1,#2,#3: break;
-            end;
-          end;
-
-          for i := 0 to insentry^.ops -1 do
-          begin
-            if (insentry^.optypes[i] and OT_REGISTER) = OT_REGISTER then
-             case insentry^.optypes[i] and (OT_XMMREG or OT_YMMREG or OT_ZMMREG or OT_KREG or OT_REG_EXTRA_MASK) of
-                OT_XMMREG,
-                OT_YMMREG,
-                OT_ZMMREG: ExistsSSEAVXReg := true;
-                      else;
-             end;
-          end;
-
-
-          for j := 0 to insentry^.ops -1 do
-          begin
-            if ((insentry^.optypes[j] and OT_XMEM32) = OT_XMEM32) OR
-               ((insentry^.optypes[j] and OT_XMEM64) = OT_XMEM64) OR
-               ((insentry^.optypes[j] and OT_YMEM32) = OT_YMEM32) OR
-               ((insentry^.optypes[j] and OT_YMEM64) = OT_YMEM64) OR
-               ((insentry^.optypes[j] and OT_ZMEM32) = OT_ZMEM32) OR
-               ((insentry^.optypes[j] and OT_ZMEM64) = OT_ZMEM64) then
-            begin
-              inc(actVMemCount);
-
-              case insentry^.optypes[j] and (OT_XMEM32 OR OT_XMEM64 OR OT_YMEM32 OR OT_YMEM64 OR OT_ZMEM32 OR OT_ZMEM64) of
-                OT_XMEM32: actVMemTypes := actVMemTypes or OT_XMEM32;
-                OT_XMEM64: actVMemTypes := actVMemTypes or OT_XMEM64;
-                OT_YMEM32: actVMemTypes := actVMemTypes or OT_YMEM32;
-                OT_YMEM64: actVMemTypes := actVMemTypes or OT_YMEM64;
-                OT_ZMEM32: actVMemTypes := actVMemTypes or OT_ZMEM32;
-                OT_ZMEM64: actVMemTypes := actVMemTypes or OT_ZMEM64;
-                      else;
-              end;
-            end
-            else if (insentry^.optypes[j] and OT_REGISTER) = OT_REGISTER then
-            begin
-              inc(actRegCount);
-
-                NewRegSize := (insentry^.optypes[j] and OT_SIZE_MASK);
-                if NewRegSize = 0 then
-                  begin
-                    case insentry^.optypes[j] and (OT_MMXREG or OT_XMMREG or OT_YMMREG or OT_ZMMREG or OT_KREG or OT_REG_EXTRA_MASK) of
-                      OT_MMXREG: begin
-                                   NewRegSize := OT_BITS64;
-                                 end;
-                      OT_XMMREG: begin
-                                   NewRegSize := OT_BITS128;
-                                   InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := true;
-                                 end;
-                      OT_YMMREG: begin
-                                   NewRegSize := OT_BITS256;
-                                   InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := true;
-                                 end;
-                      OT_ZMMREG: begin
-                                   NewRegSize := OT_BITS512;
-                                   InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := true;
-                                 end;
-                        OT_KREG: begin
-                                   InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := true;
-                                 end;
-
-                            else NewRegSize := not(0);
-                    end;
-                end;
-
-              actRegSize  := actRegSize or NewRegSize;
-              actRegTypes := actRegTypes or (insentry^.optypes[j] and (OT_MMXREG or OT_XMMREG or OT_YMMREG or OT_ZMMREG or OT_KREG or OT_REG_EXTRA_MASK));
-              end
-            else if ((insentry^.optypes[j] and OT_MEMORY) <> 0) then
-              begin
-                inc(actMemCount);
-
-
-                if ExistsSSEAVXReg and ExistsCode336 then
-                  actMemSize := actMemSize or OT_BITS32
-                else if ExistsSSEAVXReg and ExistsCode337 then
-                  actMemSize := actMemSize or OT_BITS64
-                else
-                  actMemSize:=actMemSize or (insentry^.optypes[j] and (OT_SIZE_MASK OR OT_VECTORBCST));
-
-                if (insentry^.optypes[j] and OT_REGMEM) = OT_REGMEM then
-                  begin
-                    actRegMemTypes  := actRegMemTypes or insentry^.optypes[j];
-                  end;
-              end
-            else if ((insentry^.optypes[j] and OT_IMMEDIATE) = OT_IMMEDIATE) then
-            begin
-              inc(actConstCount);
-
-              actConstSize    := actConstSize or (insentry^.optypes[j] and OT_SIZE_MASK);
-            end
-          end;
-
-          if actConstCount > 0 then
-          begin
-            case actConstSize of
-              0: SConstInfo := csiNoSize;
-              OT_BITS8: SConstInfo := csiMem8;
-              OT_BITS16: SConstInfo := csiMem16;
-              OT_BITS32: SConstInfo := csiMem32;
-              OT_BITS64: SConstInfo := csiMem64;
-              else SConstInfo := csiMultiple;
-            end;
-
-            if InsTabMemRefSizeInfoCache^[AsmOp].ConstSize = csiUnknown then
-            begin
-              InsTabMemRefSizeInfoCache^[AsmOp].ConstSize := SConstInfo;
-            end
-            else if InsTabMemRefSizeInfoCache^[AsmOp].ConstSize <> SConstInfo then
-            begin
-              InsTabMemRefSizeInfoCache^[AsmOp].ConstSize := csiMultiple;
-            end;
-          end;
-
-          if actVMemCount > 0 then
-          begin
-            if actVMemCount = 1 then
-            begin
-              if actVMemTypes > 0 then
-              begin
-                case actVMemTypes of
-                  OT_XMEM32: MRefInfo := msiXMem32;
-                  OT_XMEM64: MRefInfo := msiXMem64;
-                  OT_YMEM32: MRefInfo := msiYMem32;
-                  OT_YMEM64: MRefInfo := msiYMem64;
-                  OT_ZMEM32: MRefInfo := msiZMem32;
-                  OT_ZMEM64: MRefInfo := msiZMem64;
-                        else;
-                end;
-
-                case actRegTypes of
-                  OT_XMMREG: case MRefInfo of
-                               msiXMem32,
-                               msiXMem64: RegXMMSizeMask := RegXMMSizeMask or OT_BITS128;
-                               msiYMem32,
-                               msiYMem64: RegXMMSizeMask := RegXMMSizeMask or OT_BITS256;
-                               msiZMem32,
-                               msiZMem64: RegXMMSizeMask := RegXMMSizeMask or OT_BITS512;
-                                     else;
-                             end;
-                  OT_YMMREG: case MRefInfo of
-                               msiXMem32,
-                               msiXMem64: RegYMMSizeMask := RegYMMSizeMask or OT_BITS128;
-                               msiYMem32,
-                               msiYMem64: RegYMMSizeMask := RegYMMSizeMask or OT_BITS256;
-                               msiZMem32,
-                               msiZMem64: RegYMMSizeMask := RegYMMSizeMask or OT_BITS512;
-                                     else;
-                             end;
-                  OT_ZMMREG: case MRefInfo of
-                               msiXMem32,
-                               msiXMem64: RegZMMSizeMask := RegZMMSizeMask or OT_BITS128;
-                               msiYMem32,
-                               msiYMem64: RegZMMSizeMask := RegZMMSizeMask or OT_BITS256;
-                               msiZMem32,
-                               msiZMem64: RegZMMSizeMask := RegZMMSizeMask or OT_BITS512;
-                                     else;
-                             end;
-
-                        //else InternalError(777209);
-                end;
-
-
-                if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnknown then
-                begin
-                  InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := MRefInfo;
-                end
-                else if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize <> MRefInfo then
-                begin
-                  if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize in [msiXMem32, msiXMem64, msiYMem32, msiYMem64, msiZMem32, msiZMem64] then
-                  begin
-                    InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiVMemMultiple;
-                  end
-                  else if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize <> msiVMemMultiple then;
-                end;
-
-              end;
-            end
-            else;
-          end
-          else
-            begin
-              if (actMemCount=2) and ((AsmOp=A_MOVS) or (AsmOp=A_CMPS)) then actMemCount:=1;
-
-              ExistsMemRef := ExistsMemRef or (actMemCount > 0);
-
-              case actMemCount of
-                0: ; // nothing todo
-                1: begin
-                     MRefInfo := msiUnknown;
-
-                     if not(ExistsCode336 or ExistsCode337) then
-                       case actRegMemTypes and (OT_MMXRM or OT_XMMRM or OT_YMMRM or OT_ZMMRM or OT_REG_EXTRA_MASK) of
-                         OT_MMXRM: actMemSize := actMemSize or OT_BITS64;
-                         OT_XMMRM: actMemSize := actMemSize or OT_BITS128;
-                         OT_YMMRM: actMemSize := actMemSize or OT_BITS256;
-                         OT_ZMMRM: actMemSize := actMemSize or OT_BITS512;
-                       end;
-
-                     case actMemSize of
-                                0: MRefInfo := msiNoSize;
-                         OT_BITS8: MRefInfo := msiMem8;
-                        OT_BITS16: MRefInfo := msiMem16;
-                        OT_BITS32: MRefInfo := msiMem32;
-                       OT_BITSB32: MRefInfo := msiBMem32;
-                        OT_BITS64: MRefInfo := msiMem64;
-                       OT_BITSB64: MRefInfo := msiBMem64;
-                       OT_BITS128: MRefInfo := msiMem128;
-                       OT_BITS256: MRefInfo := msiMem256;
-                       OT_BITS512: MRefInfo := msiMem512;
-                       OT_BITS80,
-                       OT_FAR,
-                       OT_NEAR,
-                       OT_SHORT: ; // ignore
-                       else
-                         begin
-                           bitcount := bitcnt(actMemSize);
-
-                           if bitcount > 1 then MRefInfo := msiMultiple
-                           else;
-                         end;
-                     end;
-
-                     if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnknown then
-                       begin
-                         InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := MRefInfo;
-                       end
-                     else
-                     begin
-                       // ignore broadcast-memory
-                       if not(MRefInfo in [msiBMem32, msiBMem64]) then
-                       begin
-                         if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize <> MRefInfo then
-                         begin
-                           with InsTabMemRefSizeInfoCache^[AsmOp] do
-                           begin
-                             if ((MemRefSize in [msiMem8, msiMULTIPLEMinSize8]) OR (MRefInfo = msiMem8))   then MemRefSize := msiMultipleMinSize8
-                             else if ((MemRefSize in [ msiMem16,  msiMULTIPLEMinSize16])  OR (MRefInfo =  msiMem16)) then MemRefSize := msiMultipleMinSize16
-                             else if ((MemRefSize in [ msiMem32,  msiMULTIPLEMinSize32])  OR (MRefInfo =  msiMem32)) then MemRefSize := msiMultipleMinSize32
-                             else if ((MemRefSize in [ msiMem64,  msiMULTIPLEMinSize64])  OR (MRefInfo =  msiMem64)) then MemRefSize := msiMultipleMinSize64
-                             else if ((MemRefSize in [msiMem128, msiMULTIPLEMinSize128])  OR (MRefInfo = msiMem128)) then MemRefSize := msiMultipleMinSize128
-                             else if ((MemRefSize in [msiMem256, msiMULTIPLEMinSize256])  OR (MRefInfo = msiMem256)) then MemRefSize := msiMultipleMinSize256
-                             else if ((MemRefSize in [msiMem512, msiMULTIPLEMinSize512])  OR (MRefInfo = msiMem512)) then MemRefSize := msiMultipleMinSize512
-                             else MemRefSize := msiMultiple;
-                           end;
-                         end;
-                       end;
-                     end;
-
-                     //if not(MRefInfo in [msiBMem32, msiBMem64]) and (actRegCount > 0) then
-                     if actRegCount > 0 then
-                     begin
-                       if MRefInfo in [msiBMem32, msiBMem64] then
-                       begin
-                         if IF_BCST2  in insentry^.flags then InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes + [bt1to2];
-                         if IF_BCST4  in insentry^.flags then InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes + [bt1to4];
-                         if IF_BCST8  in insentry^.flags then InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes + [bt1to8];
-                         if IF_BCST16 in insentry^.flags then InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes + [bt1to16];
-
-                         //InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes
-
-                         // BROADCAST - OPERAND
-                         RegBCSTSizeMask := RegBCSTSizeMask or actMemSize;
-
-                         case actRegTypes and (OT_XMMREG or OT_YMMREG or OT_ZMMREG or OT_REG_EXTRA_MASK) of
-                           OT_XMMREG: RegBCSTXMMSizeMask := RegBCSTXMMSizeMask or actMemSize;
-                           OT_YMMREG: RegBCSTYMMSizeMask := RegBCSTYMMSizeMask or actMemSize;
-                           OT_ZMMREG: RegBCSTZMMSizeMask := RegBCSTZMMSizeMask or actMemSize;
-                                 else begin
-
-                                        RegBCSTXMMSizeMask := not(0);
-                                        RegBCSTYMMSizeMask := not(0);
-                                        RegBCSTZMMSizeMask := not(0);
-                                      end;
-                         end;
-                       end
-                       else
-                       case actRegTypes and (OT_MMXREG or OT_XMMREG or OT_YMMREG or OT_ZMMREG or OT_REG_EXTRA_MASK) of
-                         OT_MMXREG: if actConstCount > 0 then RegMMXConstSizeMask := RegMMXConstSizeMask or actMemSize
-                                     else RegMMXSizeMask := RegMMXSizeMask or actMemSize;
-                         OT_XMMREG: if actConstCount > 0 then RegXMMConstSizeMask := RegXMMConstSizeMask or actMemSize
-                                     else RegXMMSizeMask := RegXMMSizeMask or actMemSize;
-                         OT_YMMREG: if actConstCount > 0 then RegYMMConstSizeMask := RegYMMConstSizeMask or actMemSize
-                                     else RegYMMSizeMask := RegYMMSizeMask or actMemSize;
-                         OT_ZMMREG: if actConstCount > 0 then RegZMMConstSizeMask := RegZMMConstSizeMask or actMemSize
-                                     else RegZMMSizeMask := RegZMMSizeMask or actMemSize;
-                               else begin
-                                      RegMMXSizeMask := not(0);
-                                      RegXMMSizeMask := not(0);
-                                      RegYMMSizeMask := not(0);
-                                      RegZMMSizeMask := not(0);
-
-                                      RegMMXConstSizeMask := not(0);
-                                      RegXMMConstSizeMask := not(0);
-                                      RegYMMConstSizeMask := not(0);
-                                      RegZMMConstSizeMask := not(0);
-                                    end;
-                       end;
-                     end
-                     else
-
-
-                   end
-                else;
-              end;
-            end;
-
-          inc(insentry);
-        end;
-
-        if InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX then
-        begin
-          case RegBCSTSizeMask of
-                    0: ; // ignore;
-            OT_BITSB32: begin
-                          InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST       := msbBCST32;
-                          InsTabMemRefSizeInfoCache^[AsmOp].BCSTXMMMultiplicator := 4;
-                        end;
-            OT_BITSB64: begin
-                          InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST       := msbBCST64;
-                          InsTabMemRefSizeInfoCache^[AsmOp].BCSTXMMMultiplicator := 2;
-                        end;
-                  else begin
-                         InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST := msbMultiple;
-                       end;
-          end;
-        end;
-
-
-        if (InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize in MemRefMultiples) and
-           (InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX)then
-        begin
-          if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiVMemMultiple then
-          begin
-            if ((RegXMMSizeMask = OT_BITS128) or (RegXMMSizeMask = 0))     and
-               ((RegYMMSizeMask = OT_BITS256) or (RegYMMSizeMask = 0))     and
-               ((RegZMMSizeMask = OT_BITS512) or (RegZMMSizeMask = 0))     and
-               ((RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask) <> 0) then
-            begin
-              InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiVMemRegSize;
-            end;
-          end
-          else if (RegMMXSizeMask or RegMMXConstSizeMask) <> 0 then
-          begin
-            if ((RegMMXSizeMask or RegMMXConstSizeMask) = OT_BITS64)  and
-               ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS128) and
-               ((RegYMMSizeMask or RegYMMConstSizeMask) = 0)          and
-               ((RegZMMSizeMask or RegZMMConstSizeMask) = 0) then
-            begin
-              InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegSize;
-            end;
-          end
-          else if (((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS128) or ((RegXMMSizeMask or RegXMMConstSizeMask) = 0)) and
-                  (((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS256) or ((RegYMMSizeMask or RegYMMConstSizeMask) = 0)) and
-                  (((RegZMMSizeMask or RegZMMConstSizeMask) = OT_BITS512) or ((RegZMMSizeMask or RegZMMConstSizeMask) = 0)) and
-                  (((RegXMMSizeMask or RegXMMConstSizeMask or
-                     RegYMMSizeMask or RegYMMConstSizeMask or
-                     RegZMMSizeMask or RegZMMConstSizeMask)) <> 0) then
-          begin
-            InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegSize;
-          end
-          else if (RegXMMSizeMask or RegXMMConstSizeMask = OT_BITS16) and
-                  (RegYMMSizeMask or RegYMMConstSizeMask = OT_BITS32) and
-                  (RegZMMSizeMask or RegZMMConstSizeMask = 0) then
-          begin
-            InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx16y32;
-          end
-          else if (RegXMMSizeMask or RegXMMConstSizeMask = OT_BITS16) and
-                  (RegYMMSizeMask or RegYMMConstSizeMask = OT_BITS32) and
-                  (RegZMMSizeMask or RegZMMConstSizeMask = OT_BITS64) then
-          begin
-            InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx16y32z64;
-          end
-          else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS32) and
-                  ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS64) then
-          begin
-            if ((RegZMMSizeMask or RegZMMConstSizeMask) = 0) then
-            begin
-              InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx32y64;
-            end
-            else if ((RegZMMSizeMask or RegZMMConstSizeMask) = OT_BITS128) then
-            begin
-              InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx32y64z128;
-            end;
-          end
-          else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS64)  and
-                  ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS128) and
-                  ((RegZMMSizeMask or RegZMMConstSizeMask) = 0) then
-          begin
-            InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx64y128;
-          end
-          else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS64)  and
-                  ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS128) and
-                  ((RegZMMSizeMask or RegZMMConstSizeMask) = OT_BITS256) then
-          begin
-            InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx64y128z256;
-          end
-          else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS64)  and
-                  ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS256) and
-                  ((RegZMMSizeMask or RegZMMConstSizeMask) = 0) then
-          begin
-            InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx64y256;
-          end
-          else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS64)  and
-                  ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS256) and
-                  ((RegZMMSizeMask or RegZMMConstSizeMask) = OT_BITS512) then
-          begin
-            InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx64y256z512;
-          end
-          else if ((RegXMMConstSizeMask = 0) or (RegXMMConstSizeMask = OT_BITS128))     and
-                  ((RegYMMConstSizeMask = 0) or (RegYMMConstSizeMask = OT_BITS256))     and
-                  ((RegZMMConstSizeMask = 0) or (RegZMMConstSizeMask = OT_BITS512))     and
-                  ((RegXMMConstSizeMask or RegYMMConstSizeMask or RegZMMConstSizeMask) <> 0) and
-                  (
-                   ((RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask) = OT_BITS128) or
-                   ((RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask) = OT_BITS256) or
-                   ((RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask) = OT_BITS512)
-                  ) then
-          begin
-            case RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask of
-              OT_BITS128: InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegConst128;
-              OT_BITS256: InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegConst256;
-              OT_BITS512: InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegConst512;
-                     else InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMultiple;
-            end;
-          end
-          else
-          begin
-            if not(
-                   (AsmOp = A_CVTSI2SS) or
-                   (AsmOp = A_CVTSI2SD) or
-                   (AsmOp = A_CVTPD2DQ) or
-                   (AsmOp = A_VCVTPD2DQ) or
-                   (AsmOp = A_VCVTPD2PS) or
-                   (AsmOp = A_VCVTSI2SD) or
-                   (AsmOp = A_VCVTSI2SS) or
-                   (AsmOp = A_VCVTTPD2DQ) or
-                   (AsmOp = A_VCVTPD2UDQ) or
-                   (AsmOp = A_VCVTQQ2PS) or
-                   (AsmOp = A_VCVTTPD2UDQ) or
-                   (AsmOp = A_VCVTUQQ2PS) or
-                   (AsmOp = A_VCVTUSI2SD) or
-                   (AsmOp = A_VCVTUSI2SS) or
-
-
-                   // TODO check
-                   (AsmOp = A_VCMPSS)
-
-
-                  ) then;
-
-          end;
-
-        end
-        else if (InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX) and
-                (InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnknown) and
-                (not(ExistsMemRef)) then
-        begin
-          InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiNoMemRef;
-        end;
-
-        InsTabMemRefSizeInfoCache^[AsmOp].RegXMMSizeMask:=RegXMMSizeMask;
-        InsTabMemRefSizeInfoCache^[AsmOp].RegYMMSizeMask:=RegYMMSizeMask;
-        InsTabMemRefSizeInfoCache^[AsmOp].RegZMMSizeMask:=RegZMMSizeMask;
-
-      end;
-    end;
-
-    for AsmOp := low(TAsmOp) to high(TAsmOp) do
-    begin
-
-
-      // only supported intructiones with SSE- or AVX-operands
-      if not(InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX) then
-      begin
-        InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize  := msiUnknown;
-        InsTabMemRefSizeInfoCache^[AsmOp].ConstSize   := csiUnknown;
-      end;
-    end;
-  end;
-
-{ TOperandListItem }
-
-constructor TOperandListItem.Create;
-begin
-  inherited;
-
-  FOpActive := false;
-  FOpNumber := -1;
-  FOpTyp    := otUnknown;
-  FValues := TStringList.Create;
-end;
-
-destructor TOperandListItem.Destroy;
-begin
-  FreeAndNil(FValues);
-  inherited;
-end;
-
-{ TOperandList }
-
-function TOperandList.Add(aItem: TOperandListItem): integer;
-begin
-  result := FList.Add(aItem);
-end;
-
-function TOperandList.GetItems(aIndex: integer): TOperandListItem;
-begin
-  result := TOperandListItem(FList[aIndex]);
-end;
-
-{ TAsmTestGenerator }
-
-function TAsmTestGenerator.InternalCalcTestData(const aInst, aOp1, aOp2, aOp3,
-  aOp4: String): TStringList;
-var
-  i: integer;
-  Item: TOperandListItem;
-  OItem1: TOperandListItem;
-  OItem2: TOperandListItem;
-  OItem3: TOperandListItem;
-  OItem4: TOperandListItem;
-
-  il_Op: integer;
-  il_Op1: integer;
-  il_Op2: integer;
-  il_Op3: integer;
-  il_Op4: integer;
-
-  sSuffix: string;
-  sl_Operand: String;
-  sl_Inst   : String;
-  sl_RegCombi: String;
-  sl_Prefix: String;
-  UsePrefix: boolean;
-  il_Operands: integer;
-  UsedParams: cardinal;
-  UseDefault: boolean;
-  sl_RegCombi1: string;
-  sl_RegCombi2: string;
-  sl_RegCombi3: string;
-  MaskRegNeeded:boolean;
-
-
-  function PrepareOperandTyp(const aTyp: String): String;
-  begin
-    result := aTyp;
-    if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1);
-    if result = 'XMMRM128' then result := 'XMMRM';
-    if result = 'YMMRM256' then result := 'YMMRM';
-  end;
-
-
-begin
-  result := TStringList.Create;
-
-  OItem1 := TOperandListItem.Create;
-  try
-    OItem2 := TOperandListItem.Create;
-    try
-      OItem3 := TOperandListItem.Create;
-      try
-        OItem4 := TOperandListItem.Create;
-        try
-
-          UsePrefix := (UpperCase(aInst) = 'VCVTPD2DQ') OR
-                       (UpperCase(aInst) = 'VCVTPD2PS') OR
-                       (UpperCase(aInst) = 'VCVTSI2SD') OR
-                       (UpperCase(aInst) = 'VCVTSI2SS') OR
-                       (UpperCase(aInst) = 'VCVTTPD2DQ') or
-                       (UpperCase(aInst) = 'VPMOVZXWQ') or
-                       (UpperCase(aInst) = 'VCVTPD2UDQ') or
-                       (UpperCase(aInst) = 'VCVTPD2UDQ') or
-                       (UpperCase(aInst) = 'VCVTTPD2UDQ') or
-                       (UpperCase(aInst) = 'VCVTUQQ2PS') or
-                       (UpperCase(aInst) = 'VCVTQQ2PS') or
-                       (UpperCase(aInst) = 'VCVTUSI2SD') or
-                       (UpperCase(aInst) = 'VCVTUSI2SS') or
-                       (UpperCase(aInst) = 'VFPCLASSPD') or
-                       (UpperCase(aInst) = 'VFPCLASSPS') or
-                       (UpperCase(aInst) = 'VCMPSS')
-
-                       ;
-
-            
-          MaskRegNeeded := (Pos('VGATHER', Uppercase(aInst)) = 1) or
-                           (Pos('VPGATHER', Uppercase(aInst)) = 1) or
-			   (Pos('VPSCATTER', Uppercase(aInst)) = 1) or
-			   (Pos('VSCATTER', Uppercase(aInst)) = 1);
-
-          for il_Op := 1 to 4 do
-          begin
-            sl_Prefix := '';
-
-            case il_Op of
-              1: begin
-                   Item := OItem1;
-                   sl_Operand := aOp1;
-                 end;
-              2: begin
-                   Item := OItem2;
-                   sl_Operand := aOp2;
-                 end;
-              3: begin
-                   Item := OItem3;
-                   sl_Operand := aOp3;
-                 end;
-              4: begin
-                   Item := OItem4;
-                   sl_Operand := aOp4;
-                 end;
-            end;
-
-            sl_Operand := PrepareOperandTyp(sl_Operand);
-
-            if (AnsiSameText(sl_Operand, 'XMMREG')) or
-               (AnsiSameText(sl_Operand, 'XMMREG_M')) or
-               (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
-               (AnsiSameText(sl_Operand, 'XMMREG_ER')) or
-               (AnsiSameText(sl_Operand, 'XMMREG_SAE')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMMReg;
-              Item.OpActive := true;
-
-              sSuffix := '';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
-               else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if Pos('_ER', sl_Operand) > 0 then sSuffix := ', {ru-sae}'
-               else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
-
-              Item.Values.Add('XMM0' + sSuffix);
-              Item.Values.Add('XMM1' + sSuffix);
-              Item.Values.Add('XMM2' + sSuffix);
-              Item.Values.Add('XMM3' + sSuffix);
-              Item.Values.Add('XMM4' + sSuffix);
-              Item.Values.Add('XMM5' + sSuffix);
-              Item.Values.Add('XMM6' + sSuffix);
-              Item.Values.Add('XMM7' + sSuffix);
-
-              if x64 then
-              begin
-                Item.Values.Clear;
-                if FAVX512 then
-                begin
-                  Item.Values.Add('XMM0' + sSuffix);
-                  Item.Values.Add('XMM9' + sSuffix);
-                  Item.Values.Add('XMM18' + sSuffix);
-                  Item.Values.Add('XMM27' + sSuffix);
-                  Item.Values.Add('XMM31' + sSuffix);
-
-                  if (sSuffix <> '') and
-		     (MaskRegNeeded = false)  then
-                  begin
-                    Item.Values.Add('XMM0');
-                    Item.Values.Add('XMM9');
-                    Item.Values.Add('XMM18');
-                    Item.Values.Add('XMM27');
-                    Item.Values.Add('XMM31');
-                  end;    
-                end
-                else
-                begin
-                  Item.Values.Add('XMM0' + sSuffix);
-                  Item.Values.Add('XMM4' + sSuffix);
-                  Item.Values.Add('XMM8' + sSuffix);
-                  Item.Values.Add('XMM12' + sSuffix);
-                  Item.Values.Add('XMM15' + sSuffix);
-
-                  if (sSuffix <> '') and
-		     (MaskRegNeeded = false)  then
-                  begin
-                    Item.Values.Add('XMM0');
-                    Item.Values.Add('XMM4');
-                    Item.Values.Add('XMM8');
-                    Item.Values.Add('XMM12');
-                    Item.Values.Add('XMM15');
-                  end;    
-                end;
-              end;
-            end
-            else if (AnsiSameText(sl_Operand, 'XMMRM')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_M')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_MZ')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_SAE')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMMRM;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'oword ';
-	      
-	      sSuffix := '';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
-               else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
-               else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
-
-              Item.Values.Add('XMM0' + sSuffix);
-              Item.Values.Add('XMM1' + sSuffix);
-              Item.Values.Add('XMM2' + sSuffix);
-              Item.Values.Add('XMM3' + sSuffix);
-              Item.Values.Add('XMM4' + sSuffix);
-              Item.Values.Add('XMM5' + sSuffix);
-              Item.Values.Add('XMM6' + sSuffix);
-              Item.Values.Add('XMM7' + sSuffix);
-
-              if x64 then
-              begin
-                Item.Values.Clear;
-                if FAVX512 then
-                begin
-                  Item.Values.Add('XMM0' + sSuffix);
-                  Item.Values.Add('XMM0');
-                  Item.Values.Add('XMM9' + sSuffix);
-                  Item.Values.Add('XMM9');
-                  Item.Values.Add('XMM18' + sSuffix);
-                  Item.Values.Add('XMM18');
-                  Item.Values.Add('XMM27' + sSuffix);
-                  Item.Values.Add('XMM27');
-                  Item.Values.Add('XMM31' + sSuffix);
-                  Item.Values.Add('XMM31');
-                end
-                else
-                begin
-                  Item.Values.Add('XMM0' + sSuffix);
-                  Item.Values.Add('XMM0');
-                  Item.Values.Add('XMM4' + sSuffix);
-                  Item.Values.Add('XMM4');
-                  Item.Values.Add('XMM8' + sSuffix);
-                  Item.Values.Add('XMM8');
-                  Item.Values.Add('XMM12' + sSuffix);
-                  Item.Values.Add('XMM15');
-                  Item.Values.Add('XMM15' + sSuffix);
-                end;
-
-                MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else
-              begin
-                MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
-              end;
-            end
-            else if (AnsiSameText(sl_Operand, 'XMMRM8')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM8_M')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM8_MZ')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM8_ER')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM8_SAE')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMMRM8;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'byte ';
-
-              sSuffix := '';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
-               else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
-               else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
-
-              Item.Values.Add('XMM0' + sSuffix);
-              Item.Values.Add('XMM1' + sSuffix);
-              Item.Values.Add('XMM2' + sSuffix);
-              Item.Values.Add('XMM3' + sSuffix);
-              Item.Values.Add('XMM4' + sSuffix);
-              Item.Values.Add('XMM5' + sSuffix);
-              Item.Values.Add('XMM6' + sSuffix);
-              Item.Values.Add('XMM7' + sSuffix);
-
-              if x64 then
-              begin
-                Item.Values.Clear;
-                if FAVX512 then
-                begin
-                  Item.Values.Add('XMM0' + sSuffix);
-                  Item.Values.Add('XMM0');
-                  Item.Values.Add('XMM9' + sSuffix);
-                  Item.Values.Add('XMM9');
-                  Item.Values.Add('XMM18' + sSuffix);
-                  Item.Values.Add('XMM18');
-                  Item.Values.Add('XMM27' + sSuffix);
-                  Item.Values.Add('XMM27');
-                  Item.Values.Add('XMM31' + sSuffix);
-                  Item.Values.Add('XMM31');
-                end
-                else
-                begin
-                  Item.Values.Add('XMM0' + sSuffix);
-                  Item.Values.Add('XMM0');
-                  Item.Values.Add('XMM4' + sSuffix);
-                  Item.Values.Add('XMM4');
-                  Item.Values.Add('XMM8' + sSuffix);
-                  Item.Values.Add('XMM8');
-                  Item.Values.Add('XMM12' + sSuffix);
-                  Item.Values.Add('XMM12');
-                  Item.Values.Add('XMM15' + sSuffix);
-                  Item.Values.Add('XMM15');
-                end;
-
-                //Item.Values.Add('[RIP]');
-                //Item.Values.Add('[RIP + 16]');
-
-                MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else
-              begin
-                MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
-              end;
-            end
-            else if (AnsiSameText(sl_Operand, 'XMMRM16')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM16_M')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM16_MZ')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM16_ER')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM16_SAE'))
-                    then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMMRM16;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'word ';
-
-              sSuffix := '';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
-               else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
-               else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
-
-              Item.Values.Add('XMM0' + sSuffix);
-              Item.Values.Add('XMM1' + sSuffix);
-              Item.Values.Add('XMM2' + sSuffix);
-              Item.Values.Add('XMM3' + sSuffix);
-              Item.Values.Add('XMM4' + sSuffix);
-              Item.Values.Add('XMM5' + sSuffix);
-              Item.Values.Add('XMM6' + sSuffix);
-              Item.Values.Add('XMM7' + sSuffix);
-
-              if x64 then
-              begin
-                Item.Values.Clear;
-                if FAVX512 then
-                begin
-                  Item.Values.Add('XMM0' + sSuffix);
-                  Item.Values.Add('XMM0');
-                  Item.Values.Add('XMM9' + sSuffix);
-                  Item.Values.Add('XMM9');
-                  Item.Values.Add('XMM18' + sSuffix);
-                  Item.Values.Add('XMM18');
-                  Item.Values.Add('XMM27' + sSuffix);
-                  Item.Values.Add('XMM27');
-                  Item.Values.Add('XMM31' + sSuffix);
-                  Item.Values.Add('XMM31');
-                end
-                else
-                begin
-                  Item.Values.Add('XMM0' + sSuffix);
-                  Item.Values.Add('XMM0');
-                  Item.Values.Add('XMM4' + sSuffix);
-                  Item.Values.Add('XMM4');
-                  Item.Values.Add('XMM8' + sSuffix);
-                  Item.Values.Add('XMM8');
-                  Item.Values.Add('XMM12' + sSuffix);
-                  Item.Values.Add('XMM12');
-                  Item.Values.Add('XMM15' + sSuffix);
-                  Item.Values.Add('XMM15');
-                end;
-
-                //Item.Values.Add('[RIP]');
-                //Item.Values.Add('[RIP + 16]');
-
-                MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else
-              begin
-                MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
-              end;
-            end
-            else if (AnsiSameText(sl_Operand, 'YMMREG')) or
-                    (AnsiSameText(sl_Operand, 'YMMREG_M')) or
-                    (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
-                    (AnsiSameText(sl_Operand, 'YMMREG_ER')) or
-                    (AnsiSameText(sl_Operand, 'YMMREG_SAE'))
-                    then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otYMMReg;
-              Item.OpActive := true;
-
-              sSuffix := '';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
-               else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
-               else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
-
-              Item.Values.Add('YMM0' + sSuffix);
-              Item.Values.Add('YMM1' + sSuffix);
-              Item.Values.Add('YMM2' + sSuffix);
-              Item.Values.Add('YMM3' + sSuffix);
-              Item.Values.Add('YMM4' + sSuffix);
-              Item.Values.Add('YMM5' + sSuffix);
-              Item.Values.Add('YMM6' + sSuffix);
-              Item.Values.Add('YMM7' + sSuffix);
-
-              if x64 then
-              begin
-                Item.Values.Clear;
-                if FAVX512 then
-                begin
-                  Item.Values.Add('YMM0' + sSuffix);
-                  Item.Values.Add('YMM9' + sSuffix);
-                  Item.Values.Add('YMM18' + sSuffix);
-                  Item.Values.Add('YMM27' + sSuffix);
-                  Item.Values.Add('YMM31' + sSuffix);
-                  
-                  if (sSuffix <> '') and
-		     (MaskRegNeeded = false)  then
-                  begin
-                    Item.Values.Add('YMM0');
-                    Item.Values.Add('YMM9');
-                    Item.Values.Add('YMM18');
-                    Item.Values.Add('YMM27');
-                    Item.Values.Add('YMM31');                      
-                  end;
-                end
-                else
-                begin
-                  Item.Values.Add('YMM0' + sSuffix);
-                  Item.Values.Add('YMM4' + sSuffix);
-                  Item.Values.Add('YMM8' + sSuffix);
-                  Item.Values.Add('YMM12' + sSuffix);
-                  Item.Values.Add('YMM15' + sSuffix);
-
-                  if (sSuffix <> '') and
-		     (MaskRegNeeded = false)  then
-                  begin
-                    Item.Values.Add('YMM0');
-                    Item.Values.Add('YMM4');
-                    Item.Values.Add('YMM8');
-                    Item.Values.Add('YMM12');
-                    Item.Values.Add('YMM15');
-                  end;    
-                end;
-              end;
-            end
-            else if (AnsiSameText(sl_Operand, 'YMMRM'))  or
-                    (AnsiSameText(sl_Operand, 'YMMRM_M')) or
-                    (AnsiSameText(sl_Operand, 'YMMRM_MZ')) or
-                    (AnsiSameText(sl_Operand, 'YMMRM_ER')) or
-                    (AnsiSameText(sl_Operand, 'YMMRM_SAE'))
-                    then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otYMMRM;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'yword ';
-
-              sSuffix := '';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
-               else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
-               else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
-
-              Item.Values.Add('YMM0' + sSuffix);
-              Item.Values.Add('YMM1' + sSuffix);
-              Item.Values.Add('YMM2' + sSuffix);
-              Item.Values.Add('YMM3' + sSuffix);
-              Item.Values.Add('YMM4' + sSuffix);
-              Item.Values.Add('YMM5' + sSuffix);
-              Item.Values.Add('YMM6' + sSuffix);
-              Item.Values.Add('YMM7' + sSuffix);
-
-              if x64 then
-              begin
-                Item.Values.Clear;
-                if FAVX512 then
-                begin
-                  Item.Values.Add('YMM0' + sSuffix);
-                  Item.Values.Add('YMM9' + sSuffix);
-                  Item.Values.Add('YMM18' + sSuffix);
-                  Item.Values.Add('YMM27' +  sSuffix);
-                  Item.Values.Add('YMM31' + sSuffix);
-
-                  if (sSuffix <> '') and
-		     (MaskRegNeeded = false)  then
-                  begin
-                    Item.Values.Add('YMM0');
-                    Item.Values.Add('YMM9');
-                    Item.Values.Add('YMM18');
-                    Item.Values.Add('YMM27');
-                    Item.Values.Add('YMM31');
-                  end;    
-                end
-                else
-                begin
-                  Item.Values.Add('YMM0' + sSuffix);
-                  Item.Values.Add('YMM4' + sSuffix);
-                  Item.Values.Add('YMM8' + sSuffix);
-                  Item.Values.Add('YMM12' + sSuffix);
-                  Item.Values.Add('YMM15' + sSuffix);
-
-                  if (sSuffix <> '') and
-		     (MaskRegNeeded = false)  then
-                  begin
-                    Item.Values.Add('YMM0');
-                    Item.Values.Add('YMM4');
-                    Item.Values.Add('YMM8');
-                    Item.Values.Add('YMM12');
-                    Item.Values.Add('YMM15');
-                  end;    
-                end;
-
-                MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else
-              begin
-                MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
-              end;
-            end
-            else if (AnsiSameText(sl_Operand, 'ZMMREG')) or
-                    (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
-                    (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
-                    (AnsiSameText(sl_Operand, 'ZMMREG_ER')) or
-                    (AnsiSameText(sl_Operand, 'ZMMREG_SAE'))
-                    then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otZMMReg;
-              Item.OpActive := true;
-
-              sSuffix := '';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
-               else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
-               else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
-
-              Item.Values.Add('ZMM0' + sSuffix);
-              Item.Values.Add('ZMM1' + sSuffix);
-              Item.Values.Add('ZMM2' + sSuffix);
-              Item.Values.Add('ZMM3' + sSuffix);
-              Item.Values.Add('ZMM4' + sSuffix);
-              Item.Values.Add('ZMM5' + sSuffix);
-              Item.Values.Add('ZMM6' + sSuffix);
-              Item.Values.Add('ZMM7' + sSuffix);
-
-              if x64 then
-              begin
-                Item.Values.Clear;
-                if FAVX512 then
-                begin
-                  Item.Values.Add('ZMM0' + sSuffix);
-                  Item.Values.Add('ZMM9' + sSuffix);
-                  Item.Values.Add('ZMM18' + sSuffix);
-                  Item.Values.Add('ZMM27' + sSuffix);
-                  Item.Values.Add('ZMM31' + sSuffix);
-
-                  if (sSuffix <> '') and
-		     (MaskRegNeeded = false)  then
-                  begin
-                    Item.Values.Add('ZMM0');
-                    Item.Values.Add('ZMM9');
-                    Item.Values.Add('ZMM18');
-                    Item.Values.Add('ZMM27');
-                    Item.Values.Add('ZMM31');
-                  end;    
-                end
-                else
-                begin
-                  Item.Values.Add('ZMM0' + sSuffix);
-                  Item.Values.Add('ZMM4' + sSuffix);
-                  Item.Values.Add('ZMM8' + sSuffix);
-                  Item.Values.Add('ZMM12' + sSuffix);
-                  Item.Values.Add('ZMM15' + sSuffix);
-                end;
-              end;
-            end
-            else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
-                    (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
-                    (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_SAE'))
-                    then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otZMMRM;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'zword ';
-
-              sSuffix := '';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
-               else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
-               else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
-
-              Item.Values.Add('ZMM0' + sSuffix);
-              Item.Values.Add('ZMM1' + sSuffix);
-              Item.Values.Add('ZMM2' + sSuffix);
-              Item.Values.Add('ZMM3' + sSuffix);
-              Item.Values.Add('ZMM4' + sSuffix);
-              Item.Values.Add('ZMM5' + sSuffix);
-              Item.Values.Add('ZMM6' + sSuffix);
-              Item.Values.Add('ZMM7' + sSuffix);
-
-              if x64 then
-              begin
-                Item.Values.Clear;
-                if FAVX512 then
-                begin
-                  Item.Values.Add('ZMM0' + sSuffix);
-                  Item.Values.Add('ZMM9' + sSuffix);
-                  Item.Values.Add('ZMM18' + sSuffix);
-                  Item.Values.Add('ZMM27' + sSuffix);
-                  Item.Values.Add('ZMM31' + sSuffix);
-
-                  if (sSuffix <> '') and
-		     (MaskRegNeeded = false)  then
-                  begin
-                    Item.Values.Add('ZMM0');
-                    Item.Values.Add('ZMM9');
-                    Item.Values.Add('ZMM18');
-                    Item.Values.Add('ZMM27');
-                    Item.Values.Add('ZMM31');
-                  end;    
-                end
-                else
-                begin
-                  Item.Values.Add('ZMM0' + sSuffix);
-                  Item.Values.Add('ZMM4' + sSuffix);
-                  Item.Values.Add('ZMM8' + sSuffix);
-                  Item.Values.Add('ZMM12' + sSuffix);
-                  Item.Values.Add('ZMM15' + sSuffix);
-                end;
-
-                MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else
-              begin
-                MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
-              end;
-            end
-            else if AnsiSameText(sl_Operand, 'MEM8') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM8;
-              Item.OpActive := true;
-
-
-
-	      if UsePrefix then sl_Prefix := 'byte ';
-
-              
-              sSuffix := '';
-	      
-	      if x64 then
-              begin
-                MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, 'MEM16') or
-                    AnsiSameText(sl_Operand, 'MEM16_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM16;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'word ';
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, 'MEM32') or
-                    AnsiSameText(sl_Operand, 'MEM32_M') or
-                    AnsiSameText(sl_Operand, 'MEM32_MZ') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM32;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'dword ';
-
-              sSuffix := '';
-              
-	      if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
-            end
-            else if (AnsiSameText(sl_Operand, 'MEM64')) or
-                    (AnsiSameText(sl_Operand, 'MEM64_M')) or
-                    (AnsiSameText(sl_Operand, 'MEM64_MZ')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM64;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'qword ';
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
-            end
-            else if (AnsiSameText(sl_Operand, 'MEM128')) or
-                    (AnsiSameText(sl_Operand, 'MEM128_M')) or
-                    (AnsiSameText(sl_Operand, 'MEM128_MZ')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM128;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'oword ';
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
-            end
-            else if (AnsiSameText(sl_Operand, 'MEM256')) or
-                    (AnsiSameText(sl_Operand, 'MEM256_M')) or
-                    (AnsiSameText(sl_Operand, 'MEM256_MZ')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM256;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'yword ';
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
-            end
-            else if (AnsiSameText(sl_Operand, 'MEM512')) or
-                    (AnsiSameText(sl_Operand, 'MEM512_M')) or
-                    (AnsiSameText(sl_Operand, 'MEM512_MZ')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM512;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'zword ';
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, 'REG8') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otREG8;
-              Item.OpActive := true;
-
-              if x64 then
-              begin
-                Item.Values.AddStrings(FReg8);
-              end
-              else Item.Values.AddStrings(FReg8);
-            end
-            else if AnsiSameText(sl_Operand, 'REG16') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otREG16;
-              Item.OpActive := true;
-
-              if x64 then
-              begin
-                Item.Values.AddStrings(FReg16);
-              end
-              else Item.Values.AddStrings(FReg16);
-            end
-            else if AnsiSameText(sl_Operand, 'REG32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otREG32;
-              Item.OpActive := true;
-
-              if x64 then
-              begin
-                Item.Values.AddStrings(FReg32Base);
-              end
-              else Item.Values.AddStrings(FReg32Base);
-            end
-            else if AnsiSameText(sl_Operand, 'REG64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otREG64;
-              Item.OpActive := true;
-
-              if x64 then
-              begin
-                Item.Values.AddStrings(FReg64Base);
-              end;
-            end
-            else if AnsiSameText(sl_Operand, 'RM32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otRM32;
-              Item.OpActive := true;
-
-              Item.Values.AddStrings(FReg32Base);
-
-              if UsePrefix then sl_Prefix := 'dword ';
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, 'RM64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otRM32;
-              Item.OpActive := true;
-
-
-
-              if UsePrefix then sl_Prefix := 'qword ';
-
-              if x64 then
-              begin
-                Item.Values.AddStrings(FReg64Base);
-                MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, 'IMM8') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otIMM8;
-              Item.OpActive := true;
-
-              Item.Values.Add('0');
-            end
-            else if AnsiSameText(sl_Operand, 'XMEM32') or
-                    AnsiSameText(sl_Operand, 'XMEM32_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMEM32;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'oword ';
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if x64 then
-              begin
-		VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
-		if (sSuffix <> '') and
-                   (MaskRegNeeded = false) then
- 		 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
-              end
-              else
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
-		if (sSuffix <> '') and
-                   (MaskRegNeeded = false) then
-                 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
-              end;
-            end
-            else if AnsiSameText(sl_Operand, 'XMEM64') or
-                    AnsiSameText(sl_Operand, 'XMEM64_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMEM64;
-              Item.OpActive := true;
-
-              //if UsePrefix then sl_Prefix := 'oword ';
-              //
-              //if x64 then
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64XMMIndex, Item.Values);
-              //end
-              //else
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32XMMIndex, Item.Values);
-              //end;
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if x64 then
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
-                if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
- 		 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
-              end
-              else
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
-                if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
- 		 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
-              end;
-
-            end
-            else if AnsiSameText(sl_Operand, 'YMEM32') or
-                    AnsiSameText(sl_Operand, 'YMEM32_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otYMEM32;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'yword ';
-
-              //if x64 then
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
-              //end
-              //else
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
-              //end;
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if x64 then
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
-                if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
-		 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
-              end
-              else
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
-                if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
-		 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
-              end;
-
-            end
-            else if AnsiSameText(sl_Operand, 'YMEM64') or
-                    AnsiSameText(sl_Operand, 'YMEM64_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otYMEM64;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'yword ';
-
-              //if x64 then
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
-              //end
-              //else
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
-              //end;
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if x64 then
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
-		if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
-                 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
-              end
-              else
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
-                if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
-		 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
-              end;
-
-            end
-            else if AnsiSameText(sl_Operand, 'ZMEM32') or
-                    AnsiSameText(sl_Operand, 'ZMEM32_M')  then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otZMEM32;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'zword ';
-
-              //if x64 then
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
-              //end
-              //else
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
-              //end;
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if x64 then
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
-		if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
-                 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
-              end
-              else
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
-		if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
-                 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
-              end;
-
-            end
-            else if AnsiSameText(sl_Operand, 'ZMEM64') or
-                    AnsiSameText(sl_Operand, 'ZMEM64_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otZMEM64;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'zword ';
-
-              //if x64 then
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
-              //end
-              //else
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
-              //end;
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if x64 then
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
-		if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
-                 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
-              end
-              else
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
-                if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
-		 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
-              end;
-
-            end
-            else if AnsiSameText(sl_Operand, '2B32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB32;
-              Item.OpActive := true;
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombi(sl_Prefix, ' {1to2}',  FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, '4B32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB32;
-              Item.OpActive := true;
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombi(sl_Prefix, ' {1to4}',  FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, '8B32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB32;
-              Item.OpActive := true;
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombi(sl_Prefix, ' {1to8}',  FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, '16B32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB32;
-              Item.OpActive := true;
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombi(sl_Prefix, ' {1to16}',  FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, '2B64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB64;
-              Item.OpActive := true;
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombi(sl_Prefix, ' {1to2}',  FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, '4B64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB64;
-              Item.OpActive := true;
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombi(sl_Prefix, ' {1to4}',  FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, '8B64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB64;
-              Item.OpActive := true;
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombi(sl_Prefix, ' {1to8}',  FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, '16B64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB64;
-              Item.OpActive := true;
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombi(sl_Prefix, ' {1to16}',  FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, 'KREG') or
-                    AnsiSameText(sl_Operand, 'KREG_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otKREG;
-              Item.OpActive := true;
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if UsePrefix then sl_Prefix := '';
-
-              for i := 0 to FRegKREG.Count - 1 do
-               Item.Values.Add(FRegKREG[i] + sSuffix);
-            end
-            else if trim(sl_Operand) = '' then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otUnknown;
-              Item.OpActive := false;
-
-              Item.Values.Add('');
-            end
-            else
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otUnknown;
-              Item.OpActive := false;
-
-              Item.Values.Add('?' + sl_Operand);
-            end
-
-          end;
-
-          sl_RegCombi := '';
-
-
-          il_Operands := 0;
-          UsedParams  := 0;
-
-          if OItem1.OpActive then
-          begin
-            inc(il_Operands);
-            UsedParams := UsedParams or 1;
-          end;
-
-          if OItem2.OpActive then
-          begin
-            inc(il_Operands);
-            UsedParams := UsedParams or 2;
-          end;
-
-          if OItem3.OpActive then
-          begin
-            inc(il_Operands);
-            UsedParams := UsedParams or 4;
-          end;
-
-          if OItem4.OpActive then
-          begin
-            inc(il_Operands);
-            UsedParams := UsedParams or 8;
-          end;
-
-          case il_Operands of
-              1: UseDefault := UsedParams <> 1;
-              2: UseDefault := UsedParams <> 3;
-              3: UseDefault := UsedParams <> 7;
-              4: UseDefault := UsedParams <> 15;
-            else UseDefault := true;
-          end;
-
-          //UseDefault := true;
-
-          if UseDefault then
-          begin
-            sl_Inst := format('%-20s', [aInst]);
-
-            for il_Op1 := 0 to OItem1.Values.Count - 1 do
-            begin
-              for il_Op2 := 0 to OItem2.Values.Count - 1 do
-              begin
-                for il_Op3 := 0 to OItem3.Values.Count - 1 do
-                begin
-                  for il_Op4 := 0 to OItem4.Values.Count - 1 do
-                  begin
-                    sl_RegCombi := '';
-
-                    if OItem1.OpActive then
-                    begin
-                      if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
-                      sl_RegCombi := sl_RegCombi + OItem1.Values[il_Op1];
-                    end;
-
-                    if OItem2.OpActive then
-                    begin
-                      if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
-                      sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2];
-                    end;
-
-                    if OItem3.OpActive then
-                    begin
-                      if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
-                      sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3];
-                    end;
-
-                    if OItem4.OpActive then
-                    begin
-                      if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
-                      sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4];
-                    end;
-
-                    if sl_RegCombi <> '' then
-                    begin
-                      //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
-                      result.Add(sl_Inst + sl_RegCombi);
-                      sl_RegCombi := '';
-                    end;
-                  end;
-                end;
-              end;
-            end;
-          end
-          else
-          begin
-            sl_Inst := format('%-20s', [aInst]);
-
-            for il_Op1 := 0 to OItem1.Values.Count - 1 do
-            begin
-              if OItem1.OpActive then
-              begin
-                sl_RegCombi1 := OItem1.Values[il_Op1];
-              end
-              else sl_RegCombi1 := '';
-
-              for il_Op2 := 0 to OItem2.Values.Count - 1 do
-              begin
-                if OItem2.OpActive then
-                begin
-                  sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2];
-                end
-                else sl_RegCombi2 := sl_RegCombi1;
-
-                for il_Op3 := 0 to OItem3.Values.Count - 1 do
-                begin
-                  if OItem3.OpActive then
-                  begin
-                    sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3];
-                  end
-                  else sl_RegCombi3 := sl_RegCombi2;
-
-                  for il_Op4 := 0 to OItem4.Values.Count - 1 do
-                  begin
-                    if OItem4.OpActive then
-                    begin
-                      sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4];
-                    end
-                    else sl_RegCombi := sl_RegCombi3;
-
-                    if sl_RegCombi <> '' then
-                    begin
-                      //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
-                      result.Add(sl_Inst + sl_RegCombi);
-                      sl_RegCombi := '';
-                    end;
-                  end;
-                end;
-              end;
-            end;
-          end;
-        finally
-          FreeAndNil(OItem4);
-        end;
-      finally
-        FreeAndNil(OItem3);
-      end;
-    finally
-      FreeAndNil(OItem2);
-    end;
-  finally
-    FreeAndNil(OItem1);
-  end;
-end;
-
-
-function TAsmTestGenerator.InternalCalcTestDataMREF(const aInst, aOp1, aOp2, aOp3,
-  aOp4: String): TStringList;
-var
-  i: integer;
-  Item: TOperandListItem;
-  OItem1: TOperandListItem;
-  OItem2: TOperandListItem;
-  OItem3: TOperandListItem;
-  OItem4: TOperandListItem;
-
-  il_Op: integer;
-  il_Op1: integer;
-  il_Op2: integer;
-  il_Op3: integer;
-  il_Op4: integer;
-
-  sSuffix: string;
-  sl_Operand: String;
-  sl_Inst   : String;
-  sl_RegCombi: String;
-  sl_Prefix: String;
-  UsePrefix: boolean;
-  il_Operands: integer;
-  UsedParams: cardinal;
-  UseDefault: boolean;
-  sl_RegCombi1: string;
-  sl_RegCombi2: string;
-  sl_RegCombi3: string;
-
-  function PrepareOperandTyp(const aTyp: String): String;
-  begin
-    result := aTyp;
-    if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1);
-    if result = 'XMMRM128' then result := 'XMMRM';
-    if result = 'YMMRM256' then result := 'YMMRM';
-  end;
-
-
-begin
-  result := TStringList.Create;
-
-  OItem1 := TOperandListItem.Create;
-  try
-    OItem2 := TOperandListItem.Create;
-    try
-      OItem3 := TOperandListItem.Create;
-      try
-        OItem4 := TOperandListItem.Create;
-        try
-
-          UsePrefix := (UpperCase(aInst) = 'VCVTPD2DQ') OR
-                       (UpperCase(aInst) = 'VCVTPD2PS') OR
-                       (UpperCase(aInst) = 'VCVTSI2SD') OR
-                       (UpperCase(aInst) = 'VCVTSI2SS') OR
-                       (UpperCase(aInst) = 'VCVTTPD2DQ') or
-                       (UpperCase(aInst) = 'VPMOVZXWQ') or
-                       (UpperCase(aInst) = 'VCVTPD2UDQ') or
-                       (UpperCase(aInst) = 'VCVTPD2UDQ') or
-                       (UpperCase(aInst) = 'VCVTTPD2UDQ') or
-                       (UpperCase(aInst) = 'VCVTUQQ2PS') or
-                       (UpperCase(aInst) = 'VCVTQQ2PS') or
-                       (UpperCase(aInst) = 'VCVTUSI2SD') or
-                       (UpperCase(aInst) = 'VCVTUSI2SS') or
-                       (UpperCase(aInst) = 'VFPCLASSPD') or
-                       (UpperCase(aInst) = 'VFPCLASSPS') or
-                       (UpperCase(aInst) = 'VCMPSS')
-
-                       ;
-
-
-
-          for il_Op := 1 to 4 do
-          begin
-            sl_Prefix := '';
-
-            case il_Op of
-              1: begin
-                   Item := OItem1;
-                   sl_Operand := aOp1;
-                 end;
-              2: begin
-                   Item := OItem2;
-                   sl_Operand := aOp2;
-                 end;
-              3: begin
-                   Item := OItem3;
-                   sl_Operand := aOp3;
-                 end;
-              4: begin
-                   Item := OItem4;
-                   sl_Operand := aOp4;
-                 end;
-            end;
-
-            sl_Operand := PrepareOperandTyp(sl_Operand);
-
-            if (AnsiSameText(sl_Operand, 'XMMREG')) or
-               (AnsiSameText(sl_Operand, 'XMMREG_M')) or
-               (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
-               (AnsiSameText(sl_Operand, 'XMMREG_ER')) or
-               (AnsiSameText(sl_Operand, 'XMMREG_SAE')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMMReg;
-              Item.OpActive := true;
-
-              Item.Values.Add('XMM0');
-           end
-            else if (AnsiSameText(sl_Operand, 'XMMRM')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_M')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_MZ')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_SAE')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMMRM;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'oword ';
-
-              Item.Values.Add(' lOWord');
-              Item.Values.Add(' gOWord');
-              Item.Values.Add(' clOWord');
-              Item.Values.Add(' cgOWord');
-
-              Item.Values.Add(' oword lOWord');
-              Item.Values.Add(' oword gOWord');
-              Item.Values.Add(' oword clOWord');
-              Item.Values.Add(' oword cgOWord');
-
-              Item.Values.Add(' byte lOWord');
-              Item.Values.Add(' byte gOWord');
-              Item.Values.Add(' byte clOWord');
-              Item.Values.Add(' byte cgOWord');
-
-              Item.Values.Add(' lRec');
-              Item.Values.Add(' gRec');
-
-              Item.Values.Add(' oword lRec');
-              Item.Values.Add(' oword gRec');
-
-              Item.Values.Add(' oword lRec.rOWord');
-              Item.Values.Add(' oword gRec.rOWord');
-
-              Item.Values.Add(' lRec.rByte');
-              Item.Values.Add(' gRec.rByte');
-
-              Item.Values.Add(' lRec.rWord');
-              Item.Values.Add(' gRec.rWord');
-
-              Item.Values.Add(' lRec.rDWord');
-              Item.Values.Add(' gRec.rDWord');
-
-              Item.Values.Add(' lRec.rQWord');
-              Item.Values.Add(' gRec.rQWord');
-
-              Item.Values.Add(' lRec.rOWord');
-              Item.Values.Add(' gRec.rOWord');
-
-              Item.Values.Add(' lRec.rYWord');
-              Item.Values.Add(' gRec.rYWord');
-
-              Item.Values.Add(' lRec.rZWord');
-              Item.Values.Add(' gRec.rZWord');
-
-            end
-            else if (AnsiSameText(sl_Operand, 'XMMRM8')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM8_M')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM8_MZ')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM8_ER')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM8_SAE')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMMRM8;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'byte ';
-
-              Item.Values.Add('lbyte');
-              Item.Values.Add('gbyte');
-              Item.Values.Add('clbyte');
-              Item.Values.Add('cgbyte');
-
-              Item.Values.Add('byte lbyte');
-              Item.Values.Add('byte gbyte');
-              Item.Values.Add('byte clbyte');
-              Item.Values.Add('byte cgbyte');
-
-              Item.Values.Add(' lRec');
-              Item.Values.Add(' gRec');
-
-              Item.Values.Add(' byte lRec');
-              Item.Values.Add(' byte gRec');
-
-              Item.Values.Add(' lRec');
-              Item.Values.Add(' gRec');
-
-              Item.Values.Add(' lRec.rByte');
-              Item.Values.Add(' gRec.rByte');
-
-              Item.Values.Add(' lRec.rWord');
-              Item.Values.Add(' gRec.rWord');
-
-              Item.Values.Add(' lRec.rDWord');
-              Item.Values.Add(' gRec.rDWord');
-
-              Item.Values.Add(' lRec.rQWord');
-              Item.Values.Add(' gRec.rQWord');
-
-              Item.Values.Add(' lRec.rOWord');
-              Item.Values.Add(' gRec.rOWord');
-
-              Item.Values.Add(' lRec.rYWord');
-              Item.Values.Add(' gRec.rYWord');
-
-              Item.Values.Add(' lRec.rZWord');
-              Item.Values.Add(' gRec.rZWord');
-
-            end
-            else if (AnsiSameText(sl_Operand, 'XMMRM16')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM16_M')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM16_MZ')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM16_ER')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM16_SAE'))
-                    then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMMRM16;
-              Item.OpActive := true;
-
-              Item.Values.Add('lword');
-              Item.Values.Add('gword');
-              Item.Values.Add('clword');
-              Item.Values.Add('cgword');
-
-              Item.Values.Add('word lword');
-              Item.Values.Add('word gword');
-              Item.Values.Add('word clword');
-              Item.Values.Add('word cgword');
-
-              Item.Values.Add(' lRec');
-              Item.Values.Add(' gRec');
-
-              Item.Values.Add(' word lRec');
-              Item.Values.Add(' word gRec');
-
-              Item.Values.Add(' lRec.rByte');
-              Item.Values.Add(' gRec.rByte');
-
-              Item.Values.Add(' lRec.rWord');
-              Item.Values.Add(' gRec.rWord');
-
-              Item.Values.Add(' lRec.rDWord');
-              Item.Values.Add(' gRec.rDWord');
-
-              Item.Values.Add(' lRec.rQWord');
-              Item.Values.Add(' gRec.rQWord');
-
-              Item.Values.Add(' lRec.rOWord');
-              Item.Values.Add(' gRec.rOWord');
-
-              Item.Values.Add(' lRec.rYWord');
-              Item.Values.Add(' gRec.rYWord');
-
-              Item.Values.Add(' lRec.rZWord');
-              Item.Values.Add(' gRec.rZWord');
-
-            end
-            else if (AnsiSameText(sl_Operand, 'YMMREG')) or
-                    (AnsiSameText(sl_Operand, 'YMMREG_M')) or
-                    (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
-                    (AnsiSameText(sl_Operand, 'YMMREG_ER')) or
-                    (AnsiSameText(sl_Operand, 'YMMREG_SAE'))
-                    then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otYMMReg;
-              Item.OpActive := true;
-
-              Item.Values.Add('YMM0');
-            end
-            else if (AnsiSameText(sl_Operand, 'YMMRM'))  or
-                    (AnsiSameText(sl_Operand, 'YMMRM_M')) or
-                    (AnsiSameText(sl_Operand, 'YMMRM_MZ')) or
-                    (AnsiSameText(sl_Operand, 'YMMRM_ER')) or
-                    (AnsiSameText(sl_Operand, 'YMMRM_SAE'))
-                    then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otYMMRM;
-              Item.OpActive := true;
-
-              Item.Values.Add('lYWord');
-              Item.Values.Add('gYWord');
-              Item.Values.Add('clYWord');
-              Item.Values.Add('cgYWord');
-
-              Item.Values.Add('yword lYWord');
-              Item.Values.Add('yword gYWord');
-              Item.Values.Add('yword clYWord');
-              Item.Values.Add('yword cgYWord');
-
-              Item.Values.Add(' lRec');
-              Item.Values.Add(' gRec');
-
-              Item.Values.Add(' yword lRec');
-              Item.Values.Add(' yword gRec');
-
-              Item.Values.Add(' lRec.rByte');
-              Item.Values.Add(' gRec.rByte');
-
-              Item.Values.Add(' lRec.rWord');
-              Item.Values.Add(' gRec.rWord');
-
-              Item.Values.Add(' lRec.rDWord');
-              Item.Values.Add(' gRec.rDWord');
-
-              Item.Values.Add(' lRec.rQWord');
-              Item.Values.Add(' gRec.rQWord');
-
-              Item.Values.Add(' lRec.rOWord');
-              Item.Values.Add(' gRec.rOWord');
-
-              Item.Values.Add(' lRec.rYWord');
-              Item.Values.Add(' gRec.rYWord');
-
-              Item.Values.Add(' lRec.rZWord');
-              Item.Values.Add(' gRec.rZWord');
-
-            end
-            else if (AnsiSameText(sl_Operand, 'ZMMREG')) or
-                    (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
-                    (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
-                    (AnsiSameText(sl_Operand, 'ZMMREG_ER')) or
-                    (AnsiSameText(sl_Operand, 'ZMMREG_SAE'))
-                    then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otZMMReg;
-              Item.OpActive := true;
-
-              Item.Values.Add('ZMM0');
-            end
-            else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
-                    (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
-                    (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_SAE'))
-                    then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otZMMRM;
-              Item.OpActive := true;
-
-              Item.Values.Add('lZWord');
-              Item.Values.Add('gZWord');
-              Item.Values.Add('clZWord');
-              Item.Values.Add('cgZWord');
-
-              Item.Values.Add('zword lZWord');
-              Item.Values.Add('zword gZWord');
-              Item.Values.Add('zword clZWord');
-              Item.Values.Add('zword cgZWord');
-
-              Item.Values.Add(' lRec');
-              Item.Values.Add(' gRec');
-
-              Item.Values.Add(' zword lRec');
-              Item.Values.Add(' zword gRec');
-
-              Item.Values.Add(' lRec.rByte');
-              Item.Values.Add(' gRec.rByte');
-
-              Item.Values.Add(' lRec.rWord');
-              Item.Values.Add(' gRec.rWord');
-
-              Item.Values.Add(' lRec.rDWord');
-              Item.Values.Add(' gRec.rDWord');
-
-              Item.Values.Add(' lRec.rQWord');
-              Item.Values.Add(' gRec.rQWord');
-
-              Item.Values.Add(' lRec.rOWord');
-              Item.Values.Add(' gRec.rOWord');
-
-              Item.Values.Add(' lRec.rYWord');
-              Item.Values.Add(' gRec.rYWord');
-
-              Item.Values.Add(' lRec.rZWord');
-              Item.Values.Add(' gRec.rZWord');
-
-            end
-            else if AnsiSameText(sl_Operand, 'MEM8') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM8;
-              Item.OpActive := true;
-
-              Item.Values.Add('lByte');
-              Item.Values.Add('gByte');
-              Item.Values.Add('clByte');
-              Item.Values.Add('cgByte');
-
-              Item.Values.Add('byte lByte');
-              Item.Values.Add('byte gByte');
-              Item.Values.Add('byte clByte');
-              Item.Values.Add('byte cgByte');
-
-              Item.Values.Add(' lRec');
-              Item.Values.Add(' gRec');
-
-              Item.Values.Add(' byte lRec');
-              Item.Values.Add(' byte gRec');
-
-              Item.Values.Add(' lRec.rByte');
-              Item.Values.Add(' gRec.rByte');
-            end
-            else if AnsiSameText(sl_Operand, 'MEM16') or
-                    AnsiSameText(sl_Operand, 'MEM16_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM16;
-              Item.OpActive := true;
-
-              Item.Values.Add('lWord');
-              Item.Values.Add('gWord');
-              Item.Values.Add('clWord');
-              Item.Values.Add('cgWord');
-
-              Item.Values.Add('word lWord');
-              Item.Values.Add('word gWord');
-              Item.Values.Add('word clWord');
-              Item.Values.Add('word cgWord');
-
-              Item.Values.Add(' word lRec');
-              Item.Values.Add(' word gRec');
-
-              Item.Values.Add(' lRec.rWord');
-              Item.Values.Add(' gRec.rWord');
-            end
-            else if AnsiSameText(sl_Operand, 'MEM32') or
-                    AnsiSameText(sl_Operand, 'MEM32_M') or
-                    AnsiSameText(sl_Operand, 'MEM32_MZ') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM32;
-              Item.OpActive := true;
-
-              Item.Values.Add('lDWord');
-              Item.Values.Add('gDWord');
-              Item.Values.Add('clDWord');
-              Item.Values.Add('cgDWord');
-
-              Item.Values.Add('dword lDWord');
-              Item.Values.Add('dword gDWord');
-              Item.Values.Add('dword clDWord');
-              Item.Values.Add('dword cgDWord');
-
-              Item.Values.Add(' dword lRec');
-              Item.Values.Add(' dword gRec');
-
-              Item.Values.Add(' lRec.rDWord');
-              Item.Values.Add(' gRec.rDWord');
-            end
-            else if (AnsiSameText(sl_Operand, 'MEM64')) or
-                    (AnsiSameText(sl_Operand, 'MEM64_M')) or
-                    (AnsiSameText(sl_Operand, 'MEM64_MZ')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM64;
-              Item.OpActive := true;
-
-              Item.Values.Add('lQWord');
-              Item.Values.Add('gQWord');
-              Item.Values.Add('clQWord');
-              Item.Values.Add('cgQWord');
-
-              Item.Values.Add('qword lQWord');
-              Item.Values.Add('qword gQWord');
-              Item.Values.Add('qword clQWord');
-              Item.Values.Add('qword cgQWord');
-
-              Item.Values.Add(' qword lRec');
-              Item.Values.Add(' qword gRec');
-
-              Item.Values.Add(' lRec.rQWord');
-              Item.Values.Add(' gRec.rQWord');
-            end
-            else if (AnsiSameText(sl_Operand, 'MEM128')) or
-                    (AnsiSameText(sl_Operand, 'MEM128_M')) or
-                    (AnsiSameText(sl_Operand, 'MEM128_MZ')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM128;
-              Item.OpActive := true;
-
-              Item.Values.Add('lOWord');
-              Item.Values.Add('gOWord');
-              Item.Values.Add('clOWord');
-              Item.Values.Add('cgOWord');
-
-              Item.Values.Add('oword lOWord');
-              Item.Values.Add('oword gOWord');
-              Item.Values.Add('oword clOWord');
-              Item.Values.Add('oword cgOWord');
-
-              Item.Values.Add(' lRec');
-              Item.Values.Add(' gRec');
-
-              Item.Values.Add(' oword lRec');
-              Item.Values.Add(' oword gRec');
-
-              Item.Values.Add(' lRec.rByte');
-              Item.Values.Add(' gRec.rByte');
-
-              Item.Values.Add(' lRec.rWord');
-              Item.Values.Add(' gRec.rWord');
-
-              Item.Values.Add(' lRec.rDWord');
-              Item.Values.Add(' gRec.rDWord');
-
-              Item.Values.Add(' lRec.rQWord');
-              Item.Values.Add(' gRec.rQWord');
-
-              Item.Values.Add(' lRec.rOWord');
-              Item.Values.Add(' gRec.rOWord');
-
-              Item.Values.Add(' lRec.rYWord');
-              Item.Values.Add(' gRec.rYWord');
-
-              Item.Values.Add(' lRec.rZWord');
-              Item.Values.Add(' gRec.rZWord');
-
-            end
-            else if (AnsiSameText(sl_Operand, 'MEM256')) or
-                    (AnsiSameText(sl_Operand, 'MEM256_M')) or
-                    (AnsiSameText(sl_Operand, 'MEM256_MZ')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM256;
-              Item.OpActive := true;
-
-              Item.Values.Add('lYWord');
-              Item.Values.Add('gYWord');
-              Item.Values.Add('clYWord');
-              Item.Values.Add('cgYWord');
-
-              Item.Values.Add('yword lYWord');
-              Item.Values.Add('yword gYWord');
-              Item.Values.Add('yword clYWord');
-              Item.Values.Add('yword cgYWord');
-
-              Item.Values.Add(' lRec');
-              Item.Values.Add(' gRec');
-
-              Item.Values.Add(' yword lRec');
-              Item.Values.Add(' yword gRec');
-
-              Item.Values.Add(' lRec.rByte');
-              Item.Values.Add(' gRec.rByte');
-
-              Item.Values.Add(' lRec.rWord');
-              Item.Values.Add(' gRec.rWord');
-
-              Item.Values.Add(' lRec.rDWord');
-              Item.Values.Add(' gRec.rDWord');
-
-              Item.Values.Add(' lRec.rQWord');
-              Item.Values.Add(' gRec.rQWord');
-
-              Item.Values.Add(' lRec.rOWord');
-              Item.Values.Add(' gRec.rOWord');
-
-              Item.Values.Add(' lRec.rYWord');
-              Item.Values.Add(' gRec.rYWord');
-
-              Item.Values.Add(' lRec.rZWord');
-              Item.Values.Add(' gRec.rZWord');
-
-            end
-            else if (AnsiSameText(sl_Operand, 'MEM512')) or
-                    (AnsiSameText(sl_Operand, 'MEM512_M')) or
-                    (AnsiSameText(sl_Operand, 'MEM512_MZ')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM512;
-              Item.OpActive := true;
-
-              Item.Values.Add('lZWord');
-              Item.Values.Add('gZWord');
-              Item.Values.Add('clZWord');
-              Item.Values.Add('cgZWord');
-
-              Item.Values.Add('zword lZWord');
-              Item.Values.Add('zword gZWord');
-              Item.Values.Add('zword clZWord');
-              Item.Values.Add('zword cgZWord');
-
-              Item.Values.Add(' lRec');
-              Item.Values.Add(' gRec');
-
-              Item.Values.Add(' zword lRec');
-              Item.Values.Add(' zword gRec');
-
-
-            end
-            else if AnsiSameText(sl_Operand, 'REG8') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otREG8;
-              Item.OpActive := true;
-
-              Item.Values.Add('al');
-            end
-            else if AnsiSameText(sl_Operand, 'REG16') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otREG16;
-              Item.OpActive := true;
-
-              Item.Values.Add('ax');
-            end
-            else if AnsiSameText(sl_Operand, 'REG32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otREG32;
-              Item.OpActive := true;
-
-              Item.Values.Add('eax');
-            end
-            else if AnsiSameText(sl_Operand, 'REG64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otREG64;
-              Item.OpActive := true;
-
-              Item.Values.Add('rax');
-            end
-            else if AnsiSameText(sl_Operand, 'RM32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otRM32;
-              Item.OpActive := true;
-
-              Item.Values.Add('lDWord');
-              Item.Values.Add('gDWord');
-            end
-            else if AnsiSameText(sl_Operand, 'RM64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otRM64;
-              Item.OpActive := true;
-
-              Item.Values.Add('lQWord');
-              Item.Values.Add('gQWord');
-            end
-            else if AnsiSameText(sl_Operand, 'IMM8') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otIMM8;
-              Item.OpActive := true;
-
-              Item.Values.Add('0');
-            end
-            else if AnsiSameText(sl_Operand, 'XMEM32') or
-                    AnsiSameText(sl_Operand, 'XMEM32_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMEM32;
-              Item.OpActive := true;
-            end
-            else if AnsiSameText(sl_Operand, 'XMEM64') or
-                    AnsiSameText(sl_Operand, 'XMEM64_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMEM64;
-              Item.OpActive := true;
-            end
-            else if AnsiSameText(sl_Operand, 'YMEM32') or
-                    AnsiSameText(sl_Operand, 'YMEM32_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otYMEM32;
-              Item.OpActive := true;
-            end
-            else if AnsiSameText(sl_Operand, 'YMEM64') or
-                    AnsiSameText(sl_Operand, 'YMEM64_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otYMEM64;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'yword ';
-
-            end
-            else if AnsiSameText(sl_Operand, 'ZMEM32') or
-                    AnsiSameText(sl_Operand, 'ZMEM32_M')  then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otZMEM32;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'zword ';
-
-            end
-            else if AnsiSameText(sl_Operand, 'ZMEM64') or
-                    AnsiSameText(sl_Operand, 'ZMEM64_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otZMEM64;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'zword ';
-
-            end
-            else if AnsiSameText(sl_Operand, '2B32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB32;
-              Item.OpActive := true;
-
-              Item.Values.Add('lDWord {1to2}');
-              Item.Values.Add('gDWord {1to2}');
-            end
-            else if AnsiSameText(sl_Operand, '4B32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB32;
-              Item.OpActive := true;
-
-              Item.Values.Add('lDWord {1to4}');
-              Item.Values.Add('gDWord {1to4}');
-            end
-            else if AnsiSameText(sl_Operand, '8B32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB32;
-              Item.OpActive := true;
-
-              Item.Values.Add('lDWord {1to8}');
-              Item.Values.Add('gDWord {1to8}');
-            end
-            else if AnsiSameText(sl_Operand, '16B32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB32;
-              Item.OpActive := true;
-
-              Item.Values.Add('lDWord {1to16}');
-              Item.Values.Add('gDWord {1to16}');
-           end
-            else if AnsiSameText(sl_Operand, '2B64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB64;
-              Item.OpActive := true;
-
-              Item.Values.Add('lQWord {1to2}');
-              Item.Values.Add('gQWord {1to2}');
-            end
-            else if AnsiSameText(sl_Operand, '4B64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB64;
-              Item.OpActive := true;
-
-              Item.Values.Add('lQWord {1to4}');
-              Item.Values.Add('gQWord {1to4}');
-            end
-            else if AnsiSameText(sl_Operand, '8B64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB64;
-              Item.OpActive := true;
-
-              Item.Values.Add('lQWord {1to8}');
-              Item.Values.Add('gQWord {1to8}');
-            end
-            else if AnsiSameText(sl_Operand, '16B64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB64;
-              Item.OpActive := true;
-
-              Item.Values.Add('lQWord {1to16}');
-              Item.Values.Add('gQWord {1to16}');
-           end
-            else if AnsiSameText(sl_Operand, 'KREG') or
-                    AnsiSameText(sl_Operand, 'KREG_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otKREG;
-              Item.OpActive := true;
-
-              Item.Values.Add('k1');
-            end
-            else if trim(sl_Operand) = '' then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otUnknown;
-              Item.OpActive := false;
-
-              Item.Values.Add('');
-            end
-            else
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otUnknown;
-              Item.OpActive := false;
-
-              Item.Values.Add('?' + sl_Operand);
-            end
-
-          end;
-
-          sl_RegCombi := '';
-
-
-          il_Operands := 0;
-          UsedParams  := 0;
-
-          if OItem1.OpActive then
-          begin
-            inc(il_Operands);
-            UsedParams := UsedParams or 1;
-          end;
-
-          if OItem2.OpActive then
-          begin
-            inc(il_Operands);
-            UsedParams := UsedParams or 2;
-          end;
-
-          if OItem3.OpActive then
-          begin
-            inc(il_Operands);
-            UsedParams := UsedParams or 4;
-          end;
-
-          if OItem4.OpActive then
-          begin
-            inc(il_Operands);
-            UsedParams := UsedParams or 8;
-          end;
-
-          case il_Operands of
-              1: UseDefault := UsedParams <> 1;
-              2: UseDefault := UsedParams <> 3;
-              3: UseDefault := UsedParams <> 7;
-              4: UseDefault := UsedParams <> 15;
-            else UseDefault := true;
-          end;
-
-          //UseDefault := true;
-
-          if UseDefault then
-          begin
-            sl_Inst := format('%-20s', [aInst]);
-
-            for il_Op1 := 0 to OItem1.Values.Count - 1 do
-            begin
-              for il_Op2 := 0 to OItem2.Values.Count - 1 do
-              begin
-                for il_Op3 := 0 to OItem3.Values.Count - 1 do
-                begin
-                  for il_Op4 := 0 to OItem4.Values.Count - 1 do
-                  begin
-                    sl_RegCombi := '';
-
-                    if OItem1.OpActive then
-                    begin
-                      if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
-                      sl_RegCombi := sl_RegCombi + OItem1.Values[il_Op1];
-                    end;
-
-                    if OItem2.OpActive then
-                    begin
-                      if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
-                      sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2];
-                    end;
-
-                    if OItem3.OpActive then
-                    begin
-                      if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
-                      sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3];
-                    end;
-
-                    if OItem4.OpActive then
-                    begin
-                      if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
-                      sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4];
-                    end;
-
-                    if sl_RegCombi <> '' then
-                    begin
-                      //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
-                      result.Add(sl_Inst + sl_RegCombi);
-                      sl_RegCombi := '';
-                    end;
-                  end;
-                end;
-              end;
-            end;
-          end
-          else
-          begin
-            sl_Inst := format('%-20s', [aInst]);
-
-            for il_Op1 := 0 to OItem1.Values.Count - 1 do
-            begin
-              if OItem1.OpActive then
-              begin
-                sl_RegCombi1 := OItem1.Values[il_Op1];
-              end
-              else sl_RegCombi1 := '';
-
-              for il_Op2 := 0 to OItem2.Values.Count - 1 do
-              begin
-                if OItem2.OpActive then
-                begin
-                  sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2];
-                end
-                else sl_RegCombi2 := sl_RegCombi1;
-
-                for il_Op3 := 0 to OItem3.Values.Count - 1 do
-                begin
-                  if OItem3.OpActive then
-                  begin
-                    sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3];
-                  end
-                  else sl_RegCombi3 := sl_RegCombi2;
-
-                  for il_Op4 := 0 to OItem4.Values.Count - 1 do
-                  begin
-                    if OItem4.OpActive then
-                    begin
-                      sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4];
-                    end
-                    else sl_RegCombi := sl_RegCombi3;
-
-                    if sl_RegCombi <> '' then
-                    begin
-                      //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
-                      result.Add(sl_Inst + sl_RegCombi);
-                      sl_RegCombi := '';
-                    end;
-                  end;
-                end;
-              end;
-            end;
-          end;
-        finally
-          FreeAndNil(OItem4);
-        end;
-      finally
-        FreeAndNil(OItem3);
-      end;
-    finally
-      FreeAndNil(OItem2);
-    end;
-  finally
-    FreeAndNil(OItem1);
-  end;
-end;
-
-function TAsmTestGenerator.InternalCalcTestDataCDISP8(const aInst, aOp1, aOp2,
-  aOp3, aOp4: String): TStringList;
-var
-  i: integer;
-  Item: TOperandListItem;
-  OItem1: TOperandListItem;
-  OItem2: TOperandListItem;
-  OItem3: TOperandListItem;
-  OItem4: TOperandListItem;
-
-  il_Op: integer;
-  il_Op1: integer;
-  il_Op2: integer;
-  il_Op3: integer;
-  il_Op4: integer;
-  iAsmCounter: integer;
-
-  sSuffix: string;
-  sReg: string;
-  sl_Operand: String;
-  sl_Inst   : String;
-  sRegCombi: String;
-  sRegCombi1: String;
-  sRegCombi2: String;
-  sRegCombi3: String;
-  sRegCombi4: String;
-  sBaseReg  : String;
-  sIndexReg : String;
-
-  sl_Prefix: String;
-  UsePrefix: boolean;
-  il_Operands: integer;
-  UsedParams: cardinal;
-  UseDefault: boolean;
-  sl_RegCombi1: string;
-  sl_RegCombi2: string;
-  sl_RegCombi3: string;
-  sInstruction: string;
-  sMREF: string;
-  sLogMsg: string;
-  MaskRegNeeded:boolean;
-  slRegCombi: TStringList;
-  OpMode: TOpMode;
-  iOpNumMRef: integer;
-
-  function PrepareOperandTyp(const aTyp: String): String;
-  begin
-    result := aTyp;
-    if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1);
-    if result = 'XMMRM128' then result := 'XMMRM';
-    if result = 'YMMRM256' then result := 'YMMRM';
-  end;
-
-  procedure SplitOperands(const aOperand1, aOperand2, aOperand3, aOperand4: string; var aRegCombi0, aRegCombi1, aRegCombi2, aRegCombi3, aRegCombi4: string);
-  var
-    i: integer;
-    s1: string;
-    s2: string;
-    s3: string;
-    s4: string;
-    iCnt1: integer;
-    iCnt2: integer;
-    iCnt3: integer;
-    iCnt4: integer;
-    iMaxCnt: integer;
-
-  begin
-    with TStringList.Create do
-    try
-      Text := StringReplace(trim(aOperand1), '|', #13#10, [rfReplaceAll]);
-      iCnt1 := Count;
-
-      Text := StringReplace(trim(aOperand2), '|', #13#10, [rfReplaceAll]);
-      iCnt2 := Count;
-
-      Text := StringReplace(trim(aOperand3), '|', #13#10, [rfReplaceAll]);
-      iCnt3 := Count;
-
-      Text := StringReplace(trim(aOperand4), '|', #13#10, [rfReplaceAll]);
-      iCnt4 := Count;
-
-      iMaxCnt := iCnt1;
-      if iCnt2 > iMaxCnt then iMaxCnt := iCnt2;
-      if iCnt3 > iMaxCnt then iMaxCnt := iCnt3;
-      if iCnt4 > iMaxCnt then iMaxCnt := iCnt4;
-
-
-      if (aOperand1 <> '') and (aRegCombi0 <> '') then
-      begin
-        aRegCombi0 := aRegCombi0 + ',';
-        aRegCombi1 := aRegCombi1 + ',';
-        aRegCombi2 := aRegCombi2 + ',';
-        aRegCombi3 := aRegCombi3 + ',';
-        aRegCombi4 := aRegCombi4 + ',';
-      end;
-
-
-      Text := StringReplace(trim(aOperand1), '|', #13#10, [rfReplaceAll]);
-      if Count = iMaxCnt then
-      begin
-        for i := 0 to iMaxCnt - 1 do
-        begin
-          case i of
-            0: aRegCombi0 := aRegCombi0 + ',' + Strings[i];
-            1: aRegCombi1 := aRegCombi1 + ',' + Strings[i];
-            2: aRegCombi2 := aRegCombi2 + ',' + Strings[i];
-            3: aRegCombi3 := aRegCombi3 + ',' + Strings[i];
-            4: aRegCombi4 := aRegCombi4 + ',' + Strings[i];
-          end;
-        end;
-      end
-      else
-      begin
-        if Count = 1 then
-        begin
-          for i := 0 to iMaxCnt - 1 do
-          begin
-            case i of
-              0: aRegCombi0 := aRegCombi0 + ',' + Strings[0];
-              1: aRegCombi1 := aRegCombi1 + ',' + Strings[0];
-              2: aRegCombi2 := aRegCombi2 + ',' + Strings[0];
-              3: aRegCombi3 := aRegCombi3 + ',' + Strings[0];
-              4: aRegCombi4 := aRegCombi4 + ',' + Strings[0];
-            end;
-          end;
-        end
-        else
-        begin
-          // TODO log
-        end;
-      end;
-    finally
-      Free;
-    end;
-  end;
-
-  function MapOperand(aOpTyp: TOpType): String;
-  begin
-    case aOpTyp of
-        otXMMReg: result := 'X';
-        otYMMReg: result := 'Y';
-        otZMMReg: result := 'Z';
-           otEAX,
-           otRAX,
-         otREG64,
-         otREG32,
-         otREG16,
-          otREG8: result := 'R';
-          otRM32,
-          otRM64,
-         otXMMRM,
-        otXMMRM8,
-       otXMMRM16,
-         otYMMRM,
-         otZMMRM,
-         otMem32,
-          otMem8,
-         otMem16,
-         otMem64,
-        otMem128,
-        otMem256,
-        otMem512: result := 'M';
-          otIMM8: result := 'I';
-        otXMEM32: result := 'X32';
-        otXMEM64: result := 'X64';
-        otYMEM32: result := 'Y32';
-        otYMEM64: result := 'Y64';
-        otZMEM32: result := 'Z32';
-        otZMEM64: result := 'Z64';
-           otB32: result := 'B32';
-           otB64: result := 'B64';
-          otKREG: result := 'K';
-             else result := '';
-    end;
-  end;
-
-  function AsmCodeBlockCompare(aAsmCounter: integer; aCompareMode: TAsmCompareMode): String;
-  var
-    sReg: string;
-  begin
-    result := '';
-
-    case Fx64 of
-      true: sReg := 'RAX';
-       else sReg := 'EAX';
-    end;
-
-    with TStringList.Create do
-    try
-      Add(format('%20s%6s  ',             ['    push', sReg]));
-      Add(format('%20s%6s,%s',            ['     mov', sReg, inttostr(aAsmCounter)]));
-      Add(format('%20s%6s,%s',            ['   kmovd', 'K7', 'EAX']));
-      Add(format('%20s%6s',               ['     pop', sReg]));
-
-      case aComparemode of
-        cmKORTESTNC: begin
-                       Add(format('%20s%6s, %s',           ['ktestb', 'K2', 'K1']));
-                       Add(format('%20s  %6s',             ['     jnc', '@@CHECKRESULT']));
-                     end;
-        cmXORTestNZ: begin
-                       Add(format('%20s%6s, %s',           ['kortestq', 'K2', 'K2']));
-                       Add(format('%20s  %6s',             ['     jnz', '@@CHECKRESULT']));
-                     end;
-      end;
-
-      result := Text;
-    finally
-      Free;
-    end;
-  end;
-
-begin
-  result := TStringList.Create;
-
-  iAsmCounter := 0;
-
-  OItem1 := TOperandListItem.Create;
-  try
-    OItem2 := TOperandListItem.Create;
-    try
-      OItem3 := TOperandListItem.Create;
-      try
-        OItem4 := TOperandListItem.Create;
-        try
-
-          UsePrefix := (UpperCase(aInst) = 'VCVTPD2DQ') OR
-                       (UpperCase(aInst) = 'VCVTPD2PS') OR
-                       (UpperCase(aInst) = 'VCVTSI2SD') OR
-                       (UpperCase(aInst) = 'VCVTSI2SS') OR
-                       (UpperCase(aInst) = 'VCVTTPD2DQ') or
-                       (UpperCase(aInst) = 'VPMOVZXWQ') or
-                       (UpperCase(aInst) = 'VCVTPD2UDQ') or
-                       (UpperCase(aInst) = 'VCVTPD2UDQ') or
-                       (UpperCase(aInst) = 'VCVTTPD2UDQ') or
-                       (UpperCase(aInst) = 'VCVTUQQ2PS') or
-                       (UpperCase(aInst) = 'VCVTQQ2PS') or
-                       (UpperCase(aInst) = 'VCVTUSI2SD') or
-                       (UpperCase(aInst) = 'VCVTUSI2SS') or
-                       (UpperCase(aInst) = 'VFPCLASSPD') or
-                       (UpperCase(aInst) = 'VFPCLASSPS') or
-                       (UpperCase(aInst) = 'VCMPSS')
-
-                       ;
-
-
-          MaskRegNeeded := (Pos('VGATHER', Uppercase(aInst)) = 1) or
-                           (Pos('VPGATHER', Uppercase(aInst)) = 1) or
-			   (Pos('VPSCATTER', Uppercase(aInst)) = 1) or
-			   (Pos('VSCATTER', Uppercase(aInst)) = 1);
-
-          for il_Op := 1 to 4 do
-          begin
-            sl_Prefix := '';
-
-            case il_Op of
-              1: begin
-                   Item := OItem1;
-                   sl_Operand := aOp1;
-                 end;
-              2: begin
-                   Item := OItem2;
-                   sl_Operand := aOp2;
-                 end;
-              3: begin
-                   Item := OItem3;
-                   sl_Operand := aOp3;
-                 end;
-              4: begin
-                   Item := OItem4;
-                   sl_Operand := aOp4;
-                 end;
-            end;
-
-            sl_Operand := PrepareOperandTyp(sl_Operand);
-
-            if (AnsiSameText(sl_Operand, 'XMMREG')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMMReg;
-              Item.OpActive := true;
-
-              Item.Values.Add('XMM16');
-            end
-            else if (AnsiSameText(sl_Operand, 'XMMREG_M')) or
-                    (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
-                    (AnsiSameText(sl_Operand, 'XMMREG_ER')) or
-                    (AnsiSameText(sl_Operand, 'XMMREG_SAE')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMMReg;
-              Item.OpActive := true;
-
-              //sSuffix := '';
-              //if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
-              // else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-              //
-              //if Pos('_ER', sl_Operand) > 0 then sSuffix := ', {ru-sae}'
-              // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
-              //
-              //Item.Values.Add('XMM0' + sSuffix);
-              //if (sSuffix <> '') and
-              //   (MaskRegNeeded = false) then Item.Values.Add('XMM0');
-
-              Item.Values.Add('XMM16');
-            end
-            else if (AnsiSameText(sl_Operand, 'XMMRM')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_M')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_MZ')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_SAE')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMMRM;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'oword ';
-
-              if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
-               else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if (AnsiSameText(sl_Operand, 'XMMRM8')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM8_M')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM8_MZ')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM8_ER')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM8_SAE')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMMRM8;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'byte ';
-
-              if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
-               else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if (AnsiSameText(sl_Operand, 'XMMRM16')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM16_M')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM16_MZ')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM16_ER')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM16_SAE'))
-                    then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMMRM16;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'word ';
-
-              if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
-               else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if (AnsiSameText(sl_Operand, 'YMMREG')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otYMMReg;
-              Item.OpActive := true;
-
-              Item.Values.Add('YMM16');
-            end
-            else if (AnsiSameText(sl_Operand, 'YMMREG_M')) or
-                    (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
-                    (AnsiSameText(sl_Operand, 'YMMREG_ER')) or
-                    (AnsiSameText(sl_Operand, 'YMMREG_SAE'))
-                    then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otYMMReg;
-              Item.OpActive := true;
-
-              //sSuffix := '';
-              //if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
-              // else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-              //
-              //if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
-              // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
-              //
-              //Item.Values.Add('YMM0' + sSuffix);
-              //if (sSuffix <> '') and
-              //   (MaskRegNeeded = false) then Item.Values.Add('YMM0');
-
-              Item.Values.Add('YMM16');
-            end
-            else if (AnsiSameText(sl_Operand, 'YMMRM'))  or
-                    (AnsiSameText(sl_Operand, 'YMMRM_M')) or
-                    (AnsiSameText(sl_Operand, 'YMMRM_MZ')) or
-                    (AnsiSameText(sl_Operand, 'YMMRM_ER')) or
-                    (AnsiSameText(sl_Operand, 'YMMRM_SAE'))
-                    then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otYMMRM;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'yword ';
-
-              //sSuffix := '';
-              //if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
-              // else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-              //
-              //if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
-              // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
-
-              if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
-               else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if (AnsiSameText(sl_Operand, 'ZMMREG')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otZMMReg;
-              Item.OpActive := true;
-
-              Item.Values.Add('ZMM16');
-            end
-            else if (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
-                    (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
-                    (AnsiSameText(sl_Operand, 'ZMMREG_ER')) or
-                    (AnsiSameText(sl_Operand, 'ZMMREG_SAE'))
-                    then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otZMMReg;
-              Item.OpActive := true;
-
-              //sSuffix := '';
-              //if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
-              // else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-              //
-              //if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
-              // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
-
-              Item.Values.Add('ZMM16');
-            end
-            else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
-                    (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
-                    (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
-                    (AnsiSameText(sl_Operand, 'ZMMRM_ER')) or
-                    (AnsiSameText(sl_Operand, 'ZMMRM_SAE'))
-                    then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otZMMRM;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'zword ';
-
-              //sSuffix := '';
-              //if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
-              // else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-              //
-              //if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
-              // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
-
-              if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
-               else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, 'MEM8') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM8;
-              Item.OpActive := true;
-
-
-
-	      if UsePrefix then sl_Prefix := 'byte ';
-
-
-              sSuffix := '';
-
-	      if x64 then
-              begin
-                MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, 'MEM16') or
-                    AnsiSameText(sl_Operand, 'MEM16_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM16;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'word ';
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombiCDISP8N(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_Prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, 'MEM32') or
-                    AnsiSameText(sl_Operand, 'MEM32_M') or
-                    AnsiSameText(sl_Operand, 'MEM32_MZ') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM32;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'dword ';
-
-              sSuffix := '';
-
-	      if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
-            end
-            else if (AnsiSameText(sl_Operand, 'MEM64')) or
-                    (AnsiSameText(sl_Operand, 'MEM64_M')) or
-                    (AnsiSameText(sl_Operand, 'MEM64_MZ')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM64;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'qword ';
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombiCDISP8N(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
-            end
-            else if (AnsiSameText(sl_Operand, 'MEM128')) or
-                    (AnsiSameText(sl_Operand, 'MEM128_M')) or
-                    (AnsiSameText(sl_Operand, 'MEM128_MZ')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM128;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'oword ';
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
-            end
-            else if (AnsiSameText(sl_Operand, 'MEM256')) or
-                    (AnsiSameText(sl_Operand, 'MEM256_M')) or
-                    (AnsiSameText(sl_Operand, 'MEM256_MZ')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM256;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'yword ';
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
-            end
-            else if (AnsiSameText(sl_Operand, 'MEM512')) or
-                    (AnsiSameText(sl_Operand, 'MEM512_M')) or
-                    (AnsiSameText(sl_Operand, 'MEM512_MZ')) then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otMEM512;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'zword ';
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-              if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, 'REG8') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otREG8;
-              Item.OpActive := true;
-
-              if x64 then
-              begin
-                Item.Values.AddStrings(FReg8);
-              end
-              else Item.Values.AddStrings(FReg8);
-            end
-            else if AnsiSameText(sl_Operand, 'REG16') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otREG16;
-              Item.OpActive := true;
-
-              if x64 then
-              begin
-                Item.Values.AddStrings(FReg16);
-              end
-              else Item.Values.AddStrings(FReg16);
-            end
-            else if AnsiSameText(sl_Operand, 'REG32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otREG32;
-              Item.OpActive := true;
-
-              if x64 then
-              begin
-                Item.Values.AddStrings(FReg32Base);
-              end
-              else Item.Values.AddStrings(FReg32Base);
-            end
-            else if AnsiSameText(sl_Operand, 'REG64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otREG64;
-              Item.OpActive := true;
-
-              if x64 then
-              begin
-                Item.Values.AddStrings(FReg64Base);
-              end;
-            end
-            else if AnsiSameText(sl_Operand, 'RM32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otRM32;
-              Item.OpActive := true;
-
-              Item.Values.AddStrings(FReg32Base);
-
-              if UsePrefix then sl_Prefix := 'dword ';
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, 'RM64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otRM32;
-              Item.OpActive := true;
-
-
-
-              if UsePrefix then sl_Prefix := 'qword ';
-
-              if x64 then
-              begin
-                Item.Values.AddStrings(FReg64Base);
-                MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, 'IMM8') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otIMM8;
-              Item.OpActive := true;
-
-              Item.Values.Add('0');
-            end
-            else if AnsiSameText(sl_Operand, 'XMEM32') or
-                    AnsiSameText(sl_Operand, 'XMEM32_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMEM32;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'oword ';
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if x64 then
-              begin
-		VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
-		if (sSuffix <> '') and
-                   (MaskRegNeeded = false) then
- 		 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
-              end
-              else
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
-		if (sSuffix <> '') and
-                   (MaskRegNeeded = false) then
-                 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
-              end;
-            end
-            else if AnsiSameText(sl_Operand, 'XMEM64') or
-                    AnsiSameText(sl_Operand, 'XMEM64_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otXMEM64;
-              Item.OpActive := true;
-
-              //if UsePrefix then sl_Prefix := 'oword ';
-              //
-              //if x64 then
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64XMMIndex, Item.Values);
-              //end
-              //else
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32XMMIndex, Item.Values);
-              //end;
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if x64 then
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
-                if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
- 		 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
-              end
-              else
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
-                if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
- 		 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
-              end;
-
-            end
-            else if AnsiSameText(sl_Operand, 'YMEM32') or
-                    AnsiSameText(sl_Operand, 'YMEM32_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otYMEM32;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'yword ';
-
-              //if x64 then
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
-              //end
-              //else
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
-              //end;
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if x64 then
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
-                if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
-		 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
-              end
-              else
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
-                if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
-		 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
-              end;
-
-            end
-            else if AnsiSameText(sl_Operand, 'YMEM64') or
-                    AnsiSameText(sl_Operand, 'YMEM64_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otYMEM64;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'yword ';
-
-              //if x64 then
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
-              //end
-              //else
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
-              //end;
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if x64 then
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
-		if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
-                 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
-              end
-              else
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
-                if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
-		 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
-              end;
-
-            end
-            else if AnsiSameText(sl_Operand, 'ZMEM32') or
-                    AnsiSameText(sl_Operand, 'ZMEM32_M')  then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otZMEM32;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'zword ';
-
-              //if x64 then
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
-              //end
-              //else
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
-              //end;
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if x64 then
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
-		if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
-                 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
-              end
-              else
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
-		if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
-                 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
-              end;
-
-            end
-            else if AnsiSameText(sl_Operand, 'ZMEM64') or
-                    AnsiSameText(sl_Operand, 'ZMEM64_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otZMEM64;
-              Item.OpActive := true;
-
-              if UsePrefix then sl_Prefix := 'zword ';
-
-              //if x64 then
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
-              //end
-              //else
-              //begin
-              //  VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
-              //end;
-
-              sSuffix := '';
-              if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
-
-              if x64 then
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
-		if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
-                 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
-              end
-              else
-              begin
-                VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
-                if (sSuffix <> '') and
-                   (MaskRegNeeded = false)
-                        then
-		 VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
-              end;
-
-            end
-            else if AnsiSameText(sl_Operand, '2B32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB32;
-              Item.OpActive := true;
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to2}',  FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, '4B32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB32;
-              Item.OpActive := true;
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to4}',  FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, '8B32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB32;
-              Item.OpActive := true;
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to8}',  FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, '16B32') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB32;
-              Item.OpActive := true;
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to16}',  FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, '2B64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB64;
-              Item.OpActive := true;
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to2}',  FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, '4B64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB64;
-              Item.OpActive := true;
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to4}',  FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, '8B64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB64;
-              Item.OpActive := true;
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to8}',  FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, '16B64') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otB64;
-              Item.OpActive := true;
-
-
-              if x64 then
-              begin
-                MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to16}',  FReg64Base, FReg64Index, Item.Values);
-                //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
-              end
-              else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
-            end
-            else if AnsiSameText(sl_Operand, 'KREG') or
-                    AnsiSameText(sl_Operand, 'KREG_M') then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otKREG;
-              Item.OpActive := true;
-
-              Item.Values.Add('K1');
-            end
-            else if trim(sl_Operand) = '' then
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otUnknown;
-              Item.OpActive := false;
-
-              Item.Values.Add('');
-            end
-            else
-            begin
-              Item.OpNumber := il_Op;
-              Item.OpTyp    := otUnknown;
-              Item.OpActive := false;
-
-              Item.Values.Add('?' + sl_Operand);
-            end
-
-          end;
-
-          //sl_RegCombi := '';
-
-
-          il_Operands := 0;
-          UsedParams  := 0;
-
-          if OItem1.OpActive then
-          begin
-            inc(il_Operands);
-            UsedParams := UsedParams or 1;
-          end;
-
-          if OItem2.OpActive then
-          begin
-            inc(il_Operands);
-            UsedParams := UsedParams or 2;
-          end;
-
-          if OItem3.OpActive then
-          begin
-            inc(il_Operands);
-            UsedParams := UsedParams or 4;
-          end;
-
-          if OItem4.OpActive then
-          begin
-            inc(il_Operands);
-            UsedParams := UsedParams or 8;
-          end;
-
-          case il_Operands of
-              1: UseDefault := UsedParams <> 1;
-              2: UseDefault := UsedParams <> 3;
-              3: UseDefault := UsedParams <> 7;
-              4: UseDefault := UsedParams <> 15;
-            else UseDefault := true;
-          end;
-
-          // TODO deaktivieren
-          //UseDefault := true;
-
-          if UseDefault then
-          begin
-            sl_Inst := format('%-20s', [aInst]);
-
-            for il_Op1 := 0 to OItem1.Values.Count - 1 do
-            begin
-              for il_Op2 := 0 to OItem2.Values.Count - 1 do
-              begin
-                for il_Op3 := 0 to OItem3.Values.Count - 1 do
-                begin
-                  for il_Op4 := 0 to OItem4.Values.Count - 1 do
-                  begin
-                    slRegCombi := TStringList.Create;
-                    try
-                      while slRegCombi.Count < 5 do
-                       slRegCombi.Add('');
-
-
-                      //SplitOperands(OItem1.Values[il_Op1], OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]
-                      if OItem1.OpActive then
-                      begin
-                      //  SplitOperand(OItem1.Values[il_Op1], sRegCombi0,sRegCombi1,sRegCombi2,sRegCombi3,sRegCombi4);
-                      //
-                      end;
-                    finally
-                      FreeAndNil(slRegCombi);
-                    end;
-
-                    //sRegCombi0 := '';
-                    //sRegCombi1 := '';
-                    //sRegCombi2 := '';
-                    //sRegCombi3 := '';
-                    //sRegCombi4 := '';
-                    //
-                    //if OItem1.OpActive then
-                    //begin
-                    //  if sRegCombi0 <> '' then
-                    //  begin
-                    //    sRegCombi0 := sRegCombi0 + ', ';
-                    //    sRegCombi1 := sRegCombi1 + ', ';
-                    //    sRegCombi2 := sRegCombi2 + ', ';
-                    //    sRegCombi3 := sRegCombi3 + ', ';
-                    //    sRegCombi4 := sRegCombi4 + ', ';
-                    //  end;
-                    //
-                    //  if Pos('|', OItem1.Values[il_Op1]) > 0 then
-                    //  begin
-                    //    with TStringList.Create do
-                    //    try
-                    //      Text := Stringreplace(OItem1.Values[il_Op1], '|', #13#10,[rfReplaceAll]);
-                    //      iCnt := Count;
-                    //      while Count < 5 do Add('');
-                    //
-                    //      sRegCombi0 := sRegCombi0 + Strings[0];
-                    //      sRegCombi1 := sRegCombi1 + Strings[1];
-                    //      sRegCombi2 := sRegCombi2 + Strings[2];
-                    //      sRegCombi3 := sRegCombi3 + Strings[3];
-                    //      sRegCombi4 := sRegCombi4 + Strings[4];
-                    //
-                    //    finally
-                    //      Free;
-                    //    end;
-                    //  end
-                    //  else
-                    //  begin
-                    //    sRegCombi0 := sRegCombi0 + OItem1.Values[il_Op1];
-                    //    sRegCombi1 := sRegCombi1 + OItem1.Values[il_Op1];
-                    //    sRegCombi2 := sRegCombi2 + OItem1.Values[il_Op1];
-                    //    sRegCombi3 := sRegCombi3 + OItem1.Values[il_Op1];
-                    //    sRegCombi4 := sRegCombi4 + OItem1.Values[il_Op1];
-                    //  end;
-                    //end;
-                    //
-                    //if OItem2.OpActive then
-                    //begin
-                    //  if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
-                    //  sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2];
-                    //end;
-                    //
-                    //if OItem3.OpActive then
-                    //begin
-                    //  if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
-                    //  sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3];
-                    //end;
-                    //
-                    //if OItem4.OpActive then
-                    //begin
-                    //  if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
-                    //  sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4];
-                    //end;
-                    //
-                    //if sl_RegCombi <> '' then
-                    //begin
-                    //  //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
-                    //  result.Add(sl_Inst + sl_RegCombi);
-                    //  sl_RegCombi := '';
-                    //end;
-                  end;
-                end;
-              end;
-            end;
-          end
-          else
-          begin
-            OpMode := omUnknown;
-
-            iOpNumMRef := -1;
-            if (OItem1.OpTyp in MEMTYPES) or
-               (OItem1.OpTyp in BMEMTYPES) then iOpNumMRef := 1
-             else if (OItem2.OpTyp in MEMTYPES) or
-                     (OItem2.OpTyp in BMEMTYPES) then iOpNumMRef := 2
-             else if (OItem3.OpTyp in MEMTYPES) or
-                     (OItem3.OpTyp in BMEMTYPES) then iOpNumMRef := 3
-             else if (OItem4.OpTyp in MEMTYPES) or
-                     (OItem4.OpTyp in BMEMTYPES) then iOpNumMRef := 4;
-
-
-            // TODO delete
-            //if il_Operands = 4 then
-
-            case il_Operands of
-                2: begin
-                     if (OItem1.OpTyp in MEMTYPES) and
-                        (OItem2.OpTyp = otXMMReg) then OpMode := omMX
-                      else if (OItem1.OpTyp in MEMTYPES) and
-                              (OItem2.OpTyp = otYMMReg) then OpMode := omMY
-                      else if (OItem1.OpTyp in MEMTYPES) and
-                              (OItem2.OpTyp = otZMMReg) then OpMode := omMZ
-
-                      else if (OItem1.OpTyp = otXMMReg) and
-                              (OItem2.OpTyp = otB32) then OpMode := omXB32
-                      else if (OItem1.OpTyp = otXMMReg) and
-                              (OItem2.OpTyp = otB64) then OpMode := omXB64
-
-                      else if (OItem1.OpTyp = otYMMReg) and
-                              (OItem2.OpTyp = otB32) then OpMode := omYB32
-                      else if (OItem1.OpTyp = otYMMReg) and
-                              (OItem2.OpTyp = otB64) then OpMode := omYB64
-
-                      else if (OItem1.OpTyp = otZMMReg) and
-                              (OItem2.OpTyp = otB32) then OpMode := omZB32
-                      else if (OItem1.OpTyp = otZMMReg) and
-                              (OItem2.OpTyp = otB64) then OpMode := omZB64
-
-                      else if (OItem1.OpTyp = otXMMReg) and
-                              (OItem2.OpTyp in MEMTYPES) then OpMode := omXM
-                      else if (OItem1.OpTyp = otYMMReg) and
-                              (OItem2.OpTyp in MEMTYPES) then OpMode := omYM
-                      else if (OItem1.OpTyp = otZMMReg) and
-                              (OItem2.OpTyp in MEMTYPES) then OpMode := omZM
-
-
-
-
-                     else
-                     begin
-                       sLogMsg := '';
-                       sLogMsg := MapOperand(OItem1.Optyp) + MapOperand(OItem2.Optyp) + MapOperand(OItem3.Optyp);
-                       if sLogMsg <> '' then
-                       begin
-
-                         if (sLogMsg <> 'KX') and
-                            (sLogMsg <> 'KY') and
-                            (sLogMsg <> 'KZ') and
-                            (sLogMsg <> 'RM') and
-                            (sLogMsg <> 'RX') and
-                            (sLogMsg <> 'XK') and
-                            (sLogMsg <> 'XR') and
-                            (sLogMsg <> 'XX') and
-                            (sLogMsg <> 'XY') and
-                            (sLogMsg <> 'XZ') and
-                            (sLogMsg <> 'YK') and
-                            (sLogMsg <> 'YR') and
-                            (sLogMsg <> 'YX') and
-                            (sLogMsg <> 'YY') and
-                            (sLogMsg <> 'YZ') and
-                            (sLogMsg <> 'ZK') and
-                            (sLogMsg <> 'ZR') and
-                            (sLogMsg <> 'ZX') and
-                            (sLogMsg <> 'ZY') and
-                            (sLogMsg <> 'ZZ') then
-
-                         writeln('offen : ' + sLogMsg + ' (' + aInst + ')');
-                       end;
-                     end;
-                   end;
-                3: if (OItem1.OpTyp = otKReg) and
-                      (OItem2.OpTyp = otXMMReg) and
-                      (OItem3.OpTyp in MEMTYPES) then OpMode := omKXM
-                    else if (OItem1.OpTyp = otKReg) and
-                            (OItem2.OpTyp = otYMMReg) and
-                            (OItem3.OpTyp in MEMTYPES) then OpMode := omKYM
-                    else if (OItem1.OpTyp = otKReg) and
-                            (OItem2.OpTyp = otZMMReg) and
-                            (OItem3.OpTyp in MEMTYPES) then OpMode := omKZM
-
-                    else if (OItem1.OpTyp = otKReg) and
-                            (OItem2.OpTyp = otXMMReg) and
-                            (OItem3.OpTyp = otB32) then OpMode := omKXB32
-                    else if (OItem1.OpTyp = otKReg) and
-                            (OItem2.OpTyp = otXMMReg) and
-                            (OItem3.OpTyp = otB64) then OpMode := omKXB64
-                    else if (OItem1.OpTyp = otKReg) and
-                            (OItem2.OpTyp = otYMMReg) and
-                            (OItem3.OpTyp = otB32) then OpMode := omKYB32
-                    else if (OItem1.OpTyp = otKReg) and
-                            (OItem2.OpTyp = otYMMReg) and
-                            (OItem3.OpTyp = otB64) then OpMode := omKYB64
-                    else if (OItem1.OpTyp = otKReg) and
-                            (OItem2.OpTyp = otZMMReg) and
-                            (OItem3.OpTyp = otB32) then OpMode := omKZB32
-                    else if (OItem1.OpTyp = otKReg) and
-                            (OItem2.OpTyp = otZMMReg) and
-                            (OItem3.OpTyp = otB64) then OpMode := omKZB64
-
-                    else if (OItem1.OpTyp = otKReg)    and
-                            (OItem2.OpTyp in MEMTYPES) and
-                            (OItem3.OpTyp = otIMM8) then OpMode := omKMI
-                    else if (OItem1.OpTyp = otKReg)    and
-                            (OItem2.OpTyp = otB32)     and
-                            (OItem3.OpTyp = otIMM8) then OpMode := omKB32I
-                    else if (OItem1.OpTyp = otKReg)    and
-                            (OItem2.OpTyp = otB64)     and
-                            (OItem3.OpTyp = otIMM8) then OpMode := omKB64I
-
-                    else if (OItem1.OpTyp in MEMTYPES) and
-                            (OItem2.OpTyp = otXMMReg)  and
-                            (OItem3.OpTyp = otIMM8) then OpMode := omMXI
-                    else if (OItem1.OpTyp in MEMTYPES) and
-                            (OItem2.OpTyp = otYMMReg)  and
-                            (OItem3.OpTyp = otIMM8) then OpMode := omMYI
-                    else if (OItem1.OpTyp in MEMTYPES) and
-                            (OItem2.OpTyp = otZMMReg)  and
-                            (OItem3.OpTyp = otIMM8) then OpMode := omMZI
-
-                    else if (OItem1.OpTyp = otXMMReg) and
-                            (OItem2.OpTyp = otXMMReg) and
-                            (OItem3.OpTyp in MEMTYPES) then OpMode := omXXM
-                    else if (OItem1.OpTyp = otXMMReg) and
-                            (OItem2.OpTyp = otXMMReg) and
-                            (OItem3.OpTyp = otB32) then OpMode := omXXB32
-                    else if (OItem1.OpTyp = otXMMReg) and
-                            (OItem2.OpTyp = otXMMReg) and
-                            (OItem3.OpTyp = otB64) then OpMode := omXXB64
-                    else if (OItem1.OpTyp = otXMMReg) and
-                            (OItem2.OpTyp = otB32) and
-                            (OItem3.OpTyp = otIMM8) then OpMode := omXB32I
-                    else if (OItem1.OpTyp = otXMMReg) and
-                            (OItem2.OpTyp = otB64) and
-                            (OItem3.OpTyp = otIMM8) then OpMode := omXB64I
-                    else if (OItem1.OpTyp = otXMMReg) and
-                            (OItem2.OpTyp in MEMTYPES) and
-                            (OItem3.OpTyp = otIMM8) then OpMode := omXMI
-
-                    else if (OItem1.OpTyp = otYMMReg) and
-                            (OItem2.OpTyp = otYMMReg) and
-                            (OItem3.OpTyp in MEMTYPES) then OpMode := omYYM
-                    else if (OItem1.OpTyp = otYMMReg) and
-                            (OItem2.OpTyp = otYMMReg) and
-                            (OItem3.OpTyp = otB32) then OpMode := omYYB32
-                    else if (OItem1.OpTyp = otYMMReg) and
-                            (OItem2.OpTyp = otYMMReg) and
-                            (OItem3.OpTyp = otB64) then OpMode := omYYB64
-                    else if (OItem1.OpTyp = otYMMReg) and
-                            (OItem2.OpTyp = otB32) and
-                            (OItem3.OpTyp = otIMM8) then OpMode := omYB32I
-                    else if (OItem1.OpTyp = otYMMReg) and
-                            (OItem2.OpTyp = otB64) and
-                            (OItem3.OpTyp = otIMM8) then OpMode := omYB64I
-                    else if (OItem1.OpTyp = otYMMReg) and
-                            (OItem2.OpTyp in MEMTYPES) and
-                            (OItem3.OpTyp = otIMM8) then OpMode := omYMI
-
-                    else if (OItem1.OpTyp = otZMMReg) and
-                            (OItem2.OpTyp = otZMMReg) and
-                            (OItem3.OpTyp in MEMTYPES) then OpMode  := omZZM
-                    else if (OItem1.OpTyp = otZMMReg) and
-                            (OItem2.OpTyp = otZMMReg) and
-                            (OItem3.OpTyp = otB32) then OpMode := omZZB32
-                    else if (OItem1.OpTyp = otZMMReg) and
-                            (OItem2.OpTyp = otZMMReg) and
-                            (OItem3.OpTyp = otB64) then OpMode := omZZB64
-                            else if (OItem1.OpTyp = otZMMReg) and
-                                    (OItem2.OpTyp = otB32) and
-                                    (OItem3.OpTyp = otIMM8) then OpMode := omZB32I
-                            else if (OItem1.OpTyp = otZMMReg) and
-                                    (OItem2.OpTyp = otB64) and
-                                    (OItem3.OpTyp = otIMM8) then OpMode := omZB64I
-                    else if (OItem1.OpTyp = otZMMReg) and
-                            (OItem2.OpTyp in MEMTYPES) and
-                            (OItem3.OpTyp = otIMM8) then OpMode := omZMI
-
-
-                    else
-                    begin
-                      sLogMsg := '';
-                      sLogMsg := MapOperand(OItem1.Optyp) + MapOperand(OItem2.Optyp) + MapOperand(OItem3.Optyp);
-                      if sLogMsg <> '' then
-                      begin
-                       if (sLogMsg <> 'RMI') and
-                          (sLogMsg <> 'RRM') and
-                          (sLogMsg <> 'RMR') and
-                          (sLogMsg <> 'KKK') and
-                          (sLogMsg <> 'KKI') and
-                          (sLogMsg <> 'XXX') and
-                          (sLogMsg <> 'YYY') and
-                          (sLogMsg <> 'ZZZ') and
-                          (sLogMsg <> 'XXI') and
-                          (sLogMsg <> 'YYI') and
-                          (sLogMsg <> 'ZZI') and
-                          (sLogMsg <> 'XYI') and
-                          (sLogMsg <> 'YZI') and
-                          (sLogMsg <> 'XZI') and
-                          (sLogMsg <> 'RXI') and
-                          (sLogMsg <> 'RYI') and
-                          (sLogMsg <> 'RZI') and
-
-
-                          (sLogMsg <> 'XXR') then
-
-                       writeln('offen : ' + sLogMsg + ' (' + aInst + ')');
-                      end;
-                    end;
-                 4: if (OItem1.OpTyp = otKReg)       and
-                       (OItem2.OpTyp = otXMMReg)     and
-                       (OItem3.OpTyp = otB32)        and
-                       (OItem4.OpTyp = otIMM8) then OpMode := omKXB32I
-                     else if (OItem1.OpTyp = otKReg)       and
-                             (OItem2.OpTyp = otXMMReg)     and
-                             (OItem3.OpTyp = otB64)        and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omKXB64I
-                     else if (OItem1.OpTyp = otKReg)       and
-                             (OItem2.OpTyp = otXMMReg)     and
-                             (OItem3.OpTyp in MEMTYPES)    and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omKXMI
-
-                     else if (OItem1.OpTyp = otKReg)       and
-                             (OItem2.OpTyp = otYMMReg)     and
-                             (OItem3.OpTyp = otB32)        and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omKYB32I
-                     else if (OItem1.OpTyp = otKReg)       and
-                             (OItem2.OpTyp = otYMMReg)     and
-                             (OItem3.OpTyp = otB64)        and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omKYB64I
-                     else if (OItem1.OpTyp = otKReg)       and
-                             (OItem2.OpTyp = otYMMReg)     and
-                             (OItem3.OpTyp in MEMTYPES)    and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omKYMI
-
-                     else if (OItem1.OpTyp = otKReg)       and
-                             (OItem2.OpTyp = otZMMReg)     and
-                             (OItem3.OpTyp = otB32)        and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omKZB32I
-                     else if (OItem1.OpTyp = otKReg)       and
-                             (OItem2.OpTyp = otZMMReg)     and
-                             (OItem3.OpTyp = otB64)        and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omKZB64I
-                     else if (OItem1.OpTyp = otKReg)       and
-                             (OItem2.OpTyp = otZMMReg)     and
-                             (OItem3.OpTyp in MEMTYPES)    and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omKZMI
-
-                     else if (OItem1.OpTyp = otXMMReg) and
-                             (OItem2.OpTyp = otXMMReg) and
-                             (OItem3.OpTyp = otB32)    and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omXXB32I
-                     else if (OItem1.OpTyp = otXMMReg) and
-                             (OItem2.OpTyp = otXMMReg) and
-                             (OItem3.OpTyp = otB64)    and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omXXB64I
-                     else if (OItem1.OpTyp = otYMMReg) and
-                             (OItem2.OpTyp = otYMMReg) and
-                             (OItem3.OpTyp = otB32)    and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omYYB32I
-                     else if (OItem1.OpTyp = otYMMReg) and
-                             (OItem2.OpTyp = otYMMReg) and
-                             (OItem3.OpTyp = otB64)    and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omYYB64I
-                     else if (OItem1.OpTyp = otZMMReg) and
-                             (OItem2.OpTyp = otZMMReg) and
-                             (OItem3.OpTyp = otB32)    and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omZZB32I
-                     else if (OItem1.OpTyp = otZMMReg) and
-                             (OItem2.OpTyp = otZMMReg) and
-                             (OItem3.OpTyp = otB64)    and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omZZB64I
-
-
-                     else if (OItem1.OpTyp = otXMMReg) and
-                             (OItem2.OpTyp = otXMMReg) and
-                             (OItem3.OpTyp in MEMTYPES) and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omXXMI
-                     else if (OItem1.OpTyp = otYMMReg) and
-                             (OItem2.OpTyp = otYMMReg) and
-                             (OItem3.OpTyp in MEMTYPES) and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omYYMI
-                     else if (OItem1.OpTyp = otZMMReg) and
-                             (OItem2.OpTyp = otZMMReg) and
-                             (OItem3.OpTyp in MEMTYPES) and
-                             (OItem4.OpTyp = otIMM8) then OpMode := omZZMI
-                     else
-                     begin
-                       sLogMsg := '';
-                       sLogMsg := MapOperand(OItem1.Optyp) + MapOperand(OItem2.Optyp) + MapOperand(OItem3.Optyp) + MapOperand(OItem4.Optyp);
-                       if sLogMsg <> '' then
-                       begin
-
-                         if (sLogMsg <> 'KXXI') and
-                            (sLogMsg <> 'KYYI') and
-                            (sLogMsg <> 'KZZI') and
-                            (sLogMsg <> 'XXRI') and
-                            (sLogMsg <> 'XXXI') and
-                            (sLogMsg <> 'YYYI') and
-                            (sLogMsg <> 'ZZZI') then
-
-                         writeln('offen : ' + sLogMsg + ' (' + aInst + ')');
-                       end;
-                     end;
-
-              else;
-            end;
-
-            if OpMode <> omUnknown then
-            begin
-              sInstruction := format('%20s', [aInst]);
-
-              for il_Op1 := 0 to OItem1.Values.Count - 1 do
-              begin
-                for il_Op2 := 0 to OItem2.Values.Count - 1 do
-                begin
-                  for il_Op3 := 0 to OItem3.Values.Count - 1 do
-                  begin
-                    for il_Op4 := 0 to OItem4.Values.Count - 1 do
-                    begin
-                      sRegCombi := '';
-
-                      if OItem1.OpActive then
-                      begin
-                        if sRegCombi <> '' then sRegCombi := sRegCombi + ', ';
-                        sRegCombi := sRegCombi + OItem1.Values[il_Op1];
-                      end;
-
-                      if OItem2.OpActive then
-                      begin
-                        if sRegCombi <> '' then sRegCombi := sRegCombi + ', ';
-                        sRegCombi := sRegCombi + OItem2.Values[il_Op2];
-                      end;
-
-                      if OItem3.OpActive then
-                      begin
-                        if sRegCombi <> '' then sRegCombi := sRegCombi + ', ';
-                        sRegCombi := sRegCombi + OItem3.Values[il_Op3];
-                      end;
-
-                      if OItem4.OpActive then
-                      begin
-                        if sRegCombi <> '' then sRegCombi := sRegCombi + ', ';
-                        sRegCombi := sRegCombi + OItem4.Values[il_Op4];
-                      end;
-
-                      if sRegCombi <> '' then
-                      begin
-                        case iOpNumMRef of
-                            1: sMRef := OItem1.Values[il_Op1];
-                            2: sMRef := OItem2.Values[il_Op2];
-                            3: sMRef := OItem3.Values[il_Op3];
-                            4: sMRef := OItem1.Values[il_Op4];
-                          else sMRef := '';
-                        end;
-
-                        if ParseBaseIndexReg(sMRef, sBaseReg, sIndexReg) then
-                        begin
-                          result.Add(format('%20s %s',               ['    pop', sBaseReg]));
-                          result.Add(format('%20s %s',               ['   push', sBaseReg]));
-
-                          if trim(sIndexReg) <> '' then
-                           result.Add(format('%20s%6s, %s',          ['   xor', sIndexReg, sIndexReg]));
-
-                          if OpMode in [omMXI, omMYI, omMZI] then
-                          begin
-                            case Fx64 of
-                              true: begin
-                                      result.Add(format('%20s %6s', ['push', 'RDI']));
-                                      result.Add(format('%20s %6s', ['push', 'RCX']));
-                                      result.Add(format('%20s %6s', ['push', 'RAX']));
-
-                                      result.Add(format('%20s %6s', ['push', sBaseReg]));
-                                      result.Add(format('%20s %6s', ['pop',  'RDI']));
-                                      result.Add(format('%20s %6s', ['mov',  'RCX, sizeof(DataBlock)']));
-                                      result.Add(format('%20s %6s, %s', ['xor',  'RAX', 'RAX']));
-                                      result.Add(format('%20s ',    ['rep stosb']));
-                                      result.Add(format('%20s %6s', ['pop',  'RAX']));
-                                      result.Add(format('%20s %6s', ['pop',  'RCX']));
-                                      result.Add(format('%20s %6s', ['pop',  'RDI']));
-                                    end;
-                               else begin
-                                      result.Add(format('%20s %6s', ['push', 'EDI']));
-                                      result.Add(format('%20s %6s', ['push', 'ECX']));
-                                      result.Add(format('%20s %6s', ['push', 'EAX']));
-
-                                      result.Add(format('%20s %6s', ['push', sBaseReg]));
-                                      result.Add(format('%20s %6s', ['pop',  'EDI']));
-                                      result.Add(format('%20s %6s', ['mov',  'ECX, sizeof(DataBlock)']));
-                                      result.Add(format('%20s %6s, %s', ['xor',  'EAX', 'EAX']));
-                                      result.Add(format('%20s ',    ['rep stosb']));
-                                      result.Add(format('%20s %6s', ['pop',  'EAX']));
-                                      result.Add(format('%20s %6s', ['pop',  'ECX']));
-                                      result.Add(format('%20s %6s', ['pop',  'EDI']));
-                                    end;
-                            end;
-                          end;
-
-                        end;
-
-
-                        //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
-                        result.Add(format('%-20s %6s', [sInstruction, sRegCombi]));
-
-                        inc(iAsmCounter);
-                        case OpMode of
-                            omKXM,
-                            omKYM,
-                            omKZM: begin
-                                     result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
-                                     result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
-                                   end;
-                          omKXB32,
-                          omKXB64,
-                          omKYB32,
-                          omKYB64,
-                          omKZB32,
-                          omKZB64: begin
-                                     sMREF := OItem3.Values[il_Op3];
-                                     //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
-                                     // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
-                                     // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
-
-                                     result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'K2', OItem2.Values[il_Op2], sMREF]));
-                                     result.Add(format('%20s %6s,%6s, %s',         ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
-                                   end;
-                            omKMI: begin
-                                     result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
-                                     result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
-                                   end;
-                            omKB32I,
-                            omKB64I:
-                                   begin
-                                     result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
-                                     result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
-                                   end;
-
-                             omMX: begin
-                                     result.Add(format('%20s %6s + $2000, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2]]));
-                                     result.Add(format('%20s %6s, %s',         ['vmovdqu', 'xmm0', OItem1.Values[il_Op1]]));
-                                     result.Add(format('%20s %6s, %s + $2000', ['vmovdqu', 'xmm1', OItem1.Values[il_Op1]]));
-
-                                     result.Add(format('%20s %6s, %6s, %s',    ['vpcmpeqw', 'K2', 'XMM0', 'XMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-
-                            omMXI: begin
-                                     result.Add(format('%20s %6s + $2000, %6s, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
-                                     result.Add(format('%20s %6s, %s',              ['vmovdqu', 'xmm0', OItem1.Values[il_Op1]]));
-                                     result.Add(format('%20s %6s, %s + $2000',      ['vmovdqu', 'xmm1', OItem1.Values[il_Op1]]));
-
-                                     result.Add(format('%20s %6s, %6s, %s',         ['vpcmpeqw', 'K2', 'XMM0', 'XMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-
-                             omMY: begin
-                                     result.Add(format('%20s %6s + $2000, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2]]));
-                                     result.Add(format('%20s %6s, %s',         ['vmovdqu', 'ymm0', OItem1.Values[il_Op1]]));
-                                     result.Add(format('%20s %6s, %s + $2000', ['vmovdqu', 'ymm1', OItem1.Values[il_Op1]]));
-
-                                     result.Add(format('%20s %6s, %6s, %s',    ['vpcmpeqd', 'K2', 'YMM0', 'YMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-                            omMYI: begin
-                                     result.Add(format('%20s %6s + $2000, %6s, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
-                                     result.Add(format('%20s %6s, %s',              ['vmovdqu', 'ymm0', OItem1.Values[il_Op1]]));
-                                     result.Add(format('%20s %6s, %s + $2000',      ['vmovdqu', 'ymm1', OItem1.Values[il_Op1]]));
-
-                                     result.Add(format('%20s %6s, %6s, %s',         ['vpcmpeqd', 'K2', 'YMM0', 'YMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-
-                            omMZ: begin
-                                    result.Add(format('%20s %6s + $2000, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2]]));
-                                    result.Add(format('%20s %6s, %s',         ['vmovdqu', 'zmm0', OItem1.Values[il_Op1]]));
-                                    result.Add(format('%20s %6s, %s + $2000', ['vmovdqu', 'zmm1', OItem1.Values[il_Op1]]));
-
-                                    result.Add(format('%20s %6s, %6s, %s',    ['vpcmpeqq', 'K2', 'ZMM0', 'ZMM1']));
-
-                                    result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                  end;
-
-                            omMZI: begin
-                                     result.Add(format('%20s %6s + $2000, %6s, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
-                                     result.Add(format('%20s %6s, %s',              ['vmovdqu', 'zmm0', OItem1.Values[il_Op1]]));
-                                     result.Add(format('%20s %6s, %s + $2000',      ['vmovdqu', 'zmm1', OItem1.Values[il_Op1]]));
-
-                                     result.Add(format('%20s %6s, %6s, %s',         ['vpcmpeqq', 'K2', 'ZMM0', 'ZMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-
-                           omXB32,
-                           omXB64: begin
-                                     sMREF := OItem2.Values[il_Op2];
-                                     result.Add(format('%20s%6s,%6s + $2000', [aInst, 'XMM1', sMREF]));
-                                     result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-
-
-                          omXB32I,
-                          omXB64I: begin
-                                     sMREF := OItem2.Values[il_Op2];
-                                     //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
-                                     // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
-                                     // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
-
-                                     result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
-                                     result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-
-                             omXM: begin
-                                     result.Add(format('%20s %6s, %s + $2000', [aInst, 'XMM1', 'XMM1', OItem3.Values[il_Op3] ]));
-                                     result.Add(format('%20s %6s, %s',         ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-                            omXXM: begin
-
-                                     result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'XMM1', 'XMM1', OItem3.Values[il_Op3] ]));
-                                     result.Add(format('%20s %6s,%6s, %s',         ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-                          omXXB32,
-                          omXXB64: begin
-                                     sMREF := OItem3.Values[il_Op3];
-                                     //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
-                                     // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
-                                     // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
-
-                                     result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'XMM1', 'XMM1', sMREF]));
-                                     result.Add(format('%20s %6s,%6s, %s',         ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-                            omXMI: begin
-                                     result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
-                                     result.Add(format('%20s %6s,%6s, %s',       ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-
-                            omYB32,
-                            omYB64: begin
-                                      sMREF := OItem2.Values[il_Op2];
-                                      result.Add(format('%20s%6s,%6s + $2000', [aInst, 'YMM1', sMREF]));
-                                      result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
-
-                                      result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                    end;
-                            omYB32I,
-                            omYB64I:
-                                   begin
-                                     sMREF := OItem2.Values[il_Op2];
-                                     //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
-                                     // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
-                                     // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
-
-                                     //result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
-                                     //result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', sMREF, OItem3.Values[il_Op3]]));
-                                     //
-                                     //result.Add(format('%20s%6s,%6s, %s, 01',   ['vinserti32x4', 'YMM1', 'YMM1', 'XMM2']));
-                                     //result.Add(format('%20s%6s,%6s, %s',       ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'YMM1']));
-                                     //result.Add(format('%20s%6s,%6s, %s',       ['kandq', 'K1', 'K1', 'K2']));
-                                     //result.Add('');
-                                     result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'YMM1', sMREF, OItem3.Values[il_Op3]]));
-                                     result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-                             omYM: begin
-                                     result.Add(format('%20s %6s, %s + $2000', [aInst, 'YMM1', 'YMM1', OItem3.Values[il_Op3] ]));
-                                     result.Add(format('%20s %6s, %s',         ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-
-                            omYYM: begin
-                                     //result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', OItem3.Values[il_Op3]]));
-                                     //result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', OItem3.Values[il_Op3]]));
-                                     //
-                                     //result.Add(format('%20s%6s,%6s, %s, 01',   ['vinserti32x4', 'YMM1', 'YMM1', 'XMM2']));
-                                     //result.Add(format('%20s%6s,%6s, %s',       ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'YMM1']));
-                                     //result.Add(format('%20s%6s,%6s, %s',       ['kandq', 'K1', 'K1', 'K2']));
-                                     //result.Add('');
-
-                                     result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'YMM1', 'YMM1', OItem3.Values[il_Op3] ]));
-                                     result.Add(format('%20s %6s,%6s, %s',         ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-                          omYYB32,
-                          omYYB64: begin
-                                     sMREF := OItem3.Values[il_Op3];
-                                     //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
-                                     // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
-                                     // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
-
-                                     //result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', sMREF]));
-                                     //result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', sMREF]));
-                                     //
-                                     //result.Add(format('%20s%6s,%6s, %s, 01',   ['vinserti32x4', 'YMM1', 'YMM1', 'XMM2']));
-                                     //result.Add(format('%20s%6s,%6s, %s',       ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'YMM1']));
-                                     //result.Add(format('%20s%6s,%6s, %s',       ['kandq', 'K1', 'K1', 'K2']));
-                                     //result.Add('');
-                                     result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'YMM1', 'YMM1', sMREF]));
-                                     result.Add(format('%20s %6s,%6s, %s',         ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-
-                                   end;
-                            omYMI: begin
-                                     //result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
-                                     //result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
-                                     //
-                                     //result.Add(format('%20s%6s,%6s, %s, 01',   ['vinserti32x4', 'YMM1', 'YMM1', 'XMM2']));
-                                     //result.Add(format('%20s%6s,%6s, %s',       ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'YMM1']));
-                                     //result.Add(format('%20s%6s,%6s, %s',       ['kandq', 'K1', 'K1', 'K2']));
-                                     //result.Add('');
-                                     result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'YMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
-                                     result.Add(format('%20s %6s,%6s, %s',       ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-
-                            omZB32,
-                            omZB64: begin
-                                      sMREF := OItem2.Values[il_Op2];
-                                      result.Add(format('%20s%6s,%6s + $2000', [aInst, 'ZMM1', sMREF]));
-                                      result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
-
-                                      result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                    end;
-                            omZB32I,
-                            omZB64I:
-                                    begin
-                                      sMREF := OItem2.Values[il_Op2];
-                                       //if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to2}', [])
-                                       // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to4}', []);
-
-                                       //result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
-                                       //result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', sMREF, OItem3.Values[il_Op3]]));
-                                       //result.Add(format('%20s%6s,%6s + $20, %s', [aInst, 'XMM3', sMREF, OItem3.Values[il_Op3]]));
-                                       //
-                                       //result.Add(format('%20s%6s,%6s, %s, 01',   ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM2']));
-                                       //result.Add(format('%20s%6s,%6s, %s, 02',   ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM3']));
-                                       //result.Add(format('%20s%6s,%6s, %s, 03',   ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM4']));
-                                       //
-                                       //result.Add(format('%20s%6s,%6s, %s',       ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
-                                       //result.Add(format('%20s%6s,%6s, %s',       ['kandq', 'K1', 'K1', 'K2']));
-                                       //result.Add('');
-
-                                       result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'ZMM1', sMREF, OItem3.Values[il_Op3]]));
-                                       result.Add(format('%20s %6s,%6s, %s',         ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
-
-                                       result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-
-                                     end;
-                             omZM: begin
-                                     result.Add(format('%20s %6s, %s + $2000', [aInst, 'ZMM1', 'ZMM1', OItem3.Values[il_Op3] ]));
-                                     result.Add(format('%20s %6s, %s',         ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-                            omZZM: begin
-                                     //result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', OItem3.Values[il_Op3]]));
-                                     //result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', OItem3.Values[il_Op3]]));
-                                     //result.Add(format('%20s%6s,%6s, %s + $20', [aInst, 'XMM3', 'XMM3', OItem3.Values[il_Op3]]));
-                                     //result.Add(format('%20s%6s,%6s, %s + $30', [aInst, 'XMM4', 'XMM4', OItem3.Values[il_Op3]]));
-                                     //
-                                     //result.Add(format('%20s%6s,%6s, %s, 01',   ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM2']));
-                                     //result.Add(format('%20s%6s,%6s, %s, 02',   ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM3']));
-                                     //result.Add(format('%20s%6s,%6s, %s, 03',   ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM4']));
-                                     //
-                                     //result.Add(format('%20s%6s,%6s, %s',       ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
-                                     //result.Add(format('%20s%6s,%6s, %s',       ['kandq', 'K1', 'K1', 'K2']));
-                                     //result.Add('');
-
-                                     result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'ZMM1', 'ZMM1', OItem3.Values[il_Op3] ]));
-                                     result.Add(format('%20s %6s,%6s, %s',         ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-                          omZZB32,
-                          omZZB64: begin
-                                     sMREF := OItem3.Values[il_Op3];
-                                     //if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to2}', [])
-                                     // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to4}', []);
-
-                                     //result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', sMREF]));
-                                     //result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', sMREF]));
-                                     //result.Add(format('%20s%6s,%6s, %s + $20', [aInst, 'XMM3', 'XMM3', sMREF]));
-                                     //result.Add(format('%20s%6s,%6s, %s + $30', [aInst, 'XMM4', 'XMM4', sMREF]));
-                                     //
-                                     //result.Add(format('%20s%6s,%6s, %s, 01',   ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM2']));
-                                     //result.Add(format('%20s%6s,%6s, %s, 02',   ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM3']));
-                                     //result.Add(format('%20s%6s,%6s, %s, 03',   ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM4']));
-                                     //
-                                     //result.Add(format('%20s%6s,%6s, %s',       ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
-                                     //result.Add(format('%20s%6s,%6s, %s',       ['kandq', 'K1', 'K1', 'K2']));
-                                     //result.Add('');
-
-                                     result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'ZMM1', 'ZMM1', sMREF]));
-                                     result.Add(format('%20s %6s,%6s, %s',         ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-
-                                   end;
-                            omZMI: begin
-                                     //result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
-                                     //result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
-                                     //result.Add(format('%20s%6s,%6s + $20, %s', [aInst, 'XMM3', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
-                                     //result.Add(format('%20s%6s,%6s + $30, %s', [aInst, 'XMM4', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
-                                     //
-                                     //result.Add(format('%20s%6s,%6s, %s, 01',   ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM2']));
-                                     //result.Add(format('%20s%6s,%6s, %s, 02',   ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM3']));
-                                     //result.Add(format('%20s%6s,%6s, %s, 03',   ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM4']));
-                                     //
-                                     //result.Add(format('%20s%6s,%6s, %s',       ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
-                                     //result.Add(format('%20s%6s,%6s, %s',       ['kandq', 'K1', 'K1', 'K2']));
-                                     //result.Add('');
-                                     result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'ZMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
-                                     result.Add(format('%20s %6s,%6s, %s',       ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-
-                            omKXB32I,
-                            omKXB64I:
-                                   begin
-                                     result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]]));
-                                     result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
-                                   end;
-                             omKXMI:
-                                   begin
-                                     result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]]));
-                                     result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
-                                   end;
-                           omKYB32I,
-                           omKYB64I:
-                                 begin
-                                   result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]]));
-                                   result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
-
-                                   result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
-                                 end;
-                             omKYMI:
-                                 begin
-                                   result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]]));
-                                   result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
-
-                                   result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
-                                 end;
-
-                            omXXB32I,
-                            omXXB64I:
-                                   begin
-                                     sMREF := OItem3.Values[il_Op3];
-
-                                     result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], sMREF, OItem4.Values[il_Op4]]));
-                                     result.Add(format('%20s %6s, %6s, %6s, %s',         ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-                             omXXMI:
-                                   begin
-                                     sMREF := OItem3.Values[il_Op3];
-
-                                     result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], sMREF, OItem4.Values[il_Op4]]));
-                                     result.Add(format('%20s %6s, %6s, %6s, %s',         ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-                             omYYB32I,
-                             omYYB64I,
-                               omYYMI:
-                                   begin
-                                     sMREF := OItem3.Values[il_Op3];
-
-                                     result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'YMM1', OItem2.Values[il_Op2], sMREF, OItem4.Values[il_Op4]]));
-                                     result.Add(format('%20s %6s, %6s, %6s, %s',         ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
-
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                   end;
-                            omKZB32I,
-                            omKZB64I,
-                              omKZMI:
-                                  begin
-                                    result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]]));
-                                    result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
-
-                                    result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
-                                  end;
-                            //omKZMI:
-                            //      begin
-                            //        sMREF := OItem3.Values[il_Op3];
-                            //
-                            //        result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'ZMM1', OItem2.Values[il_Op2], sMREF, OItem4.Values[il_Op4]]));
-                            //        result.Add(format('%20s %6s, %6s, %6s, %s',         ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
-                            //
-                            //        result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                            //      end;
-
-                            omZZB32I,
-                            omZZB64I,
-                              omZZMI:
-                                  begin
-                                    sMREF := OItem3.Values[il_Op3];
-
-                                    result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'ZMM1', OItem2.Values[il_Op2], sMREF, OItem4.Values[il_Op4]]));
-                                    result.Add(format('%20s %6s, %6s, %6s, %s',         ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
-
-                                    result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
-                                  end;
-                             else begin
-                                    sLogMsg := '';
-                                    sLogMsg := MapOperand(OItem1.Optyp) + MapOperand(OItem2.Optyp) + MapOperand(OItem3.Optyp);
-                                    writeln('offen - : ' + sLogMsg + ' (' + aInst + ')');
-                                  end;
-                        end;
-
-                        sRegCombi := '';
-                      end;
-                    end;
-                  end;
-                end;
-              end;
-            end;
-
-
-
-            //sl_Inst := format('%-20s', [aInst]);
-            //
-            //for il_Op1 := 0 to OItem1.Values.Count - 1 do
-            //begin
-            //  if OItem1.OpActive then
-            //  begin
-            //    sl_RegCombi1 := OItem1.Values[il_Op1];
-            //  end
-            //  else sl_RegCombi1 := '';
-            //
-            //  for il_Op2 := 0 to OItem2.Values.Count - 1 do
-            //  begin
-            //    if OItem2.OpActive then
-            //    begin
-            //      sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2];
-            //    end
-            //    else sl_RegCombi2 := sl_RegCombi1;
-            //
-            //    for il_Op3 := 0 to OItem3.Values.Count - 1 do
-            //    begin
-            //      if OItem3.OpActive then
-            //      begin
-            //        sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3];
-            //      end
-            //      else sl_RegCombi3 := sl_RegCombi2;
-            //
-            //      for il_Op4 := 0 to OItem4.Values.Count - 1 do
-            //      begin
-            //        if OItem4.OpActive then
-            //        begin
-            //          sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4];
-            //        end
-            //        else sl_RegCombi := sl_RegCombi3;
-            //
-            //        if (sl_RegCombi <> '') and
-            //           (
-            //            (OItem1.OpActive and (OItem1.OpTyp in OTMEMTYPES)) or
-            //            (OItem2.OpActive and (OItem2.OpTyp in OTMEMTYPES)) or
-            //            (OItem3.OpActive and (OItem3.OpTyp in OTMEMTYPES)) or
-            //            (OItem4.OpActive and (OItem4.OpTyp in OTMEMTYPES))
-            //           ) then
-            //        begin
-            //          //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
-            //          result.Add(sl_Inst + sl_RegCombi);
-            //
-            //
-            //
-            //          sl_RegCombi := '';
-            //        end;
-            //      end;
-            //    end;
-            //  end;
-            //end;
-          end;
-        finally
-          FreeAndNil(OItem4);
-        end;
-      finally
-        FreeAndNil(OItem3);
-      end;
-    finally
-      FreeAndNil(OItem2);
-    end;
-  finally
-    FreeAndNil(OItem1);
-  end;
-end;
-
-
-constructor TAsmTestGenerator.Create;
-begin
-  inherited;
-
-  FX64 := true;
-  FAVX512 := false;
-
-  FReg8          := TStringList.Create;
-  FReg16         := TStringList.Create;
-
-  FReg32Base     := TStringList.Create;
-  FReg32Index    := TStringList.Create;
-  FReg64Base     := TStringList.Create;
-  FReg64Index    := TStringList.Create;
-  FReg6432Base   := TStringList.Create;
-  FReg6432Index  := TStringList.Create;
-  FReg32XMMIndex := TStringList.Create;
-  FReg32YMMIndex := TStringList.Create;
-  FReg32ZMMIndex := TStringList.Create;
-  FReg64XMMIndex := TStringList.Create;
-  FReg64YMMIndex := TStringList.Create;
-  FReg64ZMMIndex := TStringList.Create;
-  FRegKREG       := TStringList.Create;
-
-  FReg8.Add('AL');
-  FReg8.Add('BL');
-  FReg8.Add('CL');
-  FReg8.Add('DL');
-
-  
-  FReg16.Add('AX');
-  FReg16.Add('BX');
-  FReg16.Add('CX');
-  FReg16.Add('DX');
-
-
-  FReg32Base.Add('EAX');
-  FReg32Base.Add('EBX');
-  FReg32Base.Add('ECX');
-  FReg32Base.Add('EDX');
-  //FReg32Base.Add('ESP');
-  //FReg32Base.Add('EBP');
-  FReg32Base.Add('EDI');
-  FReg32Base.Add('ESI');
-
-
-  FReg32Index.Add('EAX');
-  FReg32Index.Add('EBX');
-  FReg32Index.Add('ECX');
-  FReg32Index.Add('EDX');
-  //FReg32Index.Add('EBP');
-  FReg32Index.Add('EDI');
-  FReg32Index.Add('ESI');
-
-
-  FReg64Base.Add('RAX');
-  FReg64Base.Add('RBX');
-  FReg64Base.Add('RCX');
-  FReg64Base.Add('RDX');
-  //FReg64Base.Add('RSP');
-  //FReg64Base.Add('RBP');
-  FReg64Base.Add('RDI');
-  FReg64Base.Add('RSI');
-  FReg64Base.Add('R8');
-  FReg64Base.Add('R9');
-  FReg64Base.Add('R10');
-  FReg64Base.Add('R11');
-  FReg64Base.Add('R12');
-  FReg64Base.Add('R13');
-  FReg64Base.Add('R14');
-  FReg64Base.Add('R15');
-
-  FReg64Index.Add('RAX');
-  FReg64Index.Add('RBX');
-  FReg64Index.Add('RCX');
-  FReg64Index.Add('RDX');
-  //FReg64Index.Add('RBP');
-  FReg64Index.Add('RDI');
-  FReg64Index.Add('RSI');
-  FReg64Index.Add('R8');
-  FReg64Index.Add('R9');
-  FReg64Index.Add('R10');
-  FReg64Index.Add('R11');
-  FReg64Index.Add('R12');
-  FReg64Index.Add('R13');
-  FReg64Index.Add('R14');
-  FReg64Index.Add('R15');
-
-  FReg6432Base.Add('EAX');
-  FReg6432Base.Add('EBX');
-  FReg6432Base.Add('ECX');
-  FReg6432Base.Add('EDX');
-  FReg6432Base.Add('ESP');
-  //FReg6432Base.Add('EBP');
-  FReg6432Base.Add('EDI');
-  FReg6432Base.Add('ESI');
-  FReg6432Base.Add('R8D');
-  FReg6432Base.Add('R9D');
-  FReg6432Base.Add('R10D');
-  FReg6432Base.Add('R11D');
-  FReg6432Base.Add('R12D');
-  FReg6432Base.Add('R13D');
-  FReg6432Base.Add('R14D');
-  FReg6432Base.Add('R15D');
-
-  FReg6432Index.Add('EAX');
-  FReg6432Index.Add('EBX');
-  FReg6432Index.Add('ECX');
-  FReg6432Index.Add('EDX');
-  //FReg6432Index.Add('EBP');
-  FReg6432Index.Add('EDI');
-  FReg6432Index.Add('ESI');
-  FReg6432Index.Add('R8D');
-  FReg6432Index.Add('R9D');
-  FReg6432Index.Add('R10D');
-  FReg6432Index.Add('R11D');
-  FReg6432Index.Add('R12D');
-  FReg6432Index.Add('R13D');
-  FReg6432Index.Add('R14D');
-  FReg6432Index.Add('R15D');
-
-  FReg32XMMIndex.ADD('XMM0');
-  FReg32XMMIndex.ADD('XMM1');
-  FReg32XMMIndex.ADD('XMM2');
-  FReg32XMMIndex.ADD('XMM3');
-  FReg32XMMIndex.ADD('XMM4');
-  FReg32XMMIndex.ADD('XMM5');
-  FReg32XMMIndex.ADD('XMM6');
-  FReg32XMMIndex.ADD('XMM7');
-
-  FReg32YMMIndex.ADD('YMM0');
-  FReg32YMMIndex.ADD('YMM1');
-  FReg32YMMIndex.ADD('YMM2');
-  FReg32YMMIndex.ADD('YMM3');
-  FReg32YMMIndex.ADD('YMM4');
-  FReg32YMMIndex.ADD('YMM5');
-  FReg32YMMIndex.ADD('YMM6');
-  FReg32YMMIndex.ADD('YMM7');
-
-  FReg32ZMMIndex.ADD('ZMM0');
-  FReg32ZMMIndex.ADD('ZMM1');
-  FReg32ZMMIndex.ADD('ZMM2');
-  FReg32ZMMIndex.ADD('ZMM3');
-  FReg32ZMMIndex.ADD('ZMM4');
-  FReg32ZMMIndex.ADD('ZMM5');
-  FReg32ZMMIndex.ADD('ZMM6');
-  FReg32ZMMIndex.ADD('ZMM7');
-
-
-  FReg64XMMIndex.ADD('XMM0');
-  FReg64XMMIndex.ADD('XMM1');
-  FReg64XMMIndex.ADD('XMM2');
-  FReg64XMMIndex.ADD('XMM3');
-  FReg64XMMIndex.ADD('XMM4');
-  FReg64XMMIndex.ADD('XMM5');
-  FReg64XMMIndex.ADD('XMM6');
-  FReg64XMMIndex.ADD('XMM7');
-  FReg64XMMIndex.ADD('XMM8');
-  FReg64XMMIndex.ADD('XMM9');
-  FReg64XMMIndex.ADD('XMM10');
-  FReg64XMMIndex.ADD('XMM11');
-  FReg64XMMIndex.ADD('XMM12');
-  FReg64XMMIndex.ADD('XMM13');
-  FReg64XMMIndex.ADD('XMM14');
-  FReg64XMMIndex.ADD('XMM15');
-
-
-  FReg64YMMIndex.ADD('YMM0');
-  FReg64YMMIndex.ADD('YMM1');
-  FReg64YMMIndex.ADD('YMM2');
-  FReg64YMMIndex.ADD('YMM3');
-  FReg64YMMIndex.ADD('YMM4');
-  FReg64YMMIndex.ADD('YMM5');
-  FReg64YMMIndex.ADD('YMM6');
-  FReg64YMMIndex.ADD('YMM7');
-  FReg64YMMIndex.ADD('YMM8');
-  FReg64YMMIndex.ADD('YMM9');
-  FReg64YMMIndex.ADD('YMM10');
-  FReg64YMMIndex.ADD('YMM11');
-  FReg64YMMIndex.ADD('YMM12');
-  FReg64YMMIndex.ADD('YMM13');
-  FReg64YMMIndex.ADD('YMM14');
-  FReg64YMMIndex.ADD('YMM15');
-
-  FReg64ZMMIndex.ADD('ZMM0');
-  FReg64ZMMIndex.ADD('ZMM1');
-  FReg64ZMMIndex.ADD('ZMM2');
-  FReg64ZMMIndex.ADD('ZMM3');
-  FReg64ZMMIndex.ADD('ZMM4');
-  FReg64ZMMIndex.ADD('ZMM5');
-  FReg64ZMMIndex.ADD('ZMM6');
-  FReg64ZMMIndex.ADD('ZMM7');
-  FReg64ZMMIndex.ADD('ZMM8');
-  FReg64ZMMIndex.ADD('ZMM9');
-  FReg64ZMMIndex.ADD('ZMM10');
-  FReg64ZMMIndex.ADD('ZMM11');
-  FReg64ZMMIndex.ADD('ZMM12');
-  FReg64ZMMIndex.ADD('ZMM13');
-  FReg64ZMMIndex.ADD('ZMM14');
-  FReg64ZMMIndex.ADD('ZMM15');
-  FReg64ZMMIndex.ADD('ZMM16');
-  FReg64ZMMIndex.ADD('ZMM17');
-  FReg64ZMMIndex.ADD('ZMM18');
-  FReg64ZMMIndex.ADD('ZMM19');
-  FReg64ZMMIndex.ADD('ZMM20');
-  FReg64ZMMIndex.ADD('ZMM21');
-  FReg64ZMMIndex.ADD('ZMM22');
-  FReg64ZMMIndex.ADD('ZMM23');
-  FReg64ZMMIndex.ADD('ZMM24');
-  FReg64ZMMIndex.ADD('ZMM25');
-  FReg64ZMMIndex.ADD('ZMM26');
-  FReg64ZMMIndex.ADD('ZMM27');
-  FReg64ZMMIndex.ADD('ZMM28');
-  FReg64ZMMIndex.ADD('ZMM29');
-  FReg64ZMMIndex.ADD('ZMM30');
-  FReg64ZMMIndex.ADD('ZMM31');
-
-  FRegKREG.ADD('K0');
-  FRegKREG.ADD('K1');
-  FRegKREG.ADD('K2');
-  FRegKREG.ADD('K3');
-  FRegKREG.ADD('K4');
-  FRegKREG.ADD('K5');
-  FRegKREG.ADD('K6');
-  FRegKREG.ADD('K7');
-
-end;
-
-destructor TAsmTestGenerator.Destroy;
-begin
-  FreeAndNil(FReg8);
-  FreeAndNil(FReg16);
-
-  FreeAndNil(FReg32Base);
-  FreeAndNil(FReg32Index);
-  FreeAndNil(FReg64Base);
-  FreeAndNil(FReg64Index);
-  FreeAndNil(FReg6432Base);
-  FreeAndNil(FReg6432Index);
-
-  FreeAndNil(FReg32XMMIndex);
-  FreeAndNil(FReg32YMMIndex);
-  FreeAndNil(FReg32ZMMIndex);
-  FreeAndNil(FReg64XMMIndex);
-  FreeAndNil(FReg64YMMIndex);
-  FreeAndNil(FReg64ZMMIndex);
-
-  FreeAndnil(FRegKREG);
-
-  inherited;
-end;
-
-procedure TAsmTestGenerator.MemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg,
-  aSLIndexReg, aRList: TStringList);
-var
-  il_Base: integer;
-  il_Index: integer;
-begin
-
-  for il_Base := 0 to aSLBaseReg.Count - 1 do
-  begin
-    aRList.Add(format(aPrefix + '[%s]%s', [aSLBaseReg[il_Base], aSuffix]));
-
-    for il_Index := 0 to aSLIndexReg.Count - 1 do
-    begin
-      aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
-      aRList.Add(format(aPrefix + '[%s + %s + $10]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
-      aRList.Add(format(aPrefix + '[%s + %s + $40]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
-      aRList.Add(format(aPrefix + '[%s + %s - $10]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
-      aRList.Add(format(aPrefix + '[%s + %s - $40]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
-
-
-      aRList.Add(format(aPrefix + '[%s + %s * 2]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
-      aRList.Add(format(aPrefix + '[%s + %s * 4]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
-      aRList.Add(format(aPrefix + '[%s + %s * 8]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
-
-      aRList.Add(format(aPrefix + '[%s + %s * 2 + 16]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
-      aRList.Add(format(aPrefix + '[%s + %s * 4 + 32]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
-      aRList.Add(format(aPrefix + '[%s + %s * 8 + 64]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
-    end;
-  end;
-end;
-
-procedure TAsmTestGenerator.MemRegBaseIndexCombiCDISP8N(const aPrefix,
-  aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
-var
-  iBase: integer;
-  iIndex: integer;
-  iOffset: integer;
-begin
-
-  for iBase := 0 to aSLBaseReg.Count - 1 do
-  begin
-    for iOffset := 0 to 63 do
-    begin
-      aRList.Add(format(aPrefix + '[%s +%2d]', [aSLBaseReg[iBase], iOffset]));
-
-      for iIndex := 0 to aSLIndexReg.Count - 1 do
-      begin
-        if aSLBaseReg[iBase] <> aSLIndexReg[iIndex] then
-        begin
-          aRList.Add(format(aPrefix + '[%s + %s + %2d]', [aSLBaseReg[iBase], aSLIndexReg[iIndex], iOffset]));
-          aRList.Add(format(aPrefix + '[%s + %s * 2 + %2d]', [aSLBaseReg[iBase], aSLIndexReg[iIndex], iOffset]));
-          aRList.Add(format(aPrefix + '[%s + %s * 4 + %2d]', [aSLBaseReg[iBase], aSLIndexReg[iIndex], iOffset]));
-          aRList.Add(format(aPrefix + '[%s + %s * 8 + %2d]', [aSLBaseReg[iBase], aSLIndexReg[iIndex], iOffset]));
-        end;
-      end;
-    end;
-  end;
-end;
-
-procedure TAsmTestGenerator.VectorMemRegBaseIndexCombi(const aPrefix, aSuffix: String;
-  aSLBaseReg, aSLIndexReg, aRList: TStringList);
-var
-  il_Base: integer;
-  il_Index: integer;
-begin
-
-  //for il_Index := 0 to aSLIndexReg.Count - 1 do
-  //begin
-  //  aRList.Add(format(aPrefix + '[%s]', [aSLIndexReg[il_Index]]));
-  //
-  //  aRList.Add(format(aPrefix + '[%s * 2]', [aSLIndexReg[il_Index]]));
-  //  aRList.Add(format(aPrefix + '[%s * 4]', [aSLIndexReg[il_Index]]));
-  //  aRList.Add(format(aPrefix + '[%s * 8]', [aSLIndexReg[il_Index]]));
-  //
-  //  aRList.Add(format(aPrefix + '[%s * 2 + 16]', [aSLIndexReg[il_Index]]));
-  //  aRList.Add(format(aPrefix + '[%s * 4 + 32]', [aSLIndexReg[il_Index]]));
-  //  aRList.Add(format(aPrefix + '[%s * 8 + 48]', [aSLIndexReg[il_Index]]));
-  //end;
-
-
-  for il_Base := 0 to aSLBaseReg.Count - 1 do
-  begin
-    //aRList.Add(format(aPrefix + '[%s]', [aSLBaseReg[il_Base]]));
-
-    for il_Index := 0 to aSLIndexReg.Count - 1 do
-    begin
-      aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
-
-      aRList.Add(format(aPrefix + '[%s + %s * 2]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
-      aRList.Add(format(aPrefix + '[%s + %s * 4]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
-      aRList.Add(format(aPrefix + '[%s + %s * 8]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
-
-      //aRList.Add(format(aPrefix + '[%s + %s * 2 + 16]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
-      //aRList.Add(format(aPrefix + '[%s + %s * 4 + 32]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
-      //aRList.Add(format(aPrefix + '[%s + %s * 8 + 48]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
-
-
-      aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLIndexReg[il_Index], aSLBaseReg[il_Base], aSuffix]));
-
-      //aRList.Add(format(aPrefix + '[%s + %s + 16]', [aSLIndexReg[il_Index], aSLBaseReg[il_Base]]));
-    end;
-  end;
-end;
-
-function TAsmTestGenerator.ParseBaseIndexReg(const aOp: string; var aBaseReg,
-  aIndexReg: string): boolean;
-var
-  iStartPos: integer;
-  iEndPos: integer;
-  iPos: integer;
-  sOp: string;
-  sBaseReg: string;
-  sIndexReg: string;
-begin
-  result := false;
-
-  aBaseReg  := '';
-  aIndexReg := '';
-
-  iStartPos := Pos('[', aOp);
-  iEndPos   := Pos(']', aOp);
-
-  if (iStartPos > 0) and
-     (iEndPos > 0) and
-     (iStartPos < iEndPos) then
-  begin
-    sOp  := trim(copy(aOp, iStartPos + 1, iEndPos - iStartPos - 1));
-
-    with TStringList.Create do
-    try
-      CommaText := StringReplace(sOp, '+', ',', [rfReplaceAll]);
-
-      while Count < 2 do Add('');
-
-      sBaseReg := trim(Strings[0]);
-
-      if (FReg32Base.IndexOf(sBasereg) >= 0) or
-         (FReg64Base.IndexOf(sBasereg) >= 0) or
-         (FReg6432Base.IndexOf(sBasereg) >= 0) then
-       aBaseReg := sBaseReg;
-
-      sIndexReg := trim(Strings[1]);
-
-      if (FReg32Index.IndexOf(sIndexReg) >= 0) or
-         (FReg64Index.IndexOf(sIndexReg) >= 0) or
-         (FReg6432Index.IndexOf(sIndexReg) >= 0) then
-       aIndexReg := sIndexReg;
-
-      result := trim(aBasereg) <> '';
-    finally
-      Free;
-    end;
-  end;
-end;
-
-class procedure TAsmTestGenerator.CalcTestData(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3,
-  aOp4: String; aSL: TStringList);
-var
-  sl: TStringList;
-begin
-  with TAsmTestGenerator.Create do
-  try
-    Fx64 := aX64;
-    FAVX512 := aAVX512;
-    FSAE    := aSAE;
-
-    sl := InternalCalcTestData(aInst, aOp1, aOp2, aOp3, aOp4);
-    try
-      aSL.AddStrings(sl);
-    finally
-      FreeAndNil(sl);
-    end;
-  finally
-    Free;
-  end;
-end;
-
-class procedure TAsmTestGenerator.CalcTestDataMREF(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3,
-  aOp4: String;  aSL: TStringList);
-var
-  sl: TStringList;
-begin
-  with TAsmTestGenerator.Create do
-  try
-    Fx64 := aX64;
-    FAVX512 := aAVX512;
-    FSAE    := aSAE;
-
-    sl := InternalCalcTestDataMREF(aInst, aOp1, aOp2, aOp3, aOp4);
-    try
-      aSL.AddStrings(sl);
-    finally
-      FreeAndNil(sl);
-    end;
-  finally
-    Free;
-  end;
-end;
-
-class procedure TAsmTestGenerator.CalcTestDataCDisp8(aX64, aAVX512,
-  aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
-var
-  sl: TStringList;
-begin
-  with TAsmTestGenerator.Create do
-  try
-    Fx64 := aX64;
-    FAVX512 := aAVX512;
-    FSAE    := aSAE;
-
-    sl := InternalCalcTestDataCDisp8(aInst, aOp1, aOp2, aOp3, aOp4);
-    try
-      aSL.AddStrings(sl);
-    finally
-      FreeAndNil(sl);
-    end;
-  finally
-    Free;
-  end;
-end;
-
-
-
-class procedure TAsmTestGenerator.CalcTestInstFile;
-var
-  i,j: integer;
-  sInst: string;
-  sI386: string;
-  sX8664: string;
-  sAVX512: string;
-  sOperands: string;
-
-  sLine: string;
-
-
-  sl: TStringList;
-  bVEX: boolean;
-  bEVEX: boolean;
-  b256 : boolean;
-  b512 : boolean;
-begin
-  sl := TStringList.Create;
-  try
-
-    //tinsentry=packed record
-    //  opcode  : tasmop;
-    //  ops     : byte;
-    //  //optypes : array[0..max_operands-1] of longint;
-    //  optypes : array[0..3] of int64; //TG
-    //  code    : array[0..11] of char;
-    //  flags   : tinsflags;
-    //end;
-
-    for i := 0 to length(InsTab) - 1 do
-    begin
-      bVEX := false;
-      bEVEX := false;
-      b256 := false;
-      b512 := false;
-
-      //TG TODO delete
-      if instab[i].opcode = a_vtestps then
-      begin
-        b512 := b512;
-      end;
-
-      for j := 0 to length(InsTab[i].code) - 1 do
-      begin
-        case ord(InsTab[i].code[j]) of
-            0: break;
-            1,2,3: break;
-          232: bEVEX := true;
-          233: b512 := true;
-          242: bVEX := true;
-          244: b256 := true;
-        end;
-      end;
-
-      if bVEX or bEVEX then
-      begin
-        sInst  :=  std_op2str[InsTab[i].opcode];
-        sI386  := '1';
-        sX8664 := '1';
-        if IF_X86_64 in InsTab[i].flags then
-        begin
-          sI386  := '0';
-        end;
-
-        if bEVEX then sAVX512 := '1'
-         else sAVX512 := '0';
-
-        sOperands := '';
-        for j := 0 to 3 do
-        begin
-          case InsTab[i].optypes[j] of
-               OT_XMMREG: sOperands := sOperands + 'XMMREG,';
-             OT_XMMREG_M: sOperands := sOperands + 'XMMREG_M,';
-            OT_XMMREG_MZ: sOperands := sOperands + 'XMMREG_MZ,';
-            OT_XMMREG_ER: sOperands := sOperands + 'XMMREG_ER,';
-           OT_XMMREG_SAE: sOperands := sOperands + 'XMMREG_SAE,';
-                OT_XMMRM: sOperands := sOperands + 'XMMRM,';
-             OT_XMMRM_MZ: sOperands := sOperands + 'XMMRM_MZ,';
-
-               OT_YMMREG: sOperands := sOperands + 'YMMREG,';
-             OT_YMMREG_M: sOperands := sOperands + 'YMMREG_M,';
-            OT_YMMREG_MZ: sOperands := sOperands + 'YMMREG_MZ,';
-            OT_YMMREG_ER: sOperands := sOperands + 'YMMREG_ER,';
-           OT_YMMREG_SAE: sOperands := sOperands + 'YMMREG_SAE,';
-                OT_YMMRM: sOperands := sOperands + 'YMMRM,';
-             OT_YMMRM_MZ: sOperands := sOperands + 'YMMRM_MZ,';
-
-               OT_ZMMREG: sOperands := sOperands + 'ZMMREG,';
-             OT_ZMMREG_M: sOperands := sOperands + 'ZMMREG_M,';
-            OT_ZMMREG_MZ: sOperands := sOperands + 'ZMMREG_MZ,';
-            OT_ZMMREG_ER: sOperands := sOperands + 'ZMMREG_ER,';
-           OT_ZMMREG_SAE: sOperands := sOperands + 'ZMMREG_SAE,';
-                OT_ZMMRM: sOperands := sOperands + 'ZMMRM,';
-             OT_ZMMRM_MZ: sOperands := sOperands + 'ZMMRM_MZ,';
-
-                OT_MEM32: sOperands := sOperands + 'MEM32,';
-                OT_MEM64: sOperands := sOperands + 'MEM64,';
-               OT_MEM128: sOperands := sOperands + 'MEM128,';
-               OT_MEM256: sOperands := sOperands + 'MEM256,';
-               OT_MEM512: sOperands := sOperands + 'MEM512,';
-
-                OT_REG32: sOperands := sOperands + 'REG32,';
-                OT_REG64: sOperands := sOperands + 'REG64,';
-                 ot_rm_gpr or ot_bits32:
-                          sOperands := sOperands + 'RM32,';
-                 ot_rm_gpr or ot_bits64:
-                          sOperands := sOperands + 'RM64,';
-
-               OT_XMEM32: sOperands := sOperands + 'XMEM32,';
-               OT_XMEM64: sOperands := sOperands + 'XMEM64,';
-
-               OT_YMEM32: sOperands := sOperands + 'YMEM32,';
-               OT_YMEM64: sOperands := sOperands + 'YMEM64,';
-
-                 OT_IMM8: sOperands := sOperands + 'IMM8,';
-                 OT_NONE: sOperands := sOperands + ',';
-
-               OT_BMEM32: if b512 then sOperands := sOperands + '16B32,'
-                           else if b256 then sOperands := sOperands + '8B32,'
-                           else sOperands := sOperands + '4B32,';
-               OT_BMEM64: if b512 then sOperands := sOperands + '8B32,'
-                           else if b256 then sOperands := sOperands + '4B32,'
-                           else sOperands := sOperands + '2B64,';
-
-                 OT_KREG: sOperands := sOperands + 'KREG,';
-               OT_KREG_M: sOperands := sOperands + 'KREG_M,';
-
-            else  sOperands := sOperands;
-          end;
-        end;
-
-        sOperands := copy(sOperands, 1, length(sOperands) - 1);
-
-        sl.Add(format('FOpCodeList.Add(''%s,%s,%s,%s,%s'');', [sInst, sI386, sX8664, sAVX512, sOperands]));
-      end;
-
-    end;
-
-    sl.Savetofile('/tmp/fpcavx512.txt');
-
-   // std_op2str
-
-  finally
-    FreeAndnil(sl);
-  end;
-end;
-
-class procedure TAsmTestGenerator.ListMemRefState;
-var
-  i: integer;
-  sGasSufffix: string;
-  mrsize: TMemRefSizeInfo;
-  opcode: tasmop;
-  sl: TStringList;
-  slEmpty: TStringList;
-begin
-  BuildInsTabCache;
-  BuildInsTabMemRefSizeInfoCache;
-
-  slEmpty := TStringList.Create;
-  try
-    for mrsize := low(TMemRefSizeInfo) to high(TMemRefSizeInfo) do
-    begin
-
-      sl := TStringList.Create;
-      try
-        for opcode:=low(tasmop) to high(tasmop) do
-        begin
-          if InsTabMemRefSizeInfoCache^[opcode].MemRefSize = mrsize then
-          begin
-            sGasSufffix:='';
-            if gas_needsuffix[opcode] <> AttSufNone then
-             sGasSufffix:=GetEnumName(Typeinfo(TAttSuffix), ord(gas_needsuffix[opcode]));
-
-            sl.add(format('%-25s:   %s: %s', [GetEnumName(Typeinfo(TMemRefSizeInfo), ord(mrsize)), std_op2str[opcode], sGasSufffix]));
-          end;
-        end;
-
-        sl.Sort;
-
-        if sl.Count > 0 then
-        begin
-          writeln;
-
-          writeln(sl.text);
-        end
-        else slEmpty.Add(GetEnumName(Typeinfo(TMemRefSizeInfo), ord(mrsize)));
-
-
-      finally
-        FreeAndNil(sl);
-      end;
-    end;
-
-    slEmpty.Sort;
-    writeln('');
-    writeln(slEmpty.Text);
-  finally
-    FreeAndNil(slEmpty);
-  end;
-
-  if assigned(instabcache) then
-  begin
-    dispose(instabcache);
-    instabcache:=nil;
-  end;
-
-  if assigned(InsTabMemRefSizeInfoCache) then
-  begin
-    dispose(InsTabMemRefSizeInfoCache);
-    InsTabMemRefSizeInfoCache:=nil;
-  end;
-
-
-end;
-
-end.