(ASM_OUTPUT_SOURCE_FILENAME): Quote special characters in file names.
[gcc.git] / gcc / config / m68k / 3b1.h
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 alex@umbc3.umd.edu
6
7 Copyright (C) 1987 Free Software Foundation, Inc.
8
9 This file is part of GNU CC.
10
11 GNU CC is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2, or (at your option)
14 any later version.
15
16 GNU CC is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with GNU CC; see the file COPYING. If not, write to
23 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
24
25 #define SGS_SWITCH_TABLES /* Different switch table handling */
26
27 #include "m68k/hp320.h"
28
29 /* See m68k.h. 0 means 680[01]0 with no 68881. */
30
31 #undef TARGET_DEFAULT
32 #define TARGET_DEFAULT 0
33
34 /* Don't try using XFmode. */
35 #undef LONG_DOUBLE_TYPE_SIZE
36 #define LONG_DOUBLE_TYPE_SIZE 64
37
38 /* -m68020 requires special flags to the assembler. */
39
40 #undef ASM_SPEC
41 #define ASM_SPEC "%{m68020:-68020}%{!m68020:-68010} %{m68881:-68881}"
42
43 /* we use /lib/libp/lib* when profiling */
44
45 #undef LIB_SPEC
46 #define LIB_SPEC "%{!shlib:%{p:-L/lib/libp} %{pg:-L/lib/libp} -lc}"
47
48 /* shared libraries need to use crt0s.o */
49
50 #undef STARTFILE_SPEC
51 #define STARTFILE_SPEC \
52 "%{!shlib:%{pg:mcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}}}\
53 %{shlib:crt0s.o%s shlib.ifile%s} "
54
55 /* cpp has to support a #sccs directive for the /usr/include files */
56
57 #define SCCS_DIRECTIVE
58
59 /* Make output for SDB. */
60
61 #define SDB_DEBUGGING_INFO
62
63 /* The .file command should always begin the output. */
64
65 #undef ASM_FILE_START
66 #define ASM_FILE_START(FILE) \
67 output_file_directive ((FILE), main_input_filename)
68
69 /* Don't try to define `gcc_compiled.' since the assembler might not
70 accept symbols with periods and GDB doesn't run on this machine anyway. */
71 #define ASM_IDENTIFY_GCC(FILE)
72
73 /* Define __HAVE_68881__ in preprocessor if -m68881 is specified.
74 This will control the use of inline 68881 insns in certain macros. */
75
76 #undef CPP_SPEC
77 #define CPP_SPEC "%{m68881:-D__HAVE_68881__}"
78
79 /* Names to predefine in the preprocessor for this target machine. */
80 /* ihnp4!lmayk!lgm@eddie.mit.edu says mc68000 and m68k should not be here. */
81
82 #undef CPP_PREDEFINES
83 #define CPP_PREDEFINES "-Dmc68k -Dunix -Dunixpc -D__motorola__"
84
85 #undef REGISTER_NAMES
86 #define REGISTER_NAMES \
87 {"%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7", \
88 "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%fp", "%sp", \
89 "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7"}
90
91 /* Specify how to pad function arguments.
92 Value should be `upward', `downward' or `none'.
93 Same as the default, except no padding for large or variable-size args. */
94
95 #define FUNCTION_ARG_PADDING(MODE, TYPE) \
96 (((MODE) == BLKmode \
97 ? ((TYPE) && TREE_CODE (TYPE_SIZE (TYPE)) == INTEGER_CST \
98 && int_size_in_bytes (TYPE) < PARM_BOUNDARY / BITS_PER_UNIT) \
99 : GET_MODE_BITSIZE (MODE) < PARM_BOUNDARY) \
100 ? downward : none)
101
102 /* Override part of the obstack macros. */
103
104 #define __PTR_TO_INT(P) ((int)(P))
105 #define __INT_TO_PTR(P) ((char *)(P))
106
107 /* The 3b1 does not have `atexit'. */
108
109 #undef HAVE_ATEXIT
110
111 /* Override parts of m68k.h to fit the SGS-3b1 assembler. */
112
113 #undef TARGET_VERSION
114 #undef ASM_FORMAT_PRIVATE_NAME
115 #undef ASM_OUTPUT_DOUBLE
116 #undef ASM_OUTPUT_FLOAT
117 #undef ASM_OUTPUT_ALIGN
118 #undef ASM_OUTPUT_SOURCE_FILENAME
119 #undef ASM_OUTPUT_SOURCE_LINE
120 #undef PRINT_OPERAND_ADDRESS
121 #undef ASM_GENERATE_INTERNAL_LABEL
122 #undef FUNCTION_PROFILER
123 #undef ASM_OUTPUT_ADDR_VEC_ELT
124 #undef ASM_OUTPUT_ADDR_DIFF_ELT
125 #undef ASM_OUTPUT_INTERNAL_LABEL
126 #undef ASM_OUTPUT_OPCODE
127 #undef ASM_OUTPUT_LOCAL
128 #undef ASM_OUTPUT_LABELREF
129 #undef ASM_OUTPUT_ASCII
130
131 #define TARGET_VERSION fprintf (stderr, " (68k, SGS/AT&T unixpc syntax)");
132
133 /* Store in OUTPUT a string (made with alloca) containing
134 an assembler-name for a local static variable named NAME.
135 LABELNO is an integer which is different for each call. */
136
137 #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
138 ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 12), \
139 sprintf ((OUTPUT), "%s_%%%d", (NAME), (LABELNO)))
140
141 /* The unixpc doesn't know about double's and float's */
142
143 #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
144 do { long l[2]; \
145 REAL_VALUE_TO_TARGET_DOUBLE (VALUE, l); \
146 fprintf (FILE, "\tlong 0x%x,0x%x\n", l[0], l[1]); \
147 } while (0)
148
149 #undef ASM_OUTPUT_LONG_DOUBLE
150 #define ASM_OUTPUT_LONG_DOUBLE(FILE,VALUE) \
151 do { long l[3]; \
152 REAL_VALUE_TO_TARGET_LONG_DOUBLE (VALUE, l); \
153 fprintf (FILE, "\tlong 0x%x,0x%x,0x%x\n", l[0], l[1], l[2]); \
154 } while (0)
155
156 /* This is how to output an assembler line defining a `float' constant. */
157
158 #define ASM_OUTPUT_FLOAT(FILE,VALUE) \
159 do { long l; \
160 REAL_VALUE_TO_TARGET_SINGLE (VALUE, l); \
161 fprintf ((FILE), "\tlong 0x%x\n", l); \
162 } while (0)
163
164 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
165 if ((LOG) == 1) \
166 fprintf (FILE, "\teven\n"); \
167 else if ((LOG) != 0) \
168 abort ();
169
170 /* This is how to output an assembler line
171 that says to advance the location counter by SIZE bytes. */
172
173 #undef ASM_OUTPUT_SKIP
174 #define ASM_OUTPUT_SKIP(FILE,SIZE) \
175 fprintf (FILE, "\tspace %d\n", (SIZE))
176
177 /* Can't use ASM_OUTPUT_SKIP in text section; it doesn't leave 0s. */
178
179 #define ASM_NO_SKIP_IN_TEXT 1
180
181 /* The beginnings of sdb support... */
182
183 #define ASM_OUTPUT_SOURCE_FILENAME(FILE, FILENAME) \
184 do { fprintf (FILE, "\tfile\t"); \
185 output_quoted_string (FILE, FILENAME); \
186 fprintf (FILE, "\n"); \
187 } while (0)
188
189 #define ASM_OUTPUT_SOURCE_LINE(FILE, LINENO) \
190 fprintf (FILE, "\tln\t%d\n", \
191 (sdb_begin_function_line \
192 ? last_linenum - sdb_begin_function_line : 1))
193
194 /* Yet another null terminated string format. */
195
196 #define ASM_OUTPUT_ASCII(FILE,PTR,LEN) \
197 { register int sp = 0, lp = 0; \
198 fprintf ((FILE), "\tbyte\t"); \
199 loop: \
200 if ((PTR)[sp] > ' ' && ! ((PTR)[sp] & 0x80) && (PTR)[sp] != '\\') \
201 { lp += 3; \
202 fprintf ((FILE), "'%c", (PTR)[sp]); } \
203 else \
204 { lp += 5; \
205 fprintf ((FILE), "0x%x", (PTR)[sp]); } \
206 if (++sp < (LEN)) \
207 { if (lp > 60) \
208 { lp = 0; \
209 fprintf ((FILE), "\n\t%s ", ASCII_DATA_ASM_OP); } \
210 else \
211 putc (',', (FILE)); \
212 goto loop; } \
213 putc ('\n', (FILE)); }
214
215 /* Note that in the case of the movhi which fetches an element of
216 an ADDR_DIFF_VEC the offset output is too large by 2.
217 This is because the 3b1 assembler refuses to subtract 2.
218 ASM_OUTPUT_CASE_LABEL, below, compensates for this. */
219
220 #define PRINT_OPERAND_ADDRESS(FILE, ADDR) \
221 { register rtx reg1, reg2, breg, ireg; \
222 register rtx addr = ADDR; \
223 rtx offset; \
224 switch (GET_CODE (addr)) \
225 { \
226 case REG: \
227 fprintf (FILE, "(%s)", reg_names[REGNO (addr)]); \
228 break; \
229 case PRE_DEC: \
230 fprintf (FILE, "-(%s)", reg_names[REGNO (XEXP (addr, 0))]); \
231 break; \
232 case POST_INC: \
233 fprintf (FILE, "(%s)+", reg_names[REGNO (XEXP (addr, 0))]); \
234 break; \
235 case PLUS: \
236 reg1 = 0; reg2 = 0; \
237 ireg = 0; breg = 0; \
238 offset = 0; \
239 if (CONSTANT_ADDRESS_P (XEXP (addr, 0))) \
240 { \
241 offset = XEXP (addr, 0); \
242 addr = XEXP (addr, 1); \
243 } \
244 else if (CONSTANT_ADDRESS_P (XEXP (addr, 1))) \
245 { \
246 offset = XEXP (addr, 1); \
247 addr = XEXP (addr, 0); \
248 } \
249 if (GET_CODE (addr) != PLUS) ; \
250 else if (GET_CODE (XEXP (addr, 0)) == SIGN_EXTEND) \
251 { \
252 reg1 = XEXP (addr, 0); \
253 addr = XEXP (addr, 1); \
254 } \
255 else if (GET_CODE (XEXP (addr, 1)) == SIGN_EXTEND) \
256 { \
257 reg1 = XEXP (addr, 1); \
258 addr = XEXP (addr, 0); \
259 } \
260 else if (GET_CODE (XEXP (addr, 0)) == MULT) \
261 { \
262 reg1 = XEXP (addr, 0); \
263 addr = XEXP (addr, 1); \
264 } \
265 else if (GET_CODE (XEXP (addr, 1)) == MULT) \
266 { \
267 reg1 = XEXP (addr, 1); \
268 addr = XEXP (addr, 0); \
269 } \
270 else if (GET_CODE (XEXP (addr, 0)) == REG) \
271 { \
272 reg1 = XEXP (addr, 0); \
273 addr = XEXP (addr, 1); \
274 } \
275 else if (GET_CODE (XEXP (addr, 1)) == REG) \
276 { \
277 reg1 = XEXP (addr, 1); \
278 addr = XEXP (addr, 0); \
279 } \
280 if (GET_CODE (addr) == REG || GET_CODE (addr) == MULT \
281 || GET_CODE (addr) == SIGN_EXTEND) \
282 { if (reg1 == 0) reg1 = addr; else reg2 = addr; addr = 0; } \
283 /* for OLD_INDEXING \
284 else if (GET_CODE (addr) == PLUS) \
285 { \
286 if (GET_CODE (XEXP (addr, 0)) == REG) \
287 { \
288 reg2 = XEXP (addr, 0); \
289 addr = XEXP (addr, 1); \
290 } \
291 else if (GET_CODE (XEXP (addr, 1)) == REG) \
292 { \
293 reg2 = XEXP (addr, 1); \
294 addr = XEXP (addr, 0); \
295 } \
296 } \
297 */ \
298 if (offset != 0) { if (addr != 0) abort (); addr = offset; } \
299 if ((reg1 && (GET_CODE (reg1) == SIGN_EXTEND \
300 || GET_CODE (reg1) == MULT)) \
301 || (reg2 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg2)))) \
302 { breg = reg2; ireg = reg1; } \
303 else if (reg1 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg1))) \
304 { breg = reg1; ireg = reg2; } \
305 if (ireg != 0 && breg == 0 && GET_CODE (addr) == LABEL_REF) \
306 { int scale = 1; \
307 if (GET_CODE (ireg) == MULT) \
308 { scale = INTVAL (XEXP (ireg, 1)); \
309 ireg = XEXP (ireg, 0); } \
310 if (GET_CODE (ireg) == SIGN_EXTEND) \
311 fprintf (FILE, "LD%%%d(%%pc,%s.w", \
312 CODE_LABEL_NUMBER (XEXP (addr, 0)), \
313 reg_names[REGNO (XEXP (ireg, 0))]); \
314 else \
315 fprintf (FILE, "LD%%%d(%%pc,%s.l", \
316 CODE_LABEL_NUMBER (XEXP (addr, 0)), \
317 reg_names[REGNO (ireg)]); \
318 if (scale != 1) fprintf (FILE, "*%d", scale); \
319 fprintf (FILE, ")"); \
320 break; } \
321 if (breg != 0 && ireg == 0 && GET_CODE (addr) == LABEL_REF) \
322 { fprintf (FILE, "LD%%%d(%%pc,%s.l", \
323 CODE_LABEL_NUMBER (XEXP (addr, 0)), \
324 reg_names[REGNO (breg)]); \
325 putc (')', FILE); \
326 break; } \
327 if (ireg != 0 || breg != 0) \
328 { int scale = 1; \
329 if (breg == 0) \
330 abort (); \
331 if (addr != 0) \
332 output_addr_const (FILE, addr); \
333 fprintf (FILE, "(%s", reg_names[REGNO (breg)]); \
334 if (ireg != 0) \
335 putc (',', FILE); \
336 if (ireg != 0 && GET_CODE (ireg) == MULT) \
337 { scale = INTVAL (XEXP (ireg, 1)); \
338 ireg = XEXP (ireg, 0); } \
339 if (ireg != 0 && GET_CODE (ireg) == SIGN_EXTEND) \
340 fprintf (FILE, "%s.w", reg_names[REGNO (XEXP (ireg, 0))]); \
341 else if (ireg != 0) \
342 fprintf (FILE, "%s.l", reg_names[REGNO (ireg)]); \
343 if (scale != 1) fprintf (FILE, "*%d", scale); \
344 putc (')', FILE); \
345 break; \
346 } \
347 else if (reg1 != 0 && GET_CODE (addr) == LABEL_REF) \
348 { fprintf (FILE, "LD%%%d(%%pc,%s.w)", \
349 CODE_LABEL_NUMBER (XEXP (addr, 0)), \
350 reg_names[REGNO (reg1)]); \
351 break; } \
352 default: \
353 if (GET_CODE (addr) == CONST_INT \
354 && INTVAL (addr) < 0x8000 \
355 && INTVAL (addr) >= -0x8000) \
356 fprintf (FILE, "%d", INTVAL (addr)); \
357 else \
358 output_addr_const (FILE, addr); \
359 }}
360
361 #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
362 sprintf ((LABEL), "%s%%%d", (PREFIX), (NUM))
363
364 #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
365 fprintf (FILE, "%s%%%d:\n", PREFIX, NUM)
366
367 /* Must put address in %a0 , not %d0 . -- LGM, 7/15/88 */
368 #define FUNCTION_PROFILER(FILE, LABEL_NO) \
369 fprintf (FILE, "\tmov.l &LP%%%d,%%a0\n\tjsr mcount\n", (LABEL_NO))
370
371 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
372 fprintf (FILE, "\tlong L%%%d\n", (VALUE))
373
374 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
375 fprintf (FILE, "\tshort L%%%d-L%%%d\n", (VALUE), (REL))
376
377 /* ihnp4!lmayk!lgm says that `short 0' triggers assembler bug;
378 `short L%nn-L%nn' supposedly works. */
379 #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \
380 if (! RTX_INTEGRATED_P (TABLE)) \
381 fprintf (FILE, "\tswbeg &%d\n%s%%%d:\n", \
382 XVECLEN (PATTERN (TABLE), 1), (PREFIX), (NUM)); \
383 else \
384 fprintf (FILE, "\tswbeg &%d\n%s%%%d:\n\tshort %s%%%d-%s%%%d\n", \
385 XVECLEN (PATTERN (TABLE), 1) + 1, (PREFIX), (NUM), \
386 (PREFIX), (NUM), (PREFIX), (NUM))
387
388 /* At end of a switch table, define LDnnn iff the symbol LInnn was defined.
389 Some SGS assemblers have a bug such that "Lnnn-LInnn-2.b(pc,d0.l*2)"
390 fails to assemble. Luckily "LDnnn(pc,d0.l*2)" produces the results
391 we want. This difference can be accommodated by making the assembler
392 define such "LDnnn" to be either "Lnnn-LInnn-2.b", "Lnnn", or any other
393 string, as necessary. This is accomplished via the ASM_OUTPUT_CASE_END
394 macro. */
395
396 #define ASM_OUTPUT_CASE_END(FILE,NUM,TABLE) \
397 { if (switch_table_difference_label_flag) \
398 fprintf (FILE, "\tset LD%%%d,L%%%d-LI%%%d\n", (NUM), (NUM), (NUM)); \
399 switch_table_difference_label_flag = 0; }
400
401 int switch_table_difference_label_flag;
402
403 #define ASM_OUTPUT_OPCODE(FILE, PTR) \
404 { if ((PTR)[0] == 'j' && (PTR)[1] == 'b') \
405 { ++(PTR); \
406 while (*(PTR) != ' ') \
407 { putc (*(PTR), (FILE)); ++(PTR); } \
408 fprintf ((FILE), ".w"); } \
409 else if ((PTR)[0] == 's') \
410 { \
411 if (!strncmp ((PTR), "swap", 4)) \
412 { fprintf ((FILE), "swap.w"); (PTR) += 4; } \
413 } \
414 else if ((PTR)[0] == 'f') \
415 { \
416 if (!strncmp ((PTR), "fmove", 5)) \
417 { fprintf ((FILE), "fmov"); (PTR) += 5; } \
418 else if (!strncmp ((PTR), "fbne", 4)) \
419 { fprintf ((FILE), "fbneq"); (PTR) += 4; } \
420 } \
421 /* MOVE, MOVEA, MOVEQ, MOVEC ==> MOV */ \
422 else if ((PTR)[0] == 'm' && (PTR)[1] == 'o' \
423 && (PTR)[2] == 'v' && (PTR)[3] == 'e') \
424 { fprintf ((FILE), "mov"); (PTR) += 4; \
425 if ((PTR)[0] == 'q' || (PTR)[0] == 'a' \
426 || (PTR)[0] == 'c') (PTR)++; } \
427 /* SUB, SUBQ, SUBA, SUBI ==> SUB */ \
428 else if ((PTR)[0] == 's' && (PTR)[1] == 'u' \
429 && (PTR)[2] == 'b') \
430 { fprintf ((FILE), "sub"); (PTR) += 3; \
431 if ((PTR)[0] == 'q' || (PTR)[0] == 'i' \
432 || (PTR)[0] == 'a') (PTR)++; } \
433 /* CMP, CMPA, CMPI, CMPM ==> CMP */ \
434 else if ((PTR)[0] == 'c' && (PTR)[1] == 'm' \
435 && (PTR)[2] == 'p') \
436 { fprintf ((FILE), "cmp"); (PTR) += 3; \
437 if ((PTR)[0] == 'a' || (PTR)[0] == 'i' \
438 || (PTR)[0] == 'm') (PTR)++; } \
439 }
440
441 #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \
442 ( fputs ("\tlcomm ", (FILE)), \
443 assemble_name ((FILE), (NAME)), \
444 fprintf ((FILE), ",%u\n", (ROUNDED)))
445
446 #define ASM_OUTPUT_LABELREF(FILE,NAME) \
447 fprintf (FILE, "%s", NAME)
448 \f
449 /* Override usual definitions of SDB output macros.
450 These definitions differ only in the absence of the period
451 at the beginning of the name of the directive
452 and in the use of `~' as the symbol for the current location. */
453
454 #define PUT_SDB_SCL(a) fprintf(asm_out_file, "\tscl\t%d;", (a))
455 #define PUT_SDB_INT_VAL(a) fprintf (asm_out_file, "\tval\t%d;", (a))
456 #define PUT_SDB_VAL(a) \
457 ( fputs ("\tval\t", asm_out_file), \
458 output_addr_const (asm_out_file, (a)), \
459 fputc (';', asm_out_file))
460
461 #define PUT_SDB_DEF(a) \
462 do { fprintf (asm_out_file, "\tdef\t"); \
463 ASM_OUTPUT_LABELREF (asm_out_file, a); \
464 fprintf (asm_out_file, ";"); } while (0)
465
466 #define PUT_SDB_PLAIN_DEF(a) fprintf(asm_out_file,"\tdef\t~%s;",a)
467 #define PUT_SDB_ENDEF fputs("\tendef\n", asm_out_file)
468 #define PUT_SDB_TYPE(a) fprintf(asm_out_file, "\ttype\t0%o;", a)
469 #define PUT_SDB_SIZE(a) fprintf(asm_out_file, "\tsize\t%d;", a)
470 #define PUT_SDB_START_DIM fprintf(asm_out_file, "\tdim\t")
471
472 #define PUT_SDB_TAG(a) \
473 do { fprintf (asm_out_file, "\ttag\t"); \
474 ASM_OUTPUT_LABELREF (asm_out_file, a); \
475 fprintf (asm_out_file, ";"); } while (0)
476
477 #define PUT_SDB_BLOCK_START(LINE) \
478 fprintf (asm_out_file, \
479 "\tdef\t~bb;\tval\t~;\tscl\t100;\tline\t%d;\tendef\n", \
480 (LINE))
481
482 #define PUT_SDB_BLOCK_END(LINE) \
483 fprintf (asm_out_file, \
484 "\tdef\t~eb;\tval\t~;\tscl\t100;\tline\t%d;\tendef\n", \
485 (LINE))
486
487 #define PUT_SDB_FUNCTION_START(LINE) \
488 fprintf (asm_out_file, \
489 "\tdef\t~bf;\tval\t~;\tscl\t101;\tline\t%d;\tendef\n", \
490 (LINE))
491
492 #define PUT_SDB_FUNCTION_END(LINE) \
493 fprintf (asm_out_file, \
494 "\tdef\t~ef;\tval\t~;\tscl\t101;\tline\t%d;\tendef\n", \
495 (LINE))
496
497 #define PUT_SDB_EPILOGUE_END(NAME) \
498 fprintf (asm_out_file, \
499 "\tdef\t%s;\tval\t~;\tscl\t-1;\tendef\n", \
500 (NAME))
501
502 #define SDB_GENERATE_FAKE(BUFFER, NUMBER) \
503 sprintf ((BUFFER), "~%dfake", (NUMBER));
504
505 /* Define subroutines to call to handle multiply, divide, and remainder.
506 Use the subroutines that the 3b1's library provides.
507 The `*' prevents an underscore from being prepended by the compiler. */
508
509 #define DIVSI3_LIBCALL "*ldiv"
510 #define UDIVSI3_LIBCALL "*uldiv"
511 #define MODSI3_LIBCALL "*lrem"
512 #define UMODSI3_LIBCALL "*ulrem"
513 #define MULSI3_LIBCALL "*lmul"
514 #define UMULSI3_LIBCALL "*ulmul"
515
516 /* Definitions for collect2. */
517
518 #define OBJECT_FORMAT_COFF
519 #define NO_SYS_SIGLIST
520 #define MY_ISCOFF(magic) \
521 ((magic) == MC68KWRMAGIC || (magic) == MC68KROMAGIC || (magic) == MC68KPGMAGIC)