[ARC] Cleanup sdata handling.
Clean up how we handle small data load/store operations. gcc/ 2018-01-18 Claudiu Zissulescu <claziss@synopsys.com> * config/arc/arc-protos.h (prepare_extend_operands): Remove. (small_data_pattern): Likewise. (arc_rewrite_small_data): Likewise. * config/arc/arc.c (LEGITIMATE_SMALL_DATA_OFFSET_P): Remove. (LEGITIMATE_SMALL_DATA_ADDRESS_P): Likewise. (get_symbol_alignment): New function. (legitimate_small_data_address_p): Likewise. (legitimate_scaled_address): Update, call legitimate_small_data_address_p. (output_sdata): New static variable. (arc_print_operand): Update how we handle small data operands. (arc_print_operand_address): Likewise. (arc_legitimate_address_p): Update, use legitimate_small_data_address_p. (arc_rewrite_small_data_p): Remove. (arc_rewrite_small_data_1): Likewise. (arc_rewrite_small_data): Likewise. (small_data_pattern): Likewise. (compact_sda_memory_operand): Update to use legitimate_small_data_address_p and get_symbol_alignment. (prepare_move_operands): Don't rewite sdata pattern. (prepare_extend_operands): Remove. * config/arc/arc.md (zero_extendqihi2): Don't rewrite sdata pattern. (zero_extendqisi2): Likewise. (zero_extendhisi2): Likewise. (extendqihi2): Likewise. (extendqisi2): Likewise. (extendhisi2): Likewise. (addsi3): Likewise. (subsi3): Likewise. (andsi3): Likewise. * config/arc/constraints.md (Usd): Change it to memory constraint. gcc/testsuite 2018-01-18 Claudiu Zissulescu <claziss@synopsys.com> * gcc.target/arc/interrupt-8.c: Update test. * gcc.target/arc/loop-4.c: Likewise. * gcc.target/arc/loop-hazard-1.c: Likewise. * gcc.target/arc/sdata-3.c: Likewise. From-SVN: r259763
This commit is contained in:
parent
2295aa7522
commit
e0be3321b9
@ -1,3 +1,39 @@
|
||||
2018-04-30 Claudiu Zissulescu <claziss@synopsys.com>
|
||||
|
||||
* config/arc/arc-protos.h (prepare_extend_operands): Remove.
|
||||
(small_data_pattern): Likewise.
|
||||
(arc_rewrite_small_data): Likewise.
|
||||
* config/arc/arc.c (LEGITIMATE_SMALL_DATA_OFFSET_P): Remove.
|
||||
(LEGITIMATE_SMALL_DATA_ADDRESS_P): Likewise.
|
||||
(get_symbol_alignment): New function.
|
||||
(legitimate_small_data_address_p): Likewise.
|
||||
(legitimate_scaled_address): Update, call
|
||||
legitimate_small_data_address_p.
|
||||
(output_sdata): New static variable.
|
||||
(arc_print_operand): Update how we handle small data operands.
|
||||
(arc_print_operand_address): Likewise.
|
||||
(arc_legitimate_address_p): Update, use
|
||||
legitimate_small_data_address_p.
|
||||
(arc_rewrite_small_data_p): Remove.
|
||||
(arc_rewrite_small_data_1): Likewise.
|
||||
(arc_rewrite_small_data): Likewise.
|
||||
(small_data_pattern): Likewise.
|
||||
(compact_sda_memory_operand): Update to use
|
||||
legitimate_small_data_address_p and get_symbol_alignment.
|
||||
(prepare_move_operands): Don't rewite sdata pattern.
|
||||
(prepare_extend_operands): Remove.
|
||||
* config/arc/arc.md (zero_extendqihi2): Don't rewrite sdata
|
||||
pattern.
|
||||
(zero_extendqisi2): Likewise.
|
||||
(zero_extendhisi2): Likewise.
|
||||
(extendqihi2): Likewise.
|
||||
(extendqisi2): Likewise.
|
||||
(extendhisi2): Likewise.
|
||||
(addsi3): Likewise.
|
||||
(subsi3): Likewise.
|
||||
(andsi3): Likewise.
|
||||
* config/arc/constraints.md (Usd): Change it to memory constraint.
|
||||
|
||||
2018-04-30 Claudiu Zissulescu <claziss@synopsys.com>
|
||||
|
||||
* config/arc/arc.c (arc_split_move): Allow signed 6-bit constants
|
||||
|
@ -33,8 +33,6 @@ extern void arc_print_operand (FILE *, rtx, int);
|
||||
extern void arc_print_operand_address (FILE *, rtx);
|
||||
extern void arc_final_prescan_insn (rtx_insn *, rtx *, int);
|
||||
extern const char *arc_output_libcall (const char *);
|
||||
extern bool prepare_extend_operands (rtx *operands, enum rtx_code code,
|
||||
machine_mode omode);
|
||||
extern int arc_output_addsi (rtx *operands, bool, bool);
|
||||
extern int arc_output_commutative_cond_exec (rtx *operands, bool);
|
||||
extern bool arc_expand_movmem (rtx *operands);
|
||||
@ -65,8 +63,6 @@ extern bool arc_raw_symbolic_reference_mentioned_p (rtx, bool);
|
||||
extern bool arc_is_longcall_p (rtx);
|
||||
extern bool arc_is_shortcall_p (rtx);
|
||||
extern bool valid_brcc_with_delay_p (rtx *);
|
||||
extern bool small_data_pattern (rtx , machine_mode);
|
||||
extern rtx arc_rewrite_small_data (rtx);
|
||||
extern bool arc_ccfsm_cond_exec_p (void);
|
||||
struct secondary_reload_info;
|
||||
extern int arc_register_move_cost (machine_mode, enum reg_class,
|
||||
|
@ -96,22 +96,6 @@ HARD_REG_SET overrideregs;
|
||||
? 0 \
|
||||
: -(-GET_MODE_SIZE (MODE) | -4) >> 1)))
|
||||
|
||||
#define LEGITIMATE_SMALL_DATA_OFFSET_P(X) \
|
||||
(GET_CODE (X) == CONST \
|
||||
&& GET_CODE (XEXP ((X), 0)) == PLUS \
|
||||
&& GET_CODE (XEXP (XEXP ((X), 0), 0)) == SYMBOL_REF \
|
||||
&& SYMBOL_REF_SMALL_P (XEXP (XEXP ((X), 0), 0)) \
|
||||
&& GET_CODE (XEXP(XEXP ((X), 0), 1)) == CONST_INT \
|
||||
&& INTVAL (XEXP (XEXP ((X), 0), 1)) <= g_switch_value)
|
||||
|
||||
#define LEGITIMATE_SMALL_DATA_ADDRESS_P(X) \
|
||||
(GET_CODE (X) == PLUS \
|
||||
&& REG_P (XEXP ((X), 0)) \
|
||||
&& REGNO (XEXP ((X), 0)) == SDATA_BASE_REGNUM \
|
||||
&& ((GET_CODE (XEXP ((X), 1)) == SYMBOL_REF \
|
||||
&& SYMBOL_REF_SMALL_P (XEXP ((X), 1))) \
|
||||
|| LEGITIMATE_SMALL_DATA_OFFSET_P (XEXP ((X), 1))))
|
||||
|
||||
/* Array of valid operand punctuation characters. */
|
||||
char arc_punct_chars[256];
|
||||
|
||||
@ -308,6 +292,60 @@ static bool arc_use_by_pieces_infrastructure_p (unsigned HOST_WIDE_INT,
|
||||
/* Globally visible information about currently selected cpu. */
|
||||
const arc_cpu_t *arc_selected_cpu;
|
||||
|
||||
/* Given a symbol RTX (const (symb <+ const_int>), returns its
|
||||
alignment. */
|
||||
|
||||
static int
|
||||
get_symbol_alignment (rtx x)
|
||||
{
|
||||
tree decl = NULL_TREE;
|
||||
int align = 0;
|
||||
|
||||
switch (GET_CODE (x))
|
||||
{
|
||||
case SYMBOL_REF:
|
||||
decl = SYMBOL_REF_DECL (x);
|
||||
break;
|
||||
case CONST:
|
||||
return get_symbol_alignment (XEXP (x, 0));
|
||||
case PLUS:
|
||||
gcc_assert (CONST_INT_P (XEXP (x, 1)));
|
||||
return get_symbol_alignment (XEXP (x, 0));
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (decl)
|
||||
align = DECL_ALIGN (decl);
|
||||
align = align / BITS_PER_UNIT;
|
||||
return align;
|
||||
}
|
||||
|
||||
/* Return true if x is ok to be used as a small data address. */
|
||||
|
||||
static bool
|
||||
legitimate_small_data_address_p (rtx x)
|
||||
{
|
||||
switch (GET_CODE (x))
|
||||
{
|
||||
case CONST:
|
||||
return legitimate_small_data_address_p (XEXP (x, 0));
|
||||
case SYMBOL_REF:
|
||||
return SYMBOL_REF_SMALL_P (x);
|
||||
case PLUS:
|
||||
{
|
||||
bool p0 = (GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
|
||||
&& SYMBOL_REF_SMALL_P (XEXP (x, 0));
|
||||
bool p1 = CONST_INT_P (XEXP (x, 1))
|
||||
&& (INTVAL (XEXP (x, 1)) <= g_switch_value);
|
||||
return p0 && p1;
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/* TRUE if op is an scaled address. */
|
||||
static bool
|
||||
legitimate_scaled_address_p (machine_mode mode, rtx op, bool strict)
|
||||
{
|
||||
@ -352,14 +390,13 @@ legitimate_scaled_address_p (machine_mode mode, rtx op, bool strict)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Scalled addresses for sdata is done other places. */
|
||||
if (legitimate_small_data_address_p (op))
|
||||
return false;
|
||||
|
||||
if (CONSTANT_P (XEXP (op, 1)))
|
||||
{
|
||||
/* Scalled addresses for sdata is done other places. */
|
||||
if (GET_CODE (XEXP (op, 1)) == SYMBOL_REF
|
||||
&& SYMBOL_REF_SMALL_P (XEXP (op, 1)))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -3762,6 +3799,9 @@ arc_add_jli_section (rtx pat)
|
||||
reset when we output the scaled address. */
|
||||
static int output_scaled = 0;
|
||||
|
||||
/* Set when we force sdata output. */
|
||||
static int output_sdata = 0;
|
||||
|
||||
/* Print operand X (an rtx) in assembler syntax to file FILE.
|
||||
CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
|
||||
For `%' followed by punctuation, CODE is the punctuation and X is null. */
|
||||
@ -4114,24 +4154,24 @@ arc_print_operand (FILE *file, rtx x, int code)
|
||||
fputs (".as", file);
|
||||
output_scaled = 1;
|
||||
}
|
||||
else if (LEGITIMATE_SMALL_DATA_ADDRESS_P (addr)
|
||||
&& GET_MODE_SIZE (GET_MODE (x)) > 1)
|
||||
break;
|
||||
case SYMBOL_REF:
|
||||
case CONST:
|
||||
if (legitimate_small_data_address_p (addr)
|
||||
&& GET_MODE_SIZE (GET_MODE (x)) > 1)
|
||||
{
|
||||
tree decl = NULL_TREE;
|
||||
int align = 0;
|
||||
if (GET_CODE (XEXP (addr, 1)) == SYMBOL_REF)
|
||||
decl = SYMBOL_REF_DECL (XEXP (addr, 1));
|
||||
else if (GET_CODE (XEXP (XEXP (XEXP (addr, 1), 0), 0))
|
||||
== SYMBOL_REF)
|
||||
decl = SYMBOL_REF_DECL (XEXP (XEXP (XEXP (addr, 1), 0), 0));
|
||||
if (decl)
|
||||
align = DECL_ALIGN (decl);
|
||||
align = align / BITS_PER_UNIT;
|
||||
if ((GET_MODE_SIZE (GET_MODE (x)) == 2)
|
||||
&& align && ((align & 1) == 0))
|
||||
fputs (".as", file);
|
||||
if ((GET_MODE_SIZE (GET_MODE (x)) >= 4)
|
||||
&& align && ((align & 3) == 0))
|
||||
int align = get_symbol_alignment (addr);
|
||||
int mask = 0;
|
||||
switch (GET_MODE (x))
|
||||
{
|
||||
case E_HImode:
|
||||
mask = 1;
|
||||
break;
|
||||
default:
|
||||
mask = 3;
|
||||
break;
|
||||
}
|
||||
if (align && ((align & mask) == 0))
|
||||
fputs (".as", file);
|
||||
}
|
||||
break;
|
||||
@ -4250,6 +4290,9 @@ arc_print_operand (FILE *file, rtx x, int code)
|
||||
rtx addr = XEXP (x, 0);
|
||||
int size = GET_MODE_SIZE (GET_MODE (x));
|
||||
|
||||
if (legitimate_small_data_address_p (addr))
|
||||
output_sdata = 1;
|
||||
|
||||
fputc ('[', file);
|
||||
|
||||
switch (GET_CODE (addr))
|
||||
@ -4310,26 +4353,7 @@ arc_print_operand (FILE *file, rtx x, int code)
|
||||
|| XINT (XEXP (XEXP (x, 0), 0), 1) == UNSPEC_TLS_GD)))
|
||||
arc_output_pic_addr_const (file, x, code);
|
||||
else
|
||||
{
|
||||
/* FIXME: Dirty way to handle @var@sda+const. Shd be handled
|
||||
with asm_output_symbol_ref */
|
||||
if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS)
|
||||
{
|
||||
x = XEXP (x, 0);
|
||||
output_addr_const (file, XEXP (x, 0));
|
||||
if (GET_CODE (XEXP (x, 0)) == SYMBOL_REF && SYMBOL_REF_SMALL_P (XEXP (x, 0)))
|
||||
fprintf (file, "@sda");
|
||||
|
||||
if (GET_CODE (XEXP (x, 1)) != CONST_INT
|
||||
|| INTVAL (XEXP (x, 1)) >= 0)
|
||||
fprintf (file, "+");
|
||||
output_addr_const (file, XEXP (x, 1));
|
||||
}
|
||||
else
|
||||
output_addr_const (file, x);
|
||||
}
|
||||
if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_SMALL_P (x))
|
||||
fprintf (file, "@sda");
|
||||
output_addr_const (file, x);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -4346,10 +4370,13 @@ arc_print_operand_address (FILE *file , rtx addr)
|
||||
case REG :
|
||||
fputs (reg_names[REGNO (addr)], file);
|
||||
break;
|
||||
case SYMBOL_REF :
|
||||
case SYMBOL_REF:
|
||||
if (output_sdata)
|
||||
fputs ("gp,", file);
|
||||
output_addr_const (file, addr);
|
||||
if (SYMBOL_REF_SMALL_P (addr))
|
||||
fprintf (file, "@sda");
|
||||
if (output_sdata)
|
||||
fputs ("@sda", file);
|
||||
output_sdata = 0;
|
||||
break;
|
||||
case PLUS :
|
||||
if (GET_CODE (XEXP (addr, 0)) == MULT)
|
||||
@ -6170,7 +6197,7 @@ arc_legitimate_address_p (machine_mode mode, rtx x, bool strict)
|
||||
return true;
|
||||
if (legitimate_scaled_address_p (mode, x, strict))
|
||||
return true;
|
||||
if (LEGITIMATE_SMALL_DATA_ADDRESS_P (x))
|
||||
if (legitimate_small_data_address_p (x))
|
||||
return true;
|
||||
if (GET_CODE (x) == CONST_INT && LARGE_INT (INTVAL (x)))
|
||||
return true;
|
||||
@ -7973,98 +8000,9 @@ arc_in_small_data_p (const_tree decl)
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Return true if X is a small data address that can be rewritten
|
||||
as a gp+symref. */
|
||||
|
||||
static bool
|
||||
arc_rewrite_small_data_p (const_rtx x)
|
||||
{
|
||||
if (GET_CODE (x) == CONST)
|
||||
x = XEXP (x, 0);
|
||||
|
||||
if (GET_CODE (x) == PLUS)
|
||||
{
|
||||
if (GET_CODE (XEXP (x, 1)) == CONST_INT)
|
||||
x = XEXP (x, 0);
|
||||
}
|
||||
|
||||
if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_SMALL_P (x))
|
||||
{
|
||||
gcc_assert (SYMBOL_REF_TLS_MODEL (x) == 0);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* If possible, rewrite OP so that it refers to small data using
|
||||
explicit relocations. */
|
||||
|
||||
static rtx
|
||||
arc_rewrite_small_data_1 (rtx op)
|
||||
{
|
||||
rtx rgp = gen_rtx_REG (Pmode, SDATA_BASE_REGNUM);
|
||||
op = copy_insn (op);
|
||||
subrtx_ptr_iterator::array_type array;
|
||||
FOR_EACH_SUBRTX_PTR (iter, array, &op, ALL)
|
||||
{
|
||||
rtx *loc = *iter;
|
||||
if (arc_rewrite_small_data_p (*loc))
|
||||
{
|
||||
*loc = gen_rtx_PLUS (Pmode, rgp, *loc);
|
||||
iter.skip_subrtxes ();
|
||||
}
|
||||
else if (GET_CODE (*loc) == PLUS
|
||||
&& rtx_equal_p (XEXP (*loc, 0), rgp))
|
||||
iter.skip_subrtxes ();
|
||||
}
|
||||
return op;
|
||||
}
|
||||
|
||||
rtx
|
||||
arc_rewrite_small_data (rtx op)
|
||||
{
|
||||
op = arc_rewrite_small_data_1 (op);
|
||||
|
||||
/* Check if we fit small data constraints. */
|
||||
if (MEM_P (op)
|
||||
&& !LEGITIMATE_SMALL_DATA_ADDRESS_P (XEXP (op, 0)))
|
||||
{
|
||||
rtx addr = XEXP (op, 0);
|
||||
rtx tmp = gen_reg_rtx (Pmode);
|
||||
emit_move_insn (tmp, addr);
|
||||
op = replace_equiv_address_nv (op, tmp);
|
||||
}
|
||||
return op;
|
||||
}
|
||||
|
||||
/* Return true if OP refers to small data symbols directly, not through
|
||||
a PLUS. */
|
||||
|
||||
bool
|
||||
small_data_pattern (rtx op, machine_mode)
|
||||
{
|
||||
if (GET_CODE (op) == SEQUENCE)
|
||||
return false;
|
||||
|
||||
rtx rgp = gen_rtx_REG (Pmode, SDATA_BASE_REGNUM);
|
||||
subrtx_iterator::array_type array;
|
||||
FOR_EACH_SUBRTX (iter, array, op, ALL)
|
||||
{
|
||||
const_rtx x = *iter;
|
||||
if (GET_CODE (x) == PLUS
|
||||
&& rtx_equal_p (XEXP (x, 0), rgp))
|
||||
iter.skip_subrtxes ();
|
||||
else if (arc_rewrite_small_data_p (x))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Return true if OP is an acceptable memory operand for ARCompact
|
||||
16-bit gp-relative load instructions.
|
||||
op shd look like : [r26, symref@sda]
|
||||
i.e. (mem (plus (reg 26) (symref with smalldata flag set))
|
||||
*/
|
||||
*/
|
||||
/* volatile cache option still to be handled. */
|
||||
|
||||
bool
|
||||
@ -8072,7 +8010,6 @@ compact_sda_memory_operand (rtx op, machine_mode mode, bool short_p)
|
||||
{
|
||||
rtx addr;
|
||||
int size;
|
||||
tree decl = NULL_TREE;
|
||||
int align = 0;
|
||||
int mask = 0;
|
||||
|
||||
@ -8092,7 +8029,7 @@ compact_sda_memory_operand (rtx op, machine_mode mode, bool short_p)
|
||||
/* Decode the address now. */
|
||||
addr = XEXP (op, 0);
|
||||
|
||||
if (!LEGITIMATE_SMALL_DATA_ADDRESS_P (addr))
|
||||
if (!legitimate_small_data_address_p (addr))
|
||||
return false;
|
||||
|
||||
if (!short_p || size == 1)
|
||||
@ -8100,14 +8037,7 @@ compact_sda_memory_operand (rtx op, machine_mode mode, bool short_p)
|
||||
|
||||
/* Now check for the alignment, the short loads using gp require the
|
||||
addresses to be aligned. */
|
||||
if (GET_CODE (XEXP (addr, 1)) == SYMBOL_REF)
|
||||
decl = SYMBOL_REF_DECL (XEXP (addr, 1));
|
||||
else if (GET_CODE (XEXP (XEXP (XEXP (addr, 1), 0), 0)) == SYMBOL_REF)
|
||||
decl = SYMBOL_REF_DECL (XEXP (XEXP (XEXP (addr, 1), 0), 0));
|
||||
if (decl)
|
||||
align = DECL_ALIGN (decl);
|
||||
align = align / BITS_PER_UNIT;
|
||||
|
||||
align = get_symbol_alignment (addr);
|
||||
switch (mode)
|
||||
{
|
||||
case E_HImode:
|
||||
@ -8581,11 +8511,6 @@ prepare_move_operands (rtx *operands, machine_mode mode)
|
||||
}
|
||||
}
|
||||
|
||||
/* We used to do this only for MODE_INT Modes, but addresses to floating
|
||||
point variables may well be in the small data section. */
|
||||
if (!TARGET_NO_SDATA_SET && small_data_pattern (operands[0], Pmode))
|
||||
operands[0] = arc_rewrite_small_data (operands[0]);
|
||||
|
||||
if (mode == SImode && SYMBOLIC_CONST (operands[1]))
|
||||
{
|
||||
prepare_pic_move (operands, SImode);
|
||||
@ -8595,29 +8520,6 @@ prepare_move_operands (rtx *operands, machine_mode mode)
|
||||
here and references the variable directly. */
|
||||
}
|
||||
|
||||
if (GET_CODE (operands[0]) != MEM
|
||||
&& !TARGET_NO_SDATA_SET
|
||||
&& small_data_pattern (operands[1], Pmode))
|
||||
{
|
||||
/* This is to take care of address calculations involving sdata
|
||||
variables. */
|
||||
operands[1] = arc_rewrite_small_data (operands[1]);
|
||||
|
||||
emit_insn (gen_rtx_SET (operands[0],operands[1]));
|
||||
/* ??? This note is useless, since it only restates the set itself.
|
||||
We should rather use the original SYMBOL_REF. However, there is
|
||||
the problem that we are lying to the compiler about these
|
||||
SYMBOL_REFs to start with. symbol@sda should be encoded specially
|
||||
so that we can tell it apart from an actual symbol. */
|
||||
set_unique_reg_note (get_last_insn (), REG_EQUAL, operands[1]);
|
||||
|
||||
/* Take care of the REG_EQUAL note that will be attached to mark the
|
||||
output reg equal to the initial symbol_ref after this code is
|
||||
executed. */
|
||||
emit_move_insn (operands[0], operands[0]);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (MEM_P (operands[0])
|
||||
&& !(reload_in_progress || reload_completed))
|
||||
{
|
||||
@ -8661,31 +8563,6 @@ prepare_move_operands (rtx *operands, machine_mode mode)
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Prepare OPERANDS for an extension using CODE to OMODE.
|
||||
Return true iff the move has been emitted. */
|
||||
|
||||
bool
|
||||
prepare_extend_operands (rtx *operands, enum rtx_code code,
|
||||
machine_mode omode)
|
||||
{
|
||||
if (!TARGET_NO_SDATA_SET && small_data_pattern (operands[1], Pmode))
|
||||
{
|
||||
/* This is to take care of address calculations involving sdata
|
||||
variables. */
|
||||
operands[1]
|
||||
= gen_rtx_fmt_e (code, omode, arc_rewrite_small_data (operands[1]));
|
||||
emit_insn (gen_rtx_SET (operands[0], operands[1]));
|
||||
set_unique_reg_note (get_last_insn (), REG_EQUAL, operands[1]);
|
||||
|
||||
/* Take care of the REG_EQUAL note that will be attached to mark the
|
||||
output reg equal to the initial extension after this code is
|
||||
executed. */
|
||||
emit_move_insn (operands[0], operands[0]);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Output a library call to a function called FNAME that has been arranged
|
||||
to be local to any dso. */
|
||||
|
||||
|
@ -1755,7 +1755,7 @@
|
||||
[(set (match_operand:HI 0 "dest_reg_operand" "")
|
||||
(zero_extend:HI (match_operand:QI 1 "nonvol_nonimm_operand" "")))]
|
||||
""
|
||||
"if (prepare_extend_operands (operands, ZERO_EXTEND, HImode)) DONE;"
|
||||
""
|
||||
)
|
||||
|
||||
(define_insn "*zero_extendqisi2_ac"
|
||||
@ -1779,7 +1779,7 @@
|
||||
[(set (match_operand:SI 0 "dest_reg_operand" "")
|
||||
(zero_extend:SI (match_operand:QI 1 "nonvol_nonimm_operand" "")))]
|
||||
""
|
||||
"if (prepare_extend_operands (operands, ZERO_EXTEND, SImode)) DONE;"
|
||||
""
|
||||
)
|
||||
|
||||
(define_insn "*zero_extendhisi2_i"
|
||||
@ -1804,7 +1804,7 @@
|
||||
[(set (match_operand:SI 0 "dest_reg_operand" "")
|
||||
(zero_extend:SI (match_operand:HI 1 "nonvol_nonimm_operand" "")))]
|
||||
""
|
||||
"if (prepare_extend_operands (operands, ZERO_EXTEND, SImode)) DONE;"
|
||||
""
|
||||
)
|
||||
|
||||
;; Sign extension instructions.
|
||||
@ -1827,7 +1827,7 @@
|
||||
[(set (match_operand:HI 0 "dest_reg_operand" "")
|
||||
(sign_extend:HI (match_operand:QI 1 "nonvol_nonimm_operand" "")))]
|
||||
""
|
||||
"if (prepare_extend_operands (operands, SIGN_EXTEND, HImode)) DONE;"
|
||||
""
|
||||
)
|
||||
|
||||
(define_insn "*extendqisi2_ac"
|
||||
@ -1847,7 +1847,7 @@
|
||||
[(set (match_operand:SI 0 "dest_reg_operand" "")
|
||||
(sign_extend:SI (match_operand:QI 1 "nonvol_nonimm_operand" "")))]
|
||||
""
|
||||
"if (prepare_extend_operands (operands, SIGN_EXTEND, SImode)) DONE;"
|
||||
""
|
||||
)
|
||||
|
||||
(define_insn "*extendhisi2_i"
|
||||
@ -1868,7 +1868,7 @@
|
||||
[(set (match_operand:SI 0 "dest_reg_operand" "")
|
||||
(sign_extend:SI (match_operand:HI 1 "nonvol_nonimm_operand" "")))]
|
||||
""
|
||||
"if (prepare_extend_operands (operands, SIGN_EXTEND, SImode)) DONE;"
|
||||
""
|
||||
)
|
||||
|
||||
;; Unary arithmetic insns
|
||||
@ -2761,11 +2761,6 @@
|
||||
{
|
||||
operands[2]=force_reg(SImode, operands[2]);
|
||||
}
|
||||
else if (!TARGET_NO_SDATA_SET && small_data_pattern (operands[2], Pmode))
|
||||
{
|
||||
operands[2] = force_reg (SImode, arc_rewrite_small_data (operands[2]));
|
||||
}
|
||||
|
||||
")
|
||||
|
||||
(define_expand "adddi3"
|
||||
@ -2969,8 +2964,6 @@
|
||||
}
|
||||
if (flag_pic && arc_raw_symbolic_reference_mentioned_p (operands[c], false))
|
||||
operands[c] = force_reg (SImode, operands[c]);
|
||||
else if (!TARGET_NO_SDATA_SET && small_data_pattern (operands[c], Pmode))
|
||||
operands[c] = force_reg (SImode, arc_rewrite_small_data (operands[c]));
|
||||
}")
|
||||
|
||||
; the casesi expander might generate a sub of zero, so we have to recognize it.
|
||||
@ -3326,8 +3319,7 @@
|
||||
""
|
||||
"if (!satisfies_constraint_Cux (operands[2]))
|
||||
operands[1] = force_reg (SImode, operands[1]);
|
||||
else if (!TARGET_NO_SDATA_SET && small_data_pattern (operands[1], Pmode))
|
||||
operands[1] = arc_rewrite_small_data (operands[1]);")
|
||||
")
|
||||
|
||||
(define_insn "andsi3_i"
|
||||
[(set (match_operand:SI 0 "dest_reg_operand" "=Rcqq,Rcq,Rcqq,Rcqq,Rcqq,Rcw,Rcw, Rcw,Rcw,Rcw,Rcw, w, w, w, w,Rrq,w,Rcw, w,W")
|
||||
|
@ -347,11 +347,7 @@
|
||||
(match_test "!cmem_address (XEXP (op, 0), SImode)")
|
||||
(not (match_operand 0 "long_immediate_loadstore_operand"))))
|
||||
|
||||
; Don't use define_memory_constraint here as the relocation patching
|
||||
; for small data symbols only works within a ld/st instruction and
|
||||
; define_memory_constraint may result in the address being calculated
|
||||
; into a register first.
|
||||
(define_constraint "Usd"
|
||||
(define_memory_constraint "Usd"
|
||||
"@internal
|
||||
A valid _small-data_ memory operand for ARCompact instructions"
|
||||
(and (match_code "mem")
|
||||
|
@ -1,3 +1,10 @@
|
||||
2018-04-30 Claudiu Zissulescu <claziss@synopsys.com>
|
||||
|
||||
* gcc.target/arc/interrupt-8.c: Update test.
|
||||
* gcc.target/arc/loop-4.c: Likewise.
|
||||
* gcc.target/arc/loop-hazard-1.c: Likewise.
|
||||
* gcc.target/arc/sdata-3.c: Likewise.
|
||||
|
||||
2018-04-30 Claudiu Zissulescu <claziss@synopsys.com>
|
||||
|
||||
* gcc.target/arc/store-merge-1.c: New test.
|
||||
|
@ -2,8 +2,7 @@
|
||||
/* { dg-skip-if "Not available for ARCv1" { arc700 || arc6xx } } */
|
||||
/* { dg-options "-O2 -mirq-ctrl-saved=r0-r17" } */
|
||||
|
||||
/* Check if the registers R0-R17 are automatically saved. GP is saved
|
||||
by the compiler. */
|
||||
/* Check if the registers R0-R17 are automatically saved. */
|
||||
|
||||
int a;
|
||||
|
||||
@ -18,8 +17,6 @@ foo(void)
|
||||
/* { dg-final { scan-assembler-not "st.*r14,\\\[sp" } } */
|
||||
/* { dg-final { scan-assembler-not "st.*r15,\\\[sp" } } */
|
||||
/* { dg-final { scan-assembler-not "st.*r16,\\\[sp" } } */
|
||||
/* { dg-final { scan-assembler "st.*gp,\\\[sp,-4\\\]" } } */
|
||||
/* { dg-final { scan-assembler "ld.*gp,\\\[sp\\\]" } } */
|
||||
/* { dg-final { scan-assembler-not "st.*r0,\\\[sp" } } */
|
||||
/* { dg-final { scan-assembler-not "st.*r1,\\\[sp" } } */
|
||||
/* { dg-final { scan-assembler-not "st.*r2,\\\[sp" } } */
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* { dg-do assemble } */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-Os" } */
|
||||
/* { dg-options "-Os -fbranch-count-reg" } */
|
||||
|
||||
|
||||
void fn1(void *p1, int p2, int p3)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-Os" } */
|
||||
/* { dg-options "-Os -fbranch-count-reg" } */
|
||||
|
||||
/* This caused an assertion within arc_loop_hazard. */
|
||||
|
||||
|
@ -10,9 +10,13 @@ short g_c;
|
||||
char g_d;
|
||||
|
||||
#define TEST(name, optype) \
|
||||
void test_ ## name (optype x) \
|
||||
optype testLD_ ## name (optype x) \
|
||||
{ \
|
||||
g_ ## name += x; \
|
||||
return g_ ## name + x; \
|
||||
} \
|
||||
void testST_ ## name (optype x) \
|
||||
{ \
|
||||
g_ ## name = x; \
|
||||
}
|
||||
|
||||
TEST (a, int)
|
||||
|
Loading…
Reference in New Issue
Block a user