[gtk/half-float: 10/11] Add an option to disable F16C
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/half-float: 10/11] Add an option to disable F16C
- Date: Thu, 8 Apr 2021 01:32:43 +0000 (UTC)
commit c966a08b676d80ec0ae3c46c29858f8f2542ba6f
Author: Matthias Clasen <mclasen redhat com>
Date: Wed Apr 7 19:41:54 2021 -0400
Add an option to disable F16C
And add a compile time check for the presence of this
CPU feature.
config.h.meson | 2 ++
gsk/ngl/fp16private.h | 11 ++++++-----
meson.build | 36 ++++++++++++++++++++++++++++++++++++
meson_options.txt | 5 +++++
4 files changed, 49 insertions(+), 5 deletions(-)
---
diff --git a/config.h.meson b/config.h.meson
index 549a677379..fc2dd0b3d2 100644
--- a/config.h.meson
+++ b/config.h.meson
@@ -279,3 +279,5 @@
/* Define if tracker3 is available */
#mesondefine HAVE_TRACKER3
+
+#mesondefine HAVE_F16C
diff --git a/gsk/ngl/fp16private.h b/gsk/ngl/fp16private.h
index f54f7307a6..2bc9f84eea 100644
--- a/gsk/ngl/fp16private.h
+++ b/gsk/ngl/fp16private.h
@@ -1,4 +1,4 @@
-/* ninesliceprivate.h
+/* fp16private.h
*
* Copyright 2021 Red Hat, Inc.
*
@@ -21,10 +21,11 @@
#ifndef __FP16_PRIVATE_H__
#define __FP16_PRIVATE_H__
+#include <config.h>
#include <glib.h>
#include <graphene.h>
-#ifdef GRAPHENE_USE_SSE
+#ifdef HAVE_F16C
#include <immintrin.h>
#endif
@@ -34,7 +35,7 @@ G_BEGIN_DECLS
#define FP16_ONE ((guint16)15360)
#define FP16_MINUS_ONE ((guint16)48128)
-#ifdef GRAPHENE_USE_SSE
+#ifdef HAVE_F16C
static inline void
float_to_half4 (const float f[4],
@@ -54,7 +55,7 @@ half_to_float4 (const guint16 h[4],
_mm_store_ps (f, s);
}
-#else /* GRAPHENE_USE_SSE */
+#else /* GTK_HAS_F16C */
static inline guint
as_uint (const float x)
@@ -108,7 +109,7 @@ half_to_float4 (const guint16 h[4],
f[3] = half_to_float (h[3]);
}
-#endif /* GRAPHENE_USE_SSE */
+#endif /* HAVE_F16C */
G_END_DECLS
diff --git a/meson.build b/meson.build
index 38d23ed61c..c9586acc29 100644
--- a/meson.build
+++ b/meson.build
@@ -685,6 +685,42 @@ if graphene_has_sse2 or graphene_has_gcc
endif
endif
+f16c_cflags = []
+if get_option('f16c').enabled()
+ f16c_prog = '''
+#if defined(__GNUC__)
+# if !defined(__amd64__) && !defined(__x86_64__)
+# error "F16C intrinsics are only available on x86_64"
+# endif
+#elif defined (_MSC_VER) && !defined (_M_X64) && !defined (_M_AMD64)
+# error "F16C intrinsics not supported on x86 MSVC builds"
+#endif
+#if defined(__SSE__) || (_M_X64 > 0)
+# include <immintrin.h>
+#else
+# error "No F16C intrinsics available"
+#endif
+int main () {
+ float f[4] = { 0, };
+ unsigned short h[4] = { 0, };
+ __m128 s = _mm_loadu_ps (f);
+ __m128i i = _mm_cvtps_ph (s, 0);
+ _mm_storel_epi64 ((__m128i*)h, i);
+ return 0;
+}'''
+ if cc.get_id() != 'msvc'
+ test_f16c_cflags = [ '-mf16c' ]
+ else
+ test_f16c_cflags = []
+ endif
+
+ if cc.compiles(f16c_prog, args: test_f16c_cflags, name: 'F16C intrinsics')
+ cdata.set('HAVE_F16C', 1)
+ f16c_cflags = test_f16c_cflags
+ common_cflags += test_f16c_cflags
+ endif
+endif
+
subdir('gtk/css')
subdir('gdk')
subdir('gsk')
diff --git a/meson_options.txt b/meson_options.txt
index 16a1cbd9fe..4193415151 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -86,6 +86,11 @@ option('sassc',
value: 'auto',
description: 'Rebuild themes using sassc')
+option('f16c',
+ type: 'feature',
+ value: 'enabled',
+ description: 'Enable F16C fast paths (requires F16C)')
+
# Documentation and introspection
option('gtk_doc',
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]