mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-17 06:20:57 +02:00
* reorganize Tcgx86.g_concatcopy
This commit is contained in:
parent
b826ad8b7e
commit
e29d1ecda9
@ -2759,14 +2759,14 @@ unit cgx86;
|
||||
{$endif}
|
||||
|
||||
type
|
||||
copymode=(copy_move,copy_mmx,copy_string,copy_mm,copy_avx,copy_avx512);
|
||||
tcopymode=(copy_mov,copy_mmx,copy_string,copy_mm,copy_avx,copy_avx512,copy_fpc_move);
|
||||
|
||||
var srcref,dstref,tmpref:Treference;
|
||||
r,r0,r1,r2,r3:Tregister;
|
||||
helpsize:tcgint;
|
||||
copysize:byte;
|
||||
cgsize:Tcgsize;
|
||||
cm:copymode;
|
||||
cm:tcopymode;
|
||||
saved_ds,saved_es: Boolean;
|
||||
hlist: TAsmList;
|
||||
|
||||
@ -2813,7 +2813,7 @@ unit cgx86;
|
||||
dstref.base:=r;
|
||||
end;
|
||||
{$endif x86_64}
|
||||
cm:=copy_move;
|
||||
cm:=copy_mov;
|
||||
helpsize:=3*sizeof(aword);
|
||||
if cs_opt_size in current_settings.optimizerswitches then
|
||||
helpsize:=2*sizeof(aword);
|
||||
@ -2848,6 +2848,12 @@ unit cgx86;
|
||||
else
|
||||
if len>helpsize then
|
||||
cm:=copy_string;
|
||||
|
||||
if (cm=copy_string) and not(CPUX86_HINT_FAST_SHORT_REP_MOVS in cpu_optimization_hints[current_settings.optimizecputype]) and
|
||||
{ we can use the move variant only if the subroutine does another call }
|
||||
(pi_do_call in current_procinfo.flags) then
|
||||
cm:=copy_fpc_move;
|
||||
|
||||
if (cs_opt_size in current_settings.optimizerswitches) and
|
||||
not((len<=16) and (cm in [copy_mmx,copy_mm,copy_avx])) and
|
||||
not(len in copy_len_sizes) then
|
||||
@ -2859,7 +2865,7 @@ unit cgx86;
|
||||
cm:=copy_string;
|
||||
{$endif not i8086}
|
||||
case cm of
|
||||
copy_move:
|
||||
copy_mov:
|
||||
begin
|
||||
copysize:=sizeof(aint);
|
||||
cgsize:=int_cgsize(copysize);
|
||||
@ -3047,11 +3053,9 @@ unit cgx86;
|
||||
end;
|
||||
list.concatList(hlist);
|
||||
hlist.free;
|
||||
end
|
||||
else if (CPUX86_HINT_FAST_SHORT_REP_MOVS in cpu_optimization_hints[current_settings.optimizecputype]) or
|
||||
{ we can use the move variant only if the subroutine does another call }
|
||||
not(pi_do_call in current_procinfo.flags) then
|
||||
{ copy_string, should be a good fallback in case of unhandled if short rep movs are fast }
|
||||
end;
|
||||
|
||||
copy_string:
|
||||
begin
|
||||
getcpuregister(list,REGDI);
|
||||
if (dstref.segment=NR_NO) and
|
||||
|
Loading…
Reference in New Issue
Block a user