From b585bc2c0ac716d16d6db3bdfe9f4524de1d7149 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 3 Jun 1999 02:51:27 +0000 Subject: * expr.c (operand): Don't use [ for parens if we want an index op. (op_encoding): Switch [ into O_index, if desired. (op_rank): Renumber with O_index on bottom. (expr): If O_index, match closing bracket. * expr.h (O_index): New. --- gas/expr.c | 66 ++++++++++++++++++++++++++++++++++++++++---------------------- gas/expr.h | 2 ++ 2 files changed, 45 insertions(+), 23 deletions(-) (limited to 'gas') diff --git a/gas/expr.c b/gas/expr.c index 9cfec2e6..6e74bfa 100644 --- a/gas/expr.c +++ b/gas/expr.c @@ -989,7 +989,9 @@ operand (expressionP) break; case '(': +#ifndef NEED_INDEX_OPERATOR case '[': +#endif /* didn't begin with digit & not a name */ segment = expression (expressionP); /* Expression() will pass trailing whitespace */ @@ -1415,7 +1417,13 @@ static const operatorT op_encoding[256] = __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, - __, __, __, __, __, __, O_bit_exclusive_or, __, + __, __, __, +#ifdef NEED_INDEX_OPERATOR + O_index, +#else + __, +#endif + __, __, O_bit_exclusive_or, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, @@ -1453,28 +1461,29 @@ static operator_rankT op_rank[] = 0, /* O_symbol_rva */ 0, /* O_register */ 0, /* O_bit */ - 8, /* O_uminus */ - 8, /* O_bit_not */ - 8, /* O_logical_not */ - 7, /* O_multiply */ - 7, /* O_divide */ - 7, /* O_modulus */ - 7, /* O_left_shift */ - 7, /* O_right_shift */ - 6, /* O_bit_inclusive_or */ - 6, /* O_bit_or_not */ - 6, /* O_bit_exclusive_or */ - 6, /* O_bit_and */ - 4, /* O_add */ - 4, /* O_subtract */ - 3, /* O_eq */ - 3, /* O_ne */ - 3, /* O_lt */ - 3, /* O_le */ - 3, /* O_ge */ - 3, /* O_gt */ - 2, /* O_logical_and */ - 1 /* O_logical_or */ + 9, /* O_uminus */ + 9, /* O_bit_not */ + 9, /* O_logical_not */ + 8, /* O_multiply */ + 8, /* O_divide */ + 8, /* O_modulus */ + 8, /* O_left_shift */ + 8, /* O_right_shift */ + 7, /* O_bit_inclusive_or */ + 7, /* O_bit_or_not */ + 7, /* O_bit_exclusive_or */ + 7, /* O_bit_and */ + 5, /* O_add */ + 5, /* O_subtract */ + 4, /* O_eq */ + 4, /* O_ne */ + 4, /* O_lt */ + 4, /* O_le */ + 4, /* O_ge */ + 4, /* O_gt */ + 3, /* O_logical_and */ + 2, /* O_logical_or */ + 1, /* O_index */ }; /* Unfortunately, in MRI mode for the m68k, multiplication and @@ -1641,6 +1650,17 @@ expr (rank, resultP) know (*input_line_pointer != ' '); + if (op_left == O_index) + { + if (*input_line_pointer != ']') + as_bad ("missing right bracket"); + else + { + ++input_line_pointer; + SKIP_WHITESPACE (); + } + } + if (retval == undefined_section) { if (SEG_NORMAL (rightseg)) diff --git a/gas/expr.h b/gas/expr.h index cdf337a..14a2fd2 100644 --- a/gas/expr.h +++ b/gas/expr.h @@ -102,6 +102,8 @@ typedef enum O_logical_and, /* (X_add_symbol || X_op_symbol) + X_add_number. */ O_logical_or, + /* X_op_symbol [ X_add_symbol ] */ + O_index, /* this must be the largest value */ O_max } operatorT; -- cgit v1.1