Explorar o código

+ intrinsics unit for x86-64

florian hai 1 día
pai
achega
4753dfeceb

+ 3 - 0
rtl/android/Makefile

@@ -940,6 +940,9 @@ LOADERS=prt0 dllprt0
 ifeq ($(findstring $(ARCH),i386 x86_64 arm),$(ARCH))
 ifeq ($(findstring $(ARCH),i386 x86_64 arm),$(ARCH))
 CPU_UNITS=$(CPUUNIT)
 CPU_UNITS=$(CPUUNIT)
 endif
 endif
+ifeq ($(ARCH),x86_64)
+CPU_UNITS+=$(INTRINSICSUNIT)
+endif
 ifeq ($(ARCH),i386)
 ifeq ($(ARCH),i386)
 CPU_UNITS+=$(MMXUNIT)
 CPU_UNITS+=$(MMXUNIT)
 endif
 endif

+ 3 - 0
rtl/android/Makefile.fpc

@@ -78,6 +78,9 @@ LOADERS=prt0 dllprt0
 ifeq ($(findstring $(ARCH),i386 x86_64 arm),$(ARCH))
 ifeq ($(findstring $(ARCH),i386 x86_64 arm),$(ARCH))
 CPU_UNITS=$(CPUUNIT)
 CPU_UNITS=$(CPUUNIT)
 endif
 endif
+ifeq ($(ARCH),x86_64)
+CPU_UNITS+=$(INTRINSICSUNIT)
+endif
 ifeq ($(ARCH),i386)
 ifeq ($(ARCH),i386)
 CPU_UNITS+=$(MMXUNIT)
 CPU_UNITS+=$(MMXUNIT)
 endif
 endif

+ 1 - 1
rtl/aros/Makefile

@@ -930,7 +930,7 @@ ifeq ($(ARCH),i386)
 CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(LINEINFOUNIT)
 CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(LINEINFOUNIT)
 endif
 endif
 ifeq ($(ARCH),x86_64)
 ifeq ($(ARCH),x86_64)
-CPU_UNITS=$(CPUUNIT)
+CPU_UNITS=$(CPUUNIT) $(INTRINSICSUNIT)
 endif
 endif
 ifeq ($(CPU_OS_TARGET),i386-aros)
 ifeq ($(CPU_OS_TARGET),i386-aros)
 override TARGET_UNITS+=$(SYSTEMUNIT) $(HEAPTRCUNIT) $(UUCHARUNIT) $(OBJPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) buildrtl $(CPALLUNIT)
 override TARGET_UNITS+=$(SYSTEMUNIT) $(HEAPTRCUNIT) $(UUCHARUNIT) $(OBJPASUNIT) $(ISO7185UNIT) $(EXTPASUNIT) buildrtl $(CPALLUNIT)

+ 1 - 1
rtl/aros/Makefile.fpc

@@ -56,7 +56,7 @@ CPU_UNITS=$(CPUUNIT) $(MMXUNIT) $(LINEINFOUNIT)
 endif
 endif
 
 
 ifeq ($(ARCH),x86_64)
 ifeq ($(ARCH),x86_64)
-CPU_UNITS=$(CPUUNIT)
+CPU_UNITS=$(CPUUNIT) $(INTRINSICSUNIT)
 endif
 endif
 
 
 
 

+ 1 - 1
rtl/darwin/Makefile

@@ -917,7 +917,7 @@ ifeq ($(CPU_TARGET),i386)
 CPU_UNITS=$(MMXUNIT) $(CPUUNIT)
 CPU_UNITS=$(MMXUNIT) $(CPUUNIT)
 endif
 endif
 ifeq ($(ARCH),x86_64)
 ifeq ($(ARCH),x86_64)
-CPU_UNITS=$(CPUUNIT)
+CPU_UNITS=$(CPUUNIT) $(INTRINSICSUNIT)
 endif
 endif
 ifeq ($(ARCH),aarch64)
 ifeq ($(ARCH),aarch64)
 CPU_UNITS=$(INTRINSICSUNIT)
 CPU_UNITS=$(INTRINSICSUNIT)

