unit kern_jit_test;

{$mode ObjFPC}{$H+}
{$CALLING SysV_ABI_CDecl}

interface

uses
 x86_fpdbgdisas;

procedure print_test_jit_cbs(print_ops,print_status:Boolean);

procedure apply_din_stat(din:TInstruction;code_size:Byte);
procedure apply_jit_stat(code_size:Word);

procedure print_din_stats;

function  is_sse  (x:TOpcodePrefix;y:TOpCode;z:TOpCodeSuffix):Boolean;
function  is_float(x:TOpcodePrefix;y:TOpCode;z:TOpCodeSuffix):Boolean;
function  is_avx  (x:TOpcodePrefix;y:TOpCode;z:TOpCodeSuffix):Boolean;
function  is_bmi  (x:TOpcodePrefix;y:TOpCode;z:TOpCodeSuffix):Boolean;

implementation

uses
 kern_jit_ops;

var
 instr_sizes:array[0..16] of QWORD;
 jit_sizes  :array[0..511] of QWORD;

 rip_stat:QWORD;
 one_stat:QWORD;
 gen_stat:array[0..15] of QWORD;

const
 gen_str:array[0..15] of PChar=(
  'rax',
  'rcx',
  'rdx',
  'rbx',
  'rsp',
  'rbp',
  'rsi',
  'rdi',
  'r8 ',
  'r9 ',
  'r10',
  'r11',
  'r12',
  'r13',
  'r14',
  'r15'
 );

procedure print_din_stats;
var
 i,s:Integer;
begin
 Writeln('[Instruction sizes]');
 For i:=1 to 16 do
 begin
  Writeln(' [',i,']:',instr_sizes[i]);
 end;
 //
 Writeln('[Instruction usage]');
 Writeln(' [rip]:',rip_stat);
 Writeln(' [one]:',one_stat);

 For i:=0 to 15 do
 begin
  Writeln(' [',gen_str[i],']:',gen_stat[i]);
 end;

 s:=0;
 For i:=511 downto 0 do
 begin
  if (jit_sizes[i]<>0) then
  begin
   s:=i;
   Break;
  end;
 end;

 Writeln('[JIT sizes]');
 For i:=0 to s do
 begin
  Writeln(' [',i,']:',jit_sizes[i]);
 end;

end;

procedure apply_reg_stat(r:TRegValue);
begin
 case r.AType of
  regRip     :Inc(rip_stat);
  regOne     :Inc(one_stat);
  regGeneral :
   if (r.AIndex<=15) then
   begin
    Inc(gen_stat[r.AIndex]);
   end;
  regGeneralH:
   if (r.AIndex<=3) then
   begin
    Inc(gen_stat[r.AIndex]);
   end;
  else;
 end;
end;

procedure apply_din_stat(din:TInstruction;code_size:Byte);
var
 i:Integer;
begin
 if (code_size<>0) and (code_size<=16) then
 begin
  Inc(instr_sizes[code_size]);
 end;
 //
 if (din.OperCnt<>0) then
 For i:=1 to din.OperCnt do
 begin
  apply_reg_stat(din.Operand[i].RegValue[0]);
  apply_reg_stat(din.Operand[i].RegValue[1]);
 end;
end;

procedure apply_jit_stat(code_size:Word);
begin
 if (code_size<=511) then
 begin
  Inc(jit_sizes[code_size]);
 end;
end;

type
 t_used_op=array[TOpcodePrefix,TOpCode,TOpCodeSuffix] of Boolean;

var
 used_op:t_used_op;

