Commit 46e89251 by Uros Bizjak

i386.md (*movqi_internal): Calculate mode attribute of alternatives 7,8,9…

i386.md (*movqi_internal): Calculate mode attribute of alternatives 7,8,9 depending on TARGET_AVX512DQ.

	* gcc.target/config/i386.md (*movqi_internal): Calculate mode
	attribute of alternatives 7,8,9 depending on TARGET_AVX512DQ.
	<TYPE_MSKMOV>: Emit kmovw for MODE_HI insn mode attribute.
	(*k<logic><mode>): Calculate mode attribute depending on
	TARGET_AVX512DQ.  Emit k<logic>w for MODE_HI insn mode attribute.
	(*andqi_1): Calculate mode attribute of alternative 3 depending
	on TARGET_AVX512DQ.  Emit kandw for MODE_HI insn mode attribute.
	(kandn<mode>): Calculate mode attribute of alternative 2 depending
	on TARGET_AVX512DQ.  Emit kandnw for MODE_HI insn mode attribute.
	(kxnor<mode>): Merge insn patterns using SWI1248_AVX512BW mode
	iterator.  Calculate mode attribute of alternative 1 depending
	on TARGET_AVX512DQ.  Emit kxnorw for MODE_HI insn mode attribute.
	(*one_cmplqi2_1): Calculate mode attribute of alternative 2 depending
	on TARGET_AVX512DQ.  Emit knotw for MODE_HI insn mode attribute.