+ 1 - 1
rtl/darwin/Makefile.fpc

@@ -52,7 +52,7 @@ CPU_UNITS=$(MMXUNIT) $(CPUUNIT)
 endif
 endif
 
 
 ifeq ($(ARCH),x86_64)
 ifeq ($(ARCH),x86_64)
-CPU_UNITS=$(CPUUNIT)
+CPU_UNITS=$(CPUUNIT) $(INTRINSICSUNIT)
 endif
 endif
 
 
 ifeq ($(ARCH),aarch64)
 ifeq ($(ARCH),aarch64)

+ 1 - 1
rtl/embedded/Makefile.fpc

@@ -238,7 +238,7 @@ CPU_SPECIFIC_COMMON_UNITS=
 endif
 endif
 
 
 ifeq ($(ARCH),x86_64)
 ifeq ($(ARCH),x86_64)
-# CPU_UNITS=$(MULTIBOOTUNIT)
+# CPU_UNITS=$(MULTIBOOTUNIT) $(INTRINSICSUNIT)
 endif
 endif
 
 
 ifeq ($(ARCH),m68k)
 ifeq ($(ARCH),m68k)

+ 1 - 1
rtl/freebsd/Makefile

@@ -940,7 +940,7 @@ CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(MMXUNIT)
 ASTARGET=--32
 ASTARGET=--32
 endif
 endif
 ifeq ($(ARCH),x86_64)
 ifeq ($(ARCH),x86_64)
-CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT)
+CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(INTRINSICSUNIT)
 ASTARGET=--64
 ASTARGET=--64
 endif
 endif
 ifeq ($(ARCH),aarch64)
 ifeq ($(ARCH),aarch64)

+ 1 - 1
rtl/freebsd/Makefile.fpc

@@ -81,7 +81,7 @@ ASTARGET=--32
 endif
 endif
 
 
 ifeq ($(ARCH),x86_64)
 ifeq ($(ARCH),x86_64)
-CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT)
+CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(INTRINSICSUNIT)
 ASTARGET=--64
 ASTARGET=--64
 endif
 endif
 ifeq ($(ARCH),aarch64)
 ifeq ($(ARCH),aarch64)

+ 1 - 1
rtl/linux/Makefile

@@ -953,7 +953,7 @@ CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(MMXUNIT)
 SYSINIT_UNITS=si_prc si_c21g si_c21 si_c si_dll si_uc
 SYSINIT_UNITS=si_prc si_c21g si_c21 si_c si_dll si_uc
 endif
 endif
 ifeq ($(ARCH),x86_64)
 ifeq ($(ARCH),x86_64)
-CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT)
+CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(INTRINSICSUNIT)
 SYSINIT_UNITS=si_prc si_c si_g si_dll
 SYSINIT_UNITS=si_prc si_c si_g si_dll
 override LOADERS=abitag
 override LOADERS=abitag
 endif
 endif

+ 1 - 1
rtl/linux/Makefile.fpc

@@ -98,7 +98,7 @@ SYSINIT_UNITS=si_prc si_c21g si_c21 si_c si_dll si_uc
 endif
 endif
 
 
 ifeq ($(ARCH),x86_64)
 ifeq ($(ARCH),x86_64)
-CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT)
+CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(INTRINSICSUNIT)
 SYSINIT_UNITS=si_prc si_c si_g si_dll
 SYSINIT_UNITS=si_prc si_c si_g si_dll
 override LOADERS=abitag
 override LOADERS=abitag
 endif
 endif

+ 1 - 1
rtl/netbsd/Makefile

@@ -937,7 +937,7 @@ LINUXUNIT=
 PRT0=prt0
 PRT0=prt0
 OBJPASDIR=$(RTL)/objpas
 OBJPASDIR=$(RTL)/objpas
 ifeq ($(ARCH),x86_64)
 ifeq ($(ARCH),x86_64)
-CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT)
+CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(INTRINSICSUNIT)
 endif
 endif
 ifeq ($(ARCH),i386)
 ifeq ($(ARCH),i386)
 CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(MMXUNIT)
 CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(MMXUNIT)

+ 2 - 2
rtl/netbsd/Makefile.fpc

@@ -46,7 +46,7 @@ libunits=$(SYSTEMUNIT) $(OBJPASUNIT) $(STRINGSUNIT) \
       $(DOSUNIT) \
       $(DOSUNIT) \
       $(SYSUTILSUNIT) $(TYPINFOUNIT) $(MATHUNIT) \
       $(SYSUTILSUNIT) $(TYPINFOUNIT) $(MATHUNIT) \
       $(CPUUNIT) $(MMXUNIT) $(GETOPTSUNIT) $(HEAPTRCUNIT) \
       $(CPUUNIT) $(MMXUNIT) $(GETOPTSUNIT) $(HEAPTRCUNIT) \
-      $(ERRORSUNIT) 
+      $(ERRORSUNIT)
 
 
 [prerules]
 [prerules]
 RTL=..
 RTL=..
@@ -78,7 +78,7 @@ PRT0=prt0
 OBJPASDIR=$(RTL)/objpas
 OBJPASDIR=$(RTL)/objpas
 
 
 ifeq ($(ARCH),x86_64)
 ifeq ($(ARCH),x86_64)
-CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT)
+CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(INTRINSICSUNIT)
 endif
 endif
 ifeq ($(ARCH),i386)
 ifeq ($(ARCH),i386)
 CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(MMXUNIT)
 CPU_UNITS=$(X86UNIT) $(PORTSUNIT) $(CPUUNIT) $(MMXUNIT)

+ 2 - 2
rtl/win64/Makefile

@@ -932,7 +932,7 @@ CPALL_DEPS_OS=buildrtl$(PPUEXT)
 LINEINFO_DEPS_OS=buildrtl$(PPUEXT)
 LINEINFO_DEPS_OS=buildrtl$(PPUEXT)
 LNFODWRF_DEPS_OS=buildrtl$(PPUEXT)
 LNFODWRF_DEPS_OS=buildrtl$(PPUEXT)
 ifeq ($(ARCH),x86_64)
 ifeq ($(ARCH),x86_64)
-CPU_UNITS=$(CPUUNIT) $(SIGNALSUNIT)
+CPU_UNITS=$(CPUUNIT) $(SIGNALSUNIT) $(INTRINSICSUNIT)
 endif
 endif
 ifeq ($(ARCH),aarch64)
 ifeq ($(ARCH),aarch64)
 CPU_UNITS=$(INTRINSICSUNIT)
 CPU_UNITS=$(INTRINSICSUNIT)
@@ -3048,7 +3048,7 @@ BUILDINCLUDEPATHS= -Fi$(OBJPASDIR)/sysutils -Fi$(WINDIR) -Fi$(OBJPASDIR) \
 		   -Fi$(OBJPASDIR)/classes -Fi$(WININC) -Fi$(INC)
 		   -Fi$(OBJPASDIR)/classes -Fi$(WININC) -Fi$(INC)
 BUILDUNITPATHS=-Fu$(WININC) -Fu$(WINDIR) -Fu$(INC) -Fu$(OBJPASDIR) -Fu../$(ARCH)
 BUILDUNITPATHS=-Fu$(WININC) -Fu$(WINDIR) -Fu$(INC) -Fu$(OBJPASDIR) -Fu../$(ARCH)
 ifdef FPC_DOTTEDUNITS
 ifdef FPC_DOTTEDUNITS
