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