* m68k updates

This commit is contained in:
peter 2001-04-23 18:25:44 +00:00
parent 53c358a713
commit 802acf6940
8 changed files with 254 additions and 2351 deletions

View File

@ -17,6 +17,7 @@
{ I think we should use the pascal version, this code isn't } { I think we should use the pascal version, this code isn't }
{ much faster } { much faster }
{$define FPC_SYSTEM_HAS_FPC_INITIALIZE}
Procedure Initialize (Data,TypeInfo : pointer);[Public,Alias:'FPC_INITIALIZE'];assembler; Procedure Initialize (Data,TypeInfo : pointer);[Public,Alias:'FPC_INITIALIZE'];assembler;
asm asm
// Save registers // Save registers
@ -131,6 +132,7 @@ asm
end; end;
{$define FPC_SYSTEM_HAS_FPC_FINALIZE}
Procedure int_finalize (Data,TypeInfo: Pointer);[Public,Alias:'FPC_FINALIZE'];assembler; Procedure int_finalize (Data,TypeInfo: Pointer);[Public,Alias:'FPC_FINALIZE'];assembler;
asm asm
push %eax push %eax
@ -244,6 +246,7 @@ asm
end; end;
{$define FPC_SYSTEM_HAS_FPC_ADDREF}
Procedure Addref (Data,TypeInfo : Pointer); [Public,alias : 'FPC_ADDREF'];Assembler; Procedure Addref (Data,TypeInfo : Pointer); [Public,alias : 'FPC_ADDREF'];Assembler;
asm asm
// Save registers // Save registers
@ -358,6 +361,7 @@ asm
end; end;
{$define FPC_SYSTEM_HAS_FPC_DECREF}
Procedure DecRef (Data,TypeInfo : Pointer); [Public,alias : 'FPC_DECREF'];Assembler; Procedure DecRef (Data,TypeInfo : Pointer); [Public,alias : 'FPC_DECREF'];Assembler;
asm asm
// Save registers // Save registers
@ -470,20 +474,12 @@ asm
pop %eax pop %eax
end; end;
procedure FinalizeArray(data,typeinfo : pointer;count,size : longint);
[Public,Alias:'FPC_FINALIZEARRAY'];
var
i : longint;
begin
for i:=0 to count-1 do
int_finalize(data+size*i,typeinfo);
end;
{ {
$Log$ $Log$
Revision 1.7 2000-11-09 17:49:34 florian Revision 1.8 2001-04-23 18:25:44 peter
* m68k updates
Revision 1.7 2000/11/09 17:49:34 florian
+ FPC_FINALIZEARRAY + FPC_FINALIZEARRAY
* Finalize to int_finalize renamed * Finalize to int_finalize renamed

201
rtl/inc/genrtti.inc Normal file
View File

@ -0,0 +1,201 @@
{
$Id$
This file is part of the Free Pascal run time library.
Copyright (c) 1999-2000 by xxxx
member of the Free Pascal development team
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
{ Run-Time type information routines - processor dependent part }
{$ifndef FPC_SYSTEM_HAS_FPC_INITIALIZE}
Procedure Initialize (Data,TypeInfo : pointer);[Public,Alias : 'FPC_INITIALIZE'];
{ this definition is sometimes (depending on switches)
already defined or not so define it locally to avoid problems PM }
Type
Pbyte = ^Byte;
Var Temp : PByte;
I : longint;
Size,Count : longint;
TInfo : Pointer;
begin
Temp:=PByte(TypeInfo);
case temp^ of
tkAstring,tkWstring : PPchar(Data)^:=Nil;
tkArray :
begin
temp:=Temp+1;
I:=temp^;
temp:=temp+(I+1); // skip name string;
Size:=PArrayRec(Temp)^.Size; // get element size
Count:=PArrayRec(Temp)^.Count; // get element Count
TInfo:=PArrayRec(Temp)^.Info; // Get element info
For I:=0 to Count-1 do
Initialize (Data+(I*size),TInfo);
end;
tkrecord :
begin
Temp:=Temp+1;
I:=Temp^;
temp:=temp+(I+1); // skip name string;
Size:=PRecRec(Temp)^.Size; // get record size; not needed.
Count:=PRecRec(Temp)^.Count; // get element Count
For I:=1 to count Do
With PRecRec(Temp)^.elements[I] do
Initialize (Data+Offset,Info);
end;
end;
end;
{$endif}
{$ifndef FPC_SYSTEM_HAS_FPC_FINALIZE}
Procedure Finalize (Data,TypeInfo: Pointer);[Public,Alias : 'FPC_FINALIZE'];
{ this definition is sometimes (depending on switches)
already defined or not so define it locally to avoid problems PM }
Type
Pbyte = ^Byte;
Var Temp : PByte;
I : longint;
Size,Count : longint;
TInfo : Pointer;
begin
Temp:=PByte(TypeInfo);
case temp^ of
tkAstring,tkWstring : AnsiStr_Decr_Ref(Data);
tkArray :
begin
Temp:=Temp+1;
I:=temp^;
temp:=temp+(I+1); // skip name string;
Size:=PArrayRec(Temp)^.Size; // get element size
Count:=PArrayRec(Temp)^.Count; // get element Count
TInfo:=PArrayRec(Temp)^.Info; // Get element info
For I:=0 to Count-1 do
Finalize (Data+(I*size),TInfo);
end;
tkrecord :
begin
Temp:=Temp+1;
I:=Temp^;
temp:=temp+(I+1); // skip name string;
Size:=PRecRec(Temp)^.Size; // get record size; not needed.
Count:=PRecRec(Temp)^.Count; // get element Count
For I:=1 to count do
With PRecRec(Temp)^.elements[I] do
Finalize (Data+Offset,Info);
end;
end;
end;
{$endif}
{$ifndef FPC_SYSTEM_HAS_FPC_ADDREF}
Procedure Addref (Data,TypeInfo : Pointer); [Public,alias : 'FPC_ADDREF'];
{ this definition is sometimes (depending on switches)
already defined or not so define it locally to avoid problems PM }
Type
Pbyte = ^Byte;
Var Temp : PByte;
I : longint;
Size,Count : longint;
TInfo : Pointer;
begin
Temp:=PByte(TypeInfo);
case temp^ of
tkAstring,tkWstring : AnsiStr_Incr_Ref(Data);
tkArray :
begin
Temp:=Temp+1;
I:=temp^;
temp:=temp+(I+1); // skip name string;
Size:=PArrayRec(Temp)^.Size; // get element size
Count:=PArrayRec(Temp)^.Count; // get element Count
TInfo:=PArrayRec(Temp)^.Info; // Get element info
For I:=0 to Count-1 do
AddRef (Data+(I*size),TInfo);
end;
tkrecord :
begin
Temp:=Temp+1;
I:=Temp^;
temp:=temp+(I+1); // skip name string;
Size:=PRecRec(Temp)^.Size; // get record size; not needed.
Count:=PRecRec(Temp)^.Count; // get element Count
For I:=1 to count do
With PRecRec(Temp)^.elements[I] do
AddRef (Data+Offset,Info);
end;
end;
end;
{$endif}
{$ifndef FPC_SYSTEM_HAS_FPC_DECREF}
Procedure DecRef (Data, TypeInfo : Pointer);[Public,alias : 'FPC_DECREF'];
{ this definition is sometimes (depending on switches)
already defined or not so define it locally to avoid problems PM }
Type
Pbyte = ^Byte;
Var Temp : PByte;
I : longint;
Size,Count : longint;
TInfo : Pointer;
begin
Temp:=PByte(TypeInfo);
case temp^ of
tkAstring,tkWstring : AnsiStr_Decr_Ref(Data);
tkArray :
begin
Temp:=Temp+1;
I:=temp^;
temp:=temp+(I+1); // skip name string;
Size:=PArrayRec(Temp)^.Size; // get element size
Count:=PArrayRec(Temp)^.Count; // get element Count
TInfo:=PArrayRec(Temp)^.Info; // Get element info
For I:=0 to Count-1 do
DecRef (Data+(I*size),TInfo);
end;
tkrecord :
begin
Temp:=Temp+1;
I:=Temp^;
temp:=temp+(I+1); // skip name string;
Size:=PRecRec(Temp)^.Size; // get record size; not needed.
Count:=PRecRec(Temp)^.Count; // get element Count
For I:=1 to count do
With PRecRec(Temp)^.elements[I] do
DecRef (Data+Offset,Info);
end;
end;
end;
{$endif}
{$ifndef FPC_SYSTEM_HAS_FPC_FINALIZEARRAY}
procedure FinalizeArray(data,typeinfo : pointer;count,size : longint); [Public,Alias:'FPC_FINALIZEARRAY'];
var
i : longint;
begin
for i:=0 to count-1 do
int_finalize(data+size*i,typeinfo);
end;
{$endif}
{
$Log$
Revision 1.2 2001-04-23 18:25:44 peter
* m68k updates
}

File diff suppressed because it is too large Load Diff

View File

@ -719,7 +719,7 @@ var
data_end : cardinal;external name '__data_end__'; data_end : cardinal;external name '__data_end__';
{$endif} {$endif}
procedure CheckPointer(p : pointer);[public, alias : 'FPC_CHECKPOINTER']; procedure CheckPointer(p : pointer);[saveregisters, public, alias : 'FPC_CHECKPOINTER'];
var var
i : longint; i : longint;
pp : pheap_mem_info; pp : pheap_mem_info;
@ -728,9 +728,6 @@ var
label label
_exit; _exit;
begin begin
asm
pushal
end;
if p=nil then if p=nil then
goto _exit; goto _exit;
@ -835,11 +832,6 @@ begin
writeln(ptext^,'pointer $',hexstr(longint(p),8),' does not point to valid memory block'); writeln(ptext^,'pointer $',hexstr(longint(p),8),' does not point to valid memory block');
runerror(204); runerror(204);
_exit: _exit:
asm
popal
{ avoid 386DX popad bug }
nop
end;
end; end;
{***************************************************************************** {*****************************************************************************
@ -1154,7 +1146,10 @@ finalization
end. end.
{ {
$Log$ $Log$
Revision 1.12 2001-04-21 12:18:09 peter Revision 1.13 2001-04-23 18:25:44 peter
* m68k updates
Revision 1.12 2001/04/21 12:18:09 peter
* add nop after popa (merged) * add nop after popa (merged)
Revision 1.11 2001/04/13 18:05:34 peter Revision 1.11 2001/04/13 18:05:34 peter

View File

@ -115,12 +115,15 @@
var var
sign : boolean; sign : boolean;
q1,q2 : qword; q1,q2 : qword;
{$ifdef SUPPORT_COMP}
c : comp; c : comp;
{$endif}
begin begin
if n=0 then if n=0 then
HandleErrorFrame(200,get_frame); HandleErrorFrame(200,get_frame);
{ can the fpu do the work? } { can the fpu do the work? }
{$ifdef support_comp}
if fpuint64 then if fpuint64 then
begin begin
// the c:=comp(...) is necessary to shut up the compiler // the c:=comp(...) is necessary to shut up the compiler
@ -128,6 +131,7 @@
divint64:=qword(c); divint64:=qword(c);
end end
else else
{$endif}
begin begin
sign:=false; sign:=false;
if z<0 then if z<0 then
@ -262,9 +266,12 @@
var var
sign : boolean; sign : boolean;
q1,q2,q3 : qword; q1,q2,q3 : qword;
{$ifdef support_comp}
c : comp; c : comp;
{$endif}
begin begin
{$ifdef support_comp}
{ can the fpu do the work ? } { can the fpu do the work ? }
if fpuint64 and not(checkoverflow) then if fpuint64 and not(checkoverflow) then
begin begin
@ -273,6 +280,7 @@
mulint64:=int64(c); mulint64:=int64(c);
end end
else else
{$endif}
begin begin
sign:=false; sign:=false;
if f1<0 then if f1<0 then
@ -477,7 +485,10 @@
{ {
$Log$ $Log$
Revision 1.9 2001-04-13 22:30:04 peter Revision 1.10 2001-04-23 18:25:45 peter
* m68k updates
Revision 1.9 2001/04/13 22:30:04 peter
* remove warnings * remove warnings
Revision 1.8 2001/03/03 12:39:09 jonas Revision 1.8 2001/03/03 12:39:09 jonas

View File

@ -85,7 +85,7 @@ var
until carry = 0; until carry = 0;
end; end;
procedure getIntPart(d: extended); procedure getIntPart(d: valreal);
var var
intPartStack: TIntPartStack; intPartStack: TIntPartStack;
stackPtr, endStackPtr, digits: longint; stackPtr, endStackPtr, digits: longint;
@ -403,7 +403,10 @@ end;
{ {
$Log$ $Log$
Revision 1.2 2000-07-13 11:33:45 michael Revision 1.3 2001-04-23 18:25:45 peter
* m68k updates
Revision 1.2 2000/07/13 11:33:45 michael
+ removed logs + removed logs
} }

View File

@ -85,11 +85,17 @@ TArrayRec = record
{ The actual Routines are implemented per processor. } { The actual Routines are implemented per processor. }
{ Include the cpu dependant part }
{$i rttip.inc} {$i rttip.inc}
{ Include the generic part }
{$i genrtti.inc}
{ {
$Log$ $Log$
Revision 1.3 2000-10-21 18:20:17 florian Revision 1.4 2001-04-23 18:25:45 peter
* m68k updates
Revision 1.3 2000/10/21 18:20:17 florian
* a lot of small changes: * a lot of small changes:
- setlength is internal - setlength is internal
- win32 graph unit extended - win32 graph unit extended

View File

@ -76,6 +76,7 @@ Type
ValReal = Real; ValReal = Real;
{$define SUPPORT_SINGLE} {$define SUPPORT_SINGLE}
{$define SUPPORT_DOUBLE}
{$endif} {$endif}
{ Zero - terminated strings } { Zero - terminated strings }
@ -153,14 +154,14 @@ const
{ Compatibility With TP } { Compatibility With TP }
const const
{ code to use comps in int64mul and div code is commented out! (JM) }
FPUInt64 : boolean = false; { set this to false if you don't want that }
{ the fpu does int64*int64 and }
{ int64 div int64, if the * is overflow }
{ checked, it is done in software }
{$ifdef i386} {$ifdef i386}
Test8086 : byte = 2; { Always i386 or newer } Test8086 : byte = 2; { Always i386 or newer }
Test8087 : byte = 3; { Always 387 or newer. Emulated if needed. } Test8087 : byte = 3; { Always 387 or newer. Emulated if needed. }
{ code to use comps in int64mul and div code is commented out! (JM) }
FPUInt64 : boolean = false; { set this to false if you don't want that }
{ the fpu does int64*int64 and }
{ int64 div int64, if the * is overflow }
{ checked, it is done in software }
{$endif i386} {$endif i386}
{$ifdef m68k} {$ifdef m68k}
Test68000 : byte = 0; { Must be determined at startup for both } Test68000 : byte = 0; { Must be determined at startup for both }
@ -491,7 +492,10 @@ const
{ {
$Log$ $Log$
Revision 1.19 2001-04-13 18:06:07 peter Revision 1.20 2001-04-23 18:25:45 peter
* m68k updates
Revision 1.19 2001/04/13 18:06:07 peter
* upcase, lowercase for ansistring * upcase, lowercase for ansistring
Revision 1.18 2001/03/22 23:26:05 florian Revision 1.18 2001/03/22 23:26:05 florian