[gegl] gegl: extend cpuaccel with more features



commit 92c0d2f34171c6d6399545bc4760c65ff46edec9
Author: Øyvind Kolås <pippin gimp org>
Date:   Sun Jan 16 04:14:14 2022 +0100

    gegl: extend cpuaccel with more features

 gegl/gegl-cpuaccel.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 gegl/gegl-cpuaccel.h | 34 ++++++++++++++++++++++++++---
 2 files changed, 91 insertions(+), 3 deletions(-)
---
diff --git a/gegl/gegl-cpuaccel.c b/gegl/gegl-cpuaccel.c
index 2e8d5df60..73854283d 100644
--- a/gegl/gegl-cpuaccel.c
+++ b/gegl/gegl-cpuaccel.c
@@ -117,6 +117,22 @@ enum
 enum
 {
   ARCH_X86_INTEL_FEATURE_PNI      = 1 << 0
+  ARCH_X86_INTEL_FEATURE_SSSE3    = 1 << 9,
+  ARCH_X86_INTEL_FEATURE_FMA      = 1 << 12,
+  ARCH_X86_INTEL_FEATURE_SSE4_1   = 1 << 19,
+  ARCH_X86_INTEL_FEATURE_SSE4_2   = 1 << 20,
+  ARCH_X86_INTEL_FEATURE_MOVBE    = 1 << 22,
+  ARCH_X86_INTEL_FEATURE_POPCNT   = 1 << 23,
+  ARCH_X86_INTEL_FEATURE_XSAVE    = 1 << 26,
+  ARCH_X86_INTEL_FEATURE_OSXSAVE  = 1 << 27,
+  ARCH_X86_INTEL_FEATURE_AVX      = 1 << 28,
+  ARCH_X86_INTEL_FEATURE_F16C     = 1 << 29
+
+ // extended features
+
+  ARCH_X86_INTEL_FEATURE_BMI1     = 1 << 3,
+  ARCH_X86_INTEL_FEATURE_BMI2     = 1 << 8,
+  ARCH_X86_INTEL_FEATURE_AVX2     = 1 << 5,
 };
 
 #if !defined(ARCH_X86_64) && (defined(PIC) || defined(__PIC__))
@@ -240,6 +256,50 @@ arch_accel_intel (void)
 
     if (ecx & ARCH_X86_INTEL_FEATURE_PNI)
       caps |= GEGL_CPU_ACCEL_X86_SSE3;
+
+    if (ecx & ARCH_X86_INTEL_FEATURE_SSSE3)
+      caps |= GEGL_CPU_ACCEL_X86_SSSE3;
+
+    if (ecx & ARCH_X86_INTEL_FEATURE_SSE4_1)
+      caps |= GEGL_CPU_ACCEL_X86_SSE4_1;
+
+    if (ecx & ARCH_X86_INTEL_FEATURE_SSE4_2)
+      caps |= GEGL_CPU_ACCEL_X86_SSE4_2;
+
+    if (ecx & ARCH_X86_INTEL_FEATURE_AVX)
+      caps |= GEGL_CPU_ACCEL_X86_AVX;
+
+    if (ecx & ARCH_X86_INTEL_FEATURE_POPCNT)
+      caps |= GEGL_CPU_ACCEL_X86_POPCNT;
+
+    if (ecx & ARCH_X86_INTEL_FEATURE_XSAVE)
+      caps |= GEGL_CPU_ACCEL_X86_XSAVE;
+
+    if (ecx & ARCH_X86_INTEL_FEATURE_OSXSAVE)
+      caps |= GEGL_CPU_ACCEL_X86_OSXSAVE;
+
+    if (ecx & ARCH_X86_INTEL_FEATURE_FMA)
+      caps |= GEGL_CPU_ACCEL_X86_FMA;
+
+    if (ecx & ARCH_X86_INTEL_FEATURE_F16C)
+      caps |= GEGL_CPU_ACCEL_X86_F16C;
+
+    if (ecx & ARCH_X86_INTEL_FEATURE_MOVBE)
+      caps |= GEGL_CPU_ACCEL_X86_MOVBE;
+
+    cpuid (0, eax, ebx, ecx, edx);
+    if (eax >= 7)
+    {
+      cpuid (7, eax, ebx, ecs, edx);
+      if (ebx & ARCH_X86_INTEL_FEATURE_AVX2)
+        caps |= GEGL_CPU_ACCEL_X86_AVX2;
+      if (ebx & ARCH_X86_INTEL_FEATURE_BMI1)
+        caps |= GEGL_CPU_ACCEL_X86_BMI1;
+      if (ebx & ARCH_X86_INTEL_FEATURE_BMI2)
+        caps |= GEGL_CPU_ACCEL_X86_BMI2;
+    }
+
+
 #endif /* USE_SSE */
   }
 #endif /* USE_MMX */
