comparison lwasm/insn_indexed.c @ 371:9c24d9d485b9

Much bugfixing
author lost@starbug
date Wed, 21 Apr 2010 23:29:18 -0600
parents 7d91ab7ac7d6
children 8f9d72cfb897
comparison
equal deleted inserted replaced
370:6b33faa21a0a 371:9c24d9d485b9
261 lw_expr_t e1, e2; 261 lw_expr_t e1, e2;
262 // external references are handled exactly the same as for 262 // external references are handled exactly the same as for
263 // relative addressing modes 263 // relative addressing modes
264 // on pass 1, adjust the expression for a subtraction of the 264 // on pass 1, adjust the expression for a subtraction of the
265 // current address 265 // current address
266 266 // e - (addr + linelen) => e - addr - linelen
267 e1 = lw_expr_build(lw_expr_type_special, lwasm_expr_linelen, l); 267
268 e2 = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, l -> addr, e1); 268 e2 = lw_expr_build(lw_expr_type_special, lwasm_expr_linelen, l);
269 e1 = lw_expr_build(lw_expr_type_oper, lw_expr_oper_minus, e, e2);
270 lw_expr_destroy(e2);
271 e2 = lw_expr_build(lw_expr_type_oper, lw_expr_oper_minus, e1, l -> addr);
269 lw_expr_destroy(e1); 272 lw_expr_destroy(e1);
270 e1 = lw_expr_build(lw_expr_type_oper, lw_expr_oper_minus, e, l -> addr); 273 lwasm_save_expr(l, 0, e2);
271 lwasm_save_expr(l, 0, e1);
272 lw_expr_destroy(e2);
273 } 274 }
274 275
275 l -> pb = (indir * 0x80) | rn | (f0 * 0x40); 276 l -> pb = (indir * 0x80) | rn | (f0 * 0x40);
276 } 277 }
277 278