[gcc(refs/users/guojiufu/heads/guojiufu-branch)] arc: Update legitimate small data address.
Jiu Fu Guo
guojiufu@gcc.gnu.org
Wed Mar 11 02:29:27 GMT 2020
https://gcc.gnu.org/g:02ae0e08a93f41022d1584054cf6111548c0d954
commit 02ae0e08a93f41022d1584054cf6111548c0d954
Author: Claudiu Zissulescu <claziss@gmail.com>
Date: Tue Mar 3 10:34:50 2020 +0200
arc: Update legitimate small data address.
All ARC's small data adressing is using address scaling feature of the
load/store instructions (i.e., the address is made of a general
pointer plus a shifted offset. The shift amount depends on the
addressing mode). This patch is checking the offset of an address if
it fits the scalled constraint. If so, a small data access is
generated. This patch fixes execute' pr93249 failure.
gcc/
xxxx-xx-xx Claudiu Zissulescu <claziss@synopsys.com>
* config/arc/arc.c (leigitimate_small_data_address_p): Check if an
address has an offset which fits the scalling constraint for a
load/store operation.
(legitimate_scaled_address_p): Update use
leigitimate_small_data_address_p.
(arc_print_operand): Likewise.
(arc_legitimate_address_p): Likewise.
(legitimate_small_data_address_p): Likewise.
Signed-off-by: Claudiu Zissulescu <claziss@gmail.com>
Diff:
---
gcc/ChangeLog | 11 +++++++++++
gcc/config/arc/arc.c | 36 ++++++++++++++++++++++++++----------
2 files changed, 37 insertions(+), 10 deletions(-)
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 25e90e9b5f4..ef5c7a170b4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2020-03-03 Claudiu Zissulescu <claziss@synopsys.com>
+
+ * config/arc/arc.c (leigitimate_small_data_address_p): Check if an
+ address has an offset which fits the scalling constraint for a
+ load/store operation.
+ (legitimate_scaled_address_p): Update use
+ leigitimate_small_data_address_p.
+ (arc_print_operand): Likewise.
+ (arc_legitimate_address_p): Likewise.
+ (legitimate_small_data_address_p): Likewise.
+
2020-03-03 Claudiu Zissulescu <claziss@synopsys.com>
* config/arc/arc.md (fmasf4_fpu): Use accl_operand predicate.
diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
index fe9077ab665..c98bd6cc05b 100644
--- a/gcc/config/arc/arc.c
+++ b/gcc/config/arc/arc.c
@@ -463,21 +463,37 @@ get_symbol_alignment (rtx x)
/* Return true if x is ok to be used as a small data address. */
static bool
-legitimate_small_data_address_p (rtx x)
+legitimate_small_data_address_p (rtx x, machine_mode mode)
{
switch (GET_CODE (x))
{
case CONST:
- return legitimate_small_data_address_p (XEXP (x, 0));
+ return legitimate_small_data_address_p (XEXP (x, 0), mode);
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;
+
+ /* If no constant then we cannot do small data. */
+ if (!CONST_INT_P (XEXP (x, 1)))
+ return false;
+
+ /* Small data relocs works with scalled addresses, check if
+ the immediate fits the requirements. */
+ switch (GET_MODE_SIZE (mode))
+ {
+ case 1:
+ return p0;
+ case 2:
+ return p0 && ((INTVAL (XEXP (x, 1)) & 0x1) == 0);
+ case 4:
+ case 8:
+ return p0 && ((INTVAL (XEXP (x, 1)) & 0x3) == 0);
+ default:
+ return false;
+ }
}
default:
return false;
@@ -531,7 +547,7 @@ legitimate_scaled_address_p (machine_mode mode, rtx op, bool strict)
}
/* Scalled addresses for sdata is done other places. */
- if (legitimate_small_data_address_p (op))
+ if (legitimate_small_data_address_p (op, mode))
return false;
if (CONSTANT_P (XEXP (op, 1)))
@@ -4810,7 +4826,7 @@ arc_print_operand (FILE *file, rtx x, int code)
break;
case SYMBOL_REF:
case CONST:
- if (legitimate_small_data_address_p (addr)
+ if (legitimate_small_data_address_p (addr, GET_MODE (x))
&& GET_MODE_SIZE (GET_MODE (x)) > 1)
{
int align = get_symbol_alignment (addr);
@@ -4943,7 +4959,7 @@ 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))
+ if (legitimate_small_data_address_p (addr, GET_MODE (x)))
output_sdata = 1;
fputc ('[', file);
@@ -6701,7 +6717,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, mode))
return true;
if (GET_CODE (x) == CONST_INT && LARGE_INT (INTVAL (x)))
return true;
@@ -8748,7 +8764,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, mode))
return false;
if (!short_p || size == 1)
More information about the Gcc-cvs
mailing list