-BUILDRTL_OPT:=$(BUILDRTL_OPT) -Fu$(NSINC) -Fu$(NSOSDIR) -dFPC_DOTTEDUNITS 
+BUILDRTL_OPT:=$(BUILDRTL_OPT) -Fu$(NSINC) -Fu$(NSOSDIR) -dFPC_DOTTEDUNITS
 endif
 endif
 BUILDRTL_DEPS=buildrtl.pp $(SYSTEMUNIT)$(PPUEXT) $(OBJPASUNIT)$(PPUEXT) $(WINDOWSUNIT)$(PPUEXT) $(SYSUTILSUNIT)$(PPUEXT) \
 BUILDRTL_DEPS=buildrtl.pp $(SYSTEMUNIT)$(PPUEXT) $(OBJPASUNIT)$(PPUEXT) $(WINDOWSUNIT)$(PPUEXT) $(SYSUTILSUNIT)$(PPUEXT) \
 	      $(BUILDRTL_DEPS_OS) $(BUILDRTL_DEPS_CPU)
 	      $(BUILDRTL_DEPS_OS) $(BUILDRTL_DEPS_CPU)

+ 2 - 2
rtl/win64/Makefile.fpc

@@ -71,7 +71,7 @@ LNFODWRF_DEPS_OS=buildrtl$(PPUEXT)
 
 
 ifeq ($(ARCH),x86_64)
 ifeq ($(ARCH),x86_64)
 # signals unit is x86 specific for now
 # signals unit is x86 specific for now
-CPU_UNITS=$(CPUUNIT) $(SIGNALSUNIT)
+CPU_UNITS=$(CPUUNIT) $(SIGNALSUNIT) $(INTRINSICSUNIT)
 endif
 endif
 ifeq ($(ARCH),aarch64)
 ifeq ($(ARCH),aarch64)
 CPU_UNITS=$(INTRINSICSUNIT)
 CPU_UNITS=$(INTRINSICSUNIT)
@@ -114,7 +114,7 @@ BUILDINCLUDEPATHS= -Fi$(OBJPASDIR)/sysutils -Fi$(WINDIR) -Fi$(OBJPASDIR) \
 BUILDUNITPATHS=-Fu$(WININC) -Fu$(WINDIR) -Fu$(INC) -Fu$(OBJPASDIR) -Fu../$(ARCH)
 BUILDUNITPATHS=-Fu$(WININC) -Fu$(WINDIR) -Fu$(INC) -Fu$(OBJPASDIR) -Fu../$(ARCH)
 
 
 ifdef FPC_DOTTEDUNITS
 ifdef FPC_DOTTEDUNITS
-BUILDRTL_OPT:=$(BUILDRTL_OPT) -Fu$(NSINC) -Fu$(NSOSDIR) -dFPC_DOTTEDUNITS 
+BUILDRTL_OPT:=$(BUILDRTL_OPT) -Fu$(NSINC) -Fu$(NSOSDIR) -dFPC_DOTTEDUNITS
 endif
 endif
 
 
 #
 #

+ 10 - 24
rtl/x86_64/cpuh.inc

@@ -14,36 +14,22 @@
 
 
  **********************************************************************}
  **********************************************************************}
 
 
-const
-  {$I cpuinnr.inc}
+type
+  TNativeFPUControlWord = record
+    cw8087: word;
+    MXCSR: dword;
+  end;
 
 
+const
   has_avx_support : boolean = false;
   has_avx_support : boolean = false;
   has_avx2_support : boolean = false;
   has_avx2_support : boolean = false;
 
 
