Ver Fonte

* implemented pop_parasize for the Z80 and declared stdcall to be a clearstack pocall on this arch

git-svn-id: branches/z80@44629 -
nickysn há 5 anos atrás
pai
commit
b2549b63cd
4 ficheiros alterados com 74 adições e 1 exclusões
  1. 1 0
      .gitattributes
  2. 1 1
      compiler/options.pas
  3. 1 0
      compiler/z80/cpunode.pas
  4. 71 0
      compiler/z80/nz80cal.pas

+ 1 - 0
.gitattributes

@@ -1067,6 +1067,7 @@ compiler/z80/cpupi.pas svneol=native#text/plain
 compiler/z80/cputarg.pas svneol=native#text/plain
 compiler/z80/hlcgcpu.pas svneol=native#text/plain
 compiler/z80/nz80add.pas svneol=native#text/plain
+compiler/z80/nz80cal.pas svneol=native#text/plain
 compiler/z80/raz80.pas svneol=native#text/plain
 compiler/z80/raz80asm.pas svneol=native#text/plain
 compiler/z80/rgcpu.pas svneol=native#text/plain

+ 1 - 1
compiler/options.pas

@@ -4687,7 +4687,7 @@ begin
   option.free;
   Option:=nil;
 
-  clearstack_pocalls := [pocall_cdecl,pocall_cppdecl,pocall_syscall,pocall_mwpascal,pocall_sysv_abi_cdecl,pocall_ms_abi_cdecl];
+  clearstack_pocalls := [pocall_cdecl,pocall_cppdecl,pocall_syscall,pocall_mwpascal,pocall_sysv_abi_cdecl,pocall_ms_abi_cdecl{$ifdef z80},pocall_stdcall{$endif}];
   cdecl_pocalls := [pocall_cdecl, pocall_cppdecl, pocall_mwpascal, pocall_sysv_abi_cdecl, pocall_ms_abi_cdecl];
   if (tf_safecall_clearstack in target_info.flags) then
     begin

+ 1 - 0
compiler/z80/cpunode.pas

@@ -35,6 +35,7 @@ unit cpunode;
          after the generic one (FK)
        }
        ,nz80add
+       ,nz80cal
 //       ,nz80mat
 //       ,nz80cnv
 //       ,nz80mem

+ 71 - 0
compiler/z80/nz80cal.pas

@@ -0,0 +1,71 @@
+{
+    Copyright (c) 1998-2002 by Florian Klaempfl
+
+    Generate Z80 assembler for in call nodes
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ ****************************************************************************
+}
+unit nz80cal;
+
+{$i fpcdefs.inc}
+
+interface
+
+    uses
+      ncgcal;
+
+    type
+       tz80callnode = class(tcgcallnode)
+       protected
+          procedure pop_parasize(pop_size:longint);override;
+       end;
+
+
+implementation
+
+    uses
+      cpubase,
+      aasmdata,aasmcpu,
+      ncal,
+      cgobj;
+
+
+{*****************************************************************************
+                             TZ80CALLNODE
+*****************************************************************************}
+
+
+    procedure tz80callnode.pop_parasize(pop_size:longint);
+      begin
+        if pop_size>=2 then
+          begin
+            cg.getcpuregister(current_asmdata.CurrAsmList,NR_A);
+            while pop_size>=2 do
+              begin
+                current_asmdata.CurrAsmList.Concat(taicpu.op_reg(A_POP,NR_AF));
+                dec(pop_size,2);
+              end;
+            cg.ungetcpuregister(current_asmdata.CurrAsmList,NR_A);
+          end;
+        if pop_size=1 then
+          current_asmdata.CurrAsmList.Concat(taicpu.op_reg(A_INC,NR_SP));
+      end;
+
+
+begin
+   ccallnode:=tz80callnode;
+end.