Index: gcc/gcc/config/crx/crx.c |
diff --git a/gcc/gcc/config/crx/crx.c b/gcc/gcc/config/crx/crx.c |
index 6f10afd2e5f27f0d127bf2e9f46d59f25bfa5a28..a0b43a4aa18cda2b90e41f6ed1633acde8eded20 100644 |
--- a/gcc/gcc/config/crx/crx.c |
+++ b/gcc/gcc/config/crx/crx.c |
@@ -1,6 +1,7 @@ |
/* Output routines for GCC for CRX. |
Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, |
- 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. |
+ 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 |
+ Free Software Foundation, Inc. |
This file is part of GCC. |
@@ -45,6 +46,7 @@ |
#include "optabs.h" |
#include "toplev.h" |
#include "basic-block.h" |
+#include "df.h" |
#include "target.h" |
#include "target-def.h" |
@@ -118,17 +120,6 @@ static int size_for_adjusting_sp; |
static enum machine_mode output_memory_reference_mode; |
/*****************************************************************************/ |
-/* GLOBAL VARIABLES */ |
-/*****************************************************************************/ |
- |
-/* Table of machine attributes. */ |
-const struct attribute_spec crx_attribute_table[]; |
- |
-/* Test and compare insns use these globals to generate branch insns. */ |
-rtx crx_compare_op0 = NULL_RTX; |
-rtx crx_compare_op1 = NULL_RTX; |
- |
-/*****************************************************************************/ |
/* TARGETM FUNCTION PROTOTYPES */ |
/*****************************************************************************/ |
@@ -137,6 +128,18 @@ static rtx crx_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED, |
int incoming ATTRIBUTE_UNUSED); |
static bool crx_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED); |
static int crx_address_cost (rtx, bool); |
+static bool crx_legitimate_address_p (enum machine_mode, rtx, bool); |
+static bool crx_can_eliminate (const int, const int); |
+ |
+/*****************************************************************************/ |
+/* RTL VALIDITY */ |
+/*****************************************************************************/ |
+ |
+#undef TARGET_LEGITIMATE_ADDRESS_P |
+#define TARGET_LEGITIMATE_ADDRESS_P crx_legitimate_address_p |
+ |
+#undef TARGET_CAN_ELIMINATE |
+#define TARGET_CAN_ELIMINATE crx_can_eliminate |
/*****************************************************************************/ |
/* STACK LAYOUT AND CALLING CONVENTIONS */ |
@@ -165,7 +168,7 @@ static int crx_address_cost (rtx, bool); |
#undef TARGET_ATTRIBUTE_TABLE |
#define TARGET_ATTRIBUTE_TABLE crx_attribute_table |
-const struct attribute_spec crx_attribute_table[] = { |
+static const struct attribute_spec crx_attribute_table[] = { |
/* ISRs have special prologue and epilogue requirements. */ |
{"interrupt", 0, 0, false, true, true, NULL}, |
{NULL, 0, 0, false, false, false, NULL} |
@@ -321,6 +324,14 @@ crx_compute_frame (void) |
crtl->outgoing_args_size : 0); |
} |
+/* Worker function for TARGET_CAN_ELIMINATE. */ |
+ |
+bool |
+crx_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to) |
+{ |
+ return (to == STACK_POINTER_REGNUM ? ! frame_pointer_needed : true); |
+} |
+ |
/* Implements the macro INITIAL_ELIMINATION_OFFSET, return the OFFSET. */ |
int |
@@ -541,7 +552,7 @@ crx_function_arg_regno_p (int n) |
/* ADDRESSING MODES */ |
/* ---------------- */ |
-/* Implements the macro GO_IF_LEGITIMATE_ADDRESS defined in crx.h. |
+/* Implements the hook for TARGET_LEGITIMATE_ADDRESS_P defined in crx.h. |
* The following addressing modes are supported on CRX: |
* |
* Relocations --> const | symbol_ref | label_ref |
@@ -726,9 +737,9 @@ crx_decompose_address (rtx addr, struct crx_address *out) |
return retval; |
} |
-int |
+bool |
crx_legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED, |
- rtx addr, int strict) |
+ rtx addr, bool strict) |
{ |
enum crx_addrtype addrtype; |
struct crx_address address; |
@@ -1217,43 +1228,6 @@ crx_expand_movmem (rtx dstbase, rtx srcbase, rtx count_exp, rtx align_exp) |
return 1; |
} |
-rtx |
-crx_expand_compare (enum rtx_code code, enum machine_mode mode) |
-{ |
- rtx op0, op1, cc_reg, ret; |
- |
- op0 = crx_compare_op0; |
- op1 = crx_compare_op1; |
- |
- /* Emit the compare that writes into CC_REGNUM) */ |
- cc_reg = gen_rtx_REG (CCmode, CC_REGNUM); |
- ret = gen_rtx_COMPARE (CCmode, op0, op1); |
- emit_insn (gen_rtx_SET (VOIDmode, cc_reg, ret)); |
- /* debug_rtx (get_last_insn ()); */ |
- |
- /* Return the rtx for using the result in CC_REGNUM */ |
- return gen_rtx_fmt_ee (code, mode, cc_reg, const0_rtx); |
-} |
- |
-void |
-crx_expand_branch (enum rtx_code code, rtx label) |
-{ |
- rtx tmp = crx_expand_compare (code, VOIDmode); |
- tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp, |
- gen_rtx_LABEL_REF (VOIDmode, label), |
- pc_rtx); |
- emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp)); |
- /* debug_rtx (get_last_insn ()); */ |
-} |
- |
-void |
-crx_expand_scond (enum rtx_code code, rtx dest) |
-{ |
- rtx tmp = crx_expand_compare (code, GET_MODE (dest)); |
- emit_move_insn (dest, tmp); |
- /* debug_rtx (get_last_insn ()); */ |
-} |
- |
static void |
mpushpop_str (char *stringbuffer, const char *mnemonic, char *mask) |
{ |
@@ -1468,4 +1442,3 @@ crx_expand_epilogue (void) |
else |
emit_jump_insn (gen_pop_and_popret_return (GEN_INT (sum_regs))); |
} |
- |