home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Source / GNU / gcc / config / i386 / next.h < prev    next >
C/C++ Source or Header  |  1996-06-12  |  12KB  |  380 lines

  1. /* Target definitions for GNU compiler for Intel x86 CPU running NeXTSTEP
  2.    Copyright (C) 1993 Free Software Foundation, Inc.
  3.  
  4. This file is part of GNU CC.
  5.  
  6. GNU CC is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2, or (at your option)
  9. any later version.
  10.  
  11. GNU CC is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with GNU CC; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. #ifndef NEXT_SEMANTICS
  21. #define NEXT_SEMANTICS
  22. #endif
  23.  
  24. #include "i386/gas.h"
  25. #include "next/nextstep.h"
  26.  
  27. #define MACHO_PIC 1
  28.  
  29. #ifndef MACHOPIC_PURE
  30. #define MACHOPIC_PURE          (flag_pic == 2)
  31. #define MACHOPIC_INDIRECT      (flag_pic)
  32. #define MACHOPIC_JUST_INDIRECT (flag_pic == 1)
  33. #endif
  34.  
  35. #define DEFAULT_TARGET_ARCH "i386"
  36.  
  37. /* By default, target has a 80387, with IEEE FP, and no mem->mem instructions.
  38.    (The reason why the latter is required is not clear.)  */
  39.  
  40. #undef    TARGET_DEFAULT
  41. #define TARGET_DEFAULT  (MASK_80387|MASK_IEEE_FP|MASK_NO_MOVE)
  42.  
  43. #undef SUBTARGET_SWITCHES 
  44. #define SUBTARGET_SWITCHES \
  45.   { "unaligned-text",     0400 }, \
  46.   { "no-unaligned-text", -0400 },
  47.  
  48. #define TARGET_NO_LOOP_ALIGNMENT (target_flags & 0400)
  49.  
  50. /* The NeXT configuration aligns everything at 4 byte boundary.
  51.    Even though this is not optimal with respect to cache lines, this
  52.    saves us sigificant space, which is a precious ressource on a
  53.    NeXTSTEP machine. */
  54.  
  55. #undef ASM_OUTPUT_ALIGN_CODE
  56. #define ASM_OUTPUT_ALIGN_CODE(FILE)            \
  57.    if (!TARGET_NO_LOOP_ALIGNMENT)            \
  58.      fprintf ((FILE), "\t.align 2,0x90\n")
  59.  
  60. /* Align start of loop at 4-byte boundary.  */
  61.  
  62. #undef ASM_OUTPUT_LOOP_ALIGN
  63. #define ASM_OUTPUT_LOOP_ALIGN(FILE) \
  64.    if (!TARGET_NO_LOOP_ALIGNMENT)            \
  65.      fprintf ((FILE), "\t.align 2,0x90\n");  /* Use log of 4 as arg.  */
  66.  
  67. #undef ASM_OUTPUT_ALIGN
  68. #undef    ASM_OUTPUT_ALIGN
  69. #define ASM_OUTPUT_ALIGN(FILE,LOG)    \
  70.  do { if ((LOG) != 0)            \
  71.       if (in_text_section ())         \
  72.     fprintf (FILE, "\t%s %d,0x90\n", ALIGN_ASM_OP, (LOG)); \
  73.       else \
  74.     fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG)); \
  75.     } while (0)
  76.     
  77.  
  78. #undef FUNCTION_BOUNDARY
  79. #define FUNCTION_BOUNDARY 32
  80.  
  81. #define TARGET_ARCHITECTURE \
  82.   { { "i386", 2 },   /* Treat i386 like i486.  */              \
  83.     { "i486", 2 },   /* Turn on -m486.  */            \
  84.     { "i486SX", 2 }, /* Turn on -m486.  */            \
  85.  /* { "i586", 4 },   */ /* Turn on -m486.  */            \
  86.  /* { "i586SX", 4 }, */ /* Turn on -m586.  */                   \
  87.  }
  88.  
  89. /* Implicit library calls should use memcpy, not bcopy, etc.  */
  90.  
  91. #define TARGET_MEM_FUNCTIONS
  92.  
  93. /* Machines that use the AT&T assembler syntax
  94.    also return floating point values in an FP register.
  95.    Define how to find the value returned by a function.
  96.    VALTYPE is the data type of the value (as a tree).
  97.    If the precise function being called is known, FUNC is its FUNCTION_DECL;
  98.    otherwise, FUNC is 0.  */
  99.  
  100. #undef    VALUE_REGNO
  101. #define VALUE_REGNO(MODE) \
  102.   ((MODE) == SFmode || (MODE) == DFmode || (MODE) == XFmode    \
  103.    ? FIRST_FLOAT_REG : 0)
  104.  
  105. /* 1 if N is a possible register number for a function value. */
  106.  
  107. #undef    FUNCTION_VALUE_REGNO_P
  108. #define FUNCTION_VALUE_REGNO_P(N) ((N) == 0 || (N)== FIRST_FLOAT_REG)
  109.  
  110. #ifdef REAL_VALUE_TO_TARGET_LONG_DOUBLE
  111. #undef    ASM_OUTPUT_LONG_DOUBLE
  112. #define ASM_OUTPUT_LONG_DOUBLE(FILE,VALUE)                \
  113.   do {                                    \
  114.     long hex[3];                            \
  115.     REAL_VALUE_TO_TARGET_LONG_DOUBLE (VALUE, hex);            \
  116.     if (sizeof (int) == sizeof (long))                    \
  117.       fprintf (FILE, "\t.long 0x%x\n\t.long 0x%x\n\t.long 0x%x\n",    \
  118.         hex[0], hex[1], hex[2]);                \
  119.     else                                \
  120.       fprintf (FILE, "\t.long 0x%lx\n\t.long 0x%lx\n\t.long 0x%lx\n",    \
  121.         hex[0], hex[1], hex[2]);                \
  122.   } while (0)
  123. #endif
  124.  
  125. #ifdef REAL_VALUE_TO_TARGET_DOUBLE
  126. #undef    ASM_OUTPUT_DOUBLE
  127. #define ASM_OUTPUT_DOUBLE(FILE,VALUE)                    \
  128.   do {                                    \
  129.     long hex[2];                            \
  130.     REAL_VALUE_TO_TARGET_DOUBLE (VALUE, hex);                \
  131.     if (sizeof (int) == sizeof (long))                    \
  132.       fprintf (FILE, "\t.long 0x%x\n\t.long 0x%x\n", hex[0], hex[1]);    \
  133.     else                                \
  134.       fprintf (FILE, "\t.long 0x%lx\n\t.long 0x%lx\n", hex[0], hex[1]);    \
  135.   } while (0)
  136. #endif
  137.  
  138. /* This is how to output an assembler line defining a `float' constant.  */
  139.  
  140. #ifdef REAL_VALUE_TO_TARGET_SINGLE
  141. #undef    ASM_OUTPUT_FLOAT
  142. #define ASM_OUTPUT_FLOAT(FILE,VALUE)                    \
  143.   do {                                    \
  144.     long hex;                                \
  145.     REAL_VALUE_TO_TARGET_SINGLE (VALUE, hex);                \
  146.     if (sizeof (int) == sizeof (long))                    \
  147.       fprintf (FILE, "\t.long 0x%x\n", hex);                \
  148.     else                                \
  149.       fprintf (FILE, "\t.long 0x%lx\n", hex);                \
  150.   } while (0)
  151. #endif
  152.  
  153. /* A C statement or statements which output an assembler instruction
  154.    opcode to the stdio stream STREAM.  The macro-operand PTR is a
  155.    variable of type `char *' which points to the opcode name in its
  156.    "internal" form--the form that is written in the machine description.
  157.  
  158.    GAS version 1.38.1 doesn't understand the `repz' opcode mnemonic.
  159.    So use `repe' instead.  */
  160.  
  161. #undef    ASM_OUTPUT_OPCODE
  162. #define ASM_OUTPUT_OPCODE(STREAM, PTR)    \
  163. {                            \
  164.   if ((PTR)[0] == 'r'                    \
  165.       && (PTR)[1] == 'e'                \
  166.       && (PTR)[2] == 'p')                \
  167.     {                            \
  168.       if ((PTR)[3] == 'z')                \
  169.     {                        \
  170.       fprintf (STREAM, "repe");            \
  171.       (PTR) += 4;                    \
  172.     }                        \
  173.       else if ((PTR)[3] == 'n' && (PTR)[4] == 'z')    \
  174.     {                        \
  175.       fprintf (STREAM, "repne");            \
  176.       (PTR) += 5;                    \
  177.     }                        \
  178.     }                            \
  179. }
  180.  
  181. /* Define macro used to output shift-double opcodes when the shift
  182.    count is in %cl.  Some assemblers require %cl as an argument;
  183.    some don't.
  184.  
  185.    GAS requires the %cl argument, so override unx386.h. */
  186.  
  187. #undef    AS3_SHIFT_DOUBLE
  188. #define AS3_SHIFT_DOUBLE(a,b,c,d) AS3 (a,b,c,d)
  189.  
  190. /* Print opcodes the way that GAS expects them. */
  191. #define GAS_MNEMONICS 1
  192.  
  193. /* Names to predefine in the preprocessor for this target machine.  */
  194.  
  195. #undef    CPP_PREDEFINES
  196. #define CPP_PREDEFINES "-Di386 -DNeXT -Dunix -D__MACH__ -D__LITTLE_ENDIAN__ -D__ARCHITECTURE__=\"i386\" "
  197.  
  198. /* This accounts for the return pc and saved fp on the i386. */
  199.  
  200. #define OBJC_FORWARDING_STACK_OFFSET 8
  201. #define OBJC_FORWARDING_MIN_OFFSET 8
  202.  
  203. /* We do not want a dot in internal labels.  */
  204.  
  205. #undef LPREFIX
  206. #define LPREFIX "L"
  207.  
  208. #undef    ASM_GENERATE_INTERNAL_LABEL
  209. #define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER)    \
  210.     sprintf ((BUF), "*%s%d", (PREFIX), (NUMBER))
  211.  
  212. #undef ASM_OUTPUT_INTERNAL_LABEL
  213. #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)    \
  214.   fprintf (FILE, "%s%d:\n", PREFIX, NUM)
  215.  
  216. /* Output to assembler file text saying following lines
  217.    may contain character constants, extra white space, comments, etc.  */
  218.  
  219. #undef    ASM_APP_ON
  220. #define ASM_APP_ON "#APP\n"
  221.  
  222. /* Output to assembler file text saying following lines
  223.    no longer contain unusual constructs.  */
  224.  
  225. #undef    ASM_APP_OFF
  226. #define ASM_APP_OFF "#NO_APP\n"
  227.  
  228. #undef    ASM_OUTPUT_REG_PUSH
  229. #define ASM_OUTPUT_REG_PUSH(FILE,REGNO)  \
  230.   fprintf (FILE, "\tpushl %se%s\n", "%", reg_names[REGNO])
  231.  
  232. #undef    ASM_OUTPUT_REG_POP
  233. #define ASM_OUTPUT_REG_POP(FILE,REGNO)  \
  234.   fprintf (FILE, "\tpopl %se%s\n", "%", reg_names[REGNO])
  235.  
  236. /* This is being overridden because the default i386 configuration
  237.    generates calls to "_mcount".  NeXT system libraries all use
  238.    "mcount".  */
  239.  
  240. #undef    FUNCTION_PROFILER
  241. #define FUNCTION_PROFILER(FILE, LABELNO)                \
  242. {                                    \
  243.   if (flag_pic)                                \
  244.     {                                    \
  245.       fprintf (FILE, "\tleal %sP%d@GOTOFF(%%ebx),%%edx\n",        \
  246.                LPREFIX, (LABELNO));                    \
  247.       fprintf (FILE, "\tcall *mcount@GOT(%%ebx)\n");            \
  248.     }                                    \
  249.   else                                    \
  250.     {                                      \
  251.       fprintf (FILE, "\tmovl $%sP%d,%%edx\n", LPREFIX, (LABELNO));    \
  252.       fprintf (FILE, "\tcall mcount\n");                \
  253.     }                                    \
  254. }
  255.  
  256. /* BEGIN Calling Convention CHANGES */
  257.  
  258. /* These changes violate the Intel/Unix ABI.  Specifically, they
  259.    change the way that space for a block return value is passed to a
  260.    function.  The ABI says that the pointer is passed on the stack.
  261.    We change to pass the pointer in %ebx.  This makes the NeXT
  262.    Objective-C forwarding mechanism possible to implement on an i386.  */
  263.  
  264. /* Do NOT pass address of structure values on the stack.  */
  265.  
  266. #undef    STRUCT_VALUE_INCOMING
  267. #undef    STRUCT_VALUE
  268.  
  269. /* Pass them in %ebx.  */
  270.  
  271. #undef    STRUCT_VALUE_REGNUM
  272. #define STRUCT_VALUE_REGNUM 3
  273.  
  274. #undef PIC_OFFSET_TABLE_REGNUM 
  275. #define PIC_OFFSET_TABLE_REGNUM  \
  276.    ( pic_offset_table_rtx && GET_CODE (pic_offset_table_rtx) == REG \
  277.      ? REGNO(pic_offset_table_rtx) \
  278.      : -1)
  279.  
  280. /* The next four macros were copied from gcc 2.5.8.  */
  281. #define GO_IF_INDEXABLE_BASE(X, ADDR)    \
  282.  if (GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X)) goto ADDR
  283.  
  284. #define LEGITIMATE_INDEX_REG_P(X)   \
  285.   (GET_CODE (X) == REG && REG_OK_FOR_INDEX_P (X))
  286.  
  287. /* Return 1 if X is an index or an index times a scale.  */
  288.  
  289. #define LEGITIMATE_INDEX_P(X)   \
  290.    (LEGITIMATE_INDEX_REG_P (X)                \
  291.     || (GET_CODE (X) == MULT                \
  292.     && LEGITIMATE_INDEX_REG_P (XEXP (X, 0))        \
  293.     && GET_CODE (XEXP (X, 1)) == CONST_INT        \
  294.     && (INTVAL (XEXP (X, 1)) == 2            \
  295.         || INTVAL (XEXP (X, 1)) == 4        \
  296.         || INTVAL (XEXP (X, 1)) == 8)))
  297.  
  298. /* Go to ADDR if X is an index term, a base reg, or a sum of those.  */
  299.  
  300. #define GO_IF_INDEXING(X, ADDR)    \
  301. { if (LEGITIMATE_INDEX_P (X)) goto ADDR;                \
  302.   GO_IF_INDEXABLE_BASE (X, ADDR);                    \
  303.   if (GET_CODE (X) == PLUS && LEGITIMATE_INDEX_P (XEXP (X, 0)))        \
  304.     { GO_IF_INDEXABLE_BASE (XEXP (X, 1), ADDR); }            \
  305.   if (GET_CODE (X) == PLUS && LEGITIMATE_INDEX_P (XEXP (X, 1)))        \
  306.     { GO_IF_INDEXABLE_BASE (XEXP (X, 0), ADDR); } }
  307.  
  308. #undef GO_IF_LEGITIMATE_ADDRESS
  309. #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)    \
  310. {                                    \
  311.   if (CONSTANT_ADDRESS_P (X)                        \
  312.       && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (X)))            \
  313.     goto ADDR;                                \
  314.   GO_IF_INDEXING (X, ADDR);                        \
  315.   if (GET_CODE (X) == PLUS && CONSTANT_ADDRESS_P (XEXP (X, 1)))        \
  316.     {                                    \
  317.       rtx x0 = XEXP (X, 0);                        \
  318.       rtx x1 = XEXP (X, 0);                        \
  319.       if (! flag_pic || LEGITIMATE_PIC_OPERAND_P (x1))            \
  320.     { GO_IF_INDEXING (x0, ADDR); }                    \
  321.     }                                    \
  322. }
  323.  
  324. #undef INIT_EXPANDERS
  325. #define INIT_EXPANDERS \
  326.  do { pic_offset_table_rtx  = gen_reg_rtx (SImode); \
  327.       clear_386_stack_locals (); \
  328.     } while (0)
  329.  
  330. /* Value is the number of bytes of arguments automatically
  331.    popped when returning from a subroutine call.
  332.    FUNDECL is the declaration node of the function (as a tree),
  333.    FUNTYPE is the data type of the function (as a tree),
  334.    or for a library call it is an identifier node for the subroutine name.
  335.    SIZE is the number of bytes of arguments passed on the stack.
  336.  
  337.    On the 80386, the RTD insn may be used to pop them if the number
  338.      of args is fixed, but if the number is variable then the caller
  339.      must pop them all.  RTD can't be used for library calls now
  340.      because the library is compiled with the Unix compiler.
  341.    Use of RTD is a selectable option, since it is incompatible with
  342.    standard Unix calling sequences.  If the option is not selected,
  343.    the caller must always pop the args.
  344.  
  345.    The attribute stdcall is equivalent to RTD on a per module basis.  */
  346.  
  347. /* Because we are passing the pointer in a register, we don't need to
  348.    rely on the callee to pop it.  */
  349.  
  350. #undef    RETURN_POPS_ARGS
  351. #define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE)            \
  352.   (TREE_CODE (FUNTYPE) == IDENTIFIER_NODE            \
  353.    ? 0                                \
  354.    : (TARGET_RTD                        \
  355.       && (TYPE_ARG_TYPES (FUNTYPE) == 0                \
  356.           || (TREE_VALUE (tree_last (TYPE_ARG_TYPES (FUNTYPE)))    \
  357.               == void_type_node))) ? (SIZE) : 0)
  358.  
  359. /* END Calling Convention CHANGES */
  360.  
  361. /* Turn on floating point precision control as default */
  362.  
  363. /* #define DEFAULT_FPPC 1 */
  364.  
  365. #undef ASM_OUTPUT_ADDR_DIFF_ELT
  366. #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
  367.   fprintf (FILE, "\t.long %s%d-%s%d\n",LPREFIX, VALUE,LPREFIX, REL)
  368.  
  369.  
  370. #undef FINALIZE_PIC
  371. #define FINALIZE_PIC i386_finalize_machopic ()
  372.  
  373. /* Redefine this to use %eax instead of %edx.  */
  374. #undef FUNCTION_PROFILER
  375. #define FUNCTION_PROFILER(FILE, LABELNO)
  376.  
  377. #define PIC_OFFSET_TABLE_RTX \
  378.    (reload_in_progress ? (rtx)assign_386_stack_local (SImode, 2) : pic_offset_table_rtx)
  379.  
  380.