diff --git a/gegl/gegl-cpuaccel.h b/gegl/gegl-cpuaccel.h
index 66b716396..ef861b2f8 100644
--- a/gegl/gegl-cpuaccel.h
+++ b/gegl/gegl-cpuaccel.h
@@ -28,15 +28,43 @@ typedef enum
   GEGL_CPU_ACCEL_NONE        = 0x0,
 
   /* x86 accelerations */
-  GEGL_CPU_ACCEL_X86_MMX     = 0x01000000,
+  GEGL_CPU_ACCEL_X86_MMX     = 0x80000000,
   GEGL_CPU_ACCEL_X86_3DNOW   = 0x40000000,
   GEGL_CPU_ACCEL_X86_MMXEXT  = 0x20000000,
   GEGL_CPU_ACCEL_X86_SSE     = 0x10000000,
   GEGL_CPU_ACCEL_X86_SSE2    = 0x08000000,
-  GEGL_CPU_ACCEL_X86_SSE3    = 0x02000000,
+  GEGL_CPU_ACCEL_X86_SSE3    = 0x04000000,
+  GEGL_CPU_ACCEL_X86_SSSE3   = 0x02000000,
+  GEGL_CPU_ACCEL_X86_SSE4_1  = 0x01000000,
+  GEGL_CPU_ACCEL_X86_SSE4_2  = 0x00800000,
+  GEGL_CPU_ACCEL_X86_AVX     = 0x00400000,
+  GEGL_CPU_ACCEL_X86_POPCNT  = 0x00200000,
+  GEGL_CPU_ACCEL_X86_FMA     = 0x00100000,
+  GEGL_CPU_ACCEL_X86_MOVBE   = 0x00080000,
+  GEGL_CPU_ACCEL_X86_F16C    = 0x00040000,
+  GEGL_CPU_ACCEL_X86_XSAVE   = 0x00020000,
+  GEGL_CPU_ACCEL_X86_OSXSAVE = 0x00010000,
+  GEGL_CPU_ACCEL_X86_BMI1    = 0x00008000,
+  GEGL_CPU_ACCEL_X86_BMI2    = 0x00004000,
+  GEGL_CPU_ACCEL_X86_AVX2    = 0x00002000,
+
+  GEGL_CPU_ACCEL_X86_64_V2 =
+    (GEGL_CPU_ACCEL_X86_POPCNT|
+     GEGL_CPU_ACCEL_X86_SSE4_1|
+     GEGL_CPU_ACCEL_X86_SSE4_2|
+     GEGL_CPU_ACCEL_X86_SSSE3),
+
+  GEGL_CPU_ACCEL_X86_64_V3 =
+    (GEGL_CPU_ACCEL_X86_64_V2|
+     GEGL_CPU_ACCEL_X86_BMI1|
+     GEGL_CPU_ACCEL_X86_BMI2|
+     GEGL_CPU_ACCEL_X86_AVX|
+     GEGL_CPU_ACCEL_X86_AVX2|
+     GEGL_CPU_ACCEL_X86_OSXSAVE|
+     GEGL_CPU_ACCEL_X86_MOVBE),
 
   /* powerpc accelerations */
-  GEGL_CPU_ACCEL_PPC_ALTIVEC = 0x04000000
+  GEGL_CPU_ACCEL_PPC_ALTIVEC = 0x00000010,
 } GeglCpuAccelFlags;
 
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]