Browse Source

* fixed test for PIC code on i386

git-svn-id: trunk@32434 -
nickysn 9 years ago
parent
commit
79336c59de
1 changed files with 117 additions and 83 deletions
  1. 117 83
      tests/webtbs/tw29010a.pp

+ 117 - 83
tests/webtbs/tw29010a.pp

@@ -7,12 +7,18 @@ program tw29010a;
   {$apptype console}
 {$endif fpc}
 
+type
+  PEspStruct = ^TEspStruct;
+  TEspStruct = record
+    esp_initial: longint;
+    esp_after_push: longint;
+    esp_final: longint;
+  end;
+
 var
   Error: Boolean;
 
-  esp_initial: longint;
-  esp_after_push: longint;
-  esp_final: longint;
+  Esp: PEspStruct;
 
   global_proc: procedure;
   global_word: word;
@@ -20,15 +26,18 @@ var
 
 procedure check_esps(bytes: longint);
 begin
-  if (esp_initial - esp_after_push) <> bytes then
+  with Esp^ do
   begin
-    Writeln('Wrong push size, expected ', bytes, ', got ', esp_initial - esp_after_push);
-    Error := True;
-  end;
-  if (esp_final - esp_after_push) <> bytes then
-  begin
-    Writeln('Wrong pop size, expected ', bytes, ', got ', esp_final - esp_after_push);
-    Error := True;
+    if (esp_initial - esp_after_push) <> bytes then
+    begin
+      Writeln('Wrong push size, expected ', bytes, ', got ', esp_initial - esp_after_push);
+      Error := True;
+    end;
+    if (esp_final - esp_after_push) <> bytes then
+    begin
+      Writeln('Wrong pop size, expected ', bytes, ', got ', esp_final - esp_after_push);
+      Error := True;
+    end;
   end;
 end;
 
@@ -47,209 +56,234 @@ var
   local_proc: procedure;
   local_word: word;
   local_longint: longint;
+
+  local_espstruct: PEspStruct;
 begin
+  local_espstruct := Esp;
+{$ifndef FPC_PIC}
   Writeln('testing push/pop global_proc');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push global_proc
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop global_proc
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_dword
   end;
 
   Writeln('testing push/pop word [global_proc]');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push word [global_proc]
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop word [global_proc]
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_word
   end;
   
   Writeln('testing push/pop word ptr global_proc');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push word ptr global_proc
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop word ptr global_proc
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_word
   end;
 
   Writeln('testing push/pop word ptr [global_proc]');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push word ptr [global_proc]
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop word ptr [global_proc]
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_word
   end;
 
   Writeln('testing push/pop global_word');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push global_word
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop global_word
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_word
   end;
 
   Writeln('testing push/pop global_longint');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push global_longint
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop global_longint
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_dword
   end;
 
   Writeln('testing push/pop word [global_longint]');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push word [global_longint]
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop word [global_longint]
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_word
   end;
 
   Writeln('testing push/pop word ptr global_longint');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push word ptr global_longint
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop word ptr global_longint
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_word
   end;
 
   Writeln('testing push/pop word ptr [global_longint]');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push word ptr [global_longint]
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop word ptr [global_longint]
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_word
   end;
+{$endif FPC_PIC}
 
   Writeln('testing push/pop local_proc');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push local_proc
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop local_proc
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_dword
   end;
 
   Writeln('testing push/pop word [local_proc]');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push word [local_proc]
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop word [local_proc]
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_word
   end;
 
   Writeln('testing push/pop word ptr local_proc');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push word ptr local_proc
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop word ptr local_proc
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_word
   end;
 
   Writeln('testing push/pop word ptr [local_proc]');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push word ptr [local_proc]
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop word ptr [local_proc]
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_word
   end;
 
   Writeln('testing push/pop local_word');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push local_word
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop local_word
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_word
   end;
 
   Writeln('testing push/pop local_longint');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push local_longint
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop local_longint
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_dword
   end;
 
   Writeln('testing push/pop word [local_longint]');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push word [local_longint]
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop word [local_longint]
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_word
   end;
 
   Writeln('testing push/pop word ptr local_longint');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push word ptr local_longint
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop word ptr local_longint
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_word
   end;
 
   Writeln('testing push/pop word ptr [local_longint]');
   asm
-    mov esp_initial, esp
+    mov ebx, local_espstruct
+    mov [ebx + TEspStruct.esp_initial], esp
     push word ptr [local_longint]
-    mov esp_after_push, esp
+    mov [ebx + TEspStruct.esp_after_push], esp
     pop word ptr [local_longint]
-    mov esp_final, esp
-    mov esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    mov esp, [ebx + TEspStruct.esp_initial]
     call check_word
   end;
 end;
 
 begin
   Error := False;
+  New(Esp);
   testproc;
+  Dispose(Esp);
   if Error then
   begin
     Writeln('Errors found!');