diff --git a/sys/jit/kern_jit_ctx.pas b/sys/jit/kern_jit_ctx.pas index 86e79f29..d5128dd1 100644 --- a/sys/jit/kern_jit_ctx.pas +++ b/sys/jit/kern_jit_ctx.pas @@ -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; diff --git a/sys/jit/kern_jit_test.pas b/sys/jit/kern_jit_test.pas index a5123bb0..c2cafe3a 100644 --- a/sys/jit/kern_jit_test.pas +++ b/sys/jit/kern_jit_test.pas @@ -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;