procedure load_used;
begin
 used_op[OPPnone,OPadc,OPSnone]:=True;
 used_op[OPPnone,OPadcx,OPSnone]:=True;
 used_op[OPPnone,OPadd,OPSnone]:=True;
 used_op[OPPnone,OPadd,OPSx_pd]:=True;
 used_op[OPPnone,OPadd,OPSx_ps]:=True;
 used_op[OPPnone,OPadd,OPSx_sd]:=True;
 used_op[OPPnone,OPadd,OPSx_ss]:=True;
 used_op[OPPnone,OPaddsub,OPSx_pd]:=True;
 used_op[OPPnone,OPaddsub,OPSx_ps]:=True;
 used_op[OPPnone,OPadox,OPSnone]:=True;
 used_op[OPPnone,OPaesdec,OPSnone]:=True;
 used_op[OPPnone,OPaesdeclast,OPSnone]:=True;
 used_op[OPPnone,OPaesenc,OPSnone]:=True;
 used_op[OPPnone,OPaesenclast,OPSnone]:=True;
 used_op[OPPnone,OPaesimc,OPSnone]:=True;
 used_op[OPPnone,OPaeskeygenassist,OPSnone]:=True;
 used_op[OPPnone,OPand,OPSnone]:=True;
 used_op[OPPnone,OPand,OPSx_pd]:=True;
 used_op[OPPnone,OPand,OPSx_ps]:=True;
 used_op[OPPnone,OPand,OPSx_sd]:=True;
 used_op[OPPnone,OPand,OPSx_ss]:=True;
 used_op[OPPnone,OPandn,OPSnone]:=True;
 used_op[OPPnone,OPandn,OPSx_pd]:=True;
 used_op[OPPnone,OPandn,OPSx_ps]:=True;
 used_op[OPPnone,OPandn,OPSx_sd]:=True;
 used_op[OPPnone,OPandn,OPSx_ss]:=True;
 used_op[OPPnone,OParpl,OPSnone]:=True;
 used_op[OPPnone,OPbextr,OPSnone]:=True;
 used_op[OPPnone,OPblend,OPSx_pd]:=True;
 used_op[OPPnone,OPblend,OPSx_ps]:=True;
 used_op[OPPnone,OPblendv,OPSx_pd]:=True;
 used_op[OPPnone,OPblendv,OPSx_ps]:=True;
 used_op[OPPnone,OPblsi,OPSnone]:=True;
 used_op[OPPnone,OPblsmsk,OPSnone]:=True;
 used_op[OPPnone,OPblsr,OPSnone]:=True;
 used_op[OPPnone,OPbsf,OPSnone]:=True;
 used_op[OPPnone,OPbsr,OPSnone]:=True;
 used_op[OPPnone,OPbswap,OPSnone]:=True;
 used_op[OPPnone,OPbt,OPSnone]:=True;
 used_op[OPPnone,OPbtc,OPSnone]:=True;
 used_op[OPPnone,OPbtr,OPSnone]:=True;
 used_op[OPPnone,OPbts,OPSnone]:=True;
 used_op[OPPnone,OPbzhi,OPSnone]:=True;
 used_op[OPPnone,OPcall,OPSnone]:=True;
 used_op[OPPnone,OPcbw,OPSnone]:=True;
 used_op[OPPnone,OPcdq,OPSnone]:=True;
 used_op[OPPnone,OPcdqe,OPSnone]:=True;
 used_op[OPPnone,OPclac,OPSnone]:=True;
 used_op[OPPnone,OPclc,OPSnone]:=True;
 used_op[OPPnone,OPcld,OPSnone]:=True;
 used_op[OPPnone,OPclflush,OPSnone]:=True;
 used_op[OPPnone,OPclgi,OPSnone]:=True;
 used_op[OPPnone,OPcli,OPSnone]:=True;
 used_op[OPPnone,OPclts,OPSnone]:=True;
 used_op[OPPnone,OPcmc,OPSnone]:=True;
 used_op[OPPnone,OPcmov__,OPSc_o]:=True;
 used_op[OPPnone,OPcmov__,OPSc_no]:=True;
 used_op[OPPnone,OPcmov__,OPSc_b]:=True;
 used_op[OPPnone,OPcmov__,OPSc_nb]:=True;
 used_op[OPPnone,OPcmov__,OPSc_z]:=True;
 used_op[OPPnone,OPcmov__,OPSc_nz]:=True;
 used_op[OPPnone,OPcmov__,OPSc_be]:=True;
 used_op[OPPnone,OPcmov__,OPSc_nbe]:=True;
 used_op[OPPnone,OPcmov__,OPSc_s]:=True;
 used_op[OPPnone,OPcmov__,OPSc_ns]:=True;
 used_op[OPPnone,OPcmov__,OPSc_p]:=True;
 used_op[OPPnone,OPcmov__,OPSc_np]:=True;
 used_op[OPPnone,OPcmov__,OPSc_l]:=True;
 used_op[OPPnone,OPcmov__,OPSc_nl]:=True;
 used_op[OPPnone,OPcmov__,OPSc_le]:=True;
 used_op[OPPnone,OPcmov__,OPSc_nle]:=True;
 used_op[OPPnone,OPcmp,OPSnone]:=True;
 used_op[OPPnone,OPcmp,OPSx_pd]:=True;
 used_op[OPPnone,OPcmp,OPSx_ps]:=True;
 used_op[OPPnone,OPcmp,OPSx_sd]:=True;
 used_op[OPPnone,OPcmp,OPSx_ss]:=True;
 used_op[OPPnone,OPcmps,OPSx_b]:=True;
 used_op[OPPnone,OPcmps,OPSx_d]:=True;
 used_op[OPPnone,OPcmps,OPSx_q]:=True;
 used_op[OPPnone,OPcmps,OPSx_w]:=True;
 used_op[OPPnone,OPcmpxchg,OPSnone]:=True;
 used_op[OPPnone,OPcmpxchg,OPSx_8b]:=True;
 used_op[OPPnone,OPcmpxchg,OPSx_16b]:=True;
 used_op[OPPnone,OPcomi,OPSx_sd]:=True;
 used_op[OPPnone,OPcomi,OPSx_ss]:=True;
 used_op[OPPnone,OPcpuid,OPSnone]:=True;
 used_op[OPPnone,OPcqo,OPSnone]:=True;
 used_op[OPPnone,OPcrc32,OPSnone]:=True;
 used_op[OPPnone,OPcvtdq2,OPSx_pd]:=True;
 used_op[OPPnone,OPcvtdq2,OPSx_ps]:=True;
 used_op[OPPnone,OPcvtpd2,OPSx_dq]:=True;
 used_op[OPPnone,OPcvtpd2,OPSx_pi]:=True;
 used_op[OPPnone,OPcvtpd2,OPSx_ps]:=True;
 used_op[OPPnone,OPcvtpi2,OPSx_pd]:=True;
 used_op[OPPnone,OPcvtpi2,OPSx_ps]:=True;
 used_op[OPPnone,OPcvtps2,OPSx_dq]:=True;
 used_op[OPPnone,OPcvtps2,OPSx_pd]:=True;
 used_op[OPPnone,OPcvtps2,OPSx_ph]:=True;
 used_op[OPPnone,OPcvtps2,OPSx_pi]:=True;
 used_op[OPPnone,OPcvtsd2,OPSx_si]:=True;
 used_op[OPPnone,OPcvtsd2,OPSx_ss]:=True;
 used_op[OPPnone,OPcvtsi2,OPSx_sd]:=True;
 used_op[OPPnone,OPcvtsi2,OPSx_ss]:=True;
 used_op[OPPnone,OPcvtss2,OPSx_sd]:=True;
 used_op[OPPnone,OPcvtss2,OPSx_si]:=True;
 used_op[OPPnone,OPcvttpd2,OPSx_dq]:=True;
 used_op[OPPnone,OPcvttpd2,OPSx_pi]:=True;
 used_op[OPPnone,OPcvttps2,OPSx_dq]:=True;
 used_op[OPPnone,OPcvttps2,OPSx_pi]:=True;
 used_op[OPPnone,OPcvttsd2,OPSx_si]:=True;
 used_op[OPPnone,OPcvttss2,OPSx_si]:=True;
 used_op[OPPnone,OPcwd,OPSnone]:=True;
 used_op[OPPnone,OPcwde,OPSnone]:=True;
 used_op[OPPnone,OPdaa,OPSnone]:=True;
 used_op[OPPnone,OPdas,OPSnone]:=True;
 used_op[OPPnone,OPdec,OPSnone]:=True;
 used_op[OPPnone,OPdiv,OPSnone]:=True;
 used_op[OPPnone,OPdiv,OPSx_pd]:=True;
 used_op[OPPnone,OPdiv,OPSx_ps]:=True;
 used_op[OPPnone,OPdiv,OPSx_sd]:=True;
 used_op[OPPnone,OPdiv,OPSx_ss]:=True;
 used_op[OPPnone,OPdp,OPSx_pd]:=True;
 used_op[OPPnone,OPdp,OPSx_ps]:=True;
 used_op[OPPnone,OPemms,OPSnone]:=True;
 used_op[OPPnone,OPenter,OPSnone]:=True;
 used_op[OPPnone,OPextract,OPSx_f128]:=True;
 used_op[OPPnone,OPextract,OPSx_i128]:=True;
 used_op[OPPnone,OPextract,OPSx_ps]:=True;
 used_op[OPPnone,OPf2xm1,OPSnone]:=True;
 used_op[OPPnone,OPfabs,OPSnone]:=True;
 used_op[OPPnone,OPfadd,OPSnone]:=True;
 used_op[OPPnone,OPfadd,OPSx_p]:=True;
 used_op[OPPnone,OPfbld,OPSnone]:=True;
 used_op[OPPnone,OPfbstp,OPSnone]:=True;
 used_op[OPPnone,OPfchs,OPSnone]:=True;
 used_op[OPPnone,OPfcmov__,OPSc_b]:=True;
 used_op[OPPnone,OPfcmov__,OPSc_nb]:=True;
 used_op[OPPnone,OPfcmov__,OPSc_be]:=True;
 used_op[OPPnone,OPfcmov__,OPSc_nbe]:=True;
 used_op[OPPnone,OPfcmov__,OPSc_e]:=True;
 used_op[OPPnone,OPfcmov__,OPSc_ne]:=True;
 used_op[OPPnone,OPfcmov__,OPSc_u]:=True;
 used_op[OPPnone,OPfcmov__,OPSc_nu]:=True;
 used_op[OPPnone,OPfcom,OPSnone]:=True;
 used_op[OPPnone,OPfcom,OPSx_i]:=True;
 used_op[OPPnone,OPfcom,OPSx_ip]:=True;
 used_op[OPPnone,OPfcom,OPSx_p]:=True;
 used_op[OPPnone,OPfcom,OPSx_pp]:=True;
 used_op[OPPnone,OPfcos,OPSnone]:=True;
 used_op[OPPnone,OPfdecstp,OPSnone]:=True;
 used_op[OPPnone,OPfdiv,OPSnone]:=True;
 used_op[OPPnone,OPfdiv,OPSx_p]:=True;
 used_op[OPPnone,OPfdivr,OPSnone]:=True;
 used_op[OPPnone,OPfdivr,OPSx_p]:=True;
 used_op[OPPnone,OPfemms,OPSnone]:=True;
 used_op[OPPnone,OPffree,OPSnone]:=True;
 used_op[OPPnone,OPfiadd,OPSnone]:=True;
 used_op[OPPnone,OPficom,OPSnone]:=True;
 used_op[OPPnone,OPficom,OPSx_p]:=True;
 used_op[OPPnone,OPfidiv,OPSnone]:=True;
 used_op[OPPnone,OPfidivr,OPSnone]:=True;
 used_op[OPPnone,OPfild,OPSnone]:=True;
 used_op[OPPnone,OPfimul,OPSnone]:=True;
 used_op[OPPnone,OPfincstp,OPSnone]:=True;
 used_op[OPPnone,OPfist,OPSnone]:=True;
 used_op[OPPnone,OPfist,OPSx_p]:=True;
 used_op[OPPnone,OPfisttp,OPSnone]:=True;
 used_op[OPPnone,OPfisub,OPSnone]:=True;
 used_op[OPPnone,OPfisubr,OPSnone]:=True;
 used_op[OPPnone,OPfld,OPSnone]:=True;
 used_op[OPPnone,OPfld1,OPSnone]:=True;
 used_op[OPPnone,OPfldcw,OPSnone]:=True;
 used_op[OPPnone,OPfldenv,OPSnone]:=True;
 used_op[OPPnone,OPfldl2e,OPSnone]:=True;
 used_op[OPPnone,OPfldl2t,OPSnone]:=True;
 used_op[OPPnone,OPfldlg2,OPSnone]:=True;
 used_op[OPPnone,OPfldln2,OPSnone]:=True;
 used_op[OPPnone,OPfldpi,OPSnone]:=True;
 used_op[OPPnone,OPfldz,OPSnone]:=True;
 used_op[OPPnone,OPfmul,OPSnone]:=True;
 used_op[OPPnone,OPfmul,OPSx_p]:=True;
 used_op[OPPnone,OPfnclex,OPSnone]:=True;
 used_op[OPPnone,OPfninit,OPSnone]:=True;
 used_op[OPPnone,OPfnsave,OPSnone]:=True;
 used_op[OPPnone,OPfnstcw,OPSnone]:=True;
 used_op[OPPnone,OPfnstenv,OPSnone]:=True;
 used_op[OPPnone,OPfnstsw,OPSnone]:=True;
 used_op[OPPnone,OPfpatan,OPSnone]:=True;
 used_op[OPPnone,OPfprem,OPSnone]:=True;
 used_op[OPPnone,OPfprem1,OPSnone]:=True;
 used_op[OPPnone,OPfptan,OPSnone]:=True;
 used_op[OPPnone,OPfrndint,OPSnone]:=True;
 used_op[OPPnone,OPfrstor,OPSnone]:=True;
 used_op[OPPnone,OPfscale,OPSnone]:=True;
 used_op[OPPnone,OPfsin,OPSnone]:=True;
 used_op[OPPnone,OPfsincos,OPSnone]:=True;
 used_op[OPPnone,OPfsqrt,OPSnone]:=True;
 used_op[OPPnone,OPfst,OPSnone]:=True;
 used_op[OPPnone,OPfst,OPSx_p]:=True;
 used_op[OPPnone,OPfsub,OPSnone]:=True;
 used_op[OPPnone,OPfsub,OPSx_p]:=True;
 used_op[OPPnone,OPfsubr,OPSnone]:=True;
 used_op[OPPnone,OPfsubr,OPSx_p]:=True;
 used_op[OPPnone,OPftst,OPSnone]:=True;
 used_op[OPPnone,OPfucom,OPSx_i]:=True;
 used_op[OPPnone,OPfucom,OPSx_ip]:=True;
 used_op[OPPnone,OPfucom,OPSx_p]:=True;
 used_op[OPPnone,OPfwait,OPSnone]:=True;
 used_op[OPPnone,OPfxam,OPSnone]:=True;
 used_op[OPPnone,OPfxch,OPSnone]:=True;
 used_op[OPPnone,OPfxrstor,OPSnone]:=True;
 used_op[OPPnone,OPfxsave,OPSnone]:=True;
 used_op[OPPnone,OPfxtract,OPSnone]:=True;
 used_op[OPPnone,OPfyl2x,OPSnone]:=True;
 used_op[OPPnone,OPfyl2xp1,OPSnone]:=True;
 used_op[OPPnone,OPgetbv,OPSnone]:=True;
 used_op[OPPnone,OPhadd,OPSx_pd]:=True;
 used_op[OPPnone,OPhadd,OPSx_ps]:=True;
 used_op[OPPnone,OPhlt,OPSnone]:=True;
 used_op[OPPnone,OPidiv,OPSnone]:=True;
 used_op[OPPnone,OPimul,OPSnone]:=True;
 used_op[OPPnone,OPin,OPSnone]:=True;
 used_op[OPPnone,OPinc,OPSnone]:=True;
 used_op[OPPnone,OPins,OPSx_b]:=True;
 used_op[OPPnone,OPins,OPSx_d]:=True;
 used_op[OPPnone,OPins,OPSx_w]:=True;
 used_op[OPPnone,OPinsert,OPSx_f128]:=True;
 used_op[OPPnone,OPinsert,OPSx_i128]:=True;
 used_op[OPPnone,OPinsert,OPSx_ps]:=True;
 used_op[OPPnone,OPinsert,OPSx_q]:=True;
 used_op[OPPnone,OPint,OPSnone]:=True;
 used_op[OPPnone,OPint1,OPSnone]:=True;
 used_op[OPPnone,OPint3,OPSnone]:=True;
 used_op[OPPnone,OPinto,OPSnone]:=True;
 used_op[OPPnone,OPinvd,OPSnone]:=True;
 used_op[OPPnone,OPinvept,OPSnone]:=True;
 used_op[OPPnone,OPinvlpg,OPSnone]:=True;
 used_op[OPPnone,OPinvlpga,OPSnone]:=True;
 used_op[OPPnone,OPinvpcid,OPSnone]:=True;
 used_op[OPPnone,OPinvvpid,OPSnone]:=True;
 used_op[OPPnone,OPiret,OPSnone]:=True;
 used_op[OPPnone,OPiret,OPSx_d]:=True;
 used_op[OPPnone,OPiret,OPSx_q]:=True;
 used_op[OPPnone,OPj__,OPSc_o]:=True;
 used_op[OPPnone,OPj__,OPSc_no]:=True;
 used_op[OPPnone,OPj__,OPSc_b]:=True;
 used_op[OPPnone,OPj__,OPSc_nb]:=True;
 used_op[OPPnone,OPj__,OPSc_z]:=True;
 used_op[OPPnone,OPj__,OPSc_nz]:=True;
 used_op[OPPnone,OPj__,OPSc_be]:=True;
 used_op[OPPnone,OPj__,OPSc_nbe]:=True;
 used_op[OPPnone,OPj__,OPSc_s]:=True;
 used_op[OPPnone,OPj__,OPSc_ns]:=True;
 used_op[OPPnone,OPj__,OPSc_p]:=True;
 used_op[OPPnone,OPj__,OPSc_np]:=True;
 used_op[OPPnone,OPj__,OPSc_l]:=True;
 used_op[OPPnone,OPj__,OPSc_nl]:=True;
 used_op[OPPnone,OPj__,OPSc_le]:=True;
 used_op[OPPnone,OPj__,OPSc_nle]:=True;
 used_op[OPPnone,OPjcxz,OPSnone]:=True;
 used_op[OPPnone,OPjecxz,OPSnone]:=True;
 used_op[OPPnone,OPjmp,OPSnone]:=True;
 used_op[OPPnone,OPjrcxz,OPSnone]:=True;
 used_op[OPPnone,OPlahf,OPSnone]:=True;
 used_op[OPPnone,OPlar,OPSnone]:=True;
 used_op[OPPnone,OPlddqu,OPSnone]:=True;
 used_op[OPPnone,OPldmxcsr,OPSnone]:=True;
 used_op[OPPnone,OPlds,OPSnone]:=True;
 used_op[OPPnone,OPlea,OPSnone]:=True;
 used_op[OPPnone,OPleave,OPSnone]:=True;
 used_op[OPPnone,OPles,OPSnone]:=True;
 used_op[OPPnone,OPlfence,OPSnone]:=True;
 used_op[OPPnone,OPlfs,OPSnone]:=True;
 used_op[OPPnone,OPlgdt,OPSnone]:=True;
 used_op[OPPnone,OPlgs,OPSnone]:=True;
 used_op[OPPnone,OPlidt,OPSnone]:=True;
 used_op[OPPnone,OPlldt,OPSnone]:=True;
 used_op[OPPnone,OPlmsw,OPSnone]:=True;
 used_op[OPPnone,OPlods,OPSx_b]:=True;
 used_op[OPPnone,OPlods,OPSx_d]:=True;
 used_op[OPPnone,OPlods,OPSx_q]:=True;
 used_op[OPPnone,OPlods,OPSx_w]:=True;
 used_op[OPPnone,OPloop,OPSnone]:=True;
 used_op[OPPnone,OPloop,OPSc_e]:=True;
 used_op[OPPnone,OPloop,OPSc_ne]:=True;
 used_op[OPPnone,OPlsl,OPSnone]:=True;
 used_op[OPPnone,OPlss,OPSnone]:=True;
 used_op[OPPnone,OPltr,OPSnone]:=True;
 used_op[OPPnone,OPlzcnt,OPSnone]:=True;
 used_op[OPPnone,OPmaskmov,OPSx_dqu]:=True;
 used_op[OPPnone,OPmaskmov,OPSx_pd]:=True;
 used_op[OPPnone,OPmaskmov,OPSx_ps]:=True;
 used_op[OPPnone,OPmaskmov,OPSx_q]:=True;
 used_op[OPPnone,OPmax,OPSx_pd]:=True;
 used_op[OPPnone,OPmax,OPSx_ps]:=True;
 used_op[OPPnone,OPmax,OPSx_sd]:=True;
 used_op[OPPnone,OPmax,OPSx_ss]:=True;
 used_op[OPPnone,OPmcommit,OPSnone]:=True;
 used_op[OPPnone,OPmfence,OPSnone]:=True;
 used_op[OPPnone,OPmin,OPSx_pd]:=True;
 used_op[OPPnone,OPmin,OPSx_ps]:=True;
 used_op[OPPnone,OPmin,OPSx_sd]:=True;
 used_op[OPPnone,OPmin,OPSx_ss]:=True;
 used_op[OPPnone,OPmonitor,OPSnone]:=True;
 used_op[OPPnone,OPmonitor,OPSx_x]:=True;
 used_op[OPPnone,OPmov,OPSnone]:=True;
 used_op[OPPnone,OPmov,OPSc_be]:=True;
 used_op[OPPnone,OPmov,OPSx_d]:=True;
 used_op[OPPnone,OPmov,OPSx_dqa]:=True;
 used_op[OPPnone,OPmov,OPSx_dqa32]:=True;
 used_op[OPPnone,OPmov,OPSx_dqa64]:=True;
 used_op[OPPnone,OPmov,OPSx_dqu]:=True;
 used_op[OPPnone,OPmov,OPSx_dqu8]:=True;
 used_op[OPPnone,OPmov,OPSx_dqu16]:=True;
 used_op[OPPnone,OPmov,OPSx_dqu32]:=True;
 used_op[OPPnone,OPmov,OPSx_dqu64]:=True;
 used_op[OPPnone,OPmov,OPSx_q]:=True;
 used_op[OPPnone,OPmov,OPSx_sd]:=True;
 used_op[OPPnone,OPmov,OPSx_ss]:=True;
 used_op[OPPnone,OPmova,OPSx_pd]:=True;
 used_op[OPPnone,OPmova,OPSx_ps]:=True;
 used_op[OPPnone,OPmovddup,OPSnone]:=True;
 used_op[OPPnone,OPmovdq2q,OPSnone]:=True;
 used_op[OPPnone,OPmovh,OPSx_pd]:=True;
 used_op[OPPnone,OPmovh,OPSx_ps]:=True;
 used_op[OPPnone,OPmovhlps,OPSnone]:=True;
 used_op[OPPnone,OPmovl,OPSx_pd]:=True;
 used_op[OPPnone,OPmovl,OPSx_ps]:=True;
 used_op[OPPnone,OPmovlh,OPSx_ps]:=True;
 used_op[OPPnone,OPmovmsk,OPSx_pd]:=True;
 used_op[OPPnone,OPmovmsk,OPSx_ps]:=True;
 used_op[OPPnone,OPmovnt,OPSx_dq]:=True;
 used_op[OPPnone,OPmovnt,OPSx_dqa]:=True;
 used_op[OPPnone,OPmovnt,OPSx_i]:=True;
 used_op[OPPnone,OPmovnt,OPSx_pd]:=True;
 used_op[OPPnone,OPmovnt,OPSx_ps]:=True;
 used_op[OPPnone,OPmovnt,OPSx_q]:=True;
 used_op[OPPnone,OPmovnt,OPSx_sd]:=True;
 used_op[OPPnone,OPmovnt,OPSx_ss]:=True;
 used_op[OPPnone,OPmovq2dq,OPSnone]:=True;
 used_op[OPPnone,OPmovs,OPSx_b]:=True;
 used_op[OPPnone,OPmovs,OPSx_d]:=True;
 used_op[OPPnone,OPmovs,OPSx_q]:=True;
 used_op[OPPnone,OPmovs,OPSx_w]:=True;
 used_op[OPPnone,OPmovshdup,OPSnone]:=True;
 used_op[OPPnone,OPmovsldup,OPSnone]:=True;
 used_op[OPPnone,OPmovsx,OPSnone]:=True;
 used_op[OPPnone,OPmovsx,OPSx_d]:=True;
 used_op[OPPnone,OPmovu,OPSx_pd]:=True;
 used_op[OPPnone,OPmovu,OPSx_ps]:=True;
 used_op[OPPnone,OPmovzx,OPSnone]:=True;
 used_op[OPPnone,OPmpsadbw,OPSnone]:=True;
 used_op[OPPnone,OPmul,OPSnone]:=True;
 used_op[OPPnone,OPmul,OPSx_pd]:=True;
 used_op[OPPnone,OPmul,OPSx_ps]:=True;
 used_op[OPPnone,OPmul,OPSx_sd]:=True;
 used_op[OPPnone,OPmul,OPSx_ss]:=True;
 used_op[OPPnone,OPmul,OPSx_x]:=True;
 used_op[OPPnone,OPmwait,OPSnone]:=True;
 used_op[OPPnone,OPmwait,OPSx_x]:=True;
 used_op[OPPnone,OPneg,OPSnone]:=True;
 used_op[OPPnone,OPnop,OPSnone]:=True;
 used_op[OPPnone,OPnot,OPSnone]:=True;
 used_op[OPPnone,OPor,OPSnone]:=True;
 used_op[OPPnone,OPor,OPSx_pd]:=True;
 used_op[OPPnone,OPor,OPSx_ps]:=True;
 used_op[OPPnone,OPor,OPSx_sd]:=True;
 used_op[OPPnone,OPor,OPSx_ss]:=True;
 used_op[OPPnone,OPout,OPSnone]:=True;
 used_op[OPPnone,OPouts,OPSx_b]:=True;
 used_op[OPPnone,OPouts,OPSx_d]:=True;
 used_op[OPPnone,OPouts,OPSx_w]:=True;
 used_op[OPPnone,OPextrq,OPSnone]:=True;
 used_op[OPPnone,OPpabs,OPSx_b]:=True;
 used_op[OPPnone,OPpabs,OPSx_d]:=True;
 used_op[OPPnone,OPpabs,OPSx_w]:=True;
 used_op[OPPnone,OPpackssdw,OPSnone]:=True;
 used_op[OPPnone,OPpacksswb,OPSnone]:=True;
 used_op[OPPnone,OPpackusdw,OPSnone]:=True;
 used_op[OPPnone,OPpackuswb,OPSnone]:=True;
 used_op[OPPnone,OPpadd,OPSx_b]:=True;
 used_op[OPPnone,OPpadd,OPSx_d]:=True;
 used_op[OPPnone,OPpadd,OPSx_q]:=True;
 used_op[OPPnone,OPpadd,OPSx_w]:=True;
 used_op[OPPnone,OPpadds,OPSx_b]:=True;
 used_op[OPPnone,OPpadds,OPSx_w]:=True;
 used_op[OPPnone,OPpaddus,OPSx_b]:=True;
 used_op[OPPnone,OPpaddus,OPSx_w]:=True;
 used_op[OPPnone,OPpalignr,OPSnone]:=True;
 used_op[OPPnone,OPpand,OPSnone]:=True;
 used_op[OPPnone,OPpandn,OPSnone]:=True;
 used_op[OPPnone,OPpause,OPSnone]:=True;
 used_op[OPPnone,OPpavg,OPSx_b]:=True;
 used_op[OPPnone,OPpavg,OPSx_w]:=True;
 used_op[OPPnone,OPpavgusb,OPSnone]:=True;
 used_op[OPPnone,OPpblendvb,OPSnone]:=True;
 used_op[OPPnone,OPpblend,OPSx_d]:=True;
 used_op[OPPnone,OPpblend,OPSx_w]:=True;
 used_op[OPPnone,OPpclmulqdq,OPSnone]:=True;
 used_op[OPPnone,OPpcmpeq,OPSx_b]:=True;
 used_op[OPPnone,OPpcmpeq,OPSx_d]:=True;
 used_op[OPPnone,OPpcmpeq,OPSx_q]:=True;
 used_op[OPPnone,OPpcmpeq,OPSx_w]:=True;
 used_op[OPPnone,OPpcmpestri,OPSnone]:=True;
 used_op[OPPnone,OPpcmpestrm,OPSnone]:=True;
 used_op[OPPnone,OPpcmpgt,OPSx_b]:=True;
 used_op[OPPnone,OPpcmpgt,OPSx_d]:=True;
 used_op[OPPnone,OPpcmpgt,OPSx_q]:=True;
 used_op[OPPnone,OPpcmpgt,OPSx_w]:=True;
 used_op[OPPnone,OPpcmpistri,OPSnone]:=True;
 used_op[OPPnone,OPpcmpistrm,OPSnone]:=True;
 used_op[OPPnone,OPpdep,OPSnone]:=True;
 used_op[OPPnone,OPpext,OPSnone]:=True;
 used_op[OPPnone,OPpextr,OPSx_b]:=True;
 used_op[OPPnone,OPpextr,OPSx_d]:=True;
 used_op[OPPnone,OPpextr,OPSx_q]:=True;
 used_op[OPPnone,OPpextr,OPSx_w]:=True;
 used_op[OPPnone,OPphadd,OPSx_d]:=True;
 used_op[OPPnone,OPphadd,OPSx_w]:=True;
 used_op[OPPnone,OPphaddsw,OPSnone]:=True;
 used_op[OPPnone,OPphminposuw,OPSnone]:=True;
 used_op[OPPnone,OPphsub,OPSx_d]:=True;
 used_op[OPPnone,OPphsub,OPSx_w]:=True;
 used_op[OPPnone,OPphsubsw,OPSnone]:=True;
 used_op[OPPnone,OPpinsr,OPSx_b]:=True;
 used_op[OPPnone,OPpinsr,OPSx_d]:=True;
 used_op[OPPnone,OPpinsr,OPSx_q]:=True;
 used_op[OPPnone,OPpinsr,OPSx_w]:=True;
 used_op[OPPnone,OPpmaddubsw,OPSnone]:=True;
 used_op[OPPnone,OPpmaddwd,OPSnone]:=True;
 used_op[OPPnone,OPpmaxs,OPSx_b]:=True;
 used_op[OPPnone,OPpmaxs,OPSx_d]:=True;
 used_op[OPPnone,OPpmaxs,OPSx_w]:=True;
 used_op[OPPnone,OPpmaxu,OPSx_b]:=True;
 used_op[OPPnone,OPpmaxu,OPSx_d]:=True;
 used_op[OPPnone,OPpmaxu,OPSx_w]:=True;
 used_op[OPPnone,OPpmins,OPSx_b]:=True;
 used_op[OPPnone,OPpmins,OPSx_d]:=True;
 used_op[OPPnone,OPpmins,OPSx_w]:=True;
 used_op[OPPnone,OPpminu,OPSx_b]:=True;
 used_op[OPPnone,OPpminu,OPSx_d]:=True;
 used_op[OPPnone,OPpminu,OPSx_w]:=True;
 used_op[OPPnone,OPpmovmskb,OPSnone]:=True;
 used_op[OPPnone,OPpmovsx,OPSv_bw]:=True;
 used_op[OPPnone,OPpmovsx,OPSv_bd]:=True;
 used_op[OPPnone,OPpmovsx,OPSv_bq]:=True;
 used_op[OPPnone,OPpmovsx,OPSv_wd]:=True;
 used_op[OPPnone,OPpmovsx,OPSv_wq]:=True;
 used_op[OPPnone,OPpmovsx,OPSv_dq]:=True;
 used_op[OPPnone,OPpmovzx,OPSv_bw]:=True;
 used_op[OPPnone,OPpmovzx,OPSv_bd]:=True;
 used_op[OPPnone,OPpmovzx,OPSv_bq]:=True;
 used_op[OPPnone,OPpmovzx,OPSv_wd]:=True;
 used_op[OPPnone,OPpmovzx,OPSv_wq]:=True;
 used_op[OPPnone,OPpmovzx,OPSv_dq]:=True;
 used_op[OPPnone,OPpmuldq,OPSnone]:=True;
 used_op[OPPnone,OPpmulhrsw,OPSnone]:=True;
 used_op[OPPnone,OPpmulhuw,OPSnone]:=True;
 used_op[OPPnone,OPpmulhw,OPSnone]:=True;
 used_op[OPPnone,OPpmull,OPSx_d]:=True;
 used_op[OPPnone,OPpmull,OPSx_w]:=True;
 used_op[OPPnone,OPpmuludq,OPSnone]:=True;
 used_op[OPPnone,OPpop,OPSnone]:=True;
 used_op[OPPnone,OPpopcnt,OPSnone]:=True;
 used_op[OPPnone,OPpopf,OPSnone]:=True;
 used_op[OPPnone,OPpopf,OPSx_q]:=True;
 used_op[OPPnone,OPpor,OPSnone]:=True;
 used_op[OPPnone,OPprefetch,OPSnone]:=True;
 used_op[OPPnone,OPprefetch,OPSp_t0]:=True;
 used_op[OPPnone,OPprefetch,OPSp_t1]:=True;
 used_op[OPPnone,OPprefetch,OPSp_t2]:=True;
 used_op[OPPnone,OPprefetch,OPSp_nta]:=True;
 used_op[OPPnone,OPprefetch,OPSp_w]:=True;
 used_op[OPPnone,OPpsadbw,OPSnone]:=True;
 used_op[OPPnone,OPpshuf,OPSx_b]:=True;
 used_op[OPPnone,OPpshuf,OPSx_d]:=True;
 used_op[OPPnone,OPpshuf,OPSx_hw]:=True;
 used_op[OPPnone,OPpshuf,OPSx_lw]:=True;
 used_op[OPPnone,OPpshuf,OPSx_w]:=True;
 used_op[OPPnone,OPpsign,OPSx_b]:=True;
 used_op[OPPnone,OPpsign,OPSx_d]:=True;
 used_op[OPPnone,OPpsign,OPSx_w]:=True;
 used_op[OPPnone,OPpsll,OPSx_d]:=True;
 used_op[OPPnone,OPpsll,OPSx_dq]:=True;
 used_op[OPPnone,OPpsll,OPSx_q]:=True;
 used_op[OPPnone,OPpsll,OPSx_w]:=True;
 used_op[OPPnone,OPpsmash,OPSnone]:=True;
 used_op[OPPnone,OPpsra,OPSx_d]:=True;
 used_op[OPPnone,OPpsra,OPSx_w]:=True;
 used_op[OPPnone,OPpsrl,OPSx_d]:=True;
 used_op[OPPnone,OPpsrl,OPSx_dq]:=True;
 used_op[OPPnone,OPpsrl,OPSx_q]:=True;
 used_op[OPPnone,OPpsrl,OPSx_w]:=True;
 used_op[OPPnone,OPpsub,OPSx_b]:=True;
 used_op[OPPnone,OPpsub,OPSx_d]:=True;
 used_op[OPPnone,OPpsub,OPSx_q]:=True;
 used_op[OPPnone,OPpsub,OPSx_w]:=True;
 used_op[OPPnone,OPpsubs,OPSx_b]:=True;
 used_op[OPPnone,OPpsubs,OPSx_w]:=True;
 used_op[OPPnone,OPpsubus,OPSx_b]:=True;
 used_op[OPPnone,OPpsubus,OPSx_w]:=True;
 used_op[OPPnone,OPptest,OPSnone]:=True;
 used_op[OPPnone,OPpunpckhbw,OPSnone]:=True;
 used_op[OPPnone,OPpunpckhdq,OPSnone]:=True;
 used_op[OPPnone,OPpunpckhqdq,OPSnone]:=True;
 used_op[OPPnone,OPpunpckhwd,OPSnone]:=True;
 used_op[OPPnone,OPpunpcklbw,OPSnone]:=True;
 used_op[OPPnone,OPpunpckldq,OPSnone]:=True;
 used_op[OPPnone,OPpunpcklqdq,OPSnone]:=True;
 used_op[OPPnone,OPpunpcklwd,OPSnone]:=True;
 used_op[OPPnone,OPpush,OPSnone]:=True;
 used_op[OPPnone,OPpushf,OPSnone]:=True;
 used_op[OPPnone,OPpushf,OPSx_q]:=True;
 used_op[OPPnone,OPpvalidate,OPSnone]:=True;
 used_op[OPPnone,OPpxor,OPSnone]:=True;
 used_op[OPPnone,OPrcl,OPSnone]:=True;
 used_op[OPPnone,OPrcp,OPSx_pd]:=True;
 used_op[OPPnone,OPrcp,OPSx_ps]:=True;
 used_op[OPPnone,OPrcp,OPSx_sd]:=True;
 used_op[OPPnone,OPrcp,OPSx_ss]:=True;
 used_op[OPPnone,OPrcr,OPSnone]:=True;
 used_op[OPPnone,OPrdfsbase,OPSnone]:=True;
 used_op[OPPnone,OPrdgsbase,OPSnone]:=True;
 used_op[OPPnone,OPrdmsr,OPSnone]:=True;
 used_op[OPPnone,OPrdpid,OPSnone]:=True;
 used_op[OPPnone,OPrdpkru,OPSnone]:=True;
 used_op[OPPnone,OPrdpmc,OPSnone]:=True;
 used_op[OPPnone,OPrdpru,OPSnone]:=True;
 used_op[OPPnone,OPrdrand,OPSnone]:=True;
 used_op[OPPnone,OPrdseed,OPSnone]:=True;
 used_op[OPPnone,OPrdss,OPSx_p]:=True;
 used_op[OPPnone,OPrdtsc,OPSnone]:=True;
 used_op[OPPnone,OPrdtsc,OPSx_p]:=True;
 used_op[OPPnone,OPret,OPSnone]:=True;
 used_op[OPPnone,OPretf,OPSnone]:=True;
 used_op[OPPnone,OPrmpadjust,OPSnone]:=True;
 used_op[OPPnone,OPrmpupdate,OPSnone]:=True;
 used_op[OPPnone,OProl,OPSnone]:=True;
 used_op[OPPnone,OPror,OPSnone]:=True;
 used_op[OPPnone,OProrx,OPSnone]:=True;
 used_op[OPPnone,OPround,OPSx_pd]:=True;
 used_op[OPPnone,OPround,OPSx_ps]:=True;
 used_op[OPPnone,OPround,OPSx_sd]:=True;
 used_op[OPPnone,OPround,OPSx_ss]:=True;
 used_op[OPPnone,OPrsm,OPSnone]:=True;
 used_op[OPPnone,OPrsqrt,OPSx_pd]:=True;
 used_op[OPPnone,OPrsqrt,OPSx_ps]:=True;
 used_op[OPPnone,OPrsqrt,OPSx_sd]:=True;
 used_op[OPPnone,OPrsqrt,OPSx_ss]:=True;
 used_op[OPPnone,OPsahf,OPSnone]:=True;
 used_op[OPPnone,OPsal,OPSnone]:=True;
 used_op[OPPnone,OPsalc,OPSnone]:=True;
 used_op[OPPnone,OPsar,OPSnone]:=True;
 used_op[OPPnone,OPsar,OPSx_x]:=True;
 used_op[OPPnone,OPsaveprevssp,OPSnone]:=True;
 used_op[OPPnone,OPsbb,OPSnone]:=True;
 used_op[OPPnone,OPscas,OPSx_b]:=True;
 used_op[OPPnone,OPscas,OPSx_d]:=True;
 used_op[OPPnone,OPscas,OPSx_q]:=True;
 used_op[OPPnone,OPscas,OPSx_w]:=True;
 used_op[OPPnone,OPset__,OPSc_o]:=True;
 used_op[OPPnone,OPset__,OPSc_no]:=True;
 used_op[OPPnone,OPset__,OPSc_b]:=True;
 used_op[OPPnone,OPset__,OPSc_nb]:=True;
 used_op[OPPnone,OPset__,OPSc_z]:=True;
 used_op[OPPnone,OPset__,OPSc_nz]:=True;
 used_op[OPPnone,OPset__,OPSc_be]:=True;
 used_op[OPPnone,OPset__,OPSc_nbe]:=True;
 used_op[OPPnone,OPset__,OPSc_s]:=True;
 used_op[OPPnone,OPset__,OPSc_ns]:=True;
 used_op[OPPnone,OPset__,OPSc_p]:=True;
 used_op[OPPnone,OPset__,OPSc_np]:=True;
 used_op[OPPnone,OPset__,OPSc_l]:=True;
 used_op[OPPnone,OPset__,OPSc_nl]:=True;
 used_op[OPPnone,OPset__,OPSc_le]:=True;
 used_op[OPPnone,OPset__,OPSc_nle]:=True;
 used_op[OPPnone,OPsetbv,OPSnone]:=True;
 used_op[OPPnone,OPsetssbsy,OPSnone]:=True;
 used_op[OPPnone,OPsfence,OPSnone]:=True;
 used_op[OPPnone,OPsgdt,OPSnone]:=True;
 used_op[OPPnone,OPsha1rnds4,OPSnone]:=True;
 used_op[OPPnone,OPshl,OPSnone]:=True;
 used_op[OPPnone,OPshl,OPSx_d]:=True;
 used_op[OPPnone,OPshl,OPSx_x]:=True;
 used_op[OPPnone,OPshr,OPSnone]:=True;
 used_op[OPPnone,OPshr,OPSx_d]:=True;
 used_op[OPPnone,OPshr,OPSx_x]:=True;
 used_op[OPPnone,OPshuf,OPSx_pd]:=True;
 used_op[OPPnone,OPshuf,OPSx_ps]:=True;
 used_op[OPPnone,OPsidt,OPSnone]:=True;
 used_op[OPPnone,OPskinit,OPSnone]:=True;
 used_op[OPPnone,OPsldt,OPSnone]:=True;
 used_op[OPPnone,OPsmsw,OPSnone]:=True;
 used_op[OPPnone,OPsqrt,OPSx_pd]:=True;
 used_op[OPPnone,OPsqrt,OPSx_ps]:=True;
 used_op[OPPnone,OPsqrt,OPSx_sd]:=True;
 used_op[OPPnone,OPsqrt,OPSx_ss]:=True;
 used_op[OPPnone,OPstac,OPSnone]:=True;
 used_op[OPPnone,OPstc,OPSnone]:=True;
 used_op[OPPnone,OPstd,OPSnone]:=True;
 used_op[OPPnone,OPstgi,OPSnone]:=True;
 used_op[OPPnone,OPsti,OPSnone]:=True;
 used_op[OPPnone,OPstmxcsr,OPSnone]:=True;
 used_op[OPPnone,OPstos,OPSx_b]:=True;
 used_op[OPPnone,OPstos,OPSx_d]:=True;
 used_op[OPPnone,OPstos,OPSx_q]:=True;
 used_op[OPPnone,OPstos,OPSx_w]:=True;
 used_op[OPPnone,OPstr,OPSnone]:=True;
 used_op[OPPnone,OPsub,OPSnone]:=True;
 used_op[OPPnone,OPsub,OPSx_pd]:=True;
 used_op[OPPnone,OPsub,OPSx_ps]:=True;
 used_op[OPPnone,OPsub,OPSx_sd]:=True;
 used_op[OPPnone,OPsub,OPSx_ss]:=True;
 used_op[OPPnone,OPswapgs,OPSnone]:=True;
 used_op[OPPnone,OPsyscall,OPSnone]:=True;
 used_op[OPPnone,OPsysenter,OPSnone]:=True;
 used_op[OPPnone,OPsysexit,OPSnone]:=True;
 used_op[OPPnone,OPsysret,OPSnone]:=True;
 used_op[OPPnone,OPtest,OPSnone]:=True;
 used_op[OPPnone,OPtzcnt,OPSnone]:=True;
 used_op[OPPnone,OPucomi,OPSx_sd]:=True;
 used_op[OPPnone,OPucomi,OPSx_ss]:=True;
 used_op[OPPnone,OPud1,OPSnone]:=True;
 used_op[OPPnone,OPud2,OPSnone]:=True;
 used_op[OPPnone,OPunpckh,OPSx_pd]:=True;
 used_op[OPPnone,OPunpckh,OPSx_ps]:=True;
 used_op[OPPnone,OPunpckl,OPSx_pd]:=True;
 used_op[OPPnone,OPunpckl,OPSx_ps]:=True;
 used_op[OPPnone,OPvalign,OPSx_d]:=True;
 used_op[OPPnone,OPvalign,OPSx_q]:=True;
 used_op[OPPnone,OPvbroadcast,OPSx_f128]:=True;
 used_op[OPPnone,OPvbroadcast,OPSx_sd]:=True;
 used_op[OPPnone,OPvbroadcast,OPSx_ss]:=True;
 used_op[OPPnone,OPvcvtph2ps,OPSnone]:=True;
 used_op[OPPnone,OPverr,OPSnone]:=True;
 used_op[OPPnone,OPverw,OPSnone]:=True;
 used_op[OPPnone,OPvfmadd132,OPSx_d]:=True;
 used_op[OPPnone,OPvfmadd132,OPSx_ps]:=True;
 used_op[OPPnone,OPvfmadd132,OPSx_ss]:=True;
 used_op[OPPnone,OPvfmadd213,OPSx_d]:=True;
 used_op[OPPnone,OPvfmadd213,OPSx_ps]:=True;
 used_op[OPPnone,OPvfmadd213,OPSx_ss]:=True;
 used_op[OPPnone,OPvfmadd231,OPSx_d]:=True;
 used_op[OPPnone,OPvfmadd231,OPSx_ps]:=True;
 used_op[OPPnone,OPvfmadd231,OPSx_ss]:=True;
 used_op[OPPnone,OPvfmaddsub132,OPSx_d]:=True;
 used_op[OPPnone,OPvfmaddsub132,OPSx_ps]:=True;
 used_op[OPPnone,OPvfmaddsub213,OPSx_d]:=True;
 used_op[OPPnone,OPvfmaddsub213,OPSx_ps]:=True;
 used_op[OPPnone,OPvfmaddsub231,OPSx_d]:=True;
 used_op[OPPnone,OPvfmaddsub231,OPSx_ps]:=True;
 used_op[OPPnone,OPvfmsub132,OPSx_d]:=True;
 used_op[OPPnone,OPvfmsub132,OPSx_ps]:=True;
 used_op[OPPnone,OPvfmsub132,OPSx_ss]:=True;
 used_op[OPPnone,OPvfmsub213,OPSx_d]:=True;
 used_op[OPPnone,OPvfmsub213,OPSx_ps]:=True;
 used_op[OPPnone,OPvfmsub213,OPSx_ss]:=True;
 used_op[OPPnone,OPvfmsub231,OPSx_d]:=True;
 used_op[OPPnone,OPvfmsub231,OPSx_ps]:=True;
 used_op[OPPnone,OPvfmsub231,OPSx_ss]:=True;
 used_op[OPPnone,OPvfmsubadd132,OPSx_d]:=True;
 used_op[OPPnone,OPvfmsubadd132,OPSx_ps]:=True;
 used_op[OPPnone,OPvfmsubadd213,OPSx_d]:=True;
 used_op[OPPnone,OPvfmsubadd213,OPSx_ps]:=True;
 used_op[OPPnone,OPvfmsubadd231,OPSx_d]:=True;
 used_op[OPPnone,OPvfmsubadd231,OPSx_ps]:=True;
 used_op[OPPnone,OPvfnmadd132,OPSx_d]:=True;
 used_op[OPPnone,OPvfnmadd132,OPSx_ps]:=True;
 used_op[OPPnone,OPvfnmadd132,OPSx_ss]:=True;
 used_op[OPPnone,OPvfnmadd213,OPSx_d]:=True;
 used_op[OPPnone,OPvfnmadd213,OPSx_ps]:=True;
 used_op[OPPnone,OPvfnmadd213,OPSx_ss]:=True;
 used_op[OPPnone,OPvfnmadd231,OPSx_d]:=True;
 used_op[OPPnone,OPvfnmadd231,OPSx_ps]:=True;
 used_op[OPPnone,OPvfnmadd231,OPSx_ss]:=True;
 used_op[OPPnone,OPvfnmsub132,OPSx_d]:=True;
 used_op[OPPnone,OPvfnmsub132,OPSx_ps]:=True;
 used_op[OPPnone,OPvfnmsub132,OPSx_ss]:=True;
 used_op[OPPnone,OPvfnmsub213,OPSx_d]:=True;
 used_op[OPPnone,OPvfnmsub213,OPSx_ps]:=True;
 used_op[OPPnone,OPvfnmsub213,OPSx_ss]:=True;
 used_op[OPPnone,OPvfnmsub231,OPSx_d]:=True;
 used_op[OPPnone,OPvfnmsub231,OPSx_ps]:=True;
 used_op[OPPnone,OPvfnmsub231,OPSx_ss]:=True;
 used_op[OPPnone,OPvgatherd,OPSx_d]:=True;
 used_op[OPPnone,OPvgatherd,OPSx_ps]:=True;
 used_op[OPPnone,OPvgatherd,OPSx_q]:=True;
 used_op[OPPnone,OPvgatherq,OPSx_d]:=True;
 used_op[OPPnone,OPvgatherq,OPSx_ps]:=True;
 used_op[OPPnone,OPvgatherq,OPSx_q]:=True;
 used_op[OPPnone,OPvpbroadcast,OPSx_b]:=True;
 used_op[OPPnone,OPvpbroadcast,OPSx_d]:=True;
 used_op[OPPnone,OPvpbroadcast,OPSx_i128]:=True;
 used_op[OPPnone,OPvpbroadcast,OPSx_q]:=True;
 used_op[OPPnone,OPvpbroadcast,OPSx_w]:=True;
 used_op[OPPnone,OPvperm,OPSx_d]:=True;
 used_op[OPPnone,OPvperm,OPSx_pd]:=True;
 used_op[OPPnone,OPvperm,OPSx_ps]:=True;
 used_op[OPPnone,OPvperm,OPSx_q]:=True;
 used_op[OPPnone,OPvperm2,OPSx_f128]:=True;
 used_op[OPPnone,OPvperm2,OPSx_i128]:=True;
 used_op[OPPnone,OPvpermil,OPSx_pd]:=True;
 used_op[OPPnone,OPvpermil,OPSx_ps]:=True;
 used_op[OPPnone,OPvpmaskmov,OPSx_d]:=True;
 used_op[OPPnone,OPvpmaskmov,OPSx_q]:=True;
 used_op[OPPnone,OPvpsllv,OPSx_d]:=True;
 used_op[OPPnone,OPvpsllv,OPSx_q]:=True;
 used_op[OPPnone,OPvpsrav,OPSx_d]:=True;
 used_op[OPPnone,OPvpsrlv,OPSx_d]:=True;
 used_op[OPPnone,OPvpsrlv,OPSx_q]:=True;
 used_op[OPPnone,OPvtest,OPSx_pd]:=True;
 used_op[OPPnone,OPvtest,OPSx_ps]:=True;
 used_op[OPPnone,OPvzeroall,OPSnone]:=True;
 used_op[OPPnone,OPvzeroupper,OPSnone]:=True;
 used_op[OPPnone,OPwbinvd,OPSnone]:=True;
 used_op[OPPnone,OPwrfsbase,OPSnone]:=True;
 used_op[OPPnone,OPwrgsbase,OPSnone]:=True;
 used_op[OPPnone,OPwrmsr,OPSnone]:=True;
 used_op[OPPnone,OPwrpkru,OPSnone]:=True;
 used_op[OPPnone,OPxabort,OPSnone]:=True;
 used_op[OPPnone,OPxadd,OPSnone]:=True;
 used_op[OPPnone,OPxbegin,OPSnone]:=True;
 used_op[OPPnone,OPxchg,OPSnone]:=True;
 used_op[OPPnone,OPxend,OPSnone]:=True;
 used_op[OPPnone,OPxlat,OPSnone]:=True;
 used_op[OPPnone,OPxor,OPSnone]:=True;
 used_op[OPPnone,OPxor,OPSx_pd]:=True;
 used_op[OPPnone,OPxor,OPSx_ps]:=True;
 used_op[OPPnone,OPxor,OPSx_sd]:=True;
 used_op[OPPnone,OPxor,OPSx_ss]:=True;
 used_op[OPPnone,OPxrstor,OPSnone]:=True;
 used_op[OPPnone,OPxsave,OPSnone]:=True;
 used_op[OPPnone,OPxsaveopt,OPSnone]:=True;
 used_op[OPPnone,OPxtest,OPSnone]:=True;
 used_op[OPPv,OPadd,OPSx_pd]:=True;
 used_op[OPPv,OPadd,OPSx_ps]:=True;
 used_op[OPPv,OPadd,OPSx_sd]:=True;
 used_op[OPPv,OPadd,OPSx_ss]:=True;
 used_op[OPPv,OPaddsub,OPSx_pd]:=True;
 used_op[OPPv,OPaddsub,OPSx_ps]:=True;
 used_op[OPPv,OPaesdec,OPSnone]:=True;
 used_op[OPPv,OPaesdeclast,OPSnone]:=True;
 used_op[OPPv,OPaesenc,OPSnone]:=True;
 used_op[OPPv,OPaesenclast,OPSnone]:=True;
 used_op[OPPv,OPaesimc,OPSnone]:=True;
 used_op[OPPv,OPaeskeygenassist,OPSnone]:=True;
 used_op[OPPv,OPand,OPSx_pd]:=True;
 used_op[OPPv,OPand,OPSx_ps]:=True;
 used_op[OPPv,OPand,OPSx_sd]:=True;
 used_op[OPPv,OPand,OPSx_ss]:=True;
 used_op[OPPv,OPandn,OPSx_pd]:=True;
 used_op[OPPv,OPandn,OPSx_ps]:=True;
 used_op[OPPv,OPandn,OPSx_sd]:=True;
 used_op[OPPv,OPandn,OPSx_ss]:=True;
 used_op[OPPv,OPblend,OPSx_pd]:=True;
 used_op[OPPv,OPblend,OPSx_ps]:=True;
 used_op[OPPv,OPblendv,OPSx_pd]:=True;
 used_op[OPPv,OPblendv,OPSx_ps]:=True;
 used_op[OPPv,OPcmp,OPSx_pd]:=True;
 used_op[OPPv,OPcmp,OPSx_ps]:=True;
 used_op[OPPv,OPcmp,OPSx_sd]:=True;
 used_op[OPPv,OPcmp,OPSx_ss]:=True;
 used_op[OPPv,OPcomi,OPSx_sd]:=True;
 used_op[OPPv,OPcomi,OPSx_ss]:=True;
 used_op[OPPv,OPcvtdq2,OPSx_pd]:=True;
 used_op[OPPv,OPcvtdq2,OPSx_ps]:=True;
 used_op[OPPv,OPcvtpd2,OPSx_dq]:=True;
 used_op[OPPv,OPcvtpd2,OPSx_ps]:=True;
 used_op[OPPv,OPcvtps2,OPSx_dq]:=True;
 used_op[OPPv,OPcvtps2,OPSx_pd]:=True;
 used_op[OPPv,OPcvtps2,OPSx_ph]:=True;
 used_op[OPPv,OPcvtsd2,OPSx_si]:=True;
 used_op[OPPv,OPcvtsd2,OPSx_ss]:=True;
 used_op[OPPv,OPcvtsi2,OPSx_sd]:=True;
 used_op[OPPv,OPcvtsi2,OPSx_ss]:=True;
 used_op[OPPv,OPcvtss2,OPSx_sd]:=True;
 used_op[OPPv,OPcvtss2,OPSx_si]:=True;
 used_op[OPPv,OPcvttpd2,OPSx_dq]:=True;
 used_op[OPPv,OPcvttps2,OPSx_dq]:=True;
 used_op[OPPv,OPcvttsd2,OPSx_si]:=True;
 used_op[OPPv,OPcvttss2,OPSx_si]:=True;
 used_op[OPPv,OPdiv,OPSx_pd]:=True;
 used_op[OPPv,OPdiv,OPSx_ps]:=True;
 used_op[OPPv,OPdiv,OPSx_sd]:=True;
 used_op[OPPv,OPdiv,OPSx_ss]:=True;
 used_op[OPPv,OPdp,OPSx_pd]:=True;
 used_op[OPPv,OPdp,OPSx_ps]:=True;
 used_op[OPPv,OPextract,OPSx_f128]:=True;
 used_op[OPPv,OPextract,OPSx_i128]:=True;
 used_op[OPPv,OPextract,OPSx_ps]:=True;
 used_op[OPPv,OPhadd,OPSx_pd]:=True;
 used_op[OPPv,OPhadd,OPSx_ps]:=True;
 used_op[OPPv,OPinsert,OPSx_f128]:=True;
 used_op[OPPv,OPinsert,OPSx_i128]:=True;
 used_op[OPPv,OPinsert,OPSx_ps]:=True;
 used_op[OPPv,OPlddqu,OPSnone]:=True;
 used_op[OPPv,OPldmxcsr,OPSnone]:=True;
 used_op[OPPv,OPmaskmov,OPSx_dqu]:=True;
 used_op[OPPv,OPmaskmov,OPSx_pd]:=True;
 used_op[OPPv,OPmaskmov,OPSx_ps]:=True;
 used_op[OPPv,OPmax,OPSx_pd]:=True;
 used_op[OPPv,OPmax,OPSx_ps]:=True;
 used_op[OPPv,OPmax,OPSx_sd]:=True;
 used_op[OPPv,OPmax,OPSx_ss]:=True;
 used_op[OPPv,OPmin,OPSx_pd]:=True;
 used_op[OPPv,OPmin,OPSx_ps]:=True;
 used_op[OPPv,OPmin,OPSx_sd]:=True;
 used_op[OPPv,OPmin,OPSx_ss]:=True;
 used_op[OPPv,OPmov,OPSx_d]:=True;
 used_op[OPPv,OPmov,OPSx_dqa]:=True;
 used_op[OPPv,OPmov,OPSx_dqa32]:=True;
 used_op[OPPv,OPmov,OPSx_dqa64]:=True;
 used_op[OPPv,OPmov,OPSx_dqu]:=True;
 used_op[OPPv,OPmov,OPSx_dqu8]:=True;
 used_op[OPPv,OPmov,OPSx_dqu16]:=True;
 used_op[OPPv,OPmov,OPSx_dqu32]:=True;
 used_op[OPPv,OPmov,OPSx_dqu64]:=True;
 used_op[OPPv,OPmov,OPSx_q]:=True;
 used_op[OPPv,OPmov,OPSx_sd]:=True;
 used_op[OPPv,OPmov,OPSx_ss]:=True;
 used_op[OPPv,OPmova,OPSx_pd]:=True;
 used_op[OPPv,OPmova,OPSx_ps]:=True;
 used_op[OPPv,OPmovddup,OPSnone]:=True;
 used_op[OPPv,OPmovh,OPSx_pd]:=True;
 used_op[OPPv,OPmovh,OPSx_ps]:=True;
 used_op[OPPv,OPmovhlps,OPSnone]:=True;
 used_op[OPPv,OPmovl,OPSx_pd]:=True;
 used_op[OPPv,OPmovl,OPSx_ps]:=True;
 used_op[OPPv,OPmovlh,OPSx_ps]:=True;
 used_op[OPPv,OPmovmsk,OPSx_pd]:=True;
 used_op[OPPv,OPmovmsk,OPSx_ps]:=True;
 used_op[OPPv,OPmovnt,OPSx_dq]:=True;
 used_op[OPPv,OPmovnt,OPSx_dqa]:=True;
 used_op[OPPv,OPmovnt,OPSx_pd]:=True;
 used_op[OPPv,OPmovnt,OPSx_ps]:=True;
 used_op[OPPv,OPmovshdup,OPSnone]:=True;
 used_op[OPPv,OPmovsldup,OPSnone]:=True;
 used_op[OPPv,OPmovu,OPSx_pd]:=True;
 used_op[OPPv,OPmovu,OPSx_ps]:=True;
 used_op[OPPv,OPmpsadbw,OPSnone]:=True;
 used_op[OPPv,OPmul,OPSx_pd]:=True;
 used_op[OPPv,OPmul,OPSx_ps]:=True;
 used_op[OPPv,OPmul,OPSx_sd]:=True;
 used_op[OPPv,OPmul,OPSx_ss]:=True;
 used_op[OPPv,OPor,OPSx_pd]:=True;
 used_op[OPPv,OPor,OPSx_ps]:=True;
 used_op[OPPv,OPor,OPSx_sd]:=True;
 used_op[OPPv,OPor,OPSx_ss]:=True;
 used_op[OPPv,OPpabs,OPSx_b]:=True;
 used_op[OPPv,OPpabs,OPSx_d]:=True;
 used_op[OPPv,OPpabs,OPSx_w]:=True;
 used_op[OPPv,OPpackssdw,OPSnone]:=True;
 used_op[OPPv,OPpacksswb,OPSnone]:=True;
 used_op[OPPv,OPpackusdw,OPSnone]:=True;
 used_op[OPPv,OPpackuswb,OPSnone]:=True;
 used_op[OPPv,OPpadd,OPSx_b]:=True;
 used_op[OPPv,OPpadd,OPSx_d]:=True;
 used_op[OPPv,OPpadd,OPSx_q]:=True;
 used_op[OPPv,OPpadd,OPSx_w]:=True;
 used_op[OPPv,OPpadds,OPSx_b]:=True;
 used_op[OPPv,OPpadds,OPSx_w]:=True;
 used_op[OPPv,OPpaddus,OPSx_b]:=True;
 used_op[OPPv,OPpaddus,OPSx_w]:=True;
 used_op[OPPv,OPpalignr,OPSnone]:=True;
 used_op[OPPv,OPpand,OPSnone]:=True;
 used_op[OPPv,OPpandn,OPSnone]:=True;
 used_op[OPPv,OPpavg,OPSx_b]:=True;
 used_op[OPPv,OPpavg,OPSx_w]:=True;
 used_op[OPPv,OPpblendvb,OPSnone]:=True;
 used_op[OPPv,OPpblend,OPSx_d]:=True;
 used_op[OPPv,OPpblend,OPSx_w]:=True;
 used_op[OPPv,OPpclmulqdq,OPSnone]:=True;
 used_op[OPPv,OPpcmpeq,OPSx_b]:=True;
 used_op[OPPv,OPpcmpeq,OPSx_d]:=True;
 used_op[OPPv,OPpcmpeq,OPSx_q]:=True;
 used_op[OPPv,OPpcmpeq,OPSx_w]:=True;
 used_op[OPPv,OPpcmpestri,OPSnone]:=True;
 used_op[OPPv,OPpcmpestrm,OPSnone]:=True;
 used_op[OPPv,OPpcmpgt,OPSx_b]:=True;
 used_op[OPPv,OPpcmpgt,OPSx_d]:=True;
 used_op[OPPv,OPpcmpgt,OPSx_q]:=True;
 used_op[OPPv,OPpcmpgt,OPSx_w]:=True;
 used_op[OPPv,OPpcmpistri,OPSnone]:=True;
 used_op[OPPv,OPpcmpistrm,OPSnone]:=True;
 used_op[OPPv,OPpextr,OPSx_b]:=True;
 used_op[OPPv,OPpextr,OPSx_d]:=True;
 used_op[OPPv,OPpextr,OPSx_q]:=True;
 used_op[OPPv,OPpextr,OPSx_w]:=True;
 used_op[OPPv,OPphadd,OPSx_d]:=True;
 used_op[OPPv,OPphadd,OPSx_w]:=True;
 used_op[OPPv,OPphaddsw,OPSnone]:=True;
 used_op[OPPv,OPphminposuw,OPSnone]:=True;
 used_op[OPPv,OPphsub,OPSx_d]:=True;
 used_op[OPPv,OPphsub,OPSx_w]:=True;
 used_op[OPPv,OPphsubsw,OPSnone]:=True;
 used_op[OPPv,OPpinsr,OPSx_b]:=True;
 used_op[OPPv,OPpinsr,OPSx_d]:=True;
 used_op[OPPv,OPpinsr,OPSx_q]:=True;
 used_op[OPPv,OPpinsr,OPSx_w]:=True;
 used_op[OPPv,OPpmaddubsw,OPSnone]:=True;
 used_op[OPPv,OPpmaddwd,OPSnone]:=True;
 used_op[OPPv,OPpmaxs,OPSx_b]:=True;
 used_op[OPPv,OPpmaxs,OPSx_d]:=True;
 used_op[OPPv,OPpmaxs,OPSx_w]:=True;
 used_op[OPPv,OPpmaxu,OPSx_b]:=True;
 used_op[OPPv,OPpmaxu,OPSx_d]:=True;
 used_op[OPPv,OPpmaxu,OPSx_w]:=True;
 used_op[OPPv,OPpmins,OPSx_b]:=True;
 used_op[OPPv,OPpmins,OPSx_d]:=True;
 used_op[OPPv,OPpmins,OPSx_w]:=True;
 used_op[OPPv,OPpminu,OPSx_b]:=True;
 used_op[OPPv,OPpminu,OPSx_d]:=True;
 used_op[OPPv,OPpminu,OPSx_w]:=True;
 used_op[OPPv,OPpmovmskb,OPSnone]:=True;
 used_op[OPPv,OPpmovsx,OPSv_bw]:=True;
 used_op[OPPv,OPpmovsx,OPSv_bd]:=True;
 used_op[OPPv,OPpmovsx,OPSv_bq]:=True;
 used_op[OPPv,OPpmovsx,OPSv_wd]:=True;
 used_op[OPPv,OPpmovsx,OPSv_wq]:=True;
 used_op[OPPv,OPpmovsx,OPSv_dq]:=True;
 used_op[OPPv,OPpmovzx,OPSv_bw]:=True;
 used_op[OPPv,OPpmovzx,OPSv_bd]:=True;
 used_op[OPPv,OPpmovzx,OPSv_bq]:=True;
 used_op[OPPv,OPpmovzx,OPSv_wd]:=True;
 used_op[OPPv,OPpmovzx,OPSv_wq]:=True;
 used_op[OPPv,OPpmovzx,OPSv_dq]:=True;
 used_op[OPPv,OPpmuldq,OPSnone]:=True;
 used_op[OPPv,OPpmulhrsw,OPSnone]:=True;
 used_op[OPPv,OPpmulhuw,OPSnone]:=True;
 used_op[OPPv,OPpmulhw,OPSnone]:=True;
 used_op[OPPv,OPpmull,OPSx_d]:=True;
 used_op[OPPv,OPpmull,OPSx_w]:=True;
 used_op[OPPv,OPpmuludq,OPSnone]:=True;
 used_op[OPPv,OPpor,OPSnone]:=True;
 used_op[OPPv,OPpsadbw,OPSnone]:=True;
 used_op[OPPv,OPpshuf,OPSx_b]:=True;
 used_op[OPPv,OPpshuf,OPSx_d]:=True;
 used_op[OPPv,OPpshuf,OPSx_hw]:=True;
 used_op[OPPv,OPpshuf,OPSx_lw]:=True;
 used_op[OPPv,OPpsign,OPSx_b]:=True;
 used_op[OPPv,OPpsign,OPSx_d]:=True;
 used_op[OPPv,OPpsign,OPSx_w]:=True;
 used_op[OPPv,OPpsll,OPSx_d]:=True;
 used_op[OPPv,OPpsll,OPSx_dq]:=True;
 used_op[OPPv,OPpsll,OPSx_q]:=True;
 used_op[OPPv,OPpsll,OPSx_w]:=True;
 used_op[OPPv,OPpsra,OPSx_d]:=True;
 used_op[OPPv,OPpsra,OPSx_w]:=True;
 used_op[OPPv,OPpsrl,OPSx_d]:=True;
 used_op[OPPv,OPpsrl,OPSx_dq]:=True;
 used_op[OPPv,OPpsrl,OPSx_q]:=True;
 used_op[OPPv,OPpsrl,OPSx_w]:=True;
 used_op[OPPv,OPpsub,OPSx_b]:=True;
 used_op[OPPv,OPpsub,OPSx_d]:=True;
 used_op[OPPv,OPpsub,OPSx_q]:=True;
 used_op[OPPv,OPpsub,OPSx_w]:=True;
 used_op[OPPv,OPpsubs,OPSx_b]:=True;
 used_op[OPPv,OPpsubs,OPSx_w]:=True;
 used_op[OPPv,OPpsubus,OPSx_b]:=True;
 used_op[OPPv,OPpsubus,OPSx_w]:=True;
 used_op[OPPv,OPptest,OPSnone]:=True;
 used_op[OPPv,OPpunpckhbw,OPSnone]:=True;
 used_op[OPPv,OPpunpckhdq,OPSnone]:=True;
 used_op[OPPv,OPpunpckhqdq,OPSnone]:=True;
 used_op[OPPv,OPpunpckhwd,OPSnone]:=True;
 used_op[OPPv,OPpunpcklbw,OPSnone]:=True;
 used_op[OPPv,OPpunpckldq,OPSnone]:=True;
 used_op[OPPv,OPpunpcklqdq,OPSnone]:=True;
 used_op[OPPv,OPpunpcklwd,OPSnone]:=True;
 used_op[OPPv,OPpxor,OPSnone]:=True;
 used_op[OPPv,OPrcp,OPSx_pd]:=True;
 used_op[OPPv,OPrcp,OPSx_ps]:=True;
 used_op[OPPv,OPrcp,OPSx_sd]:=True;
 used_op[OPPv,OPrcp,OPSx_ss]:=True;
 used_op[OPPv,OPround,OPSx_pd]:=True;
 used_op[OPPv,OPround,OPSx_ps]:=True;
 used_op[OPPv,OPround,OPSx_sd]:=True;
 used_op[OPPv,OPround,OPSx_ss]:=True;
 used_op[OPPv,OPrsqrt,OPSx_pd]:=True;
 used_op[OPPv,OPrsqrt,OPSx_ps]:=True;
 used_op[OPPv,OPrsqrt,OPSx_sd]:=True;
 used_op[OPPv,OPrsqrt,OPSx_ss]:=True;
 used_op[OPPv,OPshuf,OPSx_pd]:=True;
 used_op[OPPv,OPshuf,OPSx_ps]:=True;
 used_op[OPPv,OPsqrt,OPSx_pd]:=True;
 used_op[OPPv,OPsqrt,OPSx_ps]:=True;
 used_op[OPPv,OPsqrt,OPSx_sd]:=True;
 used_op[OPPv,OPsqrt,OPSx_ss]:=True;
 used_op[OPPv,OPstmxcsr,OPSnone]:=True;
 used_op[OPPv,OPsub,OPSx_pd]:=True;
 used_op[OPPv,OPsub,OPSx_ps]:=True;
 used_op[OPPv,OPsub,OPSx_sd]:=True;
 used_op[OPPv,OPsub,OPSx_ss]:=True;
 used_op[OPPv,OPucomi,OPSx_sd]:=True;
 used_op[OPPv,OPucomi,OPSx_ss]:=True;
 used_op[OPPv,OPunpckh,OPSx_pd]:=True;
 used_op[OPPv,OPunpckh,OPSx_ps]:=True;
 used_op[OPPv,OPunpckl,OPSx_pd]:=True;
 used_op[OPPv,OPunpckl,OPSx_ps]:=True;
 used_op[OPPv,OPxor,OPSx_pd]:=True;
 used_op[OPPv,OPxor,OPSx_ps]:=True;
 used_op[OPPv,OPxor,OPSx_sd]:=True;
 used_op[OPPv,OPxor,OPSx_ss]:=True;
