https://gcc.gnu.org/g:46132ad0081e4f55c19977b00f4c6d9280cead21

commit 46132ad0081e4f55c19977b00f4c6d9280cead21
Author: Michael Meissner <meiss...@linux.ibm.com>
Date:   Mon Jun 10 18:00:27 2024 -0400

    Add options for modes in SPR registers.
    
    2024-06-10  Michael Meissner  <meiss...@linux.ibm.com>
    
    gcc/
    
            * config/rs6000/rs6000.cc (rs6000_hard_regno_mode_ok_uncached): Add
            support for -m{cc,qi,hi,si,sf,df}spr.
            (rs6000_debug_reg_global): Print out SPR mode options.
            * config/rs6000/rs6000.opt (-mccspr): New option.
            (-mqispr): Likewise.
            (-mhispr): Likewise.
            (-msispr): Likewise.
            (-msfspr): Likewise.
            (-mdfspr): Likewise.

Diff:
---
 gcc/config/rs6000/rs6000.cc  | 60 ++++++++++++++++++++++++++++++++++++++------
 gcc/config/rs6000/rs6000.opt | 24 ++++++++++++++++++
 2 files changed, 76 insertions(+), 8 deletions(-)

diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index c106e13b8ad..70214e4b28c 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -1946,18 +1946,44 @@ rs6000_hard_regno_mode_ok_uncached (int regno, 
machine_mode mode)
     {
     case VRSAVE_REGNO:
     case VSCR_REGNO:
+      return (!orig_complex_p && mode == SImode);
+
     case LR_REGNO:
+      return (!orig_complex_p && mode == Pmode);
+
     case CTR_REGNO:
     case TAR_REGNO:
-      {
-       unsigned reg_size = ((regno == VRSAVE_REGNO || regno == VSCR_REGNO)
-                            ? 4
-                            : UNITS_PER_WORD);
+      if (orig_complex_p)
+       return 0;
 
-       return (!orig_complex_p
-               && GET_MODE_SIZE (mode) <= reg_size
-               && SCALAR_INT_MODE_P (mode));
-      }
+      if (GET_MODE_CLASS (mode) == MODE_CC)
+       return TARGET_CCSPR != 0;
+
+      switch (mode)
+       {
+       case E_QImode:
+         return TARGET_QISPR != 0;
+
+       case E_HImode:
+         return TARGET_HISPR != 0;
+
+       case E_SImode:
+         return (TARGET_SISPR != 0 || !TARGET_POWERPC64);
+
+       case E_DImode:
+         return TARGET_POWERPC64;
+
+       case E_SFmode:
+         return (TARGET_SFSPR != 0);
+
+       case E_DFmode:
+         return (TARGET_DFSPR != 0 && TARGET_POWERPC64);
+
+       default:
+         break;
+       }
+
+      return false;
 
     default:
       break;
@@ -2621,6 +2647,24 @@ rs6000_debug_reg_global (void)
   if (TARGET_DIRECT_MOVE_128)
     fprintf (stderr, DEBUG_FMT_D, "VSX easy 64-bit mfvsrld element",
             (int)VECTOR_ELEMENT_MFVSRLD_64BIT);
+
+  if (TARGET_CCSPR)
+    fprintf (stderr, DEBUG_FMT_S, "Condition modes in SPR", "yes");
+
+  if (TARGET_QISPR)
+    fprintf (stderr, DEBUG_FMT_S, "QImode in SPR", "yes");
+
+  if (TARGET_HISPR)
+    fprintf (stderr, DEBUG_FMT_S, "HImode in SPR", "yes");
+
+  if (TARGET_SISPR)
+    fprintf (stderr, DEBUG_FMT_S, "SImode in SPR", "yes");
+
+  if (TARGET_SFSPR)
+    fprintf (stderr, DEBUG_FMT_S, "SFmode in SPR", "yes");
+
+  if (TARGET_DFSPR)
+    fprintf (stderr, DEBUG_FMT_S, "DFmode in SPR", "yes");
 }
 
 
diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt
index 7f7a283bc99..27f873972b5 100644
--- a/gcc/config/rs6000/rs6000.opt
+++ b/gcc/config/rs6000/rs6000.opt
@@ -634,6 +634,30 @@ mtar
 Target Undocumented Mask(TAR) Var(rs6000_isa_flags)
 Allow (do not allow) use the TAR register.
 
+mccspr
+Target Undocumented Var(TARGET_CCSPR) Init(0)
+Allow (do not allow) condition modes to be in the CTR or TAR registers.
+
+mqispr
+Target Undocumented Var(TARGET_QISPR) Init(1)
+Allow (do not allow) 8-bit integers to be in the CTR or TAR registers.
+
+mhispr
+Target Undocumented Var(TARGET_HISPR) Init(1)
+Allow (do not allow) 16-bit integers to be in the CTR or TAR registers.
+
+msispr
+Target Undocumented Var(TARGET_SISPR) Init(1)
+Allow (do not allow) 32-bit integers to be in the CTR or TAR registers.
+
+msfspr
+Target Undocumented Var(TARGET_SFSPR) Init(0)
+Allow (do not allow) 32-bit floating point to be in the CTR or TAR registers.
+
+mdfspr
+Target Undocumented Var(TARGET_DFSPR) Init(0)
+Allow (do not allow) 64-bit floating point to be in the CTR or TAR registers.
+
 ; Documented parameters
 
 -param=rs6000-vect-unroll-limit=

Reply via email to