-function fpc_x86_inportb(port : word) : byte;[internproc:fpc_in_x86_inportb];
-function fpc_x86_inportw(port : word) : word;[internproc:fpc_in_x86_inportw];
-function fpc_x86_inportl(port : word) : longint;[internproc:fpc_in_x86_inportl];
-procedure fpc_x86_outportb(port : word;data : byte);[internproc:fpc_in_x86_outportb];
-procedure fpc_x86_outportw(port : word;data : word);[internproc:fpc_in_x86_outportw];
-procedure fpc_x86_outportl(port : word;data : longint);[internproc:fpc_in_x86_outportl];
-procedure fpc_x86_cli;[internproc:fpc_in_x86_cli];
-procedure fpc_x86_sti;[internproc:fpc_in_x86_sti];
-function fpc_x86_get_cs:longint;[internproc:fpc_in_x86_get_cs];
-function fpc_x86_get_ss:longint;[internproc:fpc_in_x86_get_ss];
-function fpc_x86_get_ds:longint;[internproc:fpc_in_x86_get_ds];
-function fpc_x86_get_es:longint;[internproc:fpc_in_x86_get_es];
-function fpc_x86_get_fs:longint;[internproc:fpc_in_x86_get_fs];
-function fpc_x86_get_gs:longint;[internproc:fpc_in_x86_get_gs];
-procedure fpc_x86_pause;[internproc:fpc_in_x86_pause];
+{$i cpuinnr.inc}
+
+{$i cpuprocs.inc}
 
 
-{ include automatically generated procs }
 {$if not defined(VER3_2)}
 {$if not defined(VER3_2)}
+{ include automatically generated procs }
 { do not active yet, they are not usable yet neither is the naming fixed }
 { do not active yet, they are not usable yet neither is the naming fixed }
 { $i cpummprocs.inc}
 { $i cpummprocs.inc}
 {$endif not VER3_2}
 {$endif not VER3_2}
-
-type
-  TNativeFPUControlWord = record
-    cw8087: word;
-    MXCSR: dword;
-  end;

+ 5 - 5
rtl/x86_64/cpuinnr.inc

@@ -27,8 +27,8 @@
   fpc_in_x86_get_fs   = fpc_in_cpu_first+12;
   fpc_in_x86_get_fs   = fpc_in_cpu_first+12;
   fpc_in_x86_get_gs   = fpc_in_cpu_first+13;
   fpc_in_x86_get_gs   = fpc_in_cpu_first+13;
   fpc_in_x86_pause    = fpc_in_cpu_first+14;
   fpc_in_x86_pause    = fpc_in_cpu_first+14;
-  
-   { include automatically generated numbers }
-   {$ifdef VER3_3_1}
-   {$i cpumminnr.inc}
-   {$endif}
+
+  { include automatically generated numbers }
+  {$ifndef VER3_2}
+  {$i cpumminnr.inc}
+  {$endif}

+ 30 - 0
rtl/x86_64/cpuprocs.inc

@@ -0,0 +1,30 @@
+{
+    Defines CPU intrinsics for x86-64
+
+    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.
+
+ **********************************************************************}
+
+function fpc_x86_inportb(port : word) : byte;[internproc:fpc_in_x86_inportb];
+function fpc_x86_inportw(port : word) : word;[internproc:fpc_in_x86_inportw];
+function fpc_x86_inportl(port : word) : longint;[internproc:fpc_in_x86_inportl];
+procedure fpc_x86_outportb(port : word;data : byte);[internproc:fpc_in_x86_outportb];
+procedure fpc_x86_outportw(port : word;data : word);[internproc:fpc_in_x86_outportw];
+procedure fpc_x86_outportl(port : word;data : longint);[internproc:fpc_in_x86_outportl];
+procedure fpc_x86_cli;[internproc:fpc_in_x86_cli];
+procedure fpc_x86_sti;[internproc:fpc_in_x86_sti];
+function fpc_x86_get_cs:longint;[internproc:fpc_in_x86_get_cs];
+function fpc_x86_get_ss:longint;[internproc:fpc_in_x86_get_ss];
+function fpc_x86_get_ds:longint;[internproc:fpc_in_x86_get_ds];
+function fpc_x86_get_es:longint;[internproc:fpc_in_x86_get_es];
+function fpc_x86_get_fs:longint;[internproc:fpc_in_x86_get_fs];
+function fpc_x86_get_gs:longint;[internproc:fpc_in_x86_get_gs];
+procedure fpc_x86_pause;[internproc:fpc_in_x86_pause];

+ 28 - 0
rtl/x86_64/intrinsics.pp

@@ -0,0 +1,28 @@
+{
+    Provides CPU intrinsics for x86-64
+
+    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.