https://gcc.gnu.org/g:2e4b3374cb7af10e188bb5100526ad3150b9b272

commit r14-9645-g2e4b3374cb7af10e188bb5100526ad3150b9b272
Author: John David Anglin <dang...@gcc.gnu.org>
Date:   Sat Mar 23 13:47:31 2024 +0000

    hppa: Fix LO_SUM DLTIND14R address support in PRINT_OPERAND_ADDRESS
    
    This bug was hidden since LO_SUM DLTIND14R addresses are normally
    handled by the A constraint in the move patterns.
    
    2024-03-23  John David Anglin  <dang...@gcc.gnu.org>
    
    gcc/ChangeLog:
    
            * config/pa/pa.cc (pa_output_global_address): Handle
            UNSPEC_DLTIND14R addresses.
            * config/pa/pa.h (PRINT_OPERAND_ADDRESS): Output "RT'" for
            UNSPEC_DLTIND14R address.

Diff:
---
 gcc/config/pa/pa.cc | 7 ++++++-
 gcc/config/pa/pa.h  | 7 +++++--
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/gcc/config/pa/pa.cc b/gcc/config/pa/pa.cc
index d7666103de8..a7af6b8c121 100644
--- a/gcc/config/pa/pa.cc
+++ b/gcc/config/pa/pa.cc
@@ -5784,7 +5784,12 @@ pa_output_global_address (FILE *file, rtx x, int 
round_constant)
   if (GET_CODE (x) == HIGH)
     x = XEXP (x, 0);
 
-  if (GET_CODE (x) == SYMBOL_REF && read_only_operand (x, VOIDmode))
+  if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_DLTIND14R)
+    {
+      x = XVECEXP (x, 0, 0);
+      output_addr_const (file, x);
+    }
+  else if (GET_CODE (x) == SYMBOL_REF && read_only_operand (x, VOIDmode))
     output_addr_const (file, x);
   else if (GET_CODE (x) == SYMBOL_REF && !flag_pic)
     {
diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h
index 403f16c5cb5..127a0d1966d 100644
--- a/gcc/config/pa/pa.h
+++ b/gcc/config/pa/pa.h
@@ -1247,12 +1247,15 @@ do {                                                    
                     \
               reg_names [REGNO (XEXP (addr, 0))]);                     \
       break;                                                           \
     case LO_SUM:                                                       \
-      if (!symbolic_operand (XEXP (addr, 1), VOIDmode))                        
\
+      if (GET_CODE (XEXP (addr, 1)) == UNSPEC                          \
+         && XINT (XEXP (addr, 1), 1) == UNSPEC_DLTIND14R)              \
+       fputs ("RT'", FILE);                                            \
+      else if (!symbolic_operand (XEXP (addr, 1), VOIDmode))           \
        fputs ("R'", FILE);                                             \
       else if (flag_pic == 0)                                          \
        fputs ("RR'", FILE);                                            \
       else                                                             \
-       fputs ("RT'", FILE);                                            \
+       gcc_unreachable ();                                             \
       pa_output_global_address (FILE, XEXP (addr, 1), 0);              \
       fputs ("(", FILE);                                               \
       output_operand (XEXP (addr, 0), 0);                              \

Reply via email to