public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-3644] Support embedded broadcast for AVX512FP16 instructions.
@ 2021-09-18  5:03 hongtao Liu
  0 siblings, 0 replies; only message in thread
From: hongtao Liu @ 2021-09-18  5:03 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:7afcb534239014a713e1f234c8734644245e5c38

commit r12-3644-g7afcb534239014a713e1f234c8734644245e5c38
Author: liuhongt <hongtao.liu@intel.com>
Date:   Sat Sep 18 12:14:32 2021 +0800

    Support embedded broadcast for AVX512FP16 instructions.
    
    gcc/ChangeLog:
    
            PR target/87767
            * config/i386/i386.c (ix86_print_operand): Handle
            V8HF/V16HF/V32HFmode.
            * config/i386/i386.h (VALID_BCST_MODE_P): Add HFmode.
            * config/i386/sse.md (avx512bcst): Remove.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/i386/avx512fp16-broadcast-1.c: New test.
            * gcc.target/i386/avx512fp16-broadcast-2.c: New test.

Diff:
---
 gcc/config/i386/i386.c                             |  5 ++
 gcc/config/i386/i386.h                             |  3 +-
 gcc/config/i386/sse.md                             |  8 ----
 .../gcc.target/i386/avx512fp16-broadcast-1.c       | 33 ++++++++++++++
 .../gcc.target/i386/avx512fp16-broadcast-2.c       | 53 ++++++++++++++++++++++
 5 files changed, 93 insertions(+), 9 deletions(-)

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index afc2674d49d..1f6d6ce567c 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -13610,12 +13610,17 @@ ix86_print_operand (FILE *file, rtx x, int code)
 	case E_V8SFmode:
 	case E_V8DFmode:
 	case E_V8DImode:
+	case E_V8HFmode:
 	  fputs ("{1to8}", file);
 	  break;
 	case E_V16SFmode:
 	case E_V16SImode:
+	case E_V16HFmode:
 	  fputs ("{1to16}", file);
 	  break;
+	case E_V32HFmode:
+	  fputs ("{1to32}", file);
+	  break;
 	default:
 	  gcc_unreachable ();
 	}
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index ec60b89753e..8a4251b4926 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -1105,7 +1105,8 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
 
 #define VALID_BCST_MODE_P(MODE)			\
   ((MODE) == SFmode || (MODE) == DFmode		\
-   || (MODE) == SImode || (MODE) == DImode)
+   || (MODE) == SImode || (MODE) == DImode	\
+   || (MODE) == HFmode)
 
 /* It is possible to write patterns to move flags; but until someone
    does it,  */
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index d7a132877e9..c5d202cf5bd 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -841,14 +841,6 @@
 (define_mode_iterator V16_256 [V16HI V16HF])
 (define_mode_iterator V32_512 [V32HI V32HF])
 
