* config/alpha/alpha.c (some_small_symbolic_mem_operand) Use
for_each_rtx instead of assuming we're already looking at the MEM. (split_small_symbolic_mem_operand): Likewise. * config/alpha/alpha.h (PREDICATE_CODES): Update. * config/alpha/alpha.md (small symbolic memory splitters): Update. * gcc.dg/20020122-4.c: New. From-SVN: r49111
This commit is contained in:
parent
2e27193212
commit
1e7e480e5c
@ -1,4 +1,12 @@
|
||||
<<<<<<< ChangeLog
|
||||
2002-01-22 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* config/alpha/alpha.c (some_small_symbolic_mem_operand) Use
|
||||
for_each_rtx instead of assuming we're already looking at the MEM.
|
||||
(split_small_symbolic_mem_operand): Likewise.
|
||||
* config/alpha/alpha.h (PREDICATE_CODES): Update.
|
||||
* config/alpha/alpha.md (small symbolic memory splitters): Update.
|
||||
|
||||
2002-01-22 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* config/alpha/alpha.md (divmodsi_internal_er): Generate lituse
|
||||
sequence number for the literal.
|
||||
|
@ -116,6 +116,10 @@ int alpha_this_gpdisp_sequence_number;
|
||||
/* Declarations of static functions. */
|
||||
static bool decl_in_text_section
|
||||
PARAMS ((tree));
|
||||
static int some_small_symbolic_mem_operand_1
|
||||
PARAMS ((rtx *, void *));
|
||||
static int split_small_symbolic_mem_operand_1
|
||||
PARAMS ((rtx *, void *));
|
||||
static bool local_symbol_p
|
||||
PARAMS ((rtx));
|
||||
static void alpha_set_memflags_1
|
||||
@ -1874,51 +1878,57 @@ some_small_symbolic_mem_operand (x, mode)
|
||||
rtx x;
|
||||
enum machine_mode mode ATTRIBUTE_UNUSED;
|
||||
{
|
||||
/* Get rid of SIGN_EXTEND, etc. */
|
||||
while (GET_RTX_CLASS (GET_CODE (x)) == '1')
|
||||
x = XEXP (x, 0);
|
||||
return for_each_rtx (&x, some_small_symbolic_mem_operand_1, NULL);
|
||||
}
|
||||
|
||||
static int
|
||||
some_small_symbolic_mem_operand_1 (px, data)
|
||||
rtx *px;
|
||||
void *data ATTRIBUTE_UNUSED;
|
||||
{
|
||||
rtx x = *px;
|
||||
|
||||
if (GET_CODE (x) != MEM)
|
||||
return 0;
|
||||
|
||||
x = XEXP (x, 0);
|
||||
|
||||
/* If this is an ldq_u type address, discard the outer AND. */
|
||||
if (GET_CODE (x) == AND && GET_MODE (x) == DImode
|
||||
&& GET_CODE (XEXP (x, 1)) == CONST_INT
|
||||
&& INTVAL (XEXP (x, 1)) == -8)
|
||||
if (GET_CODE (x) == AND)
|
||||
x = XEXP (x, 0);
|
||||
return small_symbolic_operand (x, Pmode);
|
||||
|
||||
return small_symbolic_operand (x, Pmode) ? 1 : -1;
|
||||
}
|
||||
|
||||
rtx
|
||||
split_small_symbolic_mem_operand (x)
|
||||
rtx x;
|
||||
{
|
||||
rtx *p;
|
||||
x = copy_rtx (x);
|
||||
for_each_rtx (&x, split_small_symbolic_mem_operand_1, NULL);
|
||||
return x;
|
||||
}
|
||||
|
||||
if (GET_CODE (x) == MEM)
|
||||
static int
|
||||
split_small_symbolic_mem_operand_1 (px, data)
|
||||
rtx *px;
|
||||
void *data ATTRIBUTE_UNUSED;
|
||||
{
|
||||
rtx x = *px;
|
||||
|
||||
if (GET_CODE (x) != MEM)
|
||||
return 0;
|
||||
|
||||
px = &XEXP (x, 0), x = *px;
|
||||
if (GET_CODE (x) == AND)
|
||||
px = &XEXP (x, 0), x = *px;
|
||||
|
||||
if (small_symbolic_operand (x, Pmode))
|
||||
{
|
||||
rtx tmp = XEXP (x, 0);
|
||||
|
||||
if (GET_CODE (tmp) == AND && GET_MODE (tmp) == DImode
|
||||
&& GET_CODE (XEXP (tmp, 1)) == CONST_INT
|
||||
&& INTVAL (XEXP (tmp, 1)) == -8)
|
||||
{
|
||||
tmp = gen_rtx_LO_SUM (DImode, pic_offset_table_rtx, XEXP (tmp, 0));
|
||||
tmp = gen_rtx_AND (DImode, tmp, GEN_INT (-8));
|
||||
}
|
||||
else
|
||||
tmp = gen_rtx_LO_SUM (DImode, pic_offset_table_rtx, tmp);
|
||||
return replace_equiv_address (x, tmp);
|
||||
x = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, x);
|
||||
*px = x;
|
||||
}
|
||||
|
||||
x = copy_rtx (x);
|
||||
p = &x;
|
||||
while (GET_RTX_CLASS (GET_CODE (*p)) == '1')
|
||||
p = &XEXP (*p, 0);
|
||||
|
||||
*p = split_small_symbolic_mem_operand (*p);
|
||||
return x;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Try a machine-dependent way of reloading an illegitimate address
|
||||
|
@ -2079,8 +2079,7 @@ do { \
|
||||
{"reg_no_subreg_operand", {REG}}, \
|
||||
{"addition_operation", {PLUS}}, \
|
||||
{"symbolic_operand", {SYMBOL_REF, LABEL_REF, CONST}}, \
|
||||
{"some_small_symbolic_mem_operand", {MEM, SIGN_EXTEND, ZERO_EXTEND, \
|
||||
FLOAT_EXTEND}},
|
||||
{"some_small_symbolic_mem_operand", {SET, PARALLEL}},
|
||||
|
||||
/* Define the `__builtin_va_list' type for the ABI. */
|
||||
#define BUILD_VA_LIST_TYPE(VALIST) \
|
||||
|
@ -5501,19 +5501,11 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi"
|
||||
"operands[2] = pic_offset_table_rtx;")
|
||||
|
||||
(define_split
|
||||
[(set (match_operand 0 "some_small_symbolic_mem_operand" "")
|
||||
(match_operand 1 "" ""))]
|
||||
[(match_operand 0 "some_small_symbolic_mem_operand" "")]
|
||||
"TARGET_EXPLICIT_RELOCS && reload_completed"
|
||||
[(set (match_dup 0) (match_dup 1))]
|
||||
[(match_dup 0)]
|
||||
"operands[0] = split_small_symbolic_mem_operand (operands[0]);")
|
||||
|
||||
(define_split
|
||||
[(set (match_operand 0 "" "")
|
||||
(match_operand 1 "some_small_symbolic_mem_operand" ""))]
|
||||
"TARGET_EXPLICIT_RELOCS && reload_completed"
|
||||
[(set (match_dup 0) (match_dup 1))]
|
||||
"operands[1] = split_small_symbolic_mem_operand (operands[1]);")
|
||||
|
||||
(define_insn "movdi_er_high_g"
|
||||
[(set (match_operand:DI 0 "register_operand" "=r")
|
||||
(unspec:DI [(match_operand:DI 1 "register_operand" "r")
|
||||
|
@ -1,3 +1,7 @@
|
||||
2002-01-22 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* gcc.dg/20020122-4.c: New.
|
||||
|
||||
2002-01-22 H.J. Lu <hjl@gnu.org>
|
||||
|
||||
* g++.dg/special/ecos.exp: Append .exe instead of a.out as the
|
||||
|
10
gcc/testsuite/gcc.dg/20020122-4.c
Normal file
10
gcc/testsuite/gcc.dg/20020122-4.c
Normal file
@ -0,0 +1,10 @@
|
||||
/* Alpha -msmall-data didn't transform (mem (symbol_ref)) to
|
||||
(mem (lo_sum pic (symbol_ref))) within an asm at the right time. */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fpic" } */
|
||||
|
||||
void foo()
|
||||
{
|
||||
static int test;
|
||||
asm volatile ("" : "=m"(test) : "m"(test));
|
||||
}
|
Loading…
Reference in New Issue
Block a user