https://gcc.gnu.org/g:40636facc4f89efc136859f9e72338cb7dba6ed4
commit 40636facc4f89efc136859f9e72338cb7dba6ed4 Author: Michael Meissner <meiss...@linux.ibm.com> Date: Wed Oct 16 03:27:19 2024 -0400 Initial support for adding xxeval fusion support. 2024-10-16 Michael Meissner <meiss...@linux.ibm.com> gcc/ * config/rs6000/fusion.md (fuse_vandc_xor_noxxeval): Rename from fuse_vandc_xor, and restrict the case to non-xxeval support. (fuse_vandc_vxor_xxeval): New insn. (fuse_vxor_vxor_noxxeval): Rename from fuse_vxor_xor, and restrict the case to non-xxeval support. (fuse_vxor_vxor_xxeval): New insn. * config/rs6000/rs6000.cc (rs6000_opt_vars): Add -mxxeval. * config/rs6000/rs6000.opt (-mxxeval): New switch. Diff: --- gcc/config/rs6000/fusion.md | 44 ++++++++++++++++++++++++++++++++++++++++---- gcc/config/rs6000/rs6000.cc | 3 +++ gcc/config/rs6000/rs6000.opt | 4 ++++ 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/gcc/config/rs6000/fusion.md b/gcc/config/rs6000/fusion.md index 4ed9ae1d69f4..5332c84681fa 100644 --- a/gcc/config/rs6000/fusion.md +++ b/gcc/config/rs6000/fusion.md @@ -2896,13 +2896,13 @@ ;; logical-logical fusion pattern generated by gen_logical_addsubf ;; vector vandc -> vxor -(define_insn "*fuse_vandc_vxor" +(define_insn "*fuse_vandc_vxor_noxxeval" [(set (match_operand:VM 3 "altivec_register_operand" "=&0,&1,&v,v") (xor:VM (and:VM (not:VM (match_operand:VM 0 "altivec_register_operand" "v,v,v,v")) (match_operand:VM 1 "altivec_register_operand" "v,v,v,v")) (match_operand:VM 2 "altivec_register_operand" "v,v,v,v"))) (clobber (match_scratch:VM 4 "=X,X,X,&v"))] - "(TARGET_P10_FUSION)" + "(TARGET_P10_FUSION && (!TARGET_XXEVAL || !TARGET_PREFIXED))" "@ vandc %3,%1,%0\;vxor %3,%3,%2 vandc %3,%1,%0\;vxor %3,%3,%2 @@ -2912,6 +2912,24 @@ (set_attr "cost" "6") (set_attr "length" "8")]) +(define_insn "*fuse_vandc_vxor_xxeval" + [(set (match_operand:VM 3 "vsx_register_operand" "=&0,&1,&v,v,wa") + (xor:VM (and:VM (not:VM (match_operand:VM 0 "vsx_register_operand" "v,v,v,v,wa")) + (match_operand:VM 1 "vsx_register_operand" "v,v,v,v,wa")) + (match_operand:VM 2 "vsx_register_operand" "v,v,v,v,wa"))) + (clobber (match_scratch:VM 4 "=X,X,X,&v,X"))] + "(TARGET_P10_FUSION && TARGET_XXEVAL && TARGET_PREFIXED)" + "@ + vandc %3,%1,%0\;vxor %3,%3,%2 + vandc %3,%1,%0\;vxor %3,%3,%2 + vandc %3,%1,%0\;vxor %3,%3,%2 + vandc %4,%1,%0\;vxor %3,%4,%2 + xxeval %w3,%w0,%w1,%w2,45\t\t# fuse xxlxor (%w0, xxlandc (%x1, %x2))" + [(set_attr "type" "fused_vector") + (set_attr "cost" "6") + (set_attr "length" "8") + (set_attr "prefixed" "*,*,*,*,yes")]) + ;; logical-logical fusion pattern generated by gen_logical_addsubf ;; vector veqv -> vxor (define_insn "*fuse_veqv_vxor" @@ -3004,13 +3022,13 @@ ;; logical-logical fusion pattern generated by gen_logical_addsubf ;; vector vxor -> vxor -(define_insn "*fuse_vxor_vxor" +(define_insn "*fuse_vxor_vxor_noxxeval" [(set (match_operand:VM 3 "altivec_register_operand" "=&0,&1,&v,v") (xor:VM (xor:VM (match_operand:VM 0 "altivec_register_operand" "v,v,v,v") (match_operand:VM 1 "altivec_register_operand" "%v,v,v,v")) (match_operand:VM 2 "altivec_register_operand" "v,v,v,v"))) (clobber (match_scratch:VM 4 "=X,X,X,&v"))] - "(TARGET_P10_FUSION)" + "(TARGET_P10_FUSION && (!TARGET_XXEVAL || !TARGET_PREFIXED))" "@ vxor %3,%1,%0\;vxor %3,%3,%2 vxor %3,%1,%0\;vxor %3,%3,%2 @@ -3020,6 +3038,24 @@ (set_attr "cost" "6") (set_attr "length" "8")]) +(define_insn "*fuse_vxor_vxor_xxeval" + [(set (match_operand:VM 3 "vsx_register_operand" "=&0,&1,&v,v,wa") + (xor:VM (xor:VM (match_operand:VM 0 "vsx_register_operand" "v,v,v,v,wa") + (match_operand:VM 1 "vsx_register_operand" "%v,v,v,v,wa")) + (match_operand:VM 2 "vsx_register_operand" "v,v,v,v,wa"))) + (clobber (match_scratch:VM 4 "=X,X,X,&v,X"))] + "(TARGET_P10_FUSION && TARGET_XXEVAL && TARGET_PREFIXED)" + "@ + vxor %3,%1,%0\;vxor %3,%3,%2 + vxor %3,%1,%0\;vxor %3,%3,%2 + vxor %3,%1,%0\;vxor %3,%3,%2 + vxor %4,%1,%0\;vxor %3,%4,%2 + xxeval %x3,%x0,%x1,%x2,105\t\t# fuse xxlxor (%x0, xxlxor (%x1,%x2))" + [(set_attr "type" "fused_vector") + (set_attr "cost" "6") + (set_attr "length" "8") + (set_attr "prefixed" "*,*,*,*,yes")]) + ;; add-add fusion pattern generated by gen_addadd (define_insn "*fuse_add_add" [(set (match_operand:GPR 3 "gpc_reg_operand" "=&0,&1,&r,r") diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index aa67e7256bb9..072556b7fd7a 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -24668,6 +24668,9 @@ static struct rs6000_opt_var const rs6000_opt_vars[] = { "speculate-indirect-jumps", offsetof (struct gcc_options, x_rs6000_speculate_indirect_jumps), offsetof (struct cl_target_option, x_rs6000_speculate_indirect_jumps), }, + { "xxeval", + offsetof (struct gcc_options, x_TARGET_XXEVAL), + offsetof (struct cl_target_option, x_TARGET_XXEVAL), }, }; /* Inner function to handle attribute((target("..."))) and #pragma GCC target diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt index 0d71dbaf2fc1..127befdcd56b 100644 --- a/gcc/config/rs6000/rs6000.opt +++ b/gcc/config/rs6000/rs6000.opt @@ -631,6 +631,10 @@ mieee128-constant Target Var(TARGET_IEEE128_CONSTANT) Init(1) Save Generate (do not generate) code that uses the LXVKQ instruction. +mxxeval +Target Var(TARGET_XXEVAL) Init(0) Save +Use xxeval for fusion + ; Documented parameters -param=rs6000-vect-unroll-limit=