Mercurial > hg-old > index.cgi
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 } |