comparison src/insn_rel.c @ 83:964d68cde469

Fixed problems with re8 and rel16 addressing
author lost
date Wed, 14 Jan 2009 06:33:13 +0000
parents a338d496350e
children 81fc353d4d69
comparison
equal deleted inserted replaced
82:03be43ae19cf 83:964d68cde469
36 lwasm_expr_term_t *t; 36 lwasm_expr_term_t *t;
37 int r; 37 int r;
38 38
39 lwasm_emitop(as, l, instab[opnum].ops[0]); 39 lwasm_emitop(as, l, instab[opnum].ops[0]);
40 40
41 if ((r = lwasm_expr_result2(as, l, p, EXPR_PASS2CONST | EXPR_NOINTERSECT, &v, 0)) != 0) 41 if ((r = lwasm_expr_result2(as, l, p, EXPR_PASS2CONST | EXPR_NOINTERSECT, &v, 0)) < 0)
42 v = 0; 42 v = 0;
43 else 43 else
44 { 44 {
45 if (as -> passnum == 1) 45 if (as -> passnum == 1)
46 { 46 {
47 // need to adjust the expression 47 // need to adjust the expression
48 v -= as -> addr + 1;
49 if (l -> exprs[0]) 48 if (l -> exprs[0])
50 { 49 {
51 t = lwasm_expr_term_create_int(as -> addr + 1); 50 t = lwasm_expr_term_create_int(as -> addr + 1);
52 lwasm_expr_stack_push(l -> exprs[0], t); 51 lwasm_expr_stack_push(l -> exprs[0], t);
53 lwasm_expr_term_free(t); 52 lwasm_expr_term_free(t);
81 lwasm_expr_term_t *t; 80 lwasm_expr_term_t *t;
82 81
83 lwasm_emitop(as, l, instab[opnum].ops[0]); 82 lwasm_emitop(as, l, instab[opnum].ops[0]);
84 83
85 r = lwasm_expr_result2(as, l, p, EXPR_PASS2CONST, &v, 0); 84 r = lwasm_expr_result2(as, l, p, EXPR_PASS2CONST, &v, 0);
86 if (r != 0) 85 if (r < 0)
87 v = 0; 86 v = 0;
88 else 87 else
89 { 88 {
90 if (as -> passnum == 1) 89 if (as -> passnum == 1)
91 { 90 {
92 // need to adjust the expression 91 // need to adjust the expression
93 v -= as -> addr + 1;
94 if (l -> exprs[0]) 92 if (l -> exprs[0])
95 { 93 {
96 t = lwasm_expr_term_create_int(as -> addr + 1); 94 t = lwasm_expr_term_create_int(as -> addr + 2);
97 lwasm_expr_stack_push(l -> exprs[0], t); 95 lwasm_expr_stack_push(l -> exprs[0], t);
98 lwasm_expr_term_free(t); 96 lwasm_expr_term_free(t);
99 t = lwasm_expr_term_create_oper(LWASM_OPER_MINUS); 97 t = lwasm_expr_term_create_oper(LWASM_OPER_MINUS);
100 lwasm_expr_stack_push(l -> exprs[0], t); 98 lwasm_expr_stack_push(l -> exprs[0], t);
101 lwasm_expr_term_free(t); 99 lwasm_expr_term_free(t);