Selaa lähdekoodia

+ fpc_ppc_yield

florian 1 päivä sitten
vanhempi
sitoutus
0901f4464b

+ 4 - 0
compiler/compinnr.pas

@@ -230,6 +230,10 @@ type
 {$if defined(RISCV)}
      ,
      {$i riscv/ccpuinnr.inc}
+{$endif}
+{$if defined(POWERPC64)}
+     ,
+     {$i ppcgen/ccpuinnr.inc}
 {$endif}
    );
 

+ 41 - 0
compiler/ppcgen/ngppcinl.pas

@@ -46,6 +46,9 @@ interface
           procedure second_trunc_real; override;
           procedure second_round_real; override;
           procedure second_prefetch;override;
+          function pass_typecheck_cpu: tnode; override;
+          function first_cpu: tnode; override;
+          procedure pass_generate_code_cpu; override;
        protected
           procedure load_fpu_location;
           procedure second_trunc_round_real(op: tasmop);
@@ -55,6 +58,7 @@ implementation
 
     uses
       cutils,globals,verbose,globtype,
+      compinnr,
       aasmtai,aasmdata,aasmcpu,
       symconst,symdef,
       defutil,
@@ -67,6 +71,43 @@ implementation
                               tgppcinlinenode
 *****************************************************************************}
 
+     function tgppcinlinenode.pass_typecheck_cpu: tnode;
+       begin
+         Result:=nil;
+         case inlinenumber of
+           in_ppc_yield:
+             resultdef:=voidtype;
+           else
+             result:=inherited;
+         end;
+       end;
+
+
+    function tgppcinlinenode.first_cpu : tnode;
+      begin
+        Result:=nil;
+        case inlinenumber of
+          in_ppc_yield:
+            begin
+              expectloc:=LOC_VOID;
+              resultdef:=voidtype;
+            end;
+          else
+            Result:=inherited first_cpu;
+        end;
+      end;
+
+
+     procedure tgppcinlinenode.pass_generate_code_cpu;
+       begin
+         case inlinenumber of
+           in_ppc_yield:
+             current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg_reg(A_OR,NR_R27,NR_R27,NR_R27));
+           else
+             inherited pass_generate_code_cpu;
+         end;
+       end;
+
     function tgppcinlinenode.first_sqrt_real : tnode;
       begin
         if (current_settings.cputype >= cpu_PPC970) then

+ 23 - 22
rtl/linux/Makefile

@@ -194,7 +194,7 @@ endif
 endif
 ifeq ($(CPU_OS_TARGET),aarch64-embedded)
 endif
-ifdef SUB_TARGET 
+ifdef SUB_TARGET
 FPCOPT+=-t$(SUB_TARGET)
 FPMAKE_OPT+=--subtarget=$(SUB_TARGET)
 endif
@@ -963,6 +963,7 @@ endif
 ifeq ($(ARCH),powerpc64)
 override LOADERS=
 SYSINIT_UNITS=si_prc si_c si_g si_dll
+CPU_UNITS=$(INTRINSICSUNIT)
 endif
 ifeq ($(ARCH),sparc64)
 override LOADERS=
@@ -2964,7 +2965,7 @@ FPINTRES_DEPS= $(INC)/fpintres.pp $(SYSTEMUNIT)$(PPUEXT) \
 fpintres$(PPUEXT) : $(FPINTRES_DEPS)
 	$(COMPILER) $(FPINTRES_OPT) $<
 FPEXTRES_DEPS= $(INC)/fpextres.pp $(SYSTEMUNIT)$(PPUEXT) \
-	       $(FPEXTRES_DEPS_OS) $(FPEXTRES_DEPS_CPU)              
+	       $(FPEXTRES_DEPS_OS) $(FPEXTRES_DEPS_CPU)
 fpextres$(PPUEXT) : $(FPEXTRES_DEPS)
 	$(COMPILER) -Sg $(FPEXTRES_OPT) $<
 HEAPTRC_DEPS=$(INC)/heaptrc.pp \
@@ -2975,13 +2976,13 @@ heaptrc$(PPUEXT) : $(HEAPTRC_DEPS)
 SOFTFPU_DEPS=$(INC)/softfpu.pp \
 	     $(SYSTEMUNIT)$(PPUEXT) $(OBJPASUNIT)$(PPUEXT) \
 	     $(SOFTFPU_DEPS_OS) $(SOFTFPU_DEPS_CPU)
