+2019-04-16 Claudiu Zissulescu <claziss@synopsys.com>
+
+ * config/arc/arc-protos.h (arc_register_move_cost): Remove.
+ * config/arc/arc.c (arc_register_move_cost): Re-purpose it to
+ implement target hook.
+ (arc_memory_move_cost): New function.
+ (TARGET_REGISTER_MOVE_COST): Define.
+ (TARGET_MEMORY_MOVE_COST): Likewise.
+ * config/arc/arc.h (REGISTER_MOVE_COST): Remove.
+ (MEMORY_MOVE_COST): Likewise.
+
2019-04-16 Claudiu Zissulescu <claziss@synopsys.com>
* config/arc/arc.md (sibcall_insn): Use Rcd constraint.
extern bool valid_brcc_with_delay_p (rtx *);
extern bool arc_ccfsm_cond_exec_p (void);
struct secondary_reload_info;
-extern int arc_register_move_cost (machine_mode, enum reg_class,
- enum reg_class);
extern rtx disi_highpart (rtx);
extern int arc_adjust_insn_length (rtx_insn *, int, bool);
extern int arc_corereg_hazard (rtx, rtx);
&& !((INTVAL (XEXP (in, 1)) & 511)));
}
-int
+/* Implement TARGET_REGISTER_MOVE_COST. */
+
+static int
arc_register_move_cost (machine_mode,
- enum reg_class from_class, enum reg_class to_class)
+ reg_class_t from_class, reg_class_t to_class)
{
/* Force an attempt to 'mov Dy,Dx' to spill. */
if ((TARGET_ARC700 || TARGET_EM) && TARGET_DPFP
memcpy (reg_alloc_order, size_alloc_order, sizeof (size_alloc_order));
}
+/* Implement TARGET_MEMORY_MOVE_COST. */
+
+static int
+arc_memory_move_cost (machine_mode mode,
+ reg_class_t rclass ATTRIBUTE_UNUSED,
+ bool in ATTRIBUTE_UNUSED)
+{
+ if ((GET_MODE_SIZE (mode) <= UNITS_PER_WORD)
+ || ((GET_MODE_SIZE (mode) <= UNITS_PER_WORD * 2) && TARGET_LL64))
+ return 6;
+
+ return (2 * GET_MODE_SIZE (mode));
+}
+
#undef TARGET_USE_ANCHORS_FOR_SYMBOL_P
#define TARGET_USE_ANCHORS_FOR_SYMBOL_P arc_use_anchors_for_symbol_p
#undef TARGET_HAVE_SPECULATION_SAFE_VALUE
#define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed
+#undef TARGET_REGISTER_MOVE_COST
+#define TARGET_REGISTER_MOVE_COST arc_register_move_cost
+
+#undef TARGET_MEMORY_MOVE_COST
+#define TARGET_MEMORY_MOVE_COST arc_memory_move_cost
+
struct gcc_target targetm = TARGET_INITIALIZER;
#include "gt-arc.h"
/* Costs. */
-/* Compute extra cost of moving data between one register class
- and another. */
-#define REGISTER_MOVE_COST(MODE, CLASS, TO_CLASS) \
- arc_register_move_cost ((MODE), (CLASS), (TO_CLASS))
-
-/* Compute the cost of moving data between registers and memory. */
-/* Memory is 3 times as expensive as registers.
- ??? Is that the right way to look at it? */
-#define MEMORY_MOVE_COST(MODE,CLASS,IN) \
-(GET_MODE_SIZE (MODE) <= UNITS_PER_WORD ? 6 : 12)
-
/* The cost of a branch insn. */
/* ??? What's the right value here? Branches are certainly more
expensive than reg->reg moves. */