registers.
svn path=/trunk/yasm/; revision=724
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);
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
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;
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) {
*/
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;
/*@-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;
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;
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"));
*n_sib = 0;
switch (x86_expr_checkea_getregusage(ep, (int *)NULL, ®16mult,
- x86_expr_checkea_get_reg16)) {
+ x86_expr_checkea_get_reg16,
+ calc_bc_dist)) {
case 0:
e = *ep;
ErrorAt(e->line, _("invalid effective address"));
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);
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
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;
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) {
*/
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;
/*@-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;
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;
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"));
*n_sib = 0;
switch (x86_expr_checkea_getregusage(ep, (int *)NULL, ®16mult,
- x86_expr_checkea_get_reg16)) {
+ x86_expr_checkea_get_reg16,
+ calc_bc_dist)) {
case 0:
e = *ep;
ErrorAt(e->line, _("invalid effective address"));