diff options
author | Alexander Ivchenko <alexander.ivchenko@intel.com> | 2014-10-14 08:20:43 +0000 |
---|---|---|
committer | Kirill Yukhin <kyukhin@gcc.gnu.org> | 2014-10-14 08:20:43 +0000 |
commit | 26358fb6a0c566c2cdca5107ff60d249abfc028b (patch) | |
tree | e7cb9d40336cf7e6f8904ee66c8ccc126ae3c94b | |
parent | 06ba0585d67cf607a5141d5bfcd4a6a67607ae70 (diff) | |
download | gcc-26358fb6a0c566c2cdca5107ff60d249abfc028b.zip gcc-26358fb6a0c566c2cdca5107ff60d249abfc028b.tar.gz gcc-26358fb6a0c566c2cdca5107ff60d249abfc028b.tar.bz2 |
AVX-512. 61/n. Update FP logic insn patterns.
gcc/
* config/i386/sse.md
(define_insn "<sse>_andnot<VF_128_256:mode>3<mask_name>"): Add masking,
use VF_128_256 mode iterator and update assembler emit code.
(define_insn "<sse>_andnot<VF_512:mode>3<mask_name>"): New.
(define_expand "<any_logic:code><VF_128_256:mode>3<mask_name>"):
Add masking, use VF_128_256 mode iterator.
(define_expand "<any_logic:code><VF_512:mode>3<mask_name>"): New.
(define_insn "*<any_logic:code><VF_128_256:mode>3<mask_name>"):
Add masking, use VF_128_256 mode iterator and update assembler emit
code.
(define_insn "*<any_logic:code><VF_512:mode>3<mask_name>"): New.
(define_mode_attr avx512flogicsuff): Delete.
(define_insn "avx512f_<logic><mode>"): Ditto.
(define_insn "*andnot<mode>3<mask_name>"): Update MODE_XI, MODE_OI,
MODE_TI.
(define_insn "<mask_codefor><code><mode>3<mask_name>"): Ditto.
Co-Authored-By: Andrey Turetskiy <andrey.turetskiy@intel.com>
Co-Authored-By: Anna Tikhonova <anna.tikhonova@intel.com>
Co-Authored-By: Ilya Tocar <ilya.tocar@intel.com>
Co-Authored-By: Ilya Verbin <ilya.verbin@intel.com>
Co-Authored-By: Kirill Yukhin <kirill.yukhin@intel.com>
Co-Authored-By: Maxim Kuznetsov <maxim.kuznetsov@intel.com>
Co-Authored-By: Michael Zolotukhin <michael.v.zolotukhin@intel.com>
From-SVN: r216179
-rw-r--r-- | gcc/ChangeLog | 26 | ||||
-rw-r--r-- | gcc/config/i386/sse.md | 206 |
2 files changed, 167 insertions, 65 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 18cefaf..5806e05 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -8,6 +8,32 @@ Michael Zolotukhin <michael.v.zolotukhin@intel.com> * config/i386/sse.md + (define_insn "<sse>_andnot<VF_128_256:mode>3<mask_name>"): Add masking, + use VF_128_256 mode iterator and update assembler emit code. + (define_insn "<sse>_andnot<VF_512:mode>3<mask_name>"): New. + (define_expand "<any_logic:code><VF_128_256:mode>3<mask_name>"): + Add masking, use VF_128_256 mode iterator. + (define_expand "<any_logic:code><VF_512:mode>3<mask_name>"): New. + (define_insn "*<any_logic:code><VF_128_256:mode>3<mask_name>"): + Add masking, use VF_128_256 mode iterator and update assembler emit + code. + (define_insn "*<any_logic:code><VF_512:mode>3<mask_name>"): New. + (define_mode_attr avx512flogicsuff): Delete. + (define_insn "avx512f_<logic><mode>"): Ditto. + (define_insn "*andnot<mode>3<mask_name>"): Update MODE_XI, MODE_OI, + MODE_TI. + (define_insn "<mask_codefor><code><mode>3<mask_name>"): Ditto. + +2014-10-14 Alexander Ivchenko <alexander.ivchenko@intel.com> + Maxim Kuznetsov <maxim.kuznetsov@intel.com> + Anna Tikhonova <anna.tikhonova@intel.com> + Ilya Tocar <ilya.tocar@intel.com> + Andrey Turetskiy <andrey.turetskiy@intel.com> + Ilya Verbin <ilya.verbin@intel.com> + Kirill Yukhin <kirill.yukhin@intel.com> + Michael Zolotukhin <michael.v.zolotukhin@intel.com> + + * config/i386/sse.md (define_mode_iterator VI128_128 [V16QI V8HI V2DI]): Delete. (define_expand "vashr<mode>3<mask_name>"): Add masking, use VI12_128 mode iterator. diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index f4586d9..a760f53 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -2692,15 +2692,15 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define_insn "<sse>_andnot<mode>3" - [(set (match_operand:VF 0 "register_operand" "=x,v") - (and:VF - (not:VF - (match_operand:VF 1 "register_operand" "0,v")) - (match_operand:VF 2 "nonimmediate_operand" "xm,vm")))] - "TARGET_SSE" +(define_insn "<sse>_andnot<mode>3<mask_name>" + [(set (match_operand:VF_128_256 0 "register_operand" "=x,v") + (and:VF_128_256 + (not:VF_128_256 + (match_operand:VF_128_256 1 "register_operand" "0,v")) + (match_operand:VF_128_256 2 "nonimmediate_operand" "xm,vm")))] + "TARGET_SSE && <mask_avx512vl_condition>" { - static char buf[32]; + static char buf[128]; const char *ops; const char *suffix; @@ -2720,17 +2720,17 @@ ops = "andn%s\t{%%2, %%0|%%0, %%2}"; break; case 1: - ops = "vandn%s\t{%%2, %%1, %%0|%%0, %%1, %%2}"; + ops = "vandn%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}"; break; default: gcc_unreachable (); } - /* There is no vandnp[sd]. Use vpandnq. */ - if (<MODE_SIZE> == 64) + /* There is no vandnp[sd] in avx512f. Use vpandn[qd]. */ + if (<mask_applied> && !TARGET_AVX512DQ) { - suffix = "q"; - ops = "vpandn%s\t{%%2, %%1, %%0|%%0, %%1, %%2}"; + suffix = GET_MODE_INNER (<MODE>mode) == DFmode ? "q" : "d"; + ops = "vpandn%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}"; } snprintf (buf, sizeof (buf), ops, suffix); @@ -2750,30 +2750,63 @@ ] (const_string "<MODE>")))]) -(define_expand "<code><mode>3" + +(define_insn "<sse>_andnot<mode>3<mask_name>" + [(set (match_operand:VF_512 0 "register_operand" "=v") + (and:VF_512 + (not:VF_512 + (match_operand:VF_512 1 "register_operand" "v")) + (match_operand:VF_512 2 "nonimmediate_operand" "vm")))] + "TARGET_AVX512F" +{ + static char buf[128]; + const char *ops; + const char *suffix; + + suffix = "<ssemodesuffix>"; + ops = ""; + + /* There is no vandnp[sd] in avx512f. Use vpandn[qd]. */ + if (!TARGET_AVX512DQ) + { + suffix = GET_MODE_INNER (<MODE>mode) == DFmode ? "q" : "d"; + ops = "p"; + } + + snprintf (buf, sizeof (buf), + "v%sandn%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}", + ops, suffix); + return buf; +} + [(set_attr "type" "sselog") + (set_attr "prefix" "evex") + (set_attr "mode" "<sseinsnmode>")]) + +(define_expand "<code><mode>3<mask_name>" [(set (match_operand:VF_128_256 0 "register_operand") - (any_logic:VF_128_256 - (match_operand:VF_128_256 1 "nonimmediate_operand") - (match_operand:VF_128_256 2 "nonimmediate_operand")))] - "TARGET_SSE" + (any_logic:VF_128_256 + (match_operand:VF_128_256 1 "nonimmediate_operand") + (match_operand:VF_128_256 2 "nonimmediate_operand")))] + "TARGET_SSE && <mask_avx512vl_condition>" "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);") -(define_expand "<code><mode>3" +(define_expand "<code><mode>3<mask_name>" [(set (match_operand:VF_512 0 "register_operand") - (fpint_logic:VF_512 + (any_logic:VF_512 (match_operand:VF_512 1 "nonimmediate_operand") (match_operand:VF_512 2 "nonimmediate_operand")))] "TARGET_AVX512F" "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);") -(define_insn "*<code><mode>3" - [(set (match_operand:VF 0 "register_operand" "=x,v") - (any_logic:VF - (match_operand:VF 1 "nonimmediate_operand" "%0,v") - (match_operand:VF 2 "nonimmediate_operand" "xm,vm")))] - "TARGET_SSE && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" +(define_insn "*<code><mode>3<mask_name>" + [(set (match_operand:VF_128_256 0 "register_operand" "=x,v") + (any_logic:VF_128_256 + (match_operand:VF_128_256 1 "nonimmediate_operand" "%0,v") + (match_operand:VF_128_256 2 "nonimmediate_operand" "xm,vm")))] + "TARGET_SSE && <mask_avx512vl_condition> + && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" { - static char buf[32]; + static char buf[128]; const char *ops; const char *suffix; @@ -2793,17 +2826,17 @@ ops = "<logic>%s\t{%%2, %%0|%%0, %%2}"; break; case 1: - ops = "v<logic>%s\t{%%2, %%1, %%0|%%0, %%1, %%2}"; + ops = "v<logic>%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}"; break; default: gcc_unreachable (); } - /* There is no v<logic>p[sd]. Use vp<logic>q. */ - if (<MODE_SIZE> == 64) + /* There is no v<logic>p[sd] in avx512f. Use vp<logic>[dq]. */ + if (<mask_applied> && !TARGET_AVX512DQ) { - suffix = "q"; - ops = "vp<logic>%s\t{%%2, %%1, %%0|%%0, %%1, %%2}"; + suffix = GET_MODE_INNER (<MODE>mode) == DFmode ? "q" : "d"; + ops = "vp<logic>%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}"; } snprintf (buf, sizeof (buf), ops, suffix); @@ -2823,6 +2856,36 @@ ] (const_string "<MODE>")))]) +(define_insn "*<code><mode>3<mask_name>" + [(set (match_operand:VF_512 0 "register_operand" "=v") + (any_logic:VF_512 + (match_operand:VF_512 1 "nonimmediate_operand" "%v") + (match_operand:VF_512 2 "nonimmediate_operand" "vm")))] + "TARGET_AVX512F && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" +{ + static char buf[128]; + const char *ops; + const char *suffix; + + suffix = "<ssemodesuffix>"; + ops = ""; + + /* There is no v<logic>p[sd] in avx512f. Use vp<logic>[dq]. */ + if ((<MODE_SIZE> == 64 || <mask_applied>) && !TARGET_AVX512DQ) + { + suffix = GET_MODE_INNER (<MODE>mode) == DFmode ? "q" : "d"; + ops = "p"; + } + + snprintf (buf, sizeof (buf), + "v%s<logic>%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}", + ops, suffix); + return buf; +} + [(set_attr "type" "sselog") + (set_attr "prefix" "evex") + (set_attr "mode" "<sseinsnmode>")]) + (define_expand "copysign<mode>3" [(set (match_dup 4) (and:VF @@ -3032,23 +3095,6 @@ ] (const_string "TI")))]) -;; There are no floating point xor for V16SF and V8DF in avx512f -;; but we need them for negation. Instead we use int versions of -;; xor. Maybe there could be a better way to do that. - -(define_mode_attr avx512flogicsuff - [(V16SF "d") (V8DF "q")]) - -(define_insn "avx512f_<logic><mode>" - [(set (match_operand:VF_512 0 "register_operand" "=v") - (fpint_logic:VF_512 - (match_operand:VF_512 1 "register_operand" "v") - (match_operand:VF_512 2 "nonimmediate_operand" "vm")))] - "TARGET_AVX512F" - "vp<logic><avx512flogicsuff>\t{%2, %1, %0|%0, %1, %2}" - [(set_attr "type" "sselog") - (set_attr "prefix" "evex")]) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; FMA floating point multiply/accumulate instructions. These include @@ -10539,16 +10585,31 @@ { case MODE_XI: gcc_assert (TARGET_AVX512F); - - tmp = "pandn<ssemodesuffix>"; - break; - case MODE_OI: - gcc_assert (TARGET_AVX2); + gcc_assert (TARGET_AVX2 || TARGET_AVX512VL); case MODE_TI: - gcc_assert (TARGET_SSE2); - - tmp = "pandn"; + gcc_assert (TARGET_SSE2 || TARGET_AVX512VL); + switch (<MODE>mode) + { + case V16SImode: + case V8DImode: + if (TARGET_AVX512F) + { + tmp = "pandn<ssemodesuffix>"; + break; + } + case V8SImode: + case V4DImode: + case V4SImode: + case V2DImode: + if (TARGET_AVX512VL) + { + tmp = "pandn<ssemodesuffix>"; + break; + } + default: + tmp = TARGET_AVX512VL ? "pandnq" : "pandn"; + } break; case MODE_V16SF: @@ -10633,16 +10694,31 @@ { case MODE_XI: gcc_assert (TARGET_AVX512F); - - tmp = "p<logic><ssemodesuffix>"; - break; - case MODE_OI: - gcc_assert (TARGET_AVX2); + gcc_assert (TARGET_AVX2 || TARGET_AVX512VL); case MODE_TI: - gcc_assert (TARGET_SSE2); - - tmp = "p<logic>"; + gcc_assert (TARGET_SSE2 || TARGET_AVX512VL); + switch (<MODE>mode) + { + case V16SImode: + case V8DImode: + if (TARGET_AVX512F) + { + tmp = "p<logic><ssemodesuffix>"; + break; + } + case V8SImode: + case V4DImode: + case V4SImode: + case V2DImode: + if (TARGET_AVX512VL) + { + tmp = "p<logic><ssemodesuffix>"; + break; + } + default: + tmp = TARGET_AVX512VL ? "p<logic>q" : "p<logic>"; + } break; case MODE_V16SF: |