https://gcc.gnu.org/g:ef2f57c1b666eacba9770b5db9ebdcde2d484cb9
commit ef2f57c1b666eacba9770b5db9ebdcde2d484cb9 Author: Michael Meissner <meiss...@linux.ibm.com> Date: Tue Oct 1 04:14:55 2024 -0400 Remove splitting vpair built-ins. 2024-10-01 Michael Meissner <meiss...@linux.ibm.com> gcc/ * config/rs6000/rs6000-protos.h (enum vpair_split_unary): Delete. (vpair_split_unary): Likewise. (vpair_split_binary): Likewise. (enum vpair_split_fma): Likewise. (vpair_split_fma): Likewise. * config/rs6000/rs6000.cc (vpair_split_unary): Likewise. (vpair_split_binary): Likewise. (vpair_split_fma): Likewise. * config/rs6000/vector-pair.md (vpair_spdp): New attribute. (vpair_insn): Likewise. (vpair_<vpair_stdname>_<vpair_modename>2): Convert from define_insn_and_split to define_insn. (vpair_nabs_<vpair_modename>2): Likewise. (vpair_<vpair_stdname>_<vpair_modename>3): Likewise. (vpair_fma_<vpair_modename>4): Likewise. (vpair_fms_<vpair_modename>4): Likewise. (vpair_nfma_<vpair_modename>4): Likewise. (vpair_nfms_<vpair_modename>4): Likewise. Diff: --- gcc/config/rs6000/rs6000-protos.h | 25 ------- gcc/config/rs6000/rs6000.cc | 138 -------------------------------------- gcc/config/rs6000/vector-pair.md | 95 +++++++++++--------------- 3 files changed, 38 insertions(+), 220 deletions(-) diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h index bab5fb437c27..da658cd5ab2e 100644 --- a/gcc/config/rs6000/rs6000-protos.h +++ b/gcc/config/rs6000/rs6000-protos.h @@ -161,31 +161,6 @@ extern bool rs6000_pcrel_p (void); extern bool rs6000_fndecl_pcrel_p (const_tree); extern void rs6000_output_addr_vec_elt (FILE *, int); -/* If we are splitting a vector pair unary operator into two separate vector - operations, we need to generate a NEG if this is NABS. */ - -enum vpair_split_unary { - VPAIR_SPLIT_NORMAL, /* No extra processing is needed. */ - VPAIR_SPLIT_NEGATE /* Wrap operation with a NEG. */ -}; - -extern void vpair_split_unary (rtx [], machine_mode, enum rtx_code, - enum vpair_split_unary); -extern void vpair_split_binary (rtx [], machine_mode, enum rtx_code); - -/* When we are splitting a vector pair FMA operation into two vector operations, we - may need to modify the code generated. This enumeration encodes the - different choices. */ - -enum vpair_split_fma { - VPAIR_SPLIT_FMA, /* Fused multiply-add. */ - VPAIR_SPLIT_FMS, /* Fused multiply-subtract. */ - VPAIR_SPLIT_NFMA, /* Fused negate multiply-add. */ - VPAIR_SPLIT_NFMS /* Fused negate multiply-subtract. */ -}; - -extern void vpair_split_fma (rtx [], machine_mode, enum vpair_split_fma); - /* Different PowerPC instruction formats that are used by GCC. There are various other instruction formats used by the PowerPC hardware, but these formats are not currently used by GCC. */ diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 2be11e542a06..8afa19fd38ac 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -29610,144 +29610,6 @@ rs6000_opaque_type_invalid_use_p (gimple *stmt) return false; } -/* Split vector pair unary operations. */ - -void -vpair_split_unary (rtx operands[], /* Dest, input. */ - machine_mode vmode, /* Vector mode. */ - enum rtx_code code, /* Operator code. */ - enum vpair_split_unary action) /* Action to take. */ -{ - rtx op0 = operands[0]; - machine_mode mode0 = GET_MODE (op0); - gcc_assert (GET_MODE_SIZE (mode0) == 32); - rtx op0_a = simplify_gen_subreg (vmode, op0, mode0, 0); - rtx op0_b = simplify_gen_subreg (vmode, op0, mode0, 16); - - rtx op1 = operands[1]; - machine_mode mode1 = GET_MODE (op1); - gcc_assert (GET_MODE_SIZE (mode0) == 32); - rtx op1_a = simplify_gen_subreg (vmode, op1, mode1, 0); - rtx op1_b = simplify_gen_subreg (vmode, op1, mode1, 16); - - rtx operation_a = gen_rtx_fmt_e (code, vmode, op1_a); - rtx operation_b = gen_rtx_fmt_e (code, vmode, op1_b); - - if (action == VPAIR_SPLIT_NEGATE) - { - operation_a = gen_rtx_NEG (vmode, operation_a); - operation_b = gen_rtx_NEG (vmode, operation_b); - } - - emit_insn (gen_rtx_SET (op0_a, operation_a)); - emit_insn (gen_rtx_SET (op0_b, operation_b)); - return; -} - -/* Split vector pair binary operations. */ - -void -vpair_split_binary (rtx operands[], /* Dest, 2 inputs. */ - machine_mode vmode, /* Vector mode. */ - enum rtx_code code) /* Operator code. */ -{ - rtx op0 = operands[0]; - machine_mode mode0 = GET_MODE (op0); - gcc_assert (GET_MODE_SIZE (mode0) == 32); - rtx op0_a = simplify_gen_subreg (vmode, op0, mode0, 0); - rtx op0_b = simplify_gen_subreg (vmode, op0, mode0, 16); - - rtx op1 = operands[1]; - machine_mode mode1 = GET_MODE (op1); - gcc_assert (GET_MODE_SIZE (mode1) == 32); - rtx op1_a = simplify_gen_subreg (vmode, op1, mode1, 0); - rtx op1_b = simplify_gen_subreg (vmode, op1, mode1, 16); - - rtx op2 = operands[2]; - machine_mode mode2 = GET_MODE (op2); - gcc_assert (GET_MODE_SIZE (mode2) == 32); - rtx op2_a = simplify_gen_subreg (vmode, op2, mode2, 0); - rtx op2_b = simplify_gen_subreg (vmode, op2, mode2, 16); - - rtx operation_a = gen_rtx_fmt_ee (code, vmode, op1_a, op2_a); - rtx operation_b = gen_rtx_fmt_ee (code, vmode, op1_b, op2_b); - - emit_insn (gen_rtx_SET (op0_a, operation_a)); - emit_insn (gen_rtx_SET (op0_b, operation_b)); - return; -} - -/* Split vector pair fma operations. */ - -void -vpair_split_fma (rtx operands[], /* Dest, 3 inputs. */ - machine_mode vmode, /* Vector mode. */ - enum vpair_split_fma action) /* Action to take. */ -{ - rtx op0 = operands[0]; - machine_mode mode0 = GET_MODE (op0); - gcc_assert (GET_MODE_SIZE (mode0) == 32); - rtx op0_a = simplify_gen_subreg (vmode, op0, mode0, 0); - rtx op0_b = simplify_gen_subreg (vmode, op0, mode0, 16); - - rtx op1 = operands[1]; - machine_mode mode1 = GET_MODE (op1); - gcc_assert (GET_MODE_SIZE (mode1) == 32); - rtx op1_a = simplify_gen_subreg (vmode, op1, mode1, 0); - rtx op1_b = simplify_gen_subreg (vmode, op1, mode1, 16); - - rtx op2 = operands[2]; - machine_mode mode2 = GET_MODE (op2); - gcc_assert (GET_MODE_SIZE (mode2) == 32); - rtx op2_a = simplify_gen_subreg (vmode, op2, mode2, 0); - rtx op2_b = simplify_gen_subreg (vmode, op2, mode2, 16); - - rtx op3 = operands[3]; - machine_mode mode3 = GET_MODE (op3); - gcc_assert (GET_MODE_SIZE (mode3) == 32); - rtx op3_a = simplify_gen_subreg (vmode, op3, mode3, 0); - rtx op3_b = simplify_gen_subreg (vmode, op3, mode3, 16); - - switch (action) - { - case VPAIR_SPLIT_FMA: - case VPAIR_SPLIT_NFMA: - break; - - case VPAIR_SPLIT_FMS: - case VPAIR_SPLIT_NFMS: - op3_a = gen_rtx_NEG (vmode, op3_a); - op3_b = gen_rtx_NEG (vmode, op3_b); - break; - - default: - gcc_unreachable (); - } - - rtx operation_a = gen_rtx_fmt_eee (FMA, vmode, op1_a, op2_a, op3_a); - rtx operation_b = gen_rtx_fmt_eee (FMA, vmode, op1_b, op2_b, op3_b); - - switch (action) - { - case VPAIR_SPLIT_FMA: - case VPAIR_SPLIT_FMS: - break; - - case VPAIR_SPLIT_NFMA: - case VPAIR_SPLIT_NFMS: - operation_a = gen_rtx_NEG (vmode, operation_a); - operation_b = gen_rtx_NEG (vmode, operation_b); - break; - - default: - gcc_unreachable (); - } - - emit_insn (gen_rtx_SET (op0_a, operation_a)); - emit_insn (gen_rtx_SET (op0_b, operation_b)); - return; -} - struct gcc_target targetm = TARGET_INITIALIZER; #include "gt-rs6000.h" diff --git a/gcc/config/rs6000/vector-pair.md b/gcc/config/rs6000/vector-pair.md index 01d32e460f6e..6d23be02ffd3 100644 --- a/gcc/config/rs6000/vector-pair.md +++ b/gcc/config/rs6000/vector-pair.md @@ -61,6 +61,10 @@ (define_int_attr vpair_modename [(VPAIR_ELEMENT_FLOAT "v8sf") (VPAIR_ELEMENT_DOUBLE "v4df")]) +;; Suffix for the appropriate vector instruction +(define_int_attr vpair_spdp [(VPAIR_ELEMENT_FLOAT "sp") + (VPAIR_ELEMENT_DOUBLE "dp")]) + ;; Unary/binary arithmetic iterator on vector pairs. (define_int_iterator VPAIR_FP_UNARY [UNSPEC_VPAIR_ABS UNSPEC_VPAIR_NEG @@ -85,6 +89,18 @@ (UNSPEC_VPAIR_SMIN "smin") (UNSPEC_VPAIR_SQRT "sqrt")]) +;; Map the vpair operator unspec number to the instruction +(define_int_attr vpair_insn [(UNSPEC_VPAIR_ABS "xvabs") + (UNSPEC_VPAIR_DIV "xvdiv") + (UNSPEC_VPAIR_FMA "xvmadd") + (UNSPEC_VPAIR_MINUS "xvsub") + (UNSPEC_VPAIR_MULT "xvmul") + (UNSPEC_VPAIR_NEG "xvneg") + (UNSPEC_VPAIR_PLUS "xvadd") + (UNSPEC_VPAIR_SMAX "xvmax") + (UNSPEC_VPAIR_SMIN "xvmin") + (UNSPEC_VPAIR_SQRT "xvsqrt")]) + ;; Map the vpair operator unspec number to the RTL operator. (define_int_attr VPAIR_OP [(UNSPEC_VPAIR_ABS "ABS") (UNSPEC_VPAIR_DIV "DIV") @@ -205,26 +221,19 @@ ;; Vector pair unary operations. The last argument in the UNSPEC is a ;; CONST_INT which identifies what the scalar element is. -(define_insn_and_split "vpair_<vpair_stdname>_<vpair_modename>2" +(define_insn "vpair_<vpair_stdname>_<vpair_modename>2" [(set (match_operand:OO 0 "vsx_register_operand" "=wa") (unspec:OO [(match_operand:OO 1 "vsx_register_operand" "wa") (const_int VPAIR_FP_ELEMENT)] VPAIR_FP_UNARY))] "TARGET_MMA" - "#" - "&& reload_completed" - [(const_int 0)] -{ - vpair_split_unary (operands, <VPAIR_VMODE>mode, <VPAIR_OP>, - VPAIR_SPLIT_NORMAL); - DONE; -} + "<vpair_insn><vpair_spdp> %x0,%x1\;<vpair_insn><vpair_spdp> %S0,%S1" [(set_attr "length" "8") (set_attr "type" "<vpair_type>")]) ;; Optimize vector pair (neg (abs)). -(define_insn_and_split "vpair_nabs_<vpair_modename>2" +(define_insn "vpair_nabs_<vpair_modename>2" [(set (match_operand:OO 0 "vsx_register_operand" "=wa") (unspec:OO [(unspec:OO @@ -234,19 +243,13 @@ (const_int VPAIR_FP_ELEMENT)] UNSPEC_VPAIR_NEG))] "TARGET_MMA" - "#" - "&& reload_completed" - [(const_int 0)] -{ - vpair_split_unary (operands, <VPAIR_VMODE>mode, ABS, VPAIR_SPLIT_NEGATE); - DONE; -} + "xvnabs<vpair_spdp> %x0,%x1\;xvnabs<vpair_spdp> %S0,%S1" [(set_attr "length" "8") (set_attr "type" "<vpair_type>")]) ;; Vector pair binary operations. The last argument in the UNSPEC is a ;; CONST_INT which identifies what the scalar element is. -(define_insn_and_split "vpair_<vpair_stdname>_<vpair_modename>3" +(define_insn "vpair_<vpair_stdname>_<vpair_modename>3" [(set (match_operand:OO 0 "vsx_register_operand" "=wa") (unspec:OO [(match_operand:OO 1 "vsx_register_operand" "wa") @@ -254,13 +257,7 @@ (const_int VPAIR_FP_ELEMENT)] VPAIR_FP_BINARY))] "TARGET_MMA" - "#" - "&& reload_completed" - [(const_int 0)] -{ - vpair_split_binary (operands, <VPAIR_VMODE>mode, <VPAIR_OP>); - DONE; -} + "<vpair_insn><vpair_spdp> %x0,%x1,%x2\;<vpair_insn><vpair_spdp> %S0,%S1,%S2" [(set_attr "length" "8") (set (attr "type") (if_then_else (match_test "<VPAIR_OP> == DIV") (const_string "<vpair_divtype>") @@ -293,7 +290,7 @@ ;; Vector pair fused-multiply (FMA) operations. The last argument in the ;; UNSPEC is a CONST_INT which identifies what the scalar element is. -(define_insn_and_split "vpair_fma_<vpair_modename>4" +(define_insn "vpair_fma_<vpair_modename>4" [(set (match_operand:OO 0 "vsx_register_operand" "=wa,wa") (unspec:OO [(match_operand:OO 1 "vsx_register_operand" "%wa,wa") @@ -302,18 +299,14 @@ (const_int VPAIR_FP_ELEMENT)] UNSPEC_VPAIR_FMA))] "TARGET_MMA" - "#" - "&& reload_completed" - [(const_int 0)] -{ - vpair_split_fma (operands, <VPAIR_VMODE>mode, VPAIR_SPLIT_FMA); - DONE; -} + "@ + xvmadda<vpair_spdp> %x0,%x1,%x2\;xvmadda<vpair_spdp> %S0,%S1,%S2 + xvmaddm<vpair_spdp> %x0,%x1,%x3\;xvmaddm<vpair_spdp> %S0,%S1,%S3" [(set_attr "length" "8") (set_attr "type" "<vpair_type>")]) ;; Vector pair fused multiply-subtract -(define_insn_and_split "vpair_fms_<vpair_modename>4" +(define_insn "vpair_fms_<vpair_modename>4" [(set (match_operand:OO 0 "vsx_register_operand" "=wa,wa") (unspec:OO [(match_operand:OO 1 "vsx_register_operand" "%wa,wa") @@ -325,18 +318,14 @@ (const_int VPAIR_FP_ELEMENT)] UNSPEC_VPAIR_FMA))] "TARGET_MMA" - "#" - "&& reload_completed" - [(const_int 0)] -{ - vpair_split_fma (operands, <VPAIR_VMODE>mode, VPAIR_SPLIT_FMS); - DONE; -} + "@ + xvmsuba<vpair_spdp> %x0,%x1,%x2\;xvmsuba<vpair_spdp> %S0,%S1,%S2 + xvmsubm<vpair_spdp> %x0,%x1,%x3\;xvmsubm<vpair_spdp> %S0,%S1,%S3" [(set_attr "length" "8") (set_attr "type" "<vpair_type>")]) ;; Vector pair negate fused multiply-add -(define_insn_and_split "vpair_nfma_<vpair_modename>4" +(define_insn "vpair_nfma_<vpair_modename>4" [(set (match_operand:OO 0 "vsx_register_operand" "=wa,wa") (unspec:OO [(unspec:OO @@ -348,18 +337,14 @@ (const_int VPAIR_FP_ELEMENT)] UNSPEC_VPAIR_NEG))] "TARGET_MMA" - "#" - "&& reload_completed" - [(const_int 0)] -{ - vpair_split_fma (operands, <VPAIR_VMODE>mode, VPAIR_SPLIT_NFMA); - DONE; -} + "@ + xvnmadda<vpair_spdp> %x0,%x1,%x2\;xvnmadda<vpair_spdp> %S0,%S1,%S2 + xvnmaddm<vpair_spdp> %x0,%x1,%x3\;xvnmaddm<vpair_spdp> %S0,%S1,%S3" [(set_attr "length" "8") (set_attr "type" "<vpair_type>")]) ;; Vector pair fused multiply-subtract -(define_insn_and_split "vpair_nfms_<vpair_modename>4" +(define_insn "vpair_nfms_<vpair_modename>4" [(set (match_operand:OO 0 "vsx_register_operand" "=wa,wa") (unspec:OO [(unspec:OO @@ -374,13 +359,9 @@ (const_int VPAIR_FP_ELEMENT)] UNSPEC_VPAIR_NEG))] "TARGET_MMA" - "#" - "&& reload_completed" - [(const_int 0)] -{ - vpair_split_fma (operands, <VPAIR_VMODE>mode, VPAIR_SPLIT_NFMS); - DONE; -} + "@ + xvnmsuba<vpair_spdp> %x0,%x1,%x2\;xvnmsuba<vpair_spdp> %S0,%S1,%S2 + xvnmsubm<vpair_spdp> %x0,%x1,%x3\;xvnmsubm<vpair_spdp> %S0,%S1,%S3" [(set_attr "length" "8") (set_attr "type" "<vpair_type>")])