diff options
author | Niklas Hallqvist <niklas@cvs.openbsd.org> | 1996-06-10 10:55:58 +0000 |
---|---|---|
committer | Niklas Hallqvist <niklas@cvs.openbsd.org> | 1996-06-10 10:55:58 +0000 |
commit | a7e831079363e3bb45f3172f6e59ba48e335682b (patch) | |
tree | ee4324eac9a9d66f189fab60498ec42b8226b7fc /gnu/usr.bin/binutils/gas/expr.c | |
parent | 467cb0a471d13c5186a6ee166e60b47c30da64e9 (diff) |
Bring Cygnus versions into the trunk, keeping our local patches
Diffstat (limited to 'gnu/usr.bin/binutils/gas/expr.c')
-rw-r--r-- | gnu/usr.bin/binutils/gas/expr.c | 67 |
1 files changed, 42 insertions, 25 deletions
diff --git a/gnu/usr.bin/binutils/gas/expr.c b/gnu/usr.bin/binutils/gas/expr.c index 221fd1a16b4..f4069600594 100644 --- a/gnu/usr.bin/binutils/gas/expr.c +++ b/gnu/usr.bin/binutils/gas/expr.c @@ -1,5 +1,6 @@ /* expr.c -operands, expressions- - Copyright (C) 1987, 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. + Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 1996 + Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -166,7 +167,7 @@ integer_constant (radix, expressionP) #define valuesize 32 #endif - if (flag_mri && radix == 0) + if (flag_m68k_mri && radix == 0) { int flt = 0; @@ -294,7 +295,7 @@ integer_constant (radix, expressionP) } } - if (flag_mri && suffix != NULL && input_line_pointer - 1 == suffix) + if (flag_m68k_mri && suffix != NULL && input_line_pointer - 1 == suffix) c = *input_line_pointer++; if (small) @@ -563,13 +564,13 @@ operand (expressionP) case '9': input_line_pointer--; - integer_constant (flag_mri ? 0 : 10, expressionP); + integer_constant (flag_m68k_mri ? 0 : 10, expressionP); break; case '0': /* non-decimal radix */ - if (flag_mri) + if (flag_m68k_mri) { char *s; @@ -587,9 +588,13 @@ operand (expressionP) c = *input_line_pointer; switch (c) { + case 'o': + case 'O': + case 'q': + case 'Q': case '8': case '9': - if (flag_mri) + if (flag_m68k_mri) { integer_constant (0, expressionP); break; @@ -614,14 +619,14 @@ operand (expressionP) case 'x': case 'X': - if (flag_mri) + if (flag_m68k_mri) goto default_case; input_line_pointer++; integer_constant (16, expressionP); break; case 'b': - if (LOCAL_LABELS_FB) + if (LOCAL_LABELS_FB && ! flag_m68k_mri) { switch (input_line_pointer[1]) { @@ -659,7 +664,7 @@ operand (expressionP) } case 'B': input_line_pointer++; - if (flag_mri) + if (flag_m68k_mri) goto default_case; integer_constant (2, expressionP); break; @@ -672,7 +677,7 @@ operand (expressionP) case '5': case '6': case '7': - integer_constant (flag_mri ? 0 : 8, expressionP); + integer_constant (flag_m68k_mri ? 0 : 8, expressionP); break; case 'f': @@ -718,6 +723,12 @@ operand (expressionP) case 'd': case 'D': + if (flag_m68k_mri) + { + integer_constant (0, expressionP); + break; + } + /* Fall through. */ case 'F': case 'r': case 'e': @@ -752,21 +763,22 @@ operand (expressionP) as_bad ("Missing ')' assumed"); input_line_pointer--; } + SKIP_WHITESPACE (); /* here with input_line_pointer->char after "(...)" */ return segment; case 'E': - if (! flag_mri || *input_line_pointer != '\'') + if (! flag_m68k_mri || *input_line_pointer != '\'') goto de_fault; as_bad ("EBCDIC constants are not supported"); /* Fall through. */ case 'A': - if (! flag_mri || *input_line_pointer != '\'') + if (! flag_m68k_mri || *input_line_pointer != '\'') goto de_fault; ++input_line_pointer; /* Fall through. */ case '\'': - if (! flag_mri) + if (! flag_m68k_mri) { /* Warning: to conform to other people's assemblers NO ESCAPEMENT is permitted for a single quote. The next @@ -786,7 +798,7 @@ operand (expressionP) case '"': /* Double quote is the bitwise not operator in MRI mode. */ - if (! flag_mri) + if (! flag_m68k_mri) goto de_fault; /* Fall through. */ case '!': @@ -831,10 +843,10 @@ operand (expressionP) /* $ is the program counter when in MRI mode, or when DOLLAR_DOT is defined. */ #ifndef DOLLAR_DOT - if (! flag_mri) + if (! flag_m68k_mri) goto de_fault; #endif - if (flag_mri && hex_p (*input_line_pointer)) + if (flag_m68k_mri && hex_p (*input_line_pointer)) { /* In MRI mode, $ is also used as the prefix for a hexadecimal constant. */ @@ -911,19 +923,19 @@ operand (expressionP) break; case '%': - if (! flag_mri) + if (! flag_m68k_mri) goto de_fault; integer_constant (2, expressionP); break; case '@': - if (! flag_mri) + if (! flag_m68k_mri) goto de_fault; integer_constant (8, expressionP); break; case ':': - if (! flag_mri) + if (! flag_m68k_mri) goto de_fault; /* In MRI mode, this is a floating point constant represented @@ -934,7 +946,7 @@ operand (expressionP) break; case '*': - if (! flag_mri || is_part_of_name (*input_line_pointer)) + if (! flag_m68k_mri || is_part_of_name (*input_line_pointer)) goto de_fault; current_location (expressionP); @@ -955,7 +967,7 @@ operand (expressionP) c = get_symbol_end (); #ifdef TC_I960 - /* The MRI i960 assemblers permits + /* The MRI i960 assembler permits lda sizeof code,g13 */ if (flag_mri @@ -1219,17 +1231,22 @@ static operator_rankT op_rank[] = void expr_begin () { -#ifdef TC_M68K /* In MRI mode for the m68k, multiplication and division have lower precedence than the bit wise operators. */ - if (flag_mri) + if (flag_m68k_mri) { op_rank[O_multiply] = 5; op_rank[O_divide] = 5; op_rank[O_modulus] = 5; op_encoding['"'] = O_bit_not; } -#endif + + /* Verify that X_op field is wide enough. */ + { + expressionS e; + e.X_op = O_max; + assert (e.X_op == O_max); + } } /* Return the encoding for the operator at INPUT_LINE_POINTER. @@ -1286,7 +1303,7 @@ operator () /* We accept !! as equivalent to ^ for MRI compatibility. */ if (input_line_pointer[1] != '!') { - if (flag_mri) + if (flag_m68k_mri) return O_bit_inclusive_or; return op_encoding[c]; } |