diff options
author | Richard Henderson <rth@cygnus.com> | 1999-04-24 13:50:46 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 1999-04-24 13:50:46 -0700 |
commit | 714b019cee7a58e9d19a3079d204928e4604a4b0 (patch) | |
tree | dee397192cd6d66ac6a86d63a667f298bb7fb0dc | |
parent | 4d9a07db8806962b37b60cc4927b904bccaf74ce (diff) | |
download | gcc-714b019cee7a58e9d19a3079d204928e4604a4b0.zip gcc-714b019cee7a58e9d19a3079d204928e4604a4b0.tar.gz gcc-714b019cee7a58e9d19a3079d204928e4604a4b0.tar.bz2 |
alpha.h (PRINT_OPERAND_ADDRESS): Break out to ...
* alpha.h (PRINT_OPERAND_ADDRESS): Break out to ...
* alpha.c (print_operand_address): here. Handle subregs.
From-SVN: r26616
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/alpha/alpha.c | 34 | ||||
-rw-r--r-- | gcc/config/alpha/alpha.h | 26 |
3 files changed, 43 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dd95dcc..8af5855 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Sat Apr 24 20:49:20 1999 Richard Henderson <rth@cygnus.com> + + * alpha.h (PRINT_OPERAND_ADDRESS): Break out to ... + * alpha.c (print_operand_address): here. Handle subregs. + Fri Apr 23 22:35:41 EDT 1999 John Wehle (john@feith.com) * acconfig.h (HAVE_GAS_FILDS_FISTS): Add. diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index cf60507..7b6966e 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -2929,6 +2929,40 @@ print_operand (file, x, code) output_operand_lossage ("invalid %%xn code"); } } + +void +print_operand_address (file, addr) + FILE *file; + rtx addr; +{ + rtx basereg = NULL_RTX; + HOST_WIDE_INT offset = 0; + + if (GET_CODE (addr) == AND) + addr = XEXP (addr, 0); + if (GET_CODE (addr) == SUBREG) + addr = SUBREG_REG (addr); + + if (GET_CODE (addr) == REG) + basereg = addr; + else if (GET_CODE (addr) == CONST_INT) + offset = INTVAL (addr); + else if (GET_CODE (addr) == PLUS + && GET_CODE (XEXP (addr, 1)) == CONST_INT) + { + offset = INTVAL (XEXP (addr, 1)); + basereg = XEXP (addr, 0); + if (GET_CODE (basereg) == SUBREG) + basereg = SUBREG_REG (basereg); + if (GET_CODE (basereg) != REG) + abort (); + } + else + abort (); + + fprintf (file, HOST_WIDE_INT_PRINT_DEC, offset); + fprintf (file, "($%d)", basereg ? REGNO (basereg) : 31); +} /* Emit RTL insns to initialize the variable parts of a trampoline at TRAMP. FNADDR is an RTX for the address of the function's pure diff --git a/gcc/config/alpha/alpha.h b/gcc/config/alpha/alpha.h index bf41334..857ba0d 100644 --- a/gcc/config/alpha/alpha.h +++ b/gcc/config/alpha/alpha.h @@ -2297,28 +2297,9 @@ do { \ /* Print a memory address as an operand to reference that memory location. */ -#define PRINT_OPERAND_ADDRESS(FILE, ADDR) \ -{ rtx addr = (ADDR); \ - int basereg = 31; \ - HOST_WIDE_INT offset = 0; \ - \ - if (GET_CODE (addr) == AND) \ - addr = XEXP (addr, 0); \ - \ - if (GET_CODE (addr) == REG) \ - basereg = REGNO (addr); \ - else if (GET_CODE (addr) == CONST_INT) \ - offset = INTVAL (addr); \ - else if (GET_CODE (addr) == PLUS \ - && GET_CODE (XEXP (addr, 0)) == REG \ - && GET_CODE (XEXP (addr, 1)) == CONST_INT) \ - basereg = REGNO (XEXP (addr, 0)), offset = INTVAL (XEXP (addr, 1)); \ - else \ - abort (); \ - \ - fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, offset); \ - fprintf (FILE, "($%d)", basereg); \ -} +#define PRINT_OPERAND_ADDRESS(FILE, ADDR) \ + print_operand_address((FILE), (ADDR)) + /* Define the codes that are matched by predicates in alpha.c. */ #define PREDICATE_CODES \ @@ -2524,6 +2505,7 @@ extern int current_file_function_operand (); extern int alpha_sa_size (); extern int alpha_adjust_cost (); extern void print_operand (); +extern void print_operand_address (); extern int reg_or_0_operand (); extern int reg_or_8bit_operand (); extern int mul8_operand (); |