/* Definitions of target machine for GNU compiler.  Harris tahoe version.
   Copyright (C) 1989, 1993 Free Software Foundation, Inc.

This file is part of GNU CC.

GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, 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 of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING.  If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */


#include "tahoe/tahoe.h"

#undef CPP_PREDEFINES
#define CPP_PREDEFINES "-Dtahoe -Dunix -Dhcx -Asystem(unix) -Acpu(tahoe) -Amachine(tahoe)"

#undef DBX_DEBUGGING_INFO
#define SDB_DEBUGGING_INFO

#undef LIB_SPEC

#undef TARGET_DEFAULT
#define TARGET_DEFAULT 1

/* urem and udiv don't exist on this system.  */
#undef UDIVSI3_LIBCALL
#undef UMODSI3_LIBCALL

/* Operand of .align is not logarithmic.  */
#undef ASM_OUTPUT_ALIGN
#define ASM_OUTPUT_ALIGN(FILE,LOG)  \
  LOG ? fprintf (FILE, "\t.align %d\n", 1 << (LOG)) : 0

/* For the same reason, we need .align 2 after casesi.  */
#undef PRINT_OPERAND
#define PRINT_OPERAND(FILE, X, CODE)  \
{ if (CODE == '@')							\
    putc ('2', FILE);							\
  else if (GET_CODE (X) == REG)						\
    fprintf (FILE, "%s", reg_names[REGNO (X)]);				\
  else if (GET_CODE (X) == MEM)						\
    output_address (XEXP (X, 0));					\
  else { putc ('$', FILE); output_addr_const (FILE, X); }}

#undef ASM_OUTPUT_LOCAL
#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)  \
( fputs (".bss ", (FILE)),			\
  assemble_name ((FILE), (NAME)),		\
  fprintf ((FILE), ",%u,4\n", (ROUNDED)))

/* Output at beginning of assembler file.  */
/* The .file command should always begin the output.  */

#undef ASM_FILE_START
#define ASM_FILE_START(FILE)			\
  output_file_directive ((FILE), main_input_filename);

#define ASM_OUTPUT_ASCII(FILE, PTR, SIZE)		\
do {							\
  unsigned char *_p = (PTR);				\
  int _thissize = (SIZE);				\
  fprintf ((FILE), "\t.ascii \"");			\
  for (i = 0; i < _thissize; i++)			\
    {							\
      register int c = _p[i];				\
      if (c >= ' ' && c < 0177 && c != '\"' && c != '\\') \
	putc (c, (FILE));				\
      else						\
	{						\
	  fprintf ((FILE), "\\%o", c);			\
	  if (i < _thissize - 1				\
	      && _p[i + 1] >= '0' && _p[i + 1] <= '9')	\
	    fprintf ((FILE), "\"\n\t.ascii \"");	\
	}						\
    }							\
  fprintf ((FILE), "\"\n");				\
} while (0)