-softfpu$(PPUEXT) : $(SOFTFPU_DEPS) 
+softfpu$(PPUEXT) : $(SOFTFPU_DEPS)
 	$(COMPILER) -Sg $(SOFTFPU_OPT) $<
-System.SoftFPU$(PPUEXT) : $(NSINC)/System.SoftFPU.pp $(SOFTFPU_DEPS) 
+System.SoftFPU$(PPUEXT) : $(NSINC)/System.SoftFPU.pp $(SOFTFPU_DEPS)
 	$(COMPILER) -Sg $(SOFTFPU_OPT) $<
 SFPUX80_DEPS=$(INC)/sfpux80.pp $(INC)/softfpu.pp \
 	     $(SYSTEMUNIT)$(PPUEXT) $(OBJPASUNIT)$(PPUEXT) \
-	     $(SFPUX80_DEPS_OS) $(SFPUX80_DEPS_CPU) 
+	     $(SFPUX80_DEPS_OS) $(SFPUX80_DEPS_CPU)
 sfpux80$(PPUEXT) : $(SFPUX80_DEPS)
 	$(COMPILER) -Sg $(SFPUX80_OPT) $<
 System.SoftFpuX80$(PPUEXT) : $(NSINC)/System.SoftFpuX80.pp  $(SFPUX80_DEPS)
@@ -3018,7 +3019,7 @@ System.Strings$(PPUEXT) : $(NSINC)/System.Strings.pp $(STRINGS_DEPS)
 PORTS_DEPS=$(PORTSDIR)/ports.$(PORTSUNITEXT) \
 	   $(SYSTEMUNIT)$(PPUEXT) \
 	   $(PORTS_DEPS_OS) $(PORTS_DEPS_CPU)
-ports$(PPUEXT) : $(PORTS_DEPS) 
+ports$(PPUEXT) : $(PORTS_DEPS)
 	$(COMPILER) $(PORTS_OPT) $<
 System.Ports$(PPUEXT) :  $(NSINC)/System.Ports.$(PORTSUNITEXT) $(PORTS_DEPS)
 	$(COMPILER) $(PORTS_OPT) $<
@@ -3061,7 +3062,7 @@ LINUX_DEPS=$(LINUXINC)/linux.pp \
 	   $(LINUX_DEPS_OS) $(LINUX_DEPS_CPU)
 linux$(PPUEXT): $(LINUX_DEPS)
 	$(COMPILER) $<
-LinuxApi$(PPUEXT): $(NSOSDIR)/LinuxApi.pp $(LINUX_DEPS) 
+LinuxApi$(PPUEXT): $(NSOSDIR)/LinuxApi.pp $(LINUX_DEPS)
 	$(COMPILER) $(LINUX_OPT) $<
 LINUXVCS_DEPS=$(LINUXINC)/linuxvcs.pp $(BASEUNIXUNIT)$(PPUEXT) $(STRINGSUNIT)$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT) \
 	      $(LINUXVCS_DEPS_OS) $(LINUXVCS_DEPS_CPU)
@@ -3123,7 +3124,7 @@ CLASSES_DEPS=$(CLASSESDIR)/classes.pp $(TTHREADINCDIR)/tthread.inc $(wildcard $(
 	     $(CLASSES_DEPS_OS) $(CLASSES_DEPS_CPU)
 classes$(PPUEXT) : $(CLASSES_DEPS)
 	$(COMPILER) -Fi$(OBJPASDIR)/classes $(CLASSES_OPT) $<
-System.Classes$(PPUEXT) : $(NSINC)/System.Classes.pp $(CLASSES_DEPS) 
+System.Classes$(PPUEXT) : $(NSINC)/System.Classes.pp $(CLASSES_DEPS)
 	$(COMPILER) -Fi$(OBJPASDIR)/classes $(CLASSES_OPT) $<
 TYPINFO_DEPS=$(OBJPASDIR)/typinfo.pp \
 	     $(OBJPASUNIT)$(PPUEXT) $(SYSUTILSUNIT)$(PPUEXT) $(RTLCONSTSUNIT)$(PPUEXT) \
@@ -3194,7 +3195,7 @@ System.CPU$(PPUEXT) : $(NSINC)/System.CPU.pp $(CPU_DEPS)
 	$(COMPILER) $(CPU_OPT) $<
 MMX_DEPS=$(PROCINC)/mmx.pp \
 	 $(CPUUNIT)$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT) \
-	 $(MMX_DEPS_OS) $(MMX_DEPS_CPU) 
+	 $(MMX_DEPS_OS) $(MMX_DEPS_CPU)
 mmx$(PPUEXT) : $(MMX_DEPS)
 	$(COMPILER) $(MMX_OPT) $<
 System.CPU.MMX$(PPUEXT) : $(NSINC)/System.CPU.MMX.pp $(MMX_DEPS)
@@ -3259,7 +3260,7 @@ CHARSET_DEPS=$(INC)/charset.pp \
 charset$(PPUEXT) : $(CHARSET_DEPS)
 	$(COMPILER) $(CHARSET_OPT) $<
 System.CharSet$(PPUEXT) : $(NSINC)/System.CharSet.pp $(CHARSET_DEPS)
-	$(COMPILER) $(CHARSET_OPT) $< 
+	$(COMPILER) $(CHARSET_OPT) $<
 UNICODEDATA_DEPS = $(OBJPASDIR)/unicodedata.pas $(OBJPASDIR)/unicodedata.inc \
 		   $(OBJPASDIR)/unicodedata_le.inc $(OBJPASDIR)/unicodedata_be.inc \
 		   $(SYSTEMUNIT)$(PPUEXT) $(OBJPASUNIT)$(PPUEXT)
@@ -3270,7 +3271,7 @@ System.CodePages.unicodedata$(PPUEXT) : $(NSINC)/System.CodePages.unicodedata.pa
 CPALL_DEPS=$(RTL)/charmaps/cpall.pas $(CP_UNITS_SRC) \
 	  system$(PPUEXT) $(CHARSETUNIT)$(PPUEXT) \
 	  $(CPALL_DEPS_OS) $(CPALL_DEPS_CPU)
-cpall$(PPUEXT): $(CPALL_DEPS)  
+cpall$(PPUEXT): $(CPALL_DEPS)
 	$(COMPILER) $(CPALL_OPT) -Fu$(INC) -Fi$(RTL)/charmaps $<
 System.CodePages.All$(PPUEXT):  $(NSINC)/System.CodePages.All.pas $(CPALL_DEPS)
 	$(COMPILER) $(CPALL_OPT) -Fu$(INC) -Fi$(RTL)/charmaps $<
@@ -3295,14 +3296,14 @@ fpwidestring$(PPUEXT): $(FPWIDESTRING_DEPS)
 System.FPWideString$(PPUEXT): $(NSINC)/System.FPWideString.pp $(FPWIDESTRING_DEPS)
 	$(COMPILER) -Fi$(OBJPASDIR) $(FPWIDESTRING_OPT) $<
 SORTBASE_DEPS=$(INC)/sortbase.pp $(OBJPASUNIT)$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT) \
-	      $(SORTBASE_DEPS_OS) $(SORTBASE_DEPS_CPU) 
+	      $(SORTBASE_DEPS_OS) $(SORTBASE_DEPS_CPU)
 sortbase$(PPUEXT) : $(SORTBASE_DEPS)
 	$(COMPILER) $(SORTBASE_OPT) $<
 System.SortBase$(PPUEXT) : $(NSINC)/System.SortBase.pp $(SORTBASE_DEPS)
 	$(COMPILER) $(SORTBASE_OPT) $<
 CALLSPEC_DEPS=$(INC)/callspec.pp \
 	      $(SYSTEMUNIT)$(PPUEXT) \
-	      $(CALLSPEC_DEPS_OS) $(CALLSPEC_DEPS_CPU) 
+	      $(CALLSPEC_DEPS_OS) $(CALLSPEC_DEPS_CPU)
 callspec$(PPUEXT) : $(CALLSPEC_DEPS)
 	$(COMPILER) $(CALLSPEC_OPT) $<
 System.CallSpec$(PPUEXT) : $(NSINC)/System.CallSpec.pp $(CALLSPEC_DEPS)
@@ -3320,10 +3321,10 @@ endif
 BASEUNIX_DEPS=$(BASEUNIXDIR)/baseunix.pp  $(UNIXINC)/ctypes.inc  \
 	      $(UNIXINC)/bunxh.inc $(UNIXINC)/gensigset.inc $(PTYPESINCDIR)/ptypes.inc $(OSDIR)/errno.inc \
 	      $(UNIXTYPEUNIT)$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT) \
-	      $(BASEUNIX_DEPS_OS) $(BASEUNIX_DEPS_CPU) 
+	      $(BASEUNIX_DEPS_OS) $(BASEUNIX_DEPS_CPU)
 baseunix$(PPUEXT): $(BASEUNIX_DEPS)
 	$(COMPILER) $(BASEUNIX_OPT) $<
-UnixApi.Base$(PPUEXT): $(NSINC)/UnixApi.Base.pp $(BASEUNIX_DEPS) 
+UnixApi.Base$(PPUEXT): $(NSINC)/UnixApi.Base.pp $(BASEUNIX_DEPS)
 	$(COMPILER) $(BASEUNIX_OPT) $<
 ifndef UNXINC
   UNXINC=$(OSDIR)
@@ -3343,14 +3344,14 @@ SYSCALL_DEPS=$(UNIXINC)/syscall.pp \
 	     $(SYSCALL_DEPS_OS) $(SYSCALL_DEPS_CPU)
 syscall$(PPUEXT) : $(SYSCALL_DEPS)
 	$(COMPILER) $(SYSCALL_OPT) $<
-UnixApi.SysCall$(PPUEXT) : $(NSINC)/UnixApi.SysCall.pp $(SYSCALL_DEPS) 
+UnixApi.SysCall$(PPUEXT) : $(NSINC)/UnixApi.SysCall.pp $(SYSCALL_DEPS)
 	$(COMPILER) $(SYSCALL_OPT) $<
 UNIXUTIL_DEPS=$(UNIXINC)/unixutil.pp $(INC)/textrec.inc $(INC)/filerec.inc \
 	     $(SYSTEMUNIT)$(PPUEXT) \
 	     $(UNIXUTIL_DEPS_OS)
 unixutil$(PPUEXT) : $(UNIXUTIL_DEPS)
 	$(COMPILER) $(UNIXUTIL_OPT) $<
-UnixApi.Utils$(PPUEXT) : $(NSINC)/UnixApi.Utils.pp $(UNIXUTIL_DEPS) 
+UnixApi.Utils$(PPUEXT) : $(NSINC)/UnixApi.Utils.pp $(UNIXUTIL_DEPS)
 	$(COMPILER) $(UNIXUTIL_OPT) $<
 UNIXTYPE_DEPS=$(UNIXINC)/unixtype.pp \
 	      $(SYSTEMUNIT)$(PPUEXT) $(PTYPESINCDIR)/ptypes.inc $(UNIXINC)/ctypes.inc \
@@ -3400,7 +3401,7 @@ CWSTRING_DEPS=$(CWSTRINGDIR)/cwstring.pp $(CWSTRING_INC) \
 	      $(SYSTEMUNIT)$(PPUEXT) $(OBJPASUNIT)$(PPUEXT) $(UNIXTYPEUNIT)$(PPUEXT) $(BASEUNIXUNIT)$(PPUEXT) \
 	      $(UNIXUNIT)$(PPUEXT) $(UNIXTYPEUNIT)$(PPUEXT) $(CTYPESUNIT)$(PPUEXT) \
 	      $(DYNLIBSUNIT)$(PPUEXT) $(UNIXCPUNIT)$(PPUEXT) \
-	      $(CWSTRING_DEPS_OS) $(CWSTRING_DEPS_CPU) 
+	      $(CWSTRING_DEPS_OS) $(CWSTRING_DEPS_CPU)
 cwstring$(PPUEXT) : $(CWSTRING_DEPS)
 	$(COMPILER) $(CWSTRING_OPT) $<
 UnixApi.CWString$(PPUEXT) : $(NSINC)/UnixApi.CWString.pp $(CWSTRING_DEPS)
