diff --git a/i386-asm.c b/i386-asm.c index 9805497..b9d8eda 100644 --- a/i386-asm.c +++ b/i386-asm.c @@ -745,6 +745,13 @@ static inline int constraint_priority(const char *str) return priority; } +static const char *skip_constraint_modifiers(const char *p) +{ + while (*p == '=' || *p == '&' || *p == '+' || *p == '%') + p++; + return p; +} + static void asm_compute_constraints(uint8_t *regs_allocated, ASMOperand *operands, int nb_operands1, int nb_outputs, @@ -772,6 +779,7 @@ static void asm_compute_constraints(uint8_t *regs_allocated, str = op->constraint; op->ref_index = -1; op->reg = -1; + str = skip_constraint_modifiers(str); if (!is_output && (isnum(*str) || *str == '[')) { /* this is a reference to another constraint */ k = find_constraint(operands, nb_operands1, str, NULL); @@ -780,9 +788,8 @@ static void asm_compute_constraints(uint8_t *regs_allocated, j, str); op->ref_index = k; str = operands[k].constraint; + str = skip_constraint_modifiers(str); } - while (*str == '=' || *str == '&' || *str == '+') - str++; op->priority = constraint_priority(str); } @@ -815,8 +822,7 @@ static void asm_compute_constraints(uint8_t *regs_allocated, str = operands[op->ref_index].constraint; } - while (*str == '=' || *str == '&' || *str == '+') - str++; + str = skip_constraint_modifiers(str); try_next: c = *str++; switch(c) {