|
|
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.