aboutsummaryrefslogtreecommitdiff
path: root/i386-asm.c
diff options
context:
space:
mode:
Diffstat (limited to 'i386-asm.c')
-rw-r--r--i386-asm.c14
1 files changed, 10 insertions, 4 deletions
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) {