home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / gnu / gcc-2.4.5 / config / m68k / news.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-05-14  |  16.4 KB  |  469 lines

  1. /* Definitions of target machine for GNU compiler.  SONY NEWS-OS 4 version.
  2.    Copyright (C) 1987, 1989, 1993 Free Software Foundation, Inc.
  3.  
  4. This file is part of GNU CC.
  5.  
  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)
  9. any later version.
  10.  
  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.
  15.  
  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.  */
  19.  
  20. #ifndef USE_GAS
  21. /* This controls conditionals in m68k.h.  */
  22. #define MOTOROLA        /* Use Motorola syntax rather than "MIT" */
  23. #define SGS_NO_LI        /* Suppress jump table label usage */
  24. #endif
  25.  
  26. #include "m68k/m68k.h"
  27.  
  28. /* See m68k.h.  7 means 68020 with 68881.  */
  29.  
  30. #define TARGET_DEFAULT 7
  31.  
  32. /* Define __HAVE_68881__ in preprocessor, unless -msoft-float is specified.
  33.    This will control the use of inline 68881 insns in certain macros.  */
  34.  
  35. #define CPP_SPEC "%{!msoft-float:-D__HAVE_68881__}"
  36.  
  37. /* Names to predefine in the preprocessor for this target machine.  */
  38. /* These are the ones defined by Sony, plus mc68000 for uniformity with
  39.    GCC on other 68000 systems.  */
  40.  
  41. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dnews700"
  42.  
  43. /* These conditionals tested for different submodels,
  44.    but they were incorrect since they tested the host rather than the target.
  45.    The choice of model shouldn't actually matter.  */
  46.  
  47. #if 0
  48. #ifdef news800
  49. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dnews800"
  50. #endif
  51. #ifdef news900
  52. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dnews900"
  53. #endif
  54. #ifdef news1500
  55. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dmc68030 -Dnews1500"
  56. #endif
  57. #ifdef news1700
  58. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dmc68030 -Dnews1700"
  59. #endif
  60. #ifdef news1800
  61. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dmc68030 -Dnews1800"
  62. #endif
  63. #ifdef news1900
  64. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dmc68030 -Dnews1900"
  65. #endif
  66. #endif
  67.  
  68. /* Link with libg.a when debugging, for dbx's sake.  */
  69.  
  70. #define LIB_SPEC "%{g:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p} "
  71.  
  72. /* This is BSD, so it wants DBX format.  */
  73.  
  74. #define DBX_DEBUGGING_INFO
  75.  
  76. #if 0
  77. /* This is to be compatible with types.h.
  78.    It was found to be necessary with Newsos 3.  */
  79.  
  80. #define SIZE_TYPE "long int"
  81. #endif
  82.  
  83. /* Override parts of m68k.h to fit Sony's assembler syntax.  */
  84.  
  85. #undef BIGGEST_ALIGNMENT
  86. #undef CALL_USED_REGISTERS
  87. #undef FUNCTION_VALUE
  88. #undef LIBCALL_VALUE
  89. #undef FUNCTION_PROFILER
  90.  
  91. #ifdef MOTOROLA
  92. #undef FUNCTION_PROLOGUE
  93. #undef FUNCTION_EPILOGUE
  94. #undef REGISTER_NAMES
  95. #undef ASM_OUTPUT_REG_PUSH
  96. #undef ASM_OUTPUT_REG_POP
  97. #undef ASM_OUTPUT_DOUBLE
  98. #undef ASM_OUTPUT_SKIP
  99. #undef ASM_FORMAT_PRIVATE_NAME
  100. #undef PRINT_OPERAND
  101. #undef PRINT_OPERAND_ADDRESS
  102. #endif  
  103.  
  104. #undef ASM_OUTPUT_ALIGN
  105.  
  106. /* There is no point aligning anything to a rounder boundary than this.  */
  107. #define BIGGEST_ALIGNMENT 32
  108.  
  109. /* A bitfield declared as `int' forces `int' alignment for the struct.  */
  110. #define PCC_BITFIELD_TYPE_MATTERS 1
  111.   
  112. /* NEWS makes d2, d3, fp2 and fp3 unsaved registers, unlike the Sun system.  */
  113.   
  114. #define CALL_USED_REGISTERS \
  115.  {1, 1, 1, 1, 0, 0, 0, 0, \
  116.   1, 1, 0, 0, 0, 0, 0, 1, \
  117.   1, 1, 1, 1, 0, 0, 0, 0}
  118.  
  119. /* NEWS returns floats and doubles in fp0, not d0/d1.  */
  120.  
  121. #define FUNCTION_VALUE(VALTYPE,FUNC) LIBCALL_VALUE (TYPE_MODE (VALTYPE))
  122.  
  123. #define LIBCALL_VALUE(MODE)                           \
  124.  gen_rtx (REG, (MODE),                               \
  125.       ((TARGET_68881                           \
  126.         && ((MODE) == SFmode || (MODE) == DFmode || (MODE) == XFmode)) \
  127.        ? 16 : 0))
  128.  
  129. #define ASM_OUTPUT_ALIGN(FILE,LOG)    \
  130.   fprintf (FILE, "\t.align %d\n", (LOG))
  131.  
  132. #ifdef MOTOROLA
  133.  
  134. /* Don't try to define `gcc_compiled.' since the assembler does not
  135.    accept symbols with periods.  This is no real loss since GDB only
  136.    really needs it for parms passed in registers.  */
  137. #define ASM_IDENTIFY_GCC(FILE)
  138.  
  139. #define FUNCTION_PROLOGUE(FILE, SIZE)     \
  140. { register int regno;                        \
  141.   register int mask = 0;                    \
  142.   extern char call_used_regs[];                    \
  143.   int fsize = ((SIZE) + 3) & -4;                \
  144.   if (frame_pointer_needed)                    \
  145.     { if (fsize < 0x8000)                            \
  146.         fprintf (FILE, "\tlink fp,#%d\n", -fsize);        \
  147.       else if (TARGET_68020)                                    \
  148.         fprintf (FILE, "\tlink.l fp,#%d\n", -fsize);            \
  149.       else                            \
  150.     fprintf (FILE, "\tlink fp,#0\n\tsub.l #%d,sp\n", fsize);\
  151.     }                                \
  152.   else if (fsize)                        \
  153.     {                                \
  154.       int amt = fsize + 4;                    \
  155.       /* Adding negative number is faster on the 68040.  */    \
  156.       if (fsize + 4 < 0x8000)                    \
  157.     asm_fprintf (FILE, "\tadd.w %0I%d,%Rsp\n", - amt);    \
  158.       else                            \
  159.     asm_fprintf (FILE, "\tadd.l %0I%d,%Rsp\n", - amt);    \
  160.     }                                \
  161.   for (regno = 16; regno < FIRST_PSEUDO_REGISTER; regno++)    \
  162.     if (regs_ever_live[regno] && ! call_used_regs[regno])    \
  163.        mask |= 1 << (regno - 16);                \
  164.   if (mask != 0)                        \
  165.     fprintf (FILE, "\tfmovem.x #0x%x,-(sp)\n", mask & 0xff);    \
  166.   mask = 0;                            \
  167.   for (regno = 0; regno < 16; regno++)                \
  168.     if (regs_ever_live[regno] && ! call_used_regs[regno])    \
  169.        mask |= 1 << (15 - regno);                \
  170.   if (frame_pointer_needed)                    \
  171.     mask &= ~ (1 << (15-FRAME_POINTER_REGNUM));            \
  172.   if (exact_log2 (mask) >= 0)                    \
  173.     fprintf (FILE, "\tmove.l %s,-(sp)\n", reg_names[15 - exact_log2 (mask)]);  \
  174.   else if (mask) fprintf (FILE, "\tmovem.l #0x%x,-(sp)\n", mask); }
  175.  
  176. #define FUNCTION_PROFILER(FILE, LABEL_NO) \
  177.    fprintf (FILE, "\tmove.l #LP%d,d0\n\tjsr mcount\n", (LABEL_NO));
  178.  
  179. #define FUNCTION_EPILOGUE(FILE, SIZE) \
  180. { register int regno;                        \
  181.   register int mask, fmask;                    \
  182.   register int nregs;                        \
  183.   int offset, foffset;                        \
  184.   extern char call_used_regs[];                    \
  185.   int fsize = ((SIZE) + 3) & -4;                \
  186.   int big = 0;                            \
  187.   nregs = 0;  fmask = 0;                    \
  188.   for (regno = 16; regno < FIRST_PSEUDO_REGISTER; regno++)    \
  189.     if (regs_ever_live[regno] && ! call_used_regs[regno])    \
  190.       { nregs++; fmask |= 1 << (23 - regno); }            \
  191.   foffset = nregs * 12;                        \
  192.   nregs = 0;  mask = 0;                        \
  193.   if (frame_pointer_needed) regs_ever_live[FRAME_POINTER_REGNUM] = 0; \
  194.   for (regno = 0; regno < 16; regno++)                \
  195.     if (regs_ever_live[regno] && ! call_used_regs[regno])    \
  196.       { nregs++; mask |= 1 << regno; }                \
  197.   offset = foffset + nregs * 4;                    \
  198.   if (offset + fsize >= 0x8000                     \
  199.       && frame_pointer_needed                    \
  200.       && (mask || fmask))                    \
  201.     { fprintf (FILE, "\tmove.l #%d,a0\n", -fsize);        \
  202.       fsize = 0, big = 1; }                    \
  203.   if (exact_log2 (mask) >= 0) {                    \
  204.     if (big)                            \
  205.       fprintf (FILE, "\tmove.l (-%d,fp,a0.l),%s\n",        \
  206.            offset + fsize, reg_names[exact_log2 (mask)]);    \
  207.     else if (! frame_pointer_needed)                \
  208.       fprintf (FILE, "\tmove.l (sp)+,%s\n",            \
  209.            reg_names[exact_log2 (mask)]);            \
  210.     else                            \
  211.       fprintf (FILE, "\tmove.l (-%d,fp),%s\n",            \
  212.            offset + fsize, reg_names[exact_log2 (mask)]); }    \
  213.   else if (mask) {                        \
  214.     if (big)                            \
  215.       fprintf (FILE, "\tmovem.l (-%d,fp,a0.l),#0x%x\n",        \
  216.            offset + fsize, mask);                \
  217.     else if (! frame_pointer_needed)                \
  218.       fprintf (FILE, "\tmovem.l (sp)+,#0x%x\n", mask);        \
  219.     else                            \
  220.       fprintf (FILE, "\tmovem.l (-%d,fp),#0x%x\n",        \
  221.            offset + fsize, mask); }                \
  222.   if (fmask) {                            \
  223.     if (big)                            \
  224.       fprintf (FILE, "\tfmovem.x (-%d,fp,a0.l),#0x%x\n",    \
  225.            foffset + fsize, fmask);                \
  226.     else if (! frame_pointer_needed)                \
  227.       fprintf (FILE, "\tfmovem.x (sp)+,#0x%x\n", fmask);    \
  228.     else                            \
  229.       fprintf (FILE, "\tfmovem.x (-%d,fp),#0x%x\n",        \
  230.            foffset + fsize, fmask); }            \
  231.   if (frame_pointer_needed)                    \
  232.     fprintf (FILE, "\tunlk fp\n");                \
  233.   else if (fsize)                        \
  234.     {                                \
  235.       if (fsize + 4 < 0x8000)                    \
  236.     fprintf (FILE, "\tadd.w #%d,sp\n", fsize + 4);        \
  237.       else                            \
  238.     fprintf (FILE, "\tadd.l #%d,sp\n", fsize + 4);        \
  239.     }                                \
  240.   if (current_function_pops_args)                \
  241.     fprintf (FILE, "\trtd #%d\n", current_function_pops_args);    \
  242.   else fprintf (FILE, "\trts\n"); }
  243.  
  244. /* Difference from m68k.h is in `fp' instead of `a6'.  */
  245.  
  246. #define REGISTER_NAMES \
  247. {"d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",    \
  248.  "a0", "a1", "a2", "a3", "a4", "a5", "fp", "sp",    \
  249.  "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7"}
  250.  
  251. /* This is how to output an insn to push a register on the stack.
  252.    It need not be very fast code.  */
  253.  
  254. #define ASM_OUTPUT_REG_PUSH(FILE,REGNO)  \
  255.   fprintf (FILE, "\tmove.l %s,-(sp)\n", reg_names[REGNO])
  256.  
  257. /* This is how to output an insn to pop a register from the stack.
  258.    It need not be very fast code.  */
  259.  
  260. #define ASM_OUTPUT_REG_POP(FILE,REGNO)  \
  261.   fprintf (FILE, "\tmove.l (sp)+,%s\n", reg_names[REGNO])
  262.   
  263. #define ASM_OUTPUT_DOUBLE(FILE,VALUE)  \
  264. do { char dstr[30];                    \
  265.      REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", dstr);    \
  266.      fprintf (FILE, "\t.double 0d%s\n", dstr);        \
  267.    } while (0)
  268.  
  269. #define ASM_OUTPUT_SKIP(FILE,SIZE)  \
  270.   fprintf (FILE, "\t.space %u\n", (SIZE))
  271.  
  272. #if 0
  273. /* The NEWS assembler in version 3.4 complains about fmove.d, but this
  274.    macro proved not to work right.  3.4 is old, so forget about it. */
  275. #define ASM_OUTPUT_OPCODE(FILE, STRING) \
  276. {                        \
  277.   if (!strncmp (STRING, "fmove.d", 7)        \
  278.       && CONSTANT_P (operands[1]))        \
  279.     {                        \
  280.       fprintf (FILE, "fmove.x");        \
  281.       STRING += 7;                \
  282.     }                        \
  283. }
  284. #endif
  285.  
  286. /* Store in OUTPUT a string (made with alloca) containing
  287.    an assembler-name for a local static variable named NAME.
  288.    LABELNO is an integer which is different for each call.  */
  289.  
  290. #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO)    \
  291. ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 13),    \
  292.   sprintf ((OUTPUT), "%s$$$%d", (NAME), (LABELNO)))
  293.  
  294. #define PRINT_OPERAND(FILE, X, CODE)  \
  295. { if (CODE == '.') fprintf (FILE, ".");                    \
  296.   else if (CODE == '#') fprintf (FILE, "#");                \
  297.   else if (CODE == '-') fprintf (FILE, "-(sp)");            \
  298.   else if (CODE == '+') fprintf (FILE, "(sp)+");            \
  299.   else if (CODE == '@') fprintf (FILE, "(sp)");                \
  300.   else if (CODE == '!') fprintf (FILE, "fpcr");                \
  301.   else if (CODE == '$') {if (TARGET_68040_ONLY) fprintf (FILE, "s");}    \
  302.   else if (CODE == '&') {if (TARGET_68040_ONLY) fprintf (FILE, "d");}    \
  303.   else if (CODE == '/')                            \
  304.     ;                                    \
  305.   else if (GET_CODE (X) == REG)                        \
  306.     fprintf (FILE, "%s", reg_names[REGNO (X)]);                \
  307.   else if (GET_CODE (X) == MEM)                        \
  308.     output_address (XEXP (X, 0));                    \
  309.   else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == SFmode)    \
  310.     { REAL_VALUE_TYPE r;                        \
  311.       REAL_VALUE_FROM_CONST_DOUBLE (r, X);                \
  312.       if (CODE == 'f')                            \
  313.         { char dstr[30];                        \
  314.           REAL_VALUE_TO_DECIMAL (r, "%.9e", dstr);            \
  315.           fprintf (FILE, "#0f%s", dstr);                \
  316.         }                                \
  317.       else                                \
  318.         { long l;                            \
  319.           REAL_VALUE_TO_TARGET_SINGLE (r, l);                \
  320.           fprintf (FILE, "#0x%x", l);                    \
  321.         }}                                \
  322.   else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == XFmode)    \
  323.     { REAL_VALUE_TYPE r;                        \
  324.       REAL_VALUE_FROM_CONST_DOUBLE (r, X);                \
  325.       ASM_OUTPUT_LONG_DOUBLE_OPERAND (FILE, r); }            \
  326.   else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) != DImode)    \
  327.     { REAL_VALUE_TYPE r; char dstr[30];                    \
  328.       REAL_VALUE_FROM_CONST_DOUBLE (r, X);                \
  329.       REAL_VALUE_TO_DECIMAL (r, "%.20e", dstr );            \
  330.       fprintf (FILE, "#0d%s", dstr); }                    \
  331.   else if (CODE == 'b') output_addr_const (FILE, X);            \
  332.   else { putc ('#', FILE); output_addr_const (FILE, X); }}
  333.  
  334. #define PRINT_OPERAND_ADDRESS(FILE, ADDR)  \
  335. { register rtx reg1, reg2, breg, ireg;                    \
  336.   register rtx addr = ADDR;                        \
  337.   rtx offset;                                \
  338.   switch (GET_CODE (addr))                        \
  339.     {                                    \
  340.     case REG:                                \
  341.       fprintf (FILE, "(%s)", reg_names[REGNO (addr)]);            \
  342.       break;                                \
  343.     case PRE_DEC:                            \
  344.       fprintf (FILE, "-(%s)", reg_names[REGNO (XEXP (addr, 0))]);    \
  345.       break;                                \
  346.     case POST_INC:                            \
  347.       fprintf (FILE, "(%s)+", reg_names[REGNO (XEXP (addr, 0))]);    \
  348.       break;                                \
  349.     case PLUS:                                \
  350.       reg1 = 0;    reg2 = 0;                        \
  351.       ireg = 0;    breg = 0;                        \
  352.       offset = 0;                            \
  353.       if (CONSTANT_ADDRESS_P (XEXP (addr, 0)))                \
  354.     {                                \
  355.       offset = XEXP (addr, 0);                    \
  356.       addr = XEXP (addr, 1);                    \
  357.     }                                \
  358.       else if (CONSTANT_ADDRESS_P (XEXP (addr, 1)))            \
  359.     {                                \
  360.       offset = XEXP (addr, 1);                    \
  361.       addr = XEXP (addr, 0);                    \
  362.     }                                \
  363.       if (GET_CODE (addr) != PLUS) ;                    \
  364.       else if (GET_CODE (XEXP (addr, 0)) == SIGN_EXTEND)        \
  365.     {                                \
  366.       reg1 = XEXP (addr, 0);                    \
  367.       addr = XEXP (addr, 1);                    \
  368.     }                                \
  369.       else if (GET_CODE (XEXP (addr, 1)) == SIGN_EXTEND)        \
  370.     {                                \
  371.       reg1 = XEXP (addr, 1);                    \
  372.       addr = XEXP (addr, 0);                    \
  373.     }                                \
  374.       else if (GET_CODE (XEXP (addr, 0)) == MULT)            \
  375.     {                                \
  376.       reg1 = XEXP (addr, 0);                    \
  377.       addr = XEXP (addr, 1);                    \
  378.     }                                \
  379.       else if (GET_CODE (XEXP (addr, 1)) == MULT)            \
  380.     {                                \
  381.       reg1 = XEXP (addr, 1);                    \
  382.       addr = XEXP (addr, 0);                    \
  383.     }                                \
  384.       else if (GET_CODE (XEXP (addr, 0)) == REG)            \
  385.     {                                \
  386.       reg1 = XEXP (addr, 0);                    \
  387.       addr = XEXP (addr, 1);                    \
  388.     }                                \
  389.       else if (GET_CODE (XEXP (addr, 1)) == REG)            \
  390.     {                                \
  391.       reg1 = XEXP (addr, 1);                    \
  392.       addr = XEXP (addr, 0);                    \
  393.     }                                \
  394.       if (GET_CODE (addr) == REG || GET_CODE (addr) == MULT        \
  395.       || GET_CODE (addr) == SIGN_EXTEND)                \
  396.     { if (reg1 == 0) reg1 = addr; else reg2 = addr; addr = 0; }    \
  397.       if (offset != 0) { if (addr != 0) abort (); addr = offset; }    \
  398.       if ((reg1 && (GET_CODE (reg1) == SIGN_EXTEND            \
  399.             || GET_CODE (reg1) == MULT))            \
  400.       || (reg2 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg2))))        \
  401.     { breg = reg2; ireg = reg1; }                    \
  402.       else if (reg1 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg1)))        \
  403.     { breg = reg1; ireg = reg2; }                    \
  404.       if (ireg != 0 && breg == 0 && GET_CODE (addr) == LABEL_REF)    \
  405.         { int scale = 1;                        \
  406.       if (GET_CODE (ireg) == MULT)                    \
  407.         { scale = INTVAL (XEXP (ireg, 1));                \
  408.           ireg = XEXP (ireg, 0); }                    \
  409.       if (GET_CODE (ireg) == SIGN_EXTEND)                \
  410.         fprintf (FILE, "(L%d.b,pc,%s.w",                \
  411.              CODE_LABEL_NUMBER (XEXP (addr, 0)),        \
  412.              reg_names[REGNO (XEXP (ireg, 0))]);         \
  413.       else                                \
  414.         fprintf (FILE, "(L%d.b,pc,%s.l",                \
  415.              CODE_LABEL_NUMBER (XEXP (addr, 0)),        \
  416.              reg_names[REGNO (ireg)]);                \
  417.       if (scale != 1) fprintf (FILE, "*%d", scale);            \
  418.       putc (')', FILE);                        \
  419.       break; }                            \
  420.       if (breg != 0 && ireg == 0 && GET_CODE (addr) == LABEL_REF)    \
  421.         { fprintf (FILE, "(L%d.b,pc,%s.l",                \
  422.            CODE_LABEL_NUMBER (XEXP (addr, 0)),            \
  423.            reg_names[REGNO (breg)]);                \
  424.       putc (')', FILE);                        \
  425.       break; }                            \
  426.       if (ireg != 0 || breg != 0)                    \
  427.     { int scale = 1;                        \
  428.       if (breg == 0)                        \
  429.         abort ();                            \
  430.       if (addr && GET_CODE (addr) == LABEL_REF) abort ();        \
  431.       fprintf (FILE, "(");                        \
  432.       if (addr != 0) {                        \
  433.         output_addr_const (FILE, addr);                \
  434.         putc (',', FILE); }                        \
  435.       fprintf (FILE, "%s", reg_names[REGNO (breg)]);        \
  436.       if (ireg != 0)                        \
  437.         putc (',', FILE);                        \
  438.       if (ireg != 0 && GET_CODE (ireg) == MULT)            \
  439.         { scale = INTVAL (XEXP (ireg, 1));                \
  440.           ireg = XEXP (ireg, 0); }                    \
  441.       if (ireg != 0 && GET_CODE (ireg) == SIGN_EXTEND)        \
  442.         fprintf (FILE, "%s.w", reg_names[REGNO (XEXP (ireg, 0))]);    \
  443.       else if (ireg != 0)                        \
  444.         fprintf (FILE, "%s.l", reg_names[REGNO (ireg)]);        \
  445.       if (scale != 1) fprintf (FILE, "*%d", scale);            \
  446.       putc (')', FILE);                        \
  447.       break;                            \
  448.     }                                \
  449.       else if (reg1 != 0 && GET_CODE (addr) == LABEL_REF)        \
  450.     { fprintf (FILE, "(L%d.b,pc,%s.l)",                \
  451.            CODE_LABEL_NUMBER (XEXP (addr, 0)),            \
  452.            reg_names[REGNO (reg1)]);                \
  453.       break; }                            \
  454.     default:                                \
  455.       if (GET_CODE (addr) == CONST_INT                    \
  456.       && INTVAL (addr) < 0x8000                    \
  457.       && INTVAL (addr) >= -0x8000)                    \
  458.     fprintf (FILE, "%d.w", INTVAL (addr));                \
  459.       else                                \
  460.         output_addr_const (FILE, addr);                    \
  461.     }}
  462.  
  463. #else /* Using GAS, which uses the MIT assembler syntax, like a Sun.  */
  464.  
  465. #define FUNCTION_PROFILER(FILE, LABEL_NO) \
  466.    fprintf (FILE, "\tmovl #LP%d,d0\n\tjsr mcount\n", (LABEL_NO));
  467.  
  468. #endif /* MOTOROLA */
  469.