https://gcc.gnu.org/g:fcf916f27f90ce9135ca22423262efcd036102fd

commit fcf916f27f90ce9135ca22423262efcd036102fd
Author: Michael Meissner <meiss...@linux.ibm.com>
Date:   Mon Aug 4 22:33:27 2025 -0400

    Revert changes

Diff:
---
 gcc/config/rs6000/rs6000.cc                 |  13 +--
 gcc/config/rs6000/rs6000.md                 |  95 -------------------
 gcc/config/rs6000/vsx.md                    | 142 +---------------------------
 gcc/testsuite/gcc.target/powerpc/pr117487.c |  67 -------------
 4 files changed, 10 insertions(+), 307 deletions(-)

diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index f4f0ad80e35e..8b8f5c733c8a 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -4373,15 +4373,12 @@ rs6000_option_override_internal (bool global_init_p)
       && (rs6000_isa_flags_explicit & OPTION_MASK_PCREL) == 0)
     rs6000_isa_flags |= OPTION_MASK_PCREL;
 
-  /* -mpcrel requires medium or large code models, but we can't check
-      TARGET_CMODEL until after the subtarget override options are done.  */
-  else if (TARGET_PCREL
-          && TARGET_CMODEL != CMODEL_MEDIUM
-          && TARGET_CMODEL != CMODEL_LARGE)
+  /* -mpcrel requires -mcmodel=medium, but we can't check TARGET_CMODEL until
+      after the subtarget override options are done.  */
+  else if (TARGET_PCREL && TARGET_CMODEL != CMODEL_MEDIUM)
     {
       if ((rs6000_isa_flags_explicit & OPTION_MASK_PCREL) != 0)
-       error ("%qs requires %qs or %qs", "-mpcrel", "-mcmodel=medium",
-              "-mcmodel=large");
+       error ("%qs requires %qs", "-mpcrel", "-mcmodel=medium");
 
       rs6000_isa_flags &= ~OPTION_MASK_PCREL;
     }
@@ -21361,7 +21358,7 @@ rs6000_elf_declare_function_name (FILE *file, const 
char *name, tree decl)
   ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
   ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
 
-  if (TARGET_CMODEL == CMODEL_LARGE && !TARGET_PCREL
+  if (TARGET_CMODEL == CMODEL_LARGE
       && rs6000_global_entry_point_prologue_needed_p ())
     {
       char buf[256];
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 5a56ad79a9ee..9c718ca2a226 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -173,7 +173,6 @@
    UNSPEC_XXSPLTIW_CONST
    UNSPEC_FMAX
    UNSPEC_FMIN
-   UNSPEC_ZERO_EXTEND
   ])
 
 ;;
@@ -970,100 +969,6 @@
    (set_attr "dot" "yes")
    (set_attr "length" "4,8")])
 
