mirror of
https://github.com/yasm/yasm
synced 2026-08-26 22:26:05 -04:00
Make imm8 expansion work.
This was broken because I had precbc and precbc2 purposes swapped in the optimizer. svn path=/branches/new-optimizer/; revision=1584
This commit is contained in:
parent
9bbfdd47f7
commit
5b85508ae8
8 changed files with 565 additions and 14 deletions
|
|
@ -834,8 +834,8 @@ span_create_terms(yasm_span *span)
|
|||
return; /* not PC-relative */
|
||||
|
||||
span->rel_term = yasm_xmalloc(sizeof(yasm_span_term));
|
||||
span->rel_term->precbc = rel_precbc;
|
||||
span->rel_term->precbc2 = NULL;
|
||||
span->rel_term->precbc = NULL;
|
||||
span->rel_term->precbc2 = rel_precbc;
|
||||
span->rel_term->span = span;
|
||||
span->rel_term->subst = ~0U;
|
||||
|
||||
|
|
@ -871,10 +871,12 @@ recalc_normal_span(yasm_span *span)
|
|||
yasm_expr_destroy(abs_copy);
|
||||
}
|
||||
|
||||
if (span->rel_term && span->new_val != LONG_MAX
|
||||
&& span->rel_term->new_val != LONG_MAX)
|
||||
span->new_val += span->rel_term->new_val >> span->depval.rshift;
|
||||
else
|
||||
if (span->rel_term) {
|
||||
if (span->new_val != LONG_MAX && span->rel_term->new_val != LONG_MAX)
|
||||
span->new_val += span->rel_term->new_val >> span->depval.rshift;
|
||||
else
|
||||
span->new_val = LONG_MAX; /* too complex; force to longest form */
|
||||
} else if (span->depval.rel)
|
||||
span->new_val = LONG_MAX; /* too complex; force to longest form */
|
||||
|
||||
if (span->new_val == LONG_MAX)
|
||||
|
|
@ -982,7 +984,7 @@ optimize_term_expand(IntervalTreeNode *node, void *d)
|
|||
else
|
||||
precbc2_index = span->bc->bc_index-1;
|
||||
|
||||
if (precbc_index > precbc2_index)
|
||||
if (precbc_index < precbc2_index)
|
||||
term->new_val += len_diff;
|
||||
else
|
||||
term->new_val -= len_diff;
|
||||
|
|
@ -1122,8 +1124,8 @@ yasm_object_optimize(yasm_object *object, yasm_arch *arch,
|
|||
case SPECIAL_BC_OFFSET:
|
||||
/* Create term */
|
||||
span->rel_term = yasm_xmalloc(sizeof(yasm_span_term));
|
||||
span->rel_term->precbc = NULL;
|
||||
span->rel_term->precbc2 = STAILQ_FIRST(&span->bc->section->bcs);
|
||||
span->rel_term->precbc = STAILQ_FIRST(&span->bc->section->bcs);
|
||||
span->rel_term->precbc2 = NULL;
|
||||
span->rel_term->span = span;
|
||||
span->rel_term->subst = ~0U;
|
||||
span->rel_term->cur_val = 0;
|
||||
|
|
@ -1162,13 +1164,13 @@ yasm_object_optimize(yasm_object *object, yasm_arch *arch,
|
|||
}
|
||||
if (span->rel_term) {
|
||||
span->rel_term->cur_val = span->rel_term->new_val;
|
||||
if (span->rel_term->precbc)
|
||||
span->rel_term->new_val = span->rel_term->precbc->offset
|
||||
+ span->rel_term->precbc->len - span->bc->offset;
|
||||
if (span->rel_term->precbc2)
|
||||
span->rel_term->new_val = span->rel_term->precbc2->offset
|
||||
+ span->rel_term->precbc2->len - span->bc->offset;
|
||||
else
|
||||
span->rel_term->new_val = span->bc->offset -
|
||||
(span->rel_term->precbc2->offset +
|
||||
span->rel_term->precbc2->len);
|
||||
(span->rel_term->precbc->offset +
|
||||
span->rel_term->precbc->len);
|
||||
}
|
||||
|
||||
switch (span->special) {
|
||||
|
|
|
|||
|
|
@ -38,6 +38,12 @@ EXTRA_DIST += libyasm/tests/opt-align2.hex
|
|||
EXTRA_DIST += libyasm/tests/opt-align3.asm
|
||||
EXTRA_DIST += libyasm/tests/opt-align3.errwarn
|
||||
EXTRA_DIST += libyasm/tests/opt-align3.hex
|
||||
EXTRA_DIST += libyasm/tests/opt-immexpand.asm
|
||||
EXTRA_DIST += libyasm/tests/opt-immexpand.errwarn
|
||||
EXTRA_DIST += libyasm/tests/opt-immexpand.hex
|
||||
EXTRA_DIST += libyasm/tests/opt-immnoexpand.asm
|
||||
EXTRA_DIST += libyasm/tests/opt-immnoexpand.errwarn
|
||||
EXTRA_DIST += libyasm/tests/opt-immnoexpand.hex
|
||||
EXTRA_DIST += libyasm/tests/timesover-err.asm
|
||||
EXTRA_DIST += libyasm/tests/timesover-err.errwarn
|
||||
EXTRA_DIST += libyasm/tests/unary.asm
|
||||
|
|
|
|||
9
libyasm/tests/opt-immexpand.asm
Normal file
9
libyasm/tests/opt-immexpand.asm
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
label1:
|
||||
je label3
|
||||
times 124 nop
|
||||
label2:
|
||||
je label4
|
||||
label3:
|
||||
times 128 nop
|
||||
label4:
|
||||
push label2-label1
|
||||
0
libyasm/tests/opt-immexpand.errwarn
Normal file
0
libyasm/tests/opt-immexpand.errwarn
Normal file
263
libyasm/tests/opt-immexpand.hex
Normal file
263
libyasm/tests/opt-immexpand.hex
Normal file
|
|
@ -0,0 +1,263 @@
|
|||
0f
|
||||
84
|
||||
80
|
||||
00
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
0f
|
||||
84
|
||||
80
|
||||
00
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
68
|
||||
80
|
||||
00
|
||||
10
libyasm/tests/opt-immnoexpand.asm
Normal file
10
libyasm/tests/opt-immnoexpand.asm
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
label1:
|
||||
times 2 nop
|
||||
je label3
|
||||
times 123 nop
|
||||
label2:
|
||||
je label4
|
||||
label3:
|
||||
times 128 nop
|
||||
label4:
|
||||
push label2-label1
|
||||
0
libyasm/tests/opt-immnoexpand.errwarn
Normal file
0
libyasm/tests/opt-immnoexpand.errwarn
Normal file
261
libyasm/tests/opt-immnoexpand.hex
Normal file
261
libyasm/tests/opt-immnoexpand.hex
Normal file
|
|
@ -0,0 +1,261 @@
|
|||
90
|
||||
90
|
||||
74
|
||||
7f
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
0f
|
||||
84
|
||||
80
|
||||
00
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
90
|
||||
6a
|
||||
7f
|
||||
Loading…
Add table
Add a link
Reference in a new issue