mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-03 02:10:22 +02:00
+ adapted and enabled the x86 specific abs() code generation for i8086, because
it generates slightly better code, than the generic implementation git-svn-id: trunk@37161 -
This commit is contained in:
parent
8bb6dc12b1
commit
16d7eefbca
@ -66,9 +66,7 @@ interface
|
|||||||
|
|
||||||
procedure second_prefetch;override;
|
procedure second_prefetch;override;
|
||||||
|
|
||||||
{$ifndef i8086}
|
|
||||||
procedure second_abs_long;override;
|
procedure second_abs_long;override;
|
||||||
{$endif not i8086}
|
|
||||||
procedure second_popcnt;override;
|
procedure second_popcnt;override;
|
||||||
procedure second_fma;override;
|
procedure second_fma;override;
|
||||||
procedure second_frac_real;override;
|
procedure second_frac_real;override;
|
||||||
@ -653,14 +651,13 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
{$ifndef i8086}
|
|
||||||
procedure tx86inlinenode.second_abs_long;
|
procedure tx86inlinenode.second_abs_long;
|
||||||
var
|
var
|
||||||
hregister : tregister;
|
hregister : tregister;
|
||||||
opsize : tcgsize;
|
opsize : tcgsize;
|
||||||
hp : taicpu;
|
hp : taicpu;
|
||||||
begin
|
begin
|
||||||
{$ifdef i386}
|
{$if defined(i8086) or defined(i386)}
|
||||||
if not(CPUX86_HAS_CMOV in cpu_capabilities[current_settings.cputype]) then
|
if not(CPUX86_HAS_CMOV in cpu_capabilities[current_settings.cputype]) then
|
||||||
begin
|
begin
|
||||||
opsize:=def_cgsize(left.resultdef);
|
opsize:=def_cgsize(left.resultdef);
|
||||||
@ -668,13 +665,13 @@ implementation
|
|||||||
hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,left.resultdef,false);
|
hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,left.resultdef,false);
|
||||||
location:=left.location;
|
location:=left.location;
|
||||||
location.register:=cg.getintregister(current_asmdata.CurrAsmList,opsize);
|
location.register:=cg.getintregister(current_asmdata.CurrAsmList,opsize);
|
||||||
emit_reg_reg(A_MOV,S_L,left.location.register,location.register);
|
cg.a_load_reg_reg(current_asmdata.CurrAsmList,opsize,opsize,left.location.register,location.register);
|
||||||
emit_const_reg(A_SAR,tcgsize2opsize[opsize],31,left.location.register);
|
cg.a_op_const_reg(current_asmdata.CurrAsmList,OP_SAR,opsize,tcgsize2size[opsize]*8-1,left.location.register);
|
||||||
emit_reg_reg(A_XOR,S_L,left.location.register,location.register);
|
cg.a_op_reg_reg(current_asmdata.CurrAsmList,OP_XOR,opsize,left.location.register,location.register);
|
||||||
emit_reg_reg(A_SUB,S_L,left.location.register,location.register);
|
cg.a_op_reg_reg(current_asmdata.CurrAsmList,OP_SUB,opsize,left.location.register,location.register);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
{$endif i386}
|
{$endif i8086 or i386}
|
||||||
begin
|
begin
|
||||||
opsize:=def_cgsize(left.resultdef);
|
opsize:=def_cgsize(left.resultdef);
|
||||||
secondpass(left);
|
secondpass(left);
|
||||||
@ -690,7 +687,6 @@ implementation
|
|||||||
current_asmdata.CurrAsmList.concat(hp);
|
current_asmdata.CurrAsmList.concat(hp);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
{$endif not i8086}
|
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
INCLUDE/EXCLUDE GENERIC HANDLING
|
INCLUDE/EXCLUDE GENERIC HANDLING
|
||||||
|
Loading…
Reference in New Issue
Block a user