diff --git a/tests/webtbs/tw29010b.pp b/tests/webtbs/tw29010b.pp index 16b5e32eaa..72baf61292 100644 --- a/tests/webtbs/tw29010b.pp +++ b/tests/webtbs/tw29010b.pp @@ -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!');