|
|
1.1 root 1: /* Definitions of target machine for GNU compiler. MERLIN NS32000 version. 1.1.1.3 ! root 2: Copyright (C) 1990, 1994 Free Software Foundation, Inc. 1.1 root 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 \ 1.1.1.2 root 49: "-Dns32000 -Dns32k -Dns16000 -Dmerlin -Dunix -DUtek -Dbsd \ 50: -Asystem(unix) -Asystem(bsd) -Acpu(ns32k) -Amachine(ns32k)" 1.1 root 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: } \ 1.1.1.3 ! root 115: else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) != VOIDmode) \ 1.1 root 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)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.