This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH i386 AVX512] [9/n] Extend iterators and attributes.
- From: Kirill Yukhin <kirill dot yukhin at gmail dot com>
- To: Uros Bizjak <ubizjak at gmail dot com>
- Cc: Jakub Jelinek <jakub at redhat dot com>, Richard Henderson <rth at redhat dot com>, GCC Patches <gcc-patches at gcc dot gnu dot org>, kirill dot yukhin at gmail dot com
- Date: Thu, 14 Aug 2014 15:20:28 +0400
- Subject: [PATCH i386 AVX512] [9/n] Extend iterators and attributes.
- Authentication-results: sourceware.org; auth=none
Hello,
This patch extends iterators and iterator modes
to support new patterns (future patches).
Bootstrapped.
Is it ok trunk?
* config/i386/sse.md (define_mode_attr avx512): New.
(define_mode_attr sse2_avx_avx512f): Allow V8HI, V16HI, V32HI, V2DI,
V4DI modes.
(define_mode_attr sse2_avx2): Allow V64QI, V32HI, V4TI modes.
(define_mode_attr ssse3_avx2): Ditto.
(define_mode_attr sse4_1_avx2): Allow V64QI, V32HI, V8DI modes.
(define_mode_attr avx2_avx512bw): New.
(define_mode_attr ssedoublemodelower): New.
(define_mode_attr ssedoublemode): Allow V8SF, V8SI, V4DI, V4DF, V4SI,
V32HI, V64QI modes.
(define_mode_attr ssebytemode): Allow V8DI modes.
(define_mode_attr sseinsnmode): Allow V4TI, V32HI, V64QI modes.
(define_mode_attr sseintvecmodelower): Allow V8DF, V4TI modes.
(define_mode_attr ssePSmode2): New.
(define_mode_attr ssescalarsize): Allow V64QI, V32QI, V16QI, V8HI,
V16HI, V32HI modes.
(define_mode_attr dbpsadbwmode): New.
(define_mode_attr bcstscalarsuff): Allow V64QI, V32QI, V16QI, V32HI,
V16HI, V8HI, V8SI, V4SI, V4DI, V2DI, V8SF, V4SF, V4DF, V2DF modes.
(vi8_sse4_1_avx2_avx512): New.
(define_insn <sse4_1_avx2>_movntdqa): Use <vi8_sse4_1_avx2_avx512>
mode attribute.
--
Thanks, K
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index ebe38f3..89a1842 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -331,32 +331,41 @@
(V4SI "TARGET_AVX2") (V2DI "TARGET_AVX2")
(V8SI "TARGET_AVX2") (V4DI "TARGET_AVX2")])
+(define_mode_attr avx512
+ [(V16QI "avx512vl") (V32QI "avx512vl") (V64QI "avx512bw")
+ (V8HI "avx512vl") (V16HI "avx512vl") (V32HI "avx512bw")
+ (V4SI "avx512vl") (V8SI "avx512vl") (V16SI "avx512f")
+ (V2DI "avx512vl") (V4DI "avx512vl") (V8DI "avx512f")
+ (V4SF "avx512vl") (V8SF "avx512vl") (V16SF "avx512f")
+ (V2DF "avx512vl") (V4DF "avx512vl") (V8DF "avx512f")])
+
(define_mode_attr sse2_avx_avx512f
[(V16QI "sse2") (V32QI "avx") (V64QI "avx512f")
+ (V8HI "avx512vl") (V16HI "avx512vl") (V32HI "avx512bw")
(V4SI "sse2") (V8SI "avx") (V16SI "avx512f")
- (V8DI "avx512f")
+ (V2DI "avx512vl") (V4DI "avx512vl") (V8DI "avx512f")
(V16SF "avx512f") (V8SF "avx") (V4SF "avx")
(V8DF "avx512f") (V4DF "avx") (V2DF "avx")])
(define_mode_attr sse2_avx2
- [(V16QI "sse2") (V32QI "avx2")
- (V8HI "sse2") (V16HI "avx2")
+ [(V16QI "sse2") (V32QI "avx2") (V64QI "avx512bw")
+ (V8HI "sse2") (V16HI "avx2") (V32HI "avx512bw")
(V4SI "sse2") (V8SI "avx2") (V16SI "avx512f")
(V2DI "sse2") (V4DI "avx2") (V8DI "avx512f")
- (V1TI "sse2") (V2TI "avx2")])
+ (V1TI "sse2") (V2TI "avx2") (V4TI "avx512bw")])
(define_mode_attr ssse3_avx2
- [(V16QI "ssse3") (V32QI "avx2")
- (V4HI "ssse3") (V8HI "ssse3") (V16HI "avx2")
+ [(V16QI "ssse3") (V32QI "avx2") (V64QI "avx512bw")
+ (V4HI "ssse3") (V8HI "ssse3") (V16HI "avx2") (V32HI "avx512bw")
(V4SI "ssse3") (V8SI "avx2")
(V2DI "ssse3") (V4DI "avx2")
- (TI "ssse3") (V2TI "avx2")])
+ (TI "ssse3") (V2TI "avx2") (V4TI "avx512bw")])
(define_mode_attr sse4_1_avx2
- [(V16QI "sse4_1") (V32QI "avx2")
- (V8HI "sse4_1") (V16HI "avx2")
+ [(V16QI "sse4_1") (V32QI "avx2") (V64QI "avx512bw")
+ (V8HI "sse4_1") (V16HI "avx2") (V32HI "avx512bw")
(V4SI "sse4_1") (V8SI "avx2") (V16SI "avx512f")
- (V2DI "sse4_1") (V4DI "avx2") (V8DI "avx512f")])
+ (V2DI "sse4_1") (V4DI "avx2") (V8DI "avx512dq")])
(define_mode_attr avx_avx2
[(V4SF "avx") (V2DF "avx")
@@ -376,6 +385,13 @@
(V8SF "avx2") (V16SF "avx512f")
(V4DF "avx2") (V8DF "avx512f")])
+(define_mode_attr avx2_avx512bw
+ [(V4SI "avx2") (V8SI "avx2") (V16SI "avx512f")
+ (V2DI "avx2") (V4DI "avx2") (V8DI "avx512f")
+ (V4SF "avx2") (V8SF "avx2") (V16SF "avx512f")
+ (V2DF "avx2") (V4DF "avx2") (V8DF "avx512f")
+ (V8HI "avx512vl") (V16HI "avx512vl") (V32HI "avx512bw")])
+
(define_mode_attr shuffletype
[(V16SF "f") (V16SI "i") (V8DF "f") (V8DI "i")
(V8SF "f") (V8SI "i") (V4DF "f") (V4DI "i")
@@ -386,13 +402,19 @@
(define_mode_attr ssequartermode
[(V16SF "V4SF") (V8DF "V2DF") (V16SI "V4SI") (V8DI "V2DI")])
+(define_mode_attr ssedoublemodelower
+ [(V16QI "v16hi") (V32QI "v32hi") (V64QI "v64hi")
+ (V8HI "v8si") (V16HI "v16si") (V32HI "v32si")
+ (V4SI "v4di") (V8SI "v8di") (V16SI "v16di")])
+
(define_mode_attr ssedoublemode
[(V16SF "V32SF") (V16SI "V32SI") (V8DI "V16DI") (V8DF "V16DF")
- (V16HI "V16SI") (V8HI "V8SI") (V4HI "V4SI")
- (V32QI "V32HI") (V16QI "V16HI")])
+ (V8SF "V16SF") (V8SI "V16SI") (V4DI "V8DI") (V4DF "V8DF")
+ (V16HI "V16SI") (V8HI "V8SI") (V4HI "V4SI") (V4SI "V4DI")
+ (V32HI "V32SI") (V32QI "V32HI") (V16QI "V16HI") (V64QI "V64HI")])
(define_mode_attr ssebytemode
- [(V4DI "V32QI") (V2DI "V16QI")])
+ [(V8DI "V64QI") (V4DI "V32QI") (V2DI "V16QI")])
;; All 128bit vector integer modes
(define_mode_iterator VI_128 [V16QI V8HI V4SI V2DI])
@@ -461,7 +483,7 @@
;; SSE instruction mode
(define_mode_attr sseinsnmode
- [(V64QI "XI") (V32HI "XI") (V16SI "XI") (V8DI "XI")
+ [(V64QI "XI") (V32HI "XI") (V16SI "XI") (V8DI "XI") (V4TI "XI")
(V32QI "OI") (V16HI "OI") (V8SI "OI") (V4DI "OI") (V2TI "OI")
(V16QI "TI") (V8HI "TI") (V4SI "TI") (V2DI "TI") (V1TI "TI")
(V16SF "V16SF") (V8DF "V8DF")
@@ -487,10 +509,11 @@
(V8SI "V8SI") (V4DI "V4DI")
(V4SI "V4SI") (V2DI "V2DI")
(V16HI "V16HI") (V8HI "V8HI")
+ (V32HI "V32HI") (V64QI "V64QI")
(V32QI "V32QI") (V16QI "V16QI")])
(define_mode_attr sseintvecmodelower
- [(V16SF "v16si")
+ [(V16SF "v16si") (V8DF "v8di")
(V8SF "v8si") (V4DF "v4di")
(V4SF "v4si") (V2DF "v2di")
(V8SI "v8si") (V4DI "v4di")
@@ -522,10 +545,13 @@
(V32HI "V16SF") (V16HI "V8SF") (V8HI "V4SF")
(V8SI "V8SF") (V4SI "V4SF")
(V4DI "V8SF") (V2DI "V4SF")
- (V2TI "V8SF") (V1TI "V4SF")
+ (V4TI "V16SF") (V2TI "V8SF") (V1TI "V4SF")
(V8SF "V8SF") (V4SF "V4SF")
(V4DF "V8SF") (V2DF "V4SF")])
+(define_mode_attr ssePSmode2
+ [(V8DI "V8SF") (V4DI "V4SF")])
+
;; Mapping of vector modes back to the scalar modes
(define_mode_attr ssescalarmode
[(V64QI "QI") (V32QI "QI") (V16QI "QI")
@@ -570,6 +596,7 @@
(define_mode_attr ssescalarsize
[(V8DI "64") (V4DI "64") (V2DI "64")
+ (V64QI "8") (V32QI "8") (V16QI "8")
(V32HI "16") (V16HI "16") (V8HI "16")
(V16SI "32") (V8SI "32") (V4SI "32")
(V16SF "32") (V8DF "64")])
@@ -581,7 +608,10 @@
(V8DI "p") (V8DF "")
(V4SI "p") (V4SF "")
(V8SI "p") (V8SF "")
- (V16SI "p") (V16SF "")])
+ (V16SI "p") (V16SF "")
+ (V16QI "p") (V8HI "p")
+ (V32QI "p") (V16HI "p")
+ (V64QI "p") (V32HI "p")])
;; SSE scalar suffix for vector modes
(define_mode_attr ssescalarmodesuffix
@@ -626,9 +656,18 @@
(define_mode_attr blendbits
[(V8SF "255") (V4SF "15") (V4DF "15") (V2DF "3")])
+;; Mapping for dbpsabbw modes
+(define_mode_attr dbpsadbwmode
+ [(V32HI "V64QI") (V16HI "V32QI") (V8HI "V16QI")])
+
;; Mapping suffixes for broadcast
(define_mode_attr bcstscalarsuff
- [(V16SI "d") (V16SF "ss") (V8DI "q") (V8DF "sd")])
+ [(V64QI "b") (V32QI "b") (V16QI "b")
+ (V32HI "w") (V16HI "w") (V8HI "w")
+ (V16SI "d") (V8SI "d") (V4SI "d")
+ (V8DI "q") (V4DI "q") (V2DI "q")
+ (V16SF "ss") (V8SF "ss") (V4SF "ss")
+ (V8DF "sd") (V4DF "sd") (V2DF "sd")])
;; Include define_subst patterns for instructions with mask
(include "subst.md")
@@ -11641,7 +11680,11 @@
(set_attr "btver2_decode" "vector,vector")
(set_attr "mode" "<MODE>")])
-(define_insn "<sse4_1_avx2>_movntdqa"
+;; Mode attribute used by `vmovntdqa' pattern
+(define_mode_attr vi8_sse4_1_avx2_avx512
+ [(V2DI "sse4_1") (V4DI "avx2") (V8DI "avx512f")])
+
+(define_insn "<vi8_sse4_1_avx2_avx512>_movntdqa"
[(set (match_operand:VI8_AVX2_AVX512F 0 "register_operand" "=x, v")
(unspec:VI8_AVX2_AVX512F [(match_operand:VI8_AVX2_AVX512F 1 "memory_operand" "m, m")]
UNSPEC_MOVNTDQA))]