Sfoglia il codice sorgente

+ functions for FMA and AVX2 detection

git-svn-id: trunk@27202 -
florian 11 anni fa
parent
commit
5d57f38619
6 ha cambiato i file con 137 aggiunte e 23 eliminazioni
  1. 1 0
      .gitattributes
  2. 30 2
      rtl/i386/cpu.pp
  3. 50 17
      rtl/x86_64/cpu.pp
  4. 15 3
      tests/Makefile
  5. 1 1
      tests/Makefile.fpc
  6. 40 0
      tests/test/units/cpu/tcpu1.pp

+ 1 - 0
.gitattributes

@@ -12189,6 +12189,7 @@ tests/test/units/classes/tmakeobjinst.pp svneol=native#text/plain
 tests/test/units/classes/tsetstream.pp svneol=native#text/plain
 tests/test/units/classes/tstringlistexchange.pp svneol=native#text/pascal
 tests/test/units/classes/tvclcomobject.pp svneol=native#text/plain
+tests/test/units/cpu/tcpu1.pp svneol=native#text/pascal
 tests/test/units/crt/tcrt.pp svneol=native#text/plain
 tests/test/units/crt/tctrlc.pp svneol=native#text/plain
 tests/test/units/dos/hello.pp svneol=native#text/plain

+ 30 - 2
rtl/i386/cpu.pp

@@ -27,6 +27,8 @@ unit cpu;
     function cr0 : longint;
 
     function AVXSupport: boolean;inline;
+    function AVX2Support: boolean;inline;
+    function FMASupport: boolean;inline;
 
     var
       is_sse3_cpu : boolean = false;
@@ -35,7 +37,9 @@ unit cpu;
 
 {$ASMMODE INTEL}
     var
-      _AVXSupport : boolean;
+      _AVXSupport,
+      _AVX2Support,
+      _FMASupport : boolean;
 
     function cpuid_support : boolean;assembler;
       {
@@ -90,7 +94,7 @@ unit cpu;
 
     procedure SetupSupport;
       var
-         _ecx : longint;
+         _ecx,_ebx : longint;
       begin
         is_sse3_cpu:=false;
          if cpuid_support then
@@ -110,6 +114,18 @@ unit cpu;
                 ((XGETBV(0) and %110)=%110) and
                 { avx supported? }
                 ((_ecx and $10000000)<>0);
+
+              _FMASupport:=_AVXSupport and ((_ecx and $1000)<>0);
+
+              asm
+                 pushl %ebx
+                 movl $7,%eax
+                 movl $0,%ecx
+                 cpuid
+                 movl %ebx,_ebx
+                 popl %ebx
+              end;
+              _AVX2Support:=_AVXSupport and ((_ebx and $20)<>0);
            end;
       end;
 
@@ -119,6 +135,18 @@ unit cpu;
         result:=_AVXSupport;
       end;
 
+
+    function AVX2Support: boolean;inline;
+      begin
+        result:=_AVX2Support;
+      end;
+
+
+    function FMASupport: boolean;inline;
+      begin
+        result:=_FMASupport;
+      end;
+
 begin
   SetupSupport;
 end.

+ 50 - 17
rtl/x86_64/cpu.pp

@@ -31,6 +31,8 @@ unit cpu;
     function InterlockedCompareExchange128Support : boolean;inline;
     function AESSupport : boolean;inline;
     function AVXSupport : boolean;inline;
+    function AVX2Support: boolean;inline;
+    function FMASupport: boolean;inline;
 
     var
       is_sse3_cpu : boolean = false;
@@ -42,22 +44,9 @@ unit cpu;
     var
       _AESSupport,
       _AVXSupport,
-      _InterlockedCompareExchange128Support : boolean;
-
-    function InterlockedCompareExchange128Support : boolean;inline;
-      begin
-        result:=_InterlockedCompareExchange128Support;
-      end;
-
-    function AESSupport : boolean;inline;
-      begin
-        result:=_AESSupport;
-      end;
-
-    function AVXSupport: boolean;
-      begin
-        result:=_AVXSupport;
-      end;
+      _InterlockedCompareExchange128Support,
+      _AVX2Support,
+      _FMASupport : boolean;
 
     function InterlockedCompareExchange128(var Target: Int128Rec; NewValue: Int128Rec; Comperand: Int128Rec): Int128Rec; assembler;
      {
@@ -140,7 +129,8 @@ unit cpu;
 
     procedure SetupSupport;
       var
-        _ecx : longint;
+        _ecx,
+        _ebx : longint;
       begin
         asm
            pushq %rbx
@@ -161,8 +151,51 @@ unit cpu;
           ((_ecx and $10000000)<>0);
 
         is_sse3_cpu:=(_ecx and $1)<>0;
+
+        _FMASupport:=_AVXSupport and ((_ecx and $1000)<>0);
+
+        asm
+           pushl %rbx
+           movl $7,%eax
+           movl $0,%ecx
+           cpuid
+           movl %ebx,_ebx
+           popl %rbx
+        end;
+        _AVX2Support:=_AVXSupport and ((_ebx and $20)<>0);
       end;
 
+
+    function InterlockedCompareExchange128Support : boolean;inline;
+      begin
+        result:=_InterlockedCompareExchange128Support;
+      end;
+
+
+    function AESSupport : boolean;inline;
+      begin
+        result:=_AESSupport;
+      end;
+
+
+    function AVXSupport: boolean;inline;
+      begin
+        result:=_AVXSupport;
+      end;
+
+
+    function AVX2Support: boolean;inline;
+      begin
+        result:=_AVX2Support;
+      end;
+
+
+    function FMASupport: boolean;inline;
+      begin
+        result:=_FMASupport;
+      end;
+
+
 begin
   SetupSupport;
 end.

+ 15 - 3
tests/Makefile

@@ -1,8 +1,8 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2014-02-06 rev 26692]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2014-03-19 rev 27188]
 #
 default: allexectests
-MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-android jvm-java jvm-android i8086-msdos
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-embedded mipsel-android jvm-java jvm-android i8086-msdos
 BSDs = freebsd netbsd openbsd darwin
 UNIXs = linux $(BSDs) solaris qnx haiku aix
 LIMIT83fs = go32v2 os2 emx watcom msdos
@@ -184,6 +184,12 @@ $(error When compiling for arm-embedded, a sub-architecture (e.g. SUBARCH=armv4t
 endif
 override FPCOPT+=-Cp$(SUBARCH)
 endif
+ifeq ($(FULL_TARGET),mipsel-embedded)
+ifeq ($(SUBARCH),)
+$(error When compiling for mipsel-embedded, a sub-architecture (e.g. SUBARCH=pic32mx) must be defined)
+endif
+override FPCOPT+=-Cp$(SUBARCH)
+endif
 ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
 TARGETSUFFIX=$(OS_TARGET)
 SOURCESUFFIX=$(OS_SOURCE)
@@ -529,6 +535,9 @@ endif
 ifeq ($(FULL_TARGET),mipsel-linux)
 override TARGET_PROGRAMS+=gparmake
 endif
+ifeq ($(FULL_TARGET),mipsel-embedded)
+override TARGET_PROGRAMS+=gparmake
+endif
 ifeq ($(FULL_TARGET),mipsel-android)
 override TARGET_PROGRAMS+=gparmake
 endif
@@ -1391,6 +1400,9 @@ endif
 ifeq ($(FULL_TARGET),mipsel-linux)
 REQUIRE_PACKAGES_RTL=1
 endif
+ifeq ($(FULL_TARGET),mipsel-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
 ifeq ($(FULL_TARGET),mipsel-android)
 REQUIRE_PACKAGES_RTL=1
 endif
@@ -2065,7 +2077,7 @@ export LOG:=$(TEST_OUTPUTDIR)/log
 endif
 LOGFILES=$(TEST_OUTPUTDIR)/log $(TEST_OUTPUTDIR)/longlog $(TEST_OUTPUTDIR)/faillist
 LOGEXT=.testlog .tbslog .tbflog .webtbslog .webtbflog
-TESTSUBDIRS=cg cg/variants cg/cdecl cpu16 cpu16/i8086 library opt units/system units/dos units/crt units/objects units/strings units/sysutils units/math units/sharemem units/strutils units/matrix units/lineinfo units/ucomplex units/fpwidestring
+TESTSUBDIRS=cg cg/variants cg/cdecl cpu16 cpu16/i8086 library opt units/system units/dos units/crt units/objects units/strings units/sysutils units/math units/sharemem units/strutils units/matrix units/lineinfo units/ucomplex units/fpwidestring units/cpu
 TESTPACKAGESUBDIRS=packages/win-base packages/webtbs packages/hash packages/fcl-registry packages/fcl-process packages/zlib packages/fcl-db packages/fcl-base packages/fcl-xml packages/cocoaint packages/bzip2
 ifdef QUICKTEST
 export QUICKTEST

+ 1 - 1
tests/Makefile.fpc

@@ -154,7 +154,7 @@ LOGFILES=$(TEST_OUTPUTDIR)/log $(TEST_OUTPUTDIR)/longlog $(TEST_OUTPUTDIR)/faill
 LOGEXT=.testlog .tbslog .tbflog .webtbslog .webtbflog
 
 # Subdirs available in the test subdir
-TESTSUBDIRS=cg cg/variants cg/cdecl cpu16 cpu16/i8086 library opt units/system units/dos units/crt units/objects units/strings units/sysutils units/math units/sharemem units/strutils units/matrix units/lineinfo units/ucomplex units/fpwidestring
+TESTSUBDIRS=cg cg/variants cg/cdecl cpu16 cpu16/i8086 library opt units/system units/dos units/crt units/objects units/strings units/sysutils units/math units/sharemem units/strutils units/matrix units/lineinfo units/ucomplex units/fpwidestring units/cpu
 TESTPACKAGESUBDIRS=packages/win-base packages/webtbs packages/hash packages/fcl-registry packages/fcl-process packages/zlib packages/fcl-db packages/fcl-base packages/fcl-xml packages/cocoaint packages/bzip2
 
 ifdef QUICKTEST

+ 40 - 0
tests/test/units/cpu/tcpu1.pp

@@ -0,0 +1,40 @@
+{ %cpu=x86_64,i386}
+
+uses
+  cpu;
+
+begin
+  write('AVX support: ');
+  if AVXSupport then
+    begin
+      writeln('yes');
+      asm
+        vpxor %xmm0,%xmm0,%xmm0
+      end;
+    end
+  else
+    writeln('no');
+  write('AVX2 support: ');
+  if AVX2Support then
+    begin
+      writeln('yes');
+      asm
+        vpxor %ymm0,%ymm0,%ymm0
+      end;
+    end
+  else
+    writeln('no');
+  write('FMA support: ');
+  if FMASupport then
+    begin
+      writeln('yes');
+      asm
+        vpxor %ymm0,%ymm0,%ymm0
+// no compiler support yet for fma
+//        vfmadd132SS %ymm0,%ymm0,%ymm0
+      end;
+    end
+  else
+    writeln('no');
+end.
+