diff options
author | Alan Modra <amodra@gmail.com> | 2001-03-25 05:57:09 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2001-03-25 05:57:09 +0000 |
commit | 551c1ca1767053de70c75514eee92b55ac8a821a (patch) | |
tree | 7b2ce6b73491da2fa0dd9735a5262eefbfdb7cb5 /gas/config/tc-i386.c | |
parent | 0f17484fd34e888c8c7bab63a75eb9bc3d7c19cb (diff) | |
download | gdb-551c1ca1767053de70c75514eee92b55ac8a821a.zip gdb-551c1ca1767053de70c75514eee92b55ac8a821a.tar.gz gdb-551c1ca1767053de70c75514eee92b55ac8a821a.tar.bz2 |
Accept an absolute expression for index scale factor.
Diffstat (limited to 'gas/config/tc-i386.c')
-rw-r--r-- | gas/config/tc-i386.c | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 585aa8d..843db1f 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -3344,35 +3344,38 @@ i386_immediate (imm_start) return 1; } -static int i386_scale PARAMS ((char *)); +static char *i386_scale PARAMS ((char *)); -static int +static char * i386_scale (scale) char *scale; { - if (!isdigit (*scale)) - goto bad_scale; + offsetT val; + char *save = input_line_pointer; - switch (*scale) + input_line_pointer = scale; + val = get_absolute_expression (); + + switch (val) { - case '0': - case '1': + case 0: + case 1: i.log2_scale_factor = 0; break; - case '2': + case 2: i.log2_scale_factor = 1; break; - case '4': + case 4: i.log2_scale_factor = 2; break; - case '8': + case 8: i.log2_scale_factor = 3; break; default: - bad_scale: as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"), scale); - return 0; + input_line_pointer = save; + return NULL; } if (i.log2_scale_factor != 0 && ! i.index_reg) { @@ -3382,7 +3385,9 @@ i386_scale (scale) i.log2_scale_factor = 0; #endif } - return 1; + scale = input_line_pointer; + input_line_pointer = save; + return scale; } static int i386_displacement PARAMS ((char *, char *)); @@ -3830,12 +3835,14 @@ i386_operand (operand_string) } /* Check for scale factor. */ - if (isdigit ((unsigned char) *base_string)) + if (*base_string != ')') { - if (!i386_scale (base_string)) + char *end_scale = i386_scale (base_string); + + if (!end_scale) return 0; - ++base_string; + base_string = end_scale; if (is_space_char (*base_string)) ++base_string; if (*base_string != ')') |