annotate mc-code-mips.c @ 196:5f70abd9453d

*** empty log message ***
author kono
date Wed, 07 Apr 2004 21:14:19 +0900
parents c193120ee2a6
children 28baf6cd9ad1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1 /* Micro-C Code Generatation Part for MIPS (PS2Linux) */
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2 /* $Id$ */
fea1b499d47b fix register var save
kono
parents:
diff changeset
3
fea1b499d47b fix register var save
kono
parents:
diff changeset
4 #define EXTERN extern
fea1b499d47b fix register var save
kono
parents:
diff changeset
5 #include "mc.h"
fea1b499d47b fix register var save
kono
parents:
diff changeset
6 #include "mc-code.h"
fea1b499d47b fix register var save
kono
parents:
diff changeset
7 #include "mc-codegen.h"
fea1b499d47b fix register var save
kono
parents:
diff changeset
8
173
3b33c7daae95 *** empty log message ***
kono
parents: 168
diff changeset
9 char *l_include_path[] = {
3b33c7daae95 *** empty log message ***
kono
parents: 168
diff changeset
10 "/usr/include/",
3b33c7daae95 *** empty log message ***
kono
parents: 168
diff changeset
11 0
3b33c7daae95 *** empty log message ***
kono
parents: 168
diff changeset
12 };
3b33c7daae95 *** empty log message ***
kono
parents: 168
diff changeset
13
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
14 #define TEXT_EMIT_MODE 0
fea1b499d47b fix register var save
kono
parents:
diff changeset
15 #define DATA_EMIT_MODE 1
fea1b499d47b fix register var save
kono
parents:
diff changeset
16 #define RODATA_EMIT_MODE 2
fea1b499d47b fix register var save
kono
parents:
diff changeset
17
fea1b499d47b fix register var save
kono
parents:
diff changeset
18 static void data_mode(char *name);
163
fc8514c9d685 *** empty log message ***
kono
parents: 156
diff changeset
19 static void ld_indexx(int byte, int n, int xreg,int sign);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
20 static void local_table(void);
fea1b499d47b fix register var save
kono
parents:
diff changeset
21 static void shift(char *op, int reg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
22 static int struct_push(int e4,int t,int arg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
23
fea1b499d47b fix register var save
kono
parents:
diff changeset
24 static int output_mode = TEXT_EMIT_MODE;
fea1b499d47b fix register var save
kono
parents:
diff changeset
25 static int data_alignment = 0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
26
fea1b499d47b fix register var save
kono
parents:
diff changeset
27 static int code_disp_label;
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
28 static int disp_label;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
29 static int r1_offset_label;
fea1b499d47b fix register var save
kono
parents:
diff changeset
30 static int lvar_offset_label;
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
31 static int cprestore_label;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
32
fea1b499d47b fix register var save
kono
parents:
diff changeset
33 static int reg_save;
fea1b499d47b fix register var save
kono
parents:
diff changeset
34 static int freg_save;
fea1b499d47b fix register var save
kono
parents:
diff changeset
35
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
36 static int freg,ireg,dreg;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
37
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
38 /* mips requires two registers for compare */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
39 static int cmpreg = -1;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
40
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
41 int size_of_int = 4;
fea1b499d47b fix register var save
kono
parents:
diff changeset
42 int size_of_float = 4;
fea1b499d47b fix register var save
kono
parents:
diff changeset
43 int size_of_double = 8;
fea1b499d47b fix register var save
kono
parents:
diff changeset
44 int size_of_longlong = 8;
fea1b499d47b fix register var save
kono
parents:
diff changeset
45 int endian = 1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
46
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
47 int reg_sp; /* REGister Stack-Pointer */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
48 int reg_stack[MAX_MAX]; /* 実際のレジスタの領域 */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
49
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
50 /* floating point registers */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
51
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
52 int freg_sp; /* floating point REGister Stack-Pointer */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
53 int freg_stack[MAX_MAX]; /* 実際のレジスタの領域 */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
54
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
55 /* double floating point registers */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
56
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
57 int dreg_sp; /* floating point REGister Stack-Pointer */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
58 int dreg_stack[MAX_MAX]; /* 実際のレジスタの領域 */
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
59
fea1b499d47b fix register var save
kono
parents:
diff changeset
60 #define REG_fp 1
fea1b499d47b fix register var save
kono
parents:
diff changeset
61 #define REG_sp 30
fea1b499d47b fix register var save
kono
parents:
diff changeset
62 #define REG_VAR_BASE 29
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
63 #define REG_VAR_MIN 18
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
64 #define MIN_TMP_REG 4
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
65 #define MAX_TMP_REG 11
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
66
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
67 #define DREG_VAR_BASE 29
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
68 #define DREG_VAR_MIN 18
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
69 #define MIN_TMP_DREG 4
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
70 #define MAX_TMP_DREG 17
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
71
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
72 #define PTRC_REG 3
fea1b499d47b fix register var save
kono
parents:
diff changeset
73
fea1b499d47b fix register var save
kono
parents:
diff changeset
74 #define FREG_VAR_BASE 31
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
75 #define FREG_VAR_MIN 20
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
76 #define MIN_TMP_FREG 1
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
77 #define MAX_TMP_FREG 14
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
78
fea1b499d47b fix register var save
kono
parents:
diff changeset
79 #define RET_REGISTER 3
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
80 #define RET_FREGISTER (1+FREG_OFFSET)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
81 #define RET_DREGISTER (1+DREG_OFFSET)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
82
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
83 int MAX_REGISTER=30; /* PowerPCのレジスタを10個まで使う*/
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
84 int MAX_FREGISTER=31;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
85 int MAX_DREGISTER=16;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
86 #define REAL_MAX_REGISTER 32 /* PowerPCのレジスタが32ということ*/
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
87 #define REAL_MAX_FREGISTER 32 /* PowerPCのFレジスタが32ということ*/
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
88 #define REAL_MAX_DREGISTER 31 /* PowerPCのDレジスタ番号が31ということ*/
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
89
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
90 #define FREG_OFFSET REAL_MAX_REGISTER
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
91 #define DREG_OFFSET (REAL_MAX_REGISTER+REAL_MAX_FREGISTER )
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
92
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
93 int MAX_INPUT_REGISTER_VAR = 7-MIN_TMP_REG;
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
94 int MAX_CODE_INPUT_REGISTER_VAR = 7-MIN_TMP_REG;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
95 int MAX_INPUT_DREGISTER_VAR = 14-MIN_TMP_FREG;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
96 int MAX_INPUT_FREGISTER_VAR = 14-MIN_TMP_FREG;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
97 int MAX_CODE_INPUT_DREGISTER_VAR = 14-MIN_TMP_FREG;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
98 int MAX_CODE_INPUT_FREGISTER_VAR = 14-MIN_TMP_FREG;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
99
fea1b499d47b fix register var save
kono
parents:
diff changeset
100 #define CREG_REGISTER MAX_TMP_REG
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
101 #define FREG_FREGISTER (MAX_TMP_FREG+FREG_OFFSET)
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
102 #define DREG_DREGISTER (2+DREG_OFFSET)
145
fb61020a9b48 fix macro
kono
parents: 143
diff changeset
103
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
104 int powerpc_regs[REAL_MAX_REGISTER+REAL_MAX_FREGISTER+REAL_MAX_DREGISTER];
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
105 int powerpc_regv[REAL_MAX_REGISTER+REAL_MAX_FREGISTER+REAL_MAX_DREGISTER];
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
106
151
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
107 int dreg_pair0[REAL_MAX_DREGISTER] = {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
108 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
109 };
151
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
110 int dreg_pair1[REAL_MAX_DREGISTER] = {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
111 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
112 };
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
113
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
114 int *regv = powerpc_regv;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
115 int *regs = powerpc_regs;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
116
fea1b499d47b fix register var save
kono
parents:
diff changeset
117 static int max_reg_var, max_freg_var;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
118 static int cond_reg=-1,cond_freg=-1,cond_dreg=-1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
119
fea1b499d47b fix register var save
kono
parents:
diff changeset
120 static char *reg_name[] = {
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
121 "$0","$1","$2","$3","$4","$5","$6","$7","$8","$9",
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
122 "$10","$11","$12","$13","$14","$15","$16","$17","$18","$19",
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
123 "$20","$21","$22","$23","$24","$25","$26","$27","$28","$29",
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
124 "$30","$31",
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
125 "$f0","$f1","$f2","$f3","$f4","$f5","$f6","$f7","$f8","$f9",
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
126 "$f10","$f11","$f12","$f13","$f14","$f15","$f16","$f17","$f18","$f19",
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
127 "$f20","$f21","$f22","$f23","$f24","$f25","$f26","$f27","$f28","$f29",
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
128 "$f30","$f31"
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
129 };
fea1b499d47b fix register var save
kono
parents:
diff changeset
130
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
131
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
132 #define register_name(i) reg_name0(i)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
133 #define fregister_name(i) reg_name0(i)
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
134 #define dregister_name0(i) reg_name1(i,dreg_pair0)
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
135 #define dregister_name1(i) reg_name1(i,dreg_pair1)
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
136
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
137 static char *
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
138 reg_name0(int i)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
139 {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
140 if (i<=REAL_MAX_REGISTER+REAL_MAX_FREGISTER)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
141 return reg_name[i];
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
142 else {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
143 error(-1);
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
144 return reg_name[0];
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
145 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
146 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
147
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
148 static char *
151
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
149 reg_name1(int i,int *d)
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
150 {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
151 if (i<=REAL_MAX_REGISTER+REAL_MAX_FREGISTER) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
152 error(-1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
153 return reg_name[0];
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
154 } else
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
155 return reg_name[d[i-DREG_OFFSET]];
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
156 }
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
157
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
158
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
159 #define is_int_reg(i) (0<=i&&i<REAL_MAX_REGISTER)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
160 #define is_float_reg(i) (REAL_MAX_REGISTER<=i&&i<REAL_MAX_FREGISTER+REAL_MAX_REGISTER)
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
161 #define is_double_reg(i) (REAL_MAX_REGISTER+REAL_MAX_FREGISTER<=i&&i<REAL_MAX_FREGISTER+REAL_MAX_REGISTER+REAL_MAX_DREGISTER)
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
162
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
163
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
164 int use_int(int i) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
165 if (!is_int_reg(i)) i = ireg;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
166 if (!regs[i]) regs[i]=1;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
167 return i;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
168 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
169
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
170 int use_float(int i) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
171 if (!is_float_reg(i)) i = freg;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
172 if (!regs[i]) regs[i]=1;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
173 return i;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
174 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
175
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
176 int use_double(int i) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
177 if (!is_double_reg(i)) i = dreg;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
178 if (!regs[i]) regs[i]=1;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
179 return i;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
180 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
181
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
182 int use_longlong(int i) {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
183 return i;
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
184 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
185
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
186 #if FLOAT_CODE
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
187 static int code_d1(double d);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
188 static int code_d2(double d);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
189 #endif
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
190
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
191 static void code_save_stacks();
fea1b499d47b fix register var save
kono
parents:
diff changeset
192 static void code_save_input_registers();
fea1b499d47b fix register var save
kono
parents:
diff changeset
193 static void set_creg(int,int);
fea1b499d47b fix register var save
kono
parents:
diff changeset
194 static void set_freg(int,int);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
195 static void set_dreg(int,int);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
196
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
197 static int mask_label;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
198 static int mask1_label;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
199 static int fmask_label;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
200 static int fmask1_label;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
201
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
202 static FILE *asi;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
203
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
204 static int max_func_args;
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
205 static int max_func_iargs;
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
206 static int my_func_args;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
207 #define ARG_LVAR_OFFSET 0x10000000
fea1b499d47b fix register var save
kono
parents:
diff changeset
208
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
209 #define DOT_SIZE 1
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
210
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
211 /*
fea1b499d47b fix register var save
kono
parents:
diff changeset
212
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
213 Reorder is automatically done in assembler.
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
214 delayed slot done within .set noreorder.
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
215
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
216 r0 return value etc.
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
217 $2,$3 return value. (dpcmp return value on $2)
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
218 $0 special register
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
219 $4-$7 input register
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
220 r22-r29 saved register variable (input register for code segement)
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
221 $31 stack pointer
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
222 $fp frame pointer
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
223
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
224 $f0 return value etc.
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
225 $f14,$f12 input register
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
226 $f20-$f31 saved register variable
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
227
fea1b499d47b fix register var save
kono
parents:
diff changeset
228 function call stack frame
fea1b499d47b fix register var save
kono
parents:
diff changeset
229 <------r1_offset------------------------------>
fea1b499d47b fix register var save
kono
parents:
diff changeset
230 <------------lvar_offset------->
fea1b499d47b fix register var save
kono
parents:
diff changeset
231 r+ +------------+---+---------------+----------+--------------+----+ -
fea1b499d47b fix register var save
kono
parents:
diff changeset
232 callee arg xx register save local caller arg xx
fea1b499d47b fix register var save
kono
parents:
diff changeset
233 reg_save disp max_func_args*size_of_int
fea1b499d47b fix register var save
kono
parents:
diff changeset
234 lvar>0 lvar<0 lvar>0x1000 0000
fea1b499d47b fix register var save
kono
parents:
diff changeset
235
fea1b499d47b fix register var save
kono
parents:
diff changeset
236 code segment stack frame
fea1b499d47b fix register var save
kono
parents:
diff changeset
237
fea1b499d47b fix register var save
kono
parents:
diff changeset
238 * gotoを呼び出した関数のr1 ! r1(goto前のr1)
fea1b499d47b fix register var save
kono
parents:
diff changeset
239 # * r30 <---r1_offset---------> r1
fea1b499d47b fix register var save
kono
parents:
diff changeset
240 r+ +----------+--+----------+----------------+-----------+----------+----+
fea1b499d47b fix register var save
kono
parents:
diff changeset
241 cousin arg xx reg save !callee arg !code local caller arg xx
fea1b499d47b fix register var save
kono
parents:
diff changeset
242 r20-r29 lvar>0 lvar<0 lvar>0x1000 000
fea1b499d47b fix register var save
kono
parents:
diff changeset
243 f20-f31 <-my_func_args--><--disp-----><-max_func_arg->
fea1b499d47b fix register var save
kono
parents:
diff changeset
244 *size_of_int *size_of_int
fea1b499d47b fix register var save
kono
parents:
diff changeset
245
fea1b499d47b fix register var save
kono
parents:
diff changeset
246 */
fea1b499d47b fix register var save
kono
parents:
diff changeset
247 int arg_offset = 24; int arg_offset1 = 24; int disp_offset = -12;
fea1b499d47b fix register var save
kono
parents:
diff changeset
248 #define func_disp_offset 60
fea1b499d47b fix register var save
kono
parents:
diff changeset
249 #define r1_offset func_disp_offset+12
fea1b499d47b fix register var save
kono
parents:
diff changeset
250 int code_disp_offset = 0; int jump_offset = 0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
251 #define CODE_LVAR l+code_disp_offset
fea1b499d47b fix register var save
kono
parents:
diff changeset
252 #define CODE_CALLER_ARG (l-ARG_LVAR_OFFSET)+arg_offset1
fea1b499d47b fix register var save
kono
parents:
diff changeset
253 #define FUNC_LVAR l+disp_offset
fea1b499d47b fix register var save
kono
parents:
diff changeset
254 #define CALLER_ARG (l-ARG_LVAR_OFFSET)+arg_offset1
fea1b499d47b fix register var save
kono
parents:
diff changeset
255 #define CALLEE_ARG l+arg_offset
fea1b499d47b fix register var save
kono
parents:
diff changeset
256
fea1b499d47b fix register var save
kono
parents:
diff changeset
257 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
258 code_offset_set()
fea1b499d47b fix register var save
kono
parents:
diff changeset
259 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
260 #if 0
fea1b499d47b fix register var save
kono
parents:
diff changeset
261 int l;
fea1b499d47b fix register var save
kono
parents:
diff changeset
262 #endif
fea1b499d47b fix register var save
kono
parents:
diff changeset
263 int lvar_offsetv = -disp+max_func_args*size_of_int+func_disp_offset;
fea1b499d47b fix register var save
kono
parents:
diff changeset
264 int r1_offsetv = -disp+max_func_args*size_of_int-reg_save+r1_offset;
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
265 printf("L_%d = %d\n",lvar_offset_label,lvar_offsetv);
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
266 printf("L_%d = %d\n",r1_offset_label,r1_offsetv);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
267 #if 0
fea1b499d47b fix register var save
kono
parents:
diff changeset
268 printf("# function %s\n",fnptr->nm);
fea1b499d47b fix register var save
kono
parents:
diff changeset
269 l = ARG_LVAR_OFFSET;
fea1b499d47b fix register var save
kono
parents:
diff changeset
270 printf("# offset call0\t%d\n",CALLER_ARG);
fea1b499d47b fix register var save
kono
parents:
diff changeset
271 l = ARG_LVAR_OFFSET+max_func_args*size_of_int;
fea1b499d47b fix register var save
kono
parents:
diff changeset
272 printf("# offset calln\t%d %d\n",CALLER_ARG,max_func_args*size_of_int);
fea1b499d47b fix register var save
kono
parents:
diff changeset
273 l = disp;
fea1b499d47b fix register var save
kono
parents:
diff changeset
274 printf("# offset lvarn\t%d %d\n",FUNC_LVAR+lvar_offsetv,disp);
fea1b499d47b fix register var save
kono
parents:
diff changeset
275 l = 0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
276 printf("# offset lvar0\t%d\n",FUNC_LVAR+lvar_offsetv);
fea1b499d47b fix register var save
kono
parents:
diff changeset
277 l = -reg_save;
fea1b499d47b fix register var save
kono
parents:
diff changeset
278 printf("# offset regs\t%d\n",FUNC_LVAR+lvar_offsetv);
fea1b499d47b fix register var save
kono
parents:
diff changeset
279 printf("# offset r1off\t%d\n",r1_offsetv);
fea1b499d47b fix register var save
kono
parents:
diff changeset
280 l = 0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
281 printf("# offset carg0\t%d\n",CALLEE_ARG+r1_offsetv);
fea1b499d47b fix register var save
kono
parents:
diff changeset
282 l = my_func_args;
fea1b499d47b fix register var save
kono
parents:
diff changeset
283 printf("# offset cargn\t%d %d\n",CALLEE_ARG+r1_offsetv,my_func_args);
fea1b499d47b fix register var save
kono
parents:
diff changeset
284 #endif
fea1b499d47b fix register var save
kono
parents:
diff changeset
285 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
286
fea1b499d47b fix register var save
kono
parents:
diff changeset
287 static void
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
288 lvar(int l)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
289 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
290 if (fnptr->sc==CODE) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
291 if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
292 printf("%d($fp)\n",CODE_CALLER_ARG);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
293 } else
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
294 printf("%d($fp)\n",CODE_LVAR);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
295 } else if (l<0) { /* local variable */
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
296 printf("%d+L_%d($fp)\n",FUNC_LVAR,lvar_offset_label);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
297 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
298 printf("%d($fp)\n",CALLER_ARG);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
299 } else { /* callee's arguments */
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
300 printf("%d+L_%d($fp)\n",CALLEE_ARG,r1_offset_label);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
301 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
302 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
303
fea1b499d47b fix register var save
kono
parents:
diff changeset
304 static void
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
305 lvar_address(int l,int creg)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
306 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
307 if (fnptr->sc==CODE) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
308 if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
309 printf("\taddu\t%s,$fp,%d\n",register_name(creg),CODE_CALLER_ARG);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
310 } else
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
311 printf("\taddu\t%s,$fp,%d\n",register_name(creg),CODE_LVAR);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
312 } else if (l<0) { /* local variable */
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
313 printf("\taddu\t%s,$fp,%d+L_%d\n",register_name(creg),FUNC_LVAR,lvar_offset_label);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
314 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
315 printf("\taddu\t%s,$fp,%d\n",register_name(creg),CALLER_ARG);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
316 } else { /* callee's arguments */
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
317 printf("\taddu\t%s,$fp,%d+L_%d\n",register_name(creg),CALLEE_ARG,r1_offset_label);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
318 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
319 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
320
fea1b499d47b fix register var save
kono
parents:
diff changeset
321 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
322 code_lvar(int e2,int creg) {
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
323 lvar_address(e2,creg);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
324 regv[creg]=1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
325 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
326
fea1b499d47b fix register var save
kono
parents:
diff changeset
327 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
328 code_init(void)
fea1b499d47b fix register var save
kono
parents:
diff changeset
329 {
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
330 /* this is called once program call */
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
331 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
332
fea1b499d47b fix register var save
kono
parents:
diff changeset
333 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
334 gexpr_code_init(void){
fea1b499d47b fix register var save
kono
parents:
diff changeset
335 regv[creg]=0;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
336 regv[freg]=0;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
337 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
338
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
339 void
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
340 code_gexpr(int e){
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
341 if (is_int_reg(creg) && creg!=ireg) error(-1);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
342 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
343
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
344
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
345 void
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
346 code_arg_register(NMTBL *fnptr)
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
347 {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
348 int args = fnptr->dsp;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
349 NMTBL *n;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
350 int reg_var = 0;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
351 int freg_var = 0;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
352 int type;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
353 int reg;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
354 int is_code0 = is_code(fnptr);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
355
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
356 while (args) {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
357 /* process in reverse order */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
358 n = (NMTBL*)caddr(args);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
359 type = n->ty;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
360 if (scalar(type)) {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
361 if ((reg = get_input_register_var(reg_var,n,is_code0))) {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
362 n->sc = REGISTER;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
363 n->dsp = cadr(reg);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
364 regv[n->dsp]= 1;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
365 regs[n->dsp]= INPUT_REG;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
366 reg_var++;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
367 cadddr(args)=size_of_int; /* why we need this? */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
368 }
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
369 } else if (type==FLOAT) {
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
370 if ((reg = get_input_dregister_var(freg_var,n,is_code0,0))) {
141
kono
parents: 139
diff changeset
371 n->sc = FREGISTER;
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
372 n->dsp = cadr(reg);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
373 regv[n->dsp]= 1;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
374 regs[n->dsp]= INPUT_REG;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
375 freg_var++;
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
376 cadddr(args)=size(type); /* why we need this? */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
377 }
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
378 } else if (type==DOUBLE) {
141
kono
parents: 139
diff changeset
379 if ((reg = get_input_dregister_var(reg_var,n,is_code0,1))) {
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
380 n->sc = DREGISTER;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
381 n->dsp = cadr(reg);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
382 regv[n->dsp]= 1;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
383 regs[n->dsp]= INPUT_REG;
141
kono
parents: 139
diff changeset
384 reg_var+=2;
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
385 cadddr(args)=size(type); /* why we need this? */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
386 }
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
387 }
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
388 args = cadr(args);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
389 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
390 if (is_function(fnptr))
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
391 code_save_input_registers();
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
392 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
393
fea1b499d47b fix register var save
kono
parents:
diff changeset
394 int
fea1b499d47b fix register var save
kono
parents:
diff changeset
395 get_register(void)
fea1b499d47b fix register var save
kono
parents:
diff changeset
396 { /* 使われていないレジスタを調べる */
fea1b499d47b fix register var save
kono
parents:
diff changeset
397 int i,reg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
398 for(i=MAX_TMP_REG;i>MIN_TMP_REG;i--) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
399 if (regs[i]) continue; /* 使われている */
fea1b499d47b fix register var save
kono
parents:
diff changeset
400 regs[i]=USING_REG; /* そのレジスタを使うことを宣言し */
fea1b499d47b fix register var save
kono
parents:
diff changeset
401 return i; /* その場所を表す番号を返す */
fea1b499d47b fix register var save
kono
parents:
diff changeset
402 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
403 /* search register stack */
fea1b499d47b fix register var save
kono
parents:
diff changeset
404 for(i=0;i<reg_sp;i++) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
405 if ((reg=reg_stack[i])>=0) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
406 code_assign_lvar(
fea1b499d47b fix register var save
kono
parents:
diff changeset
407 (reg_stack[i]=new_lvar(size_of_int)),reg,0);
fea1b499d47b fix register var save
kono
parents:
diff changeset
408 reg_stack[i]= reg_stack[i]-REG_LVAR_OFFSET;
fea1b499d47b fix register var save
kono
parents:
diff changeset
409 return reg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
410 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
411 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
412 #if FLOAT_CODE
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
413 /* search dregister stack */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
414 for(i=0;i<dreg_sp;i++) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
415 if ((reg=dreg_stack[i])>=0) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
416 code_dassign_lvar(
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
417 (dreg_stack[i]=new_lvar(size_of_double)),reg,1);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
418 dreg_stack[i]= dreg_stack[i]-REG_LVAR_OFFSET;
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
419 free_register(reg);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
420 return get_register(); /* 今度は必ずある */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
421 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
422 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
423 #endif
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
424 for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) {
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
425 reg =REG_VAR_BASE-i;
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
426 if (! regs[reg]) { /* 使われていないなら */
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
427 regs[reg]=USING_REG; /* そのレジスタを使うことを宣言し */
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
428 regv[reg]=0;
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
429 if (i>max_reg_var) max_reg_var=i;
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
430 return reg;
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
431 }
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
432 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
433 /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
434 error(HPERR); return creg;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
435 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
436
fea1b499d47b fix register var save
kono
parents:
diff changeset
437 int
fea1b499d47b fix register var save
kono
parents:
diff changeset
438 pop_register(void)
fea1b499d47b fix register var save
kono
parents:
diff changeset
439 { /* レジスタから値を取り出す */
fea1b499d47b fix register var save
kono
parents:
diff changeset
440 return reg_stack[--reg_sp];
fea1b499d47b fix register var save
kono
parents:
diff changeset
441 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
442
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
443 #if FLOAT_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
444
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
445 static int
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
446 get_dregister1() {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
447 int i;
151
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
448 for(i=MAX_TMP_DREG+DREG_OFFSET;i>MIN_TMP_DREG+DREG_OFFSET;i--) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
449 if (regs[i]) continue; /* 使われている */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
450 if (regs[dreg_pair0[i-DREG_OFFSET]]) continue;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
451 if (regs[dreg_pair1[i-DREG_OFFSET]]) continue;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
452 regs[dreg_pair0[i-DREG_OFFSET]]=USING_REG;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
453 regs[dreg_pair1[i-DREG_OFFSET]]=USING_REG;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
454 regs[i]=USING_REG; /* そのレジスタを使うことを宣言し */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
455 return i; /* その場所を表す番号を返す */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
456 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
457 return -1;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
458 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
459
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
460 static int
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
461 get_dregister0()
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
462 {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
463 int reg,i;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
464 /* とりあえず、空き int register pair を探す */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
465 if ((i=get_dregister1())!=-1) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
466 return i;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
467 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
468 /* search dregister stack */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
469 for(i=0;i<dreg_sp;i++) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
470 if ((reg=dreg_stack[i])>=0) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
471 code_dassign_lvar(
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
472 (dreg_stack[i]=new_lvar(size_of_double)),reg,1);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
473 dreg_stack[i]= dreg_stack[i]-REG_LVAR_OFFSET;
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
474 return reg;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
475 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
476 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
477 /* clear integer register stack */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
478 for(i=0;i<reg_sp;i++) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
479 if ((reg=reg_stack[i])>=0) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
480 code_assign_lvar(
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
481 (reg_stack[i]=new_lvar(size_of_int)),reg,0);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
482 reg_stack[i]= reg_stack[i]-REG_LVAR_OFFSET;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
483 free_register(reg);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
484 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
485 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
486 if ((i=get_dregister1())!=-1) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
487 return i;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
488 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
489
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
490 error(REG_ERR); return dreg;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
491 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
492
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
493 static int
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
494 get_fregister0()
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
495 { /* 使われていないレジスタを調べる */
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
496 int i,reg;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
497 for(i=MAX_TMP_FREG+FREG_OFFSET;i>MIN_TMP_FREG+FREG_OFFSET;i--) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
498 if (regs[i]) continue; /* 使われている */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
499 regs[i]=USING_REG; /* そのレジスタを使うことを宣言し */
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
500 return i; /* その場所を表す番号を返す */
fea1b499d47b fix register var save
kono
parents:
diff changeset
501 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
502 /* search register stack */
fea1b499d47b fix register var save
kono
parents:
diff changeset
503 for(i=0;i<freg_sp;i++) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
504 if ((reg=freg_stack[i])>=0) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
505 code_dassign_lvar(
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
506 (freg_stack[i]=new_lvar(size_of_float)),reg,0);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
507 freg_stack[i]= freg_stack[i]-REG_LVAR_OFFSET;
fea1b499d47b fix register var save
kono
parents:
diff changeset
508 return reg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
509 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
510 }
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
511 for(i=0;i<FREG_VAR_BASE-REG_VAR_MIN;i++) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
512 reg =FREG_VAR_BASE-i+FREG_OFFSET;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
513 if (! regs[reg]) { /* 使われていないなら */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
514 regs[reg]=USING_REG; /* そのレジスタを使うことを宣言し */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
515 regv[reg]=0;
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
516 if (i>max_freg_var) max_freg_var=i;
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
517 return reg;
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
518 }
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
519 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
520 /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */
fea1b499d47b fix register var save
kono
parents:
diff changeset
521 error(REG_ERR); return freg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
522 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
523
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
524 int
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
525 get_dregister(int d)
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
526 {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
527 if (d) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
528 return get_dregister0();
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
529 } else {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
530 return get_fregister0();
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
531 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
532 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
533
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
534 int
fea1b499d47b fix register var save
kono
parents:
diff changeset
535 pop_fregister(void)
fea1b499d47b fix register var save
kono
parents:
diff changeset
536 { /* レジスタから値を取り出す */
fea1b499d47b fix register var save
kono
parents:
diff changeset
537 return freg_stack[--freg_sp];
fea1b499d47b fix register var save
kono
parents:
diff changeset
538 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
539
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
540 int
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
541 pop_dregister(void)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
542 { /* レジスタから値を取り出す */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
543 return dreg_stack[--dreg_sp];
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
544 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
545 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
546
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
547 #if LONGLONG_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
548 int
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
549 get_lregister_var(NMTBL *n)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
550 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
551 return -1;
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
552 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
553 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
554
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
555
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
556 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
557 emit_pop_free(int xreg)
fea1b499d47b fix register var save
kono
parents:
diff changeset
558 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
559 if (xreg>=0)
fea1b499d47b fix register var save
kono
parents:
diff changeset
560 free_register(xreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
561 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
562
fea1b499d47b fix register var save
kono
parents:
diff changeset
563 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
564 free_register(int i) { /* いらなくなったレジスタを開放 */
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
565 int i0,i1;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
566 if (i<0||MAX_FREGISTER+FREG_OFFSET+REAL_MAX_DREGISTER<i) error(-1);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
567 if (is_double_reg(i)) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
568 i0 = dreg_pair0[i-DREG_OFFSET];
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
569 regv[i0]=regs[i0]=0;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
570 i1 = dreg_pair1[i-DREG_OFFSET];
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
571 regv[i1]=regs[i1]=0;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
572 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
573 regv[i]=regs[i]=0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
574 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
575
fea1b499d47b fix register var save
kono
parents:
diff changeset
576 int
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
577 get_input_dregister_var(int i,NMTBL *n,int is_code,int d)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
578 {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
579 if (d) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
580 if (is_code) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
581 if(!(i<DREG_VAR_BASE-DREG_VAR_MIN)) return 0;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
582 i = DREG_VAR_BASE-i+DREG_OFFSET;
141
kono
parents: 139
diff changeset
583 } else {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
584 if (i<0||i>=MAX_INPUT_DREGISTER_VAR) return 0;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
585 i = i+MIN_TMP_DREG+DREG_OFFSET;
141
kono
parents: 139
diff changeset
586 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
587 return list3(DREGISTER,i,(int)n);
141
kono
parents: 139
diff changeset
588 } else {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
589 if (is_code) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
590 if(!(i<FREG_VAR_BASE-FREG_VAR_MIN)) return 0;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
591 i = FREG_VAR_BASE-i+FREG_OFFSET;
141
kono
parents: 139
diff changeset
592 } else {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
593 if (i<0||i>=MAX_INPUT_FREGISTER_VAR) return 0;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
594 i = i+MIN_TMP_FREG+FREG_OFFSET;
141
kono
parents: 139
diff changeset
595 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
596 return list3(FREGISTER,i,(int)n);
141
kono
parents: 139
diff changeset
597 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
598 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
599
fea1b499d47b fix register var save
kono
parents:
diff changeset
600 int
fea1b499d47b fix register var save
kono
parents:
diff changeset
601 get_input_register_var(int i,NMTBL *n,int is_code)
fea1b499d47b fix register var save
kono
parents:
diff changeset
602 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
603 if (is_code) {
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
604 if(!(i<REG_VAR_BASE-REG_VAR_MIN)) return 0;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
605 i = REG_VAR_BASE-i;
fea1b499d47b fix register var save
kono
parents:
diff changeset
606 } else {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
607 if (i<0||i>=MAX_INPUT_REGISTER_VAR) return 0;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
608 i = i+MIN_TMP_REG;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
609 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
610 return list3(REGISTER,i,(int)n);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
611 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
612
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
613 /* double register case? */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
614
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
615 int
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
616 get_input_register_var_1(int i,NMTBL *n,int is_code)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
617 {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
618 if (is_code) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
619 if(!(i<REG_VAR_BASE-REG_VAR_MIN)) return 0;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
620 i = REG_VAR_BASE-i;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
621 } else {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
622 if (i<0||i>=MAX_INPUT_REGISTER_VAR+1) return 0;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
623 i = i+MIN_TMP_REG;
fea1b499d47b fix register var save
kono
parents:
diff changeset
624 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
625 return list3(REGISTER,i,(int)n);
fea1b499d47b fix register var save
kono
parents:
diff changeset
626 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
627
fea1b499d47b fix register var save
kono
parents:
diff changeset
628 int
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
629 free_register_count(int d)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
630 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
631 int i,count,fcount;
fea1b499d47b fix register var save
kono
parents:
diff changeset
632 fcount = count = 0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
633 for(i=0;i<MAX_REGISTER;i++) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
634 if (! regs[i] && ! regv[i]) count++;
fea1b499d47b fix register var save
kono
parents:
diff changeset
635 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
636 for(i=0;i<MAX_FREGISTER;i++) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
637 if (! regs[i+FREG_OFFSET] && ! regv[i+FREG_OFFSET]) fcount++;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
638 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
639 printf("# free reg %d freg %d\n",count,fcount);
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
640 return d?fcount:count;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
641 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
642
fea1b499d47b fix register var save
kono
parents:
diff changeset
643 int
fea1b499d47b fix register var save
kono
parents:
diff changeset
644 register_full(void)
fea1b499d47b fix register var save
kono
parents:
diff changeset
645 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
646 int i;
fea1b499d47b fix register var save
kono
parents:
diff changeset
647 for(i=0;i<MAX_REGISTER;i++) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
648 if (! regs[i]) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
649 return 0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
650 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
651 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
652 return 1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
653 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
654
fea1b499d47b fix register var save
kono
parents:
diff changeset
655 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
656 free_all_register(void)
fea1b499d47b fix register var save
kono
parents:
diff changeset
657 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
658 int i;
fea1b499d47b fix register var save
kono
parents:
diff changeset
659 for(i=0;i<MAX_REGISTER;i++) { regs[i]=0; regv[i]=0; }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
660 for(i=0;i<MAX_FREGISTER;i++) { regs[i+FREG_OFFSET]=0; regv[i+FREG_OFFSET]=0; }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
661 for(i=0;i<MAX_DREGISTER;i++) { regs[i+DREG_OFFSET]=0; regv[i+DREG_OFFSET]=0; }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
662 creg = get_register();
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
663 #if FLOAT_CODE
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
664 freg = get_dregister(0);
150
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
665 dreg = DREG_DREGISTER;
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
666 #endif
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
667 set_creg(CREG_REGISTER,0);
fea1b499d47b fix register var save
kono
parents:
diff changeset
668 set_freg(FREG_FREGISTER,0);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
669 set_dreg(DREG_DREGISTER,0);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
670 return;
fea1b499d47b fix register var save
kono
parents:
diff changeset
671 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
672
fea1b499d47b fix register var save
kono
parents:
diff changeset
673 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
674 register_usage(char *s)
fea1b499d47b fix register var save
kono
parents:
diff changeset
675 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
676 #if 0
fea1b499d47b fix register var save
kono
parents:
diff changeset
677 int i;
fea1b499d47b fix register var save
kono
parents:
diff changeset
678 #endif
fea1b499d47b fix register var save
kono
parents:
diff changeset
679 if (chk) return;
fea1b499d47b fix register var save
kono
parents:
diff changeset
680 if (!lsrc) return;
fea1b499d47b fix register var save
kono
parents:
diff changeset
681 printf("# %d: %s:",lineno,s);
150
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
682 printf(" creg=%s ireg=%s freg=%s dreg=%s",
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
683 is_int_reg(creg)?register_name(creg):
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
684 is_float_reg(creg)?fregister_name(creg):
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
685 is_double_reg(creg)?dregister_name0(creg):"bad",
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
686 register_name(ireg),fregister_name(freg),dregister_name0(dreg));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
687 #if 0
fea1b499d47b fix register var save
kono
parents:
diff changeset
688 printf("\n# regs:");
fea1b499d47b fix register var save
kono
parents:
diff changeset
689 for(i=0;i<MAX_REGISTER;i++) { printf("%d",regv[i]); }
fea1b499d47b fix register var save
kono
parents:
diff changeset
690 printf(":");
fea1b499d47b fix register var save
kono
parents:
diff changeset
691 for(i=0;i<MAX_REGISTER;i++) { printf("%d",regs[i]); }
fea1b499d47b fix register var save
kono
parents:
diff changeset
692 printf("\n# freg:");
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
693 for(i=0;i<MAX_FREGISTER;i++) { printf("%d",regs[i+FREG_OFFSET]); }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
694 for(i=reg_sp;i>=0;i--) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
695 if(reg_stack[i]>=0)
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
696 printf(" %s",register_name(reg_stack[i]));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
697 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
698 #endif
fea1b499d47b fix register var save
kono
parents:
diff changeset
699 printf("\n");
fea1b499d47b fix register var save
kono
parents:
diff changeset
700 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
701
fea1b499d47b fix register var save
kono
parents:
diff changeset
702 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
703 gexpr_init(void)
fea1b499d47b fix register var save
kono
parents:
diff changeset
704 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
705 while(reg_sp > 0) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
706 free_register(reg_stack[--reg_sp]);
fea1b499d47b fix register var save
kono
parents:
diff changeset
707 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
708 while(freg_sp > 0) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
709 free_register(freg_stack[--freg_sp]);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
710 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
711 while(dreg_sp > 0) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
712 free_register(dreg_stack[--dreg_sp]);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
713 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
714 if (cond_freg!=-1) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
715 if(car(cond_freg)==FREGISTER) free_register(cadr(cond_freg));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
716 cond_freg=-1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
717 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
718 if (cond_dreg!=-1) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
719 if(car(cond_dreg)==DREGISTER) free_register(cadr(cond_dreg));
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
720 cond_dreg=-1;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
721 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
722 if (cond_reg!=-1) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
723 if(car(cond_reg)==REGISTER) free_register(cadr(cond_reg));
fea1b499d47b fix register var save
kono
parents:
diff changeset
724 cond_reg=-1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
725 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
726 cmpreg = -1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
727 text_mode();
fea1b499d47b fix register var save
kono
parents:
diff changeset
728 gexpr_code_init();
fea1b499d47b fix register var save
kono
parents:
diff changeset
729 register_usage("gexpr_init");
fea1b499d47b fix register var save
kono
parents:
diff changeset
730 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
731
fea1b499d47b fix register var save
kono
parents:
diff changeset
732
fea1b499d47b fix register var save
kono
parents:
diff changeset
733 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
734 emit_init(void)
fea1b499d47b fix register var save
kono
parents:
diff changeset
735 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
736 free_all_register();
fea1b499d47b fix register var save
kono
parents:
diff changeset
737 max_reg_var=-1; max_freg_var=-1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
738 reg_sp = 0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
739 freg_sp = 0;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
740 dreg_sp = 0;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
741 text_mode();
fea1b499d47b fix register var save
kono
parents:
diff changeset
742 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
743
fea1b499d47b fix register var save
kono
parents:
diff changeset
744 int
fea1b499d47b fix register var save
kono
parents:
diff changeset
745 register_var(int r) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
746 return r;
fea1b499d47b fix register var save
kono
parents:
diff changeset
747 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
748
fea1b499d47b fix register var save
kono
parents:
diff changeset
749
fea1b499d47b fix register var save
kono
parents:
diff changeset
750 int
fea1b499d47b fix register var save
kono
parents:
diff changeset
751 get_register_var(NMTBL *n)
fea1b499d47b fix register var save
kono
parents:
diff changeset
752 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
753 int i;
fea1b499d47b fix register var save
kono
parents:
diff changeset
754 for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
755 if (! regs[REG_VAR_BASE-i]) { /* 使われていないなら */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
756 /* そのレジスタを使うことを宣言し */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
757 regs[REG_VAR_BASE-i]=USING_REG;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
758 regv[REG_VAR_BASE-i]=0;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
759 if (i>max_reg_var) max_reg_var=i;
fea1b499d47b fix register var save
kono
parents:
diff changeset
760 /* その場所を表す番号を返す */
fea1b499d47b fix register var save
kono
parents:
diff changeset
761 return list3(REGISTER,REG_VAR_BASE-i,(int)n);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
762 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
763 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
764 return list2(LVAR,new_lvar(size_of_int));
fea1b499d47b fix register var save
kono
parents:
diff changeset
765 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
766
fea1b499d47b fix register var save
kono
parents:
diff changeset
767 int
fea1b499d47b fix register var save
kono
parents:
diff changeset
768 fregister_var(int r) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
769 return r;
fea1b499d47b fix register var save
kono
parents:
diff changeset
770 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
771
fea1b499d47b fix register var save
kono
parents:
diff changeset
772 int
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
773 get_dregister_var(NMTBL *n,int d)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
774 {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
775 int i,j;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
776 if (d) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
777 for(i=0;i<DREG_VAR_BASE-DREG_VAR_MIN;i++) {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
778 if (! regs[j=(DREG_VAR_BASE-i+DREG_OFFSET)]) { /* 使われていないなら */
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
779 if (regs[dreg_pair0[j]] || regs[dreg_pair1[j]]) continue;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
780 regs[DREG_VAR_BASE-i+DREG_OFFSET]=USING_REG; /*そのレジスタを使うことを宣言し*/
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
781 regv[DREG_VAR_BASE-i+DREG_OFFSET]=0;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
782 regs[dreg_pair0[j]] = regs[dreg_pair1[j]] = USING_REG;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
783 regv[dreg_pair0[j]] = regv[dreg_pair1[j]] = 0;
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
784 if (dreg_pair1[j]>max_reg_var) max_reg_var=dreg_pair1[j];
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
785 /* その場所を表す番号を返す */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
786 return list3(DREGISTER,DREG_VAR_BASE-i+DREG_OFFSET,(int)n);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
787 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
788 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
789 return list2(LVAR,new_lvar(size_of_double));
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
790 } else {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
791 for(i=0;i<FREG_VAR_BASE-FREG_VAR_MIN;i++) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
792 if (! regs[FREG_VAR_BASE-i+FREG_OFFSET]) { /* 使われていないなら */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
793 regs[FREG_VAR_BASE-i+FREG_OFFSET]=USING_REG; /*そのレジスタを使うことを宣言し*/
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
794 regv[FREG_VAR_BASE-i+FREG_OFFSET]=0;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
795 if (i>max_freg_var) max_freg_var=i;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
796 /* その場所を表す番号を返す */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
797 return list3(FREGISTER,FREG_VAR_BASE-i+FREG_OFFSET,(int)n);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
798 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
799 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
800 return list2(LVAR,new_lvar(size_of_float));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
801 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
802 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
803
fea1b499d47b fix register var save
kono
parents:
diff changeset
804 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
805 emit_push()
fea1b499d47b fix register var save
kono
parents:
diff changeset
806 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
807 int new_reg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
808 if (reg_sp>MAX_MAX) error(-1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
809 new_reg = get_register();
fea1b499d47b fix register var save
kono
parents:
diff changeset
810 reg_stack[reg_sp++] = creg; /* push するかわりにレジスタを使う */
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
811 ireg = creg = new_reg;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
812 regv[creg]=1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
813 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
814
fea1b499d47b fix register var save
kono
parents:
diff changeset
815 int
fea1b499d47b fix register var save
kono
parents:
diff changeset
816 emit_pop(int type)
fea1b499d47b fix register var save
kono
parents:
diff changeset
817 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
818 int xreg,reg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
819 xreg=pop_register();
fea1b499d47b fix register var save
kono
parents:
diff changeset
820 if (xreg<= -REG_LVAR_OFFSET) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
821 reg = get_register();
fea1b499d47b fix register var save
kono
parents:
diff changeset
822 code_rlvar(REG_LVAR_OFFSET+xreg,reg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
823 free_lvar(REG_LVAR_OFFSET+xreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
824 xreg = reg;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
825 regv[creg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
826 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
827 return xreg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
828 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
829
fea1b499d47b fix register var save
kono
parents:
diff changeset
830 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
831 code_label(int labelno)
fea1b499d47b fix register var save
kono
parents:
diff changeset
832 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
833 printf("L_%d:\n",labelno);
fea1b499d47b fix register var save
kono
parents:
diff changeset
834 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
835
fea1b499d47b fix register var save
kono
parents:
diff changeset
836 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
837 code_gvar(int e1,int creg) {
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
838 printf("\tla %s,%s\n",register_name(creg),((NMTBL*)cadr(e1))->nm);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
839 regv[creg]=1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
840 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
841
fea1b499d47b fix register var save
kono
parents:
diff changeset
842 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
843 code_rgvar(int e1,int creg) {
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
844 printf("\tlw %s,%s\n",register_name(creg),((NMTBL*)cadr(e1))->nm);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
845 regv[creg]=1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
846 }
167
0197ca125567 mips short
kono
parents: 164
diff changeset
847 char *cload(int sign,int sz) { return sz==1?(sign?"lbu":"lb"):(sz==size_of_short?(sign?"lhu":"lh"):"lw");}
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
848 char *cstore(int sz) { return sz==1?"sb":(sz==size_of_short)?"sh":"sw";}
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
849 void
167
0197ca125567 mips short
kono
parents: 164
diff changeset
850 code_crgvar(int e1,int creg,int sign,int sz){
0197ca125567 mips short
kono
parents: 164
diff changeset
851 printf("\t%s %s,%s\n",cload(sign,sz),register_name(creg),((NMTBL*)cadr(e1))->nm);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
852 regv[creg]=1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
853 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
854
fea1b499d47b fix register var save
kono
parents:
diff changeset
855
fea1b499d47b fix register var save
kono
parents:
diff changeset
856 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
857 code_register(int e2,int creg) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
858 if (creg!=e2)
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
859 printf("\tmove %s,%s\n",register_name(creg),register_name(e2));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
860 regv[creg]=1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
861 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
862
fea1b499d47b fix register var save
kono
parents:
diff changeset
863
fea1b499d47b fix register var save
kono
parents:
diff changeset
864 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
865 code_rlvar(int e2,int reg) {
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
866 printf("\tlw %s,",register_name(reg));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
867 lvar(e2);
fea1b499d47b fix register var save
kono
parents:
diff changeset
868 regv[creg]=1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
869 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
870
fea1b499d47b fix register var save
kono
parents:
diff changeset
871
fea1b499d47b fix register var save
kono
parents:
diff changeset
872 void
167
0197ca125567 mips short
kono
parents: 164
diff changeset
873 code_crlvar(int e2,int reg,int sign,int sz) {
0197ca125567 mips short
kono
parents: 164
diff changeset
874 printf("\t%s %s,",cload(sign,sz),register_name(reg));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
875 lvar(e2);
fea1b499d47b fix register var save
kono
parents:
diff changeset
876 regv[reg]=1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
877 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
878
fea1b499d47b fix register var save
kono
parents:
diff changeset
879
fea1b499d47b fix register var save
kono
parents:
diff changeset
880 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
881 code_fname(NMTBL *n,int creg) {
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
882 printf("\tla %s,%s\n",register_name(creg),n->nm);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
883 regv[creg]=1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
884 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
885
fea1b499d47b fix register var save
kono
parents:
diff changeset
886
fea1b499d47b fix register var save
kono
parents:
diff changeset
887 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
888 code_const(int e2,int creg) {
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
889 printf("\tli %s,%d\n",register_name(creg),e2);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
890 regv[creg]=1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
891 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
892
fea1b499d47b fix register var save
kono
parents:
diff changeset
893
fea1b499d47b fix register var save
kono
parents:
diff changeset
894 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
895 code_neg(int creg) {
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
896 printf("\tsubu %s,$0,%s\n", register_name(creg), register_name(creg));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
897 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
898
fea1b499d47b fix register var save
kono
parents:
diff changeset
899
fea1b499d47b fix register var save
kono
parents:
diff changeset
900 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
901 code_not(int creg) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
902 printf("\tnor %s,%s,%s\n",
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
903 register_name(creg), register_name(creg),register_name(creg));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
904 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
905
fea1b499d47b fix register var save
kono
parents:
diff changeset
906
fea1b499d47b fix register var save
kono
parents:
diff changeset
907 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
908 code_lnot(int creg) {
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
909 /* if non zero 1 else 0 */
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
910 int dreg = get_register();
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
911 printf("\txori %s,%s,0x0\n",
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
912 register_name(dreg),register_name(creg));
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
913 printf("\tsltu %s,%s,1\n",
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
914 register_name(creg),register_name(dreg));
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
915 free_register(dreg);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
916 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
917
fea1b499d47b fix register var save
kono
parents:
diff changeset
918 void
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
919 code_preinc(int e1,int e2,int dir,int sign,int sz,int reg) {
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
920 char *xrn,*drn;
fea1b499d47b fix register var save
kono
parents:
diff changeset
921 int i,dreg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
922 if (car(e2)==REGISTER) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
923 printf("\taddu %s,%s,%d\n",
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
924 register_name(cadr(e2)),register_name(cadr(e2)), dir);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
925 if (cadr(reg)!=e2)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
926 printf("\tmove %s,%s\n",register_name(cadr(reg)),register_name(e2));
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
927 regv[reg]=1;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
928 return;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
929 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
930 g_expr(e2);
fea1b499d47b fix register var save
kono
parents:
diff changeset
931 xrn = register_name(creg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
932 dreg=get_register(); if (!dreg) error(-1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
933 drn = register_name(dreg);
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
934 printf("\t%s %s,0(%s)\n",cload(sign,sz),drn,xrn);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
935 printf("\taddu %s,%s,%d\n",drn,drn,dir);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
936 printf("\t%s %s,0(%s)\n",cstore(sz),drn,xrn);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
937 i=creg;creg=dreg;dreg=i;
150
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
938 regv[creg]=1; ireg=creg;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
939 free_register(dreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
940 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
941
fea1b499d47b fix register var save
kono
parents:
diff changeset
942
fea1b499d47b fix register var save
kono
parents:
diff changeset
943 void
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
944 code_postinc(int e1,int e2,int dir,int sign,int sz,int reg) {
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
945 char *xrn,*crn,*nrn;
fea1b499d47b fix register var save
kono
parents:
diff changeset
946 int dreg,nreg,i;
fea1b499d47b fix register var save
kono
parents:
diff changeset
947 if (car(e2)==REGISTER) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
948 printf("\tmove %s,%s\n",register_name(reg),register_name(cadr(e2)));
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
949 printf("\taddu %s,%s,%d\n",
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
950 register_name(cadr(e2)),register_name(cadr(e2)),dir);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
951 regv[reg]=1;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
952 return;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
953 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
954 g_expr(e2);
fea1b499d47b fix register var save
kono
parents:
diff changeset
955 crn = register_name(creg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
956 dreg=get_register(); if (!dreg) error(-1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
957 xrn = register_name(dreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
958 nreg=get_register(); if (!nreg) error(-1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
959 nrn = register_name(nreg);
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
960 printf("\t%s %s,0(%s)\n",cload(sign,sz),xrn,crn);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
961 printf("\taddu %s,%s,%d\n",nrn,xrn,dir);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
962 printf("\t%s %s,0(%s)\n",cstore(sz),nrn,crn);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
963 i=creg;creg=dreg;dreg=i;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
964 free_register(nreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
965 free_register(dreg);
150
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
966 regv[creg]=1; ireg=creg;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
967 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
968
fea1b499d47b fix register var save
kono
parents:
diff changeset
969
fea1b499d47b fix register var save
kono
parents:
diff changeset
970
fea1b499d47b fix register var save
kono
parents:
diff changeset
971 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
972 code_return(int creg) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
973 char *crn = register_name(creg);
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
974 printf("\tla %s,L_%d\n",crn,retcont);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
975 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
976
fea1b499d47b fix register var save
kono
parents:
diff changeset
977 #define R1SAVE 1
fea1b499d47b fix register var save
kono
parents:
diff changeset
978
fea1b499d47b fix register var save
kono
parents:
diff changeset
979 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
980 code_environment(int creg) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
981 /* save frame pointer */
fea1b499d47b fix register var save
kono
parents:
diff changeset
982 #if R1SAVE
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
983 printf("\tlw %s,0($fp)\n",register_name(creg));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
984 #else
fea1b499d47b fix register var save
kono
parents:
diff changeset
985 int l = 0;
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
986 printf("\taddu %s,",register_name(creg));
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
987 printf("$fp,%d+L_%d\n",FUNC_LVAR,lvar_offset_label);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
988 #endif
fea1b499d47b fix register var save
kono
parents:
diff changeset
989 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
990
fea1b499d47b fix register var save
kono
parents:
diff changeset
991 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
992 code_bool(int e1) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
993 char *xrn;
fea1b499d47b fix register var save
kono
parents:
diff changeset
994 int e2,e3;
fea1b499d47b fix register var save
kono
parents:
diff changeset
995 b_expr(e1,1,e2=fwdlabel(),1); /* including > < ... */
150
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
996 creg = use_int(creg);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
997 xrn = register_name(creg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
998 printf("\tli %s,0\n",xrn);
fea1b499d47b fix register var save
kono
parents:
diff changeset
999 jmp(e3=fwdlabel());
fea1b499d47b fix register var save
kono
parents:
diff changeset
1000 fwddef(e2);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1001 printf("\tli %s,1\n",xrn);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1002 fwddef(e3);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1003 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1004
fea1b499d47b fix register var save
kono
parents:
diff changeset
1005 char *
fea1b499d47b fix register var save
kono
parents:
diff changeset
1006 code_gt(int cond) {
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
1007 return (cond?"\tslt %s,%s,%s\n\tbeq %s,$0,L_%d\n":
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
1008 "\tslt %s,%s,%s\n\tbne %s,$0,L_%d\n");
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1009 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1010
fea1b499d47b fix register var save
kono
parents:
diff changeset
1011 char *
fea1b499d47b fix register var save
kono
parents:
diff changeset
1012 code_ugt(int cond) {
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
1013 return (cond?"\tsltu %s,%s,%s\n\tbeq %s,$0,L_%d\n":
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
1014 "\tsltu %s,%s,%s\n\tbne %s,$0,L_%d\n");
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1015 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1016
fea1b499d47b fix register var save
kono
parents:
diff changeset
1017 char *
fea1b499d47b fix register var save
kono
parents:
diff changeset
1018 code_ge(int cond) {
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
1019 return (cond?"\tslt %s,%s,%s\n\txori %s,%s,0x1\n\tbeq %s,$0,L_%d\n":
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
1020 "\tslt %s,%s,%s\n\txori %s,%s,0x1\n\tbne %s,$0,L_%d\n");
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1021 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1022
fea1b499d47b fix register var save
kono
parents:
diff changeset
1023 char *
fea1b499d47b fix register var save
kono
parents:
diff changeset
1024 code_uge(int cond) {
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
1025 return (cond?"\tsltu %s,%s,%s\n\txori %s,%s,0x1\n\tbeq %s,$0,L_%d\n":
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
1026 "\tsltu %s,%s,%s\n\txori %s,%s,0x1\n\tbne %s,$0,L_%d\n");
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1027 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1028
fea1b499d47b fix register var save
kono
parents:
diff changeset
1029 char *
fea1b499d47b fix register var save
kono
parents:
diff changeset
1030 code_eq(int cond) {
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
1031 return (cond?"\tbeq %s,%s,L_%d\n":"\tbne %s,%s,L_%d\n");
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1032 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1033
fea1b499d47b fix register var save
kono
parents:
diff changeset
1034 void
167
0197ca125567 mips short
kono
parents: 164
diff changeset
1035 code_cmp_crgvar(int e1,int sz) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1036 if (cmpreg==-1) cmpreg = get_register();
167
0197ca125567 mips short
kono
parents: 164
diff changeset
1037 code_crgvar(cadr(e1),cmpreg,1,sz);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1038 regv[cmpreg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1039 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1040
fea1b499d47b fix register var save
kono
parents:
diff changeset
1041
fea1b499d47b fix register var save
kono
parents:
diff changeset
1042 void
167
0197ca125567 mips short
kono
parents: 164
diff changeset
1043 code_cmp_crlvar(int e2,int sz) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1044 if (cmpreg==-1) cmpreg = get_register();
167
0197ca125567 mips short
kono
parents: 164
diff changeset
1045 code_crlvar(e2,cmpreg,1,sz);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1046 regv[cmpreg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1047 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1048
fea1b499d47b fix register var save
kono
parents:
diff changeset
1049
fea1b499d47b fix register var save
kono
parents:
diff changeset
1050 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1051 code_cmp_rgvar(int e1) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1052 if (cmpreg==-1) cmpreg = get_register();
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1053 code_rgvar(e1,cmpreg);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1054 regv[cmpreg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1055 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1056
fea1b499d47b fix register var save
kono
parents:
diff changeset
1057
fea1b499d47b fix register var save
kono
parents:
diff changeset
1058 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1059 code_cmp_rlvar(int e2) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1060 if (cmpreg==-1) cmpreg = get_register();
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1061 code_rlvar(e2,cmpreg);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1062 regv[cmpreg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1063 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1064
fea1b499d47b fix register var save
kono
parents:
diff changeset
1065
fea1b499d47b fix register var save
kono
parents:
diff changeset
1066 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1067 code_cmp_register(int e2) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1068 cmpreg = e2;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1069 /* prevent cmpreg freeing */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1070 regv[cmpreg]=2;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1071 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1072
fea1b499d47b fix register var save
kono
parents:
diff changeset
1073
fea1b499d47b fix register var save
kono
parents:
diff changeset
1074 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1075 ascii(char *s)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1076 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1077 printf("\t.ascii \"");
fea1b499d47b fix register var save
kono
parents:
diff changeset
1078 while(*s) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1079 if (*s=='\n')
fea1b499d47b fix register var save
kono
parents:
diff changeset
1080 printf("%cn",92);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1081 else if (*s<' ')
fea1b499d47b fix register var save
kono
parents:
diff changeset
1082 printf("%c%03o",92,*s);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1083 else if (*s=='\\')
fea1b499d47b fix register var save
kono
parents:
diff changeset
1084 printf("\\\\");
fea1b499d47b fix register var save
kono
parents:
diff changeset
1085 else if (*s==34)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1086 printf("%c%c",92,34);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1087 else
fea1b499d47b fix register var save
kono
parents:
diff changeset
1088 printf("%c",*s);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1089 s++;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1090 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1091 printf("\\0%c\n\t.align 2\n",34);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1092 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1093
fea1b499d47b fix register var save
kono
parents:
diff changeset
1094 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1095 code_string(int e1,int creg)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1096 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1097 char *s,*crn;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1098 int lb;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1099 crn=register_name(creg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1100
fea1b499d47b fix register var save
kono
parents:
diff changeset
1101 s=(char *)cadr(e1);
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1102 printf("\t.rdata\n\t.align 2\n");
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1103 lb=fwdlabel();
fea1b499d47b fix register var save
kono
parents:
diff changeset
1104 printf("L_%d:\n",lb);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1105 ascii(s);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1106 if (output_mode==TEXT_EMIT_MODE) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1107 printf(".text\n");
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1108 } else {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1109 text_mode();
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1110 }
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1111 printf("\tla %s,L_%d\n",crn,lb);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1112 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1113
fea1b499d47b fix register var save
kono
parents:
diff changeset
1114 #define MAX_COPY_LEN 20
fea1b499d47b fix register var save
kono
parents:
diff changeset
1115
fea1b499d47b fix register var save
kono
parents:
diff changeset
1116 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1117 emit_copy(int from,int to,int length,int offset,int value,int det)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1118 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1119 char *frn = register_name(from);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1120 char *trn = register_name(to);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1121 char *drn;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1122 int fix = 0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1123 char *memmove = "memmove";
fea1b499d47b fix register var save
kono
parents:
diff changeset
1124 int dreg = get_register(); if (!dreg) error(-1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1125 drn = register_name(dreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1126
fea1b499d47b fix register var save
kono
parents:
diff changeset
1127 /* length <0 means upward direction copy */
fea1b499d47b fix register var save
kono
parents:
diff changeset
1128 switch (length) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1129 case 0: break;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1130 case 1: case -1:
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1131 printf("\tlb %s,%d(%s)\n",drn,offset,frn);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1132 printf("\tsb %s,%d(%s)\n",drn,offset,trn);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1133 break;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1134 case 2: case -2:
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1135 printf("\tlh %s,%d(%s)\n",drn,offset,frn);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1136 printf("\tsh %s,%d(%s)\n",drn,offset,trn);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1137 break;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1138 case 4: case -4:
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1139 printf("\tlw %s,%d(%s)\n",drn,offset,frn);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1140 printf("\tsw %s,%d(%s)\n",drn,offset,trn);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1141 break;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1142 default:
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1143 if (-MAX_COPY_LEN<length && length <0) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1144 for(;length<=4;length+=4,offset-=4)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1145 emit_copy(from,to,4,offset,0,det);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1146 for(;length<=2;length+=2,offset-=2)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1147 emit_copy(from,to,2,offset,0,det);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1148 if(length>0)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1149 emit_copy(from,to,length,offset,0,det);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1150 break;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1151 } else if (length <=MAX_COPY_LEN) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1152 for(;length>=4;length-=4,offset+=4)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1153 emit_copy(from,to,4,offset,0,det);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1154 for(;length>=2;length-=2,offset+=2)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1155 emit_copy(from,to,2,offset,0,det);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1156 if(length>0)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1157 emit_copy(from,to,length,offset,0,det);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1158 break;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1159 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1160 code_save_stacks();
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1161 printf("\tli $6,%d\n",length);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1162 printf("\tmr $5,%s\n",frn);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1163 printf("\tmr $4,%s\n",trn);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1164 /* overrap must be allowed */
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1165 printf("\tbl L_%s$stub\n",memmove);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1166 fix=0;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1167 set_creg(RET_REGISTER,0);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1168 if (creg!=to) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1169 free_register(to); to = creg;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1170 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1171 break;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1172 }
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1173 if (value) {
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1174 /* creg must point top of the destination data */
fea1b499d47b fix register var save
kono
parents:
diff changeset
1175 /* this code is necessary for the value of assignment or function call */
fea1b499d47b fix register var save
kono
parents:
diff changeset
1176 /* otherwise we don't need this */
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1177 if (fix) printf("\taddi %s,%s,%d\n",trn,trn,fix);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1178 if(creg!=to) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1179 free_register(creg); creg=to;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1180 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1181 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1182 free_register(dreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1183 regv[from]=regv[to]=regv[dreg]=0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1184 regv[creg]=1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1185 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1186
fea1b499d47b fix register var save
kono
parents:
diff changeset
1187 int
fea1b499d47b fix register var save
kono
parents:
diff changeset
1188 struct_push(int e4,int t,int arg)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1189 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1190 int length,count;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1191 int dreg,sreg; char *drn,*crn,*srn;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1192 g_expr(e4);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1193 length=size(t);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1194 if(length%size_of_int) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1195 length += size_of_int - (length%size_of_int);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1196 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1197 dreg = get_register(); if (!dreg) error(-1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1198 drn = register_name(dreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1199 crn = register_name(creg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1200 if (length<MAX_COPY_LEN) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1201 sreg = get_register(); if (!sreg) error(-1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1202 srn = register_name(sreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1203 code_lvar(cadr(arg),sreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1204 for(count=0;length<MAX_COPY_LEN;count++,length-=size_of_int) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1205 if (length==0) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1206 free_register(sreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1207 free_register(dreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1208 return count;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1209 } else {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1210 printf("\tlw %s,%d(%s)\n",drn,length-size_of_int,crn);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1211 printf("\tsw %s,%d(%s)\n",drn,length-size_of_int,srn);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1212 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1213 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1214 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1215 code_lvar(cadr(arg),dreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1216 /* downward direction copy */
fea1b499d47b fix register var save
kono
parents:
diff changeset
1217 emit_copy(creg,dreg,length,0,0,1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1218 if (dreg) free_register(dreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1219 return length/size_of_int;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1220 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1221
fea1b499d47b fix register var save
kono
parents:
diff changeset
1222 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1223 set_creg(int reg,int mode)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1224 {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1225 if (!is_int_reg(reg)) error(-1);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1226 if (reg!=creg) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1227 if (reg!=ireg && mode)
150
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
1228 printf("\tmove %s,%s\n",register_name(reg),register_name(ireg));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1229 free_register(creg);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1230 creg = ireg = reg;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1231 regs[creg]=1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1232 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1233 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1234
fea1b499d47b fix register var save
kono
parents:
diff changeset
1235 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1236 set_freg(int reg,int mode)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1237 {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1238 if (!is_float_reg(reg)) error(-1);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1239 if (reg!=creg) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1240 if (reg!=freg && mode) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1241 printf("\tfmove %s,%s\n",fregister_name(reg),fregister_name(freg));
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1242 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1243 free_register(creg);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1244 creg = freg = reg;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1245 regs[freg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1246 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1247 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1248
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1249 static void
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1250 move_dreg(int reg,int dreg)
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1251 {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1252 if (reg!=dreg) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1253 printf("\tmove %s,%s\n",dregister_name0(reg),
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1254 dregister_name0(dreg));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1255 printf("\tmove %s,%s\n",dregister_name1(reg),
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1256 dregister_name1(dreg));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1257 }
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1258 }
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1259
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1260 void
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1261 set_dreg(int reg,int mode)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1262 {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1263 if (!is_double_reg(reg)) error(-1);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1264 if (reg!=creg) {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1265 if (mode) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1266 move_dreg(reg,dreg);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1267 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1268 free_register(creg);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1269 creg = dreg = reg;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1270 regs[dreg]=1;
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
1271 regs[dreg_pair0[dreg-DREG_OFFSET]]=1;
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
1272 regs[dreg_pair1[dreg-DREG_OFFSET]]=1;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1273 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1274 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1275
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1276
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1277 void
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1278 use_var(int arg)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1279 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1280 if (car(arg)==REGISTER)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1281 regs[cadr(arg)]=USING_REG;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1282 else if (car(arg)==FREGISTER)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1283 regs[cadr(arg)]=USING_REG;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1284 else if (car(arg)==DREGISTER)
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1285 regs[cadr(arg)]=USING_REG;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1286 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1287
fea1b499d47b fix register var save
kono
parents:
diff changeset
1288 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1289 code_save_input_registers()
fea1b499d47b fix register var save
kono
parents:
diff changeset
1290 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1291 int args;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1292 NMTBL *n;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1293 int reg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1294 int tag;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1295 int lvar;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1296 int t;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1297 /* fnptr->dsp=list4(type,fnptr->dsp,(int)n,0); */
fea1b499d47b fix register var save
kono
parents:
diff changeset
1298 int reg_offset = 0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1299 int offset = 0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1300
fea1b499d47b fix register var save
kono
parents:
diff changeset
1301 for(args = fnptr->dsp;args;args = cadr(args)) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1302 n = (NMTBL *)caddr(args);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1303 tag = n->sc;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1304 reg = n->dsp;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1305 if (!n||n==&null_nptr) error(REG_ERR);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1306 if (tag==REGISTER) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1307 /* regs[reg]==INPUT_REG case should be considered */
fea1b499d47b fix register var save
kono
parents:
diff changeset
1308 n->dsp = offset;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1309 offset+=size_of_int;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1310 t = INT;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1311 reg += reg_offset; /* for duplicated floating point argument */
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1312 } else if (tag==FREGISTER) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1313 /* fregs[reg]==INPUT_REG case should be considered */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1314 n->dsp = offset;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1315 t = n->ty;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1316 if(t==FLOAT) { offset+=size_of_float; reg_offset+=1; }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1317 else if(t==DOUBLE) { offset+=size_of_double; reg_offset+=2; }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1318 else error(-1);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1319 } else if (tag==DREGISTER) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1320 /* fregs[reg]==INPUT_REG case should be considered */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1321 n->dsp = offset;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1322 t = n->ty;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1323 if(t==FLOAT) { offset+=size_of_float; reg_offset+=1; }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1324 else if(t==DOUBLE) { offset+=size_of_double; reg_offset+=2; }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1325 else error(-1);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1326 } else {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1327 offset += size(n->ty);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1328 continue;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1329 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1330 n->sc = LVAR;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1331 lvar = list2(LVAR,n->dsp);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1332 g_expr_u(assign_expr0(list2(LVAR,n->dsp),list3(tag,reg,(int)n),n->ty,t));
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1333 if (tag==REGISTER||tag==DREGISTER||tag==FREGISTER) {
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1334 free_register(reg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1335 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1336 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1337 my_func_args = offset;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1338 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1339
fea1b499d47b fix register var save
kono
parents:
diff changeset
1340 int
fea1b499d47b fix register var save
kono
parents:
diff changeset
1341 simple_args(int e3)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1342 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1343 return
fea1b499d47b fix register var save
kono
parents:
diff changeset
1344 !contains_in_list(e3,FUNCTION) &&
fea1b499d47b fix register var save
kono
parents:
diff changeset
1345 !contains_in_list(e3,CONV) &&
fea1b499d47b fix register var save
kono
parents:
diff changeset
1346 !contains_in_list(e3,RSTRUCT) &&
164
1c2a9232ea93 mc.h generation
kono
parents: 163
diff changeset
1347 !contains_in_list(e3,STASS)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1348 ;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1349 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1350
fea1b499d47b fix register var save
kono
parents:
diff changeset
1351 int
fea1b499d47b fix register var save
kono
parents:
diff changeset
1352 caller_arg_offset_v(int arg)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1353 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1354 return ARG_LVAR_OFFSET+arg*size_of_int;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1355 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1356
fea1b499d47b fix register var save
kono
parents:
diff changeset
1357 int
fea1b499d47b fix register var save
kono
parents:
diff changeset
1358 function(int e1)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1359 {
150
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
1360 int e2,e3,e4,nargs,t;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1361 int arg,reg_arg,freg_arg,arg_assign;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1362 int dots;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1363 int reg_arg_list=0,ret_type,special_lvar;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1364 NMTBL *fn = 0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1365 int jmp = 0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1366 char *jrn;
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1367 int iargs=0;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1368
fea1b499d47b fix register var save
kono
parents:
diff changeset
1369 special_lvar = -1;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1370 ret_type = cadr(cadddr(e1));
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1371 if (ret_type==CHAR) ret_type=INT;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1372
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1373 /* check argments type is DOTS? */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1374 t = caddr(cadddr(e1));
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1375 if (t==0 || t==DOTS) dots = 1;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1376 else {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1377 dots = 0;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1378 for(t = caddr(cadddr(e1));t;t = cadr(t)) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1379 if (car(t)==DOTS) dots = 1;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1380 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1381 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1382
fea1b499d47b fix register var save
kono
parents:
diff changeset
1383 e2 = cadr(e1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1384 if (car(e2) == FNAME) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1385 fn=(NMTBL *)cadr(e2);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1386 } else {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1387 jmp = get_register_var(0);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1388 if (car(jmp)!=REGISTER) error(-1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1389 reg_arg_list = list2(jmp,reg_arg_list);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1390 g_expr(e2);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1391 code_register(creg,cadr(jmp));
fea1b499d47b fix register var save
kono
parents:
diff changeset
1392 /* g_expr(assign_expr0(jmp,e2,INT,INT)); functions are lvalue */
fea1b499d47b fix register var save
kono
parents:
diff changeset
1393 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1394
fea1b499d47b fix register var save
kono
parents:
diff changeset
1395 /* now all input register vars are free */
fea1b499d47b fix register var save
kono
parents:
diff changeset
1396 code_save_stacks();
fea1b499d47b fix register var save
kono
parents:
diff changeset
1397 set_creg(CREG_REGISTER,0);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1398 set_freg(FREG_FREGISTER,0);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1399 set_dreg(DREG_DREGISTER,0);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1400
fea1b499d47b fix register var save
kono
parents:
diff changeset
1401 nargs = reg_arg = freg_arg = arg_assign = 0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1402 for (e3 = reverse0(caddr(e1)); e3; e3 = cadr(e3)) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1403 t=caddr(e3);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1404 e4 = car(e3);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1405 if(scalar(t)) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1406 if (reg_arg>=MAX_INPUT_REGISTER_VAR) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1407 arg = list2(LVAR,caller_arg_offset_v(nargs));
fea1b499d47b fix register var save
kono
parents:
diff changeset
1408 } else if (!simple_args(e3) && cadr(e3)) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1409 arg = get_register_var(0);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1410 arg_assign = list2(
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1411 assign_expr0(get_input_register_var(reg_arg,0,0),
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1412 arg,t,t),
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1413 arg_assign);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1414 } else {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1415 arg = get_input_register_var(reg_arg,0,0);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1416 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1417 use_var(arg); /* protect from input register free */
fea1b499d47b fix register var save
kono
parents:
diff changeset
1418 reg_arg_list = list2(arg,reg_arg_list);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1419 g_expr_u(assign_expr0(arg,e4,t,t));
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1420 nargs ++ ; reg_arg++; iargs += size_of_int;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1421 continue;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1422 } else if (t==DOUBLE||t==FLOAT) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1423 if (freg_arg>=MAX_INPUT_DREGISTER_VAR) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1424 arg = list2(LVAR,caller_arg_offset_v(nargs));
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1425 } else if (!simple_args(e3) && cadr(e3)) {
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1426 arg = get_dregister_var(0,1);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1427 arg_assign = list2(
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1428 assign_expr0(get_input_dregister_var(freg_arg,0,0,1),
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1429 arg,t,t),
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1430 arg_assign);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1431 } else {
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1432 arg = get_input_dregister_var(freg_arg,0,0,1);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1433 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1434 use_var(arg); /* protect from input register free */
fea1b499d47b fix register var save
kono
parents:
diff changeset
1435 reg_arg_list = list2(arg,reg_arg_list);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1436 g_expr_u(assign_expr0(arg,e4,t,t)); /* XXX */
fea1b499d47b fix register var save
kono
parents:
diff changeset
1437 freg_arg++;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1438 nargs += size(t)/size_of_int;
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1439 if (t==DOUBLE) iargs += size(t);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1440 continue;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1441 } else if (car(t)==STRUCT||car(t)==UNION) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1442 arg = list2(LVAR,caller_arg_offset_v(nargs));
fea1b499d47b fix register var save
kono
parents:
diff changeset
1443 nargs += struct_push(e4,t,arg);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1444 iargs += ((size(t)+3)/size_of_int)*size_of_int;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1445 continue;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1446 } else {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1447 error(TYERR);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1448 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1449 ++nargs;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1450 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1451 if (max_func_args<nargs) max_func_args=nargs;
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1452 if (max_func_iargs<iargs) max_func_iargs=iargs;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1453 for(;arg_assign;arg_assign=cadr(arg_assign)) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1454 g_expr_u(car(arg_assign));
fea1b499d47b fix register var save
kono
parents:
diff changeset
1455 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1456 if (car(e2) == FNAME) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1457 printf("\tbl\tL_%s$stub\n",fn->nm);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1458 } else {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1459 jrn = register_name(cadr(jmp));
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1460 printf("\tj %s\n",jrn);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1461 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1462 for(;reg_arg_list;reg_arg_list=cadr(reg_arg_list)) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1463 arg = car(reg_arg_list);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1464 if (car(arg)==REGISTER||car(arg)==DREGISTER||car(arg)==FREGISTER)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1465 free_register(cadr(arg));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1466 else if (car(arg)==LVAR&&cadr(arg)<0) free_lvar(cadr(arg));
fea1b499d47b fix register var save
kono
parents:
diff changeset
1467 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1468 if (ret_type==DOUBLE) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1469 set_dreg(RET_DREGISTER,0);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1470 regv[dreg]=1; regv[creg]=0;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1471 } else if (ret_type==FLOAT) {
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1472 set_freg(RET_FREGISTER,0);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1473 regv[freg]=1; regv[creg]=0;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1474 } else if (ret_type==VOID) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1475 regv[freg]=0; regv[creg]=0;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1476 } else {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1477 set_creg(RET_REGISTER,0);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1478 regv[freg]=0; regv[creg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1479 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1480 return ret_type;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1481 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1482
fea1b499d47b fix register var save
kono
parents:
diff changeset
1483 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1484 code_frame_pointer(int e3) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1485 #if R1SAVE
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1486 printf("\tmove $fp,%s\n",register_name(e3));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1487 #else
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1488 printf("\tmove $fp,%s\n",register_name(e3));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1489 #endif
fea1b499d47b fix register var save
kono
parents:
diff changeset
1490 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1491
fea1b499d47b fix register var save
kono
parents:
diff changeset
1492
fea1b499d47b fix register var save
kono
parents:
diff changeset
1493 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1494 code_fix_frame_pointer(int disp_offset) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1495 int l = 0;
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1496 printf("\tla $fp,");
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1497 printf("%d+L_%d($sp)\n",FUNC_LVAR,lvar_offset_label);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1498 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1499
fea1b499d47b fix register var save
kono
parents:
diff changeset
1500 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1501 code_jmp(char *s) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1502 max_reg_var = REG_VAR_BASE-REG_VAR_MIN;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1503 max_freg_var = FREG_VAR_BASE-FREG_VAR_MIN;
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1504 printf("\tj L_%s\n",s);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1505 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1506
fea1b499d47b fix register var save
kono
parents:
diff changeset
1507
fea1b499d47b fix register var save
kono
parents:
diff changeset
1508 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1509 code_indirect_jmp(int e2) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1510 max_reg_var = REG_VAR_BASE-REG_VAR_MIN;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1511 max_freg_var = FREG_VAR_BASE-FREG_VAR_MIN;
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1512 printf("\tj %s\n",register_name(e2));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1513 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1514
fea1b499d47b fix register var save
kono
parents:
diff changeset
1515 int
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1516 code_rindirect(int e1, int offset, int us)
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1517 {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1518 char *crn;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1519 g_expr(e1);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1520 crn=register_name(creg);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1521 printf("\tlw %s,%d(%s)\n",crn,offset,crn);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1522 return INT;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1523 }
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1524
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1525 int
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1526 code_crindirect(int e1, int offset, int us)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1527 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1528 char *crn;
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1529 g_expr(e1);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1530 crn=register_name(creg);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1531 if (us) {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1532 printf("\tlbu %s,%d(%s)\n",crn,offset,crn);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1533 return UCHAR;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1534 } else {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1535 printf("\tlb %s,%d(%s)\n",crn,offset,crn);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1536 return CHAR;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1537 }
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1538 }
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1539
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1540 int
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1541 code_srindirect(int e1, int offset, int us)
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1542 {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1543 char *crn;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1544 g_expr(e1);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1545 crn=register_name(creg);
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1546 if (us) {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1547 printf("\tlhu %s,%d(%s)\n",crn,offset,crn);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1548 return USHORT;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1549 } else {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1550 printf("\tlh %s,%d(%s)\n",crn,offset,crn);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1551 return SHORT;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1552 }
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1553 }
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1554
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1555 #if FLOAT_CODE
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1556 int
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1557 code_drindirect(int e1, int offset, int d)
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1558 {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1559 char *crn;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1560 g_expr(e1);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1561 crn=register_name(creg);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1562 if (d) {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1563 printf("\tlw %s,%d(%s)\n",
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1564 dregister_name0(dreg),offset,crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1565 printf("\tlw %s,%d(%s)\n",
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1566 dregister_name1(dreg),offset+size_of_int,crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1567 regv[creg]=0; regv[dreg]=1;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1568 creg = dreg;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1569 return DOUBLE;
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1570 } else {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1571 printf("\tl.s %s,%d(%s)\n", fregister_name(freg),offset,crn);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1572 regv[creg]=0; regv[freg]=1;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1573 creg = freg;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1574 return FLOAT;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1575 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1576 }
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1577 #endif
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1578
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1579 #if LONGLONG_CODE
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1580 int
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1581 code_lrindirect(int e1, int offset, int us)
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1582 {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1583 char *crn;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1584 g_expr(e1);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1585 crn=register_name(creg);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1586 }
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1587 #endif
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1588
fea1b499d47b fix register var save
kono
parents:
diff changeset
1589 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1590 code_assign_gvar(int e2,int creg,int byte) {
151
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
1591 char *crn,*name;
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
1592
151
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
1593 name = ((NMTBL*)cadr(e2))->nm;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1594 crn=register_name(creg);
167
0197ca125567 mips short
kono
parents: 164
diff changeset
1595 if (byte==1) {
151
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
1596 printf("\tsb %s,%s\n",crn,name);
167
0197ca125567 mips short
kono
parents: 164
diff changeset
1597 } if (byte==size_of_short) {
0197ca125567 mips short
kono
parents: 164
diff changeset
1598 printf("\tsh %s,%s\n",crn,name);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1599 } else {
151
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
1600 printf("\tsw %s,%s\n",crn,name);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1601 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1602 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1603
fea1b499d47b fix register var save
kono
parents:
diff changeset
1604 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1605 code_assign_lvar(int e2,int creg,int byte) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1606 char *crn;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1607 crn=register_name(creg);
167
0197ca125567 mips short
kono
parents: 164
diff changeset
1608 if (byte==1) {
0197ca125567 mips short
kono
parents: 164
diff changeset
1609 printf("\tsb %s,",crn);
0197ca125567 mips short
kono
parents: 164
diff changeset
1610 } else if (byte==size_of_short) {
0197ca125567 mips short
kono
parents: 164
diff changeset
1611 printf("\tsh %s,",crn);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1612 } else {
167
0197ca125567 mips short
kono
parents: 164
diff changeset
1613 printf("\tsw %s,",crn);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1614 }
167
0197ca125567 mips short
kono
parents: 164
diff changeset
1615 lvar(e2);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1616 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1617
fea1b499d47b fix register var save
kono
parents:
diff changeset
1618 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1619 code_assign_register(int e2,int byte,int creg) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1620 if (e2!=creg)
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1621 printf("\tmove %s,%s\n",register_name(e2),register_name(creg));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1622 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1623
fea1b499d47b fix register var save
kono
parents:
diff changeset
1624 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1625 code_assign(int e2,int byte,int creg) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1626 char *drn=register_name(e2);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1627 char *crn=register_name(creg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1628
167
0197ca125567 mips short
kono
parents: 164
diff changeset
1629 if (byte==1) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1630 printf("\tsb %s,0(%s)\n",crn,drn);
167
0197ca125567 mips short
kono
parents: 164
diff changeset
1631 } else if (byte==size_of_short) {
0197ca125567 mips short
kono
parents: 164
diff changeset
1632 printf("\tsh %s,0(%s)\n",crn,drn);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1633 } else {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1634 printf("\tsw %s,0(%s)\n",crn,drn);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1635 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1636 regv[creg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1637 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1638
fea1b499d47b fix register var save
kono
parents:
diff changeset
1639
fea1b499d47b fix register var save
kono
parents:
diff changeset
1640 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1641 code_register_assop(int e2,int op,int byte) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1642 int reg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1643 int xreg = creg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1644 creg = reg = e2;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1645 tosop(op,xreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1646 creg = xreg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1647 if (creg!=reg)
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1648 printf("\tmove %s,%s\n",register_name(creg),register_name(reg));
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1649 regv[creg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1650 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1651
fea1b499d47b fix register var save
kono
parents:
diff changeset
1652
fea1b499d47b fix register var save
kono
parents:
diff changeset
1653 void
163
fc8514c9d685 *** empty log message ***
kono
parents: 156
diff changeset
1654 code_assop(int op,int byte,int sign) {
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1655 char *xrn,*crn,*drn;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1656 int xreg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1657 int edx = get_register(); if(!edx) error(-1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1658 xrn = register_name(xreg = emit_pop(0)); /* pop e3 value */
fea1b499d47b fix register var save
kono
parents:
diff changeset
1659 regv[xreg]=regs[xreg]=1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1660 printf("# assop\n\tmr %s,%s\n",register_name(edx),register_name(creg));
fea1b499d47b fix register var save
kono
parents:
diff changeset
1661 regv[edx]=1;
163
fc8514c9d685 *** empty log message ***
kono
parents: 156
diff changeset
1662 ld_indexx(byte,0,edx,sign);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1663 tosop(op,xreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1664 crn = register_name(creg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1665 drn = register_name(edx);
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1666 printf("\t%s %s,0(%s)\n",cstore(byte),crn,drn);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1667 free_register(edx);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1668 emit_pop_free(xreg);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1669 regv[creg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1670 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1671
fea1b499d47b fix register var save
kono
parents:
diff changeset
1672
fea1b499d47b fix register var save
kono
parents:
diff changeset
1673 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1674 tosop(int op,int oreg)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1675 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1676 int dx;
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1677 char *orn,*crn;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1678
fea1b499d47b fix register var save
kono
parents:
diff changeset
1679 if(oreg==-1) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1680 error(-1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1681 } else if (oreg<= -REG_LVAR_OFFSET) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1682 dx = get_register(); if (dx<0) error(-1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1683 code_rlvar(oreg+REG_LVAR_OFFSET,dx);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1684 oreg = dx;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1685 regv[oreg]=1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1686 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1687
fea1b499d47b fix register var save
kono
parents:
diff changeset
1688 switch(op) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1689 case LSHIFT:
fea1b499d47b fix register var save
kono
parents:
diff changeset
1690 case ULSHIFT:
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1691 shift("sll",oreg);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1692 regv[creg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1693 return;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1694 case RSHIFT:
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1695 shift("srl",oreg);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1696 regv[creg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1697 return;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1698 case URSHIFT:
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1699 shift("sra",oreg);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1700 regv[creg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1701 return;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1702 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1703 orn = register_name(oreg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1704 crn = register_name(creg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1705 switch(op) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1706 case ADD:
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1707 printf("\taddu %s,%s,%s\n",crn,crn,orn);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1708 break;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1709 case SUB:
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1710 printf("\tsubu %s,%s,%s\n",crn,crn,orn);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1711 break;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1712 case CMP:
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1713 printf("\tslt %s,%s\n",crn,orn);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1714 break;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1715 case BAND:
fea1b499d47b fix register var save
kono
parents:
diff changeset
1716 printf("\tand %s,%s,%s\n",crn,crn,orn);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1717 break;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1718 case EOR:
fea1b499d47b fix register var save
kono
parents:
diff changeset
1719 printf("\txor %s,%s,%s\n",crn,crn,orn);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1720 break;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1721 case BOR:
fea1b499d47b fix register var save
kono
parents:
diff changeset
1722 printf("\tor %s,%s,%s\n",crn,crn,orn);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1723 break;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1724 case MUL:
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1725 printf("\tmult %s,%s,%s\n",crn,crn,orn);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1726 break;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1727 case UMUL:
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1728 printf("\tmultu %s,%s,%s\n",crn,crn,orn);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1729 break;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1730 case DIV:
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1731 printf("\tdivw %s,%s,%s\n",crn,crn,orn);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1732 break;
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
1733 case UDIV: case MOD: case UMOD:
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1734 printf("\t%s $0,%s,%s\n",(op==UDIV||op==UMOD)?"divu":"div",crn,orn);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1735 printf("\t%s %s\n",(op==MOD||op==UMOD)?"mflo":"mfhi",crn);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1736 printf("\t.set noreorder\n");
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1737 printf("\tbeql %s,$0,1f\n",orn);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1738 printf("\tbreak 7\n");
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1739 printf("1:\n");
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1740 printf("\t.set reorder\n");
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1741 break;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1742 default:
fea1b499d47b fix register var save
kono
parents:
diff changeset
1743 error(-1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1744 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1745 if(oreg!=creg) free_register(oreg);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1746 regv[creg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1747 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1748
fea1b499d47b fix register var save
kono
parents:
diff changeset
1749
fea1b499d47b fix register var save
kono
parents:
diff changeset
1750 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1751 shift(char *op, int reg)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1752 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1753 char *crn = register_name(creg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1754 char *rrn = register_name(reg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1755 printf("\t%s %s,%s,%s\n",op,crn,rrn,crn);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1756 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1757
189
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
1758 int
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
1759 code_const_op_p(int op,int v)
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
1760 {
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
1761 if (op==BAND||op==DIV||op==UDIV||op==MOD||op==UMOD) return 0;
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
1762 return 0;
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
1763 }
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
1764
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
1765 void
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
1766 oprtc(int op,int v)
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
1767 {
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
1768 }
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
1769
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
1770
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1771 void
163
fc8514c9d685 *** empty log message ***
kono
parents: 156
diff changeset
1772 ld_indexx(int byte, int n, int xreg,int sign)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1773 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1774 char *crn = register_name(creg);
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1775 printf("\t%s %s,%d(%s)\n",cload(sign,byte),crn,n,
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1776 register_name(xreg));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1777 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1778
fea1b499d47b fix register var save
kono
parents:
diff changeset
1779 int
fea1b499d47b fix register var save
kono
parents:
diff changeset
1780 code_csvalue()
fea1b499d47b fix register var save
kono
parents:
diff changeset
1781 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1782 return creg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1783 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1784
fea1b499d47b fix register var save
kono
parents:
diff changeset
1785 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1786 code_cmpdimm(int e, int csreg)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1787 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1788 /* used in dosiwtch() */
fea1b499d47b fix register var save
kono
parents:
diff changeset
1789 if(chk) return;
150
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
1790 creg = use_int(creg);
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1791 printf("\tli %s,%d\n",register_name(creg),e);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1792 cmpreg = csreg;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1793 regv[cmpreg]=2; /* prevent from freeing */
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1794 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1795
fea1b499d47b fix register var save
kono
parents:
diff changeset
1796 void
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
1797 code_opening(char *s)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1798 {
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1799 /* this is called once per month */
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1800 char *p=cheapp;
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1801
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
1802 printf("\t.file \"%s\"\n",s);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1803 /* printf("\t.version\t\"01.01\"\n"); */
fea1b499d47b fix register var save
kono
parents:
diff changeset
1804 /* printf("gcc2_compiled.:\n"); */
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1805 printf("\t.abicalls\n");
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1806 printf("\t.text\n");
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1807
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1808 if (asi) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1809 fclose(asi);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1810 asi = 0;
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1811 }
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1812 while ((*cheapp++ = *s++)) {
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1813 if (*s=='.') {
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1814 *cheapp++=*s++; *cheapp++='i';
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1815 *cheapp++=0;
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1816 break;
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1817 }
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1818 }
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1819 asi = fopen(p,"w");
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
1820 printf(".include \"%s\"\n",p);
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1821 if (!asi) error(-1);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1822 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1823
fea1b499d47b fix register var save
kono
parents:
diff changeset
1824 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1825 rexpr(int e1, int l1, char *s,int t)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1826 {
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1827 char *crn,*drn;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1828 if (cmpreg>=0) { free_register(cmpreg); cmpreg = -1; }
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1829
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1830 g_expr(cadr(e1));
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1831 emit_push();
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1832 g_expr(caddr(e1));
150
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
1833 cmpreg = emit_pop(0);
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1834 crn = register_name(creg);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1835 drn = register_name(cmpreg);
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1836
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1837 if (s[1] == 's') {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1838 if (s[16]=='x') {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1839 /* slt $2,$2,$3; xroi $2,$2,0x1; beq $2,$0,L1 */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1840 printf(s,crn,drn,drn,crn,crn,crn,l1);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1841 } else {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1842 /* slt $2,$2,$3; beq $2,$0,L1 */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1843 printf(s,crn,drn,drn,crn,l1);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1844 }
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1845 } else {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1846 /* beq $2,$3,L1 */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1847 printf(s,crn,drn,l1);
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1848 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1849 free_register(cmpreg) ; cmpreg = -1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1850 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1851
fea1b499d47b fix register var save
kono
parents:
diff changeset
1852 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1853 jcond(int l, char cond)
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1854 {
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1855 if (chk) return;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1856 if (cmpreg==-1) error(-1);
150
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
1857 printf("\tb%s %s,%s,L_%d\n",
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
1858 cond?"ne":"eq",
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
1859 register_name(creg),register_name(cmpreg),
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
1860 l);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1861 if (regv[cmpreg]==1) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1862 free_register(cmpreg); cmpreg = -1;
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1863 }
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1864 regv[creg]=0;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1865 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1866
fea1b499d47b fix register var save
kono
parents:
diff changeset
1867 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1868 jmp(int l)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1869 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1870 control=0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1871 if (chk) return;
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
1872 printf("\tj\tL_%d\n",l);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1873 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1874
fea1b499d47b fix register var save
kono
parents:
diff changeset
1875 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1876 gen_comment(char *s)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1877 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1878 if (chk) return;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1879 printf("## %s",s);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1880 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1881
fea1b499d47b fix register var save
kono
parents:
diff changeset
1882 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1883 code_enter(char *name)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1884 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1885 if (output_mode!=TEXT_EMIT_MODE)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1886 text_mode();
fea1b499d47b fix register var save
kono
parents:
diff changeset
1887 else
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1888 printf("\t.align 3\n");
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1889 /* if (stmode!=STATIC)
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1890 printf(".globl _%s\n",name); */
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1891 printf(".ent %s\n",name);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1892 printf("_%s:\n",name);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1893 code_disp_label=fwdlabel();
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1894
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1895 printf("\t.set noreorder\n");
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1896 printf("\t.cpload $25\n");
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1897 printf("\t.set reorder\n");
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1898 printf("\tsubu $sp,$sp,L_%d\n",code_disp_label);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1899 printf("\t.cprestore L_%d\n",cprestore_label);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1900
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1901 max_func_args = 0;
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1902 max_func_iargs = 0;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1903 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1904
fea1b499d47b fix register var save
kono
parents:
diff changeset
1905
fea1b499d47b fix register var save
kono
parents:
diff changeset
1906 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1907 code_enter1(int args)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1908 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1909 set_creg(CREG_REGISTER,0);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1910 set_freg(FREG_FREGISTER,0);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1911 set_dreg(DREG_DREGISTER,0);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1912 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1913
fea1b499d47b fix register var save
kono
parents:
diff changeset
1914 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1915 code_leave(char *name)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1916 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1917 int r1_offsetv;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1918 disp&= -size_of_int;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1919 r1_offsetv = -disp+max_func_args*size_of_int+code_disp_offset;
fea1b499d47b fix register var save
kono
parents:
diff changeset
1920
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1921 fprintf(asi,"L_%d=%d\n",code_disp_label,-r1_offsetv);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1922
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1923 local_table();
fea1b499d47b fix register var save
kono
parents:
diff changeset
1924 free_all_register();
fea1b499d47b fix register var save
kono
parents:
diff changeset
1925 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1926
fea1b499d47b fix register var save
kono
parents:
diff changeset
1927 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1928 enter(char *name)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1929 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1930 if (output_mode!=TEXT_EMIT_MODE)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1931 text_mode();
fea1b499d47b fix register var save
kono
parents:
diff changeset
1932 else
fea1b499d47b fix register var save
kono
parents:
diff changeset
1933 printf("\t.align 2\n");
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1934 /* if (stmode!=STATIC)
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1935 printf(".globl _%s\n",name); */
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1936 printf(".ent %s\n",name);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1937 printf("_%s:\n",name);
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1938
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1939 r1_offset_label = fwdlabel();
fea1b499d47b fix register var save
kono
parents:
diff changeset
1940 lvar_offset_label = fwdlabel();
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
1941 disp_label = fwdlabel();
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1942 mask_label = fwdlabel();
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1943 mask1_label = fwdlabel();
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1944 fmask_label = fwdlabel();
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1945 fmask1_label = fwdlabel();
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
1946 cprestore_label = fwdlabel();
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1947
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1948 printf("\t.frame $fp,L_%d,$31\n",r1_offset_label);
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1949 printf("\t.mask L_%d,L_%d\n",mask_label,mask1_label);
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1950 printf("\t.fmask L_%d,L_%d\n",fmask_label,fmask1_label);
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1951
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1952 printf("\t.set noreorder\n");
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1953 printf("\t.cpload $25\n");
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
1954 printf("\t.set reorder\n");
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
1955 printf("\tsubu $sp,$sp,L_%d\n",disp_label);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1956 printf("\t.cprestore L_%d\n",cprestore_label);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1957 max_func_args = 0;
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1958 max_func_iargs = 0;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1959
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1960 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1961
fea1b499d47b fix register var save
kono
parents:
diff changeset
1962 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1963 enter1()
fea1b499d47b fix register var save
kono
parents:
diff changeset
1964 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
1965 set_creg(CREG_REGISTER,0);
fea1b499d47b fix register var save
kono
parents:
diff changeset
1966 set_freg(FREG_FREGISTER,0);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
1967 set_dreg(DREG_DREGISTER,0);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1968 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1969
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1970 static unsigned int
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1971 code_mask_label()
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1972 {
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1973 int i;
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1974 unsigned int mask=0;
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1975 for(i=0;i<32;i++) {
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1976 if (i==28||i==31||(REG_VAR_MIN<=i&&i<=REG_VAR_MIN+max_reg_var)) {
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1977 mask |= (1<<i);
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1978 }
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1979 }
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1980 return mask;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1981 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
1982
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1983 static unsigned int
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1984 code_fmask_label()
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1985 {
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1986 int i;
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1987 unsigned int mask=0;
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1988 for(i=0;i<32;i++) {
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1989 if (FREG_VAR_MIN<=i&&i<=FREG_VAR_MIN+max_freg_var) {
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1990 mask |= (1<<i);
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1991 }
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1992 }
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1993 return mask;
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1994 }
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1995
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
1996
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
1997 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
1998 leave(int control, char *name)
fea1b499d47b fix register var save
kono
parents:
diff changeset
1999 {
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2000 int retcont1=0,sz;
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2001 int r1_offsetv;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2002
fea1b499d47b fix register var save
kono
parents:
diff changeset
2003 if (max_freg_var>=0 && max_freg_var<=3) max_freg_var=3;
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2004 reg_save =
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2005 (REAL_MAX_REGISTER-(REG_VAR_BASE-max_reg_var))*size_of_int;
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2006 freg_save =
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2007 (REAL_MAX_FREGISTER-(FREG_VAR_BASE-max_freg_var))*size_of_float;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2008
fea1b499d47b fix register var save
kono
parents:
diff changeset
2009 if (control) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2010 code_set_return_register(1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2011 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2012 if (retcont) {
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2013 /* return from CbC segement */
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2014 if (control) jmp(retlabel);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2015 retcont1 = fwdlabel();
fea1b499d47b fix register var save
kono
parents:
diff changeset
2016 fwddef(retcont);
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2017 if (cadr(fnptr->ty)==FLOAT) {
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2018 if (freg!=RET_FREGISTER)
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2019 printf("\tmov.s %s,%s\n",register_name(RET_FREGISTER),
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2020 register_name(freg));
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2021 } else if (cadr(fnptr->ty)==DOUBLE) {
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2022 move_dreg(RET_DREGISTER,dreg);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2023 } else if (cadr(fnptr->ty)>0&&(
fea1b499d47b fix register var save
kono
parents:
diff changeset
2024 car(cadr(fnptr->ty))==STRUCT ||
fea1b499d47b fix register var save
kono
parents:
diff changeset
2025 car(cadr(fnptr->ty))==UNION)) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2026 sz = size(cadr(fnptr->ty));
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2027 printf("\tli $4,%d\n",sz);
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2028 printf("\tsubl $5,$4,$fp\n");
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2029 printf("\tlw $3,(%d)($fp)\n",(my_func_args-1)*size_of_int);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2030 emit_copy(6,3,sz,0,1,1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2031 } else if (cadr(fnptr->ty)!=VOID) {
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2032 if (creg!=RET_REGISTER)
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2033 printf("\tmove $3,%s\n",register_name(creg));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2034 }
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2035 printf("\tj L_%d\n",retcont1);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2036 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2037 fwddef(retlabel);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2038 if (retcont) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2039 fwddef(retcont1);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2040 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2041 if (max_freg_var>=0) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2042 } else {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2043 }
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2044 fprintf(asi,"L_%d=%d\n",r1_offset_label,0);
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2045 fprintf(asi,"L_%d=%d\n",lvar_offset_label,0);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2046 fprintf(asi,"L_%d=0x%x\n",mask_label,code_mask_label());
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2047 fprintf(asi,"L_%d=%d\n",mask1_label,0);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2048 fprintf(asi,"L_%d=0x%x\n",fmask_label ,code_fmask_label());
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2049 fprintf(asi,"L_%d=%d\n",fmask1_label,0);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2050 fprintf(asi,"L_%d=%d\n",cprestore_label ,max_func_iargs);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2051
fea1b499d47b fix register var save
kono
parents:
diff changeset
2052 disp &= -size_of_int;
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2053 r1_offsetv = 0;
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2054
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2055 printf("\tmove $sp,$fp\n");
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2056 printf("\tlw $31,%d($sp)\n",-disp);
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2057 printf("\tlw $fp,%d($sp)\n",-disp-4);
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2058 printf("\taddu $sp,$sp,%d\n",r1_offsetv);
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2059 printf("\tj $31\n");
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2060 printf("\t.end print\n");
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2061
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2062 fprintf(asi,"L_%d=%d\n",disp_label,-r1_offsetv);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2063
fea1b499d47b fix register var save
kono
parents:
diff changeset
2064 code_offset_set();
fea1b499d47b fix register var save
kono
parents:
diff changeset
2065 local_table();
fea1b499d47b fix register var save
kono
parents:
diff changeset
2066 labelno++;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2067 free_all_register();
fea1b499d47b fix register var save
kono
parents:
diff changeset
2068 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2069
fea1b499d47b fix register var save
kono
parents:
diff changeset
2070
fea1b499d47b fix register var save
kono
parents:
diff changeset
2071 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
2072 code_set_return_register(int mode) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2073 if (cadr(fnptr->ty)==DOUBLE) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2074 set_dreg(RET_DREGISTER,mode);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2075 } else if (cadr(fnptr->ty)==FLOAT) {
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2076 set_freg(RET_FREGISTER,mode);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2077 } else if (cadr(fnptr->ty)==VOID) {
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2078 } else {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2079 set_creg(RET_REGISTER,mode);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2080 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2081 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2082
189
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
2083 int
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
2084 code_get_fixed_creg(int reg,int type) {
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
2085 return creg;
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
2086 }
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
2087
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2088 void
189
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
2089 code_set_fixed_creg(int reg,int mode,int type) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2090 if (type==FLOAT) {
189
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
2091 set_freg(reg,mode);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2092 } else if (type==DOUBLE) {
189
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
2093 set_dreg(reg,mode);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2094 } else {
189
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
2095 set_creg(reg,mode);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2096 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2097 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2098
189
f53d70110377 immediate instructions.
kono
parents: 173
diff changeset
2099
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2100 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
2101 gen_gdecl(char *n, int gpc)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2102 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2103 if (stmode!=STATIC)
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2104 printf("\t.globl _%s\n",n);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2105 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2106
fea1b499d47b fix register var save
kono
parents:
diff changeset
2107 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
2108 align(int t)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2109 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2110 if (t!=CHAR) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2111 if (data_alignment & 1)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2112 printf("\t.align 2\n");
fea1b499d47b fix register var save
kono
parents:
diff changeset
2113 data_alignment = 0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2114 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2115 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2116
fea1b499d47b fix register var save
kono
parents:
diff changeset
2117 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
2118 emit_data(int e, int t, NMTBL *n)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2119 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2120 int l;
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2121 #if FLOAT_CODE
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2122 double d;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2123 float f;
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2124 #endif
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2125 char *name;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2126 name = n->nm;
156
da529eab5618 static initialization
kono
parents: 153
diff changeset
2127 if(mode!=GDECL&&mode!=STADECL) {
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2128 error(-1); return;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2129 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2130 if (chk) return;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2131 if (n->dsp != -1) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2132 n->dsp = -1; /* initiallized flag */
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2133 /* printf(".globl\t_%s\n",name); */
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2134 data_mode(name);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2135 align(t);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2136 printf("_%s:\n",name);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2137 } else {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2138 data_mode(0);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2139 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2140 if(car(e)==CONST) {
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
2141 if (t==CHAR||t==UCHAR) {
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2142 printf("\t.byte %d\n",cadr(e));
fea1b499d47b fix register var save
kono
parents:
diff changeset
2143 if (data_alignment>0)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2144 data_alignment++;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2145 gpc += 1;
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
2146 } else if (t==SHORT||t==USHORT) {
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
2147 printf("\t.short %d\n",cadr(e));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2148 if (data_alignment>0) data_alignment++;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2149 gpc += 2;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2150 } else {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2151 printf("\t.word %d\n",cadr(e));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2152 gpc += size_of_int;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2153 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2154 #if FLOAT_CODE
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2155 } else if(t==DOUBLE) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2156 d = dcadr(e);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2157 printf("\t.word\t0x%x\n\t.word\t0x%x\n",code_d1(d),code_d2(d));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2158 } else if(t==FLOAT) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2159 f = dcadr(e);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2160 printf("\t.word\t0x%x\n",*(int *)&f);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2161 #endif
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2162 } else if(t!=CHAR) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2163 gpc += size_of_int;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2164 if(car(e)==ADDRESS&&car(cadr(e))==GVAR) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2165 printf("\t.word _%s\n",((NMTBL *)cadr(cadr(e)))->nm);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2166 } else if(car(e)==FNAME) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2167 printf("\t.word _%s\n",((NMTBL *)cadr(e))->nm);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2168 } else if(car(e)==GVAR) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2169 printf("\t.word _%s\n",((NMTBL *)cadr(e))->nm);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2170 } else if(car(e)==STRING) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2171 if (car(n->ty)!=ARRAY || cadr(n->ty)!=CHAR) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2172 l = fwdlabel();
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2173 printf("\t.word L_%d\n",l);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2174 printf(".rdata\n\t.align 2\n");
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2175 printf("L_%d:\n",l);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2176 output_mode = RODATA_EMIT_MODE;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2177 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2178 ascii((char *)cadr(e));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2179 } else error(TYERR);
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
2180 } else error(TYERR);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2181 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2182
fea1b499d47b fix register var save
kono
parents:
diff changeset
2183 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
2184 emit_data_closing(NMTBL *n)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2185 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2186 #ifdef DOT_SIZE
fea1b499d47b fix register var save
kono
parents:
diff changeset
2187 int lb;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2188 #endif
fea1b499d47b fix register var save
kono
parents:
diff changeset
2189 if (chk) return;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2190 if (mode==GDECL) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2191 data_mode(0);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2192 #ifdef DOT_SIZE
fea1b499d47b fix register var save
kono
parents:
diff changeset
2193 lb=fwdlabel();
fea1b499d47b fix register var save
kono
parents:
diff changeset
2194 printf("L_%d:\n",lb);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2195 printf("\t.size\t%s,L_%d-%s\n",n->nm,lb,n->nm);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2196 #endif
fea1b499d47b fix register var save
kono
parents:
diff changeset
2197 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2198 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2199
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2200 void
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2201 global_table(void)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2202 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2203 NMTBL *n;
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2204 int init;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2205 init=0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2206 for(n=ntable;n < &ntable[GSYMS];n++) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2207 if ((n->sc == GVAR) && n->dsp != -1) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2208 /* n->dsp = -1 means initialized global */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2209 if (init==0) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2210 data_mode(0);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2211 init=1;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2212 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2213 printf(".comm _%s,%d\n",n->nm,size(n->ty));
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2214 } else if ((n->sc==STATIC) && n->dsp != -1) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2215 /* n->dsp = -1 means initialized global */
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2216 if (init==0) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2217 data_mode(0);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2218 init=1;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2219 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2220 printf(".lcomm _%s,%d\n",n->nm,size(n->ty));
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2221 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2222 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2223 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2224
fea1b499d47b fix register var save
kono
parents:
diff changeset
2225 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
2226 local_table(void)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2227 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2228 NMTBL *n;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2229 int init;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2230 init=0;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2231 /* static local variables */
fea1b499d47b fix register var save
kono
parents:
diff changeset
2232 for(n=ntable+GSYMS;n < &ntable[GSYMS+LSYMS];n++) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2233 if (n->sc == GVAR) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2234 if (init==0) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2235 data_mode(0);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2236 init=1;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2237 }
156
da529eab5618 static initialization
kono
parents: 153
diff changeset
2238 if (n->dsp!=-1) /* n->dsp = -1 means initialized global */
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2239 printf(".lcomm _%s,%d\n",n->nm,size(n->ty));
fea1b499d47b fix register var save
kono
parents:
diff changeset
2240 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2241 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2242 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2243
fea1b499d47b fix register var save
kono
parents:
diff changeset
2244 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
2245 text_mode(void)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2246 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2247 if (output_mode!=TEXT_EMIT_MODE) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2248 printf(".text\n");
fea1b499d47b fix register var save
kono
parents:
diff changeset
2249 printf("\t.align 2\n");
fea1b499d47b fix register var save
kono
parents:
diff changeset
2250 output_mode = TEXT_EMIT_MODE;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2251 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2252 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2253
fea1b499d47b fix register var save
kono
parents:
diff changeset
2254 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
2255 data_mode(char *name)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2256 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2257 if (output_mode!=DATA_EMIT_MODE) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2258 printf(".data\n");
fea1b499d47b fix register var save
kono
parents:
diff changeset
2259 output_mode = DATA_EMIT_MODE;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2260 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2261 if (name)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2262 printf("\t.type\t%s,@object\n",name);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2263 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2264
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2265 #if FLOAT_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2266
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2267 char *
fea1b499d47b fix register var save
kono
parents:
diff changeset
2268 fstore(int d)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2269 {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2270 return (d?"stfd":"stfs");
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2271 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2272
fea1b499d47b fix register var save
kono
parents:
diff changeset
2273 char *
fea1b499d47b fix register var save
kono
parents:
diff changeset
2274 fload(int d)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2275 {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2276 return d?"lfd":"lfs";
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2277 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2278
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2279 static
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2280 void code_dpfunc(char *f)
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2281 {
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2282 if (max_func_iargs<16) max_func_iargs=16;
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2283 printf("\tjal %s\n",f);
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2284 }
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2285
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2286 void
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2287 code_cmp_dregister(int e2,int d)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2288 {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2289 char *frn,*grn;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2290 int greg;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2291
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2292 if (d) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2293 printf("\tli.d $6,%g\n",0.0);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2294 code_save_stacks();
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2295 move_dreg(4+DREG_OFFSET,freg);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2296 code_dpfunc("dpcmp");
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2297 if (max_func_iargs<16) max_func_iargs=16;
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2298 set_dreg(RET_DREGISTER,0);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2299 return;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2300 } else {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2301 grn = register_name(greg = get_dregister(d));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2302 frn = register_name(e2);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2303 printf("\tli.s %s,%g\n",grn,0.0);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2304 printf("\tc.eq.s %s,%s\n",grn,frn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2305 free_register(greg);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2306 return;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2307 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2308 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2309
fea1b499d47b fix register var save
kono
parents:
diff changeset
2310 void
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2311 code_dregister(int e2,int freg,int d)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2312 {
141
kono
parents: 139
diff changeset
2313 if (freg!=e2) {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2314 if (d) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2315 if (!is_double_reg(e2)) error(-1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2316 move_dreg(freg,e2);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2317 } else {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2318 if (!is_float_reg(e2)) error(-1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2319 printf("\tfmr %s,%s\n",fregister_name(freg),fregister_name(e2));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2320 }
141
kono
parents: 139
diff changeset
2321 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2322 regv[freg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2323 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2324
fea1b499d47b fix register var save
kono
parents:
diff changeset
2325 void code_dassign_gvar(int e2,int freg,int d)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2326 {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2327 NMTBL *n = (NMTBL*)cadr(e2);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2328 if (d) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2329 if (!is_double_reg(freg)) error(-1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2330 printf("\tsw %s,0(%s)\n",dregister_name0(freg),n->nm);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2331 printf("\tsw %s,0(%s)\n",dregister_name1(freg),n->nm);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2332 } else {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2333 printf("\ts.s %s,0(%s)\n",fregister_name(freg),n->nm);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2334 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2335 regv[freg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2336 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2337
fea1b499d47b fix register var save
kono
parents:
diff changeset
2338 void code_dassign_lvar(int e2,int freg,int d)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2339 {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2340 if (d) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2341 if (!is_double_reg(freg)) error(-1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2342 printf("\tsw %s,",dregister_name0(freg));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2343 lvar(e2);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2344 printf("\tsw %s,",dregister_name1(freg));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2345 e2 += size_of_double/2;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2346 } else {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2347 printf("\ts.s %s,",fregister_name(freg));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2348 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2349 lvar(e2);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2350 regv[freg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2351 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2352
fea1b499d47b fix register var save
kono
parents:
diff changeset
2353 void code_dassign(int e2,int freg,int d)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2354 {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2355 if (d) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2356 if (!is_double_reg(freg)) error(-1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2357 printf("\tsw %s,0(%s)\n",dregister_name0(freg),register_name(e2));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2358 printf("\tsw %s,4(%s)\n",dregister_name1(freg),register_name(e2));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2359 } else {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2360 printf("\ts.s %s,0(%s)\n",fregister_name(freg),register_name(e2));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2361 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2362 regv[freg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2363 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2364
fea1b499d47b fix register var save
kono
parents:
diff changeset
2365 void
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2366 code_dassign_dregister(int e2,int d,int freg) {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2367 /* これってさ、code_dregister と同じ? */
141
kono
parents: 139
diff changeset
2368 if (e2!=freg) {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2369 if (d) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2370 if (!is_double_reg(freg)) error(-1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2371 move_dreg(freg,e2);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2372 } else {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2373 printf("\tmov.s %s,%s\n",fregister_name(e2),fregister_name(freg));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2374 }
141
kono
parents: 139
diff changeset
2375 }
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2376
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2377 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2378
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2379 static double d0 = 1.0;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2380
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2381 int
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2382 code_d1(double d)
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2383 {
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2384 int *i = (int *)&d0; int *j = (int *)&d;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2385 return (i[1] == 0x3ff00000)?j[0]:j[1];
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2386 }
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2387
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2388 int
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2389 code_d2(double d)
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2390 {
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2391 int *i = (int *)&d0; int *j = (int *)&d;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2392 return (i[1] == 0x3ff00000)?j[1]:j[0];
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2393 }
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2394
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2395 int
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2396 code_f(double d)
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2397 {
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2398 float f = d;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2399 int *j = (int *)&f;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2400 return *j;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2401 }
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2402
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2403 void
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2404 code_dconst(int e2,int freg,int d)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2405 {
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2406 double value = dcadr(e2);
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2407 char *frn;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2408 if (d) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2409 printf("\tli.d %s,%g\n",dregister_name0(freg),value);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2410 } else {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2411 frn = fregister_name(freg);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2412 printf("\tli.s %s,%g\n",frn,value);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2413 }
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2414 regv[freg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2415 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2416
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2417
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2418 void code_dneg(int freg,int d)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2419 {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2420 char *frn;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2421 if (d) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2422 code_save_stacks();
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2423 move_dreg(4+DREG_OFFSET,freg);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2424 code_dpfunc("dpneg");
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2425 set_dreg(RET_DREGISTER,0);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2426 } else {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2427 frn = fregister_name(freg);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2428 printf("\tfneg %s,%s\n",frn,frn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2429 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2430 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2431
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2432 void code_d2i(int freg0)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2433 {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2434 code_save_stacks();
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2435 set_dreg(RET_DREGISTER,1);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2436 code_dpfunc("dptoli");
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2437 set_creg(RET_REGISTER,0);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2438 regv[freg]=0;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2439 regv[creg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2440 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2441
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2442 void code_i2d(int creg0)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2443 {
141
kono
parents: 139
diff changeset
2444 code_save_stacks();
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2445 set_creg(RET_REGISTER,1);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2446 code_dpfunc("litodp");
150
f8271009a314 MIPS continue
kono
parents: 149
diff changeset
2447 set_dreg(RET_DREGISTER,0);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2448 regv[freg]=1;
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2449 regv[creg]=0;
141
kono
parents: 139
diff changeset
2450 }
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2451
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2452 void code_d2u(int freg0)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2453 {
141
kono
parents: 139
diff changeset
2454 code_save_stacks();
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2455 set_dreg(RET_DREGISTER,1);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2456 code_dpfunc("dptoul");
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2457 set_creg(RET_REGISTER,0);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2458 regv[freg]=1;
141
kono
parents: 139
diff changeset
2459 }
kono
parents: 139
diff changeset
2460
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2461 void code_u2d(int creg0)
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2462 {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2463 code_save_stacks();
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2464 set_creg(RET_REGISTER,1);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2465 code_dpfunc("ultodp");
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2466 set_dreg(RET_DREGISTER,0);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2467 regv[freg]=1;
141
kono
parents: 139
diff changeset
2468 }
kono
parents: 139
diff changeset
2469
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2470 void code_d2f(int freg) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2471 code_save_stacks();
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2472 set_dreg(RET_DREGISTER,1);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2473 code_dpfunc("dptofp");
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2474 set_freg(RET_FREGISTER,0);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2475 }
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2476
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2477 void code_f2d(int freg) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2478 code_save_stacks();
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2479 set_freg(RET_FREGISTER,1);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2480 code_dpfunc("fptodp");
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2481 set_dreg(RET_DREGISTER,0);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2482 }
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2483
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2484 void code_f2i(int freg) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2485 printf("\ttrunc.w.s %s,%s,%s\n",register_name(freg),
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2486 register_name(freg),register_name(ireg));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2487 creg = ireg;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2488 }
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2489
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2490 void code_f2u(int freg) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2491 printf("\ttrunc.w.s %s,%s,%s\n",register_name(freg),
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2492 register_name(freg),register_name(ireg));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2493 creg = ireg;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2494 }
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2495
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2496 void code_i2f(int creg0) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2497 printf("\tcvt.s.w %s,%s\n",register_name(freg),register_name(freg));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2498 creg = freg;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2499 }
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2500
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2501 void code_u2f(int creg0) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2502 printf("\tcvt.s.w %s,%s\n",register_name(freg),register_name(freg));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2503 creg = freg;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2504 }
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2505
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2506 void code_drgvar(int e2,int d,int freg)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2507 {
151
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2508 char *name = ((NMTBL*)cadr(e2))->nm;
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2509 if (d) {
151
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2510 printf("\tlw %s,%s\n",dregister_name0(freg),name);
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2511 printf("\tlw %s,%s\n",dregister_name1(freg),name);
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2512 } else {
151
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2513 printf("\tl.s %s,%s\n",fregister_name(freg),name);
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2514 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2515 regv[freg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2516 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2517
fea1b499d47b fix register var save
kono
parents:
diff changeset
2518
fea1b499d47b fix register var save
kono
parents:
diff changeset
2519 void code_drlvar(int e2,int d,int freg)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2520 {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2521 if (d) {
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2522 printf("\tlw %s,",dregister_name0(freg)); lvar(e2);
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2523 printf("\tlw %s,",dregister_name1(freg)); lvar(e2+size_of_double/2);
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2524 } else {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2525 printf("\tl.s %s,",fregister_name(freg)); lvar(e2);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2526 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2527 regv[freg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2528 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2529
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2530 void code_cmp_drgvar(int e2,int d)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2531 {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2532 char *frn;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2533 int g;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2534 if (d) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2535 code_save_stacks();
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2536 set_dreg(RET_DREGISTER,1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2537 code_drgvar(e2,d,RET_DREGISTER+2);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2538 code_dpfunc("dcmp");
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2539 regv[dreg]=0;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2540 } else {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2541 frn=fregister_name(freg);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2542 g=get_dregister(d);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2543 code_drgvar(e2,d,g);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2544 printf("\tfc.eq.s %s,%s\n",frn,fregister_name(g));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2545 free_register(g);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2546 regv[freg]=0;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2547 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2548 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2549
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2550 void code_cmp_drlvar(int e2,int d)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2551 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2552 char *frn=fregister_name(freg);
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2553 int g;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2554 if (d) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2555 code_save_stacks();
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2556 set_dreg(RET_DREGISTER,1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2557 code_drgvar(e2,d,RET_DREGISTER+2);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2558 code_dpfunc("dcmp");
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2559 regv[dreg]=0;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2560 } else {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2561 g=get_dregister(d);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2562 code_drlvar(e2,d,g);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2563 printf("\tc.eq.s %s,%s\n",frn,fregister_name(g));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2564 free_register(g);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2565 regv[freg]=0;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2566 }
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2567 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2568
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2569 static void
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2570 dtosop0(char *opn,int e1,int d,int cmp)
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2571 {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2572 char *frn;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2573 char *grn;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2574 if (d) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2575 code_save_stacks();
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2576 set_dreg(RET_DREGISTER,1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2577 move_dreg(RET_DREGISTER+2,e1);
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2578 code_dpfunc(opn);
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2579 } else {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2580 frn=fregister_name(freg);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2581 grn=fregister_name(e1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2582 if (cmp) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2583 printf("\t%s %s,%s\n",opn,frn,grn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2584 } else {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2585 printf("\t%s %s,%s,%s\n",opn,frn,frn,grn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2586 }
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2587 }
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2588 free_register(e1);
141
kono
parents: 139
diff changeset
2589 }
kono
parents: 139
diff changeset
2590
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2591
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2592 void dtosop(int op,int e1)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2593 {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2594 regv[freg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2595 switch(op) {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2596 case FADD: dtosop0("fadd",e1,0,0); return;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2597 case DADD: dtosop0("dpadd",e1,1,0); return;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2598 case FSUB: dtosop0("fadd",e1,0,0); return;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2599 case DSUB: dtosop0("dpsub",e1,1,0); return;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2600 case FDIV: dtosop0("fadd",e1,0,0); return;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2601 case DDIV: dtosop0("dpdiv",e1,1,0); return;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2602 case FMUL: dtosop0("fadd",e1,0,0); return;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2603 case DMUL: dtosop0("dpmul",e1,1,0); return;
141
kono
parents: 139
diff changeset
2604 case DCMPGE:
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2605 case DCMP: dtosop0("dpcmp",e1,1,1); return;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2606 case FCMPGE: dtosop0("c.le.s",e1,0,1); return;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2607 case FCMP: dtosop0("c.eq.s",e1,0,1); return;
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 133
diff changeset
2608 default:
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2609 error(-1); return;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2610 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2611 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2612
fea1b499d47b fix register var save
kono
parents:
diff changeset
2613 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
2614 code_dassop(int op,int d) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2615 /* we have lvalue in creg, applied floating value is in freg */
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2616 char *frn;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2617 int xreg;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2618 char *crn=register_name(creg);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2619
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2620 if (d) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2621 xreg=emit_dpop(d);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2622 printf("\tlw %s,0(%s)\n",dregister_name0(freg),crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2623 printf("\tlw %s,%d(%s)\n",dregister_name1(freg),size_of_int,crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2624 dtosop(op,xreg);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2625 printf("\tsw %s,0(%s)\n",dregister_name0(freg),crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2626 printf("\tsw %s,%d(%s)\n",dregister_name1(freg),size_of_int,crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2627 emit_dpop_free(xreg,d);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2628 creg = dreg;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2629 } else {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2630 xreg=emit_dpop(d);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2631 frn=fregister_name(freg);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2632 crn=register_name(creg);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2633
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2634 printf("\tl.s %s,0(%s)\n",frn,crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2635 dtosop(op,xreg);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2636 printf("\ts.s %s,0(%s)\n",frn,crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2637 emit_dpop_free(xreg,d);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2638 creg = freg;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2639 }
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2640 regv[creg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2641 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2642
fea1b499d47b fix register var save
kono
parents:
diff changeset
2643
fea1b499d47b fix register var save
kono
parents:
diff changeset
2644 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
2645 code_dpreinc(int e1,int e2,int d,int reg) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2646 char *frn;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2647 char *crn;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2648 int g;
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2649 char *grn;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2650
fea1b499d47b fix register var save
kono
parents:
diff changeset
2651 g_expr(e2);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2652
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2653 if (d) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2654 crn=register_name(creg);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2655 frn=fregister_name(freg);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2656
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2657 code_save_stacks();
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2658 set_dreg(RET_DREGISTER,0);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2659 printf("\tlw $4,0(%s)\n",crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2660 printf("\tlw $5,%d(%s)\n",size_of_int,crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2661 printf("\tli.d $6,1.0\n");
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2662 if (caddr(e1)>0)
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2663 code_dpfunc("dpadd");
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2664 else
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2665 code_dpfunc("dpsub");
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2666 printf("\tsw $2,0(%s)\n",crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2667 printf("\tsw $3,%d(%s)\n",size_of_int,crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2668 creg = dreg;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2669 } else {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2670 crn=register_name(creg);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2671 frn=fregister_name(freg);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2672 grn=fregister_name(g=get_dregister(d));
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2673
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2674 printf("\tl.s %s,0(%s)\n",frn,crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2675 printf("\tli.s %s,1.0\n",grn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2676 if (caddr(e1)>0)
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2677 printf("\tfadd %s,%s,%s\n",frn,frn,grn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2678 else
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2679 printf("\tfsub %s,%s,%s\n",frn,frn,grn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2680 printf("\ts.s %s,0(%s)\n",frn,crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2681 free_register(g);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2682 creg = freg;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2683 }
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2684 regv[creg]=1;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2685 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2686
fea1b499d47b fix register var save
kono
parents:
diff changeset
2687 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
2688 code_dpostinc(int e1,int e2,int d,int reg) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2689 char *frn;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2690 char *crn;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2691 int g;
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2692 char *grn;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2693
fea1b499d47b fix register var save
kono
parents:
diff changeset
2694 g_expr(e2);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2695
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2696 if (d) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2697 crn=register_name(creg);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2698 g = get_dregister(d);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2699 set_dreg(RET_DREGISTER,0);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2700 printf("\tlw $4,0(%s)\n",crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2701 printf("\tlw $5,%d(%s)\n",size_of_int,crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2702 move_dreg(g,4+DREG_OFFSET);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2703 printf("\tli.d $6,1.0\n");
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2704 if (caddr(e1)>0)
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2705 code_dpfunc("dpadd");
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2706 else
153
33b39002ac58 MIPS continue
kono
parents: 152
diff changeset
2707 code_dpfunc("dpsub");
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2708 set_dreg(RET_DREGISTER,0);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2709 printf("\tsw $2,0(%s)\n",crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2710 printf("\tsw $3,%d(%s)\n",size_of_int,crn);
152
17c6598617f8 *** empty log message ***
kono
parents: 151
diff changeset
2711 free_register(dreg);
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2712 set_dreg(g,0);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2713 creg = g;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2714 } else {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2715 crn=register_name(creg);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2716 frn=fregister_name(freg);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2717 grn=fregister_name(g=get_dregister(d));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2718
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2719 printf("\tl.s %s,0(%s)\n",frn,crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2720 printf("\tli.s %s,1.0\n",grn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2721 if (caddr(e1)>0)
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2722 printf("\tfadd %s,%s,%s\n",frn,frn,grn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2723 else
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2724 printf("\tfsub %s,%s,%s\n",frn,frn,grn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2725 printf("\ts.s %s,0(%s)\n",grn,crn);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2726 free_register(g);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2727 creg = freg;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2728 }
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2729 regv[creg]=1;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2730
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2731 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2732
fea1b499d47b fix register var save
kono
parents:
diff changeset
2733 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
2734 drexpr(int e1, int e2,int l1, int op)
fea1b499d47b fix register var save
kono
parents:
diff changeset
2735 {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2736 g_expr(list3(((op==FOP+EQ||op==FOP+NEQ)?DCMP:FCMPGE),e1,e2));
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2737 switch(op) {
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2738 case DOP+GE:
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2739 printf("\tbgez\tL_%d\n",l1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2740 break;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2741 case DOP+GT:
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2742 printf("\tbltz\tL_%d\n",l1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2743 break;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2744 case DOP+EQ:
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2745 printf("\tbeq\tL_%d\n",l1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2746 break;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2747 case DOP+NEQ:
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2748 printf("\tbne\tL_%d\n",l1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2749 break;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2750 case FOP+GE:
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2751 printf("\tbc1tl\tL_%d\n",l1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2752 break;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2753 case FOP+GT:
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2754 printf("\tbc1tl\tL_%d\n",l1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2755 break;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2756 case FOP+EQ:
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2757 printf("\tbc1f\tL_%d\n",l1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2758 break;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2759 case FOP+NEQ:
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2760 printf("\tbc1f\tL_%d\n",l1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2761 break;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2762 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2763 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2764
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2765 int emit_dpop(int d)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2766 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2767 int xreg,reg;
151
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2768 if (d)
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2769 xreg=pop_dregister();
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2770 else
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2771 xreg=pop_fregister();
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2772 if (xreg<= -REG_LVAR_OFFSET) {
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2773 reg = get_dregister(d);
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2774 code_drlvar(REG_LVAR_OFFSET+xreg,d,reg);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2775 free_lvar(REG_LVAR_OFFSET+xreg);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2776 regv[reg]=1; xreg=reg;
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2777 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2778 return xreg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2779 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2780
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2781 void emit_dpop_free(int e1,int d)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2782 {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 145
diff changeset
2783 free_register(e1);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2784 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2785
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2786 void emit_dpush(int d)
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2787 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2788 int new_reg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2789 if (freg_sp>MAX_MAX) error(-1);
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2790 new_reg = get_dregister(d);
151
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2791 if (d) {
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2792 dreg_stack[dreg_sp++] = dreg; /* push するかわりにレジスタを使う */
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2793 creg = dreg = new_reg;
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2794 regv[dreg]=1;
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2795 } else {
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2796 freg_stack[freg_sp++] = freg; /* push するかわりにレジスタを使う */
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2797 creg = freg = new_reg;
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2798 regv[freg]=1;
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
2799 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2800 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2801
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2802 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2803
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2804 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
2805 code_save_stacks()
fea1b499d47b fix register var save
kono
parents:
diff changeset
2806 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2807 int i,reg;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2808 for(i=0;i<reg_sp;i++) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2809 if ((reg=reg_stack[i])>=0) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2810 code_assign_lvar(
fea1b499d47b fix register var save
kono
parents:
diff changeset
2811 (reg_stack[i]=new_lvar(size_of_int)),reg,0);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2812 reg_stack[i]= reg_stack[i]-REG_LVAR_OFFSET;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2813 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2814 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2815 #if FLOAT_CODE
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2816 for(i=0;i<dreg_sp;i++) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2817 if ((reg=dreg_stack[i])>=0) {
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2818 code_dassign_lvar(
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2819 (dreg_stack[i]=new_lvar(size_of_double)),reg,1);
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2820 dreg_stack[i]= dreg_stack[i]-REG_LVAR_OFFSET;
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2821 }
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2822 }
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2823 for(i=0;i<freg_sp;i++) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2824 if ((reg=freg_stack[i])>=0) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2825 code_dassign_lvar(
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2826 (freg_stack[i]=new_lvar(size_of_float)),reg,0);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2827 freg_stack[i]= freg_stack[i]-REG_LVAR_OFFSET;
fea1b499d47b fix register var save
kono
parents:
diff changeset
2828 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2829 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2830 #endif
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2831 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2832
fea1b499d47b fix register var save
kono
parents:
diff changeset
2833 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
2834 emit_lib(char *p[])
fea1b499d47b fix register var save
kono
parents:
diff changeset
2835 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2836 while(*p) {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2837 printf("%s\n",*p++);
fea1b499d47b fix register var save
kono
parents:
diff changeset
2838 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2839 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2840
fea1b499d47b fix register var save
kono
parents:
diff changeset
2841 void
fea1b499d47b fix register var save
kono
parents:
diff changeset
2842 code_closing()
fea1b499d47b fix register var save
kono
parents:
diff changeset
2843 {
fea1b499d47b fix register var save
kono
parents:
diff changeset
2844 global_table();
fea1b499d47b fix register var save
kono
parents:
diff changeset
2845 /* printf("\t.ident \"Micro-C compiled\"\n"); */
149
0f36fdbcba9b mips no compile error
kono
parents: 148
diff changeset
2846 fclose(asi);
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
2847 }
fea1b499d47b fix register var save
kono
parents:
diff changeset
2848
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2849
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2850 #if LONGLONG_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2851
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2852
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2853 /* 64bit int part */
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2854
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2855 void lrexpr(int e1, int e2,int l1, int op)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2856 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2857 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2858
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2859 int lpop_register()
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2860 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2861 return 0;
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2862 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2863
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2864 int emit_lpop()
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2865 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2866 return 0;
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2867 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2868
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2869 void code_lregister(int e2,int reg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2870 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2871
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2872 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2873
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2874 void code_cmp_lregister(int reg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2875 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2876
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2877 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2878
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2879 void code_cmp_lrgvar(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2880 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2881
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2882 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2883
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2884 void code_cmp_lrlvar(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2885 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2886
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2887 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2888
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2889 void code_lassign(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2890 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2891
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2892 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2893
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2894 void code_lassign_gvar(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2895 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2896
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2897 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2898
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2899 void code_lassign_lvar(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2900 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2901
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2902 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2903
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2904 void code_lassign_lregister(int e2,int reg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2905 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2906
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2907 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2908
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2909 void code_lconst(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2910 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2911
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2912 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2913
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2914 void code_lneg(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2915 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2916
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2917 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2918
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2919 void code_lrgvar(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2920 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2921
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2922 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2923
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2924 void code_lrlvar(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2925 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2926
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2927 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2928
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2929 void ltosop(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2930 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2931
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2932 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2933
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2934 void emit_lpop_free(int e1)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2935 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2936
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2937 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2938
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2939 void emit_lpush()
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2940 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2941
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2942 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2943
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2944 void code_i2ll(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2945 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2946
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2947 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2948
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2949 void code_i2ull(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2950 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2951
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2952 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2953
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2954 void code_u2ll(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2955 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2956
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2957 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2958
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2959 void code_u2ull(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2960 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2961
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2962 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2963
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2964 void code_ll2i(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2965 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2966
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2967 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2968
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2969 void code_ll2u(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2970 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2971
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2972 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2973
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2974 void code_ull2i(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2975 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2976
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2977 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2978
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2979 void code_ull2u(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2980 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2981
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2982 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2983
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2984 #if FLOAT_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2985 void code_d2ll(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2986 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2987
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2988 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2989
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2990 void code_d2ull(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2991 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2992
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2993 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2994
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2995 void code_f2ll(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2996 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2997
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2998 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2999
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3000 void code_f2ull(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3001 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3002
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3003 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3004
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3005 void code_ll2d(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3006 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3007
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3008 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3009
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3010 void code_ll2f(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3011 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3012
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3013 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3014
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3015 void code_ull2d(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3016 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3017
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3018 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3019
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3020 void code_ull2f(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3021 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3022
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3023 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3024
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3025 void code_ull2ll(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3026 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3027
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3028 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3029
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3030 void code_ull2ull(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3031 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3032
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3033 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3034
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3035 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3036
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3037
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3038 void code_lpreinc(int e1,int e2,int reg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3039 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3040
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3041 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3042
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3043 void code_lpostinc(int e1,int e2,int reg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3044 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3045
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3046 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3047
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3048 void code_lassop(int op)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3049 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3050
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3051 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3052
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3053
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3054 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3055
130
fea1b499d47b fix register var save
kono
parents:
diff changeset
3056 /* end */
fea1b499d47b fix register var save
kono
parents:
diff changeset
3057