mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 21:28:03 +02:00
* fixed test for PIC code on x86_64
git-svn-id: trunk@32431 -
This commit is contained in:
parent
27219ae5ff
commit
82eb67cd24
@ -7,12 +7,18 @@ program tw29010b;
|
||||
{$apptype console}
|
||||
{$endif}
|
||||
|
||||
type
|
||||
PRspStruct = ^TRspStruct;
|
||||
TRspStruct = record
|
||||
rsp_initial: qword;
|
||||
rsp_after_push: qword;
|
||||
rsp_final: qword;
|
||||
end;
|
||||
|
||||
var
|
||||
Error: Boolean;
|
||||
|
||||
rsp_initial: qword;
|
||||
rsp_after_push: qword;
|
||||
rsp_final: qword;
|
||||
Rsp: PRspStruct;
|
||||
|
||||
global_proc: procedure;
|
||||
global_word: word;
|
||||
@ -20,15 +26,18 @@ var
|
||||
|
||||
procedure check_rsps(bytes: int64);
|
||||
begin
|
||||
if (rsp_initial - rsp_after_push) <> bytes then
|
||||
with Rsp^ do
|
||||
begin
|
||||
Writeln('Wrong push size, expected ', bytes, ', got ', rsp_initial - rsp_after_push);
|
||||
Error := True;
|
||||
end;
|
||||
if (rsp_final - rsp_after_push) <> bytes then
|
||||
begin
|
||||
Writeln('Wrong pop size, expected ', bytes, ', got ', rsp_final - rsp_after_push);
|
||||
Error := True;
|
||||
if (rsp_initial - rsp_after_push) <> bytes then
|
||||
begin
|
||||
Writeln('Wrong push size, expected ', bytes, ', got ', rsp_initial - rsp_after_push);
|
||||
Error := True;
|
||||
end;
|
||||
if (rsp_final - rsp_after_push) <> bytes then
|
||||
begin
|
||||
Writeln('Wrong pop size, expected ', bytes, ', got ', rsp_final - rsp_after_push);
|
||||
Error := True;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -47,209 +56,234 @@ var
|
||||
local_proc: procedure;
|
||||
local_word: word;
|
||||
local_int64: int64;
|
||||
|
||||
local_rspstruct: PRspStruct;
|
||||
begin
|
||||
local_rspstruct := Rsp;
|
||||
{$ifndef FPC_PIC}
|
||||
Writeln('testing push/pop global_proc');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push global_proc
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop global_proc
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_qword
|
||||
end;
|
||||
|
||||
Writeln('testing push/pop word [global_proc]');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push word [global_proc]
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop word [global_proc]
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_word
|
||||
end;
|
||||
|
||||
|
||||
Writeln('testing push/pop word ptr global_proc');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push word ptr global_proc
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop word ptr global_proc
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_word
|
||||
end;
|
||||
|
||||
Writeln('testing push/pop word ptr [global_proc]');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push word ptr [global_proc]
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop word ptr [global_proc]
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_word
|
||||
end;
|
||||
|
||||
Writeln('testing push/pop global_word');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push global_word
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop global_word
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_word
|
||||
end;
|
||||
|
||||
Writeln('testing push/pop global_int64');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push global_int64
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop global_int64
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_qword
|
||||
end;
|
||||
|
||||
Writeln('testing push/pop word [global_int64]');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push word [global_int64]
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop word [global_int64]
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_word
|
||||
end;
|
||||
|
||||
Writeln('testing push/pop word ptr global_int64');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push word ptr global_int64
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop word ptr global_int64
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_word
|
||||
end;
|
||||
|
||||
Writeln('testing push/pop word ptr [global_int64]');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push word ptr [global_int64]
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop word ptr [global_int64]
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_word
|
||||
end;
|
||||
{$endif FPC_PIC}
|
||||
|
||||
Writeln('testing push/pop local_proc');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx+Trspstruct.rsp_initial], rsp
|
||||
push local_proc
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx+Trspstruct.rsp_after_push], rsp
|
||||
pop local_proc
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx+Trspstruct.rsp_final], rsp
|
||||
mov rsp, [rbx+Trspstruct.rsp_initial]
|
||||
call check_qword
|
||||
end;
|
||||
|
||||
Writeln('testing push/pop word [local_proc]');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push word [local_proc]
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop word [local_proc]
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_word
|
||||
end;
|
||||
|
||||
Writeln('testing push/pop word ptr local_proc');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push word ptr local_proc
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop word ptr local_proc
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_word
|
||||
end;
|
||||
|
||||
Writeln('testing push/pop word ptr [local_proc]');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push word ptr [local_proc]
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop word ptr [local_proc]
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_word
|
||||
end;
|
||||
|
||||
Writeln('testing push/pop local_word');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push local_word
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop local_word
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_word
|
||||
end;
|
||||
|
||||
Writeln('testing push/pop local_int64');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push local_int64
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop local_int64
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_qword
|
||||
end;
|
||||
|
||||
Writeln('testing push/pop word [local_int64]');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push word [local_int64]
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop word [local_int64]
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_word
|
||||
end;
|
||||
|
||||
Writeln('testing push/pop word ptr local_int64');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push word ptr local_int64
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop word ptr local_int64
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_word
|
||||
end;
|
||||
|
||||
Writeln('testing push/pop word ptr [local_int64]');
|
||||
asm
|
||||
mov rsp_initial, rsp
|
||||
mov rbx, local_rspstruct
|
||||
mov [rbx + TRspStruct.rsp_initial], rsp
|
||||
push word ptr [local_int64]
|
||||
mov rsp_after_push, rsp
|
||||
mov [rbx + TRspStruct.rsp_after_push], rsp
|
||||
pop word ptr [local_int64]
|
||||
mov rsp_final, rsp
|
||||
mov rsp, rsp_initial
|
||||
mov [rbx + TRspStruct.rsp_final], rsp
|
||||
mov rsp, [rbx + TRspStruct.rsp_initial]
|
||||
call check_word
|
||||
end;
|
||||
end;
|
||||
|
||||
begin
|
||||
Error := False;
|
||||
New(Rsp);
|
||||
testproc;
|
||||
Dispose(Rsp);
|
||||
if Error then
|
||||
begin
|
||||
Writeln('Errors found!');
|
||||
|
Loading…
Reference in New Issue
Block a user