summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>2009-03-27 22:25:36 +0000
committerhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>2009-03-27 22:25:36 +0000
commit9680c84645b5b058a2d00533e064ff6d9666f5b1 (patch)
treed0ee34c1b25d930f18a8d86229603462b5336bcc /gcc
parent0e4d11dfc8b6d80624a799ab2f2f6c5ada1f457e (diff)
downloadgcc-9680c84645b5b058a2d00533e064ff6d9666f5b1.tar.gz
2009-03-27 H.J. Lu <hongjiu.lu@intel.com>
* jump.c (rtx_renumbered_equal_p): Use subreg_get_info. (true_regnum): Likewise. * rtlanal.c (subreg_info): Moved to ... * rtl.h (subreg_info): Here. New. (subreg_get_info): New. * rtlanal.c (subreg_get_info): Make it extern. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145134 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/jump.c45
-rw-r--r--gcc/rtl.h16
-rw-r--r--gcc/rtlanal.c17
4 files changed, 50 insertions, 39 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d874d24670a..f4da0b99375 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,16 @@
2009-03-27 H.J. Lu <hongjiu.lu@intel.com>
+ * jump.c (rtx_renumbered_equal_p): Use subreg_get_info.
+ (true_regnum): Likewise.
+
+ * rtlanal.c (subreg_info): Moved to ...
+ * rtl.h (subreg_info): Here. New.
+ (subreg_get_info): New.
+
+ * rtlanal.c (subreg_get_info): Make it extern.
+
+2009-03-27 H.J. Lu <hongjiu.lu@intel.com>
+
PR target/39472
* config/i386/i386.c (ix86_abi): New.
(override_options): Handle -mabi=.
diff --git a/gcc/jump.c b/gcc/jump.c
index 2b9a9545223..1189f812fef 100644
--- a/gcc/jump.c
+++ b/gcc/jump.c
@@ -1536,6 +1536,7 @@ rtx_renumbered_equal_p (const_rtx x, const_rtx y)
{
int reg_x = -1, reg_y = -1;
int byte_x = 0, byte_y = 0;
+ struct subreg_info info;
if (GET_MODE (x) != GET_MODE (y))
return 0;
@@ -1552,15 +1553,12 @@ rtx_renumbered_equal_p (const_rtx x, const_rtx y)
if (reg_renumber[reg_x] >= 0)
{
- if (!subreg_offset_representable_p (reg_renumber[reg_x],
- GET_MODE (SUBREG_REG (x)),
- byte_x,
- GET_MODE (x)))
+ subreg_get_info (reg_renumber[reg_x],
+ GET_MODE (SUBREG_REG (x)), byte_x,
+ GET_MODE (x), &info);
+ if (!info.representable_p)
return 0;
- reg_x = subreg_regno_offset (reg_renumber[reg_x],
- GET_MODE (SUBREG_REG (x)),
- byte_x,
- GET_MODE (x));
+ reg_x = info.offset;
byte_x = 0;
}
}
@@ -1578,15 +1576,12 @@ rtx_renumbered_equal_p (const_rtx x, const_rtx y)
if (reg_renumber[reg_y] >= 0)
{
- if (!subreg_offset_representable_p (reg_renumber[reg_y],
- GET_MODE (SUBREG_REG (y)),
- byte_y,
- GET_MODE (y)))
+ subreg_get_info (reg_renumber[reg_y],
+ GET_MODE (SUBREG_REG (y)), byte_y,
+ GET_MODE (y), &info);
+ if (!info.representable_p)
return 0;
- reg_y = subreg_regno_offset (reg_renumber[reg_y],
- GET_MODE (SUBREG_REG (y)),
- byte_y,
- GET_MODE (y));
+ reg_y = info.offset;
byte_y = 0;
}
}
@@ -1728,13 +1723,17 @@ true_regnum (const_rtx x)
{
int base = true_regnum (SUBREG_REG (x));
if (base >= 0
- && base < FIRST_PSEUDO_REGISTER
- && subreg_offset_representable_p (REGNO (SUBREG_REG (x)),
- GET_MODE (SUBREG_REG (x)),
- SUBREG_BYTE (x), GET_MODE (x)))
- return base + subreg_regno_offset (REGNO (SUBREG_REG (x)),
- GET_MODE (SUBREG_REG (x)),
- SUBREG_BYTE (x), GET_MODE (x));
+ && base < FIRST_PSEUDO_REGISTER)
+ {
+ struct subreg_info info;
+
+ subreg_get_info (REGNO (SUBREG_REG (x)),
+ GET_MODE (SUBREG_REG (x)),
+ SUBREG_BYTE (x), GET_MODE (x), &info);
+
+ if (info.representable_p)
+ return base + info.offset;
+ }
}
return -1;
}
diff --git a/gcc/rtl.h b/gcc/rtl.h
index e8d42c8cc61..bdb41d62b55 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1806,6 +1806,22 @@ extern rtx canonicalize_condition (rtx, rtx, int, rtx *, rtx, int, int);
being made. */
extern rtx get_condition (rtx, rtx *, int, int);
+/* Information about a subreg of a hard register. */
+struct subreg_info
+{
+ /* Offset of first hard register involved in the subreg. */
+ int offset;
+ /* Number of hard registers involved in the subreg. */
+ int nregs;
+ /* Whether this subreg can be represented as a hard reg with the new
+ mode. */
+ bool representable_p;
+};
+
+extern void subreg_get_info (unsigned int, enum machine_mode,
+ unsigned int, enum machine_mode,
+ struct subreg_info *);
+
/* lists.c */
extern void free_EXPR_LIST_list (rtx *);
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
index b35d774859c..73d3b08d940 100644
--- a/gcc/rtlanal.c
+++ b/gcc/rtlanal.c
@@ -39,18 +39,6 @@ along with GCC; see the file COPYING3. If not see
#include "df.h"
#include "tree.h"
-/* Information about a subreg of a hard register. */
-struct subreg_info
-{
- /* Offset of first hard register involved in the subreg. */
- int offset;
- /* Number of hard registers involved in the subreg. */
- int nregs;
- /* Whether this subreg can be represented as a hard reg with the new
- mode. */
- bool representable_p;
-};
-
/* Forward declarations */
static void set_of_1 (rtx, const_rtx, void *);
static bool covers_regno_p (const_rtx, unsigned int);
@@ -58,9 +46,6 @@ static bool covers_regno_no_parallel_p (const_rtx, unsigned int);
static int rtx_referenced_p_1 (rtx *, void *);
static int computed_jump_p_1 (const_rtx);
static void parms_set (rtx, const_rtx, void *);
-static void subreg_get_info (unsigned int, enum machine_mode,
- unsigned int, enum machine_mode,
- struct subreg_info *);
static unsigned HOST_WIDE_INT cached_nonzero_bits (const_rtx, enum machine_mode,
const_rtx, enum machine_mode,
@@ -3090,7 +3075,7 @@ subreg_lsb (const_rtx x)
offset - The byte offset.
ymode - The mode of a top level SUBREG (or what may become one).
info - Pointer to structure to fill in. */
-static void
+void
subreg_get_info (unsigned int xregno, enum machine_mode xmode,
unsigned int offset, enum machine_mode ymode,
struct subreg_info *info)