Annotation of GNUtools/cc/config/ns32k/merlin.h, revision 1.1.1.1

1.1       root        1: /* Definitions of target machine for GNU compiler.  MERLIN NS32000 version.
                      2:    Copyright (C) 1990 Free Software Foundation, Inc.
                      3:    By Mark Mason ([email protected], [email protected]).
                      4: 
                      5: This file is part of GNU CC.
                      6: 
                      7: GNU CC is free software; you can redistribute it and/or modify
                      8: it under the terms of the GNU General Public License as published by
                      9: the Free Software Foundation; either version 2, or (at your option)
                     10: any later version.
                     11: 
                     12: GNU CC is distributed in the hope that it will be useful,
                     13: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15: GNU General Public License for more details.
                     16: 
                     17: You should have received a copy of the GNU General Public License
                     18: along with GNU CC; see the file COPYING.  If not, write to
                     19: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     20: 
                     21: /* Two flags to control how addresses are printed in assembler insns.  */
                     22: 
                     23: #define SEQUENT_ADDRESS_BUG 1
                     24: #define SEQUENT_BASE_REGS
                     25: 
                     26: #include "ns32k/ns32k.h"
                     27: 
                     28: /* This is BSD, so it wants DBX format.  */
                     29: #define DBX_DEBUGGING_INFO
                     30: 
                     31: /* Sequent has some changes in the format of DBX symbols.  */
                     32: #define DBX_NO_XREFS 1
                     33: 
                     34: /* Don't split DBX symbols into continuations.  */
                     35: #define DBX_CONTIN_LENGTH 0
                     36: 
                     37: #define TARGET_DEFAULT 1
                     38: 
                     39: /* Print subsidiary information on the compiler version in use.  */
                     40: #undef TARGET_VERSION
                     41: #define TARGET_VERSION fprintf (stderr, " (32000, UTek syntax)");
                     42: 
                     43: /* These control the C++ compiler somehow.  */
                     44: #define FASCIST_ASSEMBLER
                     45: #define USE_COLLECT
                     46: 
                     47: #undef CPP_PREDEFINES
                     48: #define CPP_PREDEFINES \
                     49:        "-Dns32000 -Dns32k -Dns16000 -Dmerlin -Dunix -DUtek -Dbsd \
                     50:        -Asystem(unix) -Asystem(bsd) -Acpu(ns32k) -Amachine(ns32k)"
                     51: 
                     52: /* This is how to align the code that follows an unconditional branch.
                     53:    Don't define it, since it confuses the assembler (we hear).  */
                     54: 
                     55: #undef ASM_OUTPUT_ALIGN_CODE
                     56: 
                     57: /* Assembler pseudo-op for shared data segment. */
                     58: #define SHARED_SECTION_ASM_OP ".shdata"
                     59: 
                     60: /* %$ means print the prefix for an immediate operand. */
                     61: 
                     62: #ifdef UTEK_ASM
                     63: #undef PRINT_OPERAND
                     64: #define PRINT_OPERAND(FILE, X, CODE)  \
                     65: { if (CODE == '$') putc('$', FILE);                                    \
                     66:   else if (CODE == '?');                                               \
                     67:   else if (GET_CODE (X) == CONST_INT)                                  \
                     68:     fprintf(FILE, "$%d", INTVAL(X));                                   \
                     69:   else if (GET_CODE (X) == REG)                                                \
                     70:     fprintf (FILE, "%s", reg_names[REGNO (X)]);                                \
                     71:   else if (GET_CODE (X) == MEM)                                                \
                     72:     {                                                                  \
                     73:       rtx xfoo;                                                                \
                     74:       xfoo = XEXP (X, 0);                                              \
                     75:       switch (GET_CODE (xfoo))                                         \
                     76:        {                                                               \
                     77:        case MEM:                                                       \
                     78:          if (GET_CODE (XEXP (xfoo, 0)) == REG)                         \
                     79:            if (REGNO (XEXP (xfoo, 0)) == STACK_POINTER_REGNUM)         \
                     80:              fprintf (FILE, "0(0(sp))");                               \
                     81:            else fprintf (FILE, "0(0(%s))",                             \
                     82:                          reg_names[REGNO (XEXP (xfoo, 0))]);           \
                     83:          else                                                          \
                     84:            {                                                           \
                     85:              if (GET_CODE (XEXP (xfoo, 0)) == SYMBOL_REF               \
                     86:                  || GET_CODE (XEXP (xfoo, 0)) == CONST)                \
                     87:                {                                                       \
                     88:                  fprintf(FILE, "0(");                                  \
                     89:                  output_address(xfoo);                                 \
                     90:                  fprintf(FILE, "(sb))");                               \
                     91:                }                                                       \
                     92:              else                                                      \
                     93:                {                                                       \
                     94:                  fprintf (FILE, "0(");                                 \
                     95:                  output_address (xfoo);                                \
                     96:                  putc (')', FILE);                                     \
                     97:                }                                                       \
                     98:            }                                                           \
                     99:          break;                                                        \
                    100:        case REG:                                                       \
                    101:          fprintf (FILE, "0(%s)", reg_names[REGNO (xfoo)]);             \
                    102:          break;                                                        \
                    103:        case PRE_DEC:                                                   \
                    104:        case POST_INC:                                                  \
                    105:          fprintf (FILE, "tos");                                        \
                    106:          break;                                                        \
                    107:        case CONST_INT:                                                 \
                    108:          fprintf (FILE, "$%d", INTVAL (xfoo));                         \
                    109:          break;                                                        \
                    110:        default:                                                        \
                    111:          output_address (xfoo);                                        \
                    112:          break;                                                        \
                    113:        }                                                               \
                    114:     }                                                                  \
                    115:   else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) != DImode)     \
                    116:     if (GET_MODE (X) == DFmode)                                                \
                    117:       { union { double d; int i[2]; } u;                               \
                    118:        u.i[0] = CONST_DOUBLE_LOW (X); u.i[1] = CONST_DOUBLE_HIGH (X);  \
                    119:        fprintf (FILE, "$0d%.20e", u.d); }                              \
                    120:     else { union { double d; int i[2]; } u;                            \
                    121:           u.i[0] = CONST_DOUBLE_LOW (X); u.i[1] = CONST_DOUBLE_HIGH (X); \
                    122:           fprintf (FILE, "$0f%.20e", u.d); }                           \
                    123:   else output_addr_const (FILE, X); }
                    124: 
                    125: #undef  FUNCTION_PROLOGUE
                    126: 
                    127: /* This differs from the one in ns32k.h in printing a bitmask
                    128:    rather than a register list in the enter or save instruction.  */
                    129: 
                    130: #define FUNCTION_PROLOGUE(FILE, SIZE)     \
                    131: { register int regno, g_regs_used = 0;                         \
                    132:   int used_regs_buf[8], *bufp = used_regs_buf;                 \
                    133:   int used_fregs_buf[8], *fbufp = used_fregs_buf;              \
                    134:   extern char call_used_regs[];                                        \
                    135:   MAIN_FUNCTION_PROLOGUE;                                      \
                    136:   for (regno = 0; regno < 8; regno++)                          \
                    137:     if (regs_ever_live[regno]                                  \
                    138:        && ! call_used_regs[regno])                             \
                    139:     {                                                          \
                    140:       *bufp++ = regno; g_regs_used++;                          \
                    141:     }                                                          \
                    142:   *bufp = -1;                                                  \
                    143:   for (; regno < 16; regno++)                                  \
                    144:     if (regs_ever_live[regno] && !call_used_regs[regno]) {     \
                    145:       *fbufp++ = regno;                                                \
                    146:     }                                                          \
                    147:   *fbufp = -1;                                                 \
                    148:   bufp = used_regs_buf;                                                \
                    149:   if (frame_pointer_needed)                                    \
                    150:     fprintf (FILE, "\tenter ");                                        \
                    151:   else if (g_regs_used)                                                \
                    152:     fprintf (FILE, "\tsave ");                                 \
                    153:   if (frame_pointer_needed || g_regs_used)                     \
                    154:     {                                                          \
                    155:       char mask = 0;                                           \
                    156:       while (*bufp >= 0)                                       \
                    157:        mask |= 1 << *bufp++;                                   \
                    158:       fprintf (FILE, "$0x%x", (int) mask & 0xff);              \
                    159:     }                                                          \
                    160:   if (frame_pointer_needed)                                    \
                    161:     fprintf (FILE, ",%d\n", SIZE);                             \
                    162:   else if (g_regs_used)                                                \
                    163:     fprintf (FILE, "\n");                                      \
                    164:   fbufp = used_fregs_buf;                                      \
                    165:   while (*fbufp >= 0)                                          \
                    166:     {                                                          \
                    167:       if ((*fbufp & 1) || (fbufp[0] != fbufp[1] - 1))          \
                    168:        fprintf (FILE, "\tmovf f%d,tos\n", *fbufp++ - 8);       \
                    169:       else                                                     \
                    170:        {                                                       \
                    171:          fprintf (FILE, "\tmovl f%d,tos\n", fbufp[0] - 8);     \
                    172:          fbufp += 2;                                           \
                    173:        }                                                       \
                    174:     }                                                          \
                    175: }
                    176: 
                    177: #undef  FUNCTION_EPILOGUE
                    178: 
                    179: /* This differs from the one in ns32k.h in printing a bitmask
                    180:    rather than a register list in the exit or restore instruction.  */
                    181: 
                    182: #define FUNCTION_EPILOGUE(FILE, SIZE) \
                    183: { register int regno, g_regs_used = 0, f_regs_used = 0;                \
                    184:   int used_regs_buf[8], *bufp = used_regs_buf;                 \
                    185:   int used_fregs_buf[8], *fbufp = used_fregs_buf;              \
                    186:   extern char call_used_regs[];                                        \
                    187:   *fbufp++ = -2;                                               \
                    188:   for (regno = 8; regno < 16; regno++)                         \
                    189:     if (regs_ever_live[regno] && !call_used_regs[regno]) {     \
                    190:        *fbufp++ = regno; f_regs_used++;                                \
                    191:     }                                                          \
                    192:   fbufp--;                                                     \
                    193:   for (regno = 0; regno < 8; regno++)                          \
                    194:     if (regs_ever_live[regno]                                  \
                    195:        && ! call_used_regs[regno])                             \
                    196:     {                                                          \
                    197:       *bufp++ = regno; g_regs_used++;                          \
                    198:     }                                                          \
                    199:   while (fbufp > used_fregs_buf)                               \
                    200:     {                                                          \
                    201:       if ((*fbufp & 1) && fbufp[0] == fbufp[-1] + 1)           \
                    202:        {                                                       \
                    203:          fprintf (FILE, "\tmovl tos,f%d\n", fbufp[-1] - 8);    \
                    204:          fbufp -= 2;                                           \
                    205:        }                                                       \
                    206:       else fprintf (FILE, "\tmovf tos,f%d\n", *fbufp-- - 8);   \
                    207:     }                                                          \
                    208:   if (frame_pointer_needed)                                    \
                    209:     fprintf (FILE, "\texit ");                                 \
                    210:   else if (g_regs_used)                                                \
                    211:     fprintf (FILE, "\trestore ");                              \
                    212:   if (g_regs_used || frame_pointer_needed)                     \
                    213:     {                                                          \
                    214:       char mask = 0;                                           \
                    215:                                                                \
                    216:       while (bufp > used_regs_buf)                             \
                    217:        {                                                       \
                    218:          /* Utek assembler takes care of reversing this */     \
                    219:          mask |= 1 << *--bufp;                                 \
                    220:        }                                                       \
                    221:       fprintf (FILE, "$0x%x\n", (int) mask & 0xff);            \
                    222:     }                                                          \
                    223:   if (current_function_pops_args)                              \
                    224:     fprintf (FILE, "\tret %d\n", current_function_pops_args);  \
                    225:   else fprintf (FILE, "\tret 0\n"); }
                    226: 
                    227: #endif /* UTEK_ASM */
                    228: 
                    229: #undef PRINT_OPERAND_ADDRESS
                    230: #define PRINT_OPERAND_ADDRESS(FILE, ADDR)  print_operand_address(FILE, ADDR)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.