1 /* Definitions of target machine for GNU compiler. HP-UX 68000/68020 version.
2 Copyright (C) 1987, 1988 Free Software Foundation, Inc.
4 This file is part of GNU CC.
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
20 /* Define USE_GAS if GCC is supposed to work with the GNU assembler,
21 GNU linker and GNU debugger using DBX debugging information.
22 (In other words, much of HPUX has been cast aside.)
23 Undefine USE_GAS if you want GCC to feed the HP assembler. */
25 /* #define USE_GAS */ /* Use hp320g.h if you want this. */
27 /* Control assembler-syntax conditionals in m68k.md. */
30 #define MOTOROLA /* Use Motorola syntax rather than "MIT" */
31 #define SGS /* Uses SGS assembler */
32 #define SGS_CMP_ORDER /* Takes cmp operands in reverse order */
36 /* Be compatible with system stddef.h. */
37 #define SIZE_TYPE "unsigned int"
39 /* Use atexit for static constructors/destructors, instead of defining
40 our own exit function. */
45 /* See m68k.h. 7 means 68020 with 68881. */
47 #ifndef TARGET_DEFAULT
48 #define TARGET_DEFAULT 7
51 /* Define __HAVE_68881__ in preprocessor, unless -msoft-float is specified.
52 This will control the use of inline 68881 insns in certain macros. */
56 #define ASM_SPEC "%{m68000:+X}%{mc68000:+X}"
58 #if TARGET_DEFAULT & 02 /* -m68881 is the default */
60 /* These definitions differ from those used for GAS by defining __HPUX_ASM__.
61 This is needed because some programs, particularly GDB, need to
62 know which assembler is being used so that the correct `asm'
63 instructions can be used. */
66 "%{!msoft-float:-D__HAVE_68881__ }\
67 %{!ansi:%{!mc68000:%{!m68000:-Dmc68020}} -D_HPUX_SOURCE} -D__HPUX_ASM__"
69 #else /* default is -msoft-float */
72 "%{m68881:-D__HAVE_68881__ }\
73 %{!ansi:%{!mc68000:%{!m68000:-Dmc68020}} -D_HPUX_SOURCE} -D__HPUX_ASM__"
75 #endif /* default is -msoft-float */
77 #else /* not HPUX_ASM */
79 #if TARGET_DEFAULT & 02 /* -m68881 is the default */
82 "%{!msoft-float:-D__HAVE_68881__ }\
83 %{!ansi:%{!mc68000:%{!m68000:-Dmc68020}} -D_HPUX_SOURCE}"
85 #else /* default is -msoft-float */
88 "%{m68881:-D__HAVE_68881__ }\
89 %{!ansi:%{!mc68000:%{!m68000:-Dmc68020}} -D_HPUX_SOURCE}"
91 #endif /* default is -msoft-float */
94 /* -m68000 requires special flags to the assembler. */
96 "%{m68000:-mc68000}%{mc68000:-mc68000}%{!mc68000:%{!m68000:-mc68020}}"
98 /* Tell GCC to put a space after -L when generating such options. */
99 #define SPACE_AFTER_L_OPTION
101 #endif /* Not HPUX_ASM */
103 /* Names to predefine in the preprocessor for this target machine
104 (for non-strict-ANSI programs only). */
105 /* These are the ones defined by HPUX cc, plus mc68000 for uniformity with
106 GCC on other 68000 systems. */
108 #define CPP_PREDEFINES "-Dhp9000s200 -Dhp9000s300 -DPWB -Dhpux -Dunix -D__hp9000s300 -D__hp9000s200 -D__PWB -D__hpux -D__unix"
110 /* Every structure or union's size must be a multiple of 2 bytes. */
112 #define STRUCTURE_SIZE_BOUNDARY 16
114 /* hpux doesn't use static area for struct returns. */
115 #undef PCC_STATIC_STRUCT_RETURN
117 /* Generate calls to memcpy, memcmp and memset. */
118 #define TARGET_MEM_FUNCTIONS
120 #if 0 /* No longer correct in HPUX version 6.5. */
121 /* Function calls don't save any fp registers on hpux. */
122 #undef CALL_USED_REGISTERS
123 #define CALL_USED_REGISTERS \
124 {1, 1, 0, 0, 0, 0, 0, 0, \
125 1, 1, 0, 0, 0, 0, 0, 1, \
126 1, 1, 1, 1, 1, 1, 1, 1}
131 /* Override parts of m68k.h to fit the HPUX assembler. */
133 #undef TARGET_VERSION
134 #undef REGISTER_NAMES
135 #undef FUNCTION_PROLOGUE
136 #undef FUNCTION_EPILOGUE
137 #undef ASM_OUTPUT_REG_PUSH
138 #undef ASM_OUTPUT_REG_POP
139 #undef ASM_FILE_START
142 #undef TEXT_SECTION_ASM_OP
143 #undef DATA_SECTION_ASM_OP
144 #undef ASM_OUTPUT_DOUBLE
145 #undef ASM_OUTPUT_FLOAT
146 #undef ASM_OUTPUT_INT
147 #undef ASM_OUTPUT_SHORT
148 #undef ASM_OUTPUT_CHAR
149 #undef ASM_OUTPUT_BYTE
150 #undef ASM_OUTPUT_ADDR_VEC_ELT
151 #undef ASM_OUTPUT_ADDR_DIFF_ELT
152 #undef ASM_OUTPUT_ALIGN
153 #undef ASM_OUTPUT_SKIP
154 #undef ASM_OUTPUT_COMMON
155 #undef ASM_OUTPUT_LOCAL
156 #undef ASM_FORMAT_PRIVATE_NAME
158 #undef PRINT_OPERAND_ADDRESS
159 #undef FUNCTION_PROFILER
160 #undef ASM_GLOBALIZE_LABEL
161 #undef ASM_OUTPUT_INTERNAL_LABEL
163 #define TARGET_VERSION fprintf (stderr, " (68k, SGS/hpux syntax)");
165 #define REGISTER_NAMES \
166 {"%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7", \
167 "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%fp", "%sp", \
168 "%fp0", "%fp1", "%fp2", "%fp3", "%fp4", "%fp5", "%fp6", "%fp7"}
170 #define FUNCTION_PROLOGUE(FILE, SIZE) \
171 { register int regno; \
172 register int mask = 0; \
173 extern char call_used_regs[]; \
174 int fsize = (SIZE); \
175 if (frame_pointer_needed) \
176 { if (fsize < 0x8000) \
177 fprintf (FILE, "\tlink.w %%a6,&%d\n", -fsize); \
178 else if (TARGET_68020) \
179 fprintf (FILE, "\tlink.l %%a6,&%d\n", -fsize); \
181 fprintf (FILE, "\tlink.w %%a6,&0\n\tsub.l &%d,%%sp\n", fsize); } \
182 for (regno = 16; regno < FIRST_PSEUDO_REGISTER; regno++) \
183 if (regs_ever_live[regno] && ! call_used_regs[regno]) \
184 mask |= 1 << (regno - 16); \
186 fprintf (FILE, "\tfmovem &0x%x,-(%%sp)\n", mask & 0xff); \
188 for (regno = 0; regno < 16; regno++) \
189 if (regs_ever_live[regno] && ! call_used_regs[regno]) \
190 mask |= 1 << (15 - regno); \
191 if (frame_pointer_needed) \
192 mask &= ~ (1 << (15-FRAME_POINTER_REGNUM)); \
193 if (exact_log2 (mask) >= 0) \
194 fprintf (FILE, "\tmov.l %s,-(%%sp)\n", reg_names[15 - exact_log2 (mask)]); \
195 else if (mask) fprintf (FILE, "\tmovm.l &0x%x,-(%%sp)\n", mask); }
197 #define FUNCTION_PROFILER(FILE, LABEL_NO) \
198 fprintf (FILE, "\tmov.l &LP%d,%%a0\n\tjsr mcount\n", (LABEL_NO));
200 #define FUNCTION_EPILOGUE(FILE, SIZE) \
201 { register int regno; \
202 register int mask, fmask; \
203 register int nregs; \
204 int offset, foffset; \
205 extern char call_used_regs[]; \
206 int fsize = (SIZE); \
208 nregs = 0; fmask = 0; \
209 for (regno = 16; regno < FIRST_PSEUDO_REGISTER; regno++) \
210 if (regs_ever_live[regno] && ! call_used_regs[regno]) \
211 { nregs++; fmask |= 1 << (23 - regno); } \
212 foffset = nregs * 12; \
213 nregs = 0; mask = 0; \
214 if (frame_pointer_needed) regs_ever_live[FRAME_POINTER_REGNUM] = 0; \
215 for (regno = 0; regno < 16; regno++) \
216 if (regs_ever_live[regno] && ! call_used_regs[regno]) \
217 { nregs++; mask |= 1 << regno; } \
218 offset = foffset + nregs * 4; \
219 if (offset + fsize >= 0x8000 && frame_pointer_needed) \
220 { fprintf (FILE, "\tmov.l &%d,%%a0\n", -fsize); \
221 fsize = 0, big = 1; } \
222 if (exact_log2 (mask) >= 0) { \
224 fprintf (FILE, "\tmov.l -%d(%%a6,%%a0.l),%s\n", \
225 offset + fsize, reg_names[exact_log2 (mask)]); \
226 else if (! frame_pointer_needed) \
227 fprintf (FILE, "\tmov.l (%%sp)+,%s\n", \
228 reg_names[exact_log2 (mask)]); \
230 fprintf (FILE, "\tmov.l -%d(%%a6),%s\n", \
231 offset + fsize, reg_names[exact_log2 (mask)]); } \
234 fprintf (FILE, "\tmovm.l -%d(%%a6,%%a0.l),&0x%x\n", \
235 offset + fsize, mask); \
236 else if (! frame_pointer_needed) \
237 fprintf (FILE, "\tmovm.l (%%sp)+,&0x%x\n", mask); \
239 fprintf (FILE, "\tmovm.l -%d(%%a6),&0x%x\n", \
240 offset + fsize, mask); } \
243 fprintf (FILE, "\tfmovem -%d(%%a6,%%a0.l),&0x%x\n", \
244 foffset + fsize, fmask); \
245 else if (! frame_pointer_needed) \
246 fprintf (FILE, "\tfmovem (%%sp)+,&0x%x\n", fmask); \
248 fprintf (FILE, "\tfmovem -%d(%%a6),&0x%x\n", \
249 foffset + fsize, fmask); } \
250 if (frame_pointer_needed) \
251 fprintf (FILE, "\tunlk %%a6\n"); \
252 if (current_function_pops_args) \
253 fprintf (FILE, "\trtd &%d\n", current_function_pops_args); \
254 else fprintf (FILE, "\trts\n"); }
256 /* This is how to output an insn to push a register on the stack.
257 It need not be very fast code. */
259 #define ASM_OUTPUT_REG_PUSH(FILE,REGNO) \
260 fprintf (FILE, "\tmov.l %s,-(%%sp)\n", reg_names[REGNO])
262 /* This is how to output an insn to pop a register from the stack.
263 It need not be very fast code. */
265 #define ASM_OUTPUT_REG_POP(FILE,REGNO) \
266 fprintf (FILE, "\tmov.l (%%sp)+,%s\n", reg_names[REGNO])
268 /* For HPUX versions before 6.5, define this macro as empty. */
269 #define ASM_FILE_START(FILE) \
273 fprintf (FILE, "\tversion 3\n"); /* 68020 fp regs saved */ \
275 fprintf (FILE, "\tversion 2\n"); /* 68020 no fp regs saved */ \
278 fprintf (FILE, "\tversion 1\n"); /* 68010 */
280 #define ASM_APP_ON ""
282 #define ASM_APP_OFF ""
284 #define TEXT_SECTION_ASM_OP "text"
286 #define DATA_SECTION_ASM_OP "data"
288 #define ASCII_DATA_ASM_OP "\tbyte"
290 /* This says how to output an assembler line
291 to define a global common symbol. */
293 #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \
294 ( fputs ("\tcomm ", (FILE)), \
295 assemble_name ((FILE), (NAME)), \
296 fprintf ((FILE), ",%u\n", (ROUNDED)))
298 /* This says how to output an assembler line
299 to define a local common symbol. */
301 #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \
302 ( fputs ("\tlcomm ", (FILE)), \
303 assemble_name ((FILE), (NAME)), \
304 fprintf ((FILE), ",%u,2\n", (ROUNDED)))
306 /* Store in OUTPUT a string (made with alloca) containing
307 an assembler-name for a local static variable named NAME.
308 LABELNO is an integer which is different for each call. */
310 #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
311 ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 12), \
312 sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO)))
314 /* This is how to output a command to make the user-level label named NAME
315 defined for reference from other files. */
317 #define ASM_GLOBALIZE_LABEL(FILE,NAME) \
318 do { fputs ("\tglobal ", FILE); assemble_name (FILE, NAME); fputs ("\n", FILE);} while (0)
320 #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
321 do{ if (PREFIX[0] == 'L' && PREFIX[1] == 'I') \
322 fprintf(FILE, "\tset %s%d,.+2\n", PREFIX, NUM); \
324 fprintf (FILE, "%s%d:\n", PREFIX, NUM); \
327 #define ASM_OUTPUT_DOUBLE(FILE, VALUE) \
328 fprintf (FILE, "\tdouble 0f%.20g\n", (VALUE))
330 #define ASM_OUTPUT_FLOAT(FILE, VALUE) \
331 fprintf (FILE, "\tfloat 0f%.9g\n", (VALUE))
333 /* This is how to output an assembler line defining an `int' constant. */
335 #define ASM_OUTPUT_INT(FILE,VALUE) \
336 ( fprintf (FILE, "\tlong "), \
337 output_addr_const (FILE, (VALUE)), \
338 fprintf (FILE, "\n"))
340 /* Likewise for `char' and `short' constants. */
342 #define ASM_OUTPUT_SHORT(FILE,VALUE) \
343 ( fprintf (FILE, "\tshort "), \
344 output_addr_const (FILE, (VALUE)), \
345 fprintf (FILE, "\n"))
347 #define ASM_OUTPUT_CHAR(FILE,VALUE) \
348 ( fprintf (FILE, "\tbyte "), \
349 output_addr_const (FILE, (VALUE)), \
350 fprintf (FILE, "\n"))
352 /* This is how to output an assembler line for a numeric constant byte. */
354 #define ASM_OUTPUT_BYTE(FILE,VALUE) \
355 fprintf (FILE, "\tbyte 0x%x\n", (VALUE))
357 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
358 fprintf (FILE, "\tlong L%d\n", VALUE)
360 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
361 fprintf (FILE, "\tshort L%d-L%d\n", VALUE, REL)
363 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
365 fprintf (FILE, "\tlalign 2\n"); \
366 else if ((LOG) != 0) \
369 #define ASM_OUTPUT_SKIP(FILE,SIZE) \
370 fprintf (FILE, "\tspace %u\n", (SIZE))
372 #define ASM_OUTPUT_SOURCE_FILENAME(FILE, FILENAME)
373 #define ASM_OUTPUT_SOURCE_LINE(FILE, LINENO)
375 #define PRINT_OPERAND(FILE, X, CODE) \
376 { if (CODE == '.') fprintf (FILE, "."); \
377 else if (CODE == '#') fprintf (FILE, "&"); \
378 else if (CODE == '-') fprintf (FILE, "-(%%sp)"); \
379 else if (CODE == '+') fprintf (FILE, "(%%sp)+"); \
380 else if (CODE == '@') fprintf (FILE, "(%%sp)"); \
381 else if (CODE == '!') fprintf (FILE, "%%cc"); \
382 else if (CODE == '$') { if (TARGET_68040_ONLY) fprintf (FILE, "s"); } \
383 else if (CODE == '&') { if (TARGET_68040_ONLY) fprintf (FILE, "d"); } \
384 else if (GET_CODE (X) == REG) \
385 fprintf (FILE, "%s", reg_names[REGNO (X)]); \
386 else if (GET_CODE (X) == MEM) \
387 output_address (XEXP (X, 0)); \
388 else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == SFmode) \
389 { union { double d; int i[2]; } u; \
390 union { float f; int i; } u1; \
391 u.i[0] = CONST_DOUBLE_LOW (X); u.i[1] = CONST_DOUBLE_HIGH (X); \
394 fprintf (FILE, "&0f%.9g", u1.f); \
396 fprintf (FILE, "&0x%x", u1.i); } \
397 else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == DFmode) \
398 { union { double d; int i[2]; } u; \
399 u.i[0] = CONST_DOUBLE_LOW (X); u.i[1] = CONST_DOUBLE_HIGH (X); \
400 fprintf (FILE, "&0f%.20g", u.d); } \
401 else { putc ('&', FILE); output_addr_const (FILE, X); }}
403 #define PRINT_OPERAND_ADDRESS(FILE, ADDR) \
404 { register rtx reg1, reg2, breg, ireg; \
405 register rtx addr = ADDR; \
407 switch (GET_CODE (addr)) \
410 fprintf (FILE, "(%s)", reg_names[REGNO (addr)]); \
413 fprintf (FILE, "-(%s)", reg_names[REGNO (XEXP (addr, 0))]); \
416 fprintf (FILE, "(%s)+", reg_names[REGNO (XEXP (addr, 0))]); \
419 reg1 = 0; reg2 = 0; \
420 ireg = 0; breg = 0; \
422 if (CONSTANT_ADDRESS_P (XEXP (addr, 0))) \
424 offset = XEXP (addr, 0); \
425 addr = XEXP (addr, 1); \
427 else if (CONSTANT_ADDRESS_P (XEXP (addr, 1))) \
429 offset = XEXP (addr, 1); \
430 addr = XEXP (addr, 0); \
432 if (GET_CODE (addr) != PLUS) ; \
433 else if (GET_CODE (XEXP (addr, 0)) == SIGN_EXTEND) \
435 reg1 = XEXP (addr, 0); \
436 addr = XEXP (addr, 1); \
438 else if (GET_CODE (XEXP (addr, 1)) == SIGN_EXTEND) \
440 reg1 = XEXP (addr, 1); \
441 addr = XEXP (addr, 0); \
443 else if (GET_CODE (XEXP (addr, 0)) == MULT) \
445 reg1 = XEXP (addr, 0); \
446 addr = XEXP (addr, 1); \
448 else if (GET_CODE (XEXP (addr, 1)) == MULT) \
450 reg1 = XEXP (addr, 1); \
451 addr = XEXP (addr, 0); \
453 else if (GET_CODE (XEXP (addr, 0)) == REG) \
455 reg1 = XEXP (addr, 0); \
456 addr = XEXP (addr, 1); \
458 else if (GET_CODE (XEXP (addr, 1)) == REG) \
460 reg1 = XEXP (addr, 1); \
461 addr = XEXP (addr, 0); \
463 if (GET_CODE (addr) == REG || GET_CODE (addr) == MULT \
464 || GET_CODE (addr) == SIGN_EXTEND) \
465 { if (reg1 == 0) reg1 = addr; else reg2 = addr; addr = 0; } \
466 /* for OLD_INDEXING \
467 else if (GET_CODE (addr) == PLUS) \
469 if (GET_CODE (XEXP (addr, 0)) == REG) \
471 reg2 = XEXP (addr, 0); \
472 addr = XEXP (addr, 1); \
474 else if (GET_CODE (XEXP (addr, 1)) == REG) \
476 reg2 = XEXP (addr, 1); \
477 addr = XEXP (addr, 0); \
481 if (offset != 0) { if (addr != 0) abort (); addr = offset; } \
482 if ((reg1 && (GET_CODE (reg1) == SIGN_EXTEND \
483 || GET_CODE (reg1) == MULT)) \
484 || (reg2 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg2)))) \
485 { breg = reg2; ireg = reg1; } \
486 else if (reg1 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg1))) \
487 { breg = reg1; ireg = reg2; } \
488 if (ireg != 0 && breg == 0 && GET_CODE (addr) == LABEL_REF) \
490 if (GET_CODE (ireg) == MULT) \
491 { scale = INTVAL (XEXP (ireg, 1)); \
492 ireg = XEXP (ireg, 0); } \
493 if (GET_CODE (ireg) == SIGN_EXTEND) \
494 fprintf (FILE, "L%d-LI%d(%%pc,%s.w", \
495 CODE_LABEL_NUMBER (XEXP (addr, 0)), \
496 CODE_LABEL_NUMBER (XEXP (addr, 0)), \
497 reg_names[REGNO (XEXP (ireg, 0))]); \
499 fprintf (FILE, "L%d-LI%d(%%pc,%s.l", \
500 CODE_LABEL_NUMBER (XEXP (addr, 0)), \
501 CODE_LABEL_NUMBER (XEXP (addr, 0)), \
502 reg_names[REGNO (ireg)]); \
503 if (scale != 1) fprintf (FILE, "*%d", scale); \
506 if (ireg != 0 || breg != 0) \
511 output_addr_const (FILE, addr); \
512 fprintf (FILE, "(%s", reg_names[REGNO (breg)]); \
515 if (ireg != 0 && GET_CODE (ireg) == MULT) \
516 { scale = INTVAL (XEXP (ireg, 1)); \
517 ireg = XEXP (ireg, 0); } \
518 if (ireg != 0 && GET_CODE (ireg) == SIGN_EXTEND) \
519 fprintf (FILE, "%s.w", reg_names[REGNO (XEXP (ireg, 0))]); \
520 else if (ireg != 0) \
521 fprintf (FILE, "%s.l", reg_names[REGNO (ireg)]); \
522 if (scale != 1) fprintf (FILE, "*%d", scale); \
526 else if (reg1 != 0 && GET_CODE (addr) == LABEL_REF) \
527 { fprintf (FILE, "L%d-LI%d(%%pc,%s.w)", \
528 CODE_LABEL_NUMBER (XEXP (addr, 0)), \
529 CODE_LABEL_NUMBER (XEXP (addr, 0)), \
530 reg_names[REGNO (reg1)]); \
533 if (GET_CODE (addr) == CONST_INT \
534 && INTVAL (addr) < 0x8000 \
535 && INTVAL (addr) >= -0x8000) \
536 fprintf (FILE, "%d.w", INTVAL (addr)); \
538 output_addr_const (FILE, addr); \
541 #define ASM_OUTPUT_ASCII(f, p, size) \
545 for (i = 0; i < (size); i++) { \
553 fprintf((f), "%s ", ASCII_DATA_ASM_OP); \
555 if ((p)[i] < 32 || (p)[i] == '\\' || (p)[i] == '"' || (p)[i] == 127) { \
562 fprintf((f), "%d", (p)[i]); \
578 /* Translate Motorola opcodes such as `jbeq'
579 into SGS opcodes such as `beq.w'.
580 Delete the `e' in `move...' and `fmove'.
581 Change `ftst' to `ftest'. */
583 #define ASM_OUTPUT_OPCODE(FILE, PTR) \
584 { if ((PTR)[0] == 'j' && (PTR)[1] == 'b') \
586 while (*(PTR) != ' ') \
587 { putc (*(PTR), (FILE)); ++(PTR); } \
588 fprintf ((FILE), ".w"); } \
589 else if ((PTR)[0] == 'f') \
591 if (!strncmp ((PTR), "fmove", 5)) \
592 { fprintf ((FILE), "fmov"); (PTR) += 5; } \
593 else if (!strncmp ((PTR), "ftst", 4)) \
594 { fprintf ((FILE), "ftest"); (PTR) += 4; } \
596 else if ((PTR)[0] == 'm' && (PTR)[1] == 'o' \
597 && (PTR)[2] == 'v' && (PTR)[3] == 'e') \
598 { fprintf ((FILE), "mov"); (PTR) += 4; } \
601 /* Prevent output of `gcc_compiled.:'. */
603 #define ASM_IDENTIFY_GCC(FILE)
605 #else /* not HPUX_ASM */
607 #undef FUNCTION_PROFILER
608 #define FUNCTION_PROFILER(FILE, LABELNO) \
609 fprintf (FILE, "\tmovl #LP%d,d0\n\tjsr mcount\n", (LABELNO));
611 #endif /* not HPUX_ASM */