Quellcode durchsuchen

* fixed test for PIC code on i386

git-svn-id: trunk@32434 -
nickysn vor 9 Jahren
Ursprung
Commit
79336c59de
1 geänderte Dateien mit 117 neuen und 83 gelöschten Zeilen
  1. 117 83
      tests/webtbs/tw29010a.pp

+ 117 - 83
tests/webtbs/tw29010a.pp

@@ -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_after_push: longint;
-  esp_final: longint;
+  Esp: PEspStruct;
 
 
   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);
-    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;
 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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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 esp, esp_initial
+    mov [ebx + TEspStruct.esp_final], esp
+    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!');