40, 41, 42, 43, 44, 45, 46, 47, \
48, 49, 50, 51, 52, 53, 54, 55, \
56, 57, 58, 59, 60, 61, 62, 63, \
- 1, 4, 5, 6, 7, 0, 14, 30};
+ 1, 4, 5, 6, 7, 0, 14, 30}
/* This is the order in which to allocate registers for
leaf functions. If all registers can fit in the "i" registers,
40, 41, 42, 43, 44, 45, 46, 47, \
48, 49, 50, 51, 52, 53, 54, 55, \
56, 57, 58, 59, 60, 61, 62, 63, \
- 1, 4, 5, 6, 7, 0, 14, 30, 31};
+ 1, 4, 5, 6, 7, 0, 14, 30, 31}
#define ORDER_REGS_FOR_LOCAL_ALLOC order_regs_for_local_alloc ()
1, 1, 1, 1, 1, 1, 1, 1, \
1, 1, 1, 1, 1, 1, 1, 1, \
1, 1, 1, 1, 1, 1, 1, 1, \
- 1, 1, 1, 1, 1, 1, 1, 1};
+ 1, 1, 1, 1, 1, 1, 1, 1}
extern char leaf_reg_remap[];
#define LEAF_REG_REMAP(REGNO) (leaf_reg_remap[REGNO])
extern struct rtx_def *gen_compare_reg ();
\f
+/* Generate the special assembly code needed to tell the assembler whatever
+ it might need to know about the return value of a function.
+
+ For Sparc assemblers, we need to output a .proc pseudo-op which conveys
+ information to the assembler relating to peephole optimization (done in
+ the assembler). */
+
+#define ASM_DECLARE_RESULT(FILE, RESULT) \
+ fprintf ((FILE), "\t.proc\t0%o\n", sparc_type_code (TREE_TYPE (RESULT)))
+
/* Output the label for a function definition. */
-#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
-{ \
- extern tree double_type_node, float_type_node; \
- if (TREE_TYPE (DECL) == float_type_node) \
- fprintf (FILE, "\t.proc 6\n"); \
- else if (TREE_TYPE (DECL) == double_type_node) \
- fprintf (FILE, "\t.proc 7\n"); \
- else if (TREE_TYPE (DECL) == void_type_node) \
- fprintf (FILE, "\t.proc 0\n"); \
- else fprintf (FILE, "\t.proc 1\n"); \
- ASM_OUTPUT_LABEL (FILE, NAME); \
-}
+#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
+do { \
+ ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
+ ASM_OUTPUT_LABEL (FILE, NAME); \
+} while (0)
/* Two views of the size of the current frame. */
extern int actual_fsize;
/* This is how to output an element of a case-vector that is absolute. */
#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
- fprintf (FILE, "\t.word L%d\n", VALUE)
+do { \
+ char label[30]; \
+ ASM_GENERATE_INTERNAL_LABEL (label, "L", VALUE); \
+ fprintf (FILE, "\t.word\t"); \
+ assemble_name (FILE, label); \
+ fprintf (FILE, "\n"); \
+} while (0)
/* This is how to output an element of a case-vector that is relative.
(SPARC uses such vectors only when generating PIC.) */
-#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
- fprintf (FILE, "\t.word L%d-1b\n", VALUE)
+#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
+do { \
+ char label[30]; \
+ ASM_GENERATE_INTERNAL_LABEL (label, "L", VALUE); \
+ fprintf (FILE, "\t.word\t"); \
+ assemble_name (FILE, label); \
+ fprintf (FILE, "-1b\n"); \
+} while (0)
/* This is how to output an assembler line
that says to advance the location counter
/* This is how to output an internal numbered label where
PREFIX is the class of label and NUM is the number within the class.
- If the NUM argument is negative, we don't use it when generating the
- label.
-
For most svr4 systems, the convention is that any symbol which begins
- with a period is not put into the linker symbol table by the assembler.
-*/
+ with a period is not put into the linker symbol table by the assembler. */
#undef ASM_OUTPUT_INTERNAL_LABEL
#define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \
do { \
- if ((int) (NUM) >= 0) \ ???
- fprintf (FILE, ".%s%d:\n", PREFIX, NUM); \
- else \
- fprintf (FILE, ".%s:\n", PREFIX); \
+ fprintf (FILE, ".%s%d:\n", PREFIX, NUM); \
} while (0)
/* This is how to store into the string LABEL
PREFIX is the class of label and NUM is the number within the class.
This is suitable for output with `assemble_name'.
- If the NUM argument is negative, we don't use it when generating the
- label.
-
For most svr4 systems, the convention is that any symbol which begins
- with a period is not put into the linker symbol table by the assembler.
-*/
+ with a period is not put into the linker symbol table by the assembler. */
#undef ASM_GENERATE_INTERNAL_LABEL
#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
do { \
- if ((int) (NUM) >= 0) \
- sprintf (LABEL, "*.%s%d", PREFIX, NUM); \
- else \
- sprintf (LABEL, "*.%s", PREFIX); \
+ sprintf (LABEL, "*.%s%d", PREFIX, NUM); \
} while (0)
/* The standard SVR4 assembler seems to require that certain builtin
the linker seems to want the alignment of data objects
to depend on their types. We do exactly that here. */
-#define BSS_ASM_OP ".bss"
+#define LOCAL_ASM_OP ".local"
#undef ASM_OUTPUT_ALIGNED_LOCAL
#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
do { \
- fprintf ((FILE), "\t%s\t%s,%u,%u\n", \
- BSS_ASM_OP, (NAME), (SIZE), (ALIGN) / BITS_PER_UNIT); \
+ fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \
+ assemble_name ((FILE), (NAME)); \
+ fprintf ((FILE), "\n"); \
+ ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \
} while (0)
/* This is the pseudo-op used to generate a 32-bit word of data with a