matmulavx128.m4 revision 1.1 1 1.1 mrg `/* Implementation of the MATMUL intrinsic
2 1.1 mrg Copyright (C) 2002-2019 Free Software Foundation, Inc.
3 1.1 mrg Contributed by Thomas Koenig <tkoenig (a] gcc.gnu.org>.
4 1.1 mrg
5 1.1 mrg This file is part of the GNU Fortran runtime library (libgfortran).
6 1.1 mrg
7 1.1 mrg Libgfortran is free software; you can redistribute it and/or
8 1.1 mrg modify it under the terms of the GNU General Public
9 1.1 mrg License as published by the Free Software Foundation; either
10 1.1 mrg version 3 of the License, or (at your option) any later version.
11 1.1 mrg
12 1.1 mrg Libgfortran is distributed in the hope that it will be useful,
13 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 mrg GNU General Public License for more details.
16 1.1 mrg
17 1.1 mrg Under Section 7 of GPL version 3, you are granted additional
18 1.1 mrg permissions described in the GCC Runtime Library Exception, version
19 1.1 mrg 3.1, as published by the Free Software Foundation.
20 1.1 mrg
21 1.1 mrg You should have received a copy of the GNU General Public License and
22 1.1 mrg a copy of the GCC Runtime Library Exception along with this program;
23 1.1 mrg see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 1.1 mrg <http://www.gnu.org/licenses/>. */
25 1.1 mrg
26 1.1 mrg #include "libgfortran.h"
27 1.1 mrg #include <string.h>
28 1.1 mrg #include <assert.h>'
29 1.1 mrg
30 1.1 mrg include(iparm.m4)dnl
31 1.1 mrg
32 1.1 mrg /* These are the specific versions of matmul with -mprefer-avx128. */
33 1.1 mrg
34 1.1 mrg `#if defined (HAVE_'rtype_name`)
35 1.1 mrg
36 1.1 mrg /* Prototype for the BLAS ?gemm subroutine, a pointer to which can be
37 1.1 mrg passed to us by the front-end, in which case we call it for large
38 1.1 mrg matrices. */
39 1.1 mrg
40 1.1 mrg typedef void (*blas_call)(const char *, const char *, const int *, const int *,
41 1.1 mrg const int *, const 'rtype_name` *, const 'rtype_name` *,
42 1.1 mrg const int *, const 'rtype_name` *, const int *,
43 1.1 mrg const 'rtype_name` *, 'rtype_name` *, const int *,
44 1.1 mrg int, int);
45 1.1 mrg
46 1.1 mrg #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
47 1.1 mrg 'define(`matmul_name',`matmul_'rtype_code`_avx128_fma3')dnl
48 1.1 mrg `void
49 1.1 mrg 'matmul_name` ('rtype` * const restrict retarray,
50 1.1 mrg 'rtype` * const restrict a, 'rtype` * const restrict b, int try_blas,
51 1.1 mrg int blas_limit, blas_call gemm) __attribute__((__target__("avx,fma")));
52 1.1 mrg internal_proto('matmul_name`);
53 1.1 mrg 'include(matmul_internal.m4)dnl
54 1.1 mrg `#endif
55 1.1 mrg
56 1.1 mrg #if defined(HAVE_AVX) && defined(HAVE_FMA4) && defined(HAVE_AVX128)
57 1.1 mrg 'define(`matmul_name',`matmul_'rtype_code`_avx128_fma4')dnl
58 1.1 mrg `void
59 1.1 mrg 'matmul_name` ('rtype` * const restrict retarray,
60 1.1 mrg 'rtype` * const restrict a, 'rtype` * const restrict b, int try_blas,
61 1.1 mrg int blas_limit, blas_call gemm) __attribute__((__target__("avx,fma4")));
62 1.1 mrg internal_proto('matmul_name`);
63 1.1 mrg 'include(matmul_internal.m4)dnl
64 1.1 mrg `#endif
65 1.1 mrg
66 1.1 mrg #endif
67 1.1 mrg '
68