comparison src/insn_rel.c @ 77:a338d496350e

Checkpointing conversion to allow object target
author lost
date Fri, 09 Jan 2009 04:23:00 +0000
parents 89657cb3fdf8
children 964d68cde469
comparison
equal deleted inserted replaced
76:2fe5fd7d65a3 77:a338d496350e
31 #include "instab.h" 31 #include "instab.h"
32 32
33 OPFUNC(insn_rel8) 33 OPFUNC(insn_rel8)
34 { 34 {
35 int v; 35 int v;
36 lwasm_expr_term_t *t;
37 int r;
36 38
37 lwasm_emitop(as, l, instab[opnum].ops[0]); 39 lwasm_emitop(as, l, instab[opnum].ops[0]);
38 40
39 if (lwasm_expr_result(as, l, p, EXPR_PASS2CONST, &v) < 0) 41 if ((r = lwasm_expr_result2(as, l, p, EXPR_PASS2CONST | EXPR_NOINTERSECT, &v, 0)) != 0)
42 v = 0;
43 else
40 { 44 {
41 v = 0; 45 if (as -> passnum == 1)
46 {
47 // need to adjust the expression
48 v -= as -> addr + 1;
49 if (l -> exprs[0])
50 {
51 t = lwasm_expr_term_create_int(as -> addr + 1);
52 lwasm_expr_stack_push(l -> exprs[0], t);
53 lwasm_expr_term_free(t);
54 t = lwasm_expr_term_create_oper(LWASM_OPER_MINUS);
55 lwasm_expr_stack_push(l -> exprs[0], t);
56 lwasm_expr_term_free(t);
57 }
58 else
59 {
60 l -> exprvals[0] -= as -> addr + 1;
61 }
62 }
42 } 63 }
43 v -= as -> addr + 1; 64 if (r == 1 && as -> passnum == 2)
65 {
66 register_error(as, l, 2, "Illegal external or intersegment reference");
67 }
44 if (v < -128 || v > 127) 68 if (v < -128 || v > 127)
45 register_error(as, l, 2, "Byte overflow"); 69 register_error(as, l, 2, "Byte overflow");
46 lwasm_emit(as, l, v & 0xff); 70 lwasm_emit(as, l, v & 0xff);
47 } 71 }
48 72
73 /*
74 External and intersegment references are adjusted for the relative addressing mode
75 by adjusting the expression on pass 1 and then treated as absolute references later
76 */
49 OPFUNC(insn_rel16) 77 OPFUNC(insn_rel16)
50 { 78 {
51 int v; 79 int v;
80 int r;
81 lwasm_expr_term_t *t;
52 82
53 lwasm_emitop(as, l, instab[opnum].ops[0]); 83 lwasm_emitop(as, l, instab[opnum].ops[0]);
54 84
55 if (lwasm_expr_result(as, l, p, EXPR_PASS2CONST, &v) < 0) 85 r = lwasm_expr_result2(as, l, p, EXPR_PASS2CONST, &v, 0);
86 if (r != 0)
56 v = 0; 87 v = 0;
57 v -= as -> addr + 2; 88 else
89 {
90 if (as -> passnum == 1)
91 {
92 // need to adjust the expression
93 v -= as -> addr + 1;
94 if (l -> exprs[0])
95 {
96 t = lwasm_expr_term_create_int(as -> addr + 1);
97 lwasm_expr_stack_push(l -> exprs[0], t);
98 lwasm_expr_term_free(t);
99 t = lwasm_expr_term_create_oper(LWASM_OPER_MINUS);
100 lwasm_expr_stack_push(l -> exprs[0], t);
101 lwasm_expr_term_free(t);
102 }
103 else
104 {
105 l -> exprvals[0] -= as -> addr + 2;
106 }
107 }
108 }
109 if (as -> passnum == 2 && r == 1)
110 l -> relocoff = as -> addr - l -> codeaddr;
58 lwasm_emit(as, l, (v >> 8) & 0xff); 111 lwasm_emit(as, l, (v >> 8) & 0xff);
59 lwasm_emit(as, l, v & 0xff); 112 lwasm_emit(as, l, v & 0xff);
60 } 113 }