|
|
1.1 root 1: /* Definitions of target machine for GNU compiler. HP-UX 68000/68020 version.
2: Copyright (C) 1987, 1988 Free Software Foundation, Inc.
3:
4: This file is part of GNU CC.
5:
6: GNU CC is distributed in the hope that it will be useful,
7: but WITHOUT ANY WARRANTY. No author or distributor
8: accepts responsibility to anyone for the consequences of using it
9: or for whether it serves any particular purpose or works at all,
10: unless he says so in writing. Refer to the GNU CC General Public
11: License for full details.
12:
13: Everyone is granted permission to copy, modify and redistribute
14: GNU CC, but only under the conditions described in the
15: GNU CC General Public License. A copy of this license is
16: supposed to have been given to you along with GNU CC so you
17: can know your rights and responsibilities. It should be in a
18: file named COPYING. Among other things, the copyright notice
19: and this notice must be preserved on all copies. */
20:
21: /* Define USE_GAS if GCC is supposed to work with the GNU assembler,
22: GNU linker and GNU debugger using DBX debugging information.
23: (In other words, much of HPUX has been cast aside.)
24: Undefine USE_GAS if you want GCC to feed the HP assembler. */
25:
26: /* #define USE_GAS */ /* Use tm-hp9k320g.h if you want this. */
27:
28: /* Control assembler-syntax conditionals in m68k.md. */
29:
30: #ifndef USE_GAS
31: #define MOTOROLA
32: #define SGS
33: #define HPUX_ASM
34: #endif
35:
36: #include "tm-m68k.h"
37:
38: /* See tm-m68k.h. 7 means 68020 with 68881. */
39:
40: #define TARGET_DEFAULT 7
41:
42: /* Names to predefine in the preprocessor for this target machine. */
43:
44: #ifdef HPUX_ASM
45: /* This is needed because some programs, particularly GDB, need to
46: know which assembler is being used so that the correct `asm'
47: instructions can be used. */
48: #define CPP_PREDEFINES "-Dhp9000s200 -Dhp9000s300 -DPWB -Dmc68k -Dmc68000 -Dhpux -Dunix -D__HPUX_ASM__"
49: #else
50: #define CPP_PREDEFINES "-Dhp9000s200 -Dhp9000s300 -DPWB -Dmc68k -Dmc68000 -Dhpux -Dunix"
51: #endif
52:
53: /* Every structure or union's size must be a multiple of 2 bytes. */
54:
55: #define STRUCTURE_SIZE_BOUNDARY 16
56:
57: /* Generate calls to memcpy, memcmp and memset. */
58: #define TARGET_MEM_FUNCTIONS
59:
60: /* Function calls don't save any fp registers on hpux. */
61:
62: #undef CALL_USED_REGISTERS
63: #define CALL_USED_REGISTERS \
64: {1, 1, 0, 0, 0, 0, 0, 0, \
65: 1, 1, 0, 0, 0, 0, 0, 1, \
66: 1, 1, 1, 1, 1, 1, 1, 1}
67:
68: #ifdef HPUX_ASM
69:
70: /* Override parts of tm-m68k.h to fit the HPUX assembler. */
71:
72: #undef TARGET_VERSION
73: #undef REGISTER_NAMES
74: #undef FUNCTION_PROLOGUE
75: #undef FUNCTION_EPILOGUE
76: #undef ASM_FILE_START
77: #undef ASM_APP_ON
78: #undef ASM_APP_OFF
79: #undef TEXT_SECTION_ASM_OP
80: #undef DATA_SECTION_ASM_OP
81: #undef ASM_OUTPUT_DOUBLE
82: #undef ASM_OUTPUT_FLOAT
83: #undef ASM_OUTPUT_INT
84: #undef ASM_OUTPUT_SHORT
85: #undef ASM_OUTPUT_CHAR
86: #undef ASM_OUTPUT_BYTE
87: #undef ASM_OUTPUT_ADDR_VEC_ELT
88: #undef ASM_OUTPUT_ADDR_DIFF_ELT
89: #undef ASM_OUTPUT_ALIGN
90: #undef ASM_OUTPUT_SKIP
91: #undef ASM_OUTPUT_COMMON
92: #undef ASM_OUTPUT_LOCAL
93: #undef ASM_FORMAT_PRIVATE_NAME
94: #undef PRINT_OPERAND
95: #undef PRINT_OPERAND_ADDRESS
96: #undef FUNCTION_PROFILER
97: #undef ASM_GLOBALIZE_LABEL
98: #undef ASM_OUTPUT_INTERNAL_LABEL
99:
100: #define TARGET_VERSION printf (" (68k, SGS/hpux syntax)");
101:
102: #define NO_DBX_FORMAT
103:
104: #define ASM_SPEC "%{m68000:+X}"
105:
106: #define REGISTER_NAMES \
107: {"%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7", \
108: "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%fp", "%sp", \
109: "%fp0", "%fp1", "%fp2", "%fp3", "%fp4", "%fp5", "%fp6", "%fp7"}
110:
111: #define FUNCTION_PROLOGUE(FILE, SIZE) \
112: { register int regno; \
113: register int mask = 0; \
114: static char *reg_names[] = REGISTER_NAMES; \
115: extern char call_used_regs[]; \
116: int fsize = (SIZE); \
117: if (frame_pointer_needed) \
118: { if (TARGET_68020 || fsize < 0x8000) \
119: fprintf (FILE, "\tlink.w %%a6,&%d\n", -fsize); \
120: else \
121: fprintf (FILE, "\tlink.w %%a6,&0\n\tsub.l &%d,%%sp\n", fsize); } \
122: for (regno = 16; regno < FIRST_PSEUDO_REGISTER; regno++) \
123: if (regs_ever_live[regno] && ! call_used_regs[regno]) \
124: mask |= 1 << (regno - 16); \
125: if (mask != 0) \
126: fprintf (FILE, "\tfmovem &0x%x,-(%%sp)\n", mask & 0xff); \
127: mask = 0; \
128: for (regno = 0; regno < 16; regno++) \
129: if (regs_ever_live[regno] && ! call_used_regs[regno]) \
130: mask |= 1 << (15 - regno); \
131: if (frame_pointer_needed) \
132: mask &= ~ (1 << (15-FRAME_POINTER_REGNUM)); \
133: if (exact_log2 (mask) >= 0) \
134: fprintf (FILE, "\tmov.l %s,-(%%sp)\n", reg_names[15 - exact_log2 (mask)]); \
135: else if (mask) fprintf (FILE, "\tmovm.l &0x%x,-(%%sp)\n", mask); }
136:
137: #define FUNCTION_PROFILER(FILE, LABEL_NO) \
138: fprintf (FILE, "\tmov.l &LP%d,%%d0\n\tjsr mcount\n", (LABEL_NO));
139:
140: #define FUNCTION_EPILOGUE(FILE, SIZE) \
141: { register int regno; \
142: register int mask, fmask; \
143: register int nregs; \
144: int offset, foffset; \
145: extern char call_used_regs[]; \
146: static char *reg_names[] = REGISTER_NAMES; \
147: extern int current_function_pops_args; \
148: extern int current_function_args_size; \
149: int fsize = (SIZE); \
150: int big = 0; \
151: nregs = 0; fmask = 0; \
152: for (regno = 16; regno < FIRST_PSEUDO_REGISTER; regno++) \
153: if (regs_ever_live[regno] && ! call_used_regs[regno]) \
154: { nregs++; fmask |= 1 << (23 - regno); } \
155: foffset = nregs * 12; \
156: nregs = 0; mask = 0; \
157: if (frame_pointer_needed) regs_ever_live[FRAME_POINTER_REGNUM] = 0; \
158: for (regno = 0; regno < 16; regno++) \
159: if (regs_ever_live[regno] && ! call_used_regs[regno]) \
160: { nregs++; mask |= 1 << regno; } \
161: offset = foffset + nregs * 4; \
162: if (offset + fsize >= 0x8000 && frame_pointer_needed) \
163: { fprintf (FILE, "\tmov.l &%d,%%a0\n", -fsize); \
164: fsize = 0, big = 1; } \
165: if (exact_log2 (mask) >= 0) { \
166: if (big) \
167: fprintf (FILE, "\tmov.l -%d(%%a6,%%a0.l),%s\n", \
168: offset + fsize, reg_names[exact_log2 (mask)]); \
169: else if (! frame_pointer_needed) \
170: fprintf (FILE, "\tmov.l (%%sp)+,%s\n", \
171: reg_names[exact_log2 (mask)]); \
172: else \
173: fprintf (FILE, "\tmov.l -%d(%%a6),%s\n", \
174: offset + fsize, reg_names[exact_log2 (mask)]); } \
175: else if (mask) { \
176: if (big) \
177: fprintf (FILE, "\tmovm.l -%d(%%a6,%%a0.l),&0x%x\n", \
178: offset + fsize, mask); \
179: else if (! frame_pointer_needed) \
180: fprintf (FILE, "\tmovm.l (%%sp)+,&0x%x\n", mask); \
181: else \
182: fprintf (FILE, "\tmovm.l -%d(%%a6),&0x%x\n", \
183: offset + fsize, mask); } \
184: if (fmask) { \
185: if (big) \
186: fprintf (FILE, "\tfmovem -%d(%%a6,%%a0.l),&0x%x\n", \
187: foffset + fsize, fmask); \
188: else if (! frame_pointer_needed) \
189: fprintf (FILE, "\tfmovem (%%sp)+,&0x%x\n", fmask); \
190: else \
191: fprintf (FILE, "\tfmovem -%d(%%a6),&0x%x\n", \
192: foffset + fsize, fmask); } \
193: if (frame_pointer_needed) \
194: fprintf (FILE, "\tunlk %%a6\n"); \
195: if (current_function_pops_args && current_function_args_size) \
196: fprintf (FILE, "\trtd &%d\n", current_function_args_size); \
197: else fprintf (FILE, "\trts\n"); }
198:
199: #define ASM_FILE_START ""
200:
201: #define ASM_APP_ON ""
202:
203: #define ASM_APP_OFF ""
204:
205: #define TEXT_SECTION_ASM_OP "\ttext"
206:
207: #define DATA_SECTION_ASM_OP "\tdata"
208:
209: #define ASCII_DATA_ASM_OP "\tbyte"
210:
211: /* This says how to output an assembler line
212: to define a global common symbol. */
213:
214: #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE) \
215: ( fputs ("\tcomm ", (FILE)), \
216: assemble_name ((FILE), (NAME)), \
217: fprintf ((FILE), ",%d\n", (SIZE)))
218:
219: /* This says how to output an assembler line
220: to define a local common symbol. */
221:
222: #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE) \
223: ( fputs ("\tlcomm ", (FILE)), \
224: assemble_name ((FILE), (NAME)), \
225: fprintf ((FILE), ",%d,2\n", (SIZE)))
226:
227: /* Store in OUTPUT a string (made with alloca) containing
228: an assembler-name for a local static variable named NAME.
229: LABELNO is an integer which is different for each call. */
230:
231: #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
232: ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 12), \
233: sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO)))
234:
235: /* This is how to output a command to make the user-level label named NAME
236: defined for reference from other files. */
237:
238: #define ASM_GLOBALIZE_LABEL(FILE,NAME) \
239: do { fputs ("\tglobal ", FILE); assemble_name (FILE, NAME); fputs ("\n", FILE);} while (0)
240:
241: #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
242: do{ if (PREFIX[0] == 'L' && PREFIX[1] == 'I') \
243: fprintf(FILE, "\tset %s%d,.+2\n", PREFIX, NUM); \
244: else \
245: fprintf (FILE, "%s%d:\n", PREFIX, NUM); \
246: } while(0)
247:
248: #if 0
249: /* Are these definitions necessary? */
250:
251: #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
252: do { union { double d; long l[2]; } tem; \
253: tem.d = (VALUE); \
254: fprintf(FILE, "\tlong 0x%x,0x%x\n", tem.l[0], tem.l[1]); \
255: } while (0)
256:
257: #define ASM_OUTPUT_FLOAT(FILE,VALUE) \
258: do { union { float f; long l;} tem; \
259: tem.f = (VALUE); \
260: fprintf (FILE, "\tlong 0x%x\n", tem.l); \
261: } while (0)
262: #endif
263:
264: #define ASM_OUTPUT_DOUBLE(FILE, VALUE) \
265: fprintf (FILE, "\tdouble 0f%.20g\n", (VALUE))
266:
267: #define ASM_OUTPUT_FLOAT(FILE, VALUE) \
268: fprintf (FILE, "\tfloat 0f%.9g\n", (VALUE))
269:
270: /* This is how to output an assembler line defining an `int' constant. */
271:
272: #define ASM_OUTPUT_INT(FILE,VALUE) \
273: ( fprintf (FILE, "\tlong "), \
274: output_addr_const (FILE, (VALUE)), \
275: fprintf (FILE, "\n"))
276:
277: /* Likewise for `char' and `short' constants. */
278:
279: #define ASM_OUTPUT_SHORT(FILE,VALUE) \
280: ( fprintf (FILE, "\tshort "), \
281: output_addr_const (FILE, (VALUE)), \
282: fprintf (FILE, "\n"))
283:
284: #define ASM_OUTPUT_CHAR(FILE,VALUE) \
285: ( fprintf (FILE, "\tbyte "), \
286: output_addr_const (FILE, (VALUE)), \
287: fprintf (FILE, "\n"))
288:
289: /* This is how to output an assembler line for a numeric constant byte. */
290:
291: #define ASM_OUTPUT_BYTE(FILE,VALUE) \
292: fprintf (FILE, "\tbyte 0x%x\n", (VALUE))
293:
294: #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
295: fprintf (FILE, "\tlong L%d\n", VALUE)
296:
297: #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
298: fprintf (FILE, "\tshort L%d-L%d\n", VALUE, REL)
299:
300: #define ASM_OUTPUT_ALIGN(FILE,LOG) \
301: if ((LOG) == 1) \
302: fprintf (FILE, "\tlalign 2\n"); \
303: else if ((LOG) != 0) \
304: abort ();
305:
306: #define ASM_OUTPUT_SKIP(FILE,SIZE) \
307: fprintf (FILE, "\tspace %d\n", (SIZE))
308:
309: #define ASM_OUTPUT_SOURCE_FILENAME(FILE, FILENAME)
310: #define ASM_OUTPUT_SOURCE_LINE(FILE, LINENO)
311:
312: #define PRINT_OPERAND(FILE, X, CODE) \
313: { if (CODE == '.') fprintf (FILE, "."); \
314: else if (CODE == '#') fprintf (FILE, "&"); \
315: else if (CODE == '-') fprintf (FILE, "-(%%sp)"); \
316: else if (CODE == '+') fprintf (FILE, "(%%sp)+"); \
317: else if (CODE == 's') fprintf (FILE, "(%%sp)"); \
318: else if (CODE == '!') fprintf (FILE, "%%cc"); \
319: else if (GET_CODE (X) == REG) \
320: fprintf (FILE, "%s", reg_name [REGNO (X)]); \
321: else if (GET_CODE (X) == MEM) \
322: output_address (XEXP (X, 0)); \
323: else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == SFmode) \
324: { union { double d; int i[2]; } u; \
325: union { float f; int i; } u1; \
326: u.i[0] = XINT (X, 0); u.i[1] = XINT (X, 1); \
327: u1.f = u.d; \
328: if (CODE == 'f') \
329: fprintf (FILE, "&0f%.9g", u1.f); \
330: else \
331: fprintf (FILE, "&0x%x", u1.i); } \
332: else if (GET_CODE (X) == CONST_DOUBLE) \
333: { union { double d; int i[2]; } u; \
334: u.i[0] = XINT (X, 0); u.i[1] = XINT (X, 1); \
335: fprintf (FILE, "&0f%.20g", u.d); } \
336: else { putc ('&', FILE); output_addr_const (FILE, X); }}
337:
338: #define PRINT_OPERAND_ADDRESS(FILE, ADDR) \
339: { register rtx reg1, reg2, breg, ireg; \
340: register rtx addr = ADDR; \
341: rtx offset; \
342: switch (GET_CODE (addr)) \
343: { \
344: case REG: \
345: fprintf (FILE, "(%s)", reg_name [REGNO (addr)]); \
346: break; \
347: case PRE_DEC: \
348: fprintf (FILE, "-(%s)", reg_name [REGNO (XEXP (addr, 0))]); \
349: break; \
350: case POST_INC: \
351: fprintf (FILE, "(%s)+", reg_name [REGNO (XEXP (addr, 0))]); \
352: break; \
353: case PLUS: \
354: reg1 = 0; reg2 = 0; \
355: ireg = 0; breg = 0; \
356: offset = 0; \
357: if (CONSTANT_ADDRESS_P (XEXP (addr, 0))) \
358: { \
359: offset = XEXP (addr, 0); \
360: addr = XEXP (addr, 1); \
361: } \
362: else if (CONSTANT_ADDRESS_P (XEXP (addr, 1))) \
363: { \
364: offset = XEXP (addr, 1); \
365: addr = XEXP (addr, 0); \
366: } \
367: if (GET_CODE (addr) != PLUS) ; \
368: else if (GET_CODE (XEXP (addr, 0)) == SIGN_EXTEND) \
369: { \
370: reg1 = XEXP (addr, 0); \
371: addr = XEXP (addr, 1); \
372: } \
373: else if (GET_CODE (XEXP (addr, 1)) == SIGN_EXTEND) \
374: { \
375: reg1 = XEXP (addr, 1); \
376: addr = XEXP (addr, 0); \
377: } \
378: else if (GET_CODE (XEXP (addr, 0)) == MULT) \
379: { \
380: reg1 = XEXP (addr, 0); \
381: addr = XEXP (addr, 1); \
382: } \
383: else if (GET_CODE (XEXP (addr, 1)) == MULT) \
384: { \
385: reg1 = XEXP (addr, 1); \
386: addr = XEXP (addr, 0); \
387: } \
388: else if (GET_CODE (XEXP (addr, 0)) == REG) \
389: { \
390: reg1 = XEXP (addr, 0); \
391: addr = XEXP (addr, 1); \
392: } \
393: else if (GET_CODE (XEXP (addr, 1)) == REG) \
394: { \
395: reg1 = XEXP (addr, 1); \
396: addr = XEXP (addr, 0); \
397: } \
398: if (GET_CODE (addr) == REG || GET_CODE (addr) == MULT \
399: || GET_CODE (addr) == SIGN_EXTEND) \
400: { if (reg1 == 0) reg1 = addr; else reg2 = addr; addr = 0; } \
401: /* for OLD_INDEXING \
402: else if (GET_CODE (addr) == PLUS) \
403: { \
404: if (GET_CODE (XEXP (addr, 0)) == REG) \
405: { \
406: reg2 = XEXP (addr, 0); \
407: addr = XEXP (addr, 1); \
408: } \
409: else if (GET_CODE (XEXP (addr, 1)) == REG) \
410: { \
411: reg2 = XEXP (addr, 1); \
412: addr = XEXP (addr, 0); \
413: } \
414: } \
415: */ \
416: if (offset != 0) { if (addr != 0) abort (); addr = offset; } \
417: if ((reg1 && (GET_CODE (reg1) == SIGN_EXTEND \
418: || GET_CODE (reg1) == MULT)) \
419: || (reg2 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg2)))) \
420: { breg = reg2; ireg = reg1; } \
421: else if (reg1 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg1))) \
422: { breg = reg1; ireg = reg2; } \
423: if (ireg != 0 && breg == 0 && GET_CODE (addr) == LABEL_REF) \
424: { int scale = 1; \
425: if (GET_CODE (ireg) == MULT) \
426: { scale = INTVAL (XEXP (ireg, 1)); \
427: ireg = XEXP (ireg, 0); } \
428: if (GET_CODE (ireg) == SIGN_EXTEND) \
429: fprintf (FILE, "L%d-LI%d(%%pc,%s.w", \
430: CODE_LABEL_NUMBER (XEXP (addr, 0)), \
431: CODE_LABEL_NUMBER (XEXP (addr, 0)), \
432: reg_name[REGNO (XEXP (ireg, 0))]); \
433: else \
434: fprintf (FILE, "L%d-LI%d(%%pc,%s.l", \
435: CODE_LABEL_NUMBER (XEXP (addr, 0)), \
436: CODE_LABEL_NUMBER (XEXP (addr, 0)), \
437: reg_name[REGNO (ireg)]); \
438: if (scale != 1) fprintf (FILE, "*%d", scale); \
439: putc (')', FILE); \
440: break; } \
441: if (ireg != 0 || breg != 0) \
442: { int scale = 1; \
443: if (breg == 0) \
444: abort (); \
445: if (addr != 0) \
446: output_addr_const (FILE, addr); \
447: fprintf (FILE, "(%s", reg_name[REGNO (breg)]); \
448: if (ireg != 0) \
449: putc (',', FILE); \
450: if (ireg != 0 && GET_CODE (ireg) == MULT) \
451: { scale = INTVAL (XEXP (ireg, 1)); \
452: ireg = XEXP (ireg, 0); } \
453: if (ireg != 0 && GET_CODE (ireg) == SIGN_EXTEND) \
454: fprintf (FILE, "%s.w", reg_name[REGNO (XEXP (ireg, 0))]); \
455: else if (ireg != 0) \
456: fprintf (FILE, "%s.l", reg_name[REGNO (ireg)]); \
457: if (scale != 1) fprintf (FILE, "*%d", scale); \
458: putc (')', FILE); \
459: break; \
460: } \
461: else if (reg1 != 0 && GET_CODE (addr) == LABEL_REF) \
462: { fprintf (FILE, "L%d-LI%d(%%pc,%s.w)", \
463: CODE_LABEL_NUMBER (XEXP (addr, 0)), \
464: CODE_LABEL_NUMBER (XEXP (addr, 0)), \
465: reg_name[REGNO (reg1)]); \
466: break; } \
467: default: \
468: if (GET_CODE (addr) == CONST_INT \
469: && INTVAL (addr) < 0x8000 \
470: && INTVAL (addr) >= -0x8000) \
471: fprintf (FILE, "%d.w", INTVAL (addr)); \
472: else \
473: output_addr_const (FILE, addr); \
474: }}
475:
476: #define ASM_OUTPUT_ASCII(f, p, size) \
477: { register int i; \
478: int inside; \
479: inside = FALSE; \
480: for (i = 0; i < size; i++) { \
481: if (i % 8 == 0) { \
482: if (i != 0) { \
483: if (inside) \
484: putc('"', f); \
485: putc('\n', f); \
486: inside = FALSE; \
487: } \
488: fprintf(f, "%s ", ASCII_DATA_ASM_OP); \
489: } \
490: if (p[i] < 32 || p[i] == '\\' || p[i] == '"' || p[i] == 127) { \
491: if (inside) { \
492: putc('"', f); \
493: inside = FALSE; \
494: } \
495: if (i % 8 != 0) \
496: putc(',', f); \
497: fprintf(f, "%d", p[i]); \
498: } else { \
499: if (!inside) { \
500: if (i % 8 != 0) \
501: putc(',', f); \
502: putc('"', f); \
503: inside = TRUE; \
504: } \
505: putc(p[i], f); \
506: } \
507: } \
508: if (inside) \
509: putc('"', f); \
510: putc('\n', f); \
511: }
512:
513: /* Translate Motorola opcodes such as `jbeq'
514: into SGS opcodes such as `beq.w'.
515: Delete the `e' in `move...' and `fmove'.
516: Change `ftst' to `ftest'. */
517:
518: #define ASM_OUTPUT_OPCODE(FILE, PTR) \
519: { if ((PTR)[0] == 'j' && (PTR)[1] == 'b') \
520: { ++(PTR); \
521: while (*(PTR) != ' ') \
522: { putc (*(PTR), (FILE)); ++(PTR); } \
523: fprintf ((FILE), ".w"); } \
524: else if ((PTR)[0] == 'f') \
525: { \
526: if (!strncmp ((PTR), "fmove", 5)) \
527: { fprintf ((FILE), "fmov"); (PTR) += 5; } \
528: else if (!strncmp ((PTR), "ftst", 4)) \
529: { fprintf ((FILE), "ftest"); (PTR) += 4; } \
530: } \
531: else if ((PTR)[0] == 'm' && (PTR)[1] == 'o' \
532: && (PTR)[2] == 'v' && (PTR)[3] == 'e') \
533: { fprintf ((FILE), "mov"); (PTR) += 4; } \
534: }
535:
536: #else /* not HPUX_ASM */
537:
538: #undef FUNCTION_PROFILER
539: #define FUNCTION_PROFILER(FILE, LABELNO) \
540: fprintf (FILE, "\tmovl #LP%d,d0\n\tjsr mcount\n", (LABELNO));
541:
542: #endif /* not HPUX_ASM */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.