-;; Optimize zero_extendsiti2 from a GPR to a GPR and then moving the GPR to a
-;; VSX register
-(define_peephole2
-  [(set (match_operand:DI 0 "int_reg_operand")
-       (match_operand:DI 1 "int_reg_operand"))
-   (set (match_operand:DI 2 "int_reg_operand")
-       (const_int 0))
-   (set (match_operand:TI 3 "vsx_register_operand")
-       (match_operand:TI 4 "int_reg_operand"))]
-  "TARGET_DIRECT_MOVE_64BIT
-   && (reg_or_subregno (operands[0])
-       == reg_or_subregno (operands[4]) + !!WORDS_BIG_ENDIAN)
-   && (reg_or_subregno (operands[2])
-       == reg_or_subregno (operands[4]) + !WORDS_BIG_ENDIAN)
-   && peep2_reg_dead_p (3, operands[4])"
-  [(set (match_dup 3)
-       (unspec:TI [(match_dup 1)] UNSPEC_ZERO_EXTEND))])
-
-(define_insn "*zero_extendsiti2_vsx"
-  [(set (match_operand:TI 0 "vsx_register_operand" "=wa")
-       (unspec:TI [(match_operand:DI 1 "int_reg_operand" "r")]
-                  UNSPEC_ZERO_EXTEND))]
-  "TARGET_DIRECT_MOVE_64BIT"
-  "mtvsrdd %x0,0,%1"
-  [(set_attr "type" "mtvsr")])
-
-;; On power10, optimize zero extending a QI/HI/SI/DImode value from memory that
-;; is going to a vector register target by generating a LXVR{B,H,W,D}X
-;; instruction without creating the TImode value in a GPR and using MTVSRDD to
-;; move it to the vector register.
-(define_peephole2
-  [(set (match_operand:DI 0 "int_reg_operand")
-       (match_operand:DI 1 "memory_operand"))
-   (set (match_operand:DI 2 "base_reg_operand")
-       (const_int 0))
-   (set (match_operand:TI 3 "vsx_register_operand")
-       (match_operand:TI 4 "int_reg_operand"))]
-  "TARGET_POWER10 && TARGET_POWERPC64
-   && (reg_or_subregno (operands[0])
-       == reg_or_subregno (operands[4]) + !!WORDS_BIG_ENDIAN)
-   && (reg_or_subregno (operands[2])
-       == reg_or_subregno (operands[4]) + !WORDS_BIG_ENDIAN)
-   && peep2_reg_dead_p (3, operands[4])
-   && (REG_P (XEXP (operands[1], 0))
-       || SUBREG_P (XEXP (operands[1], 0))
-       || GET_CODE (XEXP (operands[1], 0)) == PLUS)"
-  [(set (match_dup 3)
-       (zero_extend:TI (match_dup 5)))]
-{
-  rtx mem = operands[1];
-  rtx addr = XEXP (mem, 0);
-
-  if (indexed_or_indirect_address (addr, DImode))
-    operands[5] = mem;
-  else
-    {
-      rtx op2 = operands[2];
-      emit_insn (gen_rtx_SET (op2, addr));
-      operands[5] = change_address (mem, DImode, op2);
-    }
-})
-
-(define_peephole2
-  [(set (match_operand:DI 0 "int_reg_operand")
-       (zero_extend:DI
-        (match_operand:QHSI 1 "memory_operand")))
-   (set (match_operand:DI 2 "base_reg_operand")
-       (const_int 0))
-   (set (match_operand:TI 3 "vsx_register_operand")
-       (match_operand:TI 4 "int_reg_operand"))]
-  "TARGET_POWER10 && TARGET_POWERPC64
-   && (reg_or_subregno (operands[0])
-       == reg_or_subregno (operands[4]) + !!WORDS_BIG_ENDIAN)
-   && (reg_or_subregno (operands[2])
-       == reg_or_subregno (operands[4]) + !WORDS_BIG_ENDIAN)
-   && peep2_reg_dead_p (3, operands[4])
-   && (REG_P (XEXP (operands[1], 0))
-       || SUBREG_P (XEXP (operands[1], 0))
-       || GET_CODE (XEXP (operands[1], 0)) == PLUS)"
-  [(set (match_dup 3)
-       (zero_extend:TI (match_dup 5)))]
-{
-  rtx mem = operands[1];
-  rtx addr = XEXP (mem, 0);
-
-  if (indexed_or_indirect_address (addr, DImode))
-    operands[5] = mem;
-  else
-    {
-      rtx op2 = operands[2];
-      emit_insn (gen_rtx_SET (op2, addr));
-      operands[5] = change_address (mem, DImode, op2);
-    }
-})
 
 (define_insn "zero_extendsi<mode>2"
   [(set (match_operand:EXTSI 0 "gpc_reg_operand" "=r,r,d,wa,wa,r,wa")
diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md
index f47c4e2f7766..d84a2a357a31 100644
--- a/gcc/config/rs6000/vsx.md
+++ b/gcc/config/rs6000/vsx.md
@@ -6282,7 +6282,7 @@
    (SFBOOL_MFVSR_A              3)             ;; move to gpr src
    (SFBOOL_BOOL_D               4)             ;; and/ior/xor dest
    (SFBOOL_BOOL_A1              5)             ;; and/ior/xor arg1
-   (SFBOOL_BOOL_A2              6)             ;; and/ior/xor arg2
+   (SFBOOL_BOOL_A2              6)             ;; and/ior/xor arg1
    (SFBOOL_SHL_D                7)             ;; shift left dest
    (SFBOOL_SHL_A                8)             ;; shift left arg
    (SFBOOL_MTVSR_D              9)             ;; move to vecter dest
@@ -6322,18 +6322,18 @@
 ;; GPR, and instead move the integer mask value to the vector register after a
 ;; shift and do the VSX logical operation.
 
-;; The insns for dealing with SFmode in GPR registers looks like on power8:
+;; The insns for dealing with SFmode in GPR registers looks like:
 ;; (set (reg:V4SF reg2) (unspec:V4SF [(reg:SF reg1)] UNSPEC_VSX_CVDPSPN))
 ;;
-;; (set (reg:DI reg3) (zero_extend:DI (reg:SI reg2)))
+;; (set (reg:DI reg3) (unspec:DI [(reg:V4SF reg2)] UNSPEC_P8V_RELOAD_FROM_VSX))
 ;;
-;; (set (reg:DI reg4) (and:SI (reg:SI reg3) (reg:SI mask)))
+;; (set (reg:DI reg4) (and:DI (reg:DI reg3) (reg:DI reg3)))
 ;;
 ;; (set (reg:DI reg5) (ashift:DI (reg:DI reg4) (const_int 32)))
 ;;
 ;; (set (reg:SF reg6) (unspec:SF [(reg:DI reg5)] UNSPEC_P8V_MTVSRD))
 ;;
-;; (set (reg:SF reg7) (unspec:SF [(reg:SF reg6)] UNSPEC_VSX_CVSPDPN))
+;; (set (reg:SF reg6) (unspec:SF [(reg:SF reg6)] UNSPEC_VSX_CVSPDPN))
 
 (define_peephole2
   [(match_scratch:DI SFBOOL_TMP_GPR "r")
@@ -6414,138 +6414,6 @@
   operands[SFBOOL_MTVSR_D_V4SF] = gen_rtx_REG (V4SFmode, regno_mtvsr_d);
 })
 
-;; Constants for SFbool optimization on power9/power10
-(define_constants
-  [(SFBOOL2_TMP_VSX_V4SI        0)             ;; vector temporary (V4SI)
-   (SFBOOL2_TMP_GPR_SI          1)             ;; GPR temporary (SI)
-   (SFBOOL2_MFVSR_D             2)             ;; move to gpr dest (DI)
-   (SFBOOL2_MFVSR_A             3)             ;; move to gpr src (SI)
-   (SFBOOL2_BOOL_D              4)             ;; and/ior/xor dest (SI)
-   (SFBOOL2_BOOL_A1             5)             ;; and/ior/xor arg1 (SI)
-   (SFBOOL2_BOOL_A2             6)             ;; and/ior/xor arg2 (SI)
-   (SFBOOL2_SPLAT_D             7)             ;; splat dest (V4SI)
-   (SFBOOL2_MTVSR_D             8)             ;; move/splat to VSX dest.
-   (SFBOOL2_MTVSR_A             9)             ;; move/splat to VSX arg.
-   (SFBOOL2_MFVSR_A_V4SI       10)             ;; MFVSR_A as V4SI
-   (SFBOOL2_MTVSR_D_V4SI       11)             ;; MTVSR_D as V4SI
-   (SFBOOL2_XXSPLTW            12)])           ;; 1 or 3 for XXSPLTW
-
-;; On power9/power10, the code is different because we have a splat 32-bit
-;; operation that does a direct move to the FPR/vector registers (MTVSRWS).
-;;
-;; The insns for dealing with SFmode in GPR registers looks like on
-;; power9/power10:
-;;
-;; (set (reg:V4SF reg2) (unspec:V4SF [(reg:SF reg1)] UNSPEC_VSX_CVDPSPN))
-;;
-;; (set (reg:DI reg3) (zero_extend:DI (reg:SI reg2)))
-;;
-;; (set (reg:SI reg4) (and:SI (reg:SI reg3) (reg:SI mask)))
-;;
-;; (set (reg:V4SI reg5) (vec_duplicate:V4SI (reg:SI reg4)))
-;;
-;; (set (reg:SF reg6) (unspec:SF [(reg:SF reg5)] UNSPEC_VSX_CVSPDPN))
-
-;; The VSX temporary needs to be an Altivec register in case we are trying to
-;; do and/ior/xor of -16..15 and we want to use VSPLTISW to load the constant.
-;;
-;; The GPR temporary is only used if we are trying to do a logical operation
-;; with a constant outside of the -16..15 range on a power9.  Otherwise, we can
-;; load the constant directly into the VSX temporary register.
-
-(define_peephole2
-  [(match_scratch:V4SI SFBOOL2_TMP_VSX_V4SI "v")
-   (match_scratch:SI SFBOOL2_TMP_GPR_SI "r")
-
-   ;; Zero_extend and direct move
-   (set (match_operand:DI SFBOOL2_MFVSR_D "int_reg_operand")
-       (zero_extend:DI
-        (match_operand:SI SFBOOL2_MFVSR_A "vsx_register_operand")))
-
-   ;; AND/IOR/XOR operation on int
-   (set (match_operand:SI SFBOOL2_BOOL_D "int_reg_operand")
-       (and_ior_xor:SI
-        (match_operand:SI SFBOOL2_BOOL_A1 "int_reg_operand")
-        (match_operand:SI SFBOOL2_BOOL_A2 "reg_or_cint_operand")))
-
-   ;; Splat sfbool result to vector register
-   (set (match_operand:V4SI SFBOOL2_SPLAT_D "vsx_register_operand")
-       (vec_duplicate:V4SI
-        (match_dup SFBOOL2_BOOL_D)))]
-
-  "TARGET_POWERPC64 && TARGET_P9_VECTOR
-   && REG_P (operands[SFBOOL2_MFVSR_D])
-   && REG_P (operands[SFBOOL2_BOOL_A1])
-   && (REGNO (operands[SFBOOL2_MFVSR_D]) == REGNO (operands[SFBOOL2_BOOL_A1])
-       || (REG_P (operands[SFBOOL2_BOOL_A2])
-           && (REGNO (operands[SFBOOL2_MFVSR_D])
-               == REGNO (operands[SFBOOL2_BOOL_A2]))))
-   && peep2_reg_dead_p (3, operands[SFBOOL2_MFVSR_D])
-   && peep2_reg_dead_p (4, operands[SFBOOL2_BOOL_D])"
-
-  ;; Either (set (reg:SI xxx) (reg:SI yyy))    or
-  ;;        (set (reg:V4SI xxx) (const_vector (parallel [c, c, c, c])))
-  [(set (match_dup SFBOOL2_MTVSR_D)
-       (match_dup SFBOOL2_MTVSR_A))
-
-   ;; And/ior/xor on vector registers
-   (set (match_dup SFBOOL2_TMP_VSX_V4SI)
-       (and_ior_xor:V4SI
-        (match_dup SFBOOL2_MFVSR_A_V4SI)
-        (match_dup SFBOOL2_TMP_VSX_V4SI)))
-
-   ;; XXSPLTW t,r,r,1
-   (set (match_dup SFBOOL2_SPLAT_D)
-       (vec_duplicate:V4SI
-        (vec_select:SI
-         (match_dup SFBOOL2_TMP_VSX_V4SI)
-         (parallel [(match_dup SFBOOL2_XXSPLTW)]))))]
-{
-  rtx mfvsr_d = operands[SFBOOL2_MFVSR_D];
-  rtx bool_a1 = operands[SFBOOL2_BOOL_A1];
-  rtx bool_a2 = operands[SFBOOL2_BOOL_A2];
-  rtx bool_arg = (rtx_equal_p (mfvsr_d, bool_a1) ? bool_a2 : bool_a1);
-  int regno_mfvsr_a = REGNO (operands[SFBOOL2_MFVSR_A]);
-  int regno_tmp_vsx = REGNO (operands[SFBOOL2_TMP_VSX_V4SI]);
-
-  /* If the logical operation is a constant, form the constant in a vector
-     register.  */
-  if (CONST_INT_P (bool_arg))
-    {
-      HOST_WIDE_INT value = INTVAL (bool_arg);
-
-      /* See if we can directly load the constant, either by VSPLTIW or by
-         XXSPLTIW on power10.  */
-
-      if (IN_RANGE (value, -16, 15) || TARGET_PREFIXED)
-       {
-         rtvec cv = gen_rtvec (4, bool_arg, bool_arg, bool_arg, bool_arg);
-         operands[SFBOOL2_MTVSR_D] = gen_rtx_REG (V4SImode, regno_tmp_vsx);
-         operands[SFBOOL2_MTVSR_A] = gen_rtx_CONST_VECTOR (V4SImode, cv);
-       }
-
-      else
-       {
-         /* We need to load up the constant to a GPR and move it to a
-            vector register.  */
-         rtx tmp_gpr = operands[SFBOOL2_TMP_GPR_SI];
-         emit_move_insn (tmp_gpr, bool_arg);
-         operands[SFBOOL2_MTVSR_D] = gen_rtx_REG (SImode, regno_tmp_vsx);
-         operands[SFBOOL2_MTVSR_A] = tmp_gpr;
-       }
-    }
-  else
-    {
-      /* Mask is in a register, move it to a vector register.  */
-      operands[SFBOOL2_MTVSR_D] = gen_rtx_REG (SImode, regno_tmp_vsx);
-      operands[SFBOOL2_MTVSR_A] = bool_arg;
-    }
-
-    operands[SFBOOL2_TMP_VSX_V4SI] = gen_rtx_REG (V4SImode, regno_tmp_vsx);
-    operands[SFBOOL2_MFVSR_A_V4SI] = gen_rtx_REG (V4SImode, regno_mfvsr_a);
-    operands[SFBOOL2_XXSPLTW] = GEN_INT (BYTES_BIG_ENDIAN ? 1 : 2);
-})
-
 ;; Support signed/unsigned long long to float conversion vectorization.
 ;; Note that any_float (pc) here is just for code attribute <su>.
 (define_expand "vec_pack<su>_float_v2di"
diff --git a/gcc/testsuite/gcc.target/powerpc/pr117487.c 
b/gcc/testsuite/gcc.target/powerpc/pr117487.c
deleted file mode 100644
index 28a92f0f78e4..000000000000
--- a/gcc/testsuite/gcc.target/powerpc/pr117487.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* { dg-do compile } */
-/* { dg-options "-mdejagnu-cpu=power9 -O2" } */
-/* { dg-require-effective-target powerpc_vsx } */
-
-#include <stdint.h>
-
-/*
- * PR target/117487
- *
- * On power8 with the optimization it generates:
- *
- *     xscvdpspn 0,1
- *     sldi 9,4,32
- *     mtvsrd 32,9
- *     xxland 1,0,32
- *     xscvspdpn 1,1
- *
- * I.e., it converts the SFmode to the memory format (instead of the DFmode
- * that is used within the register), converts the mask so that it is in the
- * vector register in the upper 32-bits, and does a XXLAND (i.e. there is only
- * one direct move from GPR to vector register).  Then after doing this, it
- * converts the upper 32-bits back to DFmode.
- *
- * If the XSCVSPDN instruction took the value in the normal 32-bit scalar in a
- * vector register, we wouldn't have needed the SLDI of the mask.
- *
- * On power9/power10/power11 before the fix wa applied, GCC generated:
- *
- *     xscvdpspn 0,1
- *     mfvsrwz 2,0
- *     and 2,2,4
- *     mtvsrws 1,2
- *     xscvspdpn 1,1
- *     blr
- *
- * I.e convert to SFmode representation, move the value to a GPR, do an AND
- * operation, move the 32-bit value with a splat, and then convert it back to
- * DFmode format.
- *
- * After the patch was applied, it now generates:
- *
- *     xscvdpspn 0,1
- *     mtvsrwz 32,2
- *     xxland 32,0,32
- *     xxspltw 1,32,1
- *     xscvspdpn 1,1
- *     blr
- */
-
-union u {
-  float f;
-  uint32_t u32;
-};
-
-float
-math_foo (float x, unsigned int mask)
-{
-  union u arg;
-
-  arg.f = x;
-  arg.u32 &= mask;
-  return arg.f;
-}
-
-/* { dg-final { scan-assembler     {\mxxland\M} } } */
-/* { dg-final { scan-assembler-not {\mmfvsr}    } } */
-/* { dg-final { scan-assembler-not {\mand\M}    } } */

Reply via email to