aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/i386/sequent.h
blob: 8613ad79e2d375a0b4bf7b4f0ff365319b80b4b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/* Definitions for Sequent Intel 386.
   Copyright (C) 1988, 1994, 1999 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 "i386/i386.h"

/* Use the BSD assembler syntax.  */

#include "i386/bsd.h"

/* By default, don't use IEEE compatible arithmetic comparisons
   because the assembler can't handle the fucom insn.
   Return float values in the 387.  */

#undef TARGET_DEFAULT
#define TARGET_DEFAULT (MASK_80387 | MASK_FLOAT_RETURNS)

/* Specify predefined symbols in preprocessor.  */

#define CPP_PREDEFINES "-Dunix -Di386 -Dsequent -Asystem(unix) -Acpu(i386) -Amachine(i386)"

/* Pass -Z and -ZO options to the linker.  */

#define LINK_SPEC "%{Z*}"

#if 0 /* Dynix 3.1 is said to accept -L.  */
/* Dynix V3.0.12 doesn't accept -L at all.  */

#define LINK_LIBGCC_SPECIAL
#endif

/* Link with libg.a when debugging, for dbx's sake.  */

#define LIB_SPEC "%{g:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p} "

/* We don't want to output SDB debugging information.  */

#undef SDB_DEBUGGING_INFO

/* We want to output DBX debugging information.  */

#define DBX_DEBUGGING_INFO

/* Sequent Symmetry has size_t defined as int in /usr/include/sys/types.h */
#define SIZE_TYPE "int"

/* gcc order is ax, dx, cx, bx, si, di, bp, sp, st, st.
 * dbx order is ax, dx, cx, st(0), st(1), bx, si, di, st(2), st(3),
 * 		st(4), st(5), st(6), st(7), sp, bp  */

/* ??? The right thing would be to change the ordering of the
   registers to correspond to the conventions of this system,
   and get rid of DBX_REGISTER_NUMBER.  */

#undef DBX_REGISTER_NUMBER
#define DBX_REGISTER_NUMBER(n)		\
((n) < 3 ? (n) : (n) < 6 ? (n) + 2	\
 : (n) == 6 ? 15 : (n) == 7 ? 14 : 3)

/* malcolmp@hydra.maths.unsw.EDU.AU says these two definitions
   fix trouble in dbx.  */
#undef DBX_OUTPUT_LBRAC
#define DBX_OUTPUT_LBRAC(file,name)	\
	      fprintf (asmfile, "%s %d,0,%d,", ASM_STABN_OP, N_LBRAC, depth); \
	      assemble_name (asmfile, buf); \
	      fprintf (asmfile, "\n");

#undef DBX_OUTPUT_RBRAC
#define DBX_OUTPUT_RBRAC(file,name)	\
	      fprintf (asmfile, "%s %d,0,%d,", ASM_STABN_OP, N_RBRAC, depth); \
	      assemble_name (asmfile, buf); \
	      fprintf (asmfile, "\n");

/* Prevent anything from being allocated in the register pair cx/bx,
   since that would confuse GDB.  */

#undef HARD_REGNO_MODE_OK
#define HARD_REGNO_MODE_OK(REGNO, MODE) \
  (((REGNO) < 2 ? 1							\
    : (REGNO) < 4 ? 1							\
    : FP_REGNO_P (REGNO) ? (GET_MODE_CLASS (MODE) == MODE_FLOAT         \
			    || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT) \
    : (MODE) != QImode)							\
   && ! (REGNO == 2 && GET_MODE_UNIT_SIZE (MODE) > 4))

/* Output assembler code to FILE to increment profiler label # LABELNO
   for profiling a function entry. */

#undef FUNCTION_PROFILER
#define FUNCTION_PROFILER(FILE, LABELNO)  \
   fprintf (FILE, "\tmovl $.LP%d,%%eax\n\tcall mcount\n", (LABELNO));

/* Assembler pseudo-op for shared data segment. */
#define SHARED_SECTION_ASM_OP ".shdata"

/* A C statement or statements which output an assembler instruction
   opcode to the stdio stream STREAM.  The macro-operand PTR is a
   variable of type `char *' which points to the opcode name in its
   "internal" form--the form that is written in the machine description.

   The Sequent assembler (identified as "Balance 8000 Assembler
   07/17/85 3.90" by "as -v") does not understand the `movs[bwl]' string
   move mnemonics - it uses `smov[bwl]' instead.  Change "movs" into
   "smov", carefully avoiding the sign-extend opcodes.  */

#define ASM_OUTPUT_OPCODE(STREAM, PTR)	\
{									\
  if ((PTR)[0] == 'm'							\
      && (PTR)[1] == 'o'						\
      && (PTR)[2] == 'v'						\
      && (PTR)[3] == 's'						\
      && ((PTR)[4] == 'b' || (PTR)[4] == 'w' || (PTR)[4] == 'l')	\
      && ((PTR)[5] == ' ' || (PTR)[5] == '\t'|| (PTR)[5] == '\0'))	\
    {									\
      fprintf (STREAM, "smov");						\
      (PTR) += 4;							\
    }									\
}

/* 10-Aug-92 pes  Local labels are prefixed with ".L" */
#undef LPREFIX
#define LPREFIX ".L"

#undef ASM_GENERATE_INTERNAL_LABEL
#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER)\
  sprintf ((BUF), "*.%s%d", (PREFIX), (NUMBER))

#undef ASM_OUTPUT_INTERNAL_LABEL
#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)\
  fprintf (FILE, ".%s%d:\n", PREFIX, NUM)

/* The native compiler passes the address of the returned structure in eax. */
#undef STRUCT_VALUE
#undef STRUCT_VALUE_INCOMING
#define STRUCT_VALUE_REGNUM	0