mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
8414c50e81
commit
5d0ae15313
|
@ -3278,7 +3278,8 @@ begin
|
|||
with ctx.builder do
|
||||
case memop of
|
||||
mo_mem_reg,
|
||||
mo_reg_mem:
|
||||
mo_reg_mem,
|
||||
mo_ctx_mem:
|
||||
begin
|
||||
build_lea(ctx,get_lea_id(memop),r_tmp0);
|
||||
mem_size:=ctx.din.Operand[get_lea_id(memop)].Size;
|
||||
|
@ -3326,20 +3327,36 @@ begin
|
|||
begin
|
||||
new1:=new_reg(ctx.din.Operand[2]);
|
||||
|
||||
mem_size:=ctx.din.Operand[1].Size;
|
||||
mem_size:=ctx.din.Operand[1].RegValue[0].ASize;
|
||||
Assert(mem_size<>os0);
|
||||
|
||||
if (not_impl in desc.mem_reg.opt) then
|
||||
if ((his_ro in desc.hint) or (mem_size<>os32)) and
|
||||
(not (not_impl in desc.mem_reg.opt)) then
|
||||
begin
|
||||
mem_size:=ctx.din.Operand[1].Size;
|
||||
Assert(mem_size<>os0);
|
||||
|
||||
i:=GetFrameOffset(ctx.din.Operand[1]);
|
||||
_VM(desc.mem_reg,new1,[r_thrd+i,mem_size]);
|
||||
end else
|
||||
begin
|
||||
mem_size:=ctx.din.Operand[1].Size;
|
||||
Assert(mem_size<>os0);
|
||||
|
||||
new2:=new_reg_size(r_tmp0,ctx.din.Operand[1]);
|
||||
|
||||
if (not (his_wo in desc.hint)) or
|
||||
(his_ro in desc.hint) then
|
||||
begin
|
||||
op_load(ctx,new2,1);
|
||||
end;
|
||||
|
||||
_VV(desc.reg_mem,new2,new1,mem_size); //swapped
|
||||
|
||||
op_save(ctx,1,fix_size(new2));
|
||||
end else
|
||||
begin
|
||||
i:=GetFrameOffset(ctx.din.Operand[1]);
|
||||
_VM(desc.mem_reg,new1,[r_thrd+i,mem_size]);
|
||||
if not (his_ro in desc.hint) then
|
||||
begin
|
||||
op_save(ctx,1,fix_size(new2));
|
||||
end;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
|
|
@ -15,6 +15,11 @@ procedure apply_jit_stat(code_size:Word);
|
|||
|
||||
procedure print_din_stats;
|
||||
|
||||
function is_sse (x:TOpcodePrefix;y:TOpCode;z:TOpCodeSuffix):Boolean;
|
||||
function is_3dnow(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;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
|
@ -1234,6 +1239,23 @@ begin
|
|||
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;
|
||||
|
||||
type
|
||||
t_status=record
|
||||
g,s,d,f,v:DWORD;
|
||||
|
@ -1261,30 +1283,24 @@ var
|
|||
|
||||
procedure inc_status(var status:t_status);
|
||||
begin
|
||||
if (y in [OPf2xm1..OPgf2p8mulb]) then
|
||||
if is_float(x,y,z) then
|
||||
begin
|
||||
Inc(status.f);
|
||||
end else
|
||||
case y of
|
||||
OPvalign..OPvzeroupper:Inc(status.v);
|
||||
else
|
||||
case x of
|
||||
OPPnone:
|
||||
begin
|
||||
if is_3dnow(x,y,z) then
|
||||
begin
|
||||
Inc(status.d)
|
||||
end else
|
||||
if is_sse(x,y,z) then
|
||||
begin
|
||||
Inc(status.s)
|
||||
end else
|
||||
begin
|
||||
Inc(status.g)
|
||||
end;
|
||||
end;
|
||||
OPPv :Inc(status.v);
|
||||
end;
|
||||
if is_avx(x,y,z) then
|
||||
begin
|
||||
Inc(status.v);
|
||||
end else
|
||||
if is_3dnow(x,y,z) then
|
||||
begin
|
||||
Inc(status.d)
|
||||
end else
|
||||
if is_sse(x,y,z) then
|
||||
begin
|
||||
Inc(status.s)
|
||||
end else
|
||||
begin
|
||||
Inc(status.g)
|
||||
end;
|
||||
end;
|
||||
|
||||
|
@ -1329,14 +1345,14 @@ begin
|
|||
if print_status then
|
||||
begin
|
||||
Writeln('[jit status]');
|
||||
Writeln(' general:',percent(cbs_status.g,use_status.g):5:2,'%');
|
||||
Writeln(' x87 float:',percent(cbs_status.f,use_status.f):5:2,'%');
|
||||
Writeln(' 3DNow:',percent(cbs_status.d,use_status.d):5:2,'%');
|
||||
Writeln(' sse:',percent(cbs_status.s,use_status.s):5:2,'%');
|
||||
Writeln(' vex encoding:',percent(cbs_status.v,use_status.v):5:2,'%');
|
||||
Writeln(' total:',percent(cbs_status.g+cbs_status.s+use_status.d+cbs_status.f+cbs_status.v,
|
||||
use_status.g+use_status.s+use_status.d+use_status.f+use_status.v
|
||||
):0:2,'%');
|
||||
Writeln(' general:',percent(cbs_status.g,use_status.g):5:2,'%');
|
||||
Writeln(' float:',percent(cbs_status.f,use_status.f):5:2,'%');
|
||||
Writeln(' 3DNow:',percent(cbs_status.d,use_status.d):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(' total:',percent(cbs_status.g+cbs_status.s+use_status.d+cbs_status.f+cbs_status.v,
|
||||
use_status.g+use_status.s+use_status.d+use_status.f+use_status.v
|
||||
):0:2,'%');
|
||||
end;
|
||||
|
||||
end;
|
||||
|
|
Loading…
Reference in New Issue