📄 tm-delta68k.h
字号:
/* Definitions of target machine for GNU compiler. Motorola Delta version of 680x0 for x>1 copied and modified from 3b1 version by Daniel R. Bidwell (bidwell@andrews.edu). AT&T UNIX PC version (pc7300, 3b1) Written by Alex Crain bug reports to alex@umbc3.umd.edu Copyright (C) 1987 Free Software Foundation, Inc.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, 675 Mass Ave, Cambridge, MA 02139, USA. */#define SGS_3B1#include "tm-hp9k320.h"/* See tm-m68k.h. 0 means 680[01]0 with no 68881. */#undef TARGET_DEFAULT#define TARGET_DEFAULT 7/* -m68020 requires special flags to the assembler. */#undef ASM_SPEC#define ASM_SPEC "%{m68020:-68020}"/* we use /lib/libp/lib* when profiling */#undef LIB_SPEC#define LIB_SPEC "%{!shlib:%{p:-L/lib/libp} %{pg:-L/lib/libp} -lc}"/* shared libraries need to use crt0s.o */#undef STARTFILE_SPEC#define STARTFILE_SPEC \ "%{!shlib:%{pg:mcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}}}\ %{shlib:crt0s.o%s shlib.ifile%s} "/* cpp has to support a #sccs directive for the /usr/include files */#define SCCS_DIRECTIVE/* Make output for SDB. */#define SDB_DEBUGGING_INFO/* The .file command should always begin the output. */#undef ASM_FILE_START#define ASM_FILE_START(FILE) sdbout_filename ((FILE), main_input_filename)/* Don't try to define `gcc_compiled.' since the assembler might not accept symbols with periods and GDB doesn't run on this machine anyway. */#define ASM_IDENTIFY_GCC(FILE)/* Define __HAVE_68881__ in preprocessor if -m68881 is specified. This will control the use of inline 68881 insns in certain macros. */#undef CPP_SPEC#define CPP_SPEC "%{m68881:-D__HAVE_68881__}"/* Names to predefine in the preprocessor for this target machine. *//* ihnp4!lmayk!lgm@eddie.mit.edu says mc68000 and m68k should not be here. */#undef CPP_PREDEFINES#define CPP_PREDEFINES "-Dm68k -Dmc68k -Dunix -Dunixpc"/* Specify how to pad function arguments. Value should be `upward', `downward' or `none'. Same as the default, except no padding for large or variable-size args. */#define FUNCTION_ARG_PADDING(mode, size) \ (((mode) == BLKmode \ ? (GET_CODE (size) == CONST_INT \ && INTVAL (size) < PARM_BOUNDARY / BITS_PER_UNIT) \ : GET_MODE_BITSIZE (mode) < PARM_BOUNDARY) \ ? downward : none)/* Override part of the obstack macros. */#define __PTR_TO_INT(P) ((int)(P))#define __INT_TO_PTR(P) ((char *)(P))/* Override parts of tm-m68k.h to fit the SGS-3b1 assembler. */#undef TARGET_VERSION#undef ASM_FORMAT_PRIVATE_NAME#undef ASM_OUTPUT_DOUBLE#undef ASM_OUTPUT_FLOAT#undef ASM_OUTPUT_FLOAT_OPERAND#undef ASM_OUTPUT_ALIGN#undef ASM_OUTPUT_SOURCE_FILENAME#undef ASM_OUTPUT_SOURCE_LINE#undef PRINT_OPERAND_ADDRESS#undef ASM_GENERATE_INTERNAL_LABEL#undef FUNCTION_PROFILER#undef ASM_OUTPUT_ADDR_VEC_ELT#undef ASM_OUTPUT_ADDR_DIFF_ELT#undef ASM_OUTPUT_INTERNAL_LABEL#undef ASM_OUTPUT_OPCODE#undef ASM_OUTPUT_LOCAL#undef ASM_OUTPUT_LABELREF#undef ASM_OUTPUT_ASCII#undef LEGITIMATE_CONSTANT_P#undef ASM_RETURN_CASE_JUMP#define TARGET_VERSION fprintf (stderr, " (68k, SGS/AT&T unixpc syntax)");/* Store in OUTPUT a string (made with alloca) containing an assembler-name for a local static variable named NAME. LABELNO is an integer which is different for each call. */#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 12), \ sprintf ((OUTPUT), "%s_%%%d", (NAME), (LABELNO)))/* The unixpc doesn't know about double's and float's */#define ASM_OUTPUT_DOUBLE(FILE,VALUE) \do { union { double d; long l[2]; } tem; \ tem.d = (VALUE); \ fprintf(FILE, "\tlong 0x%x,0x%x\n", tem.l[0], tem.l[1]); \ } while (0)#define ASM_OUTPUT_FLOAT(FILE,VALUE) \do { union { float f; long l;} tem; \ tem.f = (VALUE); \ fprintf (FILE, "\tlong 0x%x\n", tem.l); \ } while (0)/* Output a float value (represented as a C double) as an immediate operand. This macro is a 68k-specific macro. */#define ASM_OUTPUT_FLOAT_OPERAND(FILE,VALUE) \ fprintf (FILE, "#0x%.8x", (VALUE))#define ASM_OUTPUT_ALIGN(FILE,LOG) \ if ((LOG) == 1) \ fprintf (FILE, "\teven\n"); \ else if ((LOG) != 0) \ abort ();/* The `space' pseudo in the text segment outputs nop insns rather than 0s, so we must output 0s explicitly in the text segment. */#undef ASM_OUTPUT_SKIP#define ASM_OUTPUT_SKIP(FILE,SIZE) \ if (in_text_section ()) \ { \ int i; \ for (i = 0; i < (SIZE) - 20; i += 20) \ fprintf (FILE, "\tbyte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n"); \ if (i < (SIZE)) \ { \ fprintf (FILE, "\tbyte 0"); \ i++; \ for (; i < (SIZE); i++) \ fprintf (FILE, ",0"); \ fprintf (FILE, "\n"); \ } \ } \ else \ fprintf (FILE, "\tspace %d\n", (SIZE))/* The beginnings of sdb support... */#define ASM_OUTPUT_SOURCE_FILENAME(FILE, FILENAME) \ fprintf (FILE, "\tfile\t\"%s\"\n", FILENAME)#define ASM_OUTPUT_SOURCE_LINE(FILE, LINENO) \ fprintf (FILE, "\tln\t%d\n", \ (sdb_begin_function_line \ ? last_linenum - sdb_begin_function_line : 1))/* Yet another null terminated string format. */#define ASM_OUTPUT_ASCII(FILE,PTR,LEN) \ { register int sp = 0, lp = 0; \ fprintf (FILE, "\tbyte\t"); \ loop: \ if (PTR[sp] > ' ' && ! (PTR[sp] & 0x80) && PTR[sp] != '\\') \ { lp += 3; \ fprintf (FILE, "'%c", PTR[sp]); } \ else \ { lp += 5; \ fprintf (FILE, "0x%x", PTR[sp]); } \ if (++sp < LEN) \ { if (lp > 60) \ { lp = 0; \ fprintf (FILE, "\n%s ", ASCII_DATA_ASM_OP); } \ else \ putc (',', FILE); \ goto loop; } \ putc ('\n', FILE); }/* Note that in the case of the movhi which fetches an element of an ADDR_DIFF_VEC the offset output is too large by 2. This is because the 3b1 assembler refuses to subtract 2. ASM_OUTPUT_CASE_LABEL, below, compensates for this. */#define PRINT_OPERAND_ADDRESS(FILE, ADDR) \{ register rtx reg1, reg2, breg, ireg; \ register rtx addr = ADDR; \ rtx offset; \ switch (GET_CODE (addr)) \ { \ case REG: \ fprintf (FILE, "(%s)", reg_names[REGNO (addr)]); \ break; \ case PRE_DEC: \ fprintf (FILE, "-(%s)", reg_names[REGNO (XEXP (addr, 0))]); \ break; \ case POST_INC: \ fprintf (FILE, "(%s)+", reg_names[REGNO (XEXP (addr, 0))]); \ break; \ case PLUS: \ reg1 = 0; reg2 = 0; \ ireg = 0; breg = 0; \ offset = 0; \ if (CONSTANT_ADDRESS_P (XEXP (addr, 0))) \ { \ offset = XEXP (addr, 0); \ addr = XEXP (addr, 1); \ } \ else if (CONSTANT_ADDRESS_P (XEXP (addr, 1))) \ { \ offset = XEXP (addr, 1); \ addr = XEXP (addr, 0); \ } \ if (GET_CODE (addr) != PLUS) ; \ else if (GET_CODE (XEXP (addr, 0)) == SIGN_EXTEND) \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -