]> granicus.if.org Git - yasm/commitdiff
Don't fully simplify effective addresses before trying to determine their
authorPeter Johnson <peter@tortall.net>
Thu, 3 Oct 2002 07:06:45 +0000 (07:06 -0000)
committerPeter Johnson <peter@tortall.net>
Thu, 3 Oct 2002 07:06:45 +0000 (07:06 -0000)
registers.

svn path=/trunk/yasm/; revision=724

modules/arch/x86/x86arch.h
modules/arch/x86/x86bc.c
modules/arch/x86/x86expr.c
src/arch/x86/x86arch.h
src/arch/x86/x86bc.c
src/arch/x86/x86expr.c

index f1985cdb486ee68e43b28973ce4ec19b9301f0d7..9f10c9d07409836447f9070b26d109851a109c4d 100644 (file)
@@ -196,7 +196,8 @@ int x86_expr_checkea(expr **ep, unsigned char *addrsize, unsigned char bits,
                     unsigned char nosplit, unsigned char *displen,
                     unsigned char *modrm, unsigned char *v_modrm,
                     unsigned char *n_modrm, unsigned char *sib,
-                    unsigned char *v_sib, unsigned char *n_sib);
+                    unsigned char *v_sib, unsigned char *n_sib,
+                    calc_bc_dist_func calc_bc_dist);
 
 void x86_switch_cpu(const char *cpuid);
 
index 2bc2e3de8ee41d36443833ef9bcd4f3016e7cb76..33089ea6ab08032c96b31daeaec51d0042b95316 100644 (file)
@@ -463,9 +463,6 @@ x86_bc_resolve_insn(x86_insn *insn, unsigned long *len, int save,
            temp = expr_copy(ea->disp);
            assert(temp != NULL);
 
-           /* Expand equ's and labels */
-           temp = expr_simplify(temp, calc_bc_dist);
-
            /* Check validity of effective address and calc R/M bits of
             * Mod/RM byte and SIB byte.  We won't know the Mod field
             * of the Mod/RM byte until we know more about the
@@ -475,7 +472,7 @@ x86_bc_resolve_insn(x86_insn *insn, unsigned long *len, int save,
                                  ea->nosplit, &displen, &ead_t.modrm,
                                  &ead_t.valid_modrm, &ead_t.need_modrm,
                                  &ead_t.sib, &ead_t.valid_sib,
-                                 &ead_t.need_sib)) {
+                                 &ead_t.need_sib, calc_bc_dist)) {
                expr_delete(temp);
                /* failed, don't bother checking rest of insn */
                return BC_RESOLVE_UNKNOWN_LEN;
@@ -772,7 +769,7 @@ x86_bc_tobytes_insn(x86_insn *insn, unsigned char **bufp, const section *sect,
                                  ea->nosplit, &displen, &ead_t.modrm,
                                  &ead_t.valid_modrm, &ead_t.need_modrm,
                                  &ead_t.sib, &ead_t.valid_sib,
-                                 &ead_t.need_sib))
+                                 &ead_t.need_sib, common_calc_bc_dist))
                InternalError(_("checkea failed"));
 
            if (ea->disp) {
index 2ba197d45d07acd80e2e6ea83c57f88bff2d4b30..04417d3004ca3ed6404162c35da32d242ebee686 100644 (file)
@@ -224,7 +224,8 @@ x86_expr_checkea_distcheck_reg(expr **ep)
  */
 static int
 x86_expr_checkea_getregusage(expr **ep, /*@null@*/ int *indexreg, void *data,
-                            int *(*get_reg)(ExprItem *ei, void *d))
+                            int *(*get_reg)(ExprItem *ei, void *d),
+                            calc_bc_dist_func calc_bc_dist)
 {
     int i;
     int *reg;
@@ -232,7 +233,7 @@ x86_expr_checkea_getregusage(expr **ep, /*@null@*/ int *indexreg, void *data,
 
     /*@-unqualifiedtrans@*/
     *ep = expr_xform_neg_tree(*ep);
-    *ep = expr_level_tree(*ep, 1, indexreg == 0, NULL, NULL);
+    *ep = expr_level_tree(*ep, 1, indexreg == 0, calc_bc_dist, NULL);
     /*@=unqualifiedtrans@*/
     assert(*ep != NULL);
     e = *ep;
@@ -481,7 +482,8 @@ x86_expr_checkea(expr **ep, unsigned char *addrsize, unsigned char bits,
                 unsigned char nosplit, unsigned char *displen,
                 unsigned char *modrm, unsigned char *v_modrm,
                 unsigned char *n_modrm, unsigned char *sib,
-                unsigned char *v_sib, unsigned char *n_sib)
+                unsigned char *v_sib, unsigned char *n_sib,
+                calc_bc_dist_func calc_bc_dist)
 {
     expr *e = *ep;
 
@@ -532,7 +534,8 @@ x86_expr_checkea(expr **ep, unsigned char *addrsize, unsigned char bits,
        int indexreg = REG32_NONE;      /* "index" register (for SIB) */
        
        switch (x86_expr_checkea_getregusage(ep, &indexreg, reg32mult,
-                                            x86_expr_checkea_get_reg32)) {
+                                            x86_expr_checkea_get_reg32,
+                                            calc_bc_dist)) {
            case 0:
                e = *ep;
                ErrorAt(e->line, _("invalid effective address"));
@@ -716,7 +719,8 @@ x86_expr_checkea(expr **ep, unsigned char *addrsize, unsigned char bits,
        *n_sib = 0;
 
        switch (x86_expr_checkea_getregusage(ep, (int *)NULL, &reg16mult,
-                                            x86_expr_checkea_get_reg16)) {
+                                            x86_expr_checkea_get_reg16,
+                                            calc_bc_dist)) {
            case 0:
                e = *ep;
                ErrorAt(e->line, _("invalid effective address"));
index f1985cdb486ee68e43b28973ce4ec19b9301f0d7..9f10c9d07409836447f9070b26d109851a109c4d 100644 (file)
@@ -196,7 +196,8 @@ int x86_expr_checkea(expr **ep, unsigned char *addrsize, unsigned char bits,
                     unsigned char nosplit, unsigned char *displen,
                     unsigned char *modrm, unsigned char *v_modrm,
                     unsigned char *n_modrm, unsigned char *sib,
-                    unsigned char *v_sib, unsigned char *n_sib);
+                    unsigned char *v_sib, unsigned char *n_sib,
+                    calc_bc_dist_func calc_bc_dist);
 
 void x86_switch_cpu(const char *cpuid);
 
index 2bc2e3de8ee41d36443833ef9bcd4f3016e7cb76..33089ea6ab08032c96b31daeaec51d0042b95316 100644 (file)
@@ -463,9 +463,6 @@ x86_bc_resolve_insn(x86_insn *insn, unsigned long *len, int save,
            temp = expr_copy(ea->disp);
            assert(temp != NULL);
 
-           /* Expand equ's and labels */
-           temp = expr_simplify(temp, calc_bc_dist);
-
            /* Check validity of effective address and calc R/M bits of
             * Mod/RM byte and SIB byte.  We won't know the Mod field
             * of the Mod/RM byte until we know more about the
@@ -475,7 +472,7 @@ x86_bc_resolve_insn(x86_insn *insn, unsigned long *len, int save,
                                  ea->nosplit, &displen, &ead_t.modrm,
                                  &ead_t.valid_modrm, &ead_t.need_modrm,
                                  &ead_t.sib, &ead_t.valid_sib,
-                                 &ead_t.need_sib)) {
+                                 &ead_t.need_sib, calc_bc_dist)) {
                expr_delete(temp);
                /* failed, don't bother checking rest of insn */
                return BC_RESOLVE_UNKNOWN_LEN;
@@ -772,7 +769,7 @@ x86_bc_tobytes_insn(x86_insn *insn, unsigned char **bufp, const section *sect,
                                  ea->nosplit, &displen, &ead_t.modrm,
                                  &ead_t.valid_modrm, &ead_t.need_modrm,
                                  &ead_t.sib, &ead_t.valid_sib,
-                                 &ead_t.need_sib))
+                                 &ead_t.need_sib, common_calc_bc_dist))
                InternalError(_("checkea failed"));
 
            if (ea->disp) {
index 2ba197d45d07acd80e2e6ea83c57f88bff2d4b30..04417d3004ca3ed6404162c35da32d242ebee686 100644 (file)
@@ -224,7 +224,8 @@ x86_expr_checkea_distcheck_reg(expr **ep)
  */
 static int
 x86_expr_checkea_getregusage(expr **ep, /*@null@*/ int *indexreg, void *data,
-                            int *(*get_reg)(ExprItem *ei, void *d))
+                            int *(*get_reg)(ExprItem *ei, void *d),
+                            calc_bc_dist_func calc_bc_dist)
 {
     int i;
     int *reg;
@@ -232,7 +233,7 @@ x86_expr_checkea_getregusage(expr **ep, /*@null@*/ int *indexreg, void *data,
 
     /*@-unqualifiedtrans@*/
     *ep = expr_xform_neg_tree(*ep);
-    *ep = expr_level_tree(*ep, 1, indexreg == 0, NULL, NULL);
+    *ep = expr_level_tree(*ep, 1, indexreg == 0, calc_bc_dist, NULL);
     /*@=unqualifiedtrans@*/
     assert(*ep != NULL);
     e = *ep;
@@ -481,7 +482,8 @@ x86_expr_checkea(expr **ep, unsigned char *addrsize, unsigned char bits,
                 unsigned char nosplit, unsigned char *displen,
                 unsigned char *modrm, unsigned char *v_modrm,
                 unsigned char *n_modrm, unsigned char *sib,
-                unsigned char *v_sib, unsigned char *n_sib)
+                unsigned char *v_sib, unsigned char *n_sib,
+                calc_bc_dist_func calc_bc_dist)
 {
     expr *e = *ep;
 
@@ -532,7 +534,8 @@ x86_expr_checkea(expr **ep, unsigned char *addrsize, unsigned char bits,
        int indexreg = REG32_NONE;      /* "index" register (for SIB) */
        
        switch (x86_expr_checkea_getregusage(ep, &indexreg, reg32mult,
-                                            x86_expr_checkea_get_reg32)) {
+                                            x86_expr_checkea_get_reg32,
+                                            calc_bc_dist)) {
            case 0:
                e = *ep;
                ErrorAt(e->line, _("invalid effective address"));
@@ -716,7 +719,8 @@ x86_expr_checkea(expr **ep, unsigned char *addrsize, unsigned char bits,
        *n_sib = 0;
 
        switch (x86_expr_checkea_getregusage(ep, (int *)NULL, &reg16mult,
-                                            x86_expr_checkea_get_reg16)) {
+                                            x86_expr_checkea_get_reg16,
+                                            calc_bc_dist)) {
            case 0:
                e = *ep;
                ErrorAt(e->line, _("invalid effective address"));