mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-08 09:28:19 +02:00
* optimizations for ofs() on i8086 to load only the offset (in a temporary
register), without the segment git-svn-id: trunk@32211 -
This commit is contained in:
parent
998cdbfe79
commit
a55b728d34
@ -34,6 +34,7 @@ interface
|
||||
|
||||
t8086typeconvnode = class(tx86typeconvnode)
|
||||
protected
|
||||
function typecheck_int_to_int: tnode;override;
|
||||
function typecheck_proc_to_procvar: tnode;override;
|
||||
procedure second_proc_to_procvar;override;
|
||||
end;
|
||||
@ -46,11 +47,22 @@ implementation
|
||||
aasmbase,aasmtai,aasmdata,aasmcpu,
|
||||
symconst,symdef,symcpu,
|
||||
cgbase,cga,procinfo,pass_1,pass_2,
|
||||
ncon,ncal,ncnv,
|
||||
ncon,ncal,ncnv,nmem,n8086mem,
|
||||
cpubase,cpuinfo,
|
||||
cgutils,cgobj,hlcgobj,cgx86,ncgutil,
|
||||
tgobj;
|
||||
|
||||
function t8086typeconvnode.typecheck_int_to_int: tnode;
|
||||
begin
|
||||
Result:=inherited typecheck_int_to_int;
|
||||
if (is_16bitint(totypedef) or is_8bitint(totypedef)) and (left.nodetype=addrn) then
|
||||
begin
|
||||
if left.nodetype=addrn then
|
||||
ti8086addrnode(left).get_offset_only:=true;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function t8086typeconvnode.typecheck_proc_to_procvar: tnode;
|
||||
begin
|
||||
if (current_settings.x86memorymodel in x86_far_code_models) and
|
||||
|
@ -36,6 +36,9 @@ interface
|
||||
protected
|
||||
procedure set_absvarsym_resultdef; override;
|
||||
function typecheck_non_proc(realsource: tnode; out res: tnode): boolean; override;
|
||||
procedure pass_generate_code;override;
|
||||
public
|
||||
get_offset_only: boolean;
|
||||
end;
|
||||
|
||||
ti8086derefnode = class(tx86derefnode)
|
||||
@ -91,6 +94,23 @@ implementation
|
||||
result:=inherited;
|
||||
end;
|
||||
|
||||
|
||||
procedure ti8086addrnode.pass_generate_code;
|
||||
begin
|
||||
if get_offset_only then
|
||||
begin
|
||||
secondpass(left);
|
||||
|
||||
location_reset(location,LOC_REGISTER,OS_16);
|
||||
location.register:=hlcg.getaddressregister(current_asmdata.CurrAsmList,voidnearpointertype);
|
||||
if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
|
||||
internalerror(2015103001);
|
||||
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.resultdef,voidnearpointertype,left.location.reference,location.register);
|
||||
end
|
||||
else
|
||||
inherited;
|
||||
end;
|
||||
|
||||
{*****************************************************************************
|
||||
TI8086DEREFNODE
|
||||
*****************************************************************************}
|
||||
|
Loading…
Reference in New Issue
Block a user