diff options
| -rw-r--r-- | i386-asm.c | 14 |
1 files changed, 10 insertions, 4 deletions
@@ -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) { |