end;

function is_sse(x:TOpcodePrefix;y:TOpCode;z:TOpCodeSuffix):Boolean;
begin
 Result:=False;
 if (x=OPPnone) then
 begin
  case y of
   OPaddsub,
   OPcomi,
   OPmaskmov..OPmonitor,
   OPmova,
   OPmovddup..OPmovsldup,
   OPmovu,
   OPmpsadbw,
   OPcvtdq2..OPcvttss2,
   OPextrq,
   OPpabs..OPpandn,
   OPpavg..OPpmuludq,
   OPpor,
   OPpsadbw..OPpunpcklwd,
   OPpxor   ,
   OPdp     ,
   OPblend  ,
   OPblendv ,
   OPround  ,
   OPinsert ,
   OPextract,
   OPlddqu  ,

   OPaesimc,
   OPaesenc,
   OPaesenclast,
   OPaesdec,
   OPaesdeclast,
   OPaeskeygenassist,

   OPxabort..OPxbegin,
   OPxend..OPxgetbv,
   OPxrelease..OPxtest:

    Result:=True;

  end;
 end;
end;

function is_float(x:TOpcodePrefix;y:TOpCode;z:TOpCodeSuffix):Boolean;
begin
 Result:=(y in [OPf2xm1..OPgf2p8mulb]);
