mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-08 01:08:07 +02:00
* fixed several regvar related bugs for non-i386. make cycle with -Or now
works for ppc
This commit is contained in:
parent
fefdcc6331
commit
0357f71e14
@ -180,6 +180,7 @@ implementation
|
||||
|
||||
var
|
||||
hl,otlabel,oflabel : tasmlabel;
|
||||
{$ifdef i386}
|
||||
org_regvar_loaded_other,
|
||||
then_regvar_loaded_other,
|
||||
else_regvar_loaded_other : regvarother_booleanarray;
|
||||
@ -189,6 +190,7 @@ implementation
|
||||
org_list,
|
||||
then_list,
|
||||
else_list : taasmoutput;
|
||||
{$endif i386}
|
||||
|
||||
begin
|
||||
location_reset(location,LOC_VOID,OS_NO);
|
||||
@ -202,7 +204,7 @@ implementation
|
||||
{$endif}
|
||||
secondpass(left);
|
||||
|
||||
|
||||
{$ifdef i386}
|
||||
{ save regvars loaded in the beginning so that we can restore them }
|
||||
{ when processing the else-block }
|
||||
if cs_regalloc in aktglobalswitches then
|
||||
@ -210,13 +212,16 @@ implementation
|
||||
org_list := exprasmlist;
|
||||
exprasmlist := taasmoutput.create;
|
||||
end;
|
||||
{$endif i386}
|
||||
maketojumpbool(exprasmlist,left,lr_dont_load_regvars);
|
||||
|
||||
{$ifdef i386}
|
||||
if cs_regalloc in aktglobalswitches then
|
||||
begin
|
||||
org_regvar_loaded_int := rg.regvar_loaded_int;
|
||||
org_regvar_loaded_other := rg.regvar_loaded_other;
|
||||
end;
|
||||
{$endif i386}
|
||||
|
||||
if assigned(right) then
|
||||
begin
|
||||
@ -227,6 +232,7 @@ implementation
|
||||
secondpass(right);
|
||||
end;
|
||||
|
||||
{$ifdef i386}
|
||||
{ save current asmlist (previous instructions + then-block) and }
|
||||
{ loaded regvar state and create new clean ones }
|
||||
if cs_regalloc in aktglobalswitches then
|
||||
@ -238,6 +244,7 @@ implementation
|
||||
then_list := exprasmlist;
|
||||
exprasmlist := taasmoutput.create;
|
||||
end;
|
||||
{$endif i386}
|
||||
|
||||
if assigned(t1) then
|
||||
begin
|
||||
@ -245,10 +252,15 @@ implementation
|
||||
begin
|
||||
objectlibrary.getlabel(hl);
|
||||
{ do go back to if line !! }
|
||||
{$ifdef i386}
|
||||
if not(cs_regalloc in aktglobalswitches) then
|
||||
{$endif i386}
|
||||
aktfilepos:=exprasmList.getlasttaifilepos^
|
||||
{$ifdef i386}
|
||||
else
|
||||
aktfilepos:=then_list.getlasttaifilepos^;
|
||||
aktfilepos:=then_list.getlasttaifilepos^
|
||||
{$endif i386}
|
||||
;
|
||||
cg.a_jmp_always(exprasmlist,hl);
|
||||
end;
|
||||
cg.a_label(exprasmlist,falselabel);
|
||||
@ -256,6 +268,7 @@ implementation
|
||||
rg.cleartempgen;
|
||||
{$endif}
|
||||
secondpass(t1);
|
||||
{$ifdef i386}
|
||||
{ save current asmlist (previous instructions + else-block) }
|
||||
{ and loaded regvar state and create a new clean list }
|
||||
if cs_regalloc in aktglobalswitches then
|
||||
@ -265,11 +278,13 @@ implementation
|
||||
else_list := exprasmlist;
|
||||
exprasmlist := taasmoutput.create;
|
||||
end;
|
||||
{$endif i386}
|
||||
if assigned(right) then
|
||||
cg.a_label(exprasmlist,hl);
|
||||
end
|
||||
else
|
||||
begin
|
||||
{$ifdef i386}
|
||||
if cs_regalloc in aktglobalswitches then
|
||||
begin
|
||||
else_regvar_loaded_int := rg.regvar_loaded_int;
|
||||
@ -277,6 +292,7 @@ implementation
|
||||
else_list := exprasmlist;
|
||||
exprasmlist := taasmoutput.create;
|
||||
end;
|
||||
{$endif i386}
|
||||
cg.a_label(exprasmlist,falselabel);
|
||||
end;
|
||||
if not(assigned(right)) then
|
||||
@ -284,6 +300,7 @@ implementation
|
||||
cg.a_label(exprasmlist,truelabel);
|
||||
end;
|
||||
|
||||
{$ifdef i386}
|
||||
if cs_regalloc in aktglobalswitches then
|
||||
begin
|
||||
{ add loads of regvars at the end of the then- and else-blocks }
|
||||
@ -316,6 +333,7 @@ implementation
|
||||
exprasmlist.free;
|
||||
exprasmlist := org_list;
|
||||
end;
|
||||
{$endif i386}
|
||||
truelabel:=otlabel;
|
||||
falselabel:=oflabel;
|
||||
end;
|
||||
@ -1403,7 +1421,11 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.64 2003-05-26 21:17:17 peter
|
||||
Revision 1.65 2003-05-30 18:55:21 jonas
|
||||
* fixed several regvar related bugs for non-i386. make cycle with -Or now
|
||||
works for ppc
|
||||
|
||||
Revision 1.64 2003/05/26 21:17:17 peter
|
||||
* procinlinenode removed
|
||||
* aktexit2label removed, fast exit removed
|
||||
+ tcallnode.inlined_pass_2 added
|
||||
|
@ -40,10 +40,12 @@ interface
|
||||
procedure load_regvar_reg(asml: TAAsmoutput; reg: tregister);
|
||||
procedure load_all_regvars(asml: TAAsmoutput);
|
||||
|
||||
{$ifdef i386}
|
||||
procedure sync_regvars_other(list1, list2: taasmoutput; const regvarsloaded1,
|
||||
regvarsloaded2: regvarother_booleanarray);
|
||||
procedure sync_regvars_int(list1, list2: taasmoutput; const regvarsloaded1,
|
||||
regvarsloaded2: Tsupregset);
|
||||
{$endif i386}
|
||||
|
||||
implementation
|
||||
|
||||
@ -154,7 +156,7 @@ implementation
|
||||
new(regvarinfo);
|
||||
fillchar(regvarinfo^,sizeof(regvarinfo^),0);
|
||||
current_procdef.regvarinfo := regvarinfo;
|
||||
if (p.registers32<4) then
|
||||
if (p.registers32<maxvarregs) then
|
||||
begin
|
||||
parasym:=false;
|
||||
symtablestack.foreach_static({$ifdef FPCPROCVAR}@{$endif}searchregvars,@parasym);
|
||||
@ -197,8 +199,10 @@ implementation
|
||||
|
||||
regvarinfo^.regvars[i].reg.enum:=R_INTREGISTER;
|
||||
regvarinfo^.regvars[i].reg.number:=(varregs[i] shl 8) or cgsize2subreg(siz);
|
||||
{$ifdef i386}
|
||||
{ procedure uses this register }
|
||||
include(rg.usedintinproc,varregs[i]);
|
||||
{$endif i386}
|
||||
end
|
||||
else
|
||||
begin
|
||||
@ -253,6 +257,7 @@ implementation
|
||||
r.enum:=R_ST0;
|
||||
regvarinfo^.fpuregvars[i].reg:=trgcpu(rg).correct_fpuregister(r,i);
|
||||
{$else i386}
|
||||
regvarinfo^.fpuregvars[i].reg.enum:=fpuvarregs[i];
|
||||
rg.makeregvarother(regvarinfo^.fpuregvars[i].reg);
|
||||
{$endif i386}
|
||||
end;
|
||||
@ -271,6 +276,7 @@ implementation
|
||||
regvarinfo: pregvarinfo;
|
||||
vsym: tvarsym;
|
||||
begin
|
||||
{$ifdef i386}
|
||||
regvarinfo := pregvarinfo(current_procdef.regvarinfo);
|
||||
if not assigned(regvarinfo) then
|
||||
exit;
|
||||
@ -321,6 +327,7 @@ implementation
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
{$endif i386}
|
||||
end;
|
||||
|
||||
procedure load_regvar(asml: TAAsmoutput; vsym: tvarsym);
|
||||
@ -330,6 +337,9 @@ implementation
|
||||
r,
|
||||
reg : tregister;
|
||||
begin
|
||||
{$ifndef i386}
|
||||
exit;
|
||||
{$endif i386}
|
||||
reg:=vsym.reg;
|
||||
if reg.enum=R_INTREGISTER then
|
||||
begin
|
||||
@ -472,7 +482,7 @@ implementation
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
{$ifdef i386}
|
||||
procedure sync_regvars_other(list1, list2: taasmoutput; const regvarsloaded1,
|
||||
regvarsloaded2: regvarother_booleanarray);
|
||||
var
|
||||
@ -510,6 +520,7 @@ implementation
|
||||
load_regvar_reg(list1,r);
|
||||
end;
|
||||
end;
|
||||
{$endif i386}
|
||||
|
||||
|
||||
procedure cleanup_regvars(asml: TAAsmoutput);
|
||||
@ -544,7 +555,7 @@ implementation
|
||||
end
|
||||
else
|
||||
begin
|
||||
reg.number:=(r.number and not $ff) or cgsize2subreg(OS_INT);
|
||||
reg.number:=(reg.number and not $ff) or cgsize2subreg(OS_INT);
|
||||
r:=reg;
|
||||
convert_register_to_enum(r);
|
||||
if r.enum>lastreg then
|
||||
@ -561,7 +572,11 @@ end.
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.51 2003-05-23 14:27:35 peter
|
||||
Revision 1.52 2003-05-30 18:55:21 jonas
|
||||
* fixed several regvar related bugs for non-i386. make cycle with -Or now
|
||||
works for ppc
|
||||
|
||||
Revision 1.51 2003/05/23 14:27:35 peter
|
||||
* remove some unit dependencies
|
||||
* current_procinfo changes to store more info
|
||||
|
||||
|
@ -1109,11 +1109,13 @@ unit rgobj;
|
||||
var regi:Tsuperregister;
|
||||
|
||||
begin
|
||||
{$ifdef i386}
|
||||
for regi:=firstsaveintreg to lastsaveintreg do
|
||||
begin
|
||||
if (regi in s) then
|
||||
inc(reg_pushes_int[regi],t_times*2);
|
||||
end;
|
||||
{$endif i386}
|
||||
end;
|
||||
|
||||
procedure trgobj.incrementotherregisterpushed(const s:Tregisterset);
|
||||
@ -1122,6 +1124,7 @@ unit rgobj;
|
||||
regi : Toldregister;
|
||||
|
||||
begin
|
||||
{$ifdef i386}
|
||||
if firstsavefpureg <> R_NO then
|
||||
for regi:=firstsavefpureg to lastsavefpureg do
|
||||
begin
|
||||
@ -1134,6 +1137,7 @@ unit rgobj;
|
||||
if (regi in s) then
|
||||
inc(reg_pushes_other[regi],t_times*2);
|
||||
end;
|
||||
{$endif i386}
|
||||
end;
|
||||
|
||||
|
||||
@ -1169,9 +1173,12 @@ unit rgobj;
|
||||
{$ifndef newra}
|
||||
dec(countunusedregsint);
|
||||
{$endif}
|
||||
exclude(usableregsint,reg shl 8);
|
||||
exclude(unusedregsint,reg shl 8);
|
||||
exclude(usableregsint,reg);
|
||||
exclude(unusedregsint,reg);
|
||||
include(is_reg_var_int,reg);
|
||||
{$ifndef i386}
|
||||
include(usedintbyproc,reg);
|
||||
{$endif not i386}
|
||||
end;
|
||||
|
||||
procedure trgobj.makeregvarother(reg: tregister);
|
||||
@ -1186,6 +1193,9 @@ unit rgobj;
|
||||
dec(countunusedregsfpu);
|
||||
exclude(usableregsfpu,reg.enum);
|
||||
exclude(unusedregsfpu,reg.enum);
|
||||
{$ifndef i386}
|
||||
include(usedbyproc,reg.enum);
|
||||
{$endif not i386}
|
||||
end
|
||||
else if reg.enum in mmregs then
|
||||
begin
|
||||
@ -1193,6 +1203,9 @@ unit rgobj;
|
||||
dec(countunusedregsmm);
|
||||
exclude(usableregsmm,reg.enum);
|
||||
exclude(unusedregsmm,reg.enum);
|
||||
{$ifndef i386}
|
||||
include(usedbyproc,reg.enum);
|
||||
{$endif not i386}
|
||||
end;
|
||||
is_reg_var_other[reg.enum]:=true;
|
||||
end;
|
||||
@ -2038,7 +2051,11 @@ end.
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.45 2003-05-30 12:36:13 jonas
|
||||
Revision 1.46 2003-05-30 18:55:21 jonas
|
||||
* fixed several regvar related bugs for non-i386. make cycle with -Or now
|
||||
works for ppc
|
||||
|
||||
Revision 1.45 2003/05/30 12:36:13 jonas
|
||||
* use as little different registers on the ppc until newra is released,
|
||||
since every used register must be saved
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user