comparison src/insn_gen.c @ 62:da1337724ecd

Moved insn_gen8 to simplified expression evaluator
author lost
date Mon, 05 Jan 2009 00:57:37 +0000
parents 538e15927776
children 31d8e85706e7
comparison
equal deleted inserted replaced
61:73423b66e511 62:da1337724ecd
129 insn_gen_aux(as, l, p, opnum, -1); 129 insn_gen_aux(as, l, p, opnum, -1);
130 } 130 }
131 131
132 OPFUNC(insn_gen8) 132 OPFUNC(insn_gen8)
133 { 133 {
134 int rval;
135
136 if (**p == '#')
137 {
138 lwasm_emitop(as, l, instab[opnum].ops[3]);
139 (*p)++;
140 if (lwasm_expr_result(as, l, p, EXPR_PASS2CONST | EXPR_BYTE, &rval) < 0)
141 rval = 0;
142 lwasm_emit(as, l, rval & 0xff);
143 return;
144 }
145
146 insn_gen_aux(as, l, p, opnum, -1);
147 }
148
149 OPFUNC(insn_gen16)
150 {
134 lwasm_expr_stack_t *s; 151 lwasm_expr_stack_t *s;
135 int rval; 152 int rval;
136 153
137 if (**p == '#') 154 if (**p == '#')
138 { 155 {
149 if (!lwasm_expr_is_constant(s)) 166 if (!lwasm_expr_is_constant(s))
150 register_error(as, l, 2, "Incomplete reference"); 167 register_error(as, l, 2, "Incomplete reference");
151 rval = lwasm_expr_get_value(s); 168 rval = lwasm_expr_get_value(s);
152 lwasm_expr_stack_free(s); 169 lwasm_expr_stack_free(s);
153 } 170 }
154 if (rval < -128 || rval > 255) 171 lwasm_emit(as, l, (rval >> 8) & 0xff);
155 register_error(as, l, 2, "Byte overflow"); 172 lwasm_emit(as, l, rval & 0xff);
156 lwasm_emit(as, l, rval & 0xff); 173 return;
157 return; 174 }
158 } 175
159 176 insn_gen_aux(as, l, p, opnum, -1);
160 insn_gen_aux(as, l, p, opnum, -1); 177 }
161 } 178
162 179 OPFUNC(insn_gen32)
163 OPFUNC(insn_gen16)
164 { 180 {
165 lwasm_expr_stack_t *s; 181 lwasm_expr_stack_t *s;
166 int rval; 182 int rval;
167 183
168 if (**p == '#') 184 if (**p == '#')
180 if (!lwasm_expr_is_constant(s)) 196 if (!lwasm_expr_is_constant(s))
181 register_error(as, l, 2, "Incomplete reference"); 197 register_error(as, l, 2, "Incomplete reference");
182 rval = lwasm_expr_get_value(s); 198 rval = lwasm_expr_get_value(s);
183 lwasm_expr_stack_free(s); 199 lwasm_expr_stack_free(s);
184 } 200 }
201 lwasm_emit(as, l, (rval >> 24) & 0xff);
202 lwasm_emit(as, l, (rval >> 16) & 0xff);
185 lwasm_emit(as, l, (rval >> 8) & 0xff); 203 lwasm_emit(as, l, (rval >> 8) & 0xff);
186 lwasm_emit(as, l, rval & 0xff); 204 lwasm_emit(as, l, rval & 0xff);
187 return; 205 return;
188 } 206 }
189 207
190 insn_gen_aux(as, l, p, opnum, -1); 208 insn_gen_aux(as, l, p, opnum, -1);
191 } 209 }
192 210
193 OPFUNC(insn_gen32) 211 OPFUNC(insn_imm8)
194 { 212 {
195 lwasm_expr_stack_t *s; 213 lwasm_expr_stack_t *s;
196 int rval; 214 int rval;
197 215
198 if (**p == '#') 216 if (**p == '#')
199 { 217 {
200 lwasm_emitop(as, l, instab[opnum].ops[3]); 218 lwasm_emitop(as, l, instab[opnum].ops[0]);
201 (*p)++; 219 (*p)++;
202 s = lwasm_evaluate_expr(as, l, *p, NULL); 220 s = lwasm_evaluate_expr(as, l, *p, NULL);
203 if (!s) 221 if (!s)
204 { 222 {
205 register_error(as, l, 1, "Bad expression"); 223 register_error(as, l, 1, "Bad expression");
210 if (!lwasm_expr_is_constant(s)) 228 if (!lwasm_expr_is_constant(s))
211 register_error(as, l, 2, "Incomplete reference"); 229 register_error(as, l, 2, "Incomplete reference");
212 rval = lwasm_expr_get_value(s); 230 rval = lwasm_expr_get_value(s);
213 lwasm_expr_stack_free(s); 231 lwasm_expr_stack_free(s);
214 } 232 }
215 lwasm_emit(as, l, (rval >> 24) & 0xff);
216 lwasm_emit(as, l, (rval >> 16) & 0xff);
217 lwasm_emit(as, l, (rval >> 8) & 0xff);
218 lwasm_emit(as, l, rval & 0xff);
219 return;
220 }
221
222 insn_gen_aux(as, l, p, opnum, -1);
223 }
224
225 OPFUNC(insn_imm8)
226 {
227 lwasm_expr_stack_t *s;
228 int rval;
229
230 if (**p == '#')
231 {
232 lwasm_emitop(as, l, instab[opnum].ops[0]);
233 (*p)++;
234 s = lwasm_evaluate_expr(as, l, *p, NULL);
235 if (!s)
236 {
237 register_error(as, l, 1, "Bad expression");
238 rval = 0;
239 }
240 else
241 {
242 if (!lwasm_expr_is_constant(s))
243 register_error(as, l, 2, "Incomplete reference");
244 rval = lwasm_expr_get_value(s);
245 lwasm_expr_stack_free(s);
246 }
247 if (rval < -128 || rval > 255) 233 if (rval < -128 || rval > 255)
248 register_error(as, l, 2, "Byte overflow"); 234 register_error(as, l, 2, "Byte overflow");
249 lwasm_emit(as, l, rval & 0xff); 235 lwasm_emit(as, l, rval & 0xff);
250 return; 236 return;
251 } 237 }