mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
3e7eddba96
commit
0fb63e0aec
|
@ -1568,6 +1568,8 @@ var
|
|||
link_next:t_jit_i_link;
|
||||
|
||||
node,node_curr,node_next:p_jit_instruction;
|
||||
|
||||
i:Integer;
|
||||
begin
|
||||
if (cmDontScanRipRel in ctx.modes) then
|
||||
begin
|
||||
|
@ -1642,6 +1644,8 @@ begin
|
|||
|
||||
dis.Disassemble(dm64,ptr,din);
|
||||
|
||||
apply_din_stat(din,(ptr-ctx.code));
|
||||
|
||||
ctx.ptr_next:=ctx.ptr_curr+(ptr-ctx.code);
|
||||
|
||||
case din.OpCode.Opcode of
|
||||
|
@ -1810,7 +1814,8 @@ begin
|
|||
link_next:=ctx.builder.get_curr_label.after;
|
||||
node_next:=link_next._node;
|
||||
|
||||
{
|
||||
//////
|
||||
i:=0;
|
||||
if (node_curr<>node_next) and
|
||||
(node_curr<>nil) then
|
||||
begin
|
||||
|
@ -1819,17 +1824,23 @@ begin
|
|||
while (node<>nil) do
|
||||
begin
|
||||
|
||||
i:=i+node^.ASize;
|
||||
|
||||
{
|
||||
if not test_disassemble(@node^.AData,node^.ASize) then
|
||||
begin
|
||||
print_asm:=True;
|
||||
Break;
|
||||
end;
|
||||
}
|
||||
|
||||
|
||||
node:=TAILQ_NEXT(node,@node^.entry);
|
||||
end;
|
||||
end;
|
||||
}
|
||||
|
||||
apply_jit_stat(i);
|
||||
//////
|
||||
|
||||
{
|
||||
if print_asm then
|
||||
|
@ -1986,6 +1997,7 @@ begin
|
|||
|
||||
ctx.Free;
|
||||
|
||||
//print_din_stats;
|
||||
end;
|
||||
|
||||
initialization
|
||||
|
|
|
@ -785,6 +785,9 @@ begin
|
|||
jit_cbs[OPPnone,OPcvtps2 ,OPSx_dq]:=@op_reg_mem_wo;
|
||||
jit_cbs[OPPnone,OPcvtps2 ,OPSx_pi]:=@op_reg_mem_wo;
|
||||
|
||||
jit_cbs[OPPnone,OPcvtpi2 ,OPSx_pd]:=@op_reg_mem_wo;
|
||||
jit_cbs[OPPnone,OPcvtpi2 ,OPSx_ps]:=@op_reg_mem_wo;
|
||||
|
||||
jit_cbs[OPPnone,OPsqrt,OPSx_ps]:=@op_reg_mem_wo;
|
||||
jit_cbs[OPPnone,OPsqrt,OPSx_pd]:=@op_reg_mem_wo;
|
||||
jit_cbs[OPPnone,OPsqrt,OPSx_sd]:=@op_reg_mem_wo;
|
||||
|
|
|
@ -5,14 +5,130 @@ unit kern_jit_test;
|
|||
|
||||
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;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
x86_fpdbgdisas,
|
||||
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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue