* 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:
nickysn 2015-10-30 21:27:35 +00:00
parent 998cdbfe79
commit a55b728d34
2 changed files with 33 additions and 1 deletions

View File

@ -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

View File

@ -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
*****************************************************************************}