📄 dsp16xx.h
字号:
/* Definitions of target machine for GNU compiler. AT&T DSP1600. Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. Contributed by Michael Collison (collison@world.std.com).This file is part of GNU CC.GNU CC is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 1, or (at your option)any later version.GNU CC is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU CC; see the file COPYING. If not, write tothe Free Software Foundation, 59 Temple Place - Suite 330,Boston, MA 02111-1307, USA. */extern char *low_reg_names[];extern char *text_seg_name;extern char *rsect_text;extern char *data_seg_name;extern char *rsect_data;extern char *bss_seg_name;extern char *rsect_bss;extern char *const_seg_name;extern char *rsect_const;extern char *chip_name;extern char *save_chip_name;extern struct rtx_def *dsp16xx_compare_op0, *dsp16xx_compare_op1;extern struct rtx_def *(*dsp16xx_compare_gen)();extern struct rtx_def *gen_compare_reg();extern struct rtx_def *dsp16xx_addhf3_libcall;extern struct rtx_def *dsp16xx_subhf3_libcall;extern struct rtx_def *dsp16xx_mulhf3_libcall;extern struct rtx_def *dsp16xx_divhf3_libcall;extern struct rtx_def *dsp16xx_cmphf3_libcall;extern struct rtx_def *dsp16xx_fixhfhi2_libcall;extern struct rtx_def *dsp16xx_floathihf2_libcall;extern struct rtx_def *dsp16xx_neghf2_libcall;extern struct rtx_def *dsp16xx_umulhi3_libcall;extern struct rtx_def *dsp16xx_mulhi3_libcall;extern struct rtx_def *dsp16xx_udivqi3_libcall;extern struct rtx_def *dsp16xx_udivhi3_libcall;extern struct rtx_def *dsp16xx_divqi3_libcall;extern struct rtx_def *dsp16xx_divhi3_libcall;extern struct rtx_def *dsp16xx_modqi3_libcall;extern struct rtx_def *dsp16xx_modhi3_libcall;extern struct rtx_def *dsp16xx_umodqi3_libcall;extern struct rtx_def *dsp16xx_umodhi3_libcall;extern struct rtx_def *dsp16xx_ashrhi3_libcall;extern struct rtx_def *dsp16xx_ashlhi3_libcall;extern struct rtx_def *dsp16xx_lshrhi3_libcall;extern int hard_regno_mode_ok ();extern enum reg_class dsp16xx_reg_class_from_letter ();extern enum reg_class dsp16xx_limit_reload_class ();extern int hard_regno_nregs ();extern int regno_reg_class ();extern int move_operand ();extern int symbolic_address_p ();extern int Y_address ();extern int call_address_operand ();extern void notice_update_cc();extern void function_prologue ();extern void function_epilogue ();extern int dsp1600_comparison_reverse ();extern void double_reg_from_memory ();extern void double_reg_to_memory ();extern void bss_section ();extern struct rtx_def *dsp16xx_function_arg ();extern void dsp16xx_function_arg_advance ();extern enum rtx_code next_cc_user_code ();extern int next_cc_user_unsigned ();extern struct rtx_def *gen_tst_reg ();extern char *output_block_move();/* RUN-TIME TARGET SPECIFICATION */#define DSP16XX 1/* Name of the AT&T assembler */#define ASM_PROG "as1600"/* Name of the AT&T linker */#define LD_PROG "ld1600"/* Define which switches take word arguments */#define WORD_SWITCH_TAKES_ARG(STR) \ (!strcmp (STR, "ifile") ? 1 : \ 0)#ifdef CC1_SPEC#undef CC1_SPEC#endif#define CC1_SPEC ""/* Define this as a spec to call the AT&T assembler */#define CROSS_ASM_SPEC "%{!S:as1600 %a %i\n }"/* Define this as a spec to call the AT&T linker */#define CROSS_LINK_SPEC "%{!c:%{!M:%{!MM:%{!E:%{!S:ld1600 %l %X %{o*} %{m} \ %{r} %{s} %{t} %{u*} %{x}\ %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:}\ %{L*} %D %o %{!nostdlib:-le1600 %L -le1600}\ %{!A:%{!nostdlib:%{!nostartfiles:%E}}}\n }}}}}"/* Nothing complicated here, just link with libc.a under normal circumstances */#define LIB_SPEC "-lc"/* Specify the startup file to link with. */#define STARTFILE_SPEC "%{mmap1:m1_crt0.o%s} \%{mmap2:m2_crt0.o%s} \%{mmap3:m3_crt0.o%s} \%{mmap4:m4_crt0.o%s} \%{!mmap*: %{!ifile*: m4_crt0.o%s} %{ifile*: \%eA -ifile option requires a -map option}}"/* Specify the end file to link with */#define ENDFILE_SPEC "%{mmap1:m1_crtn.o%s} \%{mmap2:m2_crtn.o%s} \%{mmap3:m3_crtn.o%s} \%{mmap4:m4_crtn.o%s} \%{!mmap*: %{!ifile*: m4_crtn.o%s} %{ifile*: \%eA -ifile option requires a -map option}}"/* Tell gcc where to look for the startfile */#define STANDARD_STARTFILE_PREFIX "/d1600/lib"/* Tell gcc where to look for its executables */#define STANDARD_EXEC_PREFIX "/d1600/bin"/* Command line options to the AT&T assembler */#define ASM_SPEC "%{v:-V} %{g*:-g}"/* Command line options for the AT&T linker */#define LINK_SPEC "%{v:-V} %{minit:-i} \%{!ifile*:%{mmap1:-ifile m1_deflt.if%s} \ %{mmap2:-ifile m2_deflt.if%s} \ %{mmap3:-ifile m3_deflt.if%s} \ %{mmap4:-ifile m4_deflt.if%s} \ %{!mmap*:-ifile m4_deflt.if%s}} \%{ifile*} %{!r:-a}"/* Names to predefine in the preprocessor for this target machine. */#ifdef __MSDOS__#define CPP_PREDEFINES "-Ddsp1600 -DDSP1600 -DMSDOS"#else#define CPP_PREDEFINES "-Ddsp1600 -DDSP1600 -Ddsp1610 -DDSP1610"#endif/* Run-time compilation parameters selecting different hardware subsets. */extern int target_flags;/* Macros used in the machine description to test the flags. */#define MASK_REGPARM 0x00000001 /* Pass parameters in registers */#define MASK_NEAR_CALL 0x00000002 /* The call is on the same 4k page */#define MASK_NEAR_JUMP 0x00000004 /* The jump is on the same 4k page */#define MASK_BMU 0x00000008 /* Use the 'bmu' shift instructions */#define MASK_OPTIMIZE_MEMORY 0x00000010 /* Optimize to conserve memory */#define MASK_OPTIMIZE_SPEED 0x00000020 /* Optimize for speed */#define MASK_MAP1 0x00000040 /* Link with map1 */#define MASK_MAP2 0x00000080 /* Link with map2 */#define MASK_MAP3 0x00000100 /* Link with map3 */#define MASK_MAP4 0x00000200 /* Link with map4 */#define MASK_YBASE_HIGH 0x00000400 /* The ybase register window starts high */#define MASK_INIT 0x00000800 /* Have the linker generate tables to initialize data at startup */#define MASK_INLINE_MULT 0x00001000 /* Inline 32 bit multiplies */#define MASK_RESERVE_YBASE 0x00002000 /* Reserved the ybase registers *//* Compile passing first two args in regs 0 and 1. This exists only to test compiler features that will be needed for RISC chips. It is not usable and is not intended to be usable on this cpu. */#define TARGET_REGPARM (target_flags & MASK_REGPARM)/* The call is on the same 4k page, so instead of loading the 'pt' register and branching, we can branch directly */#define TARGET_NEAR_CALL (target_flags & MASK_NEAR_CALL)/* The jump is on the same 4k page, so instead of loading the 'pt' register and branching, we can branch directly */#define TARGET_NEAR_JUMP (target_flags & MASK_NEAR_JUMP)/* Generate shift instructions to use the 1610 Bit Manipulation Unit. */#define TARGET_BMU (target_flags & MASK_BMU)/* Optimize to conserve memory */#define TARGET_OPTIMIZE_MEMORY (target_flags & MASK_OPTIMIZE_MEMORY)/* Optimize for maximum speed */#define TARGET_OPTIMIZE_SPEED (target_flags & MASK_OPTIMIZE_SPEED)#define TARGET_YBASE_HIGH (target_flags & MASK_YBASE_HIGH)/* Direct the linker to output extra info for initialized data */#define TARGET_MASK_INIT (target_flags & MASK_INIT)#define TARGET_INLINE_MULT (target_flags & MASK_INLINE_MULT)/* Reserve the ybase registers *(0) - *(31) */#define TARGET_RESERVE_YBASE (target_flags & MASK_RESERVE_YBASE)/* Macro to define tables used to set the flags. This is a list in braces of pairs in braces, each pair being { "NAME", VALUE } where VALUE is the bits to set or minus the bits to clear. An empty string NAME is used to identify the default VALUE. */#define TARGET_SWITCHES \ { \ { "regparm", MASK_REGPARM}, \ { "no-regparm", -MASK_REGPARM}, \ { "no-near-call", -MASK_NEAR_CALL}, \ { "near-jump", MASK_NEAR_JUMP}, \ { "no-near-jump", -MASK_NEAR_JUMP}, \ { "bmu", MASK_BMU}, \ { "no-bmu", -MASK_BMU}, \ { "Om", MASK_OPTIMIZE_MEMORY}, \ { "Os", MASK_OPTIMIZE_SPEED}, \ { "map1", MASK_MAP1}, \ { "map2", MASK_MAP2}, \ { "map3", MASK_MAP3}, \ { "map4", MASK_MAP4}, \ { "ybase-high", MASK_YBASE_HIGH}, \ { "init", MASK_INIT}, \ { "inline-mult", MASK_INLINE_MULT}, \ { "reserve-ybase", MASK_RESERVE_YBASE}, \ { "", TARGET_DEFAULT} \ }/* Default target_flags if no switches are specified */#ifndef TARGET_DEFAULT#define TARGET_DEFAULT MASK_OPTIMIZE_MEMORY|MASK_REGPARM|MASK_YBASE_HIGH#endif/* This macro is similar to `TARGET_SWITCHES' but defines names of command options that have values. Its definition is an initializer with a subgrouping for each command option. Each subgrouping contains a string constant, that defines the fixed part of the option name, and the address of a variable. The variable, type `char *', is set to the variable part of the given option if the fixed part matches. The actual option name is made by appending `-m' to the specified name. Here is an example which defines `-mshort-data-NUMBER'. If the given option is `-mshort-data-512', the variable `m88k_short_data' will be set to the string `"512"'. extern char *m88k_short_data; #define TARGET_OPTIONS { { "short-data-", &m88k_short_data } } */#define TARGET_OPTIONS \{ \ { "text=", &text_seg_name }, \ { "data=", &data_seg_name }, \ { "bss=", &bss_seg_name }, \ { "const=", &const_seg_name }, \ { "chip=", &chip_name } \}/* Sometimes certain combinations of command options do not make sense on a particular target machine. You can define a macro `OVERRIDE_OPTIONS' to take account of this. This macro, if defined, is executed once just after all the command options have been parsed. Don't use this macro to turn on various extra optimizations for `-O'. That is what `OPTIMIZATION_OPTIONS' is for. */#define OVERRIDE_OPTIONS override_options ()#define OPTIMIZATION_OPTIONS(LEVEL,SIZE) \do \ { \ flag_gnu_linker = FALSE; \ \ if (SIZE) \ { \ flag_strength_reduce = FALSE; \ flag_inline_functions = FALSE; \ } \ } \while (0)/* STORAGE LAYOUT *//* Define if you don't want extended real, but do want to use the software floating point emulator for REAL_ARITHMETIC and decimal <-> binary conversion. */#define REAL_ARITHMETIC/* Define this if most significant bit is lowest numbered in instructions that operate on numbered bit-fields. */#define BITS_BIG_ENDIAN 1/* Define this if most significant byte of a word is the lowest numbered. We define big-endian, but since the 1600 series cannot address bytes it does not matter. */#define BYTES_BIG_ENDIAN 1/* Define this if most significant word of a multiword number is numbered. For the 1600 we can decide arbitrarily since there are no machine instructions for them. */#define WORDS_BIG_ENDIAN 1/* number of bits in an addressable storage unit */#define BITS_PER_UNIT 16/* Width in bits of a "word", which is the contents of a machine register. Note that this is not necessarily the width of data type `int'; if using 16-bit ints on a 68000, this would still be 32.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -