Mercurial > hg-old > index.cgi
comparison src/insn_gen.c @ 65:31d8e85706e7
Implemented setdp and corrected handling of direct page detection in insn_gen_aux()
author | lost |
---|---|
date | Mon, 05 Jan 2009 01:40:01 +0000 |
parents | da1337724ecd |
children | a338d496350e |
comparison
equal
deleted
inserted
replaced
64:aaddd47219b4 | 65:31d8e85706e7 |
---|---|
36 const char *optr2; | 36 const char *optr2; |
37 int v1, tv, rval; | 37 int v1, tv, rval; |
38 lwasm_expr_stack_t *s; | 38 lwasm_expr_stack_t *s; |
39 int f8 = 0; | 39 int f8 = 0; |
40 int f16 = 0; | 40 int f16 = 0; |
41 | 41 int isdp = 0; |
42 | |
42 optr2 = *optr; | 43 optr2 = *optr; |
43 while (*optr2 && !isspace(*optr2) && *optr2 != ',') optr2++ | 44 while (*optr2 && !isspace(*optr2) && *optr2 != ',') optr2++ |
44 /* do nothing */ ; | 45 /* do nothing */ ; |
45 | 46 |
46 if (*optr2 != ',' && **optr != '[') | 47 if (*optr2 != ',' && **optr != '[') |
65 if (!s) | 66 if (!s) |
66 { | 67 { |
67 register_error(as, l, 1, "Bad expression"); | 68 register_error(as, l, 1, "Bad expression"); |
68 return; | 69 return; |
69 } | 70 } |
70 if (!lwasm_expr_is_constant(s)) | 71 if (!lwasm_expr_is_constant(s) && as -> passnum == 1) |
71 { | 72 { |
72 f16 = 1; | 73 f16 = 1; |
73 l -> fsize = 2; | 74 l -> fsize = 2; |
74 register_error(as, l, 2, "Incomplete reference"); | 75 register_error(as, l, 2, "Incomplete reference"); |
75 } | 76 } |
76 v1 = lwasm_expr_get_value(s); | 77 v1 = lwasm_expr_get_value(s); |
77 lwasm_expr_stack_free(s); | 78 lwasm_expr_stack_free(s); |
79 | |
80 if (((v1 >> 8) & 0xff) == (as -> dpval & 0xff)) | |
81 isdp = 1; | |
78 | 82 |
79 if (f8 || (!f16 && v1 >= -128 && v1 <= 255)) | 83 if (f8 || (!f16 && isdp)) |
80 { | 84 { |
81 v1 = v1 & 0xffff; | 85 v1 = v1 & 0xffff; |
82 tv = v1 - ((as -> dpval) << 8); | 86 tv = v1 - ((as -> dpval) << 8); |
83 if (tv < 0 || tv > 0xff) | 87 if (tv < 0 || tv > 0xff) |
84 { | 88 { |