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