end;

function is_avx(x:TOpcodePrefix;y:TOpCode;z:TOpCodeSuffix):Boolean;
begin
 case y of
  OPvalign..OPvzeroupper:Result:=True;
  else
    case x of
     OPPnone:Result:=False;
     OPPv   :Result:=True;
    end;
 end;
end;

function is_bmi(x:TOpcodePrefix;y:TOpCode;z:TOpCodeSuffix):Boolean;
begin
 Result:=False;
 if (x=OPPnone) and (z=OPSnone) then
 begin
  case y of
   OPandn,
   OPbextr,
   OPblsi,
   OPblsmsk,
   OPblsr,
   OPtzcnt:Result:=True;
   else;
  end;
 end;
end;

type
 t_status=record
  g,s,f,v,b:DWORD;
 end;

function percent(a,b:DWORD):Single; inline;
begin
 if (b=0) then
 begin
  Result:=0;
 end else
 begin
  Result:=Single(a*100)/b;
 end;
end;

procedure print_test_jit_cbs(print_ops,print_status:Boolean);
var
 x:TOpcodePrefix;
 y:TOpCode;
 z:TOpCodeSuffix;

 use_status:t_status;
 cbs_status:t_status;

 procedure inc_status(var status:t_status);
 begin
  if is_float(x,y,z) then
  begin
   Inc(status.f);
  end else
  if is_bmi(x,y,z) then
  begin
   Inc(status.b);
  end else
  if is_avx(x,y,z) then
  begin
   Inc(status.v);
  end else
  if is_sse(x,y,z) then
  begin
   Inc(status.s)
  end else
  begin
   Inc(status.g)
  end;
 end;