-(define_mode_attr avx512bcst
-  [(V4SI "%{1to4%}") (V2DI "%{1to2%}")
-   (V8SI "%{1to8%}") (V4DI "%{1to4%}")
-   (V16SI "%{1to16%}") (V8DI "%{1to8%}")
-   (V4SF "%{1to4%}") (V2DF "%{1to2%}")
-   (V8SF "%{1to8%}") (V4DF "%{1to4%}")
-   (V16SF "%{1to16%}") (V8DF "%{1to8%}")])
-
 ;; Mapping from float mode to required SSE level
 (define_mode_attr sse
   [(SF "sse") (DF "sse2") (HF "avx512fp16")
diff --git a/gcc/testsuite/gcc.target/i386/avx512fp16-broadcast-1.c b/gcc/testsuite/gcc.target/i386/avx512fp16-broadcast-1.c
new file mode 100644
index 00000000000..3e2397f066f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512fp16-broadcast-1.c
@@ -0,0 +1,33 @@
+/* PR target/87767 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512fp16 -mavx512vl -mavx512dq" } */
+/* { dg-additional-options "-mdynamic-no-pic" { target { *-*-darwin* && ia32 } } }
+/* { dg-final { scan-assembler-times "\[^\n\]*\\\{1to8\\\}" 4 } }  */
+/* { dg-final { scan-assembler-times "\[^\n\]*\\\{1to16\\\}" 4 } }  */
+/* { dg-final { scan-assembler-times "\[^\n\]*\\\{1to32\\\}" 4 } }  */
+
+typedef _Float16 v8hf  __attribute__ ((vector_size (16)));
+typedef _Float16 v16hf  __attribute__ ((vector_size (32)));
+typedef _Float16 v32hf  __attribute__ ((vector_size (64)));
+
+#define CONSTANT 101;
+#define FOO(VTYPE, OP_NAME, OP)                        \
+VTYPE                                          \
+ __attribute__ ((noipa))                       \
+foo_##OP_NAME##_##VTYPE (VTYPE a)              \
+{                                              \
+  return a OP CONSTANT;                                \
+}                                              \
+
+FOO (v8hf, add, +);
+FOO (v16hf, add, +);
+FOO (v32hf, add, +);
+FOO (v8hf, sub, -);
+FOO (v16hf, sub, -);
+FOO (v32hf, sub, -);
+FOO (v8hf, mul, *);
+FOO (v16hf, mul, *);
+FOO (v32hf, mul, *);
+FOO (v8hf, div, /);
+FOO (v16hf, div, /);
+FOO (v32hf, div, /);
diff --git a/gcc/testsuite/gcc.target/i386/avx512fp16-broadcast-2.c b/gcc/testsuite/gcc.target/i386/avx512fp16-broadcast-2.c
new file mode 100644
index 00000000000..016e0ea465b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512fp16-broadcast-2.c
@@ -0,0 +1,53 @@
+/* PR target/87767 */
+/* { dg-do run } */
+/* { dg-options "-O1 -mavx512fp16 -mavx512dq -mavx512vl" } */
+/* { dg-require-effective-target avx512dq } */
+/* { dg-require-effective-target avx512vl } */
+/* { dg-require-effective-target avx512fp16 } */
+
+#define AVX512DQ
+#define AVX512VL
+#define AVX512FP16
+#include "avx512f-helper.h"
+
+#include "avx512fp16-broadcast-1.c"
+
+#define RTEST(VTYPE, TYPE, N, OP_NAME, OP)             \
+  do                                                   \
+    {                                                  \
+      TYPE exp[N], src[N];                             \
+      VTYPE res;                                       \
+      for (int i = 0; i < N; i++)                      \
+       src[i] = 2.0 * i - 8.4;                         \
+      res = foo_##OP_NAME##_##VTYPE (*(VTYPE*)&src[0]);        \
+      for (int i = 0; i < N; i ++)                     \
+       exp[i] = src[i] OP CONSTANT;                    \
+      for (int j = 0; j < N; j++)                      \
+       {                                               \
+         if (res[j] != exp[j])                         \
+           abort();                                    \
+       }                                               \
+    }                                                  \
+  while (0)
+
+void
+test_256 (void)
+{
+  RTEST (v8hf, _Float16, 8, add, +);
+  RTEST (v16hf, _Float16, 16, add, +);
+  RTEST (v32hf, _Float16, 32, add, +);
+  RTEST (v8hf, _Float16, 8, sub, -);
+  RTEST (v16hf, _Float16, 16, sub, -);
+  RTEST (v32hf, _Float16, 32, sub, -);
+  RTEST (v8hf, _Float16, 8, mul, *);
+  RTEST (v16hf, _Float16, 16, mul, *);
+  RTEST (v32hf, _Float16, 32, mul, *);
+  RTEST (v8hf, _Float16, 8, div, /);
+  RTEST (v16hf, _Float16, 16, div, /);
+  RTEST (v32hf, _Float16, 32, div, /);
+}
+
+void
+test_128 (void)
+{
+}


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-09-18  5:03 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-18  5:03 [gcc r12-3644] Support embedded broadcast for AVX512FP16 instructions hongtao Liu

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).