|
|
1.1 root 1: /* Subroutines for insn-output.c for AT&T we32000 Family.
2: Contributed by John Wehle ([email protected])
3: Copyright (C) 1991-1992 Free Software Foundation, Inc.
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 1, 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:
22: #include <stdio.h>
23: #include "config.h"
24: #include "rtl.h"
25: #include "real.h"
26:
27:
28: void
29: output_move_double (operands)
30: rtx *operands;
31: {
32: rtx lsw_operands[2];
33: rtx lsw_sreg = NULL;
34: rtx msw_dreg = NULL;
35:
36: if (GET_CODE (operands[0]) == REG)
37: {
38: lsw_operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
39: msw_dreg = operands[0];
40: }
41: else if (GET_CODE (operands[0]) == MEM && offsettable_memref_p (operands[0]))
42: lsw_operands[0] = adj_offsettable_operand (operands[0], 4);
43: else
44: abort ();
45:
46: if (GET_CODE (operands[1]) == REG)
47: {
48: lsw_operands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
49: lsw_sreg = lsw_operands[1];
50: }
51: else if (GET_CODE (operands[1]) == MEM && offsettable_memref_p (operands[1]))
52: {
53: lsw_operands[1] = adj_offsettable_operand (operands[1], 4);
54: lsw_sreg = operands[1];
55: for ( ; ; )
56: {
57: if (REG_P (lsw_sreg))
58: break;
59: if (CONSTANT_ADDRESS_P (lsw_sreg))
60: {
61: lsw_sreg = NULL;
62: break;
63: }
64: if (GET_CODE (lsw_sreg) == MEM)
65: {
66: lsw_sreg = XEXP (lsw_sreg, 0);
67: continue;
68: }
69: if (GET_CODE (lsw_sreg) == PLUS)
70: {
71: if (CONSTANT_ADDRESS_P (XEXP (lsw_sreg, 1)))
72: {
73: lsw_sreg = XEXP (lsw_sreg, 0);
74: continue;
75: }
76: else if (CONSTANT_ADDRESS_P (XEXP (lsw_sreg, 0)))
77: {
78: lsw_sreg = XEXP (lsw_sreg, 1);
79: continue;
80: }
81: }
82: abort ();
83: }
84: }
85: else if (GET_CODE (operands[1]) == CONST_DOUBLE)
86: {
87: lsw_operands[1] = gen_rtx (CONST_INT, SImode,
88: CONST_DOUBLE_HIGH (operands[1]));
89: operands[1] = gen_rtx (CONST_INT, SImode,
90: CONST_DOUBLE_LOW (operands[1]));
91: }
92: else if (GET_CODE (operands[1]) == CONST_INT)
93: {
94: lsw_operands[1] = operands[1];
95: operands[1] = const0_rtx;
96: }
97: else
98: abort ();
99:
100: if (!msw_dreg || !lsw_sreg || REGNO (msw_dreg) != REGNO (lsw_sreg))
101: {
102: output_asm_insn ("movw %1, %0", operands);
103: output_asm_insn ("movw %1, %0", lsw_operands);
104: }
105: else
106: {
107: output_asm_insn ("movw %1, %0", lsw_operands);
108: output_asm_insn ("movw %1, %0", operands);
109: }
110: }
111:
112: void
113: output_push_double (operands)
114: rtx *operands;
115: {
116: rtx lsw_operands[1];
117:
118: if (GET_CODE (operands[0]) == REG)
119: lsw_operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
120: else if (GET_CODE (operands[0]) == MEM && offsettable_memref_p (operands[0]))
121: lsw_operands[0] = adj_offsettable_operand (operands[0], 4);
122: else if (GET_CODE (operands[0]) == CONST_DOUBLE)
123: {
124: lsw_operands[0] = gen_rtx (CONST_INT, SImode,
125: CONST_DOUBLE_HIGH (operands[0]));
126: operands[0] = gen_rtx (CONST_INT, SImode,
127: CONST_DOUBLE_LOW (operands[0]));
128: }
129: else if (GET_CODE (operands[0]) == CONST_INT)
130: {
131: lsw_operands[0] = operands[0];
132: operands[0] = const0_rtx;
133: }
134: else
135: abort ();
136:
137: output_asm_insn ("pushw %0", operands);
138: output_asm_insn ("pushw %0", lsw_operands);
139: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.