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.