Commit 058edcdb by Stephane Carrez Committed by Stephane Carrez

invoke.texi: Document -mlong-calls for 68HC12.

	* doc/invoke.texi: Document -mlong-calls for 68HC12.

	* config/m68hc11/m68hc11.h (CPP_SPEC): Pass -D__USE_RTC__ when
	-mlong-calls is specified.
	(ASM_DECLARE_FUNCTION_NAME): Define to generate .far and .interrupt
	assembler directives.
	(TARGET_LONG_CALL, MASK_LONG_CALL): Declare.
	(TARGET_SWITCHES): Add -mlong-calls options.
	(current_function_far): Declare.

	* config/m68hc11/m68hc11.c (m68hc11_initial_elimination_offset): Take
	into account the page register saved on the stack.
	(m68hc11_override_options): Take into account -mlong-calls option.
	(m68hc11_asm_file_start): Put a mode for the ELF flags ABI.

	* config/m68hc11/m68hc11.md ("*return_32bit"): Return rtc
	if the function is going to be in 68HC12 banked memory (-mlong-calls).
	("*return_16bit"): Likewise.
	("*return_void"): Likewise.
	("call", "call_value"): Use call for a far function call.

From-SVN: r56275
parent c79043f3
2002-08-14 Stephane Carrez <stcarrez@nerim.fr>
* doc/invoke.texi: Document -mlong-calls for 68HC12.
* config/m68hc11/m68hc11.h (CPP_SPEC): Pass -D__USE_RTC__ when
-mlong-calls is specified.
(ASM_DECLARE_FUNCTION_NAME): Define to generate .far and .interrupt
assembler directives.
(TARGET_LONG_CALL, MASK_LONG_CALL): Declare.
(TARGET_SWITCHES): Add -mlong-calls options.
(current_function_far): Declare.
* config/m68hc11/m68hc11.c (m68hc11_initial_elimination_offset): Take
into account the page register saved on the stack.
(m68hc11_override_options): Take into account -mlong-calls option.
(m68hc11_asm_file_start): Put a mode for the ELF flags ABI.
* config/m68hc11/m68hc11.md ("*return_32bit"): Return rtc
if the function is going to be in 68HC12 banked memory (-mlong-calls).
("*return_16bit"): Likewise.
("*return_void"): Likewise.
("call", "call_value"): Use call for a far function call.
2002-08-14 Neil Booth <neil@daikokuya.co.uk> 2002-08-14 Neil Booth <neil@daikokuya.co.uk>
* toplev.c (parse_options_and_default_flags): Don't call * toplev.c (parse_options_and_default_flags): Don't call
......
...@@ -101,6 +101,10 @@ int current_function_interrupt; ...@@ -101,6 +101,10 @@ int current_function_interrupt;
/* Set to 1 by expand_prologue() when the function is a trap handler. */ /* Set to 1 by expand_prologue() when the function is a trap handler. */
int current_function_trap; int current_function_trap;
/* Set to 1 when the current function is placed in 68HC12 banked
memory and must return with rtc. */
int current_function_far;
/* Min offset that is valid for the indirect addressing mode. */ /* Min offset that is valid for the indirect addressing mode. */
HOST_WIDE_INT m68hc11_min_offset = 0; HOST_WIDE_INT m68hc11_min_offset = 0;
...@@ -283,6 +287,9 @@ m68hc11_override_options () ...@@ -283,6 +287,9 @@ m68hc11_override_options ()
target_flags |= MASK_NO_DIRECT_MODE; target_flags |= MASK_NO_DIRECT_MODE;
if (m68hc11_soft_reg_count == 0) if (m68hc11_soft_reg_count == 0)
m68hc11_soft_reg_count = "0"; m68hc11_soft_reg_count = "0";
if (TARGET_LONG_CALLS)
current_function_far = 1;
} }
return 0; return 0;
} }
...@@ -1277,6 +1284,11 @@ m68hc11_initial_elimination_offset (from, to) ...@@ -1277,6 +1284,11 @@ m68hc11_initial_elimination_offset (from, to)
trap_handler = lookup_attribute ("trap", func_attr) != NULL_TREE; trap_handler = lookup_attribute ("trap", func_attr) != NULL_TREE;
if (trap_handler && from == ARG_POINTER_REGNUM) if (trap_handler && from == ARG_POINTER_REGNUM)
size = 7; size = 7;
/* For a function using 'call/rtc' we must take into account the
page register which is pushed in the call. */
else if (current_function_far && from == ARG_POINTER_REGNUM)
size = 1;
else else
size = 0; size = 0;
...@@ -5500,6 +5512,11 @@ m68hc11_asm_file_start (out, main_file) ...@@ -5500,6 +5512,11 @@ m68hc11_asm_file_start (out, main_file)
print_options (out); print_options (out);
fprintf (out, ";;;-----------------------------------------\n"); fprintf (out, ";;;-----------------------------------------\n");
output_file_directive (out, main_file); output_file_directive (out, main_file);
if (TARGET_SHORT)
fprintf (out, "\t.mode mshort\n");
else
fprintf (out, "\t.mode mlong\n");
} }
......
...@@ -66,7 +66,8 @@ Note: ...@@ -66,7 +66,8 @@ Note:
%{!mshort:-D__INT__=32}\ %{!mshort:-D__INT__=32}\
%{m68hc12:-Dmc6812 -DMC6812 -Dmc68hc12}\ %{m68hc12:-Dmc6812 -DMC6812 -Dmc68hc12}\
%{!m68hc12:-Dmc6811 -DMC6811 -Dmc68hc11}\ %{!m68hc12:-Dmc6811 -DMC6811 -Dmc68hc11}\
%{fshort-double:-D__HAVE_SHORT_DOUBLE__}" %{fshort-double:-D__HAVE_SHORT_DOUBLE__}\
%{mlong-calls:-D__USE_RTC__}"
#endif #endif
#undef STARTFILE_SPEC #undef STARTFILE_SPEC
...@@ -119,6 +120,7 @@ extern short *reg_renumber; /* def in local_alloc.c */ ...@@ -119,6 +120,7 @@ extern short *reg_renumber; /* def in local_alloc.c */
#define MASK_M6811 0010 #define MASK_M6811 0010
#define MASK_M6812 0020 #define MASK_M6812 0020
#define MASK_NO_DIRECT_MODE 0040 #define MASK_NO_DIRECT_MODE 0040
#define MASK_LONG_CALLS 0200
#define TARGET_OP_TIME (optimize && optimize_size == 0) #define TARGET_OP_TIME (optimize && optimize_size == 0)
#define TARGET_SHORT (target_flags & MASK_SHORT) #define TARGET_SHORT (target_flags & MASK_SHORT)
...@@ -127,6 +129,7 @@ extern short *reg_renumber; /* def in local_alloc.c */ ...@@ -127,6 +129,7 @@ extern short *reg_renumber; /* def in local_alloc.c */
#define TARGET_AUTO_INC_DEC (target_flags & MASK_AUTO_INC_DEC) #define TARGET_AUTO_INC_DEC (target_flags & MASK_AUTO_INC_DEC)
#define TARGET_NO_DIRECT_MODE (target_flags & MASK_NO_DIRECT_MODE) #define TARGET_NO_DIRECT_MODE (target_flags & MASK_NO_DIRECT_MODE)
#define TARGET_RELAX (TARGET_NO_DIRECT_MODE) #define TARGET_RELAX (TARGET_NO_DIRECT_MODE)
#define TARGET_LONG_CALLS (target_flags & MASK_LONG_CALLS)
/* Default target_flags if no switches specified. */ /* Default target_flags if no switches specified. */
#ifndef TARGET_DEFAULT #ifndef TARGET_DEFAULT
...@@ -159,6 +162,10 @@ extern short *reg_renumber; /* def in local_alloc.c */ ...@@ -159,6 +162,10 @@ extern short *reg_renumber; /* def in local_alloc.c */
N_("Auto pre/post decrement increment allowed")}, \ N_("Auto pre/post decrement increment allowed")}, \
{ "noauto-incdec", - MASK_AUTO_INC_DEC, \ { "noauto-incdec", - MASK_AUTO_INC_DEC, \
N_("Auto pre/post decrement increment not allowed")}, \ N_("Auto pre/post decrement increment not allowed")}, \
{ "long-calls", MASK_LONG_CALLS, \
N_("Use call and rtc for function calls and returns")}, \
{ "nolong-calls", - MASK_LONG_CALLS, \
N_("Use jsr and rts for function calls and returns")}, \
{ "relax", MASK_NO_DIRECT_MODE, \ { "relax", MASK_NO_DIRECT_MODE, \
N_("Do not use direct addressing mode for soft registers")},\ N_("Do not use direct addressing mode for soft registers")},\
{ "68hc11", MASK_M6811, \ { "68hc11", MASK_M6811, \
...@@ -1549,6 +1556,45 @@ do { \ ...@@ -1549,6 +1556,45 @@ do { \
no longer contain unusual constructs. */ no longer contain unusual constructs. */
#define ASM_APP_OFF "; End of inline assembler code\n#NO_APP\n" #define ASM_APP_OFF "; End of inline assembler code\n#NO_APP\n"
/* Write the extra assembler code needed to declare a function properly.
Some svr4 assemblers need to also have something extra said about the
function's return value. We allow for that here.
For 68HC12 we mark functions that return with 'rtc'. The linker
will ensure that a 'call' is really made (instead of 'jsr').
The debugger needs this information to correctly compute the stack frame.
For 68HC11/68HC12 we also mark interrupt handlers for gdb to
compute the correct stack frame. */
#undef ASM_DECLARE_FUNCTION_NAME
#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
do \
{ \
fprintf (FILE, "%s", TYPE_ASM_OP); \
assemble_name (FILE, NAME); \
putc (',', FILE); \
fprintf (FILE, TYPE_OPERAND_FMT, "function"); \
putc ('\n', FILE); \
\
if (TARGET_M6812 && current_function_far) \
{ \
fprintf (FILE, "\t.far\t"); \
assemble_name (FILE, NAME); \
putc ('\n', FILE); \
} \
else if (current_function_interrupt \
|| current_function_trap) \
{ \
fprintf (FILE, "\t.interrupt\t"); \
assemble_name (FILE, NAME); \
putc ('\b', FILE); \
} \
ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
ASM_OUTPUT_LABEL(FILE, NAME); \
} \
while (0)
/* Output #ident as a .ident. */ /* Output #ident as a .ident. */
/* output external reference */ /* output external reference */
...@@ -1703,3 +1749,4 @@ extern int debug_m6811; ...@@ -1703,3 +1749,4 @@ extern int debug_m6811;
extern int z_replacement_completed; extern int z_replacement_completed;
extern int current_function_interrupt; extern int current_function_interrupt;
extern int current_function_trap; extern int current_function_trap;
extern int current_function_far;
...@@ -6279,12 +6279,14 @@ ...@@ -6279,12 +6279,14 @@
"" ""
"* "*
{ {
int far_call = current_function_far;
if (GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF) if (GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF)
{ {
if (SYMBOL_REF_FLAG (XEXP (operands[0], 0)) == 1) if (SYMBOL_REF_FLAG (XEXP (operands[0], 0)) == 1)
return \"swi\"; return \"swi\";
else else
return \"bsr\\t%0\"; return far_call ? \"call\\t%0\" : \"bsr\\t%0\";
} }
else else
{ {
...@@ -6299,12 +6301,14 @@ ...@@ -6299,12 +6301,14 @@
"" ""
"* "*
{ {
int far_call = current_function_far;
if (GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF) if (GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF)
{ {
if (SYMBOL_REF_FLAG (XEXP (operands[1], 0)) == 1) if (SYMBOL_REF_FLAG (XEXP (operands[1], 0)) == 1)
return \"swi\"; return \"swi\";
else else
return \"bsr\\t%1\"; return far_call ? \"call\\t%1\" : \"bsr\\t%1\";
} }
else else
{ {
...@@ -6418,7 +6422,7 @@ ...@@ -6418,7 +6422,7 @@
return \"\"; return \"\";
if (current_function_interrupt || current_function_trap) if (current_function_interrupt || current_function_trap)
return \"rti\"; return \"rti\";
return \"rts\"; return current_function_far ? \"rtc\" : \"rts\";
}") }")
(define_insn "*return_16bit" (define_insn "*return_16bit"
...@@ -6435,7 +6439,7 @@ ...@@ -6435,7 +6439,7 @@
return \"\"; return \"\";
if (current_function_interrupt || current_function_trap) if (current_function_interrupt || current_function_trap)
return \"rti\"; return \"rti\";
return \"rts\"; return current_function_far ? \"rtc\" : \"rts\";
}") }")
(define_insn "*return_32bit" (define_insn "*return_32bit"
...@@ -6452,7 +6456,7 @@ ...@@ -6452,7 +6456,7 @@
return \"\"; return \"\";
if (current_function_interrupt || current_function_trap) if (current_function_interrupt || current_function_trap)
return \"rti\"; return \"rti\";
return \"rts\"; return current_function_far ? \"rtc\" : \"rts\";
}") }")
(define_insn "indirect_jump" (define_insn "indirect_jump"
......
...@@ -338,7 +338,7 @@ in the following sections. ...@@ -338,7 +338,7 @@ in the following sections.
@emph{M68hc1x Options} @emph{M68hc1x Options}
@gccoptlist{ @gccoptlist{
-m6811 -m6812 -m68hc11 -m68hc12 @gol -m6811 -m6812 -m68hc11 -m68hc12 @gol
-mauto-incdec -mshort -msoft-reg-count=@var{count}} -mauto-incdec -mlong-calls -mshort -msoft-reg-count=@var{count}}
@emph{VAX Options} @emph{VAX Options}
@gccoptlist{ @gccoptlist{
...@@ -5171,6 +5171,14 @@ when the compiler is configured for 68HC12-based systems. ...@@ -5171,6 +5171,14 @@ when the compiler is configured for 68HC12-based systems.
Enable the use of 68HC12 pre and post auto-increment and auto-decrement Enable the use of 68HC12 pre and post auto-increment and auto-decrement
addressing modes. addressing modes.
@item -mlong-calls
@itemx -mno-long-calls
@opindex mlong-calls
@opindex mno-long-calls
Treat all calls as being far away (near). If calls are assumed to be
far away, the compiler will use the @code{call} instruction to
call a function and the @code{rtc} instruction for returning.
@item -mshort @item -mshort
@opindex mshort @opindex mshort
Consider type @code{int} to be 16 bits wide, like @code{short int}. Consider type @code{int} to be 16 bits wide, like @code{short int}.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment