|
|
1.1 root 1: /* Definitions of target machine for GNU compiler.
2: AT&T UNIX PC version (pc7300, 3b1)
3:
4: Written by Alex Crain
5: bug reports to [email protected]
6:
7: Copyright (C) 1987 Free Software Foundation, Inc.
8:
9: This file is part of GNU CC.
10:
11: GNU CC is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY. No author or distributor
13: accepts responsibility to anyone for the consequences of using it
14: or for whether it serves any particular purpose or works at all,
15: unless he says so in writing. Refer to the GNU CC General Public
16: License for full details.
17:
18: Everyone is granted permission to copy, modify and redistribute
19: GNU CC, but only under the conditions described in the
20: GNU CC General Public License. A copy of this license is
21: supposed to have been given to you along with GNU CC so you
22: can know your rights and responsibilities. It should be in a
23: file named COPYING. Among other things, the copyright notice
24: and this notice must be preserved on all copies. */
25:
26: #define SGS_3B1
27:
28: #include "tm-hp9k320.h"
29:
30: /* See tm-m68k.h. 7 means 680[01]0 with no 68881. */
31:
32: #undef TARGET_DEFAULT
33: #define TARGET_DEFAULT 0
34:
35: /* -m68020 requires special flags to the assembler. */
36:
37: #undef ASM_SPEC
38: #define ASM_SPEC "%{m68020:-68020}%{!m68020:-68010}"
39:
40: /* we use /lib/libp/lib* when profiling */
41:
42: #undef LIB_SPEC
43: #define LIB_SPEC "%{!shlib:%{p:-L/lib/libp} %{pg:-L/lib/libp} -lc}"
44:
45: /* shared libraries need to use crt0s.o */
46:
47: #undef STARTFILE_SPEC
48: #define STARTFILE_SPEC \
49: "%{!shlib:%{pg:mcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}}}\
50: %{shlib:crt0s.o%s shlib.ifile%s} "
51:
52: /* cpp has to support a #sccs directive for the /usr/include files */
53:
54: #define SCCS_DIRECTIVE
55:
56: /* Names to predefine in the preprocessor for this target machine. */
57:
58: #undef CPP_PREDEFINES
59: #define CPP_PREDEFINES "-Dmc68000 -Dmc68k -Dm68k -Dunix -Dunixpc"
60:
61: /* Override parts of tm-m68k.h to fit the HPUX assembler. */
62:
63: #undef TARGET_VERSION
64: #undef ASM_OUTPUT_DOUBLE
65: #undef ASM_OUTPUT_FLOAT
66: #undef ASM_OUTPUT_ALIGN
67: #undef ASM_OUTPUT_SOURCE_FILENAME
68: #undef ASM_OUTPUT_SOURCE_LINE
69: #undef PRINT_OPERAND_ADDRESS
70: #undef ASM_OUTPUT_INTERNAL_LABEL
71: #undef ASM_OUTPUT_OPCODE
72: #undef ASM_OUTPUT_LOCAL
73: #undef ASM_OUTPUT_LABELREF
74: #undef ASM_OUTPUT_ASCII
75:
76: #define TARGET_VERSION printf (" (68k, SGS/AT&T unixpc syntax)");
77:
78: /* The unixpc doesn't know about double's and float's */
79:
80: #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
81: do { union { double d; long l[2]; } tem; \
82: tem.d = (VALUE); \
83: fprintf(FILE, "\tlong 0x%x,0x%x\n", tem.l[0], tem.l[1]); \
84: } while (0)
85:
86: #define ASM_OUTPUT_FLOAT(FILE,VALUE) \
87: do { union { float f; long l;} tem; \
88: tem.f = (VALUE); \
89: fprintf (FILE, "\tlong 0x%x\n", tem.l); \
90: } while (0)
91:
92: #define ASM_OUTPUT_ALIGN(FILE,LOG) \
93: if ((LOG) == 1) \
94: fprintf (FILE, "\teven\n"); \
95: else if ((LOG) != 0) \
96: abort ();
97:
98: /* The beginnings of sdb support... */
99:
100: #define ASM_OUTPUT_SOURCE_FILENAME(FILE, FILENAME) \
101: fprintf (FILE, "\tfile\t\"%s\"\n", FILENAME);
102:
103: #define ASM_OUTPUT_SOURCE_LINE(FILE, LINENO) \
104: fprintf (FILE, "\tln\t%d\n", LINENO);
105:
106: /* Yet another null terminated string format. */
107:
108: #define ASM_OUTPUT_ASCII(FILE,PTR,LEN) \
109: { register int sp = 0, lp = 0; \
110: fprintf (FILE, "\tbyte\t"); \
111: loop: \
112: if (PTR[sp] > ' ' && ! (PTR[sp] & 0x80) && PTR[sp] != '\\') \
113: { lp += 3; \
114: fprintf (FILE, "'%c", PTR[sp]); } \
115: else \
116: { lp += 5; \
117: fprintf (FILE, "0x%x", PTR[sp]); } \
118: if (++sp < LEN) \
119: { if (lp > 60) \
120: { lp = 0; \
121: fprintf (FILE, "\n%s ", ASCII_DATA_ASM_OP); } \
122: else \
123: putc (',', FILE); \
124: goto loop; } \
125: putc ('\n', FILE); }
126:
127: /* Note that in the case of the movhi which fetches an element of
128: an ADDR_DIFF_VEC the offset output is too large by 2.
129: This is because the 3b1 assembler refuses to subtract 2.
130: ASM_OUTPUT_CASE_LABEL, below, compensates for this. */
131:
132: #define PRINT_OPERAND_ADDRESS(FILE, ADDR) \
133: { register rtx reg1, reg2, breg, ireg; \
134: register rtx addr = ADDR; \
135: rtx offset; \
136: switch (GET_CODE (addr)) \
137: { \
138: case REG: \
139: fprintf (FILE, "(%s)", reg_name [REGNO (addr)]); \
140: break; \
141: case PRE_DEC: \
142: fprintf (FILE, "-(%s)", reg_name [REGNO (XEXP (addr, 0))]); \
143: break; \
144: case POST_INC: \
145: fprintf (FILE, "(%s)+", reg_name [REGNO (XEXP (addr, 0))]); \
146: break; \
147: case PLUS: \
148: reg1 = 0; reg2 = 0; \
149: ireg = 0; breg = 0; \
150: offset = 0; \
151: if (CONSTANT_ADDRESS_P (XEXP (addr, 0))) \
152: { \
153: offset = XEXP (addr, 0); \
154: addr = XEXP (addr, 1); \
155: } \
156: else if (CONSTANT_ADDRESS_P (XEXP (addr, 1))) \
157: { \
158: offset = XEXP (addr, 1); \
159: addr = XEXP (addr, 0); \
160: } \
161: if (GET_CODE (addr) != PLUS) ; \
162: else if (GET_CODE (XEXP (addr, 0)) == SIGN_EXTEND) \
163: { \
164: reg1 = XEXP (addr, 0); \
165: addr = XEXP (addr, 1); \
166: } \
167: else if (GET_CODE (XEXP (addr, 1)) == SIGN_EXTEND) \
168: { \
169: reg1 = XEXP (addr, 1); \
170: addr = XEXP (addr, 0); \
171: } \
172: else if (GET_CODE (XEXP (addr, 0)) == MULT) \
173: { \
174: reg1 = XEXP (addr, 0); \
175: addr = XEXP (addr, 1); \
176: } \
177: else if (GET_CODE (XEXP (addr, 1)) == MULT) \
178: { \
179: reg1 = XEXP (addr, 1); \
180: addr = XEXP (addr, 0); \
181: } \
182: else if (GET_CODE (XEXP (addr, 0)) == REG) \
183: { \
184: reg1 = XEXP (addr, 0); \
185: addr = XEXP (addr, 1); \
186: } \
187: else if (GET_CODE (XEXP (addr, 1)) == REG) \
188: { \
189: reg1 = XEXP (addr, 1); \
190: addr = XEXP (addr, 0); \
191: } \
192: if (GET_CODE (addr) == REG || GET_CODE (addr) == MULT \
193: || GET_CODE (addr) == SIGN_EXTEND) \
194: { if (reg1 == 0) reg1 = addr; else reg2 = addr; addr = 0; } \
195: /* for OLD_INDEXING \
196: else if (GET_CODE (addr) == PLUS) \
197: { \
198: if (GET_CODE (XEXP (addr, 0)) == REG) \
199: { \
200: reg2 = XEXP (addr, 0); \
201: addr = XEXP (addr, 1); \
202: } \
203: else if (GET_CODE (XEXP (addr, 1)) == REG) \
204: { \
205: reg2 = XEXP (addr, 1); \
206: addr = XEXP (addr, 0); \
207: } \
208: } \
209: */ \
210: if (offset != 0) { if (addr != 0) abort (); addr = offset; } \
211: if ((reg1 && (GET_CODE (reg1) == SIGN_EXTEND \
212: || GET_CODE (reg1) == MULT)) \
213: || (reg2 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg2)))) \
214: { breg = reg2; ireg = reg1; } \
215: else if (reg1 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg1))) \
216: { breg = reg1; ireg = reg2; } \
217: if (ireg != 0 && breg == 0 && GET_CODE (addr) == LABEL_REF) \
218: { int scale = 1; \
219: if (GET_CODE (ireg) == MULT) \
220: { scale = INTVAL (XEXP (ireg, 1)); \
221: ireg = XEXP (ireg, 0); } \
222: if (GET_CODE (ireg) == SIGN_EXTEND) \
223: fprintf (FILE, "L%d-LI%d(%%pc,%s.w", \
224: CODE_LABEL_NUMBER (XEXP (addr, 0)), \
225: CODE_LABEL_NUMBER (XEXP (addr, 0)), \
226: reg_name[REGNO (XEXP (ireg, 0))]); \
227: else \
228: fprintf (FILE, "L%d-LI%d(%%pc,%s.l", \
229: CODE_LABEL_NUMBER (XEXP (addr, 0)), \
230: CODE_LABEL_NUMBER (XEXP (addr, 0)), \
231: reg_name[REGNO (ireg)]); \
232: if (scale != 1) fprintf (FILE, ":%d", scale); \
233: fprintf (FILE, ")"); \
234: break; } \
235: if (ireg != 0 || breg != 0) \
236: { int scale = 1; \
237: if (breg == 0) \
238: abort (); \
239: if (addr != 0) \
240: output_addr_const (FILE, addr); \
241: fprintf (FILE, "(%s", reg_name[REGNO (breg)]); \
242: if (ireg != 0) \
243: putc (',', FILE); \
244: if (ireg != 0 && GET_CODE (ireg) == MULT) \
245: { scale = INTVAL (XEXP (ireg, 1)); \
246: ireg = XEXP (ireg, 0); } \
247: if (ireg != 0 && GET_CODE (ireg) == SIGN_EXTEND) \
248: fprintf (FILE, "%s.w", reg_name[REGNO (XEXP (ireg, 0))]); \
249: else if (ireg != 0) \
250: fprintf (FILE, "%s.l", reg_name[REGNO (ireg)]); \
251: if (scale != 1) fprintf (FILE, ":%d", scale); \
252: putc (')', FILE); \
253: break; \
254: } \
255: else if (reg1 != 0 && GET_CODE (addr) == LABEL_REF) \
256: { fprintf (FILE, "L%d-LI%d(%%pc,%s.w)", \
257: CODE_LABEL_NUMBER (XEXP (addr, 0)), \
258: CODE_LABEL_NUMBER (XEXP (addr, 0)), \
259: reg_name[REGNO (reg1)]); \
260: break; } \
261: default: \
262: if (GET_CODE (addr) == CONST_INT \
263: && INTVAL (addr) < 0x8000 \
264: && INTVAL (addr) >= -0x8000) \
265: fprintf (FILE, "%d", INTVAL (addr)); \
266: else \
267: output_addr_const (FILE, addr); \
268: }}
269:
270: #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
271: fprintf (FILE, "%s%d:\n", PREFIX, NUM)
272:
273: #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \
274: fprintf (FILE, "\tswbeg &%d\n%s%d:\n\tshort 0", \
275: XVECLEN (PATTERN (TABLE), 1) + 1, PREFIX, NUM)
276:
277: #define ASM_OUTPUT_OPCODE(FILE, PTR) \
278: { if ((PTR)[0] == 'j' && (PTR)[1] == 'b') \
279: { ++(PTR); \
280: while (*(PTR) != ' ') \
281: { putc (*(PTR), (FILE)); ++(PTR); } \
282: fprintf ((FILE), ".w"); } \
283: else if ((PTR)[0] == 'f') \
284: { \
285: if (!strncmp ((PTR), "fmove", 5)) \
286: { fprintf ((FILE), "fmov"); (PTR) += 5; } \
287: else if (!strncmp ((PTR), "ftst", 4)) \
288: { fprintf ((FILE), "ftest"); (PTR) += 4; } \
289: } \
290: /* MOVE, MOVEA, MOVEQ, MOVEC ==> MOV */ \
291: else if ((PTR)[0] == 'm' && (PTR)[1] == 'o' \
292: && (PTR)[2] == 'v' && (PTR)[3] == 'e') \
293: { fprintf ((FILE), "mov"); (PTR) += 4; \
294: if ((PTR)[0] == 'q' || (PTR)[0] == 'a' || \
295: (PTR)[0] == 'c') (PTR)++; } \
296: /* SUB, SUBQ, SUBA, SUBI ==> SUB */ \
297: else if ((PTR)[0] == 's' && (PTR)[1] == 'u' \
298: && (PTR)[2] == 'b') \
299: { fprintf ((FILE), "sub"); (PTR) += 3; \
300: if ((PTR)[0] == 'q' || (PTR)[0] == 'i' || \
301: (PTR)[0] == 'a') (PTR)++; } \
302: /* CMP, CMPA, CMPI, CMPM ==> CMP */ \
303: else if ((PTR)[0] == 'c' && (PTR)[1] == 'm' \
304: && (PTR)[2] == 'p') \
305: { fprintf ((FILE), "cmp"); (PTR) += 3; \
306: if ((PTR)[0] == 'a' || (PTR)[0] == 'i' || \
307: (PTR)[0] == 'm') (PTR)++; } \
308: }
309:
310: #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE) \
311: ( fputs ("\tlcomm ", (FILE)), \
312: assemble_name ((FILE), (NAME)), \
313: fprintf ((FILE), ",%d\n", (SIZE)))
314:
315: #define ASM_OUTPUT_LABELREF(FILE,NAME) \
316: fprintf (FILE, "%s", NAME)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.