From-SVN: r242791
parent 25cb6b33
2016-11-23 Uros Bizjak <ubizjak@gmail.com>
* gcc.target/config/i386.md (*movqi_internal): Calculate mode
attribute of alternatives 7,8,9 depending on TARGET_AVX512DQ.
<TYPE_MSKMOV>: Emit kmovw for MODE_HI insn mode attribute.
(*k<logic><mode>): Calculate mode attribute depending on
TARGET_AVX512DQ. Emit k<logic>w for MODE_HI insn mode attribute.
(*andqi_1): Calculate mode attribute of alternative 3 depending
on TARGET_AVX512DQ. Emit kandw for MODE_HI insn mode attribute.
(kandn<mode>): Calculate mode attribute of alternative 2 depending
on TARGET_AVX512DQ. Emit kandnw for MODE_HI insn mode attribute.
(kxnor<mode>): Merge insn patterns using SWI1248_AVX512BW mode
iterator. Calculate mode attribute of alternative 1 depending
on TARGET_AVX512DQ. Emit kxnorw for MODE_HI insn mode attribute.
(*one_cmplqi2_1): Calculate mode attribute of alternative 2 depending
on TARGET_AVX512DQ. Emit knotw for MODE_HI insn mode attribute.
2016-11-23 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> 2016-11-23 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
PR middle-end/78153 PR middle-end/78153
...@@ -159,8 +176,8 @@ ...@@ -159,8 +176,8 @@
(grid_call_permissible_in_distribute_p): Likewise. (grid_call_permissible_in_distribute_p): Likewise.
(grid_handle_call_in_distribute): Likewise. (grid_handle_call_in_distribute): Likewise.
(grid_dist_follows_tiling_pattern): Likewise. (grid_dist_follows_tiling_pattern): Likewise.
(grid_target_follows_gridifiable_pattern): Support standalone distribute (grid_target_follows_gridifiable_pattern): Support standalone
constructs. distribute constructs.
(grid_var_segment): New enum. (grid_var_segment): New enum.
(grid_mark_variable_segment): New function. (grid_mark_variable_segment): New function.
(grid_copy_leading_local_assignments): Call grid_mark_variable_segment (grid_copy_leading_local_assignments): Call grid_mark_variable_segment
...@@ -457,8 +474,7 @@ ...@@ -457,8 +474,7 @@
2016-11-23 Aldy Hernandez <aldyh@redhat.com> 2016-11-23 Aldy Hernandez <aldyh@redhat.com>
PR target/78213 PR target/78213
* opts.c (finish_options): Set -fsyntax-only if running self * opts.c (finish_options): Set -fsyntax-only if running self tests.
tests.
2016-11-23 Richard Biener <rguenther@suse.de> 2016-11-23 Richard Biener <rguenther@suse.de>
...@@ -537,13 +553,14 @@ ...@@ -537,13 +553,14 @@
ior and xor operators. ior and xor operators.
* config/aarch64/constraints.md (UsO constraint): New SImode constraint * config/aarch64/constraints.md (UsO constraint): New SImode constraint
for constants in "and" operantions. for constants in "and" operantions.
(UsP constraint): New DImode constraint for constants in "and" operations. (UsP constraint): New DImode constraint for constants
in "and" operations.
* config/aarch64/iterators.md (lconst2): New mode iterator. * config/aarch64/iterators.md (lconst2): New mode iterator.
(LOGICAL2): New code iterator. (LOGICAL2): New code iterator.
* config/aarch64/predicates.md (aarch64_logical_and_immediate): New * config/aarch64/predicates.md (aarch64_logical_and_immediate): New
predicate predicate.
(aarch64_logical_and_operand): New predicate allowing extended constants (aarch64_logical_and_operand): New predicate allowing extended
for "and" operations. constants for "and" operations.
2016-11-22 Walter Lee <walt@tilera.com> 2016-11-22 Walter Lee <walt@tilera.com>
...@@ -970,6 +970,11 @@ ...@@ -970,6 +970,11 @@
(define_mode_iterator SWI1248_AVX512BWDQ (define_mode_iterator SWI1248_AVX512BWDQ
[(QI "TARGET_AVX512DQ") HI (SI "TARGET_AVX512BW") (DI "TARGET_AVX512BW")]) [(QI "TARGET_AVX512DQ") HI (SI "TARGET_AVX512BW") (DI "TARGET_AVX512BW")])
;; All integer modes with AVX512BW, where HImode operation
;; can be used instead of QImode.
(define_mode_iterator SWI1248_AVX512BW
[QI HI (SI "TARGET_AVX512BW") (DI "TARGET_AVX512BW")])
;; All integer modes without QImode. ;; All integer modes without QImode.
(define_mode_iterator SWI248x [HI SI DI]) (define_mode_iterator SWI248x [HI SI DI])
...@@ -2170,9 +2175,9 @@ ...@@ -2170,9 +2175,9 @@
(define_insn "*movdi_internal" (define_insn "*movdi_internal"
[(set (match_operand:DI 0 "nonimmediate_operand" [(set (match_operand:DI 0 "nonimmediate_operand"
"=r ,o ,r,r ,r,m ,*y,*y,?*y,?m,?r ,?*Ym,*v,*v,*v,m ,m,?r ,?r,?*Yi,?*Ym,?*Yi,*k,*k ,*r ,*m") "=r ,o ,r,r ,r,m ,*y,*y,?*y,?m,?r ,?*Ym,*v,*v,*v,m ,m,?r ,?r,?*Yi,?*Ym,?*Yi,*k,*k ,*r,*m")
(match_operand:DI 1 "general_operand" (match_operand:DI 1 "general_operand"
"riFo,riF,Z,rem,i,re,C ,*y,m ,*y,*Yn,r ,C ,*v,m ,*v,v,*Yj,*v,r ,*Yj ,*Yn ,*r ,*km,*k,*k"))] "riFo,riF,Z,rem,i,re,C ,*y,m ,*y,*Yn,r ,C ,*v,m ,*v,v,*Yj,*v,r ,*Yj ,*Yn ,*r,*km,*k,*k"))]
"!(MEM_P (operands[0]) && MEM_P (operands[1]))" "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
{ {
switch (get_attr_type (insn)) switch (get_attr_type (insn))
...@@ -2489,17 +2494,16 @@ ...@@ -2489,17 +2494,16 @@
(unspec:HI (unspec:HI
[(match_operand:HI 1 "nonimmediate_operand" "r,km")] [(match_operand:HI 1 "nonimmediate_operand" "r,km")]
UNSPEC_KMOV))] UNSPEC_KMOV))]
"!(MEM_P (operands[0]) && MEM_P (operands[1])) && TARGET_AVX512F" "TARGET_AVX512F && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
"@ "@
kmovw\t{%k1, %0|%0, %k1} kmovw\t{%k1, %0|%0, %k1}
kmovw\t{%1, %0|%0, %1}"; kmovw\t{%1, %0|%0, %1}";
[(set_attr "mode" "HI") [(set_attr "type" "mskmov")
(set_attr "type" "mskmov") (set_attr "prefix" "vex")
(set_attr "prefix" "vex")]) (set_attr "mode" "HI")])
(define_insn "*movhi_internal" (define_insn "*movhi_internal"
[(set (match_operand:HI 0 "nonimmediate_operand" "=r,r ,r ,m ,k,k, r,m") [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r ,r ,m ,k,k ,r,m")
(match_operand:HI 1 "general_operand" "r ,rn,rm,rn,r,km,k,k"))] (match_operand:HI 1 "general_operand" "r ,rn,rm,rn,r,km,k,k"))]
"!(MEM_P (operands[0]) && MEM_P (operands[1]))" "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
{ {
...@@ -2513,11 +2517,15 @@ ...@@ -2513,11 +2517,15 @@
case TYPE_MSKMOV: case TYPE_MSKMOV:
switch (which_alternative) switch (which_alternative)
{ {
case 4: return "kmovw\t{%k1, %0|%0, %k1}"; case 4:
case 5: /* FALLTHRU */ return "kmovw\t{%k1, %0|%0, %k1}";
case 7: return "kmovw\t{%1, %0|%0, %1}"; case 6:
case 6: return "kmovw\t{%1, %k0|%k0, %1}"; return "kmovw\t{%1, %k0|%k0, %1}";
default: gcc_unreachable (); case 5:
case 7:
return "kmovw\t{%1, %0|%0, %1}";
default:
gcc_unreachable ();
} }
default: default:
...@@ -2574,11 +2582,15 @@ ...@@ -2574,11 +2582,15 @@
(define_insn "*movqi_internal" (define_insn "*movqi_internal"
[(set (match_operand:QI 0 "nonimmediate_operand" [(set (match_operand:QI 0 "nonimmediate_operand"
"=q,q ,q ,r,r ,?r,m ,k,k,r ,m,k") "=q,q ,q ,r,r ,?r,m ,k,k,r,m,k")
(match_operand:QI 1 "general_operand" (match_operand:QI 1 "general_operand"
"q ,qn,qm,q,rn,qm,qn,r ,k,k,k,m"))] "q ,qn,qm,q,rn,qm,qn,r,k,k,k,m"))]
"!(MEM_P (operands[0]) && MEM_P (operands[1]))" "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
{ {
static char buf[128];
const char *ops;
const char *suffix;
switch (get_attr_type (insn)) switch (get_attr_type (insn))
{ {
case TYPE_IMOVX: case TYPE_IMOVX:
...@@ -2588,19 +2600,28 @@ ...@@ -2588,19 +2600,28 @@
case TYPE_MSKMOV: case TYPE_MSKMOV:
switch (which_alternative) switch (which_alternative)
{ {
case 7: return TARGET_AVX512DQ ? "kmovb\t{%k1, %0|%0, %k1}" case 7:
: "kmovw\t{%k1, %0|%0, %k1}"; ops = "kmov%s\t{%%k1, %%0|%%0, %%k1}";
case 8: return TARGET_AVX512DQ ? "kmovb\t{%1, %0|%0, %1}" break;
: "kmovw\t{%1, %0|%0, %1}"; case 9:
case 9: return TARGET_AVX512DQ ? "kmovb\t{%1, %k0|%k0, %1}" ops = "kmov%s\t{%%1, %%k0|%%k0, %%1}";
: "kmovw\t{%1, %k0|%k0, %1}"; break;
case 10: case 10:
case 11: case 11:
gcc_assert (TARGET_AVX512DQ); gcc_assert (TARGET_AVX512DQ);
return "kmovb\t{%1, %0|%0, %1}"; /* FALLTHRU */
default: gcc_unreachable (); case 8:
ops = "kmov%s\t{%%1, %%0|%%0, %%1}";
break;
default:
gcc_unreachable ();
} }
suffix = (get_attr_mode (insn) == MODE_HI) ? "w" : "b";
snprintf (buf, sizeof (buf), ops, suffix);
return buf;
default: default:
if (get_attr_mode (insn) == MODE_SI) if (get_attr_mode (insn) == MODE_SI)
return "mov{l}\t{%k1, %k0|%k0, %k1}"; return "mov{l}\t{%k1, %k0|%k0, %k1}";
...@@ -2640,6 +2661,9 @@ ...@@ -2640,6 +2661,9 @@
(const_string "SI") (const_string "SI")
(eq_attr "alternative" "6") (eq_attr "alternative" "6")
(const_string "QI") (const_string "QI")
(and (eq_attr "alternative" "7,8,9")
(not (match_test "TARGET_AVX512DQ")))
(const_string "HI")
(eq_attr "type" "imovx") (eq_attr "type" "imovx")
(const_string "SI") (const_string "SI")
(and (eq_attr "type" "imov") (and (eq_attr "type" "imov")
...@@ -3822,7 +3846,7 @@ ...@@ -3822,7 +3846,7 @@
kmov<mskmodesuffix>\t{%1, %k0|%k0, %1}" kmov<mskmodesuffix>\t{%1, %k0|%k0, %1}"
[(set_attr "isa" "*,<kmov_isa>") [(set_attr "isa" "*,<kmov_isa>")
(set_attr "type" "imovx,mskmov") (set_attr "type" "imovx,mskmov")
(set_attr "mode" "SI")]) (set_attr "mode" "SI,<MODE>")])
(define_expand "zero_extend<mode>si2" (define_expand "zero_extend<mode>si2"
[(set (match_operand:SI 0 "register_operand") [(set (match_operand:SI 0 "register_operand")
...@@ -3923,8 +3947,8 @@ ...@@ -3923,8 +3947,8 @@
"@ "@
movz{bl|x}\t{%1, %k0|%k0, %1} movz{bl|x}\t{%1, %k0|%k0, %1}
kmovb\t{%1, %k0|%k0, %1}" kmovb\t{%1, %k0|%k0, %1}"
[(set_attr "type" "imovx,mskmov") [(set_attr "isa" "*,avx512dq")
(set_attr "isa" "*,avx512dq") (set_attr "type" "imovx,mskmov")
(set_attr "mode" "SI,QI")]) (set_attr "mode" "SI,QI")])
(define_insn_and_split "*zext<mode>_doubleword_and" (define_insn_and_split "*zext<mode>_doubleword_and"
...@@ -8055,23 +8079,26 @@ ...@@ -8055,23 +8079,26 @@
(any_logic:SWI1248x (match_dup 1) (any_logic:SWI1248x (match_dup 1)
(match_dup 2)))]) (match_dup 2)))])
(define_mode_iterator SWI1248_AVX512BW
[QI HI (SI "TARGET_AVX512BW") (DI "TARGET_AVX512BW")])
(define_insn "*k<logic><mode>" (define_insn "*k<logic><mode>"
[(set (match_operand:SWI1248_AVX512BW 0 "mask_reg_operand" "=k") [(set (match_operand:SWI1248_AVX512BW 0 "mask_reg_operand" "=k")
(any_logic:SWI1248_AVX512BW (match_operand:SWI1248_AVX512BW 1 "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")))] (match_operand:SWI1248_AVX512BW 2 "mask_reg_operand" "k")))]
"TARGET_AVX512F" "TARGET_AVX512F"
{ {
if (!TARGET_AVX512DQ && <MODE>mode == QImode) if (get_attr_mode (insn) == MODE_HI)
return "k<logic>w\t{%2, %1, %0|%0, %1, %2}"; return "k<logic>w\t{%2, %1, %0|%0, %1, %2}";
else else
return "k<logic><mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}"; return "k<logic><mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}";
} }
[(set_attr "mode" "<MODE>") [(set_attr "type" "msklog")
(set_attr "type" "msklog") (set_attr "prefix" "vex")
(set_attr "prefix" "vex")]) (set (attr "mode")
(cond [(and (match_test "<MODE>mode == QImode")
(not (match_test "TARGET_AVX512DQ")))
(const_string "HI")
]
(const_string "<MODE>")))])
;; %%% This used to optimize known byte-wide and operations to memory, ;; %%% This used to optimize known byte-wide and operations to memory,
;; and sometimes to QImode registers. If this is considered useful, ;; and sometimes to QImode registers. If this is considered useful,
...@@ -8278,14 +8305,22 @@ ...@@ -8278,14 +8305,22 @@
case 2: case 2:
return "and{l}\t{%k2, %k0|%k0, %k2}"; return "and{l}\t{%k2, %k0|%k0, %k2}";
case 3: case 3:
return TARGET_AVX512DQ ? "kandb\t{%2, %1, %0|%0, %1, %2}" if (get_attr_mode (insn) == MODE_HI)
: "kandw\t{%2, %1, %0|%0, %1, %2}"; return "kandw\t{%2, %1, %0|%0, %1, %2}";
else
return "kandb\t{%2, %1, %0|%0, %1, %2}";
default: default:
gcc_unreachable (); gcc_unreachable ();
} }
} }
[(set_attr "type" "alu,alu,alu,msklog") [(set_attr "type" "alu,alu,alu,msklog")
(set_attr "mode" "QI,QI,SI,HI") (set (attr "mode")
(cond [(eq_attr "alternative" "2")
(const_string "SI")
(and (eq_attr "alternative" "3")
(not (match_test "TARGET_AVX512DQ")))
(const_string "HI")]
(const_string "QI")))
;; Potential partial reg stall on alternative 2. ;; Potential partial reg stall on alternative 2.
(set (attr "preferred_for_speed") (set (attr "preferred_for_speed")
(cond [(eq_attr "alternative" "2") (cond [(eq_attr "alternative" "2")
...@@ -8319,10 +8354,10 @@ ...@@ -8319,10 +8354,10 @@
case 1: case 1:
return "#"; return "#";
case 2: case 2:
if (TARGET_AVX512DQ && <MODE>mode == QImode) if (get_attr_mode (insn) == MODE_HI)
return "kandnb\t{%2, %1, %0|%0, %1, %2}";
else
return "kandnw\t{%2, %1, %0|%0, %1, %2}"; return "kandnw\t{%2, %1, %0|%0, %1, %2}";
else
return "kandn<mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}";
default: default:
gcc_unreachable (); gcc_unreachable ();
} }
...@@ -8331,7 +8366,13 @@ ...@@ -8331,7 +8366,13 @@
(set_attr "type" "bitmanip,*,msklog") (set_attr "type" "bitmanip,*,msklog")
(set_attr "prefix" "*,*,vex") (set_attr "prefix" "*,*,vex")
(set_attr "btver2_decode" "direct,*,*") (set_attr "btver2_decode" "direct,*,*")
(set_attr "mode" "<MODE>")]) (set (attr "mode")
(cond [(and (eq_attr "alternative" "2")
(and (match_test "<MODE>mode == QImode")
(not (match_test "TARGET_AVX512DQ"))))
(const_string "HI")
]
(const_string "<MODE>")))])
(define_split (define_split
[(set (match_operand:SWI12 0 "general_reg_operand") [(set (match_operand:SWI12 0 "general_reg_operand")
...@@ -8843,36 +8884,31 @@ ...@@ -8843,36 +8884,31 @@
(set_attr "mode" "<MODE>")]) (set_attr "mode" "<MODE>")])
(define_insn "kxnor<mode>" (define_insn "kxnor<mode>"
[(set (match_operand:SWI12 0 "register_operand" "=r,!k") [(set (match_operand:SWI1248_AVX512BW 0 "register_operand" "=r,!k")
(not:SWI12 (not:SWI1248_AVX512BW
(xor:SWI12 (xor:SWI1248_AVX512BW
(match_operand:SWI12 1 "register_operand" "0,k") (match_operand:SWI1248_AVX512BW 1 "register_operand" "0,k")
(match_operand:SWI12 2 "register_operand" "r,k")))) (match_operand:SWI1248_AVX512BW 2 "register_operand" "r,k"))))
(clobber (reg:CC FLAGS_REG))] (clobber (reg:CC FLAGS_REG))]
"TARGET_AVX512F" "TARGET_AVX512F"
{ {
if (which_alternative == 1 && <MODE>mode == QImode && TARGET_AVX512DQ) if (which_alternative == 0)
return "kxnorb\t{%2, %1, %0|%0, %1, %2}"; return "#";
if (get_attr_mode (insn) == MODE_HI)
return "kxnorw\t{%2, %1, %0|%0, %1, %2}"; return "kxnorw\t{%2, %1, %0|%0, %1, %2}";
else
return "kxnor<mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}";
} }
[(set_attr "type" "*,msklog") [(set_attr "type" "*,msklog")
(set_attr "prefix" "*,vex") (set_attr "prefix" "*,vex")
(set_attr "mode" "<MODE>")]) (set (attr "mode")
(cond [(and (eq_attr "alternative" "1")
(define_insn "kxnor<mode>" (and (match_test "<MODE>mode == QImode")
[(set (match_operand:SWI48x 0 "register_operand" "=r,!k") (not (match_test "TARGET_AVX512DQ"))))
(not:SWI48x (const_string "HI")
(xor:SWI48x ]
(match_operand:SWI48x 1 "register_operand" "0,k") (const_string "<MODE>")))])
(match_operand:SWI48x 2 "register_operand" "r,k"))))
(clobber (reg:CC FLAGS_REG))]
"TARGET_AVX512BW"
"@
#
kxnor<mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
[(set_attr "type" "*,msklog")
(set_attr "prefix" "*,vex")
(set_attr "mode" "<MODE>")])
(define_split (define_split
[(set (match_operand:SWI1248x 0 "general_reg_operand") [(set (match_operand:SWI1248x 0 "general_reg_operand")
...@@ -9583,9 +9619,10 @@ ...@@ -9583,9 +9619,10 @@
case 1: case 1:
return "not{l}\t%k0"; return "not{l}\t%k0";
case 2: case 2:
if (TARGET_AVX512DQ) if (get_attr_mode (insn) == MODE_HI)
return "knotb\t{%1, %0|%0, %1}";
return "knotw\t{%1, %0|%0, %1}"; return "knotw\t{%1, %0|%0, %1}";
else
return "knotb\t{%1, %0|%0, %1}";
default: default:
gcc_unreachable (); gcc_unreachable ();
} }
...@@ -9593,7 +9630,13 @@ ...@@ -9593,7 +9630,13 @@
[(set_attr "isa" "*,*,avx512f") [(set_attr "isa" "*,*,avx512f")
(set_attr "type" "negnot,negnot,msklog") (set_attr "type" "negnot,negnot,msklog")
(set_attr "prefix" "*,*,vex") (set_attr "prefix" "*,*,vex")
(set_attr "mode" "QI,SI,QI") (set (attr "mode")
(cond [(eq_attr "alternative" "1")
(const_string "SI")
(and (eq_attr "alternative" "2")
(not (match_test "TARGET_AVX512DQ")))
(const_string "HI")]
(const_string "QI")))
;; Potential partial reg stall on alternative 1. ;; Potential partial reg stall on alternative 1.
(set (attr "preferred_for_speed") (set (attr "preferred_for_speed")
(cond [(eq_attr "alternative" "1") (cond [(eq_attr "alternative" "1")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment