+2004-03-06 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/ns32k/ns32k-protos.h: Add a prototype for
+ ns32k_notice_update_cc.
+ * config/ns32k/ns32k.c (ns32k_notice_update_cc): New.
+ * config/ns32k/ns32k.h (NOTICE_UPDATE_CC): Call
+ ns32k_notice_update_cc.
+
2004-03-06 Ulrich Weigand <uweigand@de.ibm.com>
* config/s390/s390.md ("load_multiple", "*load_multiple_di",
extern const char *output_move_double (rtx *);
extern const char *output_shift_insn (rtx *);
extern int symbolic_reference_mentioned_p (rtx);
+extern void ns32k_notice_update_cc (rtx, rtx);
#endif /* RTX_CODE */
#ifdef TREE_CODE
{
return gen_rtx_REG (Pmode, NS32K_STRUCT_VALUE_REGNUM);
}
+
+/* Worker function for NOTICE_UPDATE_CC. */
+
+void
+ns32k_notice_update_cc (rtx exp, rtx insn ATTRIBUTE_UNUSED)
+{
+ if (GET_CODE (exp) == SET)
+ {
+ if (GET_CODE (SET_DEST (exp)) == CC0)
+ {
+ cc_status.flags = 0;
+ cc_status.value1 = SET_DEST (exp);
+ cc_status.value2 = SET_SRC (exp);
+ }
+ else if (GET_CODE (SET_SRC (exp)) == CALL)
+ {
+ CC_STATUS_INIT;
+ }
+ else if (GET_CODE (SET_DEST (exp)) == REG)
+ {
+ if (cc_status.value1
+ && reg_overlap_mentioned_p (SET_DEST (exp), cc_status.value1))
+ cc_status.value1 = 0;
+ if (cc_status.value2
+ && reg_overlap_mentioned_p (SET_DEST (exp), cc_status.value2))
+ cc_status.value2 = 0;
+ }
+ else if (GET_CODE (SET_DEST (exp)) == MEM)
+ {
+ CC_STATUS_INIT;
+ }
+ }
+ else if (GET_CODE (exp) == PARALLEL
+ && GET_CODE (XVECEXP (exp, 0, 0)) == SET)
+ {
+ if (GET_CODE (SET_DEST (XVECEXP (exp, 0, 0))) == CC0)
+ {
+ cc_status.flags = 0;
+ cc_status.value1 = SET_DEST (XVECEXP (exp, 0, 0));
+ cc_status.value2 = SET_SRC (XVECEXP (exp, 0, 0));
+ }
+ else if (GET_CODE (SET_DEST (XVECEXP (exp, 0, 0))) == REG)
+ {
+ if (cc_status.value1
+ && reg_overlap_mentioned_p (SET_DEST (XVECEXP (exp, 0, 0)),
+ cc_status.value1))
+ cc_status.value1 = 0;
+ if (cc_status.value2
+ && reg_overlap_mentioned_p (SET_DEST (XVECEXP (exp, 0, 0)),
+ cc_status.value2))
+ cc_status.value2 = 0;
+ }
+ else if (GET_CODE (SET_DEST (XVECEXP (exp, 0, 0))) == MEM)
+ {
+ CC_STATUS_INIT;
+ }
+ }
+ else if (GET_CODE (exp) == CALL)
+ {
+ /* all bets are off */
+ CC_STATUS_INIT;
+ }
+ else
+ {
+ /* nothing happens? CC_STATUS_INIT; */
+ }
+ if (cc_status.value1 && GET_CODE (cc_status.value1) == REG
+ && cc_status.value2
+ && reg_overlap_mentioned_p (cc_status.value1, cc_status.value2))
+ abort ();
+}
Do not alter them if the instruction would not alter the cc's. */
#define NOTICE_UPDATE_CC(EXP, INSN) \
-{ if (GET_CODE (EXP) == SET) \
- { if (GET_CODE (SET_DEST (EXP)) == CC0) \
- { cc_status.flags = 0; \
- cc_status.value1 = SET_DEST (EXP); \
- cc_status.value2 = SET_SRC (EXP); \
- } \
- else if (GET_CODE (SET_SRC (EXP)) == CALL) \
- { CC_STATUS_INIT; } \
- else if (GET_CODE (SET_DEST (EXP)) == REG) \
- { if (cc_status.value1 \
- && reg_overlap_mentioned_p (SET_DEST (EXP), cc_status.value1)) \
- cc_status.value1 = 0; \
- if (cc_status.value2 \
- && reg_overlap_mentioned_p (SET_DEST (EXP), cc_status.value2)) \
- cc_status.value2 = 0; \
- } \
- else if (GET_CODE (SET_DEST (EXP)) == MEM) \
- { CC_STATUS_INIT; } \
- } \
- else if (GET_CODE (EXP) == PARALLEL \
- && GET_CODE (XVECEXP (EXP, 0, 0)) == SET) \
- { if (GET_CODE (SET_DEST (XVECEXP (EXP, 0, 0))) == CC0) \
- { cc_status.flags = 0; \
- cc_status.value1 = SET_DEST (XVECEXP (EXP, 0, 0)); \
- cc_status.value2 = SET_SRC (XVECEXP (EXP, 0, 0)); \
- } \
- else if (GET_CODE (SET_DEST (XVECEXP (EXP, 0, 0))) == REG) \
- { if (cc_status.value1 \
- && reg_overlap_mentioned_p (SET_DEST (XVECEXP (EXP, 0, 0)), cc_status.value1)) \
- cc_status.value1 = 0; \
- if (cc_status.value2 \
- && reg_overlap_mentioned_p (SET_DEST (XVECEXP (EXP, 0, 0)), cc_status.value2)) \
- cc_status.value2 = 0; \
- } \
- else if (GET_CODE (SET_DEST (XVECEXP (EXP, 0, 0))) == MEM) \
- { CC_STATUS_INIT; } \
- } \
- else if (GET_CODE (EXP) == CALL) \
- { /* all bets are off */ CC_STATUS_INIT; } \
- else { /* nothing happens? CC_STATUS_INIT; */} \
- if (cc_status.value1 && GET_CODE (cc_status.value1) == REG \
- && cc_status.value2 \
- && reg_overlap_mentioned_p (cc_status.value1, cc_status.value2)) \
- abort (); \
-}
+ ns32k_notice_update_cc ((EXP), (INSN))
/* Describe the costs of the following register moves which are discouraged:
1.) Moves between the Floating point registers and the frame pointer and stack pointer