Explorar el Código

* saveregister is now working and used for assert and iocheck (which has
been moved to system.inc because it's now system independent)

peter hace 26 años
padre
commit
c5faa84f92
Se han modificado 4 ficheros con 53 adiciones y 12 borrados
  1. 18 1
      compiler/cgai386.pas
  2. 6 1
      compiler/options.pas
  3. 8 2
      rtl/i386/i386.inc
  4. 21 8
      rtl/inc/system.inc

+ 18 - 1
compiler/cgai386.pas

@@ -2693,6 +2693,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
          exprasmlist^.insert(new(pai386,op_reg(A_PUSH,S_L,R_EDI)));
        end;
 
+      { for the save all registers we can simply use a pusha,popa which
+        push edi,esi,ebp,esp(ignored),ebx,edx,ecx,eax }
+      if (po_saveregisters in aktprocsym^.definition^.procoptions) then
+        begin
+          exprasmlist^.insert(new(pai386,op_none(A_PUSHA,S_L)));
+        end;
 
       { omit stack frame ? }
       if not inlined then
@@ -3067,6 +3073,13 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
           }
         end;
 
+      { for the save all registers we can simply use a pusha,popa which
+        push edi,esi,ebp,esp(ignored),ebx,edx,ecx,eax }
+      if (po_saveregisters in aktprocsym^.definition^.procoptions) then
+        begin
+          exprasmlist^.concat(new(pai386,op_none(A_POPA,S_L)));
+        end;
+
       if not(nostackframe) and not inlined then
           exprasmlist^.concat(new(pai386,op_none(A_LEAVE,S_NO)));
       { parameters are limited to 65535 bytes because }
@@ -3163,7 +3176,11 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 end.
 {
   $Log$
-  Revision 1.26  1999-08-05 14:58:04  florian
+  Revision 1.27  1999-08-05 23:45:09  peter
+    * saveregister is now working and used for assert and iocheck (which has
+      been moved to system.inc because it's now system independent)
+
+  Revision 1.26  1999/08/05 14:58:04  florian
     * some fixes for the floating point registers
     * more things for the new code generator
 

+ 6 - 1
compiler/options.pas

@@ -991,6 +991,7 @@ begin
 { Temporary defines, until things settle down }
   def_symbol('INT64');
   def_symbol('HASRESOURCESTRINGS');
+  def_symbol('HASSAVEREGISTERS');
 
 { some stuff for TP compatibility }
 {$ifdef i386}
@@ -1160,7 +1161,11 @@ end;
 end.
 {
   $Log$
-  Revision 1.9  1999-08-04 13:02:46  jonas
+  Revision 1.10  1999-08-05 23:45:10  peter
+    * saveregister is now working and used for assert and iocheck (which has
+      been moved to system.inc because it's now system independent)
+
+  Revision 1.9  1999/08/04 13:02:46  jonas
     * all tokens now start with an underscore
     * PowerPC compiles!!
 

+ 8 - 2
rtl/i386/i386.inc

@@ -795,6 +795,8 @@ end;
 {$endif def SYSTEMDEBUG}
 
 
+{$ifndef HASSAVEREGISTERS}
+
 {****************************************************************************
                                  IoCheck
 ****************************************************************************}
@@ -818,11 +820,15 @@ begin
   end;
 end;
 
-
+{$endif not HASSAVEREGISTERS}
 
 {
   $Log$
-  Revision 1.49  1999-07-06 10:53:52  peter
+  Revision 1.50  1999-08-05 23:45:12  peter
+    * saveregister is now working and used for assert and iocheck (which has
+      been moved to system.inc because it's now system independent)
+
+  Revision 1.49  1999/07/06 10:53:52  peter
     * removed temp defines
 
   Revision 1.48  1999/07/03 09:03:47  florian

+ 21 - 8
rtl/inc/system.inc

@@ -311,6 +311,21 @@ begin
 end;
 
 
+{$ifdef HASSAVEREGISTERS}
+procedure int_iocheck(addr : longint);[saveregisters,public,alias:'FPC_IOCHECK'];
+var
+  l : longint;
+begin
+  if InOutRes<>0 then
+   begin
+     l:=InOutRes;
+     InOutRes:=0;
+     HandleErrorFrame(l,get_frame);
+   end;
+end;
+{$endif}
+
+
 Function IOResult:Word;
 Begin
   IOResult:=InOutRes;
@@ -531,20 +546,14 @@ begin
 end;
 
 
-Procedure int_assert(Const Msg,FName:string;LineNo,ErrorAddr:Longint); [Public,Alias : 'FPC_ASSERT'];
+Procedure int_assert(Const Msg,FName:string;LineNo,ErrorAddr:Longint); [{$ifdef HASSAVEREGISTERS}SaveRegisters,{$endif}Public,Alias : 'FPC_ASSERT'];
 type
   TAssertErrorProc=procedure(const msg,fname:string;lineno,erroraddr:longint);
 begin
-  asm
-    pushal
-  end;
   if AssertErrorProc<>nil then
    TAssertErrorProc(AssertErrorProc)(Msg,FName,LineNo,ErrorAddr)
   else
    HandleError(227);
-  asm
-    popal
-  end;
 end;
 
 
@@ -573,7 +582,11 @@ end;
 
 {
   $Log$
-  Revision 1.65  1999-07-28 12:58:22  peter
+  Revision 1.66  1999-08-05 23:45:14  peter
+    * saveregister is now working and used for assert and iocheck (which has
+      been moved to system.inc because it's now system independent)
+
+  Revision 1.65  1999/07/28 12:58:22  peter
     * fixed assert() to push/pop registers
 
   Revision 1.64  1999/07/05 20:04:27  peter