diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 44 |
2 files changed, 20 insertions, 30 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a3c1897..86617e0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-08-25 Petr Murzin <petr.murzin@intel.com> + + * config/i386/i386.md (SWI1248_AVX512BW): New mode iterator. + (*k<logic><mode>): Add *k<logic>qi and *k<logic>hi and use + SWI1248_AVX512BW mode iterator. + 2014-08-25 Kaz Kojima <kkojima@gcc.gnu.org> PR target/62111 diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 8e74eab..f56ad07 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -890,6 +890,10 @@ ;; All integer modes. (define_mode_iterator SWI1248x [QI HI SI DI]) +;; All integer modes with AVX512BW. +(define_mode_iterator SWI1248_AVX512BW + [QI HI (SI "TARGET_AVX512BW") (DI "TARGET_AVX512BW")] + ;; All integer modes without QImode. (define_mode_iterator SWI248x [HI SI DI]) @@ -7543,37 +7547,17 @@ (any_logic:SWI1248x (match_dup 1) (match_dup 2)))]) -;; TODO: It seems to be possible to macroize following -;; 3 patterns. -(define_insn "*k<logic>qi" - [(set (match_operand:QI 0 "mask_reg_operand" "=k") - (any_logic:QI (match_operand:QI 1 "mask_reg_operand" "k") - (match_operand:QI 2 "mask_reg_operand" "k")))] - "TARGET_AVX512F" -{ - return TARGET_AVX512DQ ? "k<logic>b\t{%2, %1, %0|%0, %1, %2}" - : "k<logic>w\t{%2, %1, %0|%0, %1, %2}"; -} - [(set_attr "mode" "QI") - (set_attr "type" "msklog") - (set_attr "prefix" "vex")]) - -(define_insn "*k<logic>hi" - [(set (match_operand:HI 0 "mask_reg_operand" "=k") - (any_logic:HI (match_operand:HI 1 "mask_reg_operand" "k") - (match_operand:HI 2 "mask_reg_operand" "k")))] - "TARGET_AVX512F" - "k<logic>w\t{%2, %1, %0|%0, %1, %2}"; - [(set_attr "mode" "HI") - (set_attr "type" "msklog") - (set_attr "prefix" "vex")]) - (define_insn "*k<logic><mode>" - [(set (match_operand:SWI48x 0 "mask_reg_operand" "=k") - (any_logic:SWI48x (match_operand:SWI48x 1 "mask_reg_operand" "k") - (match_operand:SWI48x 2 "mask_reg_operand" "k")))] - "TARGET_AVX512BW" - "k<logic><mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}"; + [(set (match_operand:SWI1248_AVX512BW 0 "mask_reg_operand" "=k") + (any_logic:SWI1248_AVX512BW (match_operand:SWI1248_AVX512BW 1 "mask_reg_operand" "k") + (match_operand:SWI1248_AVX512BW 2 "mask_reg_operand" "k")))] + "TARGET_AVX512F" + { + if (!TARGET_AVX512DQ && <MODE>mode == QImode) + return "k<logic>w\t{%2, %1, %0|%0, %1, %2}"; + else + return "k<logic><mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}"; + } [(set_attr "mode" "<MODE>") (set_attr "type" "msklog") (set_attr "prefix" "vex")]) |