begin
 use_status:=Default(t_status);
 cbs_status:=Default(t_status);

 if print_status then
 For x:=low(x) to high(x) do
 For y:=low(y) to high(y) do
 For z:=low(z) to high(z) do
 if used_op[x,y,z] then
 begin
  inc_status(use_status);
 end;

 For x:=low(x) to high(x) do
 For y:=low(y) to high(y) do
 For z:=low(z) to high(z) do
 begin
  if used_op[x,y,z] then
  begin
   if (jit_cbs[x,y,z]=nil) then
   begin
    if print_ops then
    begin
     Writeln('Unhandled jit:',x,',',y,',',z);
    end;
   end else
   if print_status then
   begin
    inc_status(cbs_status);
   end;
  end else
  if print_ops then
  if (jit_cbs[x,y,z]<>nil) then
  begin
   Writeln('  handled jit:',x,',',y,',',z);
  end;
 end;

 if print_status then
 begin
  Writeln('[jit status]');
  Writeln('  general:',percent(cbs_status.g,use_status.g):5:2,'%');
  Writeln('    float:',percent(cbs_status.f,use_status.f):5:2,'%');
  Writeln('      sse:',percent(cbs_status.s,use_status.s):5:2,'%');
  Writeln('      avx:',percent(cbs_status.v,use_status.v):5:2,'%');
  Writeln('      bmi:',percent(cbs_status.b,use_status.b):5:2,'%');
  Writeln('    total:',percent(cbs_status.g+cbs_status.s+cbs_status.f+cbs_status.v+use_status.b,
                               use_status.g+use_status.s+use_status.f+use_status.v+use_status.b
                              ):0:2,'%');
 end;

end;

initialization
 load_used;


end.

