unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Steve Ellcey <sellcey@marvell.com>
To: "libc-alpha@sourceware.org" <libc-alpha@sourceware.org>
Cc: "mliska@suse.cz" <mliska@suse.cz>
Subject: Building math-vector-fortran.h in glibc
Date: Fri, 18 Jan 2019 16:08:43 +0000	[thread overview]
Message-ID: <b73850db18de6197a5e3ae6c963ef13d0ee9aa83.camel@marvell.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 1002 bytes --]

Martin,

I have been working with libmvec on aarch64 and I took your glibc script
to create math-vector-fortran.h and incorporated it into the glibc
math Makefile to try it out.  The patch is attached to this email.

The main thing I noticed is that your script was specifically grepping
for __DECL_SIMD_x86_64 and when I created a math-vector.h file for
Aarch64 I used __DECL_SIMD_AARCH64 so I had to change the script.

I don't think we want a different script for each target so we need to
find some way to deal with this.  Either use a common name on all
platforms, which I think is OK since this should be an internal
macro name that is not used by end users or find a way to generalize
the match regardless of the name.

The other thought I had was, instead of scanning math-vector.h,
have the script preprocess math.h itself and then look for simd
attributes after preprocessing.  I think that would make the scanner
more complex though.

Steve Ellcey
sellcey@marvell.com

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: min.patch --]
[-- Type: text/x-patch; name="min.patch", Size: 4695 bytes --]

diff --git a/math/Makefile b/math/Makefile
index 76e8eda..13d4496 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -30,6 +30,10 @@ headers		:= math.h bits/mathcalls.h bits/mathinline.h \
 		   bits/flt-eval-method.h bits/fp-fast.h bits/fp-logb.h \
 		   bits/long-double.h bits/mathcalls-helper-functions.h \
 		   bits/floatn.h bits/floatn-common.h bits/mathcalls-narrow.h
+ifeq ($(build-mathvec),yes)
+headers		+= math-vector-fortran.h
+generated	+= math-vector-fortran.h
+endif
 
 # FPU support code.
 aux		:= setfpucw fpu_control
@@ -220,6 +224,10 @@ $(inst_libdir)/libm.a: $(common-objpfx)format.lds \
 	 echo 'GROUP ( $(libdir)/libm-$(version).a $(libdir)/libmvec.a )' \
 	) > $@.new
 	mv -f $@.new $@
+
+math_vector_header = $(wildcard $(sysdirs:%=%/bits/math-vector.h))
+$(objpfx)math-vector-fortran.h:
+	cat $(math_vector_header) | $(PYTHON) gen-fortran-math-vector.py > $(objpfx)math-vector-fortran.h
 endif
 
 # Rules for the test suite.
diff --git a/math/gen-fortran-math-vector.py b/math/gen-fortran-math-vector.py
index e69de29..0fc6c4a 100644
--- a/math/gen-fortran-math-vector.py
+++ b/math/gen-fortran-math-vector.py
@@ -0,0 +1,16 @@
+#!/usr/bin/env python3
+
+import fileinput
+
+# sample declarations:
+#  define __DECL_SIMD_cos __DECL_SIMD_AARCH64
+
+for line in fileinput.input():
+    parts = [x for x in line.strip().split(' ') if x]
+    s = '__DECL_SIMD_'
+    if (len(parts) == 4 and parts[1] == 'define'
+        and parts[-1] == '__DECL_SIMD_AARCH64'):
+            fn = parts[2]
+            assert fn.startswith(s)
+            fn =fn[len(s):]
+            print('!GCC$ builtin (%s) attributes simd (notinbranch)' % fn)
diff --git a/sysdeps/aarch64/fpu/bits/math-vector.h b/sysdeps/aarch64/fpu/bits/math-vector.h
index e69de29..0b271ee 100644
--- a/sysdeps/aarch64/fpu/bits/math-vector.h
+++ b/sysdeps/aarch64/fpu/bits/math-vector.h
@@ -0,0 +1,75 @@
+/* Platform-specific SIMD declarations of math functions.
+   Copyright (C) 2018 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _MATH_H
+# error "Never include <bits/math-vector.h> directly;\
+ include <math.h> instead."
+#endif
+
+/* Get default empty definitions for simd declarations.  */
+#include <bits/libm-simd-decl-stubs.h>
+
+#if defined __FAST_MATH__
+# if defined _OPENMP && _OPENMP >= 201307
+/* OpenMP case.  */
+#  define __DECL_SIMD_AARCH64 _Pragma ("omp declare simd notinbranch")
+# elif __GNUC_PREREQ (6,0)
+/* W/o OpenMP use GCC 6.* __attribute__ ((__simd__)).  */
+#  define __DECL_SIMD_AARCH64 __attribute__ ((__simd__ ("notinbranch")))
+# endif
+
+# ifdef __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_cos
+#  define __DECL_SIMD_cos __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_cosf
+#  define __DECL_SIMD_cosf __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_exp
+#  define __DECL_SIMD_exp __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_expf
+#  define __DECL_SIMD_expf __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_exp2
+#  define __DECL_SIMD_exp2 __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_exp2f
+#  define __DECL_SIMD_exp2f __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_exp10
+#  define __DECL_SIMD_exp10 __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_exp10f
+#  define __DECL_SIMD_exp10f __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_log
+#  define __DECL_SIMD_log __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_logf
+#  define __DECL_SIMD_logf __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_log2
+#  define __DECL_SIMD_log2 __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_log2f
+#  define __DECL_SIMD_log2f __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_log10
+#  define __DECL_SIMD_log10 __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_log10f
+#  define __DECL_SIMD_log10f __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_pow
+#  define __DECL_SIMD_pow __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_powf
+#  define __DECL_SIMD_powf __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_sin
+#  define __DECL_SIMD_sin __DECL_SIMD_AARCH64
+#  undef __DECL_SIMD_sinf
+#  define __DECL_SIMD_sinf __DECL_SIMD_AARCH64
+# endif
+
+#endif

             reply	other threads:[~2019-01-18 16:08 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-18 16:08 Steve Ellcey [this message]
2019-01-18 17:35 ` Building math-vector-fortran.h in glibc Steve Ellcey
2019-01-18 21:14 ` Joseph Myers
2019-01-21  8:04 ` Martin Liška

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/libc/involved.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b73850db18de6197a5e3ae6c963ef13d0ee9aa83.camel@marvell.com \
    --to=sellcey@marvell.com \
    --cc=libc-alpha@sourceware.org \
    --cc=mliska@suse.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).