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;
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)
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;
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;
}
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) {
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