mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 19:49:31 +02:00
* use external names
* removed all direct assembler modes
This commit is contained in:
parent
466989af54
commit
af8a04a5af
@ -630,7 +630,12 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
{$ASMMODE DIRECT}
|
||||
var
|
||||
_swap_in : pointer;external name '_swap_in';
|
||||
_swap_out : pointer;external name '_swap_out';
|
||||
_exception_exit : pointer;external name '_exception_exit';
|
||||
_v2prt0_exceptions_on : longbool;external name '_v2prt0_exceptions_on';
|
||||
|
||||
procedure swapvectors;
|
||||
begin
|
||||
DosError:=0;
|
||||
@ -644,15 +649,14 @@ begin
|
||||
orl %eax,%eax
|
||||
je .Lexceptions_off
|
||||
movl _swap_out,%eax
|
||||
call *%eax
|
||||
call %eax
|
||||
jmp .Lno_excep
|
||||
.Lexceptions_off:
|
||||
movl _swap_in,%eax
|
||||
call *%eax
|
||||
call %eax
|
||||
.Lno_excep:
|
||||
end;
|
||||
end;
|
||||
{$ASMMODE ATT}
|
||||
|
||||
|
||||
{******************************************************************************
|
||||
@ -986,7 +990,11 @@ End;
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.3 1999-01-22 15:44:59 pierre
|
||||
Revision 1.4 1999-03-01 15:40:48 peter
|
||||
* use external names
|
||||
* removed all direct assembler modes
|
||||
|
||||
Revision 1.3 1999/01/22 15:44:59 pierre
|
||||
Daniel change removed : broke make cycle !!
|
||||
|
||||
Revision 1.2 1999/01/22 10:07:03 daniel
|
||||
|
@ -106,7 +106,7 @@ function dpmi_set_coprocessor_emulation(flag : longint) : longint;
|
||||
|
||||
implementation
|
||||
|
||||
{$ASMMODE DIRECT}
|
||||
{$asmmode ATT}
|
||||
|
||||
{$L exceptn.o}
|
||||
|
||||
@ -123,8 +123,8 @@ var
|
||||
djgpp_dos_sel : word;external name '___djgpp_dos_sel';
|
||||
djgpp_exception_table : array[0..0] of pointer;external name '___djgpp_exception_table';
|
||||
|
||||
procedure djgpp_i24;external name ' ___djgpp_i24';
|
||||
procedure djgpp_iret;external name ' ___djgpp_iret';
|
||||
procedure djgpp_i24;external name '___djgpp_i24';
|
||||
procedure djgpp_iret;external name '___djgpp_iret';
|
||||
procedure djgpp_npx_hdlr;external name '___djgpp_npx_hdlr';
|
||||
procedure djgpp_kbd_hdlr;external name '___djgpp_kbd_hdlr';
|
||||
procedure djgpp_kbd_hdlr_pc98;external name '___djgpp_kbd_hdlr_pc98';
|
||||
@ -133,8 +133,8 @@ procedure djgpp_cbrk_hdlr;external name '___djgpp_cbrk_hdlr';
|
||||
|
||||
var
|
||||
exceptions_on : boolean;
|
||||
old_int00 : tseginfo;cvar;external;
|
||||
old_int75 : tseginfo;cvar;external;
|
||||
{ old_int00 : tseginfo;cvar;external;
|
||||
old_int75 : tseginfo;cvar;external; }
|
||||
|
||||
const
|
||||
cbrk_vect : byte = $1b;
|
||||
@ -188,12 +188,12 @@ end;
|
||||
movl 12(%esp),%eax
|
||||
movl %eax,8(%esp)
|
||||
popl %eax
|
||||
jmp FPC_setjmp
|
||||
jmp dpmi_setjmp
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function dpmi_setjmp(var rec : dpmi_jmp_buf) : longint;[alias : 'FPC_setjmp'];
|
||||
|
||||
|
||||
function dpmi_setjmp(var rec : dpmi_jmp_buf) : longint;
|
||||
begin
|
||||
asm
|
||||
pushl %edi
|
||||
@ -229,7 +229,7 @@ begin
|
||||
movw %fs,46(%edi)
|
||||
movw %gs,48(%edi)
|
||||
movw %ss,50(%edi)
|
||||
movl ___djgpp_exception_state_ptr, %eax
|
||||
movl djgpp_exception_state_ptr, %eax
|
||||
movl %eax, 60(%edi)
|
||||
{ restore EDI }
|
||||
pop %edi
|
||||
@ -275,31 +275,24 @@ begin
|
||||
movl 28(%edi),%esi
|
||||
subl $28,%esi { We need 7 working longwords on stack }
|
||||
movl 60(%edi),%eax
|
||||
es
|
||||
movl %eax,(%esi) { Exception pointer }
|
||||
movl %eax,%es:(%esi) { Exception pointer }
|
||||
movzwl 42(%edi),%eax
|
||||
es
|
||||
movl %eax,4(%esi) { DS }
|
||||
movl %eax,%es:4(%esi) { DS }
|
||||
movl 20(%edi),%eax
|
||||
es
|
||||
movl %eax,8(%esi) { EDI }
|
||||
movl %eax,%es:8(%esi) { EDI }
|
||||
movl 16(%edi),%eax
|
||||
es
|
||||
movl %eax,12(%esi) { ESI }
|
||||
movl %eax,%es:12(%esi) { ESI }
|
||||
movl 32(%edi),%eax
|
||||
es
|
||||
movl %eax,16(%esi) { EIP - start of IRET frame }
|
||||
movl %eax,%es:16(%esi) { EIP - start of IRET frame }
|
||||
movl 40(%edi),%eax
|
||||
es
|
||||
movl %eax,20(%esi) { CS }
|
||||
movl %eax,%es:20(%esi) { CS }
|
||||
movl 36(%edi),%eax
|
||||
es
|
||||
movl %eax,24(%esi) { EFLAGS }
|
||||
movl %eax,%es:24(%esi) { EFLAGS }
|
||||
movl 0(%edi),%eax
|
||||
movw 44(%edi),%es
|
||||
movw 50(%edi),%ss
|
||||
movl %esi,%esp
|
||||
popl ___djgpp_exception_state_ptr
|
||||
popl djgpp_exception_state_ptr
|
||||
popl %ds
|
||||
popl %edi
|
||||
popl %esi
|
||||
@ -501,6 +494,8 @@ end;
|
||||
|
||||
const message_level : byte = 0;
|
||||
|
||||
procedure ___exit(c:byte);cdecl;external name '___exit';
|
||||
|
||||
function do_faulting_finish_message : integer;
|
||||
var
|
||||
en : pchar;
|
||||
@ -615,16 +610,13 @@ begin
|
||||
simple_exit:
|
||||
if exceptions_on then
|
||||
djgpp_exception_toggle;
|
||||
asm
|
||||
pushw $1
|
||||
call ___exit
|
||||
end;
|
||||
___exit(1);
|
||||
end;
|
||||
|
||||
|
||||
function djgpp_exception_state:pexception_state;assembler;
|
||||
asm
|
||||
movl ___djgpp_exception_state_ptr,%eax
|
||||
movl djgpp_exception_state_ptr,%eax
|
||||
end;
|
||||
|
||||
|
||||
@ -636,9 +628,9 @@ begin
|
||||
exception_level:=1
|
||||
else
|
||||
inc(exception_level);
|
||||
|
||||
|
||||
sig:=djgpp_exception_state_ptr^.__signum;
|
||||
|
||||
|
||||
if (exception_level=1) or (sig=$78) then
|
||||
begin
|
||||
sig := except_to_sig(sig);
|
||||
@ -684,14 +676,13 @@ var
|
||||
cbrk_ori,
|
||||
cbrk_rmcb : trealseginfo;
|
||||
cbrk_regs : registers;
|
||||
|
||||
v2prt0_exceptions_on : longbool;external name '_v2prt0_exceptions_on';
|
||||
|
||||
|
||||
procedure djgpp_exception_toggle;[alias : '___djgpp_exception_toggle'];
|
||||
var
|
||||
_except : tseginfo;
|
||||
i : longint;
|
||||
local_ex : boolean;
|
||||
begin
|
||||
{$ifdef DPMIEXCP_DEBUG}
|
||||
if exceptions_on then
|
||||
@ -702,11 +693,7 @@ begin
|
||||
{ toggle here to avoid infinite recursion }
|
||||
{ if a subfunction calls runerror !! }
|
||||
exceptions_on:=not exceptions_on;
|
||||
local_ex:=exceptions_on;
|
||||
asm
|
||||
movzbl local_ex,%eax
|
||||
movl %eax,_v2prt0_exceptions_on
|
||||
end;
|
||||
v2prt0_exceptions_on:=exceptions_on;
|
||||
for i:=0 to EXCEPTIONCOUNT-1 do
|
||||
begin
|
||||
if get_pm_exception_handler(i,_except) then
|
||||
@ -779,6 +766,11 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
var
|
||||
_swap_in : pointer;external name '_swap_in';
|
||||
_swap_out : pointer;external name '_swap_out';
|
||||
_exception_exit : pointer;external name '_exception_exit';
|
||||
|
||||
procedure dpmiexcp_exit{(status : longint)};[public,alias : 'excep_exit'];
|
||||
{ We need to restore hardware interrupt handlers even if somebody calls
|
||||
`_exit' directly, or else we crash the machine in nested programs.
|
||||
@ -787,12 +779,9 @@ procedure dpmiexcp_exit{(status : longint)};[public,alias : 'excep_exit'];
|
||||
begin
|
||||
if (exceptions_on) then
|
||||
djgpp_exception_toggle;
|
||||
asm
|
||||
xorl %eax,%eax
|
||||
movl %eax,_exception_exit
|
||||
movl %eax,_swap_in
|
||||
movl %eax,_swap_out
|
||||
end;
|
||||
_exception_exit:=nil;
|
||||
_swap_in:=nil;
|
||||
_swap_out:=nil;
|
||||
{ restore the FPU state }
|
||||
dpmi_set_coprocessor_emulation(1);
|
||||
end;
|
||||
@ -815,6 +804,9 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
var
|
||||
___djgpp_app_DS : word;external name '___djgpp_app_DS';
|
||||
___djgpp_our_DS : word;external name '___djgpp_our_DS';
|
||||
|
||||
procedure djgpp_exception_setup;[alias : '___djgpp_exception_setup'];
|
||||
var
|
||||
@ -825,17 +817,11 @@ var
|
||||
locksize : longint;
|
||||
i : longint;
|
||||
begin
|
||||
asm
|
||||
movl _exception_exit,%eax
|
||||
xorl %eax,%eax
|
||||
jne .L_already
|
||||
leal excep_exit,%eax
|
||||
movl %eax,_exception_exit
|
||||
leal swap_in,%eax
|
||||
movl %eax,_swap_in
|
||||
leal swap_out,%eax
|
||||
movl %eax,_swap_out
|
||||
end;
|
||||
if assigned(_exception_exit) then
|
||||
exit;
|
||||
_exception_exit:=@dpmiexcp_exit;
|
||||
_swap_in:=@dpmi_swap_in;
|
||||
_swap_out:=@dpmi_swap_out;
|
||||
{ reset signals }
|
||||
for i := 0 to SIGMAX-1 do
|
||||
signal_list[i] := SignalHandler(@SIG_DFL);
|
||||
@ -872,9 +858,6 @@ begin
|
||||
djgpp_exception_toggle; { Set new values & save old values }
|
||||
{ get original video mode and save }
|
||||
old_video_mode := farpeekb(dosmemselector, $449);
|
||||
asm
|
||||
.L_already:
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
@ -907,7 +890,11 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.6 1999-02-05 12:49:25 pierre
|
||||
Revision 1.7 1999-03-01 15:40:49 peter
|
||||
* use external names
|
||||
* removed all direct assembler modes
|
||||
|
||||
Revision 1.6 1999/02/05 12:49:25 pierre
|
||||
<> debug conditionnal renamed DPMIEXCP_DEBUG
|
||||
|
||||
Revision 1.5 1999/01/22 15:46:33 pierre
|
||||
|
@ -21,6 +21,8 @@ procedure npxsetup(prog_name : string);
|
||||
|
||||
implementation
|
||||
|
||||
{$asmmode ATT}
|
||||
|
||||
uses
|
||||
dxeload,dpmiexcp,strings;
|
||||
|
||||
@ -46,12 +48,12 @@ begin
|
||||
|
||||
movl mask2, %ecx
|
||||
notl %ecx
|
||||
andl %eax, %ecx /* the bits we want to keep */
|
||||
andl %eax, %ecx { the bits we want to keep }
|
||||
|
||||
movl mask2, %edx
|
||||
andl mask1, %edx /* the bits we want to change */
|
||||
andl mask1, %edx { the bits we want to change }
|
||||
|
||||
orl %ecx, %edx /* the new value */
|
||||
orl %ecx, %edx { the new value }
|
||||
pushl %edx
|
||||
fldcw (%esp)
|
||||
popl %edx
|
||||
@ -137,6 +139,8 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
function __detect_80387:byte;external name '__detect_80387';
|
||||
|
||||
procedure npxsetup(prog_name : string);
|
||||
var
|
||||
cp : string;
|
||||
@ -212,7 +216,11 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.1 1998-12-21 13:07:02 peter
|
||||
Revision 1.2 1999-03-01 15:40:50 peter
|
||||
* use external names
|
||||
* removed all direct assembler modes
|
||||
|
||||
Revision 1.1 1998/12/21 13:07:02 peter
|
||||
* use -FE
|
||||
|
||||
Revision 1.9 1998/10/26 14:49:45 pierre
|
||||
|
@ -210,6 +210,8 @@ var
|
||||
|
||||
implementation
|
||||
|
||||
{$asmmode ATT}
|
||||
|
||||
|
||||
{ the following procedures copy from and to DOS memory using DPMI }
|
||||
procedure dpmi_dosmemput(seg : word;ofs : word;var data;count : longint);
|
||||
@ -538,20 +540,20 @@ end ['EAX','EDX'];
|
||||
end;
|
||||
|
||||
|
||||
procedure test_int31(flag : longint);[alias : 'test_int31'];
|
||||
procedure test_int31(flag : longint);
|
||||
begin
|
||||
asm
|
||||
pushl %ebx
|
||||
movw $0,U_GO32_INT31ERROR
|
||||
movw $0,INT31ERROR
|
||||
movl flag,%ebx
|
||||
testb $1,%bl
|
||||
jz 1f
|
||||
movw %ax,U_GO32_INT31ERROR
|
||||
jz .Lti31_1
|
||||
movw %ax,INT31ERROR
|
||||
xorl %eax,%eax
|
||||
jmp 2f
|
||||
1:
|
||||
jmp .Lti31_2
|
||||
.Lti31_1:
|
||||
movl $1,%eax
|
||||
2:
|
||||
.Lti31_2:
|
||||
popl %ebx
|
||||
end;
|
||||
end;
|
||||
@ -702,6 +704,8 @@ end ['EAX','EDX'];
|
||||
{ here we must use ___v2prt0_ds_alias instead of from v2prt0.s
|
||||
because the exception processor sets the ds limit to $fff
|
||||
at hardware exceptions }
|
||||
var
|
||||
___v2prt0_ds_alias : word;external name '___v2prt0_ds_alias';
|
||||
|
||||
function get_rm_callback(pm_func : pointer;const reg : trealregs;var rmcb : tseginfo) : boolean;
|
||||
begin
|
||||
@ -1072,6 +1076,10 @@ end ['EAX','EDX'];
|
||||
sti
|
||||
end;
|
||||
|
||||
|
||||
var
|
||||
_run_mode : word;external name '_run_mode';
|
||||
|
||||
function get_run_mode : word;
|
||||
|
||||
begin
|
||||
@ -1097,6 +1105,9 @@ end ['EAX','EDX'];
|
||||
end;
|
||||
end;
|
||||
|
||||
var
|
||||
_core_selector : word;external name '_core_selector';
|
||||
|
||||
function get_core_selector : word;
|
||||
|
||||
begin
|
||||
@ -1159,7 +1170,11 @@ end.
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.1 1998-12-21 13:07:03 peter
|
||||
Revision 1.2 1999-03-01 15:40:51 peter
|
||||
* use external names
|
||||
* removed all direct assembler modes
|
||||
|
||||
Revision 1.1 1998/12/21 13:07:03 peter
|
||||
* use -FE
|
||||
|
||||
Revision 1.12 1998/08/27 10:30:50 pierre
|
||||
|
@ -138,7 +138,7 @@ var
|
||||
old_int75 : tseginfo;cvar;
|
||||
|
||||
|
||||
{$ASMMODE DIRECT}
|
||||
{$ASMMODE ATT}
|
||||
|
||||
{*****************************************************************************
|
||||
Go32 Helpers
|
||||
@ -163,8 +163,6 @@ asm
|
||||
end;
|
||||
end;
|
||||
|
||||
{$ASMMODE ATT}
|
||||
|
||||
|
||||
function tb : longint;
|
||||
begin
|
||||
@ -294,14 +292,14 @@ begin
|
||||
atohex:=rv;
|
||||
end;
|
||||
|
||||
|
||||
var
|
||||
_args : ppchar;external name '_args';
|
||||
procedure setup_arguments;
|
||||
type arrayword = array [0..0] of word;
|
||||
var psp : word;
|
||||
i,j : byte;
|
||||
quote : char;
|
||||
proxy_s : string[7];
|
||||
tempargv : ppchar;
|
||||
al,proxy_argc,proxy_seg,proxy_ofs,lin : longint;
|
||||
largs : array[0..127] of pchar;
|
||||
rm_argv : ^arrayword;
|
||||
@ -382,13 +380,7 @@ if (argc > 1) and (far_strlen(get_ds,longint(largs[1])) = 6) then
|
||||
getmem(argv,argc shl 2);
|
||||
for i := 0 to argc-1 do
|
||||
argv[i] := largs[i];
|
||||
tempargv:=argv;
|
||||
{$ASMMODE DIRECT}
|
||||
asm
|
||||
movl tempargv,%eax
|
||||
movl %eax,_args
|
||||
end;
|
||||
{$ASMMODE ATT}
|
||||
_args:=argv;
|
||||
end;
|
||||
|
||||
|
||||
@ -419,19 +411,15 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
var
|
||||
__stubinfo : p_stub_info;external name '__stubinfo';
|
||||
___dos_argv0 : pchar;external name '___dos_argv0';
|
||||
procedure setup_environment;
|
||||
var env_selector : word;
|
||||
env_count : longint;
|
||||
dos_env,cp : pchar;
|
||||
stubaddr : p_stub_info;
|
||||
begin
|
||||
{$ASMMODE DIRECT}
|
||||
asm
|
||||
movl __stubinfo,%eax
|
||||
movl %eax,stubaddr
|
||||
end;
|
||||
{$ASMMODE ATT}
|
||||
stub_info:=stubaddr;
|
||||
stub_info:=__stubinfo;
|
||||
getmem(dos_env,stub_info^.env_size);
|
||||
env_count:=0;
|
||||
sysseg_move(stub_info^.psp_selector,$2c, get_ds, longint(@env_selector), 2);
|
||||
@ -465,12 +453,7 @@ begin
|
||||
if (dos_argv0 = nil) then halt;
|
||||
strcopy(dos_argv0, cp);
|
||||
{ update ___dos_argv0 also }
|
||||
{$ASMMODE DIRECT}
|
||||
asm
|
||||
movl U_SYSTEM_DOS_ARGV0,%eax
|
||||
movl %eax,___dos_argv0
|
||||
end;
|
||||
{$ASMMODE ATT}
|
||||
___dos_argv0:=dos_argv0
|
||||
end;
|
||||
|
||||
|
||||
@ -545,12 +528,14 @@ end;
|
||||
{*****************************************************************************
|
||||
System Dependent Exit code
|
||||
*****************************************************************************}
|
||||
Procedure system_exit;
|
||||
{$ASMMODE DIRECT}
|
||||
{$ifdef SYSTEMDEBUG}
|
||||
var h : byte;
|
||||
{$endif SYSTEMDEBUG}
|
||||
|
||||
procedure ___exit(exitcode:byte);cdecl;external name '___exit';
|
||||
|
||||
Procedure system_exit;
|
||||
{$ifdef SYSTEMDEBUG}
|
||||
var
|
||||
h : byte;
|
||||
{$endif SYSTEMDEBUG}
|
||||
begin
|
||||
{$ifdef SYSTEMDEBUG}
|
||||
for h:=0 to max_files do
|
||||
@ -561,15 +546,11 @@ begin
|
||||
{ not on normal exit !! PM }
|
||||
set_pm_interrupt($00,old_int00);
|
||||
set_pm_interrupt($75,old_int75);
|
||||
asm
|
||||
movzbw exitcode,%ax
|
||||
pushw %ax
|
||||
call ___exit {frees all dpmi memory !!}
|
||||
end;
|
||||
___exit(exitcode);
|
||||
end;
|
||||
|
||||
procedure halt(errnum : byte);
|
||||
|
||||
procedure halt(errnum : byte);
|
||||
begin
|
||||
exitcode:=errnum;
|
||||
do_exit;
|
||||
@ -595,6 +576,9 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
var
|
||||
__stkbottom : longint;external name '__stkbottom';
|
||||
|
||||
procedure int_stackcheck(stack_size:longint);[public,alias:'FPC_STACKCHECK'];
|
||||
{
|
||||
called when trying to get local stack if the compiler directive $S
|
||||
@ -613,10 +597,10 @@ begin
|
||||
movl %esp,%eax
|
||||
subl %ebx,%eax
|
||||
{$ifdef SYSTEMDEBUG}
|
||||
movl U_SYSTEM_LOWESTSTACK,%ebx
|
||||
movl loweststack,%ebx
|
||||
cmpl %eax,%ebx
|
||||
jb .L_is_not_lowest
|
||||
movl %eax,U_SYSTEM_LOWESTSTACK
|
||||
movl %eax,loweststack
|
||||
.L_is_not_lowest:
|
||||
{$endif SYSTEMDEBUG}
|
||||
movl __stkbottom,%ebx
|
||||
@ -633,8 +617,6 @@ begin
|
||||
end['EAX','EBX'];
|
||||
HandleError(202);
|
||||
end;
|
||||
{$ASMMODE ATT}
|
||||
|
||||
|
||||
|
||||
{*****************************************************************************
|
||||
@ -671,20 +653,24 @@ end;
|
||||
Heap Management
|
||||
*****************************************************************************}
|
||||
|
||||
{$ASMMODE DIRECT}
|
||||
var
|
||||
int_heap : longint;external name 'HEAP';
|
||||
int_heapsize : longint;external name 'HEAPSIZE';
|
||||
|
||||
function getheapstart:pointer;assembler;
|
||||
asm
|
||||
leal HEAP,%eax
|
||||
end ['EAX'];
|
||||
function getheapstart:pointer;
|
||||
begin
|
||||
getheapstart:=@int_heap;
|
||||
end;
|
||||
|
||||
|
||||
function getheapsize:longint;assembler;
|
||||
asm
|
||||
movl HEAPSIZE,%eax
|
||||
end ['EAX'];
|
||||
function getheapsize:longint;
|
||||
begin
|
||||
getheapsize:=int_heapsize;
|
||||
end;
|
||||
|
||||
|
||||
function ___sbrk(size:longint):longint;cdecl;external name '___sbrk';
|
||||
|
||||
function Sbrk(size : longint):longint;assembler;
|
||||
asm
|
||||
movl size,%eax
|
||||
@ -693,7 +679,6 @@ asm
|
||||
addl $4,%esp
|
||||
end;
|
||||
|
||||
{$ASMMODE ATT}
|
||||
|
||||
{ include standard heap management }
|
||||
{$I heap.inc}
|
||||
@ -1237,7 +1222,11 @@ Begin
|
||||
End.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.5 1999-01-18 10:05:50 pierre
|
||||
Revision 1.6 1999-03-01 15:40:52 peter
|
||||
* use external names
|
||||
* removed all direct assembler modes
|
||||
|
||||
Revision 1.5 1999/01/18 10:05:50 pierre
|
||||
+ system_exit procedure added
|
||||
|
||||
Revision 1.4 1998/12/30 22:17:59 peter
|
||||
|
1179
rtl/go32v2/v2prt0.as
1179
rtl/go32v2/v2prt0.as
File diff suppressed because it is too large
Load Diff
@ -15,7 +15,8 @@
|
||||
|
||||
**********************************************************************}
|
||||
|
||||
{$ASMMODE ATT}
|
||||
{$asmmode ATT}
|
||||
|
||||
|
||||
{****************************************************************************
|
||||
Move / Fill
|
||||
@ -150,8 +151,6 @@ end;
|
||||
Object Helpers
|
||||
****************************************************************************}
|
||||
|
||||
{$ASMMODE DIRECT}
|
||||
|
||||
procedure int_help_constructor;assembler; [public,alias:'FPC_HELP_CONSTRUCTOR'];
|
||||
asm
|
||||
{ Entry without preamble, since we need the ESP of the constructor
|
||||
@ -175,7 +174,7 @@ asm
|
||||
{ Memory size }
|
||||
pushl (%eax)
|
||||
pushl %esi
|
||||
call FPC_GETMEM
|
||||
call GetMem
|
||||
popal
|
||||
{ Memory position to %esi }
|
||||
movl (%esi),%esi
|
||||
@ -249,12 +248,15 @@ asm
|
||||
{ SELF }
|
||||
movl %eax,(%edi)
|
||||
pushl %edi
|
||||
call FPC_FREEMEM
|
||||
call FreeMem
|
||||
addl $4,%esp
|
||||
.LHD_3:
|
||||
popal
|
||||
end;
|
||||
|
||||
{$ifndef NEWATT}
|
||||
{$asmmode DIRECT}
|
||||
{$endif}
|
||||
|
||||
procedure int_new_class;assembler;[public,alias:'FPC_NEW_CLASS'];
|
||||
asm
|
||||
@ -291,7 +293,9 @@ asm
|
||||
.LDISPOSE_CLASS1:
|
||||
end;
|
||||
|
||||
{$ASMMODE ATT}
|
||||
{$ifndef NEWATT}
|
||||
{$asmmode att}
|
||||
{$endif}
|
||||
|
||||
|
||||
{ checks for a correct vmt pointer }
|
||||
@ -495,12 +499,11 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
{$ASMMODE DIRECT}
|
||||
function strpas(p:pchar):string;[public,alias:'FPC_PCHAR_TO_SHORTSTR'];
|
||||
begin
|
||||
asm
|
||||
cld
|
||||
movl 12(%ebp),%edi
|
||||
movl p,%edi
|
||||
movl $0xff,%ecx
|
||||
xorl %eax,%eax
|
||||
movl %edi,%esi
|
||||
@ -508,7 +511,11 @@ begin
|
||||
scasb
|
||||
movl %ecx,%eax
|
||||
|
||||
{$ifdef NEWATT1}
|
||||
movl __RESULT,%edi
|
||||
{$else}
|
||||
movl 8(%ebp),%edi
|
||||
{$endif}
|
||||
notb %al
|
||||
decl %eax
|
||||
stosb
|
||||
@ -531,7 +538,6 @@ begin
|
||||
movsb
|
||||
end ['ECX','EAX','ESI','EDI'];
|
||||
end;
|
||||
{$ASMMODE ATT}
|
||||
|
||||
|
||||
function strlen(p:pchar):longint;assembler;
|
||||
@ -643,7 +649,7 @@ begin
|
||||
incl %ecx
|
||||
.LM2:
|
||||
cltd
|
||||
idivl %esi,%eax
|
||||
idivl %esi
|
||||
addb $0x30,%dl // convert Rest to ASCII.
|
||||
movb %dl,-12(%ebp,%ebx)
|
||||
incl %ebx
|
||||
@ -673,7 +679,7 @@ begin
|
||||
movl $0x0a,%esi // load 10 as dividing constant.
|
||||
.LM4:
|
||||
xorl %edx,%edx
|
||||
divl %esi,%eax
|
||||
divl %esi
|
||||
addb $0x30,%dl // convert Rest to ASCII.
|
||||
movb %dl,-12(%ebp,%ebx)
|
||||
incl %ebx
|
||||
@ -739,7 +745,11 @@ end;
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.40 1999-02-22 13:23:22 pierre
|
||||
Revision 1.41 1999-03-01 15:40:55 peter
|
||||
* use external names
|
||||
* removed all direct assembler modes
|
||||
|
||||
Revision 1.40 1999/02/22 13:23:22 pierre
|
||||
* VMT field zeroed at destructor forgot offset !!
|
||||
|
||||
Revision 1.39 1999/02/05 12:26:25 pierre
|
||||
|
@ -14,209 +14,15 @@
|
||||
|
||||
**********************************************************************}
|
||||
|
||||
{$ASMMODE DIRECT}
|
||||
|
||||
{$ifndef DEFAULT_EXTENDED}
|
||||
|
||||
{****************************************************************************
|
||||
Real/Double data type routines
|
||||
****************************************************************************}
|
||||
|
||||
function pi : real;assembler;
|
||||
asm
|
||||
fldpi
|
||||
leave
|
||||
ret
|
||||
end [];
|
||||
|
||||
|
||||
function abs(d : real) : real;assembler;
|
||||
asm
|
||||
fldl 8(%ebp)
|
||||
fabs
|
||||
end [];
|
||||
|
||||
|
||||
function sqr(d : real) : real;assembler;
|
||||
asm
|
||||
fldl 8(%ebp)
|
||||
fldl 8(%ebp)
|
||||
fmulp
|
||||
end [];
|
||||
|
||||
|
||||
function sqrt(d : real) : real;assembler;
|
||||
asm
|
||||
fldl 8(%ebp)
|
||||
fsqrt
|
||||
leave
|
||||
ret $8
|
||||
end [];
|
||||
|
||||
|
||||
function arctan(d : real) : real;assembler;
|
||||
asm
|
||||
fldl 8(%ebp)
|
||||
fld1
|
||||
fpatan
|
||||
end [];
|
||||
|
||||
|
||||
function cos(d : real) : real;assembler;
|
||||
asm
|
||||
fldl 8(%ebp)
|
||||
fcos
|
||||
fstsw
|
||||
sahf
|
||||
jnp .LCOS1
|
||||
fstp %st(0)
|
||||
fldl .LCOS0
|
||||
jmp .LCOS1
|
||||
.LCOS0:
|
||||
.quad 0xffffffffffffffff
|
||||
.LCOS1:
|
||||
end ['EAX'];
|
||||
|
||||
|
||||
function exp(d : real) : real;assembler;
|
||||
asm
|
||||
// comes from DJ GPP
|
||||
fldl 8(%ebp)
|
||||
fldl2e
|
||||
fmulp
|
||||
fstcw .LCW1
|
||||
fstcw .LCW2
|
||||
fwait
|
||||
andw $0xf3ff,.LCW2
|
||||
orw $0x0400,.LCW2
|
||||
fldcw .LCW2
|
||||
fldl %st(0)
|
||||
frndint
|
||||
fldcw .LCW1
|
||||
fxch %st(1)
|
||||
fsub %st(1),%st
|
||||
f2xm1
|
||||
fld1
|
||||
faddp
|
||||
fscale
|
||||
fstp %st(1)
|
||||
jmp .LCW3
|
||||
|
||||
// store some help data in the data segment
|
||||
.data
|
||||
.LCW1:
|
||||
.word 0
|
||||
.LCW2:
|
||||
.word 0
|
||||
.text
|
||||
.LCW3:
|
||||
end;
|
||||
|
||||
|
||||
function frac(d : real) : real;assembler;
|
||||
asm
|
||||
subl $16,%esp
|
||||
fnstcw -4(%ebp)
|
||||
fwait
|
||||
movw -4(%ebp),%cx
|
||||
orw $0x0c3f,%cx
|
||||
movw %cx,-8(%ebp)
|
||||
fldcw -8(%ebp)
|
||||
fwait
|
||||
fldl 8(%ebp)
|
||||
frndint
|
||||
fldl 8(%ebp)
|
||||
fsub %st(1)
|
||||
fstp %st(1)
|
||||
fclex
|
||||
fldcw -4(%ebp)
|
||||
end ['ECX'];
|
||||
|
||||
|
||||
function int(d : real) : real;assembler;
|
||||
asm
|
||||
subl $16,%esp
|
||||
fnstcw -4(%ebp)
|
||||
fwait
|
||||
movw -4(%ebp),%cx
|
||||
orw $0x0c3f,%cx
|
||||
movw %cx,-8(%ebp)
|
||||
fldcw -8(%ebp)
|
||||
fwait
|
||||
fldl 8(%ebp)
|
||||
frndint
|
||||
fclex
|
||||
fldcw -4(%ebp)
|
||||
end ['ECX'];
|
||||
|
||||
|
||||
function trunc(d : real) : longint;assembler;
|
||||
asm
|
||||
subl $16,%esp
|
||||
fnstcw -4(%ebp)
|
||||
fwait
|
||||
movw -4(%ebp),%cx
|
||||
orw $0x0c3f,%cx
|
||||
movw %cx,-8(%ebp)
|
||||
fldcw -8(%ebp)
|
||||
fwait
|
||||
fldl 8(%ebp)
|
||||
fistpl -8(%ebp)
|
||||
movl -8(%ebp),%eax
|
||||
fldcw -4(%ebp)
|
||||
end ['EAX','ECX'];
|
||||
|
||||
|
||||
function round(d : real) : longint;assembler;
|
||||
asm
|
||||
subl $8,%esp
|
||||
fnstcw -4(%ebp)
|
||||
fwait
|
||||
movw $0x1372,-8(%ebp)
|
||||
fldcw -8(%ebp)
|
||||
fwait
|
||||
fldl 8(%ebp)
|
||||
fistpl -8(%ebp)
|
||||
movl -8(%ebp),%eax
|
||||
fldcw -4(%ebp)
|
||||
end ['EAX','ECX'];
|
||||
|
||||
|
||||
function ln(d : real) : real;assembler;
|
||||
asm
|
||||
fldln2
|
||||
fldl 8(%ebp)
|
||||
fyl2x
|
||||
end [];
|
||||
|
||||
|
||||
function sin(d : real) : real;assembler;
|
||||
asm
|
||||
fldl 8(%ebp)
|
||||
fsin
|
||||
fstsw
|
||||
sahf
|
||||
jnp .LSIN1
|
||||
fstp %st(0)
|
||||
fldl .LSIN0
|
||||
jmp .LSIN1
|
||||
.LSIN0:
|
||||
.quad 0xffffffffffffffff
|
||||
.LSIN1:
|
||||
end ['EAX'];
|
||||
|
||||
|
||||
function power(bas,expo : real) : real;
|
||||
begin
|
||||
power:=exp(ln(bas)*expo);
|
||||
end;
|
||||
|
||||
{$else DEFAULT_EXTENDED}
|
||||
|
||||
{****************************************************************************
|
||||
EXTENDED data type routines
|
||||
****************************************************************************}
|
||||
|
||||
{$ifndef NEWATT}
|
||||
{$asmmode DIRECT}
|
||||
{$endif}
|
||||
|
||||
function pi : extended;assembler;[internconst:in_const_pi];
|
||||
asm
|
||||
fldpi
|
||||
@ -409,8 +215,6 @@
|
||||
power:=exp(ln(bas)*expo);
|
||||
end;
|
||||
|
||||
{$endif DEFAULT_EXTENDED}
|
||||
|
||||
|
||||
{****************************************************************************
|
||||
Longint data type routines
|
||||
@ -539,11 +343,17 @@
|
||||
|
||||
{$endif SUPPORT_FIXED}
|
||||
|
||||
{$ASMMODE ATT}
|
||||
{$ifndef NEWATT}
|
||||
{$asmmode ATT}
|
||||
{$endif}
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.13 1998-12-15 22:42:56 peter
|
||||
Revision 1.14 1999-03-01 15:40:57 peter
|
||||
* use external names
|
||||
* removed all direct assembler modes
|
||||
|
||||
Revision 1.13 1998/12/15 22:42:56 peter
|
||||
* removed temp symbols
|
||||
|
||||
Revision 1.12 1998/11/24 12:54:57 peter
|
||||
|
@ -14,94 +14,93 @@
|
||||
**********************************************************************}
|
||||
|
||||
{ Run-Time type information routines - processor dependent part }
|
||||
{$ASMMODE DIRECT}
|
||||
|
||||
Procedure Initialize (Data,TypeInfo : pointer);[Public,Alias:'FPC_INITIALIZE'];assembler;
|
||||
asm
|
||||
# Save registers
|
||||
// Save registers
|
||||
push %eax
|
||||
push %ebx
|
||||
push %ecx
|
||||
push %edx
|
||||
# decide what type it is
|
||||
// decide what type it is
|
||||
movl 12(%ebp),%ebx
|
||||
movb (%ebx),%al
|
||||
# This is MANIFESTLY wrong
|
||||
// This is MANIFESTLY wrong
|
||||
subb $9,%al
|
||||
jz .DoAnsiStringInit
|
||||
jz .LDoAnsiStringInit
|
||||
decb %al
|
||||
jz .DoAnsiStringInit
|
||||
jz .LDoAnsiStringInit
|
||||
subb $3,%al
|
||||
jz .DoArrayInit
|
||||
jz .LDoArrayInit
|
||||
decb %al
|
||||
jz .DoRecordInit
|
||||
jz .LDoRecordInit
|
||||
decb %al
|
||||
decb %al
|
||||
jz .DoObjectInit
|
||||
jz .LDoObjectInit
|
||||
decb %al
|
||||
jz .DoClassInit
|
||||
jmp .ExitInitialize
|
||||
.DoObjectInit:
|
||||
.DoClassInit:
|
||||
.DoRecordInit:
|
||||
jz .LDoClassInit
|
||||
jmp .LExitInitialize
|
||||
.LDoObjectInit:
|
||||
.LDoClassInit:
|
||||
.LDoRecordInit:
|
||||
incl %ebx
|
||||
movzbl (%ebx),%eax
|
||||
# Skip also recordsize.
|
||||
// Skip also recordsize.
|
||||
addl $5,%eax
|
||||
addl %eax,%ebx
|
||||
# %ebx points to element count. Set in %edx
|
||||
// %ebx points to element count. Set in %edx
|
||||
movl (%ebx),%edx
|
||||
addl $4,%ebx
|
||||
# %ebx points to First element in record
|
||||
.MyRecordInitLoop:
|
||||
// %ebx points to First element in record
|
||||
.LMyRecordInitLoop:
|
||||
decl %edx
|
||||
jl .ExitInitialize
|
||||
# %ebx points to typeinfo pointer
|
||||
# Push type
|
||||
jl .LExitInitialize
|
||||
// %ebx points to typeinfo pointer
|
||||
// Push type
|
||||
pushl (%ebx)
|
||||
addl $4,%ebx
|
||||
# %ebx points to offset in record.
|
||||
# Us it to calculate data
|
||||
// %ebx points to offset in record.
|
||||
// Us it to calculate data
|
||||
movl 8(%ebp),%eax
|
||||
addl (%ebx),%eax
|
||||
addl $4,%ebx
|
||||
# push data
|
||||
// push data
|
||||
pushl %eax
|
||||
call FPC_INITIALIZE
|
||||
jmp .MyRecordInitLoop
|
||||
# Array handling
|
||||
.DoArrayInit:
|
||||
# Skip array name !!
|
||||
call INITIALIZE
|
||||
jmp .LMyRecordInitLoop
|
||||
// Array handling
|
||||
.LDoArrayInit:
|
||||
// Skip array name !!
|
||||
incl %ebx
|
||||
movzbl (%ebx),%eax
|
||||
incl %eax
|
||||
addl %eax,%ebx
|
||||
# %ebx points to size. Put size in ecx
|
||||
// %ebx points to size. Put size in ecx
|
||||
movl (%ebx),%ecx
|
||||
addl $4, %ebx
|
||||
# %ebx points to count. Put count in %edx
|
||||
// %ebx points to count. Put count in %edx
|
||||
movl (%ebx),%edx
|
||||
addl $4, %ebx
|
||||
# %ebx points to type. Put into ebx.
|
||||
# Start treating elements.
|
||||
.MyArrayInitLoop:
|
||||
// %ebx points to type. Put into ebx.
|
||||
// Start treating elements.
|
||||
.LMyArrayInitLoop:
|
||||
decl %edx
|
||||
jl .ExitInitialize
|
||||
# push type
|
||||
jl .LExitInitialize
|
||||
// push type
|
||||
pushl (%ebx)
|
||||
# calculate data
|
||||
// calculate data
|
||||
movl %ecx,%eax
|
||||
imull %edx,%eax
|
||||
addl 8(%ebp),%eax
|
||||
# push data
|
||||
// push data
|
||||
pushl %eax
|
||||
call FPC_INITIALIZE
|
||||
jmp .MyArrayInitLoop
|
||||
# AnsiString handling :
|
||||
.DoAnsiStringInit:
|
||||
call INITIALIZE
|
||||
jmp .LMyArrayInitLoop
|
||||
// AnsiString handling :
|
||||
.LDoAnsiStringInit:
|
||||
movl 8(%ebp), %eax
|
||||
movl $0,(%eax)
|
||||
.ExitInitialize:
|
||||
.LExitInitialize:
|
||||
pop %edx
|
||||
pop %ecx
|
||||
pop %ebx
|
||||
@ -115,84 +114,84 @@ asm
|
||||
push %ebx
|
||||
push %ecx
|
||||
push %edx
|
||||
# decide what type it is
|
||||
// decide what type it is
|
||||
movl 12(%ebp),%ebx
|
||||
movb (%ebx),%al
|
||||
subb $9,%al
|
||||
jz .DoAnsiStringFinal
|
||||
jz .LDoAnsiStringFinal
|
||||
decb %al
|
||||
jz .DoAnsiStringFinal
|
||||
jz .LDoAnsiStringFinal
|
||||
subb $3,%al
|
||||
jz .DoArrayFinal
|
||||
jz .LDoArrayFinal
|
||||
decb %al
|
||||
jz .DoRecordFinal
|
||||
jz .LDoRecordFinal
|
||||
decb %al
|
||||
decb %al
|
||||
jz .DoObjectFinal
|
||||
jz .LDoObjectFinal
|
||||
decb %al
|
||||
jz .DoClassFinal
|
||||
jmp .ExitFinalize
|
||||
.DoClassFinal:
|
||||
.DoObjectFinal:
|
||||
.DoRecordFinal:
|
||||
jz .LDoClassFinal
|
||||
jmp .LExitFinalize
|
||||
.LDoClassFinal:
|
||||
.LDoObjectFinal:
|
||||
.LDoRecordFinal:
|
||||
incl %ebx
|
||||
movzbl (%ebx),%eax
|
||||
# Skip also recordsize.
|
||||
// Skip also recordsize.
|
||||
addl $5,%eax
|
||||
addl %eax,%ebx
|
||||
# %ebx points to element count. Set in %edx
|
||||
// %ebx points to element count. Set in %edx
|
||||
movl (%ebx),%edx
|
||||
addl $4,%ebx
|
||||
# %ebx points to First element in record
|
||||
.MyRecordFinalLoop:
|
||||
// %ebx points to First element in record
|
||||
.LMyRecordFinalLoop:
|
||||
decl %edx
|
||||
jl .ExitFinalize
|
||||
# %ebx points to typeinfo pointer
|
||||
# Push type
|
||||
jl .LExitFinalize
|
||||
// %ebx points to typeinfo pointer
|
||||
// Push type
|
||||
pushl (%ebx)
|
||||
addl $4,%ebx
|
||||
# %ebx points to offset.
|
||||
# Use to calculate data
|
||||
// %ebx points to offset.
|
||||
// Use to calculate data
|
||||
movl 8(%ebp),%eax
|
||||
addl (%ebx),%eax
|
||||
addl $4,%ebx
|
||||
# push data
|
||||
// push data
|
||||
pushl %eax
|
||||
call FPC_FINALIZE
|
||||
jmp .MyRecordFinalLoop
|
||||
# Array handling
|
||||
.DoArrayFinal:
|
||||
# Skip array name !!
|
||||
call FINALIZE
|
||||
jmp .LMyRecordFinalLoop
|
||||
// Array handling
|
||||
.LDoArrayFinal:
|
||||
// Skip array name !!
|
||||
incl %ebx
|
||||
movzbl (%ebx),%eax
|
||||
incl %eax
|
||||
addl %eax,%ebx
|
||||
# %ebx points to size. Put size in ecx
|
||||
// %ebx points to size. Put size in ecx
|
||||
movl (%ebx),%ecx
|
||||
addl $4, %ebx
|
||||
# %ebx points to count. Put count in %edx
|
||||
// %ebx points to count. Put count in %edx
|
||||
movl (%ebx),%edx
|
||||
addl $4, %ebx
|
||||
# %ebx points to type. Put into ebx.
|
||||
# Start treating elements.
|
||||
.MyArrayFinalLoop:
|
||||
// %ebx points to type. Put into ebx.
|
||||
// Start treating elements.
|
||||
.LMyArrayFinalLoop:
|
||||
decl %edx
|
||||
jl .ExitFinalize
|
||||
# push type
|
||||
jl .LExitFinalize
|
||||
// push type
|
||||
pushl (%ebx)
|
||||
# calculate data
|
||||
// calculate data
|
||||
movl %ecx,%eax
|
||||
imull %edx,%eax
|
||||
addl 8(%ebp),%eax
|
||||
# push data
|
||||
// push data
|
||||
pushl %eax
|
||||
call FPC_FINALIZE
|
||||
jmp .MyArrayFinalLoop
|
||||
# AnsiString handling :
|
||||
.DoAnsiStringFinal:
|
||||
call FINALIZE
|
||||
jmp .LMyArrayFinalLoop
|
||||
// AnsiString handling :
|
||||
.LDoAnsiStringFinal:
|
||||
pushl 8(%ebp)
|
||||
call FPC_ANSISTR_DECR_REF
|
||||
.ExitFinalize:
|
||||
call ANSISTR_DECR_REF
|
||||
.LExitFinalize:
|
||||
pop %edx
|
||||
pop %ecx
|
||||
pop %ebx
|
||||
@ -202,82 +201,82 @@ end;
|
||||
|
||||
Procedure Addref (Data,TypeInfo : Pointer); [Public,alias : 'FPC_ADDREF'];Assembler;
|
||||
asm
|
||||
# Save registers
|
||||
// Save registers
|
||||
push %eax
|
||||
push %ebx
|
||||
push %ecx
|
||||
push %edx
|
||||
# decide what type it is
|
||||
// decide what type it is
|
||||
movl 12(%ebp),%ebx
|
||||
movb (%ebx),%al
|
||||
subb $9,%al
|
||||
jz .DoAnsiStringAddRef
|
||||
jz .LDoAnsiStringAddRef
|
||||
decb %al
|
||||
jz .DoAnsiStringAddRef
|
||||
jz .LDoAnsiStringAddRef
|
||||
subb $2,%al
|
||||
jz .DoArrayAddRef
|
||||
jz .LDoArrayAddRef
|
||||
decb %al
|
||||
jz .DoRecordAddRef
|
||||
jz .LDoRecordAddRef
|
||||
decb %al
|
||||
decb %al
|
||||
jz .DoObjectAddRef
|
||||
jz .LDoObjectAddRef
|
||||
decb %al
|
||||
jz .DoClassAddRef
|
||||
jmp .ExitAddRef
|
||||
.DoClassAddRef:
|
||||
.DoObjectAddRef:
|
||||
.DoRecordAddRef:
|
||||
jz .LDoClassAddRef
|
||||
jmp .LExitAddRef
|
||||
.LDoClassAddRef:
|
||||
.LDoObjectAddRef:
|
||||
.LDoRecordAddRef:
|
||||
incl %ebx
|
||||
movzbl (%ebx),%eax
|
||||
# Skip also recordsize.
|
||||
// Skip also recordsize.
|
||||
addl $5,%eax
|
||||
addl %eax,%ebx
|
||||
# %ebx points to element count. Set in %edx
|
||||
// %ebx points to element count. Set in %edx
|
||||
movl (%ebx),%edx
|
||||
addl $4,%ebx
|
||||
# %ebx points to First element in record
|
||||
.MyRecordAddRefLoop:
|
||||
// %ebx points to First element in record
|
||||
.LMyRecordAddRefLoop:
|
||||
decl %edx
|
||||
jl .ExitAddRef
|
||||
# Calculate data
|
||||
jl .LExitAddRef
|
||||
// Calculate data
|
||||
movl 8(%ebp),%eax
|
||||
addl (%ebx),%eax
|
||||
addl $4,%ebx
|
||||
# Push type
|
||||
// Push type
|
||||
pushl (%ebx)
|
||||
addl $4,%ebx
|
||||
# push data
|
||||
// push data
|
||||
pushl %eax
|
||||
call FPC_ADDREF
|
||||
jmp .MyRecordAddRefLoop
|
||||
# Array handling
|
||||
.DoArrayAddRef:
|
||||
# %ebx points to size. Put size in ecx
|
||||
call ADDREF
|
||||
jmp .LMyRecordAddRefLoop
|
||||
// Array handling
|
||||
.LDoArrayAddRef:
|
||||
// %ebx points to size. Put size in ecx
|
||||
movl (%ebx),%ecx
|
||||
addl $4, %ebx
|
||||
# %ebx points to count. Put count in %edx
|
||||
// %ebx points to count. Put count in %edx
|
||||
movl (%ebx),%edx
|
||||
addl $4, %ebx
|
||||
# %ebx points to type. Put into ebx.
|
||||
# Start treating elements.
|
||||
.MyArrayAddRefLoop:
|
||||
// %ebx points to type. Put into ebx.
|
||||
// Start treating elements.
|
||||
.LMyArrayAddRefLoop:
|
||||
decl %edx
|
||||
jl .ExitAddRef
|
||||
# push type
|
||||
jl .LExitAddRef
|
||||
// push type
|
||||
pushl (%ebx)
|
||||
# calculate data
|
||||
// calculate data
|
||||
movl %ecx,%eax
|
||||
imull %edx,%eax
|
||||
addl 8(%ebp),%eax
|
||||
# push data
|
||||
// push data
|
||||
pushl %eax
|
||||
call FPC_ADDREF
|
||||
jmp .MyArrayAddRefLoop
|
||||
# AnsiString handling :
|
||||
.DoAnsiStringAddRef:
|
||||
call ADDREF
|
||||
jmp .LMyArrayAddRefLoop
|
||||
// AnsiString handling :
|
||||
.LDoAnsiStringAddRef:
|
||||
pushl 8(%ebp)
|
||||
call FPC_ANSISTR_INCR_REF
|
||||
.ExitAddRef:
|
||||
call ANSISTR_INCR_REF
|
||||
.LExitAddRef:
|
||||
pop %edx
|
||||
pop %ecx
|
||||
pop %ebx
|
||||
@ -287,94 +286,96 @@ end;
|
||||
|
||||
Procedure DecRef (Data,TypeInfo : Pointer); [Public,alias : 'FPC_DECREF'];Assembler;
|
||||
asm
|
||||
# Save registers
|
||||
// Save registers
|
||||
push %eax
|
||||
push %ebx
|
||||
push %ecx
|
||||
push %edx
|
||||
# decide what type it is
|
||||
// decide what type it is
|
||||
movl 12(%ebp),%ebx
|
||||
movb (%ebx),%al
|
||||
subb $9,%al
|
||||
jz .DoAnsiStringDecRef
|
||||
jz .LDoAnsiStringDecRef
|
||||
decb %al
|
||||
jz .DoAnsiStringDecRef
|
||||
jz .LDoAnsiStringDecRef
|
||||
subb $2,%al
|
||||
jz .DoArrayDecRef
|
||||
jz .LDoArrayDecRef
|
||||
decb %al
|
||||
jz .DoRecordDecRef
|
||||
jz .LDoRecordDecRef
|
||||
decb %al
|
||||
decb %al
|
||||
jz .DoObjectDecRef
|
||||
jz .LDoObjectDecRef
|
||||
decb %al
|
||||
jz .DoClassDecRef
|
||||
jmp .ExitDecRef
|
||||
.DoClassDecRef:
|
||||
.DoObjectDecRef:
|
||||
.DoRecordDecRef:
|
||||
jz .LDoClassDecRef
|
||||
jmp .LExitDecRef
|
||||
.LDoClassDecRef:
|
||||
.LDoObjectDecRef:
|
||||
.LDoRecordDecRef:
|
||||
incl %ebx
|
||||
movzbl (%ebx),%eax
|
||||
# Skip also recordsize.
|
||||
// Skip also recordsize.
|
||||
addl $5,%eax
|
||||
addl %eax,%ebx
|
||||
# %ebx points to element count. Set in %edx
|
||||
// %ebx points to element count. Set in %edx
|
||||
movl (%ebx),%edx
|
||||
addl $4,%ebx
|
||||
# %ebx points to First element in record
|
||||
.MyRecordDecRefLoop:
|
||||
// %ebx points to First element in record
|
||||
.LMyRecordDecRefLoop:
|
||||
decl %edx
|
||||
jl .ExitDecRef
|
||||
# Calculate data
|
||||
jl .LExitDecRef
|
||||
// Calculate data
|
||||
movl 8(%ebp),%eax
|
||||
addl (%ebx),%eax
|
||||
addl $4,%ebx
|
||||
# Push type
|
||||
// Push type
|
||||
pushl (%ebx)
|
||||
addl $4,%ebx
|
||||
# push data
|
||||
// push data
|
||||
pushl %eax
|
||||
call FPC_DECREF
|
||||
jmp .MyRecordDecRefLoop
|
||||
# Array handling
|
||||
.DoArrayDecRef:
|
||||
# %ebx points to size. Put size in ecx
|
||||
call DECREF
|
||||
jmp .LMyRecordDecRefLoop
|
||||
// Array handling
|
||||
.LDoArrayDecRef:
|
||||
// %ebx points to size. Put size in ecx
|
||||
movl (%ebx),%ecx
|
||||
addl $4, %ebx
|
||||
# %ebx points to count. Put count in %edx
|
||||
// %ebx points to count. Put count in %edx
|
||||
movl (%ebx),%edx
|
||||
addl $4, %ebx
|
||||
# %ebx points to type. Put into ebx.
|
||||
# Start treating elements.
|
||||
.MyArrayDecRefLoop:
|
||||
// %ebx points to type. Put into ebx.
|
||||
// Start treating elements.
|
||||
.LMyArrayDecRefLoop:
|
||||
decl %edx
|
||||
jl .ExitDecRef
|
||||
# push type
|
||||
jl .LExitDecRef
|
||||
// push type
|
||||
pushl (%ebx)
|
||||
# calculate data
|
||||
// calculate data
|
||||
movl %ecx,%eax
|
||||
imull %edx,%eax
|
||||
addl 8(%ebp),%eax
|
||||
# push data
|
||||
// push data
|
||||
pushl %eax
|
||||
call FPC_DECREF
|
||||
jmp .MyArrayDecRefLoop
|
||||
# AnsiString handling :
|
||||
.DoAnsiStringDecRef:
|
||||
call DECREF
|
||||
jmp .LMyArrayDecRefLoop
|
||||
// AnsiString handling :
|
||||
.LDoAnsiStringDecRef:
|
||||
movl 8(%ebp),%eax
|
||||
pushl %eax
|
||||
call FPC_ANSISTR_DECR_REF
|
||||
.ExitDecRef:
|
||||
call ANSISTR_DECR_REF
|
||||
.LExitDecRef:
|
||||
pop %edx
|
||||
pop %ecx
|
||||
pop %ebx
|
||||
pop %eax
|
||||
end;
|
||||
|
||||
{$ASMMODE DEFAULT}
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.15 1998-12-20 14:08:06 michael
|
||||
Revision 1.16 1999-03-01 15:40:58 peter
|
||||
* use external names
|
||||
* removed all direct assembler modes
|
||||
|
||||
Revision 1.15 1998/12/20 14:08:06 michael
|
||||
+ Finalize fixed after florians fix :)
|
||||
|
||||
Revision 1.14 1998/12/19 00:22:09 florian
|
||||
|
@ -14,8 +14,6 @@
|
||||
|
||||
**********************************************************************}
|
||||
|
||||
{$ASMMODE ATT}
|
||||
|
||||
procedure do_load_small(p : pointer;l:longint);assembler;[public,alias:'FPC_SET_LOAD_SMALL'];
|
||||
{
|
||||
load a normal set p from a smallset l
|
||||
@ -430,7 +428,11 @@ end;
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.9 1999-01-20 17:48:02 jonas
|
||||
Revision 1.10 1999-03-01 15:40:59 peter
|
||||
* use external names
|
||||
* removed all direct assembler modes
|
||||
|
||||
Revision 1.9 1999/01/20 17:48:02 jonas
|
||||
+ fixed bug0163 (set1 <= set2 support)
|
||||
|
||||
Revision 1.8 1998/12/15 22:43:00 peter
|
||||
|
@ -14,8 +14,6 @@
|
||||
|
||||
**********************************************************************}
|
||||
|
||||
{$ASMMODE DIRECT}
|
||||
|
||||
Function SetJmp (Var S : Jmp_buf) : longint;assembler;[Public, alias : 'FPC_SETJMP'];
|
||||
asm
|
||||
movl 8(%ebp),%eax
|
||||
@ -45,14 +43,16 @@ asm
|
||||
movl 8(%ecx),%edi
|
||||
movl 12(%ecx),%ebp
|
||||
movl 16(%ecx),%esp
|
||||
jmp *20(%ecx)
|
||||
jmp 20(%ecx)
|
||||
end;
|
||||
|
||||
{$ASMMODE ATT}
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.4 1998-09-14 10:48:13 peter
|
||||
Revision 1.5 1999-03-01 15:41:00 peter
|
||||
* use external names
|
||||
* removed all direct assembler modes
|
||||
|
||||
Revision 1.4 1998/09/14 10:48:13 peter
|
||||
* FPC_ names
|
||||
* Heap manager is now system independent
|
||||
|
||||
|
@ -3,9 +3,9 @@
|
||||
This file is part of the Free Pascal run time library.
|
||||
Copyright (c) 1998 by the Free Pascal development team
|
||||
|
||||
Processor dependent part of strings.pp, not shared with
|
||||
Processor dependent part of strings.pp, not shared with
|
||||
sysutils unit.
|
||||
|
||||
|
||||
See the file COPYING.FPC, included in this distribution,
|
||||
for details about the copyright.
|
||||
|
||||
@ -15,12 +15,11 @@
|
||||
|
||||
**********************************************************************}
|
||||
|
||||
{$ASMMODE DIRECT}
|
||||
function strpas(p : pchar) : string;
|
||||
begin
|
||||
asm
|
||||
cld
|
||||
movl 12(%ebp),%edi
|
||||
movl p,%edi
|
||||
movl $0xff,%ecx
|
||||
xorl %eax,%eax
|
||||
movl %edi,%esi
|
||||
@ -28,7 +27,11 @@
|
||||
scasb
|
||||
movl %ecx,%eax
|
||||
|
||||
{$ifdef NEWATT1}
|
||||
movl __RESULT,%edi
|
||||
{$else}
|
||||
movl 8(%ebp),%edi
|
||||
{$endif}
|
||||
notb %al
|
||||
decl %eax
|
||||
stosb
|
||||
@ -51,7 +54,7 @@
|
||||
movsb
|
||||
end ['ECX','EAX','ESI','EDI'];
|
||||
end;
|
||||
{$ASMMODE ATT}
|
||||
|
||||
|
||||
function strpcopy(d : pchar;const s : string) : pchar;
|
||||
|
||||
@ -77,7 +80,11 @@
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.2 1999-02-25 10:07:02 michael
|
||||
Revision 1.3 1999-03-01 15:41:01 peter
|
||||
* use external names
|
||||
* removed all direct assembler modes
|
||||
|
||||
Revision 1.2 1999/02/25 10:07:02 michael
|
||||
+ Added header and log
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -37,8 +37,8 @@
|
||||
|
||||
Function NewAnsiString (Len : Longint) : Pointer; forward;
|
||||
Procedure DisposeAnsiString (Var S : Pointer); forward;
|
||||
Procedure Decr_Ansi_Ref (Var S : Pointer); forward;
|
||||
Procedure Incr_Ansi_Ref (Var S : Pointer); forward;
|
||||
Procedure AnsiStr_Decr_Ref (Var S : Pointer); forward;
|
||||
Procedure AnsiStr_Incr_Ref (Var S : Pointer); forward;
|
||||
Procedure AssignAnsiString (Var S1 : Pointer; S2 : Pointer); forward;
|
||||
Function Ansi_String_Concat (S1,S2 : Pointer): Pointer; forward;
|
||||
Procedure Ansi_ShortString_Concat (Var S1: AnsiString; Var S2 : ShortString); forward;
|
||||
@ -114,7 +114,7 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
Procedure Decr_Ansi_Ref (Var S : Pointer);[Public,Alias:'FPC_ANSISTR_DECR_REF'];
|
||||
Procedure AnsiStr_Decr_Ref (Var S : Pointer);[Public,Alias:'FPC_ANSISTR_DECR_REF'];
|
||||
{
|
||||
Decreases the ReferenceCount of a non constant ansistring;
|
||||
If the reference count is zero, deallocate the string;
|
||||
@ -136,7 +136,7 @@ Begin
|
||||
end;
|
||||
|
||||
|
||||
Procedure Incr_Ansi_Ref (Var S : Pointer);[Public,Alias:'FPC_ANSISTR_INCR_REF'];
|
||||
Procedure AnsiStr_Incr_Ref (Var S : Pointer);[Public,Alias:'FPC_ANSISTR_INCR_REF'];
|
||||
Begin
|
||||
If S=Nil then
|
||||
exit;
|
||||
@ -161,7 +161,7 @@ begin
|
||||
SNew:=NewAnsiString (PAnsiRec(Pointer(S)-FirstOff)^.len);
|
||||
Move (Pointer(S)^,SNew^,PAnsiRec(Pointer(S)-FirstOff)^.len+1);
|
||||
PAnsiRec(SNew-FirstOff)^.len:=PAnsiRec(Pointer(S)-FirstOff)^.len;
|
||||
Decr_Ansi_Ref (Pointer(S)); { Thread safe }
|
||||
ansistr_decr_ref (Pointer(S)); { Thread safe }
|
||||
Pointer(S):=SNew;
|
||||
end;
|
||||
end;
|
||||
@ -176,7 +176,7 @@ begin
|
||||
If PAnsiRec(S2-FirstOff)^.Ref>0 then
|
||||
Inc(PAnsiRec(S2-FirstOff)^.ref);
|
||||
{ Decrease the reference count on the old S1 }
|
||||
Decr_Ansi_Ref (S1);
|
||||
ansistr_decr_ref (S1);
|
||||
{ And finally, have S1 pointing to S2 (or its copy) }
|
||||
S1:=S2;
|
||||
end;
|
||||
@ -309,16 +309,6 @@ begin
|
||||
end;
|
||||
}
|
||||
|
||||
{ stupid solution, could be done with public,name in later versions }
|
||||
{$ASMMODE DIRECT}
|
||||
procedure dummy;assembler;
|
||||
asm
|
||||
.globl FPC_EMPTYCHAR
|
||||
FPC_EMPTYCHAR:
|
||||
.byte 0
|
||||
end;
|
||||
{$ASMMODE ATT}
|
||||
|
||||
|
||||
Function AnsiCompare(S1,S2 : Pointer): Longint;[Public,Alias : 'FPC_ANSISTR_COMPARE'];
|
||||
{
|
||||
@ -439,7 +429,7 @@ begin
|
||||
Temp:=Pointer(NewAnsiString(L));
|
||||
if Length(S)>0 then
|
||||
Move (Pointer(S)^,Temp^,Length(S)+1);
|
||||
Decr_Ansi_ref (Pointer(S));
|
||||
ansistr_decr_ref (Pointer(S));
|
||||
Pointer(S):=Temp;
|
||||
end
|
||||
else
|
||||
@ -450,7 +440,7 @@ begin
|
||||
else
|
||||
{ Length=0 }
|
||||
begin
|
||||
Decr_Ansi_Ref (Pointer(S));
|
||||
ansistr_decr_ref (Pointer(S));
|
||||
Pointer(S):=Nil;
|
||||
end;
|
||||
end;
|
||||
@ -741,7 +731,11 @@ end;
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.11 1999-02-04 14:55:42 michael
|
||||
Revision 1.12 1999-03-01 15:41:02 peter
|
||||
* use external names
|
||||
* removed all direct assembler modes
|
||||
|
||||
Revision 1.11 1999/02/04 14:55:42 michael
|
||||
* Fixed pos
|
||||
|
||||
Revision 1.10 1999/02/04 10:49:21 florian
|
||||
|
@ -42,6 +42,11 @@ const
|
||||
{ For Error Handling.}
|
||||
ErrorBase : Longint = 0;
|
||||
|
||||
{ Used by the ansistrings and maybe also other things in the future }
|
||||
var
|
||||
emptychar : char;public name 'FPC_EMPTYCHAR';
|
||||
|
||||
|
||||
{****************************************************************************
|
||||
Routines which have compiler magic
|
||||
****************************************************************************}
|
||||
@ -480,7 +485,11 @@ end;
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.54 1999-02-01 00:05:14 florian
|
||||
Revision 1.55 1999-03-01 15:41:03 peter
|
||||
* use external names
|
||||
* removed all direct assembler modes
|
||||
|
||||
Revision 1.54 1999/02/01 00:05:14 florian
|
||||
+ functions lo/hi for DWord type implemented
|
||||
|
||||
Revision 1.53 1999/01/29 09:23:09 pierre
|
||||
|
@ -913,7 +913,7 @@ var
|
||||
maxlen,spos,len : longint;
|
||||
Begin
|
||||
{ Delete the string }
|
||||
Decr_ansi_ref (Pointer(S));
|
||||
AnsiStr_Decr_ref (Pointer(S));
|
||||
{ We assign room for 1024 characters totally at random.... }
|
||||
Pointer(s):=Pointer(NewAnsiString(1024));
|
||||
MaxLen:=1024;
|
||||
@ -1201,7 +1201,11 @@ end;
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.39 1999-02-17 10:13:29 peter
|
||||
Revision 1.40 1999-03-01 15:41:04 peter
|
||||
* use external names
|
||||
* removed all direct assembler modes
|
||||
|
||||
Revision 1.39 1999/02/17 10:13:29 peter
|
||||
* when error when opening a file, then reset the mode to fmclosed
|
||||
|
||||
Revision 1.38 1999/01/28 19:38:19 peter
|
||||
|
Loading…
Reference in New Issue
Block a user