From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1005) id BE05C3896C0E; Wed, 19 May 2021 14:19:01 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BE05C3896C0E Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Michael Meissner To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/meissner/heads/work053)] Revert patches. X-Act-Checkin: gcc X-Git-Author: Michael Meissner X-Git-Refname: refs/users/meissner/heads/work053 X-Git-Oldrev: bc616c574dfeee344965d5180cd8c02ba41d68cf X-Git-Newrev: ad044552c2c851234de386a2b1142fd5d99acd6b Message-Id: <20210519141901.BE05C3896C0E@sourceware.org> Date: Wed, 19 May 2021 14:19:01 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 May 2021 14:19:01 -0000 https://gcc.gnu.org/g:ad044552c2c851234de386a2b1142fd5d99acd6b commit ad044552c2c851234de386a2b1142fd5d99acd6b Author: Michael Meissner Date: Wed May 19 10:17:54 2021 -0400 Revert patches. gcc/ 2021-05-19 Michael Meissner Revert patch. * config/rs6000/constraint.md (eD): New constraint. * config/rs6000/predicates.md (easy_fp_constant): If the constant can be loaded with XXSPLTI32DX, it is easy. (xxsplti32dx_operand): New predicate. (easy_vector_constant): If the constant can be loaded with XXSPLTI32DX, it is easy. * config/rs6000/rs6000-protos.h (xxsplti32dx_constant_p): New declaration. * config/rs6000/rs6000.c (rs6000_option_override_internal): Add support for -mxxsplti32dx. (xxsplti32dx_constant_float_p): New helper function. (xxsplti32dx_constant_p): New function. (output_vec_const_move): If the operand can be loaded with XXSPLTI32DX, split it. (rs6000_opt_masks): Add -mxxsplti32dx. * config/rs6000/rs6000.md (movsf_hardfloat): Add support for constants loaded with XXSPLTI32DX. (mov_hardfloat32, FMOVE64 iterator): Add support for constants loaded with XXSPLTI32DX. (mov_hardfloat64, FMOVE64 iterator): Add support for constants loaded with XXSPLTI32DX. * config/rs6000/rs6000.opt (-mxxsplti32dx): New option. * config/rs6000/vsx.md (UNSPEC_XXSPLTI32DX_CONST): New unspec. (XXSPLTI32DX): New mode iterator. (xxsplti32dx_): New insn and splitter for XXSPLTI32DX. (xxsplti32dx__first): New insn. (xxsplti32dx__second): New insn. gcc/testsuite/ 2021-05-19 Michael Meissner Revert patch. * gcc.target/powerpc/vec-splat-constant-sf.c: Update insn count. * gcc.target/powerpc/vec-splat-constant-df.c: Update insn count. * gcc.target/powerpc/vec-splat-constant-v2df.c: Update insn count. gcc/ 2021-05-18 Michael Meissner Revert patch. * config/rs6000/constraints.md (eF): New constraint. * config/rs6000/predicates.md (easy_fp_constant): If we can load the scalar constant with XXSPLTIDP, the floating point constant is easy. (xxspltidp_operand): New predicate. (easy_vector_constant): If we can generate XXSPLTIDP, mark the vector constant as easy. * config/rs6000/rs6000-cpus.def (OTHER_POWER10_MASKS): Add -mxxspltidp support. (POWERPC_MASKS): Add -mxxspltidp support. * config/rs6000/rs6000-protos.h (xxspltidp_constant_p): New declaration. * config/rs6000/rs6000.c (rs6000_option_override_internal): Add -mxxspltidp support. (const_vector_element_all_same): New function. (xxspltidp_constant_p): New function. (output_vec_const_move): Add support for XXSPLTIDP. (rs6000_opt_masks): Add -mxxspltidp support. (rs6000_emit_xxspltidp_v2df): Change function to implement the XXSPLTIDP instruction. * config/rs6000/rs6000.md (movsf_hardfloat): Add XXSPLTIDP support. (mov_hardfloat32, FMOVE64 iterator): Add XXSPLTIDP support. (mov_hardfloat64, FMOVE64 iterator): Add XXSPLTIDP support. * config/rs6000/rs6000.opt (-mxxspltidp): New switch. * config/rs6000/vsx.md (UNSPEC_XXSPLTIDP): Rename UNSPEC_XXSPLTID to UNSPEC_XXSPLTIDP to match the instruction. (xxspltidp_v2df): Use 'use' for the expand arguments, instead of writing out an insn. (xxspltidp_v2df_inst): Delete. (XXSPLTIDP): New mode iterator. (xxspltidp__internal1): New define_insn_and_split. (xxspltidp__internal2): New define_insn. gcc/testsuite/ 2021-05-03 Michael Meissner Revert patch. * gcc.target/powerpc/vec-splat-constant-sf.c: New test. * gcc.target/powerpc/vec-splat-constant-df.c: New test. * gcc.target/powerpc/vec-splat-constant-v2df.c: New test. Diff: --- gcc/config/rs6000/constraints.md | 11 - gcc/config/rs6000/predicates.md | 39 ---- gcc/config/rs6000/rs6000-cpus.def | 2 - gcc/config/rs6000/rs6000-protos.h | 3 - gcc/config/rs6000/rs6000.c | 233 +-------------------- gcc/config/rs6000/rs6000.md | 81 ++----- gcc/config/rs6000/rs6000.opt | 8 - gcc/config/rs6000/vsx.md | 124 ++--------- .../gcc.target/powerpc/vec-splat-constant-df.c | 63 ------ .../gcc.target/powerpc/vec-splat-constant-sf.c | 63 ------ .../gcc.target/powerpc/vec-splat-constant-v2df.c | 66 ------ 11 files changed, 38 insertions(+), 655 deletions(-) diff --git a/gcc/config/rs6000/constraints.md b/gcc/config/rs6000/constraints.md index d665e2a94db..561ce9797af 100644 --- a/gcc/config/rs6000/constraints.md +++ b/gcc/config/rs6000/constraints.md @@ -208,17 +208,6 @@ (and (match_code "const_int") (match_test "((- (unsigned HOST_WIDE_INT) ival) + 0x8000) < 0x10000"))) -;; SF/DF/V2DF/DI/V2DI scalar or vector constant that can be loaded with a pair -;; of XXSPLTI32DX instructions. -(define_constraint "eD" - "A vector constant that can be loaded with XXSPLTI32DX instructions." - (match_operand 0 "xxsplti32dx_operand")) - -;; SF/DF/V2DF scalar or vector constant that can be loaded with XXSPLTIDP -(define_constraint "eF" - "A vector constant that can be loaded with the XXSPLTIDP instruction." - (match_operand 0 "xxspltidp_operand")) - ;; 34-bit signed integer constant (define_constraint "eI" "A signed 34-bit integer constant if prefixed instructions are supported." diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md index fc30b69018d..bf678f429af 100644 --- a/gcc/config/rs6000/predicates.md +++ b/gcc/config/rs6000/predicates.md @@ -601,16 +601,6 @@ if (TARGET_VSX && op == CONST0_RTX (mode)) return 1; - /* If we have the ISA 3.1 XXSPLTIDP instruction, see if the constant can - be loaded with that instruction. */ - if (xxspltidp_operand (op, mode)) - return 1; - - /* If we have the ISA 3.1 XXSPLTI32DX instruction, see if the constant can - be loaded with a pair of those instructions. */ - if (xxsplti32dx_operand (op, mode)) - return 1; - /* Otherwise consider floating point constants hard, so that the constant gets pushed to memory during the early RTL phases. This has the advantage that double precision constants that can be @@ -676,29 +666,6 @@ return true; }) -;; Return 1 if operand is a SF/DF CONST_DOUBLE or V2DF CONST_VECTOR that can be -;; loaded via the ISA 3.1 XXSPLTIDP instruction. Do not return true if the -;; value is 0.0, since that is easy to generate without using XXSPLTIDP. -(define_predicate "xxspltidp_operand" - (match_code "const_double,const_vector,vec_duplicate") -{ - if (op == CONST0_RTX (mode)) - return false; - - HOST_WIDE_INT value = 0; - return xxspltidp_constant_p (op, mode, &value); -}) - -;; Return 1 if operand is a SF/DF CONST_DOUBLE or V2DF CONST_VECTOR that can be -;; loaded via a pair f ISA 3.1 XXSPLTI32DX instructions. Do not return true if -;; the value can be loaded with the XXSPLTIDP instruction or XXSPLTIB to load 0. -(define_predicate "xxsplti32dx_operand" - (match_code "const_double,const_vector,vec_duplicate") -{ - HOST_WIDE_INT high = 0, low = 0; - return xxsplti32dx_constant_p (op, mode, &high, &low); -}) - ;; Return 1 if the operand is a CONST_VECTOR and can be loaded into a ;; vector register without using memory. (define_predicate "easy_vector_constant" @@ -715,12 +682,6 @@ if (xxspltiw_operand (op, mode)) return true; - if (xxspltidp_operand (op, mode)) - return true; - - if (xxsplti32dx_operand (op, mode)) - return true; - if (TARGET_P9_VECTOR && xxspltib_constant_p (op, mode, &num_insns, &value)) return true; diff --git a/gcc/config/rs6000/rs6000-cpus.def b/gcc/config/rs6000/rs6000-cpus.def index 3b657e490b1..a21a95bc7aa 100644 --- a/gcc/config/rs6000/rs6000-cpus.def +++ b/gcc/config/rs6000/rs6000-cpus.def @@ -86,7 +86,6 @@ | OPTION_MASK_P10_FUSION \ | OPTION_MASK_P10_FUSION_LD_CMPI \ | OPTION_MASK_P10_FUSION_2LOGICAL \ - | OPTION_MASK_XXSPLTIDP \ | OPTION_MASK_XXSPLTIW) /* Flags that need to be turned off if -mno-power9-vector. */ @@ -163,7 +162,6 @@ | OPTION_MASK_SOFT_FLOAT \ | OPTION_MASK_STRICT_ALIGN_OPTIONAL \ | OPTION_MASK_VSX \ - | OPTION_MASK_XXSPLTIDP \ | OPTION_MASK_XXSPLTIW) #endif diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h index ce1a2fd1473..c407034d58c 100644 --- a/gcc/config/rs6000/rs6000-protos.h +++ b/gcc/config/rs6000/rs6000-protos.h @@ -32,9 +32,6 @@ extern void init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, int, int, int, extern bool easy_altivec_constant (rtx, machine_mode); extern bool xxspltib_constant_p (rtx, machine_mode, int *, int *); -extern bool xxspltidp_constant_p (rtx, machine_mode, HOST_WIDE_INT *); -extern bool xxsplti32dx_constant_p (rtx, machine_mode, HOST_WIDE_INT *, - HOST_WIDE_INT *); extern int vspltis_shifted (rtx); extern HOST_WIDE_INT const_vector_elt_as_int (rtx, unsigned int); extern bool macho_lo_sum_memory_operand (rtx, machine_mode); diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 7aca290918e..f0984e9fec5 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -4487,21 +4487,11 @@ rs6000_option_override_internal (bool global_init_p) if (!TARGET_PCREL && TARGET_PCREL_OPT) rs6000_isa_flags &= ~OPTION_MASK_PCREL_OPT; - if (TARGET_POWER10 && TARGET_VSX) - { - if ((rs6000_isa_flags_explicit & OPTION_MASK_XXSPLTI32DX) == 0) - rs6000_isa_flags |= OPTION_MASK_XXSPLTI32DX; - - if ((rs6000_isa_flags_explicit & OPTION_MASK_XXSPLTIW) == 0) - rs6000_isa_flags |= OPTION_MASK_XXSPLTIW; - - if ((rs6000_isa_flags_explicit & OPTION_MASK_XXSPLTIDP) == 0) - rs6000_isa_flags |= OPTION_MASK_XXSPLTIDP; - } - else - rs6000_isa_flags &= ~(OPTION_MASK_XXSPLTIW - | OPTION_MASK_XXSPLTIDP - | OPTION_MASK_XXSPLTI32DX); + if (TARGET_POWER10 && TARGET_VSX + && (rs6000_isa_flags_explicit & OPTION_MASK_XXSPLTIW) == 0) + rs6000_isa_flags |= OPTION_MASK_XXSPLTIW; + else if (!TARGET_POWER10 || !TARGET_VSX) + rs6000_isa_flags &= ~OPTION_MASK_XXSPLTIW; if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET) rs6000_print_isa_options (stderr, 0, "after subtarget", rs6000_isa_flags); @@ -6501,209 +6491,6 @@ xxspltib_constant_p (rtx op, return true; } -/* Return the element of a constant vector whose elements are all the same. In - addition if VEC_DUPLICATE is used, return the element being duplicated. If - neither is true, return NULL_RTX. */ - -static rtx -const_vector_element_all_same (rtx op) -{ - if (GET_CODE (op) == VEC_DUPLICATE) - { - rtx element = XEXP (op, 0); - return (CONST_INT_P (element) || CONST_DOUBLE_P (element) - ? element - : NULL_RTX); - } - - else if (GET_CODE (op) == CONST_VECTOR) - { - machine_mode mode = GET_MODE (op); - size_t n_elts = GET_MODE_NUNITS (mode); - rtx element = CONST_VECTOR_ELT (op, 0); - - for (size_t i = 1; i < n_elts; i++) - if (!rtx_equal_p (element, CONST_VECTOR_ELT (op, 1))) - return NULL_RTX; - - return element; - } - - return NULL_RTX; -} - -/* Return true if OP is of the given MODE and can be synthesized with ISA 3.1 - XXSPLTIDP instruction. - - Return the constant that is being split via CONSTANT_PTR to use in the - XXSPLTIDP instruction. */ - -bool -xxspltidp_constant_p (rtx op, - machine_mode mode, - HOST_WIDE_INT *constant_ptr) -{ - *constant_ptr = 0; - - if (!TARGET_XXSPLTIDP) - return false; - - if (mode == VOIDmode) - mode = GET_MODE (op); - - rtx element = op; - if (mode == V2DFmode) - { - element = const_vector_element_all_same (op); - if (!element) - return false; - - mode = DFmode; - } - - if (mode != SFmode && mode != DFmode) - return false; - - if (GET_MODE (element) != mode) - return false; - - if (!CONST_DOUBLE_P (element)) - return false; - - /* Don't return true for 0.0 since that is easy to create without - XXSPLTIDP. */ - if (element == CONST0_RTX (mode)) - return false; - - /* If the value doesn't fit in a SFmode, exactly, we can't use XXSPLTIDP. */ - const struct real_value *rv = CONST_DOUBLE_REAL_VALUE (element); - if (!exact_real_truncate (SFmode, rv)) - return 0; - - long value; - REAL_VALUE_TO_TARGET_SINGLE (*rv, value); - - /* Test for SFmode denormal (exponent is 0, mantissa field is non-zero). */ - if (((value & 0x7F800000) == 0) && ((value & 0x7FFFFF) != 0)) - return false; - - *constant_ptr = value; - return true; -} - -/* Return true if OP is a floating point constant that can be loaded with the - XXSPLTI32DX instruction. If the constant can be loaded with the simpler - XXSPLTIDP (constants that can fit as SFmode constants) or XXSPLTIB (0.0) - instructions, return false. - - Return the two 32-bit constants to use in the two XXSPLTI32DX instructions - via HIGH_PTR and LOW_PTR. */ - -static bool -xxsplti32dx_constant_float_p (rtx op, - machine_mode mode, - HOST_WIDE_INT *high_ptr, - HOST_WIDE_INT *low_ptr) -{ - HOST_WIDE_INT xxspltidp_value = 0; - - if (!CONST_DOUBLE_P (op)) - return false; - - if (mode != SFmode && mode != DFmode) - return false; - - if (op == CONST0_RTX (mode)) - return false; - - if (xxspltidp_constant_p (op, mode, &xxspltidp_value)) - return false; - - long high_low[2]; - const struct real_value *rv = CONST_DOUBLE_REAL_VALUE (op); - REAL_VALUE_TO_TARGET_DOUBLE (*rv, high_low); - - /* The double precision value is laid out in memory order. We need to undo - this for XXSPLTI32DX. */ - if (!BYTES_BIG_ENDIAN) - std::swap (high_low[0], high_low[1]); - - *high_ptr = high_low[0]; - *low_ptr = high_low[1]; - return true; -} - -/* Return true if OP is of the given MODE and can be synthesized with ISA 3.1 - XXSPLTI32DX instruction. If the instruction can be synthesized with - XXSPLTIDP or is 0/-1, return false. - - We handle the following types of constants: - - 1) vector double constants where each element is the same and you can't - load the constant with XXSPLTIDP; - - 2) vector long long constants where each element is the same; - - 3) Scalar floating point constants that can't be loaded with XXSPLTIDP. - - Return the two 32-bit constants to use in the two XXSPLTI32DX instructions - via HIGH_PTR and LOW_PTR. */ - -bool -xxsplti32dx_constant_p (rtx op, - machine_mode mode, - HOST_WIDE_INT *high_ptr, - HOST_WIDE_INT *low_ptr) -{ - *high_ptr = *low_ptr = 0; - - if (!TARGET_XXSPLTI32DX) - return false; - - if (mode == VOIDmode) - mode = GET_MODE (op); - - if (op == CONST0_RTX (mode)) - return false; - - switch (mode) - { - default: - break; - - case E_V2DFmode: - { - rtx ele = const_vector_element_all_same (op); - if (!ele) - return false; - - return xxsplti32dx_constant_float_p (ele, DFmode, high_ptr, low_ptr); - } - - case E_SFmode: - case E_DFmode: - return xxsplti32dx_constant_float_p (op, mode, high_ptr, low_ptr); - - case E_V2DImode: - { - rtx ele = const_vector_element_all_same (op); - if (!ele) - return false; - - /* If we can generate XXSPLTIB and VEXTSB2D, don't return true. */ - HOST_WIDE_INT value = INTVAL (ele); - if (IN_RANGE (value, -128, 127)) - return false; - - *high_ptr = value >> 32; - *low_ptr = value & 0xffffffff; - return true; - } - } - - return false; -} - const char * output_vec_const_move (rtx *operands) { @@ -6748,11 +6535,7 @@ output_vec_const_move (rtx *operands) gcc_unreachable (); } - if (xxspltiw_operand (vec, mode) - || xxspltidp_operand (vec, mode)) - return "#"; - - if (xxsplti32dx_operand (vec, mode)) + if (xxspltiw_operand (vec, mode)) return "#"; if (TARGET_P9_VECTOR @@ -24346,9 +24129,7 @@ static struct rs6000_opt_mask const rs6000_opt_masks[] = { "string", 0, false, true }, { "update", OPTION_MASK_NO_UPDATE, true , true }, { "vsx", OPTION_MASK_VSX, false, true }, - { "xxsplti32dx", OPTION_MASK_XXSPLTI32DX, false, true }, { "xxspltiw", OPTION_MASK_XXSPLTIW, false, true }, - { "xxspltidp", OPTION_MASK_XXSPLTIDP, false, true }, #ifdef OPTION_MASK_64BIT #if TARGET_AIX_OS { "aix64", OPTION_MASK_64BIT, false, false }, @@ -28188,7 +27969,7 @@ rs6000_emit_xxspltidp_v2df (rtx dst, long value) inform (input_location, "the result for the xxspltidp instruction " "is undefined for subnormal input values"); - emit_insn (gen_xxspltidp_v2df_internal2 (dst, GEN_INT (value))); + emit_insn( gen_xxspltidp_v2df_inst (dst, GEN_INT (value))); } /* Implement TARGET_ASM_GENERATE_PIC_ADDR_DIFF_VEC. */ diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 1200c4db6a9..0c76338c734 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -7614,17 +7614,17 @@ ;; ;; LWZ LFS LXSSP LXSSPX STFS STXSSP ;; STXSSPX STW XXLXOR LI FMR XSCPSGNDP -;; MR MT MF NOP XXSPLTIDP XXSPLTI32DX +;; MR MT MF NOP (define_insn "movsf_hardfloat" [(set (match_operand:SF 0 "nonimmediate_operand" "=!r, f, v, wa, m, wY, Z, m, wa, !r, f, wa, - !r, *c*l, !r, *h, wa, wa") + !r, *c*l, !r, *h") (match_operand:SF 1 "input_operand" "m, m, wY, Z, f, v, wa, r, j, j, f, wa, - r, r, *h, 0, eF, eD"))] + r, r, *h, 0"))] "(register_operand (operands[0], SFmode) || register_operand (operands[1], SFmode)) && TARGET_HARD_FLOAT @@ -7646,29 +7646,15 @@ mr %0,%1 mt%0 %1 mf%1 %0 - nop - # - #" + nop" [(set_attr "type" "load, fpload, fpload, fpload, fpstore, fpstore, fpstore, store, veclogical, integer, fpsimple, fpsimple, - *, mtjmpr, mfjmpr, *, vecperm, vecperm") + *, mtjmpr, mfjmpr, *") (set_attr "isa" "*, *, p9v, p8v, *, p9v, p8v, *, *, *, *, *, - *, *, *, *, p10, p10") - (set_attr "prefixed" - "*, *, *, *, *, *, - *, *, *, *, *, *, - *, *, *, *, yes, yes") - (set_attr "max_prefixed_insns" - "*, *, *, *, *, *, - *, *, *, *, *, *, - *, *, *, *, *, 2") - (set_attr "num_insns" - "*, *, *, *, *, *, - *, *, *, *, *, *, - *, *, *, *, *, 2")]) + *, *, *, *")]) ;; LWZ LFIWZX STW STFIWX MTVSRWZ MFVSRWZ ;; FMR MR MT%0 MF%1 NOP @@ -7928,18 +7914,18 @@ ;; STFD LFD FMR LXSD STXSD ;; LXSD STXSD XXLOR XXLXOR GPR<-0 -;; LWZ STW MR XXSPLTIDP XXSPLTI32DX +;; LWZ STW MR (define_insn "*mov_hardfloat32" [(set (match_operand:FMOVE64 0 "nonimmediate_operand" "=m, d, d, , wY, , Z, , , !r, - Y, r, !r, wa, wa") + Y, r, !r") (match_operand:FMOVE64 1 "input_operand" "d, m, d, wY, , Z, , , , , - r, Y, r, eF, eD"))] + r, Y, r"))] "! TARGET_POWERPC64 && TARGET_HARD_FLOAT && (gpc_reg_operand (operands[0], mode) || gpc_reg_operand (operands[1], mode))" @@ -7956,34 +7942,20 @@ # # # - # - # #" [(set_attr "type" "fpstore, fpload, fpsimple, fpload, fpstore, fpload, fpstore, veclogical, veclogical, two, - store, load, two, vecperm, vecperm") + store, load, two") (set_attr "size" "64") (set_attr "length" "*, *, *, *, *, *, *, *, *, 8, - 8, 8, 8, *, *") + 8, 8, 8") (set_attr "isa" "*, *, *, p9v, p9v, p7v, p7v, *, *, *, - *, *, *, p10, p10") - (set_attr "prefixed" - "*, *, *, *, *, - *, *, *, *, *, - *, *, *, yes, yes") - (set_attr "max_prefixed_insns" - "*, *, *, *, *, - *, *, *, *, *, - *, *, *, *, 2") - (set_attr "num_insns" - "*, *, *, *, *, - *, *, *, *, *, - *, *, *, *, 2")]) + *, *, *")]) ;; STW LWZ MR G-const H-const F-const @@ -8010,19 +7982,19 @@ ;; STFD LFD FMR LXSD STXSD ;; LXSDX STXSDX XXLOR XXLXOR LI 0 ;; STD LD MR MT{CTR,LR} MF{CTR,LR} -;; NOP MFVSRD MTVSRD XXSPLTIDP XXSPLTI32DX +;; NOP MFVSRD MTVSRD (define_insn "*mov_hardfloat64" [(set (match_operand:FMOVE64 0 "nonimmediate_operand" "=m, d, d, , wY, , Z, , , !r, YZ, r, !r, *c*l, !r, - *h, r, , wa, wa") + *h, r, ") (match_operand:FMOVE64 1 "input_operand" "d, m, d, wY, , Z, , , , , r, YZ, r, r, *h, - 0, , r, eF, eD"))] + 0, , r"))] "TARGET_POWERPC64 && TARGET_HARD_FLOAT && (gpc_reg_operand (operands[0], mode) || gpc_reg_operand (operands[1], mode))" @@ -8044,35 +8016,18 @@ mf%1 %0 nop mfvsrd %0,%x1 - mtvsrd %x0,%1 - # - #" + mtvsrd %x0,%1" [(set_attr "type" "fpstore, fpload, fpsimple, fpload, fpstore, fpload, fpstore, veclogical, veclogical, integer, store, load, *, mtjmpr, mfjmpr, - *, mfvsr, mtvsr, vecperm, vecperm") + *, mfvsr, mtvsr") (set_attr "size" "64") (set_attr "isa" "*, *, *, p9v, p9v, p7v, p7v, *, *, *, *, *, *, *, *, - *, p8v, p8v, p10, p10") - (set_attr "prefixed" - "*, *, *, *, *, - *, *, *, *, *, - *, *, *, *, *, - *, *, *, yes, yes") - (set_attr "max_prefixed_insns" - "*, *, *, *, *, - *, *, *, *, *, - *, *, *, *, *, - *, *, *, *, 2") - (set_attr "num_insns" - "*, *, *, *, *, - *, *, *, *, *, - *, *, *, *, *, - *, *, *, *, *")]) + *, p8v, p8v")]) ;; STD LD MR MT MF G-const ;; H-const F-const Special diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt index 352d4a72ae4..5e282d3741c 100644 --- a/gcc/config/rs6000/rs6000.opt +++ b/gcc/config/rs6000/rs6000.opt @@ -631,11 +631,3 @@ Generate code that will run in privileged state. mxxspltiw Target Undocumented Mask(XXSPLTIW) Var(rs6000_isa_flags) Generate (do not generate) XXSPLTIW instructions. - -mxxspltidp -Target Undocumented Mask(XXSPLTIDP) Var(rs6000_isa_flags) -Generate (do not generate) XXSPLTIDP instructions. - -mxxsplti32dx -Target Undocumented Mask(XXSPLTI32DX) Var(rs6000_isa_flags) -Generate (do not generate) XXSPLTI32DX instructions. diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md index 5ef2203c4b8..c850864c7ad 100644 --- a/gcc/config/rs6000/vsx.md +++ b/gcc/config/rs6000/vsx.md @@ -386,9 +386,8 @@ UNSPEC_VDIVES UNSPEC_VDIVEU UNSPEC_XXEVAL - UNSPEC_XXSPLTIDP + UNSPEC_XXSPLTID UNSPEC_XXSPLTI32DX - UNSPEC_XXSPLTI32DX_CONST UNSPEC_XXBLEND UNSPEC_XXPERMX ]) @@ -6241,8 +6240,9 @@ ;; XXSPLTIDP built-in function support (define_expand "xxspltidp_v2df" - [(use (match_operand:V2DF 0 "register_operand" )) - (use (match_operand:SF 1 "const_double_operand"))] + [(set (match_operand:V2DF 0 "register_operand" ) + (unspec:V2DF [(match_operand:SF 1 "const_double_operand")] + UNSPEC_XXSPLTID))] "TARGET_POWER10" { long value = rs6000_const_f32_to_i32 (operands[1]); @@ -6250,6 +6250,15 @@ DONE; }) +(define_insn "xxspltidp_v2df_inst" + [(set (match_operand:V2DF 0 "register_operand" "=wa") + (unspec:V2DF [(match_operand:SI 1 "c32bit_cint_operand" "n")] + UNSPEC_XXSPLTID))] + "TARGET_POWER10" + "xxspltidp %x0,%1" + [(set_attr "type" "vecsimple") + (set_attr "prefixed" "yes")]) + ;; XXSPLTI32DX built-in function support (define_expand "xxsplti32dx_v4si" [(set (match_operand:V4SI 0 "register_operand" "=wa") @@ -6475,110 +6484,3 @@ { operands[2] = CONST_VECTOR_ELT (operands[1], 0); }) - -;; Generate the XXSPLTIDP instruction to support SFmode and DFmode scalar -;; constants and V2DF vector constants where both elements are the same. The -;; constant has be expressible as a SFmode constant that is not a SFmode -;; denormal value. -(define_mode_iterator XXSPLTIDP [SF DF V2DF]) - -(define_insn_and_split "*xxspltidp__internal1" - [(set (match_operand:XXSPLTIDP 0 "vsx_register_operand" "=wa") - (match_operand:XXSPLTIDP 1 "xxspltidp_operand"))] - "TARGET_XXSPLTIDP" - "#" - "&& 1" - [(set (match_operand:XXSPLTIDP 0 "vsx_register_operand") - (unspec:XXSPLTIDP [(match_dup 2)] UNSPEC_XXSPLTIDP))] -{ - HOST_WIDE_INT value = 0; - - if (!xxspltidp_constant_p (operands[1], mode, &value)) - gcc_unreachable (); - - operands[2] = GEN_INT (value); -} - [(set_attr "type" "vecperm") - (set_attr "prefixed" "yes")]) - -;; Just in case the user issued -mno-xxspltidp, allow the built-in function -;; even if the compiler does not automatically generate XXSPLTIDP. -(define_insn "xxspltidp__internal2" - [(set (match_operand:XXSPLTIDP 0 "vsx_register_operand" "=wa") - (unspec:XXSPLTIDP [(match_operand 1 "const_int_operand" "n")] - UNSPEC_XXSPLTIDP))] - "TARGET_POWER10" - "xxspltidp %x0,%1" - [(set_attr "type" "vecperm") - (set_attr "prefixed" "yes")]) - -;; XXSPLTI32DX used to create 64-bit constants or vector constants where the -;; even elements match and the odd elements match. -(define_mode_iterator XXSPLTI32DX [SF DF V2DF V2DI]) - -(define_insn_and_split "*xxsplti32dx_" - [(set (match_operand:XXSPLTI32DX 0 "vsx_register_operand" "=wa") - (match_operand:XXSPLTI32DX 1 "xxsplti32dx_operand"))] - "TARGET_XXSPLTI32DX" - "#" - "&& 1" - [(set (match_dup 0) - (unspec:XXSPLTI32DX [(match_dup 2) - (match_dup 3)] UNSPEC_XXSPLTI32DX_CONST)) - (set (match_dup 0) - (unspec:XXSPLTI32DX [(match_dup 0) - (match_dup 4) - (match_dup 5)] UNSPEC_XXSPLTI32DX_CONST))] -{ - HOST_WIDE_INT high = 0, low = 0; - - if (!xxsplti32dx_constant_p (operands[1], mode, &high, &low)) - gcc_unreachable (); - - /* If the low bits are 0 or all 1s, initialize that word first. This way we - can use a smaller XXSPLTIB instruction instead the first XXSPLTI32DX. */ - if (low == 0 || low == -1) - { - operands[2] = const1_rtx; - operands[3] = GEN_INT (low); - operands[4] = const0_rtx; - operands[5] = GEN_INT (high); - } - else - { - operands[2] = const0_rtx; - operands[3] = GEN_INT (high); - operands[4] = const1_rtx; - operands[5] = GEN_INT (low); - } -} - [(set_attr "type" "vecperm") - (set_attr "prefixed" "yes") - (set_attr "num_insns" "2") - (set_attr "max_prefixed_insns" "2")]) - -;; First word of XXSPLTI32DX -(define_insn "*xxsplti32dx__first" - [(set (match_operand:XXSPLTI32DX 0 "vsx_register_operand" "=wa,wa,wa") - (unspec:XXSPLTI32DX [(match_operand 1 "u1bit_cint_operand" "n,n,n") - (match_operand 2 "const_int_operand" "O,wM,n")] - UNSPEC_XXSPLTI32DX_CONST))] - "TARGET_XXSPLTI32DX" - "@ - xxspltib %x0,0 - xxspltib %x0,255 - xxsplti32dx %x0,%1,%2" - [(set_attr "type" "vecperm") - (set_attr "prefixed" "*,*,yes")]) - -;; Second word of XXSPLTI32DX -(define_insn "*xxsplti32dx__second" - [(set (match_operand:XXSPLTI32DX 0 "vsx_register_operand" "=wa") - (unspec:XXSPLTI32DX [(match_operand:XXSPLTI32DX 1 "vsx_register_operand" "0") - (match_operand 2 "u1bit_cint_operand" "n") - (match_operand 3 "const_int_operand" "n")] - UNSPEC_XXSPLTI32DX_CONST))] - "TARGET_XXSPLTI32DX" - "xxsplti32dx %x0,%2,%3" - [(set_attr "type" "vecperm") - (set_attr "prefixed" "yes")]) diff --git a/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-df.c b/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-df.c deleted file mode 100644 index 1435ef4ef4f..00000000000 --- a/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-df.c +++ /dev/null @@ -1,63 +0,0 @@ -/* { dg-do compile } */ -/* { dg-require-effective-target power10_ok } */ -/* { dg-options "-mdejagnu-cpu=power10 -O2" } */ - -#include - -/* Test generating DFmode constants with the ISA 3.1 (power10) XXSPLTIDP - instruction. */ - -double -scalar_double_0 (void) -{ - return 0.0; /* XXSPLTIB or XXLXOR. */ -} - -double -scalar_double_1 (void) -{ - return 1.0; /* XXSPLTIDP. */ -} - -#ifndef __FAST_MATH__ -double -scalar_double_m0 (void) -{ - return -0.0; /* XXSPLTIDP. */ -} - -double -scalar_double_nan (void) -{ - return __builtin_nan (""); /* XXSPLTIDP. */ -} - -double -scalar_double_inf (void) -{ - return __builtin_inf (); /* XXSPLTIDP. */ -} - -double -scalar_double_m_inf (void) /* XXSPLTIDP. */ -{ - return - __builtin_inf (); -} -#endif - -double -scalar_double_pi (void) -{ - return M_PI; /* 2x XXSPLTI32DX. */ -} - -double -scalar_double_denorm (void) -{ - return 0x1p-149f; /* XXSPLTIB, XXSPLTI32DX. */ -} - -/* { dg-final { scan-assembler-times {\mxxspltidp\M} 5 } } */ -/* { dg-final { scan-assembler-times {\mxxsplti32dx\M} 3 } } */ -/* { dg-final { scan-assembler-not {\mplfd\M} } } */ -/* { dg-final { scan-assembler-not {\mplxsd\M} } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-sf.c b/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-sf.c deleted file mode 100644 index e9a45d5159d..00000000000 --- a/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-sf.c +++ /dev/null @@ -1,63 +0,0 @@ -/* { dg-do compile } */ -/* { dg-require-effective-target power10_ok } */ -/* { dg-options "-mdejagnu-cpu=power10 -O2" } */ - -#include - -/* Test generating SFmode constants with the ISA 3.1 (power10) XXSPLTIDP - instruction. */ - -float -scalar_float_0 (void) -{ - return 0.0f; /* XXSPLTIB or XXLXOR. */ -} - -float -scalar_float_1 (void) -{ - return 1.0f; /* XXSPLTIDP. */ -} - -#ifndef __FAST_MATH__ -float -scalar_float_m0 (void) -{ - return -0.0f; /* XXSPLTIDP. */ -} - -float -scalar_float_nan (void) -{ - return __builtin_nanf (""); /* XXSPLTIDP. */ -} - -float -scalar_float_inf (void) -{ - return __builtin_inff (); /* XXSPLTIDP. */ -} - -float -scalar_float_m_inf (void) /* XXSPLTIDP. */ -{ - return - __builtin_inff (); -} -#endif - -float -scalar_float_pi (void) -{ - return (float)M_PI; /* XXSPLTIDP. */ -} - -float -scalar_float_denorm (void) -{ - return 0x1p-149f; /* PLFS. */ -} - -/* { dg-final { scan-assembler-times {\mxxspltidp\M} 6 } } */ -/* { dg-final { scan-assembler-times {\mxxsplti32dx\M} 1 } } */ -/* { dg-final { scan-assembler-not {\mplfs\M} } } */ -/* { dg-final { scan-assembler-not {\mplxssp\M} } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-v2df.c b/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-v2df.c deleted file mode 100644 index d81198b163d..00000000000 --- a/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-v2df.c +++ /dev/null @@ -1,66 +0,0 @@ -/* { dg-do compile } */ -/* { dg-require-effective-target power10_ok } */ -/* { dg-options "-mdejagnu-cpu=power10 -O2" } */ - -#include - -/* Test generating V2DFmode constants with the ISA 3.1 (power10) XXSPLTIDP - instruction. */ - -vector double -v2df_double_0 (void) -{ - return (vector double) { 0.0, 0.0 }; /* XXSPLTIB or XXLXOR. */ -} - -vector double -v2df_double_1 (void) -{ - return (vector double) { 1.0, 1.0 }; /* XXSPLTIDP. */ -} - -#ifndef __FAST_MATH__ -vector double -v2df_double_m0 (void) -{ - return (vector double) { -0.0, -0.0 }; /* XXSPLTIDP. */ -} - -vector double -v2df_double_nan (void) -{ - return (vector double) { __builtin_nan (""), - __builtin_nan ("") }; /* XXSPLTIDP. */ -} - -vector double -v2df_double_inf (void) -{ - return (vector double) { __builtin_inf (), - __builtin_inf () }; /* XXSPLTIDP. */ -} - -vector double -v2df_double_m_inf (void) -{ - return (vector double) { - __builtin_inf (), - - __builtin_inf () }; /* XXSPLTIDP. */ -} -#endif - -vector double -v2df_double_pi (void) -{ - return (vector double) { M_PI, M_PI }; /* 2x XXSPLTI32DX. */ -} - -vector double -v2df_double_denorm (void) -{ - return (vector double) { (double)0x1p-149f, /* XXSPLTIB, */ - (double)0x1p-149f }; /* XXSPLTI32DX. */ -} - -/* { dg-final { scan-assembler-times {\mxxspltidp\M} 5 } } */ -/* { dg-final { scan-assembler-times {\mxxsplti32dx\M} 3 } } */ -/* { dg-final { scan-assembler-not {\mplxv\M} } } */