diff options
Diffstat (limited to 'gcc/config/sparc')
-rw-r--r-- | gcc/config/sparc/linux64.h | 8 | ||||
-rw-r--r-- | gcc/config/sparc/sol2.h | 7 | ||||
-rw-r--r-- | gcc/config/sparc/sp64-elf.h | 5 | ||||
-rw-r--r-- | gcc/config/sparc/sparc-protos.h | 1 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.c | 94 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.h | 49 | ||||
-rw-r--r-- | gcc/config/sparc/sun4gas.h | 5 | ||||
-rw-r--r-- | gcc/config/sparc/sysv4.h | 7 |
8 files changed, 54 insertions, 122 deletions
diff --git a/gcc/config/sparc/linux64.h b/gcc/config/sparc/linux64.h index 54b672e826f..61384465477 100644 --- a/gcc/config/sparc/linux64.h +++ b/gcc/config/sparc/linux64.h @@ -353,14 +353,6 @@ do { \ #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ sprintf (LABEL, "*.L%s%ld", PREFIX, (long)(NUM)) -/* Define the names of various pseudo-ops used by the Sparc/svr4 assembler. - ??? If ints are 64 bits then UNALIGNED_INT_ASM_OP (defined elsewhere) is - misnamed. These should all refer to explicit sizes (half/word/xword?), - anything other than short/int/long/etc. */ - -#undef UNALIGNED_DOUBLE_INT_ASM_OP -#define UNALIGNED_DOUBLE_INT_ASM_OP "\t.uaxword\t" - /* DWARF bits. */ /* Follow Irix 6 and not the Dwarf2 draft in using 64-bit offsets. diff --git a/gcc/config/sparc/sol2.h b/gcc/config/sparc/sol2.h index 9f6e38c2596..82f7d32ab22 100644 --- a/gcc/config/sparc/sol2.h +++ b/gcc/config/sparc/sol2.h @@ -95,13 +95,6 @@ Boston, MA 02111-1307, USA. */ #define ASM_OUTPUT_SKIP(FILE,SIZE) \ fprintf (FILE, "\t.skip %u\n", (SIZE)) -/* Use .uahalf/.uaword so packed structure members don't generate - assembler errors when using the native assembler. */ -#undef ASM_SHORT -#define ASM_SHORT ".uahalf" -#undef ASM_LONG -#define ASM_LONG ".uaword" - /* This is how to output a definition of an internal numbered label where PREFIX is the class of label and NUM is the number within the class. */ diff --git a/gcc/config/sparc/sp64-elf.h b/gcc/config/sparc/sp64-elf.h index 40d18dfac97..3bd2a53f562 100644 --- a/gcc/config/sparc/sp64-elf.h +++ b/gcc/config/sparc/sp64-elf.h @@ -114,8 +114,3 @@ crtbegin.o%s \ #undef PREFERRED_DEBUGGING_TYPE #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG - -/* Define the names of various pseudo-ops used by the Sparc/svr4 assembler. */ - -#undef UNALIGNED_DOUBLE_INT_ASM_OP -#define UNALIGNED_DOUBLE_INT_ASM_OP "\t.uaxword\t" diff --git a/gcc/config/sparc/sparc-protos.h b/gcc/config/sparc/sparc-protos.h index 7e0e1fcad9b..b0778eb85ef 100644 --- a/gcc/config/sparc/sparc-protos.h +++ b/gcc/config/sparc/sparc-protos.h @@ -90,7 +90,6 @@ extern const char *output_return PARAMS ((rtx *)); extern const char *output_sibcall PARAMS ((rtx, rtx)); extern char *output_v9branch PARAMS ((rtx, int, int, int, int, int, rtx)); extern void emit_v9_brxx_insn PARAMS ((enum rtx_code, rtx, rtx)); -extern void output_double_int PARAMS ((FILE *, rtx)); extern void print_operand PARAMS ((FILE *, rtx, int)); extern int mems_ok_for_ldd_peep PARAMS ((rtx, rtx)); extern int arith_double_4096_operand PARAMS ((rtx, enum machine_mode)); diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 48906d46bf4..d93f57c92c2 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -151,6 +151,7 @@ static void sparc_add_gc_roots PARAMS ((void)); static void mark_ultrasparc_pipeline_state PARAMS ((void *)); static int check_return_regs PARAMS ((rtx)); static int epilogue_renumber PARAMS ((rtx *, int)); +static bool sparc_assemble_integer PARAMS ((rtx, unsigned int, int)); static int ultra_cmove_results_ready_p PARAMS ((rtx)); static int ultra_fpmode_conflict_exists PARAMS ((enum machine_mode)); static rtx *ultra_find_type PARAMS ((int, rtx *, int)); @@ -202,6 +203,27 @@ struct sparc_cpu_select sparc_select[] = enum processor_type sparc_cpu; /* Initialize the GCC target structure. */ + +/* The sparc default is to use .half rather than .short for aligned + HI objects. Use .word instead of .long on non-ELF systems. */ +#undef TARGET_ASM_ALIGNED_HI_OP +#define TARGET_ASM_ALIGNED_HI_OP "\t.half\t" +#ifndef OBJECT_FORMAT_ELF +#undef TARGET_ASM_ALIGNED_SI_OP +#define TARGET_ASM_ALIGNED_SI_OP "\t.word\t" +#endif + +#undef TARGET_ASM_UNALIGNED_HI_OP +#define TARGET_ASM_UNALIGNED_HI_OP "\t.uahalf\t" +#undef TARGET_ASM_UNALIGNED_SI_OP +#define TARGET_ASM_UNALIGNED_SI_OP "\t.uaword\t" +#undef TARGET_ASM_UNALIGNED_DI_OP +#define TARGET_ASM_UNALIGNED_DI_OP "\t.uaxword\t" + +/* The target hook has to handle DI-mode values. */ +#undef TARGET_ASM_INTEGER +#define TARGET_ASM_INTEGER sparc_assemble_integer + #undef TARGET_ASM_FUNCTION_PROLOGUE #define TARGET_ASM_FUNCTION_PROLOGUE sparc_output_function_prologue #undef TARGET_ASM_FUNCTION_EPILOGUE @@ -401,6 +423,10 @@ sparc_override_options () if (flag_pcc_struct_return == DEFAULT_PCC_STRUCT_RETURN) flag_pcc_struct_return = (TARGET_ARCH64 ? 0 : 1); + /* Only use .uaxword when compiling for a 64-bit target. */ + if (!TARGET_ARCH64) + targetm.asm_out.unaligned_op.di = NULL; + /* Do various machine dependent initializations. */ sparc_init_modes (); @@ -6008,65 +6034,33 @@ print_operand (file, x, code) else { output_addr_const (file, x); } } -/* This function outputs assembler code for VALUE to FILE, where VALUE is - a 64 bit (DImode) value. */ +/* Target hook for assembling integer objects. The sparc version has + special handling for aligned DI-mode objects. */ -/* ??? If there is a 64 bit counterpart to .word that the assembler - understands, then using that would simply this code greatly. */ -/* ??? We only output .xword's for symbols and only then in environments - where the assembler can handle them. */ - -void -output_double_int (file, value) - FILE *file; - rtx value; +static bool +sparc_assemble_integer (x, size, aligned_p) + rtx x; + unsigned int size; + int aligned_p; { - if (GET_CODE (value) == CONST_INT) - { - /* ??? This has endianness issues. */ -#if HOST_BITS_PER_WIDE_INT == 64 - HOST_WIDE_INT xword = INTVAL (value); - HOST_WIDE_INT high, low; - - high = (xword >> 32) & 0xffffffff; - low = xword & 0xffffffff; - ASM_OUTPUT_INT (file, GEN_INT (high)); - ASM_OUTPUT_INT (file, GEN_INT (low)); -#else - if (INTVAL (value) < 0) - ASM_OUTPUT_INT (file, constm1_rtx); - else - ASM_OUTPUT_INT (file, const0_rtx); - ASM_OUTPUT_INT (file, value); -#endif - } - else if (GET_CODE (value) == CONST_DOUBLE) + /* ??? We only output .xword's for symbols and only then in environments + where the assembler can handle them. */ + if (aligned_p && size == 8 + && (GET_CODE (x) != CONST_INT && GET_CODE (x) != CONST_DOUBLE)) { - ASM_OUTPUT_INT (file, GEN_INT (CONST_DOUBLE_HIGH (value))); - ASM_OUTPUT_INT (file, GEN_INT (CONST_DOUBLE_LOW (value))); - } - else if (GET_CODE (value) == SYMBOL_REF - || GET_CODE (value) == CONST - || GET_CODE (value) == PLUS - || (TARGET_ARCH64 && - (GET_CODE (value) == LABEL_REF - || GET_CODE (value) == CODE_LABEL - || GET_CODE (value) == MINUS))) - { - if (! TARGET_V9) + if (TARGET_V9) { - ASM_OUTPUT_INT (file, const0_rtx); - ASM_OUTPUT_INT (file, value); + assemble_integer_with_op ("\t.xword\t", x); + return true; } else { - fprintf (file, "\t%s\t", ASM_LONGLONG); - output_addr_const (file, value); - fprintf (file, "\n"); + assemble_aligned_integer (4, const0_rtx); + assemble_aligned_integer (4, x); + return true; } } - else - abort (); + return default_assemble_integer (x, size, aligned_p); } /* Return the value of a code used in the .proc pseudo-op that says diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index 4d88325d940..35802753746 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -2652,10 +2652,6 @@ do { \ /* ??? Try to make the style consistent here (_OP?). */ -#define ASM_LONGLONG ".xword" -#define ASM_LONG ".word" -#define ASM_SHORT ".half" -#define ASM_BYTE_OP "\t.byte\t" #define ASM_FLOAT ".single" #define ASM_DOUBLE ".double" #define ASM_LONGDOUBLE ".xxx" /* ??? Not known (or used yet). */ @@ -2732,7 +2728,8 @@ do { \ char str[30]; \ REAL_VALUE_TO_TARGET_SINGLE ((VALUE), t); \ REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", str); \ - fprintf (FILE, "\t%s\t0x%lx %s ~%s\n", ASM_LONG, t, \ + fprintf (FILE, "\t%s\t0x%lx %s ~%s\n", \ + integer_asm_op (4, TRUE), t, \ ASM_COMMENT_START, str); \ } \ @@ -2745,11 +2742,12 @@ do { \ { \ long t[2]; \ char str[30]; \ + const char *long_op = integer_asm_op (4, TRUE); \ REAL_VALUE_TO_TARGET_DOUBLE ((VALUE), t); \ REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", str); \ - fprintf (FILE, "\t%s\t0x%lx %s ~%s\n", ASM_LONG, t[0], \ + fprintf (FILE, "\t%s\t0x%lx %s ~%s\n", long_op, t[0], \ ASM_COMMENT_START, str); \ - fprintf (FILE, "\t%s\t0x%lx\n", ASM_LONG, t[1]); \ + fprintf (FILE, "\t%s\t0x%lx\n", long_op, t[1]); \ } /* This is how to output an assembler line defining a `long double' @@ -2759,43 +2757,16 @@ do { \ { \ long t[4]; \ char str[30]; \ + const char *long_op = integer_asm_op (4, TRUE); \ REAL_VALUE_TO_TARGET_LONG_DOUBLE ((VALUE), t); \ REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", str); \ - fprintf (FILE, "\t%s\t0x%lx %s ~%s\n", ASM_LONG, t[0], \ + fprintf (FILE, "\t%s\t0x%lx %s ~%s\n", long_op, t[0], \ ASM_COMMENT_START, str); \ - fprintf (FILE, "\t%s\t0x%lx\n", ASM_LONG, t[1]); \ - fprintf (FILE, "\t%s\t0x%lx\n", ASM_LONG, t[2]); \ - fprintf (FILE, "\t%s\t0x%lx\n", ASM_LONG, t[3]); \ + fprintf (FILE, "\t%s\t0x%lx\n", long_op, t[1]); \ + fprintf (FILE, "\t%s\t0x%lx\n", long_op, t[2]); \ + fprintf (FILE, "\t%s\t0x%lx\n", long_op, t[3]); \ } -/* This is how to output an assembler line defining an `int' constant. */ - -#define ASM_OUTPUT_INT(FILE,VALUE) \ -( fprintf (FILE, "\t%s\t", ASM_LONG), \ - output_addr_const (FILE, (VALUE)), \ - fprintf (FILE, "\n")) - -/* This is how to output an assembler line defining a DImode constant. */ -#define ASM_OUTPUT_DOUBLE_INT(FILE,VALUE) \ - output_double_int (FILE, VALUE) - -/* Likewise for `char' and `short' constants. */ - -#define ASM_OUTPUT_SHORT(FILE,VALUE) \ -( fprintf (FILE, "\t%s\t", ASM_SHORT), \ - output_addr_const (FILE, (VALUE)), \ - fprintf (FILE, "\n")) - -#define ASM_OUTPUT_CHAR(FILE,VALUE) \ -( fprintf (FILE, "%s", ASM_BYTE_OP), \ - output_addr_const (FILE, (VALUE)), \ - fprintf (FILE, "\n")) - -/* This is how to output an assembler line for a numeric constant byte. */ - -#define ASM_OUTPUT_BYTE(FILE,VALUE) \ - fprintf (FILE, "%s0x%x\n", ASM_BYTE_OP, (int)(VALUE)) - /* This is how we hook in and defer the case-vector until the end of the function. */ #define ASM_OUTPUT_ADDR_VEC(LAB,VEC) \ diff --git a/gcc/config/sparc/sun4gas.h b/gcc/config/sparc/sun4gas.h index 0848ecd11ac..7f4f7dbbc80 100644 --- a/gcc/config/sparc/sun4gas.h +++ b/gcc/config/sparc/sun4gas.h @@ -18,10 +18,5 @@ along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* gas supports unaligned data. */ -#define UNALIGNED_DOUBLE_INT_ASM_OP "\t.uaxword\t" -#define UNALIGNED_INT_ASM_OP "\t.uaword\t" -#define UNALIGNED_SHORT_ASM_OP "\t.uahalf\t" - /* defaults.h will define DWARF2_UNWIND_INFO for us. */ #undef DWARF2_UNWIND_INFO diff --git a/gcc/config/sparc/sysv4.h b/gcc/config/sparc/sysv4.h index be10190ff26..a4c7f915c2e 100644 --- a/gcc/config/sparc/sysv4.h +++ b/gcc/config/sparc/sysv4.h @@ -87,16 +87,9 @@ Boston, MA 02111-1307, USA. */ #define STRING_ASM_OP "\t.asciz\t" #define COMMON_ASM_OP "\t.common\t" #define SKIP_ASM_OP "\t.skip\t" -#define UNALIGNED_DOUBLE_INT_ASM_OP (TARGET_ARCH64 ? "\t.uaxword\t" : NULL) -#define UNALIGNED_INT_ASM_OP "\t.uaword\t" -#define UNALIGNED_SHORT_ASM_OP "\t.uahalf\t" #define PUSHSECTION_ASM_OP "\t.pushsection\t" #define POPSECTION_ASM_OP "\t.popsection" -/* This is defined in sparc.h but is not used by svr4.h. */ -#undef ASM_LONG -#define ASM_LONG ".long" - /* This is the format used to print the second operand of a .type pseudo-op for the Sparc/svr4 assembler. */ |