Commit e6e43661 by Richard Kenner

(FUNCTION_EPILOGUE): Restore stack before freeing local vars.

(DEFAULT_SIGNED_CHAR): Now 1.
(DATA_SECTION_ASM_OP): Use pseudo-op for read-only data (later copied).
(JUMP_TABLES_IN_TEXT_SECTION): Define.
(ASM_OUTPUT_ASCII): Split into multiple lines if long.
(ASM_OUTPUT_{CHAR,SHORT,INT,LONG_INT}): Split up.
(ASM_OUTPUT_COMMON): Call check_section.

From-SVN: r9154
parent aa526ccd
...@@ -588,11 +588,11 @@ enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES }; ...@@ -588,11 +588,11 @@ enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES };
before returning. */ before returning. */
#define FUNCTION_EPILOGUE(FILE, SIZE) { \ #define FUNCTION_EPILOGUE(FILE, SIZE) { \
fprintf(FILE,"\tlr\tr15,r14 ; set stack ptr to frame ptr\n"); \
fprintf(FILE,"\tpopm\tr14,r14 ; restore previous frame ptr\n"); \
if (SIZE > 0) \ if (SIZE > 0) \
fprintf(FILE,"\t%s\tr14,%d ; free up local-var space\n", \ fprintf(FILE,"\t%s\tr14,%d ; free up local-var space\n", \
(SIZE <= 16 ? "aisp" : "aim"),SIZE); \ (SIZE <= 16 ? "aisp" : "aim"),SIZE); \
fprintf(FILE,"\tlr\tr15,r14 ; set stack to return addr\n"); \
fprintf(FILE,"\tpopm\tr14,r14 ; restore prev. frame ptr\n"); \
fprintf(FILE,"\turs\tr15\n"); } fprintf(FILE,"\turs\tr15\n"); }
/* If the memory address ADDR is relative to the frame pointer, /* If the memory address ADDR is relative to the frame pointer,
...@@ -789,7 +789,7 @@ enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES }; ...@@ -789,7 +789,7 @@ enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES };
#define EASY_DIV_EXPR TRUNC_DIV_EXPR #define EASY_DIV_EXPR TRUNC_DIV_EXPR
/* Define this as 1 if `char' should by default be signed; else as 0. */ /* Define this as 1 if `char' should by default be signed; else as 0. */
#define DEFAULT_SIGNED_CHAR 0 #define DEFAULT_SIGNED_CHAR 1
/* Max number of bytes we can move from memory to memory /* Max number of bytes we can move from memory to memory
in one reasonably fast instruction. */ in one reasonably fast instruction. */
...@@ -932,30 +932,30 @@ enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES }; ...@@ -932,30 +932,30 @@ enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES };
#define EXTRA_SECTIONS in_readonly_data #define EXTRA_SECTIONS in_readonly_data
#define EXTRA_SECTION_FUNCTIONS \ #define EXTRA_SECTION_FUNCTIONS \
void const_section() \ void const_section() \
{ \ { \
fprintf(asm_out_file,"\tkonst\n"); \ fprintf(asm_out_file,"\tkonst\n"); \
current_section = Konst; \ current_section = Konst; \
} \ } \
check_section(sect) \ check_section(sect) \
enum section sect; \ enum section sect; \
{ \ { \
if (current_section != sect) { \ if (current_section != sect) { \
fprintf(asm_out_file,"\t%s\n",sectname[(int)sect]); \ fprintf(asm_out_file,"\t%s\n",sectname[(int)sect]); \
current_section = sect; \ current_section = sect; \
} \ } \
switch (sect) { \ switch (sect) { \
case Init: \ case Init: \
case Normal: \ case Normal: \
in_section = in_text; \ in_section = in_text; \
break; \ break; \
case Static: \ case Static: \
in_section = in_data; \ in_section = in_data; \
break; \ break; \
case Konst: \ case Konst: \
in_section = in_readonly_data; \ in_section = in_readonly_data; \
break; \ break; \
} \ } \
} }
...@@ -968,8 +968,11 @@ enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES }; ...@@ -968,8 +968,11 @@ enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES };
/* Output before program text section */ /* Output before program text section */
#define TEXT_SECTION_ASM_OP "\n\tnormal ; text_section\n" #define TEXT_SECTION_ASM_OP "\n\tnormal ; text_section\n"
/* Output before writable data. */ /* Output before writable data.
#define DATA_SECTION_ASM_OP "\n\tstatic ; data_section\n" 1750 Note: This is actually read-only data. The copying from read-only
to writable memory is done elsewhere (in ASM_FILE_END.)
*/
#define DATA_SECTION_ASM_OP "\n\tkonst ; data_section\n"
/* How to refer to registers in assembler output. /* How to refer to registers in assembler output.
This sequence is indexed by compiler's hard-register-number (see above). */ This sequence is indexed by compiler's hard-register-number (see above). */
...@@ -1069,6 +1072,24 @@ enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES }; ...@@ -1069,6 +1072,24 @@ enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES };
#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
sprintf (LABEL, "%s%d", PREFIX, NUM) sprintf (LABEL, "%s%d", PREFIX, NUM)
/* Output at the end of a jump table.
1750: To be uncommented when we can put jump tables in Konst.
#define ASM_OUTPUT_CASE_END(FILE,NUM,INSN) \
fprintf (FILE, "\tnormal\t; case_end\n")
*/
/* Currently, it is not possible to put jump tables in section Konst.
This is because there is a one-to-one relation between sections Konst
and Static (i.e., all Konst data are copied to Static, and the order
of data is the same between the two sections.) However, jump tables are
not copied to Static, which destroys the equivalence between Konst and
Static. When a more intelligent Konst-to-Static copying mechanism is
implemented (i.e. one that excludes the copying of jumptables), then
ASM_OUTPUT_CASE_END shall be defined, and JUMP_LABELS_IN_TEXT_SECTION
shall be undefined. */
#define JUMP_TABLES_IN_TEXT_SECTION 1
/* This is how to output an assembler line defining a 1750A `float' /* This is how to output an assembler line defining a 1750A `float'
constant. */ constant. */
...@@ -1107,18 +1128,34 @@ enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES }; ...@@ -1107,18 +1128,34 @@ enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES };
label_pending = 0; \ label_pending = 0; \
datalbl[datalbl_ndx].size = LEN; \ datalbl[datalbl_ndx].size = LEN; \
} \ } \
for (i = 0; i < LEN; i++) \ for (i = 0; i < LEN; i++) { \
if ((i % 15) == 0) { \
if (i != 0) \
fprintf(FILE,"\n"); \
fprintf(FILE,"\tdata\t"); \
} \
else \
fprintf(FILE,","); \
if (PTR[i] >= 32 && PTR[i] < 127) \ if (PTR[i] >= 32 && PTR[i] < 127) \
fprintf(FILE,"\tdata\t%d\t; '%c'\n",PTR[i],PTR[i]); \ fprintf(FILE,"'%c'",PTR[i]); \
else \ else \
fprintf(FILE,"\tdata\t%d\t; (ascii)\n",PTR[i]); \ fprintf(FILE,"%d",PTR[i]); \
} \
fprintf(FILE,"\n"); \
} while (0) } while (0)
/* This is how to output an assembler line defining an `int' constant. */ /* This is how to output an assembler line defining a `char', `short', or
`int' constant.
1750 NOTE: The reason why this macro also outputs `short' and `int'
constants is that for the 1750, BITS_PER_UNIT is 16 (as opposed to the
usual 8.) This behavior is different from the usual, where
ASM_OUTPUT_CHAR only outputs character constants. The name
of this macro should perhaps be `ASM_OUTPUT_QUARTER_INT' or so.
*/
#define ASM_OUTPUT_INT(FILE,VALUE) do { \ #define ASM_OUTPUT_CHAR(FILE,VALUE) do { \
if (! label_pending) \ if (! label_pending) \
fprintf(FILE,";in ASM_OUTPUT_INT without label_pending\n"); \ fprintf(FILE,";in ASM_OUTPUT_CHAR without label_pending\n"); \
else { \ else { \
label_pending = 0; \ label_pending = 0; \
datalbl[datalbl_ndx].size = 1; \ datalbl[datalbl_ndx].size = 1; \
...@@ -1126,30 +1163,25 @@ enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES }; ...@@ -1126,30 +1163,25 @@ enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES };
fprintf(FILE, "\tdata\t"); output_addr_const(FILE,VALUE); \ fprintf(FILE, "\tdata\t"); output_addr_const(FILE,VALUE); \
fprintf(FILE, "\n"); } while (0) fprintf(FILE, "\n"); } while (0)
/* This is how to output an assembler line defining a `long int' constant. */ /* This is how to output an assembler line defining a `long int' constant.
1750 NOTE: The reason why this macro outputs `long' instead of `short'
constants is that for the 1750, BITS_PER_UNIT is 16 (as opposed to the
usual 8.) The name of this macro should perhaps be `ASM_OUTPUT_HALF_INT'.
*/
#define ASM_OUTPUT_LONG_INT(FILE,VALUE) do { \ #define ASM_OUTPUT_SHORT(FILE,VALUE) do { \
if (! label_pending) \ if (! label_pending) \
fprintf(FILE,";in ASM_OUTPUT_LONG_INT without label_pending\n");\ fprintf(FILE,";in ASM_OUTPUT_SHORT without label_pending\n");\
else { \ else { \
label_pending = 0; \ label_pending = 0; \
datalbl[datalbl_ndx].size = 2; \ datalbl[datalbl_ndx].size = 2; \
} \ } \
fprintf(FILE, "\tdatal\t"); output_addr_const(FILE,VALUE); \ fprintf(FILE, "\tdatal\t%d\n",INTVAL(VALUE)); \
fprintf(FILE, "\n"); } while (0) } while (0)
/* Likewise for `short' and `char' constants. */
#define ASM_OUTPUT_SHORT(FILE,VALUE) ASM_OUTPUT_INT(FILE,VALUE)
/* For 1750, we treat char same as word. Tektronix 1750
Assembler does a better (packing) job with strings. */
#define ASM_OUTPUT_CHAR(FILE,VALUE) ASM_OUTPUT_INT(FILE,VALUE)
/* This is how to output an assembler line for a numeric constant byte. */ /* This is how to output an assembler line for a numeric constant byte. */
/* 1750: For the time being, treating this same as word. Tektronix 1750
Assembler does a better (packing) job with strings. */ #define ASM_OUTPUT_BYTE(FILE,VALUE) ASM_OUTPUT_CHAR(FILE,VALUE)
#define ASM_OUTPUT_BYTE(FILE,VALUE) ASM_OUTPUT_INT(FILE,VALUE)
/* This is how to output an insn to push a register on the stack. /* This is how to output an insn to push a register on the stack.
It need not be very fast code. */ It need not be very fast code. */
...@@ -1187,7 +1219,8 @@ enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES }; ...@@ -1187,7 +1219,8 @@ enum reg_class { NO_REGS, INDEX_REGS, BASE_REGS, ALL_REGS, LIM_REG_CLASSES };
to define a global common symbol. */ to define a global common symbol. */
#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) do { \ #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) do { \
fprintf (FILE, "\tcommon %s,%d\n", NAME, SIZE); \ check_section(Static); \
fprintf (FILE, "\tcommon %s,%d\n", NAME, SIZE); \
} while (0) } while (0)
#define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) do { \ #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) do { \
......
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