* fixed another problem with readln(<floating point register variable>);

* the register allocator takes now care of necessary pushes/pops for
    readln/writeln
This commit is contained in:
florian 2000-04-02 18:30:11 +00:00
parent e6f4922ad6
commit ff5b72e3bd
5 changed files with 60 additions and 19 deletions

View File

@ -101,7 +101,12 @@ implementation
emit_reg(op,opsize,correct_fpuregister(dest^.location.register,fpuvaroffset+1));
end
else
floatstore(PFloatDef(dest^.resulttype)^.typ,dest^.location.reference);
begin
floatstore(PFloatDef(dest^.resulttype)^.typ,dest^.location.reference);
{ floatstore decrements the fpu var offset }
{ but in fact we didn't increment it }
inc(fpuvaroffset);
end;
orddef:
begin
if is_64bitint(dest^.resulttype) then
@ -1520,7 +1525,12 @@ implementation
end.
{
$Log$
Revision 1.97 2000-04-02 17:47:47 florian
Revision 1.98 2000-04-02 18:30:11 florian
* fixed another problem with readln(<floating point register variable>);
* the register allocator takes now care of necessary pushes/pops for
readln/writeln
Revision 1.97 2000/04/02 17:47:47 florian
* readln(r); works now, if r is a fpu register variable
Revision 1.96 2000/03/31 22:56:46 pierre

View File

@ -132,9 +132,6 @@ implementation
{ Boolean, wenn eine loadn kein Assembler erzeugt hat }
simple_loadn : boolean;
{ tries to hold the amount of times which the current tree is processed }
t_times : longint;
{ true, if an error while code generation occurs }
codegenerror : boolean;
@ -160,7 +157,6 @@ implementation
procedure codegen_newmodule;
procedure codegen_newprocedure;
implementation
uses
@ -449,7 +445,12 @@ end.
{
$Log$
Revision 1.57 2000-02-18 20:53:14 pierre
Revision 1.58 2000-04-02 18:30:12 florian
* fixed another problem with readln(<floating point register variable>);
* the register allocator takes now care of necessary pushes/pops for
readln/writeln
Revision 1.57 2000/02/18 20:53:14 pierre
* fixes a stabs problem for functions
+ includes a stabs local var for with statements
the name is with in lowercase followed by an index

View File

@ -503,8 +503,7 @@ implementation
{$ifndef newcg}
{ calc the correture value for the register }
{$ifdef i386}
for regi:=R_EAX to R_EDI do
inc(reg_pushes[regi],t_times*2);
incrementregisterpushed($ff);
{$endif}
{$ifdef m68k}
for regi:=R_D0 to R_A6 do
@ -1063,11 +1062,7 @@ implementation
end;
{$ifndef newcg}
{$ifdef i386}
for regi:=R_EAX to R_EDI do
begin
if (pprocdef(p^.procdefinition)^.usedregisters and ($80 shr word(regi)))<>0 then
inc(reg_pushes[regi],t_times*2);
end;
incrementregisterpushed(pprocdef(p^.procdefinition)^.usedregisters);
{$endif}
{$ifdef m68k}
for regi:=R_D0 to R_A6 do
@ -1236,7 +1231,12 @@ implementation
end.
{
$Log$
Revision 1.82 2000-02-29 22:13:41 pierre
Revision 1.83 2000-04-02 18:30:12 florian
* fixed another problem with readln(<floating point register variable>);
* the register allocator takes now care of necessary pushes/pops for
readln/writeln
Revision 1.82 2000/02/29 22:13:41 pierre
+ use $GOTO ON
Revision 1.81 2000/02/24 18:41:39 peter

View File

@ -709,6 +709,7 @@ implementation
hp:=p^.left;
while assigned(hp) do
begin
incrementregisterpushed($ff);
if (hp^.left^.treetype=typen) then
CGMessage(type_e_cant_read_write_type);
if assigned(hp^.left^.resulttype) then
@ -1315,7 +1316,12 @@ implementation
end.
{
$Log$
Revision 1.72 2000-03-27 09:42:50 pierre
Revision 1.73 2000-04-02 18:30:12 florian
* fixed another problem with readln(<floating point register variable>);
* the register allocator takes now care of necessary pushes/pops for
readln/writeln
Revision 1.72 2000/03/27 09:42:50 pierre
+ add error if trying to use readln or writeln for files
or read or write on untyped files.
Reset and rewrite are still incompatible with BP

View File

@ -44,6 +44,10 @@ unit tgeni386;
usableregmmx : byte = 8;
{$endif SUPPORT_MMX}
var
{ tries to hold the amount of times which the current tree is processed }
t_times : longint;
{$ifdef TEMPREGDEBUG}
procedure testregisters32;
{$endif TEMPREGDEBUG}
@ -71,6 +75,9 @@ unit tgeni386;
procedure saveusedregisters(var saved : tsaved;b : byte);
procedure restoreusedregisters(const saved : tsaved);
{ increments the push count of all registers in b}
procedure incrementregisterpushed(b : byte);
procedure clearregistercount;
procedure resetusableregisters;
@ -110,6 +117,19 @@ implementation
uses
globtype,temp_gen;
procedure incrementregisterpushed(b : byte);
var
regi : tregister;
begin
for regi:=R_EAX to R_EDI do
begin
if (b and ($80 shr word(regi)))<>0 then
inc(reg_pushes[regi],t_times*2);
end;
end;
procedure pushusedregisters(var pushed : tpushed;b : byte);
var
@ -631,7 +651,12 @@ begin
end.
{
$Log$
Revision 1.41 2000-02-10 11:27:18 jonas
Revision 1.42 2000-04-02 18:30:12 florian
* fixed another problem with readln(<floating point register variable>);
* the register allocator takes now care of necessary pushes/pops for
readln/writeln
Revision 1.41 2000/02/10 11:27:18 jonas
* esi is never deallocated anymore in methods
Revision 1.40 2000/02/09 13:23:08 peter
@ -684,5 +709,4 @@ end.
Revision 1.28 1999/08/02 17:17:11 florian
* small changes for the new code generator
}
}