@@ -3413,9 +3414,9 @@ endif
 CTYPES_DEPS=$(INC)/ctypes.pp \
 	    $(SYSTEMUNIT)$(PPUEXT) \
 	    $(CTYPES_DEPS_OS) $(CTYPES_DEPS_CPU)
-ctypes$(PPUEXT) : $(CTYPES_DEPS) 
+ctypes$(PPUEXT) : $(CTYPES_DEPS)
 	$(COMPILER) $(CTYPES_OPT) $<
-System.CTypes$(PPUEXT) : $(NSINC)/System.CTypes.pp $(CTYPES_DEPS) 
+System.CTypes$(PPUEXT) : $(NSINC)/System.CTypes.pp $(CTYPES_DEPS)
 	$(COMPILER) $(CTYPES_OPT) $<
 OBJC_DEPS=$(INC)/objc.pp $(INC)/objc.pp $(INC)/objc1.inc $(INC)/objcnf.inc \
 	  $(SYSTEMUNIT)$(PPUEXT) $(CTYPESUNIT)$(PPUEXT) $(UNIXTYPEUNIT)$(PPUEXT) \
@@ -3542,13 +3543,13 @@ OS2Api.doscall2$(PPUEXT) : $(NSOS2DIR)/OS2Api.doscall2.pas $(DOSCALL2_DEPS)
 	$(COMPILER) -Fi$(OS2DIR) $<
 PMWIN_DEPS = $(OS2DIR)/pmwin.pas $(OS2DEFUNIT)$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT) \
 	     $(PMWIN_DEPS_OS) $(PMWIN_DEPS_CPU)
-pmwin$(PPUEXT) : $(PMWIN_DEPS) 
+pmwin$(PPUEXT) : $(PMWIN_DEPS)
 	$(COMPILER) $<
 OS2Api.pmwin$(PPUEXT) : $(NSOS2DIR)/OS2Api.pmwin.pas $(PMWIN_DEPS)
 	$(COMPILER) -Fi$(OS2DIR) $<
 PMBITMAP_DEPS = $(OS2DIR)/pmbitmap.pas $(SYSTEMUNIT)$(PPUEXT) \
 	     $(PMBITMAP_DEPS_OS) $(PMBITMAP_DEPS_CPU)
-pmbitmap$(PPUEXT) : $(PMBITMAP_DEPS) 
+pmbitmap$(PPUEXT) : $(PMBITMAP_DEPS)
 	$(COMPILER) $<
 OS2Api.pmbitmap$(PPUEXT) : $(NSOS2DIR)/OS2Api.pmbitmap.pas $(PMBITMAP_DEPS)
 	$(COMPILER) -Fi$(OS2DIR) $<

+ 1 - 0
rtl/linux/Makefile.fpc

@@ -110,6 +110,7 @@ endif
 ifeq ($(ARCH),powerpc64)
 override LOADERS=
 SYSINIT_UNITS=si_prc si_c si_g si_dll
+CPU_UNITS=$(INTRINSICSUNIT)
 endif
 
 ifeq ($(ARCH),sparc64)

+ 16 - 0
rtl/powerpc64/cpuinnr.inc

@@ -0,0 +1,16 @@
+  {
+    Defines CPU intrinsic indicies for PowerPC64
+
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2021 by the Free Pascal development team.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+
+fpc_in_ppc_yield = fpc_in_cpu_first+0;

+ 16 - 0
rtl/powerpc64/cpuprocs.inc

@@ -0,0 +1,16 @@
+{
+    Defines CPU intrinsics for PowerPC64
+
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2025 by the Free Pascal development team.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+
+procedure fpc_ppc_yield;[internproc:fpc_in_ppc_yield];

+ 28 - 0
rtl/powerpc64/intrinsics.pp

@@ -0,0 +1,28 @@
+{
+    Provides CPU intrinsics for PowerPC64
+
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2021 by the Free Pascal development team.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+{$IFNDEF FPC_DOTTEDUNITS}
+unit intrinsics;
+{$ENDIF FPC_DOTTEDUNITS}
+
+  interface
+
+    const
+    {$i cpuinnr.inc}
+
+    {$i cpuprocs.inc}
+
+  implementation
+
+end.