mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 17:59:25 +02:00
* fixed test for PIC code on i386
git-svn-id: trunk@32434 -
This commit is contained in:
parent
c9204f6c5e
commit
79336c59de
@ -7,12 +7,18 @@ program tw29010a;
|
|||||||
{$apptype console}
|
{$apptype console}
|
||||||
{$endif fpc}
|
{$endif fpc}
|
||||||
|
|
||||||
|
type
|
||||||
|
PEspStruct = ^TEspStruct;
|
||||||
|
TEspStruct = record
|
||||||
|
esp_initial: longint;
|
||||||
|
esp_after_push: longint;
|
||||||
|
esp_final: longint;
|
||||||
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
Error: Boolean;
|
Error: Boolean;
|
||||||
|
|
||||||
esp_initial: longint;
|
Esp: PEspStruct;
|
||||||
esp_after_push: longint;
|
|
||||||
esp_final: longint;
|
|
||||||
|
|
||||||
global_proc: procedure;
|
global_proc: procedure;
|
||||||
global_word: word;
|
global_word: word;
|
||||||
@ -20,15 +26,18 @@ var
|
|||||||
|
|
||||||
procedure check_esps(bytes: longint);
|
procedure check_esps(bytes: longint);
|
||||||
begin
|
begin
|
||||||
if (esp_initial - esp_after_push) <> bytes then
|
with Esp^ do
|
||||||
begin
|
begin
|
||||||
Writeln('Wrong push size, expected ', bytes, ', got ', esp_initial - esp_after_push);
|
if (esp_initial - esp_after_push) <> bytes then
|
||||||
Error := True;
|
begin
|
||||||
end;
|
Writeln('Wrong push size, expected ', bytes, ', got ', esp_initial - esp_after_push);
|
||||||
if (esp_final - esp_after_push) <> bytes then
|
Error := True;
|
||||||
begin
|
end;
|
||||||
Writeln('Wrong pop size, expected ', bytes, ', got ', esp_final - esp_after_push);
|
if (esp_final - esp_after_push) <> bytes then
|
||||||
Error := True;
|
begin
|
||||||
|
Writeln('Wrong pop size, expected ', bytes, ', got ', esp_final - esp_after_push);
|
||||||
|
Error := True;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -47,209 +56,234 @@ var
|
|||||||
local_proc: procedure;
|
local_proc: procedure;
|
||||||
local_word: word;
|
local_word: word;
|
||||||
local_longint: longint;
|
local_longint: longint;
|
||||||
|
|
||||||
|
local_espstruct: PEspStruct;
|
||||||
begin
|
begin
|
||||||
|
local_espstruct := Esp;
|
||||||
|
{$ifndef FPC_PIC}
|
||||||
Writeln('testing push/pop global_proc');
|
Writeln('testing push/pop global_proc');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push global_proc
|
push global_proc
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop global_proc
|
pop global_proc
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_dword
|
call check_dword
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Writeln('testing push/pop word [global_proc]');
|
Writeln('testing push/pop word [global_proc]');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push word [global_proc]
|
push word [global_proc]
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop word [global_proc]
|
pop word [global_proc]
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_word
|
call check_word
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Writeln('testing push/pop word ptr global_proc');
|
Writeln('testing push/pop word ptr global_proc');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push word ptr global_proc
|
push word ptr global_proc
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop word ptr global_proc
|
pop word ptr global_proc
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_word
|
call check_word
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Writeln('testing push/pop word ptr [global_proc]');
|
Writeln('testing push/pop word ptr [global_proc]');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push word ptr [global_proc]
|
push word ptr [global_proc]
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop word ptr [global_proc]
|
pop word ptr [global_proc]
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_word
|
call check_word
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Writeln('testing push/pop global_word');
|
Writeln('testing push/pop global_word');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push global_word
|
push global_word
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop global_word
|
pop global_word
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_word
|
call check_word
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Writeln('testing push/pop global_longint');
|
Writeln('testing push/pop global_longint');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push global_longint
|
push global_longint
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop global_longint
|
pop global_longint
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_dword
|
call check_dword
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Writeln('testing push/pop word [global_longint]');
|
Writeln('testing push/pop word [global_longint]');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push word [global_longint]
|
push word [global_longint]
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop word [global_longint]
|
pop word [global_longint]
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_word
|
call check_word
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Writeln('testing push/pop word ptr global_longint');
|
Writeln('testing push/pop word ptr global_longint');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push word ptr global_longint
|
push word ptr global_longint
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop word ptr global_longint
|
pop word ptr global_longint
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_word
|
call check_word
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Writeln('testing push/pop word ptr [global_longint]');
|
Writeln('testing push/pop word ptr [global_longint]');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push word ptr [global_longint]
|
push word ptr [global_longint]
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop word ptr [global_longint]
|
pop word ptr [global_longint]
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_word
|
call check_word
|
||||||
end;
|
end;
|
||||||
|
{$endif FPC_PIC}
|
||||||
|
|
||||||
Writeln('testing push/pop local_proc');
|
Writeln('testing push/pop local_proc');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push local_proc
|
push local_proc
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop local_proc
|
pop local_proc
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_dword
|
call check_dword
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Writeln('testing push/pop word [local_proc]');
|
Writeln('testing push/pop word [local_proc]');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push word [local_proc]
|
push word [local_proc]
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop word [local_proc]
|
pop word [local_proc]
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_word
|
call check_word
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Writeln('testing push/pop word ptr local_proc');
|
Writeln('testing push/pop word ptr local_proc');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push word ptr local_proc
|
push word ptr local_proc
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop word ptr local_proc
|
pop word ptr local_proc
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_word
|
call check_word
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Writeln('testing push/pop word ptr [local_proc]');
|
Writeln('testing push/pop word ptr [local_proc]');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push word ptr [local_proc]
|
push word ptr [local_proc]
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop word ptr [local_proc]
|
pop word ptr [local_proc]
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_word
|
call check_word
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Writeln('testing push/pop local_word');
|
Writeln('testing push/pop local_word');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push local_word
|
push local_word
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop local_word
|
pop local_word
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_word
|
call check_word
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Writeln('testing push/pop local_longint');
|
Writeln('testing push/pop local_longint');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push local_longint
|
push local_longint
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop local_longint
|
pop local_longint
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_dword
|
call check_dword
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Writeln('testing push/pop word [local_longint]');
|
Writeln('testing push/pop word [local_longint]');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push word [local_longint]
|
push word [local_longint]
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop word [local_longint]
|
pop word [local_longint]
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_word
|
call check_word
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Writeln('testing push/pop word ptr local_longint');
|
Writeln('testing push/pop word ptr local_longint');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push word ptr local_longint
|
push word ptr local_longint
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop word ptr local_longint
|
pop word ptr local_longint
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_word
|
call check_word
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Writeln('testing push/pop word ptr [local_longint]');
|
Writeln('testing push/pop word ptr [local_longint]');
|
||||||
asm
|
asm
|
||||||
mov esp_initial, esp
|
mov ebx, local_espstruct
|
||||||
|
mov [ebx + TEspStruct.esp_initial], esp
|
||||||
push word ptr [local_longint]
|
push word ptr [local_longint]
|
||||||
mov esp_after_push, esp
|
mov [ebx + TEspStruct.esp_after_push], esp
|
||||||
pop word ptr [local_longint]
|
pop word ptr [local_longint]
|
||||||
mov esp_final, esp
|
mov [ebx + TEspStruct.esp_final], esp
|
||||||
mov esp, esp_initial
|
mov esp, [ebx + TEspStruct.esp_initial]
|
||||||
call check_word
|
call check_word
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Error := False;
|
Error := False;
|
||||||
|
New(Esp);
|
||||||
testproc;
|
testproc;
|
||||||
|
Dispose(Esp);
|
||||||
if Error then
|
if Error then
|
||||||
begin
|
begin
|
||||||
Writeln('Errors found!');
|
Writeln('Errors found!');
|
||||||
|
Loading…
Reference in New Issue
Block a user