|
|
1.1 ! root 1: /* Subroutines for insn-output.c for Vax. ! 2: Copyright (C) 1987 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 1, 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: #include <stdio.h> ! 21: ! 22: print_operand_address (file, addr) ! 23: FILE *file; ! 24: register rtx addr; ! 25: { ! 26: register rtx reg1, reg2, breg, ireg; ! 27: rtx offset; ! 28: ! 29: retry: ! 30: switch (GET_CODE (addr)) ! 31: { ! 32: case MEM: ! 33: fprintf (file, "*"); ! 34: addr = XEXP (addr, 0); ! 35: goto retry; ! 36: ! 37: case REG: ! 38: fprintf (file, "(%s)", reg_names[REGNO (addr)]); ! 39: break; ! 40: ! 41: case PRE_DEC: ! 42: fprintf (file, "-(%s)", reg_names[REGNO (XEXP (addr, 0))]); ! 43: break; ! 44: ! 45: case POST_INC: ! 46: fprintf (file, "(%s)+", reg_names[REGNO (XEXP (addr, 0))]); ! 47: break; ! 48: ! 49: case PLUS: ! 50: reg1 = 0; reg2 = 0; ! 51: ireg = 0; breg = 0; ! 52: offset = 0; ! 53: if (CONSTANT_ADDRESS_P (XEXP (addr, 0)) ! 54: || GET_CODE (XEXP (addr, 0)) == MEM) ! 55: { ! 56: offset = XEXP (addr, 0); ! 57: addr = XEXP (addr, 1); ! 58: } ! 59: else if (CONSTANT_ADDRESS_P (XEXP (addr, 1)) ! 60: || GET_CODE (XEXP (addr, 1)) == MEM) ! 61: { ! 62: offset = XEXP (addr, 1); ! 63: addr = XEXP (addr, 0); ! 64: } ! 65: if (GET_CODE (addr) != PLUS) ! 66: ; ! 67: else if (GET_CODE (XEXP (addr, 0)) == MULT) ! 68: { ! 69: reg1 = XEXP (addr, 0); ! 70: addr = XEXP (addr, 1); ! 71: } ! 72: else if (GET_CODE (XEXP (addr, 1)) == MULT) ! 73: { ! 74: reg1 = XEXP (addr, 1); ! 75: addr = XEXP (addr, 0); ! 76: } ! 77: else if (GET_CODE (XEXP (addr, 0)) == REG) ! 78: { ! 79: reg1 = XEXP (addr, 0); ! 80: addr = XEXP (addr, 1); ! 81: } ! 82: else if (GET_CODE (XEXP (addr, 1)) == REG) ! 83: { ! 84: reg1 = XEXP (addr, 1); ! 85: addr = XEXP (addr, 0); ! 86: } ! 87: if (GET_CODE (addr) == REG || GET_CODE (addr) == MULT) ! 88: { ! 89: if (reg1 == 0) ! 90: reg1 = addr; ! 91: else ! 92: reg2 = addr; ! 93: addr = 0; ! 94: } ! 95: if (offset != 0) ! 96: { ! 97: if (addr != 0) abort (); ! 98: addr = offset; ! 99: } ! 100: if (reg1 != 0 && GET_CODE (reg1) == MULT) ! 101: { ! 102: breg = reg2; ! 103: ireg = reg1; ! 104: } ! 105: else if (reg2 != 0 && GET_CODE (reg2) == MULT) ! 106: { ! 107: breg = reg1; ! 108: ireg = reg2; ! 109: } ! 110: else if (reg2 != 0 || GET_CODE (addr) == MEM) ! 111: { ! 112: breg = reg2; ! 113: ireg = reg1; ! 114: } ! 115: else ! 116: { ! 117: breg = reg1; ! 118: ireg = reg2; ! 119: } ! 120: if (addr != 0) ! 121: output_address (offset); ! 122: if (breg != 0) ! 123: { ! 124: if (GET_CODE (breg) != REG) ! 125: abort (); ! 126: fprintf (file, "(%s)", reg_names[REGNO (breg)]); ! 127: } ! 128: if (ireg != 0) ! 129: { ! 130: if (GET_CODE (ireg) == MULT) ! 131: ireg = XEXP (ireg, 0); ! 132: if (GET_CODE (ireg) != REG) ! 133: abort (); ! 134: fprintf (file, "[%s]", reg_names[REGNO (ireg)]); ! 135: } ! 136: break; ! 137: ! 138: default: ! 139: output_addr_const (file, addr); ! 140: } ! 141: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.