summaryrefslogtreecommitdiff
path: root/gcc/config/msp430/msp430.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/msp430/msp430.c')
-rw-r--r--gcc/config/msp430/msp430.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/gcc/config/msp430/msp430.c b/gcc/config/msp430/msp430.c
index e3f6712596a..b2d8953c0da 100644
--- a/gcc/config/msp430/msp430.c
+++ b/gcc/config/msp430/msp430.c
@@ -188,7 +188,7 @@ msp430_mcu_name (void)
mcu_name[i] = TOUPPER (mcu_name[i]);
return mcu_name;
}
-
+
return msp430x ? "__MSP430XGENERIC__" : "__MSP430GENERIC__";
}
@@ -966,6 +966,12 @@ msp430_is_interrupt_func (void)
return is_attr_func ("interrupt");
}
+static bool
+is_wakeup_func (void)
+{
+ return msp430_is_interrupt_func () && is_attr_func ("wakeup");
+}
+
static inline bool
is_naked_func (void)
{
@@ -1005,6 +1011,8 @@ msp430_start_function (FILE *outfile, HOST_WIDE_INT hwi_local ATTRIBUTE_UNUSED)
fprintf (outfile, "reentrant ");
if (is_critical_func ())
fprintf (outfile, "critical ");
+ if (is_wakeup_func ())
+ fprintf (outfile, "wakeup ");
fprintf (outfile, "\n");
}
@@ -1131,6 +1139,7 @@ const struct attribute_spec msp430_attribute_table[] =
{ "naked", 0, 0, true, false, false, msp430_attr, false },
{ "reentrant", 0, 0, true, false, false, msp430_attr, false },
{ "critical", 0, 0, true, false, false, msp430_attr, false },
+ { "wakeup", 0, 0, true, false, false, msp430_attr, false },
{ NULL, 0, 0, false, false, false, NULL, false }
};
@@ -1409,6 +1418,14 @@ msp430_expand_epilogue (int is_eh)
emit_insn (gen_epilogue_start_marker ());
+ if (is_wakeup_func ())
+ /* Clear the SCG1, SCG0, OSCOFF and CPUOFF bits in the saved copy of the
+ status register current residing on the stack. When this function
+ executes its RETI instruction the SR will be updated with this saved
+ value, thus ensuring that the processor is woken up from any low power
+ state in which it may be residing. */
+ emit_insn (gen_bic_SR (GEN_INT (0xf0)));
+
fs = cfun->machine->framesize_locals + cfun->machine->framesize_outgoing;
increment_stack (fs);
@@ -1828,7 +1845,7 @@ msp430_output_labelref (FILE *file, const char *name)
static void
msp430_print_operand_raw (FILE * file, rtx op)
{
- int i;
+ HOST_WIDE_INT i;
switch (GET_CODE (op))
{
@@ -1839,9 +1856,9 @@ msp430_print_operand_raw (FILE * file, rtx op)
case CONST_INT:
i = INTVAL (op);
if (TARGET_ASM_HEX)
- fprintf (file, "%#x", i);
+ fprintf (file, "%#" HOST_WIDE_INT_PRINT "x", i);
else
- fprintf (file, "%d", i);
+ fprintf (file, "%" HOST_WIDE_INT_PRINT "d", i);
break;
case CONST: