* regvar fixes from Peter

This commit is contained in:
Jonas Maebe 2004-10-06 19:26:50 +00:00
parent 0cf348b3df
commit 2b030488b2
3 changed files with 22 additions and 10 deletions

View File

@ -267,6 +267,10 @@ implementation
{ reference in nested procedures, variable needs to be in memory } { reference in nested procedures, variable needs to be in memory }
make_not_regable(self); make_not_regable(self);
end; end;
{ static variables referenced in procedures, variable needs to be in memory }
if (symtable.symtabletype=staticsymtable) and
(symtable.symtablelevel<>current_procinfo.procdef.parast.symtablelevel) then
make_not_regable(self);
{ fix self type which is declared as voidpointer in the { fix self type which is declared as voidpointer in the
definition } definition }
if vo_is_self in tvarsym(symtableentry).varoptions then if vo_is_self in tvarsym(symtableentry).varoptions then
@ -1141,7 +1145,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.129 2004-09-26 17:45:30 peter Revision 1.130 2004-10-06 19:26:50 jonas
* regvar fixes from Peter
Revision 1.129 2004/09/26 17:45:30 peter
* simple regvar support, not yet finished * simple regvar support, not yet finished
Revision 1.128 2004/06/20 08:55:29 florian Revision 1.128 2004/06/20 08:55:29 florian

View File

@ -1375,17 +1375,12 @@ implementation
procedure tvarsym.ppuwrite(ppufile:tcompilerppufile); procedure tvarsym.ppuwrite(ppufile:tcompilerppufile);
var
hvo : tvaroptions;
begin begin
inherited writesym(ppufile); inherited writesym(ppufile);
ppufile.putbyte(byte(varspez)); ppufile.putbyte(byte(varspez));
ppufile.putlongint(fieldoffset); ppufile.putlongint(fieldoffset);
ppufile.puttype(vartype); ppufile.puttype(vartype);
{ symbols which are load are never candidates for a register, ppufile.putsmallset(varoptions);
turn off the regable }
hvo:=varoptions-[vo_regable,vo_fpuregable];
ppufile.putsmallset(hvo);
if [vo_is_C_var,vo_is_dll_var]*varoptions<>[] then if [vo_is_C_var,vo_is_dll_var]*varoptions<>[] then
ppufile.putstring(_mangledname^); ppufile.putstring(_mangledname^);
ppufile.writeentry(ibvarsym); ppufile.writeentry(ibvarsym);
@ -2216,7 +2211,10 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.178 2004-10-01 15:22:22 peter Revision 1.179 2004-10-06 19:26:50 jonas
* regvar fixes from Peter
Revision 1.178 2004/10/01 15:22:22 peter
* don't add stabs for register variables * don't add stabs for register variables
Revision 1.177 2004/09/26 17:45:30 peter Revision 1.177 2004/09/26 17:45:30 peter

View File

@ -1632,13 +1632,17 @@ unit cgx86;
var var
href : treference; href : treference;
r : integer; r : integer;
hreg : tregister;
begin begin
{ Copy registers from temp } { Copy registers from temp }
href:=current_procinfo.save_regs_ref; href:=current_procinfo.save_regs_ref;
for r:=low(saved_standard_registers) to high(saved_standard_registers) do for r:=low(saved_standard_registers) to high(saved_standard_registers) do
if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then
begin begin
a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,newreg(R_INTREGISTER,saved_standard_registers[r],R_SUBWHOLE)); hreg:=newreg(R_INTREGISTER,saved_standard_registers[r],R_SUBWHOLE);
{ Allocate register so the optimizer does remove the load }
a_reg_alloc(list,hreg);
a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,hreg);
inc(href.offset,sizeof(aint)); inc(href.offset,sizeof(aint));
end; end;
tg.UnGetTemp(list,current_procinfo.save_regs_ref); tg.UnGetTemp(list,current_procinfo.save_regs_ref);
@ -1675,7 +1679,10 @@ unit cgx86;
end. end.
{ {
$Log$ $Log$
Revision 1.128 2004-10-05 20:41:02 peter Revision 1.129 2004-10-06 19:27:35 jonas
* regvar fixes from Peter
Revision 1.128 2004/10/05 20:41:02 peter
* more spilling rewrites * more spilling rewrites
Revision 1.127 2004/10/04 20:46:22 peter Revision 1.127 2004/10/04 20:46:22 peter