$NetBSD: gcc-ab,v 1.1 2001/08/05 15:28:41 kent Exp $ --- /dev/null Thu Aug 2 23:44:43 2001 +++ gcc/config/mips/eenetbsd.h @@ -0,0 +1,250 @@ +/* + * + * + * + */ + +/* Experimental: */ +#define MIPS_ABI_DEFAULT ABI_32 +#undef mips_abi +extern int mips_abi; +/* End of experimental */ + +#define MIPS_CPU_STRING_DEFAULT "R5900" + +#undef MIPS_ISA_DEFAULT +#define MIPS_ISA_DEFAULT 2 + +#include "linux.h" +#include "abi64.h" + +/* + * Override TARGET_DEFAULT + * for r5900 : default is -msingle-float + */ +#undef TARGET_DEFAULT +#define TARGET_DEFAULT (MASK_ABICALLS|MASK_GAS|MASK_SINGLE_FLOAT|MASK_MIPS5900) + +#undef MACHINE_TYPE +#define MACHINE_TYPE "(MIPSEL EE NetBSD/ELF)" + +/* How to output a quadword for the r5900. */ +#define ASM_OUTPUT_QUADRUPLE_INT(STREAM,VALUE) \ +do { \ + if (TARGET_64BIT) \ + { \ + fprintf (STREAM, "\t.octa\t"); \ + if (HOST_BITS_PER_WIDE_INT < 64 || GET_CODE (VALUE) != CONST_INT) \ + /* We can't use 'X' for negative numbers, because then we won't \ + get the right value for the upper 32 bits. */ \ + output_addr_const (STREAM, VALUE); \ + else \ + /* We must use 'X', because otherwise LONG_MIN will print as \ + a number that the Irix 6 assembler won't accept. */ \ + print_operand (STREAM, VALUE, 'X'); \ + fprintf (STREAM, "\n"); \ + } \ + else \ + { \ + assemble_integer (operand_subword ((VALUE), 0, 0, TImode), \ + UNITS_PER_WORD, 1); \ + assemble_integer (operand_subword ((VALUE), 1, 0, TImode), \ + UNITS_PER_WORD, 1); \ + } \ +} while (0) + +/* ALIGN 128 bit objects */ + +#define DEFAULT_MIPS_ALIGNMENT 128 + +#undef SUBTARGET_TARGET_OPTIONS +#define SUBTARGET_TARGET_OPTIONS \ + { "align128", &mips_align128_string, \ + "Speciy 128bit alignment to use"}, \ + { "no-align128", &mips_no_align128_string, \ + "Speciy no 128bit alignment to use"}, \ + { "abi=", &mips_abi_string, \ + "Speciy ABI to use"}, + +#undef STACK_BOUNDARY +#define STACK_BOUNDARY \ + ((mips_abi == ABI_32 || mips_abi == ABI_O64 || mips_abi == ABI_EABI) \ + ? 64 : 128) + +#undef MIPS_STACK_ALIGN +#define MIPS_STACK_ALIGN(LOC) \ + (((mips_abi == ABI_32 || mips_abi == ABI_O64 || mips_abi == ABI_EABI) \ + && mips_alignment != 128 ) \ + ? ((LOC) + 7) & ~7 \ + : ((LOC) + 15) & ~15) + + +#undef BIGGEST_ALIGNMENT +#define BIGGEST_ALIGNMENT mips_alignment + +#define PREFERRED_STACK_BOUNDARY \ +(mips_alignment == 128 ? 128 : \ + ((mips_abi == ABI_32 || mips_abi == ABI_O64 || mips_abi == ABI_EABI ) \ + ? 64 : 128)) + + +/* + + ** Table of cc1 flags v.s. stack alignment related values ** + + STACK_BOUNDARY MIPS_STACK_ALIGN BIGGEST_ALIGNMENT PREFERRED_STACK_BOUNDARY +o32/o64 64 64 64 64 + +align128 64 128 128 128 +n32/n64 128 128 64 128 + +align128 128 128 128 128 +*/ + +/* +//////////// +// +// default mips2 +// +// default is elf, -mabi=o32, -mips2, -mcpu=r5900 and -EL +*/ +#undef CPP_PREDEFINES +#define CPP_PREDEFINES "\ +-D__ELF__ -D_MIPS_SIM=_MIPS_SIM_ABI32 \ +-D_MIPS_ISA=_MIPS_ISA_MIPS2 \ +-Dunix -D__unix__ \ +-D__NetBSD__ \ +-Dmips -D_mips -D__mips -D__mips__ \ +-DR3000 -D_R3000 \ +-DMIPSEL -D_MIPSEL -D__MIPSEL -D__MIPSEL__ \ +-Asystem(unix) -Asystem(posix) -Acpu(mips) -Amachine(mips) \ + " + +#undef SUBTARGET_CPP_SPEC +#define SUBTARGET_CPP_SPEC "\ +%{mfp32: -D_MIPS_FPSET=16}%{!mfp32: -D_MIPS_FPSET=32} \ +%{mips1: -U_MIPS_ISA -D_MIPS_ISA=_MIPS_ISA_MIPS1} \ +%{mips2: -U_MIPS_ISA -D_MIPS_ISA=_MIPS_ISA_MIPS2} \ +%{mips3: -U_MIPS_ISA -D_MIPS_ISA=_MIPS_ISA_MIPS3 -UR3000 -U_R3000} \ +%{mips4: -U_MIPS_ISA -D_MIPS_ISA=_MIPS_ISA_MIPS4 -UR3000 -U_R3000} \ +%{!mips*: -D_MIPS_ISA=_MIPS_ISA_MIPS2} \ +%{fno-PIC: -U__PIC__ -U__pic__} \ +%{fno-pic: -U__PIC__ -U__pic__} \ +%{fPIC: -D__PIC__ -D__pic__} \ +%{fpic: -D__PIC__ -D__pic__} \ +%{!fpic: %{!fPIC: %{!fno-pic: %{!fno-pic: -D__PIC__ -D__pic__}}}} \ +%{-D__HAVE_FPU__ } \ +%{posix: -D_POSIX_SOURCE} \ +%{.cc: -D__LANGUAGE_C_PLUS_PLUS__ %{!ansi:-DLANGUAGE_C_PLUS_PLUS}} \ +%{.cxx: -D__LANGUAGE_C_PLUS_PLUS__ %{!ansi:-DLANGUAGE_C_PLUS_PLUS}} \ +%{.C: -D__LANGUAGE_C_PLUS_PLUS__ %{!ansi:-DLANGUAGE_C_PLUS_PLUS}} \ +%{.m: -D__LANGUAGE_OBJECTIVE_C__ %{!ansi:-DLANGUAGE_OBJECTIVE_C}} \ +%{.S: -D__LANGUAGE_ASSEMBLY__ %{!ansi:-DLANGUAGE_ASSEMBLY}} \ +%{.s: -D__LANGUAGE_ASSEMBLY__ %{!ansi:-DLANGUAGE_ASSEMBLY}} \ +%{!.S: %{!.s: %{!.cc: %{!.cxx: %{!.C: %{!.m: -D__LANGUAGE_C__ %{!ansi:-DLANGUAGE_C}}}}}} } \ +%{ansi:-Uunix -Ulinux -Umips -UR3000 -UMIPSEB -UMIPSEL} \ +%{ffast-math: -D__FAST_MATH__} \ +%{!mcpu*: -D__R5900 -D_R5900} \ +%{mcpu=r5900: -D__R5900 -D_R5900} \ + " +#undef SUBTARGET_CC1_SPEC +#define SUBTARGET_CC1_SPEC "\ +%{fno-pic: -mno-abicalls} \ + " + +#undef SUBTARGET_ASM_SPEC +#define SUBTARGET_ASM_SPEC "\ +%{!mcpu*: -mwarn-short-loop} \ +%{!mcpu*: -mcpu=r5900} \ +%{fno-pic: -non_shared} \ +%{mno-abicalls: -non_shared} \ +%{!fno-pic: %{!mno-abicalls: -KPIC}} \ +%{!mips*: -mips2} \ +%{!mdouble-float: -msingle-float} \ + " + + +/* + * Default fucntion and data alignment values for r5900 + */ + +/* prefer .p2align rather than .align (gas assumed) */ +#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP) \ + if ((LOG)!=0) \ + if ((MAX_SKIP)==0) fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ + else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)) + +#undef DEFAULT_LOOP_ALIGN +#undef DEFAULT_LOOP_MAX_SKIP +#undef DEFAULT_JUMP_ALIGN +#undef DEFAULT_JUMP_MAX_SKIP +#undef DEFAULT_FUNCTION_ALIGN +#undef DEFAULT_FUNCTION_MAX_SKIP + +#define DEFAULT_LOOP_ALIGN 3 +#define DEFAULT_LOOP_MAX_SKIP 0 +#define DEFAULT_JUMP_ALIGN 2 +#define DEFAULT_JUMP_MAX_SKIP 0 +#define DEFAULT_FUNCTION_ALIGN 3 +#define DEFAULT_FUNCTION_MAX_SKIP 0 + +/* + * bb profiling extension + * + *construct/destruct private reocord in strunc bb + * int BB_CONSTRUCT_PRIVATE_RECORD(void **p_private) + * ( return 1 if successed, otherwise return 0 ) + * void BB_DESTRUCT_PRIVATE_RECORD(void **p_private) + * + *called from "bb.out" reporter + * void BB_PRINT_PRIVATE_RECORD(FILE*, void *private) + * + *called from "bb.in" parser + * int BB_PARSE_PRIVATE(char *bb_in) + * ( return 1 if processed, otherwise return 0 ) + * + *called per once program + * void BB_INIT_PRIVATE(void) + * void BB_EXIT_PRIVATE(void) + * + *called when etering/returning function + * void BB_INIT_TRACE_FUNC_PRIVATE(struct bb *blocks, unsigned long blockno) + * void BB_TRACE_RET_PRIVATE(void) + * + *called when entering bb + * void BB_TRACE_FUNC_PRIVATE(struct __bb * p__bb) + * + */ + +#define BB_CONSTRUCT_PRIVATE_RECORD(p_private) \ + __bb_alloc_r5900_perf_counter(p_private) + +#define BB_DESTRUCT_PRIVATE_RECORD(p_private) \ + __bb_free_r5900_perf_counter(p_private) + +#define BB_PRINT_PRIVATE_RECORD(file,private) \ + __bb_print_r5900_perf_counter(file,private) + +#define BB_PARSE_PRIVATE(ptr) \ + __bb_parse_r5900_perf_counter(ptr) + +#define BB_INIT_PRIVATE \ + __bb_init_r5900_perf_counter + +#define BB_EXIT_PRIVATE \ + __bb_exit_r5900_perf_counter + +#define BB_TRACE_FUNC_PRIVATE(pbb) \ + __bb_trace_r5900_perf_counter(pbb) + +#define BB_INIT_TRACE_FUNC_PRIVATE(blocks, blockno) \ + __bb_init_trace_r5900_perf_counter(blocks, blockno) + +#define BB_TRACE_RET_PRIVATE \ + __bb_ret_trace_r5900_perf_counter + +/* + * bb_stack size + * inital and growth value + * + */ +#define BB_INITAL_STACK_SIZE 100 +#define BB_GROWTH_OF_STACK_SIZE 100