annotate mc-codegen.c @ 204:4c614334f3d0

long long test parse
author kono
date Tue, 13 Apr 2004 12:26:56 +0900
parents 601301152d9c
children a50f90d0b63a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1 /* Micro-C Generic Code Generatation Part */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
2 /* $Id$ */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
3
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
4 #define EXTERN extern
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
5 #include "mc.h"
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
6 #include "mc-codegen.h"
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
7 #include "mc-code.h"
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
8
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
9 int creg; /* current register */
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
10
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
11 int use; /* generated value will be used */
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
12
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
13 /*
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
14 creg currrent virtual register
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
15 */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
16
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
17 static void remove0(int *parent,int e) ;
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
18 /* static void remove0_all(int *parent,int e) ; */
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
19 static int is_same_type(int e1,int e2);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
20 static void jump(int e1, int env);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
21 static void machinop(int e1);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
22 static void sassign(int e1);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
23 static void assign(int e1);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
24 static void assop(int e1);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
25 static int g_expr0(int e1);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
26 static int register_to_lvar(int e);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
27
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
28 #if FLOAT_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
29
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
30 /* floating point */
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
31
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
32 static void dassop(int e1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
33 static void dmachinop(int e1,int d);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
34 static void dassign(int e1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
35
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
36 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
37 #if LONGLONG_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
38 static void lassop(int e1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
39 static void lmachinop(int e1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
40 static void lassign(int e1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
41 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
42
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
43
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 99
diff changeset
44 void
3cf2f8c120b9 *** empty log message ***
kono
parents: 99
diff changeset
45 codegen_init()
3cf2f8c120b9 *** empty log message ***
kono
parents: 99
diff changeset
46 {
3cf2f8c120b9 *** empty log message ***
kono
parents: 99
diff changeset
47 code_init();
3cf2f8c120b9 *** empty log message ***
kono
parents: 99
diff changeset
48 }
3cf2f8c120b9 *** empty log message ***
kono
parents: 99
diff changeset
49
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 135
diff changeset
50 void
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 135
diff changeset
51 arg_register(NMTBL *fnptr)
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 135
diff changeset
52 {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 135
diff changeset
53 code_arg_register(fnptr);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 135
diff changeset
54 }
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 135
diff changeset
55
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
56 int
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
57 gexpr(int e1,int use0)
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
58 {
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
59 if (chk) return INT;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
60 gexpr_init();
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
61 use = use0;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
62 #if 0
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
63 if(lineno==2862) {
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
64 return g_expr0(e1); /*break here*/
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
65 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
66 #endif
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
67 return g_expr0(e1);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
68 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
69
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
70 int
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
71 g_expr_u(int e1)
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
72 {
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
73 int t;
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
74 int suse = use; use=0;
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
75 t=g_expr0(e1);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
76 code_gexpr(e1);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
77
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
78 use=suse;
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
79 return t;
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
80 }
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
81
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
82 int
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
83 g_expr(int e1)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
84 {
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
85 int t;
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
86 int suse = use; use=1;
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
87 t=g_expr0(e1);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
88 code_gexpr(e1);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
89
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
90 use=suse;
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
91 return t;
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
92 }
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
93
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
94 int
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
95 g_expr0(int e1)
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
96 {
191
8646a4a9cde9 *** empty log message ***
kono
parents: 189
diff changeset
97 int e2,e3,t,d,t1;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
98 NMTBL *n;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
99
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
100 code_gexpr(e1);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
101
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
102 e2 = cadr(e1);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
103 switch (car(e1)){
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
104 case GVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
105 creg=use_int(creg);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 105
diff changeset
106 code_gvar(e1,creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
107 return ADDRESS;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
108 case RGVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
109 creg=use_int(creg);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 105
diff changeset
110 code_rgvar(e1,creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
111 return INT;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
112 case CRGVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
113 creg=use_int(creg);
165
kono
parents: 164
diff changeset
114 code_crgvar(e1,creg,1,1);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
115 return CHAR;
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
116 case CURGVAR:
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
117 creg=use_int(creg);
165
kono
parents: 164
diff changeset
118 code_crgvar(e1,creg,0,1);
kono
parents: 164
diff changeset
119 return UCHAR;
kono
parents: 164
diff changeset
120 case SRGVAR:
kono
parents: 164
diff changeset
121 creg=use_int(creg);
kono
parents: 164
diff changeset
122 code_crgvar(e1,creg,1,size_of_short);
kono
parents: 164
diff changeset
123 return CHAR;
kono
parents: 164
diff changeset
124 case SURGVAR:
kono
parents: 164
diff changeset
125 creg=use_int(creg);
kono
parents: 164
diff changeset
126 code_crgvar(e1,creg,0,size_of_short);
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
127 return UCHAR;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
128 case LVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
129 creg=use_int(creg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
130 code_lvar(e2,creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
131 return ADDRESS;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
132 case REGISTER:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
133 creg=use_int(creg);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 105
diff changeset
134 code_register(e2,creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
135 return INT;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
136 #if FLOAT_CODE
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
137 case DREGISTER:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
138 creg=use_double(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
139 code_dregister(e2,creg,1);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
140 return DOUBLE;
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 135
diff changeset
141 case FREGISTER:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
142 creg=use_float(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
143 code_dregister(e2,creg,0);
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 135
diff changeset
144 return FLOAT;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
145 #endif
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
146 case RLVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
147 creg=use_int(creg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
148 code_rlvar(e2,creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
149 return INT;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
150 case CRLVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
151 creg=use_int(creg);
165
kono
parents: 164
diff changeset
152 code_crlvar(e2,creg,1,1);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
153 return CHAR;
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
154 case CURLVAR:
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
155 creg=use_int(creg);
165
kono
parents: 164
diff changeset
156 code_crlvar(e2,creg,0,1);
kono
parents: 164
diff changeset
157 return UCHAR;
kono
parents: 164
diff changeset
158 case SRLVAR:
kono
parents: 164
diff changeset
159 creg=use_int(creg);
kono
parents: 164
diff changeset
160 code_crlvar(e2,creg,1,size_of_short);
kono
parents: 164
diff changeset
161 return CHAR;
kono
parents: 164
diff changeset
162 case SURLVAR:
kono
parents: 164
diff changeset
163 creg=use_int(creg);
kono
parents: 164
diff changeset
164 code_crlvar(e2,creg,0,size_of_short);
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
165 return UCHAR;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
166 #if FLOAT_CODE
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
167 case FRLVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
168 creg=use_float(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
169 code_drlvar(e2,0,creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
170 return FLOAT;
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
171 case FRGVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
172 creg=use_float(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
173 code_drgvar(e1,0,creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
174 return FLOAT;
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
175 case DRLVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
176 creg=use_double(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
177 code_drlvar(e2,1,creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
178 return DOUBLE;
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
179 case DRGVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
180 creg=use_double(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
181 code_drgvar(e1,1,creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
182 return DOUBLE;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
183 #endif
202
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
184 #if LONGLONG_CODE
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
185 case LRLVAR:
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
186 creg=use_longlong(creg);
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
187 code_lrlvar(e2,creg);
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
188 return LONGLONG;
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
189 case LRGVAR:
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
190 creg=use_longlong(creg);
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
191 code_lrgvar(e1,creg);
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
192 return LONGLONG;
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
193 case LURLVAR:
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
194 creg=use_longlong(creg);
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
195 code_lrlvar(e2,creg);
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
196 return ULONGLONG;
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
197 case LURGVAR:
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
198 creg=use_longlong(creg);
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
199 code_lrgvar(e1,creg);
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
200 return ULONGLONG;
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
201 #endif
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
202 case FNAME:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
203 creg=use_int(creg);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
204 code_fname((NMTBL *)(e2),creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
205 return ADDRESS;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
206 case CONST: /* ÂåÆþ¤¹¤ëÃͤ¬0¤Ç¤âÆÃÊ̤ʽèÍý¤Ï¤·¤Ê¤¤ */
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
207 creg=use_int(creg);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 105
diff changeset
208 code_const(e2,creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
209 return INT;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
210 #if FLOAT_CODE
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
211 case DCONST:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
212 creg=use_double(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
213 code_dconst(e1,creg,1);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
214 return DOUBLE;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
215 case FCONST:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
216 creg=use_float(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
217 code_dconst(e1,creg,0);
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
218 return FLOAT;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
219 #endif
202
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
220 #if FLOAT_CODE
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
221 case LCONST:
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
222 creg=use_longlong(creg);
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
223 code_lconst(e1,creg);
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
224 return LONGLONG;
601301152d9c *** empty log message ***
kono
parents: 197
diff changeset
225 #endif
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
226 case STRING:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
227 creg=use_int(creg);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 105
diff changeset
228 code_string(e1,creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
229 return ADDRESS;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
230 case FUNCTION:
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
231 t = function(e1);
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
232 return t;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
233 case CODE:
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
234 jump(e2,caddr(e1));
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
235 return VOID;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
236 case INDIRECT:
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
237 return g_expr0(e2);
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
238 case RINDIRECT:
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
239 return code_rindirect(e2,caddr(e1),0);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
240 case URINDIRECT:
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
241 return code_rindirect(e2,caddr(e1),1);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
242 case CRINDIRECT:
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
243 return code_crindirect(e2,caddr(e1),0);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
244 case CURINDIRECT:
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
245 return code_crindirect(e2,caddr(e1),1);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
246 case SRINDIRECT:
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
247 return code_srindirect(e2,caddr(e1),0);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
248 case SURINDIRECT:
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
249 return code_srindirect(e2,caddr(e1),1);
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
250 #if FLOAT_CODE
197
b5f49f32c2ee *** empty log message ***
kono
parents: 196
diff changeset
251 case FRINDIRECT:
b5f49f32c2ee *** empty log message ***
kono
parents: 196
diff changeset
252 return code_drindirect(e2,caddr(e1),0);
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
253 case DRINDIRECT:
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
254 return code_drindirect(e2,caddr(e1),1);
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
255 #endif
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
256 #if LONGLONG_CODE
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
257 case LRINDIRECT:
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
258 return code_lrindirect(e2,caddr(e1),0);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
259 case LURINDIRECT:
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
260 return code_lrindirect(e2,caddr(e1),1);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
261 #endif
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
262 case ADDRESS:
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
263 if (car(e2)==REGISTER||car(e2)==DREGISTER||car(e2)==FREGISTER)
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
264 return register_to_lvar(e2); /* too late? */
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
265 else
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
266 return g_expr0(e2);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
267 case MINUS: /* ¥ì¥¸¥¹¥¿¤ËÂФ·¡¢negl¤ò¼Â¹Ô¤¹¤ì¤Ð¼Â¸½²Äǽ */
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 105
diff changeset
268 g_expr0(e2); code_neg(creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
269 return INT;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
270 #if FLOAT_CODE
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
271 case DMINUS:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
272 g_expr0(e2); code_dneg(creg,1);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
273 return DOUBLE;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
274 case FMINUS:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
275 g_expr0(e2); code_dneg(creg,0);
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
276 return FLOAT;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
277 #endif
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
278 case CONV:
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
279 g_expr0(e2);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
280 switch(caddr(e1)) {
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
281 #if FLOAT_CODE
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
282 case I2D: code_i2d(creg); return DOUBLE;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
283 case D2I: code_d2i(creg); return INT;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
284 case U2D: code_u2d(creg); return DOUBLE;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
285 case F2U: code_f2u(creg); return UNSIGNED;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
286 case I2F: code_i2f(creg); return FLOAT;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
287 case F2I: code_f2i(creg); return INT;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
288 case U2F: code_u2f(creg); return FLOAT;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
289 case D2U: code_d2u(creg); return UNSIGNED;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
290 case D2F: code_d2f(creg); return FLOAT;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
291 case F2D: code_f2d(creg); return DOUBLE;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
292 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
293 #if LONGLONG_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
294 case I2LL: code_i2ll(creg); return LONGLONG;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
295 case I2ULL: code_i2ull(creg); return ULONGLONG;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
296 case U2LL: code_u2ll(creg); return LONGLONG;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
297 case U2ULL: code_u2ull(creg); return ULONGLONG;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
298 case LL2I: code_ll2i(creg); return INT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
299 case LL2U: code_ll2u(creg); return UNSIGNED;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
300 case ULL2I: code_ull2i(creg); return INT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
301 case ULL2U: code_ull2u(creg); return UNSIGNED;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
302 #if FLOAT_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
303 case D2LL: code_d2ll(creg); return LONGLONG;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
304 case D2ULL: code_d2ull(creg); return ULONGLONG;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
305 case F2LL: code_f2ll(creg); return LONGLONG;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
306 case F2ULL: code_f2ull(creg); return ULONGLONG;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
307 case LL2D: code_ll2d(creg); return DOUBLE;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
308 case LL2F: code_ll2f(creg); return FLOAT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
309 case ULL2D: code_ull2d(creg); return DOUBLE;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
310 case ULL2F: code_ull2f(creg); return FLOAT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
311 case ULL2LL: code_ull2ll(creg); return LONGLONG;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
312 case ULL2ULL: code_ull2ull(creg); return ULONGLONG;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
313 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
314 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
315
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
316 default:
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
317 error(-1); return INT;
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
318 }
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
319 case BNOT: /* ~ */
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 105
diff changeset
320 g_expr0(e2); code_not(creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
321 return INT;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
322 case LNOT: /* ! */
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 105
diff changeset
323 g_expr0(e2); code_lnot(creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
324 return INT;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
325 case PREINC:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
326 creg=use_int(creg);
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
327 code_preinc(e1,e2,caddr(e1),1,cadddr(e1),creg);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
328 return INT;
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
329 case UPREINC:
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
330 creg=use_int(creg);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
331 code_preinc(e1,e2,caddr(e1),0,cadddr(e1),creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
332 return INT;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
333 case POSTINC:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
334 creg=use_int(creg);
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
335 code_postinc(e1,e2,caddr(e1),1,cadddr(e1),creg);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
336 return INT;
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
337 case UPOSTINC:
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
338 creg=use_int(creg);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
339 code_postinc(e1,e2,caddr(e1),0,cadddr(e1),creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
340 return INT;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
341 #if FLOAT_CODE
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
342 case DPREINC: /* ++d */
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
343 creg=use_double(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
344 code_dpreinc(e1,e2,1,creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
345 return DOUBLE;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
346 case DPOSTINC: /* d++ */
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
347 creg=use_double(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
348 code_dpostinc(e1,e2,1,creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
349 return DOUBLE;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
350 case FPREINC: /* ++f */
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
351 creg=use_float(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
352 code_dpreinc(e1,e2,0,creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
353 return FLOAT;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
354 case FPOSTINC: /* f++ */
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
355 creg=use_float(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
356 code_dpostinc(e1,e2,0,creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
357 return FLOAT;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
358 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
359 #if LONGLONG_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
360 case LPREINC: /* ++d */
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
361 creg=use_longlong(creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
362 code_lpreinc(e1,e2,creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
363 return DOUBLE;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
364 case LPOSTINC: /* d++ */
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
365 creg=use_longlong(creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
366 code_lpostinc(e1,e2,creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
367 return DOUBLE;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
368 #endif
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
369 case MUL: case UMUL:
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
370 case DIV: case UDIV:
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
371 case MOD: case UMOD:
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
372 case LSHIFT: case ULSHIFT: case RSHIFT: case URSHIFT:
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
373 case ADD: case SUB: case BAND: case EOR: case BOR: case CMP:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
374 creg=use_int(creg);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
375 machinop(e1);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
376 return INT;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
377 #if FLOAT_CODE
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
378 case DMUL: case DDIV:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
379 case DADD: case DSUB:
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 89
diff changeset
380 case DCMP: case DCMPGE:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
381 creg=use_double(creg);
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
382 dmachinop(e1,1);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
383 return DOUBLE;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
384 case FMUL: case FDIV:
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
385 case FADD: case FSUB:
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
386 case FCMP: case FCMPGE:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
387 creg=use_float(creg);
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
388 dmachinop(e1,0);
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
389 return FLOAT;
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
390 case DCOND:
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
391 case FCOND:
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
392 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
393 #if LONGLONG_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
394 case LMUL: case LUMUL:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
395 case LDIV: case LUDIV:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
396 case LMOD: case LUMOD:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
397 case LLSHIFT: case LULSHIFT: case LRSHIFT: case LURSHIFT:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
398 case LADD: case LSUB: case LBAND: case LEOR: case LBOR: case LCMP:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
399 creg=use_longlong(creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
400 lmachinop(e1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
401 return INT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
402 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
403 case COND: /* a?0:1 should consider non-brach instruction */
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
404 d = (car(e1)==LCOND?LONGLONG:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
405 car(e1)==COND?INT:car(e1)==DCOND?DOUBLE:FLOAT);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
406 e2=fwdlabel();
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
407 b_expr(cadr(e1),0,e2,0);
187
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
408 g_expr0(caddr(e1));
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
409 t = code_get_fixed_creg(creg,d);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
410 jmp(e3=fwdlabel());
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
411 fwddef(e2);
191
8646a4a9cde9 *** empty log message ***
kono
parents: 189
diff changeset
412 t1=g_expr0(cadddr(e1));
187
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
413 code_set_fixed_creg(t,1,d);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
414 fwddef(e3);
191
8646a4a9cde9 *** empty log message ***
kono
parents: 189
diff changeset
415 return t1;
164
1c2a9232ea93 mc.h generation
kono
parents: 162
diff changeset
416 case STASS:
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
417 sassign(e1);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
418 return RSTRUCT;
165
kono
parents: 164
diff changeset
419 case ASS: case CASS: case SASS:
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
420 assign(e1);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
421 return INT;
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
422 case ASSOP: case CASSOP: case CUASSOP:
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
423 assop(e1);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
424 return INT;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
425 #if FLOAT_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
426 case FASS: case DASS:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
427 dassign(e1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
428 return DOUBLE;
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
429 case DASSOP: case FASSOP:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
430 dassop(e1);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
431 return DOUBLE;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
432 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
433 #if LONGLONG_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
434 case LASS:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
435 lassign(e1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
436 return LONGLONG;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
437 case LASSOP: case LUASSOP:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
438 lassop(e1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
439 return LONGLONG ;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
440 #endif
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
441 case RSTRUCT:
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
442 g_expr0(e2);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
443 return RSTRUCT;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
444 case COMMA:
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
445 g_expr_u(e2);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
446 return g_expr0(caddr(e1));
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
447 case RETURN:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
448 creg = use_int(creg);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
449 n = (NMTBL *)e2;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
450 if (retcont==0)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
451 retcont=fwdlabel();
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
452 code_return(creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
453 return VOID;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
454 case ENVIRONMENT:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
455 creg = use_int(creg);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
456 code_environment(creg);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
457 return ADDRESS;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
458 default:
116
b14ff9671c90 register offset fix
kono
parents: 111
diff changeset
459 code_bool(e1); /* type? */
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
460 return INT;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
461 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
462 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
463
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
464 #define dual_ops(op) \
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
465 (op==GT|| op==UGT|| op==GE|| op==UGE|| op==LT|| \
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
466 op==ULT|| op==LE|| op==ULE|| \
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
467 op==DOP+GT|| op==DOP+GE|| op==DOP+LT|| op==DOP+LE || \
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 133
diff changeset
468 op==FOP+GT|| op==FOP+GE|| op==FOP+LT|| op==FOP+LE || \
4cfd24d1b929 fix power-pc basic test
kono
parents: 133
diff changeset
469 op==FOP+EQ|| op==FOP+NEQ || \
4cfd24d1b929 fix power-pc basic test
kono
parents: 133
diff changeset
470 op==EQ|| op==NEQ|| op==DOP+EQ|| op==DOP+NEQ)
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
471
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
472 int
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
473 rop_dual(op)
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
474 {
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
475 switch(op) {
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
476 case GT: return LT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
477 case UGT: return ULT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
478 case GE: return LE;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
479 case UGE: return ULE;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
480 case LT: return GT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
481 case ULT: return UGT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
482 case LE: return GE;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
483 case ULE: return UGE;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
484 case DOP+GT: return DOP+LT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
485 case DOP+GE: return DOP+LE;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
486 case DOP+LT: return DOP+GT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
487 case DOP+LE: return DOP+GE;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
488 case FOP+GT: return FOP+LT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
489 case FOP+GE: return FOP+LE;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
490 case FOP+LT: return FOP+GT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
491 case FOP+LE: return FOP+GE;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
492
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
493 case LOP+GT: return LOP+LT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
494 case LOP+GE: return LOP+LE;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
495 case LOP+LT: return LOP+GT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
496 case LOP+LE: return LOP+GE;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
497 case LOP+UGT: return FOP+ULT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
498 case LOP+UGE: return FOP+ULE;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
499 case LOP+ULT: return FOP+UGT;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
500 case LOP+ULE: return FOP+UGE;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
501 }
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
502 return op;
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
503 }
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
504
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
505 void
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
506 bexpr(int e1, char cond, int l1)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
507 {
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
508 int op = car(e1);
66
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
509 if (chk) return;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
510 gexpr_init();
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
511 if (dual_ops(op) && (car(caddr(e1))==CONST||(car(caddr(e1))==DCONST)))
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
512 b_expr(list3(rop_dual(op),caddr(e1),cadr(e1)),cond,l1,0);
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
513 else
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
514 b_expr(e1,cond,l1,0);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
515 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
516
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
517 void
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
518 b_expr(int e1, char cond, int l1,int err)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
519 {
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
520 int e2,l2,t;
132
07eb1249f07a *** empty log message ***
kono
parents: 128
diff changeset
521 if (!control) return;
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
522 l2 = 0;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
523 e2=cadr(e1);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
524 switch(car(e1)) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
525 case LNOT:
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
526 b_expr(e2,!cond,l1,0);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
527 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
528 case GT:
89
917947ffeb7c power pc version
kono
parents: 88
diff changeset
529 rexpr(e1,l1,code_gt(cond),INT);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
530 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
531 case UGT:
89
917947ffeb7c power pc version
kono
parents: 88
diff changeset
532 rexpr(e1,l1,code_ugt(cond),UNSIGNED);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
533 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
534 case GE:
89
917947ffeb7c power pc version
kono
parents: 88
diff changeset
535 rexpr(e1,l1,code_ge(cond),INT);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
536 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
537 case UGE:
89
917947ffeb7c power pc version
kono
parents: 88
diff changeset
538 rexpr(e1,l1,code_uge(cond),UNSIGNED);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
539 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
540 case LT:
89
917947ffeb7c power pc version
kono
parents: 88
diff changeset
541 rexpr(e1,l1,code_ge(!cond),INT);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
542 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
543 case ULT:
89
917947ffeb7c power pc version
kono
parents: 88
diff changeset
544 rexpr(e1,l1,code_uge(!cond),UNSIGNED);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
545 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
546 case LE:
89
917947ffeb7c power pc version
kono
parents: 88
diff changeset
547 rexpr(e1,l1,code_gt(!cond),INT);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
548 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
549 case ULE:
89
917947ffeb7c power pc version
kono
parents: 88
diff changeset
550 rexpr(e1,l1,code_ugt(!cond),UNSIGNED);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
551 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
552 case EQ:
89
917947ffeb7c power pc version
kono
parents: 88
diff changeset
553 rexpr(e1,l1,code_eq(cond),INT);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
554 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
555 case NEQ:
89
917947ffeb7c power pc version
kono
parents: 88
diff changeset
556 rexpr(e1,l1,code_eq(!cond),INT);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
557 return;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
558 #if FLOAT_CODE
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
559 case DOP+GT:
194
114e9d64b5cc *** empty log message ***
kono
parents: 191
diff changeset
560 case DOP+GE:
114e9d64b5cc *** empty log message ***
kono
parents: 191
diff changeset
561 case DOP+EQ:
114e9d64b5cc *** empty log message ***
kono
parents: 191
diff changeset
562 case DOP+NEQ:
114e9d64b5cc *** empty log message ***
kono
parents: 191
diff changeset
563 case FOP+GT:
114e9d64b5cc *** empty log message ***
kono
parents: 191
diff changeset
564 case FOP+GE:
114e9d64b5cc *** empty log message ***
kono
parents: 191
diff changeset
565 case FOP+EQ:
114e9d64b5cc *** empty log message ***
kono
parents: 191
diff changeset
566 case FOP+NEQ:
114e9d64b5cc *** empty log message ***
kono
parents: 191
diff changeset
567 drexpr(cadr(e1),caddr(e1),l1,car(e1));
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
568 return;
194
114e9d64b5cc *** empty log message ***
kono
parents: 191
diff changeset
569 case FOP+LT:
114e9d64b5cc *** empty log message ***
kono
parents: 191
diff changeset
570 drexpr(caddr(e1),cadr(e1),l1,FOP+GT);
114e9d64b5cc *** empty log message ***
kono
parents: 191
diff changeset
571 return;
114e9d64b5cc *** empty log message ***
kono
parents: 191
diff changeset
572 case FOP+LE:
114e9d64b5cc *** empty log message ***
kono
parents: 191
diff changeset
573 drexpr(caddr(e1),cadr(e1),l1,FOP+GE);
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
574 return;
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
575 case DOP+LT:
84
1a723130a2c7 condtional
kono
parents: 83
diff changeset
576 drexpr(caddr(e1),cadr(e1),l1,DOP+GT);
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
577 return;
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
578 case DOP+LE:
84
1a723130a2c7 condtional
kono
parents: 83
diff changeset
579 drexpr(caddr(e1),cadr(e1),l1,DOP+GE);
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
580 return;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
581 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
582 #if LONGLONG_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
583 case LOP+GT:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
584 case LOP+GE:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
585 case LOP+EQ:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
586 case LOP+NEQ:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
587 lrexpr(cadr(e1),caddr(e1),l1,car(e1));
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
588 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
589 case LOP+LT:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
590 lrexpr(caddr(e1),cadr(e1),l1,LOP+GT);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
591 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
592 case LOP+LE:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
593 lrexpr(caddr(e1),cadr(e1),l1,LOP+GE);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
594 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
595 #endif
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
596 case LAND:
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
597 b_expr(e2,0,cond?(l2=fwdlabel()):l1,0);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
598 b_expr(caddr(e1),cond,l1,0);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
599 if(cond) fwddef(l2);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
600 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
601 case LOR:
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
602 b_expr(e2,1,cond?l1:(l2=fwdlabel()),0);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
603 b_expr(caddr(e1),cond,l1,0);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
604 if(!cond) fwddef(l2);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
605 return;
167
0197ca125567 mips short
kono
parents: 166
diff changeset
606 case CRGVAR: case CURGVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
607 creg=use_int(creg);
167
0197ca125567 mips short
kono
parents: 166
diff changeset
608 code_cmp_crgvar(e1,1);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
609 jcond(l1,cond);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
610 return;
167
0197ca125567 mips short
kono
parents: 166
diff changeset
611 case SRGVAR: case SURGVAR:
0197ca125567 mips short
kono
parents: 166
diff changeset
612 creg=use_int(creg);
0197ca125567 mips short
kono
parents: 166
diff changeset
613 code_cmp_crgvar(e1,size_of_short);
0197ca125567 mips short
kono
parents: 166
diff changeset
614 jcond(l1,cond);
0197ca125567 mips short
kono
parents: 166
diff changeset
615 return;
0197ca125567 mips short
kono
parents: 166
diff changeset
616 case CRLVAR: case CURLVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
617 creg=use_int(creg);
167
0197ca125567 mips short
kono
parents: 166
diff changeset
618 code_cmp_crlvar(e2,1);
0197ca125567 mips short
kono
parents: 166
diff changeset
619 jcond(l1,cond);
0197ca125567 mips short
kono
parents: 166
diff changeset
620 return;
0197ca125567 mips short
kono
parents: 166
diff changeset
621 case SRLVAR: case SURLVAR:
0197ca125567 mips short
kono
parents: 166
diff changeset
622 creg=use_int(creg);
0197ca125567 mips short
kono
parents: 166
diff changeset
623 code_cmp_crlvar(e2,size_of_short);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
624 jcond(l1,cond);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
625 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
626 case RGVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
627 creg=use_int(creg);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
628 code_cmp_rgvar(e1);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
629 jcond(l1,cond);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
630 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
631 case RLVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
632 creg=use_int(creg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
633 code_cmp_rlvar(e2);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
634 jcond(l1,cond);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
635 return;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
636 #if FLOATC_DOE
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
637 case DRLVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
638 creg=use_double(creg);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
639 code_cmp_drlvar(e2,1);
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
640 jcond(l1,cond);
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
641 return;
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
642 case FRLVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
643 creg=use_float(creg);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
644 code_cmp_drlvar(e2,0);
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
645 jcond(l1,cond);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
646 return;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
647 case DRGVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
648 creg=use_double(creg);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
649 code_cmp_drgvar(e2,1);
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
650 jcond(l1,cond);
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
651 return;
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
652 case FRGVAR:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
653 creg=use_float(creg);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
654 code_cmp_drgvar(e2,0);
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
655 jcond(l1,cond);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
656 return;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
657 case FREGISTER:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
658 creg=use_float(creg);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
659 code_cmp_dregister(e2,0);
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
660 jcond(l1,cond);
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
661 return;
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
662 case DREGISTER:
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
663 creg=use_double(creg);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
664 code_cmp_dregister(e2,1);
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
665 jcond(l1,cond);
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
666 return;
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
667 case DCONST:
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
668 case FCONST:
132
07eb1249f07a *** empty log message ***
kono
parents: 128
diff changeset
669 if(control&&((dcadr(e2)!=0.0)^cond)) jmp(l1);
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
670 return;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
671 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
672 #if LONGLONG_DOE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
673 case LRLVAR:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
674 creg=use_longlong(creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
675 code_cmp_lrlvar(e2,1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
676 jcond(l1,cond);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
677 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
678 case LRGVAR:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
679 creg=use_longlong(creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
680 code_cmp_lrgvar(e2,1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
681 jcond(l1,cond);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
682 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
683 case LREGISTER:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
684 creg=use_longlong(creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
685 code_cmp_lregister(e2,1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
686 jcond(l1,cond);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
687 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
688 case LCONST:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
689 if(control&&((lcadr(e2)!=0)^cond)) jmp(l1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
690 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
691 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
692 case REGISTER:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
693 creg=use_int(creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
694 code_cmp_register(e2);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
695 jcond(l1,cond);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
696 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
697 case CONST:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
698 if(control&&((cond&&e2)||(!cond&&!e2))) jmp(l1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
699 return;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
700 default:
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
701 if(err) {
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
702 error(-1); return; /* recursive g_expr/b_expr */
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
703 }
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
704 t=g_expr(e1);
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
705 if (0) ;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
706 #if FLOAT_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
707 else if(t==FLOAT)
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
708 code_cmp_dregister(creg,0);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
709 else if(t==DOUBLE)
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
710 code_cmp_dregister(creg,1);
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
711 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
712 #if LONGLONG_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
713 else if(t==LONGLONG||t==ULONGLONG)
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
714 code_cmp_lregister(creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
715 #endif
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
716 else
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
717 code_cmp_register(creg);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
718 jcond(l1,cond);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
719 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
720 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
721 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
722
126
1d1612fe705a *** empty log message ***
kono
parents: 119
diff changeset
723 int
1d1612fe705a *** empty log message ***
kono
parents: 119
diff changeset
724 is_code(NMTBL *fnptr)
1d1612fe705a *** empty log message ***
kono
parents: 119
diff changeset
725 {
1d1612fe705a *** empty log message ***
kono
parents: 119
diff changeset
726 int type = fnptr->ty;
1d1612fe705a *** empty log message ***
kono
parents: 119
diff changeset
727 return type==CODE|| (type>0 && car(type)==CODE);
1d1612fe705a *** empty log message ***
kono
parents: 119
diff changeset
728 }
1d1612fe705a *** empty log message ***
kono
parents: 119
diff changeset
729
1d1612fe705a *** empty log message ***
kono
parents: 119
diff changeset
730 int
1d1612fe705a *** empty log message ***
kono
parents: 119
diff changeset
731 is_function(NMTBL *fnptr)
1d1612fe705a *** empty log message ***
kono
parents: 119
diff changeset
732 {
1d1612fe705a *** empty log message ***
kono
parents: 119
diff changeset
733 int type = fnptr->ty;
1d1612fe705a *** empty log message ***
kono
parents: 119
diff changeset
734 return type==FUNCTION || (type>0 && car(type)==FUNCTION);
1d1612fe705a *** empty log message ***
kono
parents: 119
diff changeset
735 }
1d1612fe705a *** empty log message ***
kono
parents: 119
diff changeset
736
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
737
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
738 static int
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
739 register_to_lvar(int e)
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
740 {
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
741 error(REG_ERR);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
742 return 0;
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
743 #if 0
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
744 ÅÓÃæ¤Ç¥ì¥¸¥¹¥¿¤«¤éLVAR¤ËÊѹ¹¤·¤Æ¤â¡¢´Ö¤Ë¹ç¤ï¤Ê¤¤¡£
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
745
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
746 NMTBL *n = (NMTBL*)caddr(e);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
747 int reg = cadr(e);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
748 int tag = car(e);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
749 int lvar;
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
750 int t;
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
751 if (!n||n==&null_nptr) error(REG_ERR);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
752 if (tag==REGISTER) {
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
753 n->dsp = new_lvar(size_of_int);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
754 t = INT;
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
755 } else if (tag==DREGISTER) {
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
756 n->dsp = new_lvar(size_of_double);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
757 t = DOUBLE;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
758 } else if (tag==FREGISTER) {
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
759 n->dsp = new_lvar(size_of_float);
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
760 t = DOUBLE;
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
761 } else if (tag==LREGISTER) {
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
762 n->dsp = new_lvar(size_of_longlong);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
763 t = LONGLONG;
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
764 } else error(-1);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
765 n->sc = LVAR;
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
766 lvar = list2(LVAR,n->dsp);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
767 g_expr_u(assign_expr0(list2(LVAR,n->dsp),list3(tag,reg,(int)n),t,t));
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
768 if (tag==REGISTER||tag==DREGISTER||tag==FREGISTER||tag==LREGISTER) {
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
769 free_register(reg);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
770 return g_expr0(lvar);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
771 #endif
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
772 }
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
773
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
774 /* goto arguments list */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
775 /* target list4(list2(tag,disp),cdr,ty,source_expr) */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
776 /* source expr=listn(tag,...) */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
777 /* source (after) list2(tag,disp) */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
778 /* source list list3(e,cdr,sz) */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
779
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
780 #define DEBUG_PARALLEL_ASSIGN 1
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
781
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
782 int
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
783 overrap(int t,int sz,int source)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
784 {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
785 int s,s0,s1;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
786 int t0=cadr(t);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
787 int t1=t0+sz;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
788 for(;source;source=cadr(source)) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
789 s=car(source); s0=cadr(s);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
790 if(car(s)==REGISTER && car(t)==REGISTER) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
791 if(s0==t0) return s;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
792 } else if (is_same_type(s,t)) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
793 s1=s0+caddr(source);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
794 #if DEBUG_PARALLEL_ASSIGN>1
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
795 printf("# ovedrrap source %d t0 %d t1 %d\n",car(car(t)),t0,t1);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
796 printf("# ovedrrap target %d s0 %d s1 %d\n",car(car(source)),s0,s1);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
797 printf("# ovedrrap equal = %d\n",((t0<=s0&&s0<t1)||(t0<s1&&s1<=t1)));
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
798 #endif
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
799 if((t0<=s0&&s0<t1)||(t0<s1&&s1<=t1)) return s;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
800 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
801 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
802 return 0;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
803 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
804
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
805 void
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
806 remove_target(int *target,int t,int *use)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
807 {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
808 int use0=*use;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
809 int reg;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
810 while(use0) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
811 if (car(use0)==t) {
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
812 reg = car(caddr(use0));
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
813 if (reg==REGISTER||reg==FREGISTER||reg==DREGISTER)
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
814 free_register(cadr(caddr(use0)));
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
815 break;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
816 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
817 use0 = cadr(use0);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
818 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
819 remove0(target,t);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
820 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
821
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
822 void
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
823 save_target(int t,int s,int *target,int *use,int sz,int ty)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
824 {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
825 int e1;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
826 /*¿·¤·¤¤¥ì¥¸¥¹¥¿(or ¥¹¥¿¥Ã¥¯)¤ò¼èÆÀ¤¹¤ë*/
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
827 if (sz==size_of_int && (e1=get_register())!=-1) {
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
828 e1=list3(REGISTER,e1,0);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
829 *use=list3(t,*use,e1);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
830 g_expr_u(assign_expr0(e1,s,ty,ty));
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
831 *target = append4(*target,t,ty,e1);
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
832 #if FLOAT_CODE
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
833 } else if (sz==size_of_double && (e1=get_dregister(1))!=-1) {
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
834 e1=list3(DREGISTER,e1,0);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
835 *use=list3(t,*use,e1);
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
836 g_expr_u(assign_expr0(e1,s,ty,ty));
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
837 *target = append4(*target,t,ty,e1);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
838 } else if (sz==size_of_float && (e1=get_dregister(0))!=-1) {
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
839 e1=list3(FREGISTER,e1,0);
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
840 *use=list3(t,*use,e1);
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
841 g_expr_u(assign_expr0(e1,s,ty,ty));
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
842 *target = append4(*target,t,ty,e1);
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
843 #endif
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
844 } else {
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
845 g_expr_u(assign_expr0((e1=list2(LVAR,new_lvar(sz))),s,ty,ty));
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
846 *target = append4(*target,t,ty,e1);
117
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
847 *use=list3(t,*use,e1);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
848 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
849 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
850
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
851 int
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
852 circular_dependency(int t,int s,int *target,int *source)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
853 {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
854 int target0=*target;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
855 int t1,sz,ty,s1;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
856 while(target0) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
857 if (cadddr(target0)==s) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
858 t1=car(target0);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
859 s=cadddr(target0);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
860 sz=size(ty=caddr(target0));
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
861 if(t==t1) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
862 #if DEBUG_PARALLEL_ASSIGN
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
863 printf("# circular dependency %d ty %d+%d sz %d\n",car(t1),ty,cadr(t1),sz);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
864 #endif
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
865 return 1;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
866 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
867 if ((s1=overrap(t1,sz,*source))) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
868 /* another overrap start over */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
869 return circular_dependency(t,s1,target,source);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
870 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
871 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
872 target0=cadr(target0);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
873 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
874 return 0;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
875 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
876
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
877 void
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
878 parallel_assign(int *target,int *source,int *processing,int *use)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
879 {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
880 int t,s,sz,ty,target0,s1;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
881 while(*target) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
882 target0=*target;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
883 while(target0) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
884 t=car(target0); s=cadddr(target0);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
885 sz=size(ty=caddr(target0));
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
886 if(car(t)==car(s) && cadr(t)==cadr(s)) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
887 /*½ñ¤­¹þ¤ßÀ褬¼«Ê¬¼«¿È*/
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
888 #if DEBUG_PARALLEL_ASSIGN
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
889 printf("# remove same %d ty %d+%d sz %d\n",car(t),ty,cadr(t),sz);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
890 #endif
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
891 remove_target(target,t,use);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
892 /* Ç˲õ¤µ¤ì¤Æ¤Ïº¤¤ë¤Î¤Ç¡¢source list¤«¤é¤Ï½ü¤«¤Ê¤¤ */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
893 } else if (!(s1=overrap(t,sz,*source))) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
894 /* ½Å¤Ê¤Ã¤Æ¤Ê¤¤¤Î¤Ç°Â¿´¤·¤Æ½ñ¤­¹þ¤á¤ë */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
895 #if DEBUG_PARALLEL_ASSIGN
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
896 printf("# normal assign %d ty %d+%d sz %d\n",car(t),ty,cadr(t),sz);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
897 #endif
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
898 g_expr_u(assign_expr0(t,s,ty,ty));
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
899 remove_target(target,t,use); remove0(source,s);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
900 } else {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
901 if(circular_dependency(t,s1,target,source)) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
902 #if DEBUG_PARALLEL_ASSIGN
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
903 printf("# saving %d ty %d+%d sz %d\n",car(t),ty,cadr(t),sz);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
904 #endif
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
905 remove_target(target,t,use); remove0(source,s);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
906 save_target(t,s,target,use,sz,ty);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
907 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
908 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
909 target0=cadr(target0);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
910 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
911 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
912 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
913
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
914 void
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
915 remove0(int *parent,int e)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
916 {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
917 int list;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
918 while ((list=*parent)) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
919 if (car(list)==e) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
920 *parent= cadr(list); return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
921 } else {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
922 parent=&cadr(list);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
923 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
924 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
925 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
926
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
927 /*
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
928 void
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
929 remove0_all(int *parent,int e)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
930 {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
931 int list;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
932 while ((list=*parent)) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
933 if (car(list)==e) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
934 *parent= cadr(list);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
935 } else {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
936 parent=&cadr(list);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
937 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
938 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
939 }
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
940 */
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
941
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
942 int
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
943 is_simple(int e1)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
944 {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
945 return (
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
946 e1==CONST || e1==FNAME || e1==LVAR || e1==REGISTER ||e1==DREGISTER ||
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
947 e1==FREGISTER || e1==LREGISTER ||
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
948 e1==GVAR || e1==RGVAR || e1==RLVAR || e1==CRLVAR || e1==CRGVAR ||
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
949 e1==DRLVAR || e1==FRLVAR || e1==LRLVAR ||
165
kono
parents: 164
diff changeset
950 e1==CURLVAR || e1==SURLVAR || e1==CURGVAR || e1==SURGVAR
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
951 );
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
952 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
953
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
954 int
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
955 is_same_type(int e1,int e2)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
956 {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
957 int ce1=car(e1);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
958 int ce2=car(e2);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
959 return (
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
960 (ce1==LVAR && (ce2==RLVAR||ce2==CRLVAR||ce2==FRLVAR||ce2==DRLVAR))
165
kono
parents: 164
diff changeset
961 || (ce1==LVAR && (ce2==SRLVAR||ce2==SURLVAR||ce2==CURLVAR))
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
962 || (ce2==LVAR && (ce1==RLVAR||ce1==CRLVAR||ce1==FRLVAR||ce1==DRLVAR))
165
kono
parents: 164
diff changeset
963 || (ce2==LVAR && (ce1==SRLVAR||ce1==SURLVAR||ce1==CURLVAR))
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
964 || (ce2==LVAR && (ce1==LRLVAR))
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
965 || (ce1==GVAR && (ce2==RGVAR||ce2==CRGVAR||ce2==FRGVAR||ce2==DRGVAR))
165
kono
parents: 164
diff changeset
966 || (ce1==GVAR && (ce2==SRGVAR||ce2==SURGVAR||ce2==CURGVAR))
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
967 || (ce2==GVAR && (ce1==RGVAR||ce1==CRGVAR||ce1==FRGVAR||ce1==DRGVAR))
165
kono
parents: 164
diff changeset
968 || (ce2==GVAR && (ce1==SRGVAR||ce1==SURGVAR||ce1==CURGVAR))
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
969 || (ce2==GVAR && (ce1==LRGVAR))
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
970 );
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
971 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
972
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
973 int
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
974 is_memory(int e1)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
975 {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
976 int ce1=car(e1);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
977 return (
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
978 ce1==LVAR ||ce1==RLVAR||ce1==CRLVAR || ce1==DRLVAR || ce1==LRLVAR ||
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
979 ce1==GVAR ||ce1==RGVAR||ce1==CRGVAR || ce1==DRGVAR || ce1==LRGVAR ||
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
980 ce1==FRLVAR || ce1==FRGVAR ||
165
kono
parents: 164
diff changeset
981 ce1==CURGVAR ||ce1==SURGVAR||ce1==SRGVAR ||
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
982 ce1==REGISTER|| ce1==DREGISTER || ce1==FREGISTER
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
983 );
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
984 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
985
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
986
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
987 void
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
988 jump(int e1, int env)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
989 {
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
990 int e2,e3,e4,sz,arg_size,ty,regs,fregs;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
991 int t0,s0,r,reg;
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
992 NMTBL *code0 = 0;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
993 int target = 0;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
994 int source = 0;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
995 int processing = 0;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
996 int use = 0;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
997
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
998 /* ¤Þ¤º¡¢¥µ¥¤¥º¤ò·×»»¤·¤Ê¤¬¤é¡¢·è¤Þ¤Ã¤¿·Á¤ËÍ¡£ */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
999
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1000 arg_size = 0; regs = 0;
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1001 fregs = 0;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1002 for (e3 = reverse0(caddr(e1)); e3; e3 = cadr(e3)) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1003 e2 = car(e3); sz = size(ty=caddr(e3));
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1004 if (scalar(ty) && (r = get_input_register_var(regs,0,1))) {
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1005 target=list4(r,target,ty,e2); regs++;
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1006 } else if (ty==FLOAT && (r = get_input_dregister_var(fregs,0,1,0))) {
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1007 target=list4(r, target,ty,e2); fregs++;
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1008 } else if (ty==DOUBLE && (r = get_input_dregister_var(fregs,0,1,1))) {
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1009 target=list4(r, target,ty,e2); fregs++;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1010 } else {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1011 target=list4(list2(LVAR,0), target,ty,e2);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1012 }
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1013 /* keep arg space for register variables */
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1014 arg_size += sz;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1015 #if DEBUG_PARALLEL_ASSIGN
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1016 printf("# target %d ty %d+%d sz %d\n",car(car(target)),ty,cadr(car(target)),sz);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1017 #endif
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1018 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1019
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1020 /* disp ¤òÈô¤ÓÀè»÷¹ç¤ï¤»¤Æ½¤Àµ */
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
1021 if (is_code(fnptr)) {
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1022 if (-arg_size<disp) disp = -arg_size;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1023 } else {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1024 if (disp_offset-arg_size<disp) disp = disp_offset-arg_size;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1025 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1026
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1027 /* Ê£»¨¤Ê¼°¤òÁ°¤â¤Ã¤Æ·×»»¤·¤Æ¤ª¤¯ */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1028 /* ɬÍפʤé¶É½êÊÑ¿ô¤òÍѤ¤¤ë¡£ */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1029 /* ¶É½êÊÑ¿ô¤Ø¤Î¥ª¥Õ¥»¥Ã¥È¤ò³Ð¤¨¤Æ¤ª¤¯ */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1030
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1031 for (e2 = target; e2; e2 = cadr(e2)) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1032 t0=car(e2); s0=cadddr(e2);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1033 sz=size(ty=caddr(e2));
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1034 if(car(t0)==LVAR) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1035 /* ¤³¤³¤Ç¡¢½ñ¹þÀ襢¥É¥ì¥¹¤ò·è¤á¤ë */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1036 cadr(t0)=-arg_size;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1037 }
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1038 arg_size-=sz;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1039 if (!is_simple(car(s0))) {
94
1ad7045741a7 float dbinop fix
kono
parents: 92
diff changeset
1040 g_expr_u(assign_expr0((e4=list2(LVAR,new_lvar(sz))),s0,ty,ty));
117
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
1041 use=list3(ty,use,e1);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1042 cadddr(e2)=e4;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1043 s0=e4;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1044 } else if (is_same_type(t0,s0)) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1045 if(cadr(t0)==cadr(s0)) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1046 #if DEBUG_PARALLEL_ASSIGN
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1047 printf("# remove same memory %d ty %d+%d sz %d\n",car(t0),ty,cadr(t0),sz);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1048 #endif
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1049 /* we should check size also (but currently useless */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1050 remove0(&target,t0);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1051 /* still we have source to avoid overwrite */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1052 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1053 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1054 if(is_memory(s0)) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1055 source=list3(s0,source,sz);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1056 #if DEBUG_PARALLEL_ASSIGN
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1057 printf("# source %d ty %d+%d sz %d\n",car(car(source)),ty,cadr(car(source)),sz);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1058 #endif
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1059 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1060 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1061
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1062 /* compute jump address */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1063 e2 = cadr(e1);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1064 if (car(e2) == FNAME) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1065 code0=(NMTBL *)cadr(e2);
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
1066 if (!is_code(code0)) {
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1067 error(TYERR); return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1068 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1069 } else { /* indirect */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1070 g_expr(e2);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1071 emit_push();
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1072 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1073 if (env) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1074 g_expr(env);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1075 emit_push();
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1076 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1077
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1078 /* ÊÂÎóÂåÆþ¤ò¼Â¹Ô */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1079 parallel_assign(&target,&source,&processing,&use);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1080 while (use) {
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
1081 reg = car(caddr(use));
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1082 if (reg==REGISTER||reg==FREGISTER||reg==DREGISTER||reg==LREGISTER)
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1083 free_register(cadr(caddr(use)));
117
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
1084 else if (car(caddr(use))==LVAR)
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
1085 free_lvar(cadr(caddr(use)));
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1086 use=cadr(use);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1087 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1088 if(target) error(-1);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1089
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1090 if (env) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1091 /* change the frame pointer */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1092 e3 = emit_pop(0);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1093 code_frame_pointer(e3);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1094 emit_pop_free(e3);
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
1095 } else if (is_function(fnptr)) {
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1096 if (car(e2) != FNAME) {
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1097 e2 = emit_pop(0);
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1098 code_fix_frame_pointer(disp_offset);
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1099 code_indirect_jmp(e2);
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1100 emit_pop_free(e2);
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1101 return;
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1102 }
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1103 code_fix_frame_pointer(disp_offset);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1104 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1105
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1106 if (car(e2) == FNAME) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1107 code_jmp(code0->nm);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1108 } else {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1109 e2 = emit_pop(0);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1110 code_indirect_jmp(e2);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1111 emit_pop_free(e2);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1112 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1113 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1114
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1115 void
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1116 machinop(int e1)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1117 {
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1118 int e2,e3,op,v;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1119
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1120 e2 = cadr(e1);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1121 op = car(e1);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1122 e3 = caddr(e1);
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1123 if (car(e3)==CONST && code_const_op_p(op,v=cadr(e3))) {
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1124 g_expr(e2);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1125 oprtc(op,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1126 return;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1127 }
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1128 g_expr(e3);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1129 emit_push();
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1130 g_expr(e2);
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1131 tosop(op,(e2=pop_register()));
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1132 emit_pop_free(e2);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1133 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1134 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1135
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1136 #if FLOAT_CODE
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1137 void
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
1138 dmachinop(int e1,int d)
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1139 {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1140 int e2,e3,op;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1141
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1142 e2 = cadr(e1);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1143 op = car(e1);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1144 e3 = caddr(e1);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1145 g_expr(e3);
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
1146 emit_dpush(d);
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1147 g_expr(e2);
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
1148 dtosop(car(e1),(e2=emit_dpop(d)));
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1149 emit_dpop_free(e2,d);
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1150 return;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1151 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1152 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1153
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1154 #if LONGLONG_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1155 void
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1156 lmachinop(int e1)
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1157 {
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1158 int e2,e3,op;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1159
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1160 e2 = cadr(e1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1161 op = car(e1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1162 e3 = caddr(e1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1163 g_expr(e3);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1164 emit_lpush();
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1165 g_expr(e2);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1166 ltosop(car(e1),(e2=emit_lpop()));
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1167 emit_lpop_free(e2);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1168 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1169 }
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1170 #endif
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1171
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1172 void
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1173 sassign(int e1)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1174 {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1175 int e2,e3,e4,sz,xreg,det;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1176
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1177 /* structure assignment */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1178 e2 = cadr(e1); /* pointer variable to the struct */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1179 e3 = cadr(e2); /* offset of the variable (distination) */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1180 e4 = caddr(e1); /* right value (source) */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1181 sz = cadddr(e1); /* size of struct or union */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1182 g_expr(e4);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1183 emit_push();
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1184 g_expr(e2);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1185 xreg = emit_pop(0);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1186 /* °ìÈÌŪ¤Ë¤Ï¥³¥Ô¡¼¤Î¥ª¡¼¥Ð¥é¥Ã¥×¤Î¾õ¶·¤Ï¼Â¹Ô»þ¤Ë¤·¤«¤ï¤«¤é¤Ê¤¤ */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1187 /* ¤·¤«¤·¡¢¤ï¤«¤ë¾ì¹ç¤â¤¢¤ë */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1188 if (car(e4)==RSTRUCT) e4=cadr(e4);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1189 if (is_same_type(e2,e4)) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1190 if(cadr(e2)<cadr(e4)) sz=-sz;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1191 det=1;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1192 } else {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1193 det = 0;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1194 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1195 emit_copy(xreg,creg,sz,0,1,det);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1196 emit_pop_free(xreg);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1197 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1198 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1199
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1200 void
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1201 assign_opt(int e5,int e2,int e4,int byte)
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1202 {
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1203 int reg;
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1204 /* e2=e4 */
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1205 if (e5==REGISTER) {
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1206 reg = cadr(e4);
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1207 switch(car(e2)) {
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1208 case GVAR: code_assign_gvar(e2,reg,byte); return;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1209 case LVAR: code_assign_lvar(cadr(e2),reg,byte); return;
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1210 case REGISTER: code_assign_register(cadr(e2),byte,reg); return;
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1211 }
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1212 g_expr(e2);
154
3edd10355434 fix assign_opt and conv.c
kono
parents: 151
diff changeset
1213 code_assign(creg,byte,reg);
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1214 return;
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1215 }
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1216 /* e2 is register now */
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1217 if (car(e2)!=REGISTER) error(-1);
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1218 reg = cadr(e2);
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1219 switch(e5) {
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
1220 case CRGVAR:
165
kono
parents: 164
diff changeset
1221 case CURGVAR: code_crgvar(e4,reg,e5==CRGVAR,1); return;
kono
parents: 164
diff changeset
1222 case SRGVAR:
kono
parents: 164
diff changeset
1223 case SURGVAR: code_crgvar(e4,reg,e5==SRGVAR,size_of_short); return;
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1224 case RGVAR: code_rgvar(e4,reg); return;
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
1225 case CRLVAR:
165
kono
parents: 164
diff changeset
1226 case CURLVAR: code_crlvar(cadr(e4),reg,e5==CRLVAR,1); return;
kono
parents: 164
diff changeset
1227 case SRLVAR:
kono
parents: 164
diff changeset
1228 case SURLVAR: code_crlvar(cadr(e4),reg,e5==SRLVAR,size_of_short); return;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1229 case RLVAR: code_rlvar(cadr(e4),reg); return;
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1230 case GVAR: code_gvar(e4,reg); return;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1231 case LVAR: code_lvar(cadr(e4),reg); return;
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1232 case CONST: code_const(cadr(e4),reg); return;
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1233 case ADDRESS:
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1234 if (car(cadr(e4))==STRING) code_string(cadr(e4),reg);
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1235 else code_gvar(cadr(e4),reg);
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1236 return;
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1237 case FNAME: code_fname((NMTBL*)cadr(e4),reg); return;
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1238 case STRING: code_string(e4,reg); return;
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 133
diff changeset
1239 default: error(-1);
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1240 }
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1241 }
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1242
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1243 void
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1244 assign(int e1)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1245 {
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1246 int e2,e4,byte,e5;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1247
166
9e55cc5551fb *** empty log message ***
kono
parents: 165
diff changeset
1248 byte=(car(e1) == CASS)?1:(car(e1) == SASS)?size_of_short:0;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1249 /* e2=e4 */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1250 e2 = cadr(e1);
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1251 e4 = caddr(e1);e5=car(e4);
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1252 if (!use && (
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1253 (e5==REGISTER) ||
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1254 (car(e2)==REGISTER&&(
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1255 e5== CRGVAR || e5== CRLVAR || e5== RGVAR || e5== RLVAR ||
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
1256 e5== CURGVAR || e5== CURLVAR ||
165
kono
parents: 164
diff changeset
1257 e5== SURGVAR || e5== SURLVAR ||
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1258 e5== GVAR || e5== LVAR ||
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1259 e5== CONST || e5== FNAME || e5== STRING ||
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1260 (e5==ADDRESS&&car(cadr(e4))==STRING) ||
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1261 (e5==ADDRESS&&car(cadr(e4))==GVAR) )))) {
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
1262 creg = use_int(creg);
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1263 assign_opt(e5,e2,e4,byte);
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1264 return;
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1265 }
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1266 switch(car(e2)) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1267 case GVAR: /* i=3 */
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1268 g_expr(e4);
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1269 code_assign_gvar(e2,creg,byte);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1270 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1271 case LVAR:
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1272 g_expr(e4);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1273 code_assign_lvar(cadr(e2),creg,byte);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1274 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1275 case REGISTER:
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1276 g_expr(e4);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1277 if (creg!=cadr(e2))
111
7aa449aff3e6 floating point
kono
parents: 109
diff changeset
1278 code_assign_register(cadr(e2),byte,creg);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1279 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1280 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1281 g_expr(e2);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1282 emit_push();
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1283 g_expr(e4);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1284 e2 = emit_pop(0);
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1285 code_assign(e2,byte,creg);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1286 emit_pop_free(e2);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1287 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1288 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1289
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1290 #if FLOAT_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1291
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1292 void
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1293 dassign_opt(int e5,int e2,int e4,int d)
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1294 {
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1295 int reg;
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1296 /* e2=e4 */
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1297 if (e5==DREGISTER||e5==FREGISTER) {
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1298 reg = cadr(e4);
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1299 switch(car(e2)) {
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1300 case GVAR: /* i=3 */
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1301 code_dassign_gvar(e2,reg,d);
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1302 return;
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1303 case LVAR:
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1304 code_dassign_lvar(cadr(e2),reg,d);
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1305 return;
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1306 case DREGISTER:
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1307 case FREGISTER:
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1308 if (reg!=cadr(e2))
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1309 code_dassign_dregister(cadr(e2),d,reg);
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1310 return;
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 133
diff changeset
1311 default:
4cfd24d1b929 fix power-pc basic test
kono
parents: 133
diff changeset
1312 error(-1);
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1313 }
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1314 }
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1315 /* e2 is register now */
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1316 if (car(e2)!=DREGISTER && car(e2)!=FREGISTER) error(-1);
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1317 reg = cadr(e2);
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1318 switch(e5) {
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 133
diff changeset
1319 case FRGVAR:
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1320 case DRGVAR: code_drgvar(e4,d,reg); return;
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 133
diff changeset
1321 case FRLVAR:
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1322 case DRLVAR: code_drlvar(cadr(e4),d,reg); return;
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 133
diff changeset
1323 case FCONST:
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1324 case DCONST: code_dconst(e4,reg,1); return;
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 133
diff changeset
1325 default:
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1326 error(-1);
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1327 }
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1328 }
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1329
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1330 void
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1331 dassign(int e1)
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1332 {
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1333 int e2,e3,e4,d,e5;
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1334
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1335 /* e2=e4 */
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1336 e2 = cadr(e1);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1337 e3 = cadr(e2);
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1338 e4 = caddr(e1); e5=car(e4);
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1339 d = (car(e1)==LASS)?2:(car(e1)==DASS)?1:0;
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1340 if (!use && (
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1341 (e5==DREGISTER) || (e5==FREGISTER) ||
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
1342 (car(e2)==DREGISTER&&(e5==DRGVAR||e5==DRLVAR||e5==DCONST))||
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
1343 (car(e2)==DREGISTER&&(e5==FRGVAR||e5==FRLVAR||e5==FCONST))
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1344 )) {
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
1345 creg = d?use_double(creg):use_float(creg);
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1346 dassign_opt(e5,e2,e4,d);
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1347 return;
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1348 }
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1349 switch(car(e2)) {
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1350 case GVAR:
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1351 g_expr(e4);
151
81032a1b8a5d MIPS continue
kono
parents: 147
diff changeset
1352 creg = d?use_double(creg):use_float(creg);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
1353 code_dassign_gvar(e2,creg,d);
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1354 return;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1355 case LVAR:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1356 g_expr(e4);
151
81032a1b8a5d MIPS continue
kono
parents: 147
diff changeset
1357 creg = d?use_double(creg):use_float(creg);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
1358 code_dassign_lvar(cadr(e2),creg,d);
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1359 return;
111
7aa449aff3e6 floating point
kono
parents: 109
diff changeset
1360 case DREGISTER:
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1361 case FREGISTER:
111
7aa449aff3e6 floating point
kono
parents: 109
diff changeset
1362 g_expr(e4);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
1363 if (creg!=cadr(e2)) {
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
1364 if (d) creg = use_double(creg); else creg = use_float(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
1365 code_dassign_dregister(cadr(e2),d,creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
1366 }
111
7aa449aff3e6 floating point
kono
parents: 109
diff changeset
1367 return;
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1368 }
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1369 g_expr(e2);
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1370 emit_push();
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1371 g_expr(e4);
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1372 e2 = emit_pop(0);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
1373 code_dassign(e2,creg,d);
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1374 emit_pop_free(e2);
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1375 return;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1376 }
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1377
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1378 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1379
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1380 #if LONGLONG_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1381
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1382 void
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1383 lassign_opt(int e5,int e2,int e4)
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1384 {
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1385 int reg;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1386 /* e2=e4 */
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1387 if (e5==LREGISTER) {
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1388 reg = cadr(e4);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1389 switch(car(e2)) {
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1390 case GVAR: /* i=3 */
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1391 code_lassign_gvar(e2,reg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1392 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1393 case LVAR:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1394 code_lassign_lvar(cadr(e2),reg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1395 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1396 case LREGISTER:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1397 if (reg!=cadr(e2))
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1398 code_lassign_lregister(cadr(e2),reg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1399 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1400 default:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1401 error(-1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1402 }
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1403 }
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1404 /* e2 is register now */
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1405 if (car(e2)!=LREGISTER) error(-1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1406 reg = cadr(e2);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1407 switch(e5) {
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1408 case LRGVAR: code_lrgvar(e4,reg); return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1409 case LRLVAR: code_lrlvar(cadr(e4),reg); return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1410 case LCONST: code_lconst(e4,reg); return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1411 default:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1412 error(-1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1413 }
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1414 }
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1415
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1416 void
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1417 lassign(int e1)
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1418 {
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1419 int e2,e3,e4,e5;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1420
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1421 /* e2=e4 */
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1422 e2 = cadr(e1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1423 e3 = cadr(e2);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1424 e4 = caddr(e1); e5=car(e4);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1425 if (!use && (
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1426 (e5==LREGISTER) ||
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1427 (car(e2)==LREGISTER&&(e5==LRGVAR||e5==LRLVAR||e5==LCONST))
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1428 )) {
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1429 creg = use_longlong(creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1430 lassign_opt(e5,e2,e4);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1431 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1432 }
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1433 switch(car(e2)) {
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1434 case GVAR:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1435 g_expr(e4);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1436 creg = use_longlong(creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1437 code_lassign_gvar(e2,creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1438 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1439 case LVAR:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1440 g_expr(e4);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1441 creg = use_longlong(creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1442 code_lassign_lvar(cadr(e2),creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1443 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1444 case LREGISTER:
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1445 g_expr(e4);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1446 if (creg!=cadr(e2)) {
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1447 creg = use_longlong(creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1448 code_lassign_lregister(cadr(e2),creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1449 }
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1450 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1451 }
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1452 g_expr(e2);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1453 emit_lpush();
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1454 g_expr(e4);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1455 e2 = emit_lpop();
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1456 code_lassign(e2,creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1457 emit_lpop_free(e2);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1458 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1459 }
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1460
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1461 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1462
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1463 void
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1464 assop(int e1)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1465 {
165
kono
parents: 164
diff changeset
1466 int e2,e3,byte,op,sign,size;
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1467
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1468 /* e2 op= e3 */
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
1469 if (car(e1) == CUASSOP) {
165
kono
parents: 164
diff changeset
1470 byte = 1; sign = 0; size = 1;
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
1471 } else if (car(e1) == CASSOP) {
165
kono
parents: 164
diff changeset
1472 byte = 1; sign = 1; size = 1;
kono
parents: 164
diff changeset
1473 } else if (car(e1) == SUASSOP) {
kono
parents: 164
diff changeset
1474 byte = size_of_short; sign = 0; size = size_of_short;
kono
parents: 164
diff changeset
1475 } else if (car(e1) == SASSOP) {
kono
parents: 164
diff changeset
1476 byte = size_of_short; sign = 1; size = size_of_short;
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
1477 } else {
165
kono
parents: 164
diff changeset
1478 byte = 0; sign = 1; size = size_of_int;
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
1479 }
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1480 e2 = cadr(e1);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1481 if (car(e2)==INDIRECT) e2=cadr(e2);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1482 e3 = caddr(e1);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1483 op = cadddr(e1);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1484
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
1485 creg = use_int(creg);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1486 g_expr(e3);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1487 if (car(e2)==REGISTER) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1488 code_register_assop(cadr(e2),op,byte);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1489 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1490 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1491 emit_push();
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1492 g_expr(e2);
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
1493 code_assop(op,byte,sign);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1494 return;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1495 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1496
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1497 #if FLOAT_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1498
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1499 void
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1500 dassop(int e1)
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1501 {
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1502 int e2,e3,op,d;
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1503
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1504 /* e2 op= e3 */
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1505 d = (car(e1) == DASSOP);
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1506 e2 = cadr(e1);
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1507 if (car(e2)==INDIRECT) e2=cadr(e2);
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1508 e3 = caddr(e1);
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1509 op = cadddr(e1);
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1510
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 144
diff changeset
1511 creg = d?use_double(creg):use_float(creg);
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1512 g_expr(e3);
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
1513 emit_dpush(d);
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1514 g_expr(e2);
144
56211702f298 creg/freg continue
kono
parents: 139
diff changeset
1515 if (car(e2)==DREGISTER||car(e2)==FREGISTER) {
56211702f298 creg/freg continue
kono
parents: 139
diff changeset
1516 /* code_register_dassop(cadr(e2),op,d); */
56211702f298 creg/freg continue
kono
parents: 139
diff changeset
1517 error(-1); /* unsupported now */
56211702f298 creg/freg continue
kono
parents: 139
diff changeset
1518 return;
56211702f298 creg/freg continue
kono
parents: 139
diff changeset
1519 }
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1520 code_dassop(op,d);
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1521 return;
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1522 }
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1523
195
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1524 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1525
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1526 #if LONGLONG_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1527
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1528 void
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1529 lassop(int e1)
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1530 {
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1531 int e2,e3,op;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1532
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1533 /* e2 op= e3 */
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1534 e2 = cadr(e1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1535 if (car(e2)==INDIRECT) e2=cadr(e2);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1536 e3 = caddr(e1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1537 op = cadddr(e1);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1538
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1539 creg = use_longlong(creg);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1540 g_expr(e3);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1541 emit_lpush();
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1542 g_expr(e2);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1543 if (car(e2)==LREGISTER) {
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1544 /* code_register_lassop(cadr(e2),op); */
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1545 error(-1); /* unsupported now */
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1546 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1547 }
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1548 code_lassop(op);
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1549 return;
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1550 }
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1551
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1552 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 194
diff changeset
1553
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 94
diff changeset
1554 void
185d2cc6a3a9 *** empty log message ***
kono
parents: 94
diff changeset
1555 cmpdimm(int e, int csreg)
185d2cc6a3a9 *** empty log message ***
kono
parents: 94
diff changeset
1556 {
185d2cc6a3a9 *** empty log message ***
kono
parents: 94
diff changeset
1557 code_cmpdimm(e, csreg);
185d2cc6a3a9 *** empty log message ***
kono
parents: 94
diff changeset
1558 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 94
diff changeset
1559
185d2cc6a3a9 *** empty log message ***
kono
parents: 94
diff changeset
1560 int
185d2cc6a3a9 *** empty log message ***
kono
parents: 94
diff changeset
1561 csvalue()
185d2cc6a3a9 *** empty log message ***
kono
parents: 94
diff changeset
1562 {
185d2cc6a3a9 *** empty log message ***
kono
parents: 94
diff changeset
1563 return code_csvalue();
185d2cc6a3a9 *** empty log message ***
kono
parents: 94
diff changeset
1564 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 94
diff changeset
1565
185d2cc6a3a9 *** empty log message ***
kono
parents: 94
diff changeset
1566
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1567 int
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1568 fwdlabel(void)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1569 {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1570 return labelno++;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1571 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1572
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1573 void
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1574 fwddef(int l)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1575 {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1576 control=1;
66
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1577 if (!chk)
92
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
1578 code_label(l);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1579 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1580
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1581 int
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1582 backdef(void)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1583 {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1584 control=1;
66
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1585 if (!chk)
92
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
1586 code_label(labelno);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1587 return labelno++;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1588 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1589
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1590 void
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1591 def_label(int cslabel, int dlabel)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1592 {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1593 int fl;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1594
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1595 fl = 0;
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1596 if (control) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1597 jmp(fl=fwdlabel());
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1598 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1599 fwddef(cslabel);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1600 if (dlabel)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1601 jmp(dlabel);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1602 if (fl) {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1603 fwddef(fl);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1604 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1605 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1606
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1607 void
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1608 gen_source(char *s)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1609 {
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1610 printf("%s",s);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1611 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1612
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1613 void
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1614 ret(void)
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1615 {
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 105
diff changeset
1616 code_set_return_register(1);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1617 jmp(retlabel);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1618 }
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1619
66
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1620 void
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1621 opening(char *filename)
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1622 {
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1623 emit_init();
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1624 if (!chk)
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1625 code_opening(filename);
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1626 }
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1627
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1628 void
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1629 closing()
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1630 {
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1631 if (!chk)
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1632 code_closing();
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1633 }
0b068058dd67 *** empty log message ***
kono
parents: 61
diff changeset
1634
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1635 int
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1636 contains_in_list(int e,int type)
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1637 {
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1638 while(e) {
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1639 if(contains(car(e),type)) return 1;
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1640 e = cadr(e);
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1641 }
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1642 return 0;
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1643 }
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1644
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1645 int
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1646 contains(int e,int type)
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1647 {
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1648 while(e) {
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1649 if (car(e)==type) return 1;
164
1c2a9232ea93 mc.h generation
kono
parents: 162
diff changeset
1650 if (LIST_ARGS(car(e))){
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1651 /* list arguments */
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1652 return contains_in_list(caddr(e),type);
164
1c2a9232ea93 mc.h generation
kono
parents: 162
diff changeset
1653 } else if (UNARY_ARGS(car(e))) {
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1654 /* unary operators */
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1655 e = cadr(e);
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1656 continue;
164
1c2a9232ea93 mc.h generation
kono
parents: 162
diff changeset
1657 } else if (BINARY_ARGS(car(e))) {
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1658 /* biary operators */
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1659 if (contains(cadr(e),type)) return 1;
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1660 e = caddr(e);
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1661 continue;
164
1c2a9232ea93 mc.h generation
kono
parents: 162
diff changeset
1662 } else if (TARNARY_ARGS(car(e))) {
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1663 /* tarary operators */
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1664 if (contains(cadr(e), type)) return 1;
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1665 if (contains(caddr(e),type)) return 1;
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1666 e = cadddr(e);
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1667 continue;
164
1c2a9232ea93 mc.h generation
kono
parents: 162
diff changeset
1668 } else if (NULLARY_ARGS(car(e))) {
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 133
diff changeset
1669 /* nullary operators */
4cfd24d1b929 fix power-pc basic test
kono
parents: 133
diff changeset
1670 return 0;
164
1c2a9232ea93 mc.h generation
kono
parents: 162
diff changeset
1671 } else {
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 133
diff changeset
1672 fprintf(stderr,"Unknown Tree ID %d\n",car(e));
4cfd24d1b929 fix power-pc basic test
kono
parents: 133
diff changeset
1673 error(-1);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1674 return 0;
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1675 }
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1676 }
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1677 return 0;
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1678 }
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1679
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents:
diff changeset
1680 /* end */