1132718Skan/* Target definitions for GCC for Intel 80386 running System V.4
2117395Skan   Copyright (C) 1991, 2001, 2002 Free Software Foundation, Inc.
318334Speter
418334Speter   Written by Ron Guilmette (rfg@netcom.com).
518334Speter
6132718SkanThis file is part of GCC.
718334Speter
8132718SkanGCC is free software; you can redistribute it and/or modify
918334Speterit under the terms of the GNU General Public License as published by
1018334Speterthe Free Software Foundation; either version 2, or (at your option)
1118334Speterany later version.
1218334Speter
13132718SkanGCC is distributed in the hope that it will be useful,
1418334Speterbut WITHOUT ANY WARRANTY; without even the implied warranty of
1518334SpeterMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1618334SpeterGNU General Public License for more details.
1718334Speter
1818334SpeterYou should have received a copy of the GNU General Public License
19132718Skanalong with GCC; see the file COPYING.  If not, write to
20169689Skanthe Free Software Foundation, 51 Franklin Street, Fifth Floor,
21169689SkanBoston, MA 02110-1301, USA.  */
2218334Speter
2318334Speter
2418334Speter#define TARGET_VERSION fprintf (stderr, " (i386 System V Release 4)");
2518334Speter
2618334Speter/* The svr4 ABI for the i386 says that records and unions are returned
2718334Speter   in memory.  */
2818334Speter
2918334Speter#undef RETURN_IN_MEMORY
3018334Speter#define RETURN_IN_MEMORY(TYPE) \
3190075Sobrien  (TYPE_MODE (TYPE) == BLKmode \
3290075Sobrien   || (VECTOR_MODE_P (TYPE_MODE (TYPE)) && int_size_in_bytes (TYPE) == 8))
3318334Speter
3418334Speter/* Output at beginning of assembler file.  */
3518334Speter/* The .file command should always begin the output.  */
3618334Speter
37132718Skan#define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
38132718Skan#undef X86_FILE_START_VERSION_DIRECTIVE
39132718Skan#define X86_FILE_START_VERSION_DIRECTIVE true
4018334Speter
4118334Speter#undef DBX_REGISTER_NUMBER
4290075Sobrien#define DBX_REGISTER_NUMBER(n)  svr4_dbx_register_map[n]
4318334Speter
4418334Speter/* The routine used to output sequences of byte values.  We use a special
4518334Speter   version of this for most svr4 targets because doing so makes the
4618334Speter   generated assembly code more compact (and thus faster to assemble)
4718334Speter   as well as more readable.  Note that if we find subparts of the
4818334Speter   character sequence which end with NUL (and which are shorter than
4918334Speter   STRING_LIMIT) we output those using ASM_OUTPUT_LIMITED_STRING.  */
5018334Speter
5118334Speter#undef ASM_OUTPUT_ASCII
5218334Speter#define ASM_OUTPUT_ASCII(FILE, STR, LENGTH)				\
5318334Speter  do									\
5418334Speter    {									\
55132718Skan      const unsigned char *_ascii_bytes =				\
5690075Sobrien        (const unsigned char *) (STR);					\
57132718Skan      const unsigned char *limit = _ascii_bytes + (LENGTH);		\
58132718Skan      unsigned bytes_in_chunk = 0;					\
5918334Speter      for (; _ascii_bytes < limit; _ascii_bytes++)			\
6018334Speter        {								\
61132718Skan	  const unsigned char *p;					\
6218334Speter	  if (bytes_in_chunk >= 64)					\
6318334Speter	    {								\
6418334Speter	      fputc ('\n', (FILE));					\
6518334Speter	      bytes_in_chunk = 0;					\
6618334Speter	    }								\
6718334Speter	  for (p = _ascii_bytes; p < limit && *p != '\0'; p++)		\
6818334Speter	    continue;							\
6990075Sobrien	  if (p < limit && (p - _ascii_bytes) <= (long) STRING_LIMIT)	\
7018334Speter	    {								\
7118334Speter	      if (bytes_in_chunk > 0)					\
7218334Speter		{							\
7318334Speter		  fputc ('\n', (FILE));					\
7418334Speter		  bytes_in_chunk = 0;					\
7518334Speter		}							\
7618334Speter	      ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes);		\
7718334Speter	      _ascii_bytes = p;						\
7818334Speter	    }								\
7918334Speter	  else								\
8018334Speter	    {								\
8118334Speter	      if (bytes_in_chunk == 0)					\
8218334Speter		fprintf ((FILE), "\t.byte\t");				\
8318334Speter	      else							\
8418334Speter		fputc (',', (FILE));					\
8518334Speter	      fprintf ((FILE), "0x%02x", *_ascii_bytes);		\
8618334Speter	      bytes_in_chunk += 5;					\
8718334Speter	    }								\
8818334Speter	}								\
8918334Speter      if (bytes_in_chunk > 0)						\
9018334Speter        fprintf ((FILE), "\n");						\
9118334Speter    }									\
9218334Speter  while (0)
9318334Speter
9450397Sobrien/* A C statement (sans semicolon) to output to the stdio stream
9550397Sobrien   FILE the assembler definition of uninitialized global DECL named
9650397Sobrien   NAME whose size is SIZE bytes and alignment is ALIGN bytes.
9750397Sobrien   Try to use asm_output_aligned_bss to implement this macro.  */
9850397Sobrien
9950397Sobrien#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
10050397Sobrien  asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
10190075Sobrien
10290075Sobrien/* Handle special EH pointer encodings.  Absolute, pc-relative, and
10390075Sobrien   indirect are handled automatically.  */
10490075Sobrien#define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(FILE, ENCODING, SIZE, ADDR, DONE) \
10590075Sobrien  do {									\
10690075Sobrien    if ((SIZE) == 4 && ((ENCODING) & 0x70) == DW_EH_PE_datarel)		\
10790075Sobrien      {									\
10890075Sobrien        fputs (ASM_LONG, FILE);						\
10990075Sobrien        assemble_name (FILE, XSTR (ADDR, 0));				\
11090075Sobrien	fputs (((ENCODING) & DW_EH_PE_indirect ? "@GOT" : "@GOTOFF"), FILE); \
11190075Sobrien        goto DONE;							\
11290075Sobrien      }									\
11390075Sobrien  } while (0)
11490075Sobrien
11590075Sobrien/* Used by crtstuff.c to initialize the base of data-relative relocations.
11690075Sobrien   These are GOT relative on x86, so return the pic register.  */
11790075Sobrien#ifdef __PIC__
11890075Sobrien#define CRT_GET_RFIB_DATA(BASE)			\
11990075Sobrien  {						\
12090075Sobrien    register void *ebx_ __asm__("ebx");		\
12190075Sobrien    BASE = ebx_;				\
12290075Sobrien  }
12390075Sobrien#else
12490075Sobrien#define CRT_GET_RFIB_DATA(BASE)						\
12590075Sobrien  __asm__ ("call\t.LPR%=\n"						\
12690075Sobrien	   ".LPR%=:\n\t"						\
12790075Sobrien	   "popl\t%0\n\t"						\
12890075Sobrien	   /* Due to a GAS bug, this cannot use EAX.  That encodes	\
12990075Sobrien	      smaller than the traditional EBX, which results in the	\
13090075Sobrien	      offset being off by one.  */				\
13190075Sobrien	   "addl\t$_GLOBAL_OFFSET_TABLE_+[.-.LPR%=],%0"			\
13290075Sobrien	   : "=d"(BASE))
13390075Sobrien#endif
134