* fixed test for PIC code on x86_64

git-svn-id: trunk@32431 -
This commit is contained in:
nickysn 2015-11-21 14:34:28 +00:00
parent 27219ae5ff
commit 82eb67cd24

View File

@ -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!');