]> granicus.if.org Git - yasm/commitdiff
Make imm8 expansion work.
authorPeter Johnson <peter@tortall.net>
Mon, 19 Jun 2006 03:54:20 +0000 (03:54 -0000)
committerPeter Johnson <peter@tortall.net>
Mon, 19 Jun 2006 03:54:20 +0000 (03:54 -0000)
This was broken because I had precbc and precbc2 purposes swapped in the
optimizer.

svn path=/branches/new-optimizer/; revision=1584

libyasm/section.c
libyasm/tests/Makefile.inc
libyasm/tests/opt-immexpand.asm [new file with mode: 0644]
libyasm/tests/opt-immexpand.errwarn [new file with mode: 0644]
libyasm/tests/opt-immexpand.hex [new file with mode: 0644]
libyasm/tests/opt-immnoexpand.asm [new file with mode: 0644]
libyasm/tests/opt-immnoexpand.errwarn [new file with mode: 0644]
libyasm/tests/opt-immnoexpand.hex [new file with mode: 0644]

index db321df80d73970cd714af4604d19037566606bc..059916579d9ace9b0a52aedc536167394d6d32e3 100644 (file)
@@ -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) {
index 713c0e31b4d524b6147977f05cd17c09c330de39..2d1cebc2da183aa1d2d10dc662ba8326e36d08c6 100644 (file)
@@ -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
diff --git a/libyasm/tests/opt-immexpand.asm b/libyasm/tests/opt-immexpand.asm
new file mode 100644 (file)
index 0000000..55d8097
--- /dev/null
@@ -0,0 +1,9 @@
+label1:
+je label3
+times 124 nop
+label2:
+je label4
+label3:
+times 128 nop
+label4:
+push label2-label1
diff --git a/libyasm/tests/opt-immexpand.errwarn b/libyasm/tests/opt-immexpand.errwarn
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/libyasm/tests/opt-immexpand.hex b/libyasm/tests/opt-immexpand.hex
new file mode 100644 (file)
index 0000000..f57024e
--- /dev/null
@@ -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 
diff --git a/libyasm/tests/opt-immnoexpand.asm b/libyasm/tests/opt-immnoexpand.asm
new file mode 100644 (file)
index 0000000..e126f80
--- /dev/null
@@ -0,0 +1,10 @@
+label1:
+times 2 nop
+je label3
+times 123 nop
+label2:
+je label4
+label3:
+times 128 nop
+label4:
+push label2-label1
diff --git a/libyasm/tests/opt-immnoexpand.errwarn b/libyasm/tests/opt-immnoexpand.errwarn
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/libyasm/tests/opt-immnoexpand.hex b/libyasm/tests/opt-immnoexpand.hex
new file mode 100644 (file)
index 0000000..c465806
--- /dev/null
@@ -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