/*
 * dpx2.h - Bull DPX/2 200 and 300 systems (m68k, SysVr3)
 */

#include "m68k.h"
#undef SELECT_RTX_SECTION
#include "svr3.h"

/* See m68k.h.  7 means 68020 with 68881. 
 * We really have 68030 and 68882,
 * but this will get us going.  
 */
#ifndef TARGET_DEFAULT
#define TARGET_DEFAULT 7
#endif

#define OBJECT_FORMAT_COFF
#define NO_SYS_SIGLIST

#ifdef CPP_PREDEFINES
#undef CPP_PREDEFINES
#endif
/*
 * define all the things the compiler should
 */
#ifdef ncl_mr
# define CPP_PREDEFINES "-Dunix -Dbull -DDPX2 -DSVR3 -Dmc68000 -Dmc68020 -Dncl_mr=1"
#else
# ifdef ncl_el
# define CPP_PREDEFINES "-Dunix -Dbull -DDPX2 -DSVR3 -Dmc68000 -Dmc68020 -Dncl_el"
# else
#   define CPP_PREDEFINES "-Dunix -Dbull -DDPX2 -DSVR3 -Dmc68000 -Dmc68020"
# endif
#endif

#undef	CPP_SPEC
/*
 * use -ansi to imply POSIX and XOPEN and BULL source
 * no -ansi implies _SYSV
 */
/*
 * you can't get a DPX/2 without a 68882 but allow it
 * to be ignored...
 */
#if 0
# define CPP_SPEC "%{ansi:-D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BULL_SOURCE}\
 %{!ansi:-D_SYSV}"
#else
# define __HAVE_68881__ 1
# define CPP_SPEC "%{!msoft-float:-D__HAVE_68881__ }\
 %{ansi:-D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BULL_SOURCE}\
 %{!ansi:-D_SYSV}"
#endif

#undef ASM_LONG
#define ASM_LONG "\t.long"

#define HAVE_ATEXIT
#undef DO_GLOBAL_CTORS_BODY		/* don't use svr3.h version */
#undef DO_GLOBAL_DTORS_BODY


/* 
 * svr3.h says to use BSS_SECTION_FUNCTION
 * but no one appears to, and there is
 * no definition for m68k.
 */
#ifndef BSS_SECTION_FUNCTION
# undef EXTRA_SECTION_FUNCTIONS
# define EXTRA_SECTION_FUNCTIONS	\
  CONST_SECTION_FUNCTION		\
  INIT_SECTION_FUNCTION			\
  FINI_SECTION_FUNCTION
#endif

#ifndef USE_GAS
/*
 * handle the native assembler.
 * this does NOT yet work, there is much left to do.
 * use GAS for now...
 */
#undef ASM_OUTPUT_SOURCE_FILENAME
#define ASM_OUTPUT_SOURCE_FILENAME(FILE, NA)	\
  do { fprintf ((FILE), "\t.file\t'%s'\n", (NA)); } while (0)

/* 
 * we don't seem to support any of:
 * .globl
 * .even
 * .align
 * .ascii
 */
#undef ASM_GLOBALIZE_LABEL
#define ASM_GLOBALIZE_LABEL(FILE,NAME) while (0)
#undef ASM_OUTPUT_ALIGN
#define ASM_OUTPUT_ALIGN(asm_out_file, align) while (0)
#define STRING_LIMIT	(0)
#undef ASM_APP_ON
#define ASM_APP_ON ""
#undef ASM_APP_OFF
#define ASM_APP_OFF ""
/*
 * dc.b 'hello, world!'
 * dc.b 10,0
 * is how we have to output "hello, world!\n"
 */
#undef ASM_OUTPUT_ASCII
#define ASM_OUTPUT_ASCII(asm_out_file, p, thissize)	\
  do { register int i, c, f=0;			\
  for (i = 0; i < thissize; i++) { 		\
    c = p[i];					\
    if (c == '\'' || c < ' ' || c > 127) {	\
      switch(f) {				\
      case 0: /* need to output dc.b etc */	\
	fprintf(asm_out_file, "\tdc.b %d", c);	\
	f=1;					\
	break;					\
      case 1:					\
	fprintf(asm_out_file, ",%d", c);	\
	break;					\
      default:					\
	/* close a string */			\
	fprintf(asm_out_file, "'\n\tdc.b %d", c); \
	f=1;					\
	break;					\
      }						\
    } else {					\
      switch(f) {				\
      case 0:					\
	fprintf(asm_out_file, "\tdc.b '%c", c);	\
	f=2;					\
	break;					\
      case 2:					\
	fprintf(asm_out_file, "%c", c);		\
	break;					\
      default:					\
	fprintf(asm_out_file, "\n\tdc.b '%c", c); \
	f=2;					\
	break;					\
      }						\
    }						\
  }						\
  if (f==2)					\
    putc('\'', asm_out_file);			\
  putc('\n', asm_out_file); } while (0)

/* This is how to output an insn to push a register on the stack.
   It need not be very fast code.  */

#undef ASM_OUTPUT_REG_PUSH
#define ASM_OUTPUT_REG_PUSH(FILE,REGNO)  \
  fprintf (FILE, "\tmove.l %s,-(sp)\n", reg_names[REGNO])

/* This is how to output an insn to pop a register from the stack.
   It need not be very fast code.  */

#undef ASM_OUTPUT_REG_POP
#define ASM_OUTPUT_REG_POP(FILE,REGNO)  \
  fprintf (FILE, "\tmove.l (sp)+,%s\n", reg_names[REGNO])
			
#endif /* ! use gas */			
