FPPS4/sys/jit/kern_jit_test.pas

1336 lines
45 KiB
Plaintext

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.