Home | History | Annotate | Line # | Download | only in gas
expr.c revision 1.1
      1  1.1  skrll /* expr.c -operands, expressions-
      2  1.1  skrll    Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
      3  1.1  skrll    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
      4  1.1  skrll    Free Software Foundation, Inc.
      5  1.1  skrll 
      6  1.1  skrll    This file is part of GAS, the GNU Assembler.
      7  1.1  skrll 
      8  1.1  skrll    GAS is free software; you can redistribute it and/or modify
      9  1.1  skrll    it under the terms of the GNU General Public License as published by
     10  1.1  skrll    the Free Software Foundation; either version 3, or (at your option)
     11  1.1  skrll    any later version.
     12  1.1  skrll 
     13  1.1  skrll    GAS is distributed in the hope that it will be useful,
     14  1.1  skrll    but WITHOUT ANY WARRANTY; without even the implied warranty of
     15  1.1  skrll    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16  1.1  skrll    GNU General Public License for more details.
     17  1.1  skrll 
     18  1.1  skrll    You should have received a copy of the GNU General Public License
     19  1.1  skrll    along with GAS; see the file COPYING.  If not, write to the Free
     20  1.1  skrll    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
     21  1.1  skrll    02110-1301, USA.  */
     22  1.1  skrll 
     23  1.1  skrll /* This is really a branch office of as-read.c. I split it out to clearly
     24  1.1  skrll    distinguish the world of expressions from the world of statements.
     25  1.1  skrll    (It also gives smaller files to re-compile.)
     26  1.1  skrll    Here, "operand"s are of expressions, not instructions.  */
     27  1.1  skrll 
     28  1.1  skrll #define min(a, b)       ((a) < (b) ? (a) : (b))
     29  1.1  skrll 
     30  1.1  skrll #include "as.h"
     31  1.1  skrll #include "safe-ctype.h"
     32  1.1  skrll #include "obstack.h"
     33  1.1  skrll 
     34  1.1  skrll static void floating_constant (expressionS * expressionP);
     35  1.1  skrll static valueT generic_bignum_to_int32 (void);
     36  1.1  skrll #ifdef BFD64
     37  1.1  skrll static valueT generic_bignum_to_int64 (void);
     38  1.1  skrll #endif
     39  1.1  skrll static void integer_constant (int radix, expressionS * expressionP);
     40  1.1  skrll static void mri_char_constant (expressionS *);
     41  1.1  skrll static void current_location (expressionS *);
     42  1.1  skrll static void clean_up_expression (expressionS * expressionP);
     43  1.1  skrll static segT operand (expressionS *, enum expr_mode);
     44  1.1  skrll static operatorT operator (int *);
     45  1.1  skrll 
     46  1.1  skrll extern const char EXP_CHARS[], FLT_CHARS[];
     47  1.1  skrll 
     48  1.1  skrll /* We keep a mapping of expression symbols to file positions, so that
     49  1.1  skrll    we can provide better error messages.  */
     50  1.1  skrll 
     51  1.1  skrll struct expr_symbol_line {
     52  1.1  skrll   struct expr_symbol_line *next;
     53  1.1  skrll   symbolS *sym;
     54  1.1  skrll   char *file;
     55  1.1  skrll   unsigned int line;
     56  1.1  skrll };
     57  1.1  skrll 
     58  1.1  skrll static struct expr_symbol_line *expr_symbol_lines;
     59  1.1  skrll 
     60  1.1  skrll /* Build a dummy symbol to hold a complex expression.  This is how we
     62  1.1  skrll    build expressions up out of other expressions.  The symbol is put
     63  1.1  skrll    into the fake section expr_section.  */
     64  1.1  skrll 
     65  1.1  skrll symbolS *
     66  1.1  skrll make_expr_symbol (expressionS *expressionP)
     67  1.1  skrll {
     68  1.1  skrll   expressionS zero;
     69  1.1  skrll   symbolS *symbolP;
     70  1.1  skrll   struct expr_symbol_line *n;
     71  1.1  skrll 
     72  1.1  skrll   if (expressionP->X_op == O_symbol
     73  1.1  skrll       && expressionP->X_add_number == 0)
     74  1.1  skrll     return expressionP->X_add_symbol;
     75  1.1  skrll 
     76  1.1  skrll   if (expressionP->X_op == O_big)
     77  1.1  skrll     {
     78  1.1  skrll       /* This won't work, because the actual value is stored in
     79  1.1  skrll 	 generic_floating_point_number or generic_bignum, and we are
     80  1.1  skrll 	 going to lose it if we haven't already.  */
     81  1.1  skrll       if (expressionP->X_add_number > 0)
     82  1.1  skrll 	as_bad (_("bignum invalid"));
     83  1.1  skrll       else
     84  1.1  skrll 	as_bad (_("floating point number invalid"));
     85  1.1  skrll       zero.X_op = O_constant;
     86  1.1  skrll       zero.X_add_number = 0;
     87  1.1  skrll       zero.X_unsigned = 0;
     88  1.1  skrll       clean_up_expression (&zero);
     89  1.1  skrll       expressionP = &zero;
     90  1.1  skrll     }
     91  1.1  skrll 
     92  1.1  skrll   /* Putting constant symbols in absolute_section rather than
     93  1.1  skrll      expr_section is convenient for the old a.out code, for which
     94  1.1  skrll      S_GET_SEGMENT does not always retrieve the value put in by
     95  1.1  skrll      S_SET_SEGMENT.  */
     96  1.1  skrll   symbolP = symbol_create (FAKE_LABEL_NAME,
     97  1.1  skrll 			   (expressionP->X_op == O_constant
     98  1.1  skrll 			    ? absolute_section
     99  1.1  skrll 			    : expressionP->X_op == O_register
    100  1.1  skrll 			      ? reg_section
    101  1.1  skrll 			      : expr_section),
    102  1.1  skrll 			   0, &zero_address_frag);
    103  1.1  skrll   symbol_set_value_expression (symbolP, expressionP);
    104  1.1  skrll 
    105  1.1  skrll   if (expressionP->X_op == O_constant)
    106  1.1  skrll     resolve_symbol_value (symbolP);
    107  1.1  skrll 
    108  1.1  skrll   n = (struct expr_symbol_line *) xmalloc (sizeof *n);
    109  1.1  skrll   n->sym = symbolP;
    110  1.1  skrll   as_where (&n->file, &n->line);
    111  1.1  skrll   n->next = expr_symbol_lines;
    112  1.1  skrll   expr_symbol_lines = n;
    113  1.1  skrll 
    114  1.1  skrll   return symbolP;
    115  1.1  skrll }
    116  1.1  skrll 
    117  1.1  skrll /* Return the file and line number for an expr symbol.  Return
    118  1.1  skrll    non-zero if something was found, 0 if no information is known for
    119  1.1  skrll    the symbol.  */
    120  1.1  skrll 
    121  1.1  skrll int
    122  1.1  skrll expr_symbol_where (symbolS *sym, char **pfile, unsigned int *pline)
    123  1.1  skrll {
    124  1.1  skrll   register struct expr_symbol_line *l;
    125  1.1  skrll 
    126  1.1  skrll   for (l = expr_symbol_lines; l != NULL; l = l->next)
    127  1.1  skrll     {
    128  1.1  skrll       if (l->sym == sym)
    129  1.1  skrll 	{
    130  1.1  skrll 	  *pfile = l->file;
    131  1.1  skrll 	  *pline = l->line;
    132  1.1  skrll 	  return 1;
    133  1.1  skrll 	}
    134  1.1  skrll     }
    135  1.1  skrll 
    136  1.1  skrll   return 0;
    137  1.1  skrll }
    138  1.1  skrll 
    139  1.1  skrll /* Utilities for building expressions.
    141  1.1  skrll    Since complex expressions are recorded as symbols for use in other
    142  1.1  skrll    expressions these return a symbolS * and not an expressionS *.
    143  1.1  skrll    These explicitly do not take an "add_number" argument.  */
    144  1.1  skrll /* ??? For completeness' sake one might want expr_build_symbol.
    145  1.1  skrll    It would just return its argument.  */
    146  1.1  skrll 
    147  1.1  skrll /* Build an expression for an unsigned constant.
    148  1.1  skrll    The corresponding one for signed constants is missing because
    149  1.1  skrll    there's currently no need for it.  One could add an unsigned_p flag
    150  1.1  skrll    but that seems more clumsy.  */
    151  1.1  skrll 
    152  1.1  skrll symbolS *
    153  1.1  skrll expr_build_uconstant (offsetT value)
    154  1.1  skrll {
    155  1.1  skrll   expressionS e;
    156  1.1  skrll 
    157  1.1  skrll   e.X_op = O_constant;
    158  1.1  skrll   e.X_add_number = value;
    159  1.1  skrll   e.X_unsigned = 1;
    160  1.1  skrll   return make_expr_symbol (&e);
    161  1.1  skrll }
    162  1.1  skrll 
    163  1.1  skrll /* Build an expression for the current location ('.').  */
    164  1.1  skrll 
    165  1.1  skrll symbolS *
    166  1.1  skrll expr_build_dot (void)
    167  1.1  skrll {
    168  1.1  skrll   expressionS e;
    169  1.1  skrll 
    170  1.1  skrll   current_location (&e);
    171  1.1  skrll   return make_expr_symbol (&e);
    172  1.1  skrll }
    173  1.1  skrll 
    174  1.1  skrll /* Build any floating-point literal here.
    176  1.1  skrll    Also build any bignum literal here.  */
    177  1.1  skrll 
    178  1.1  skrll /* Seems atof_machine can backscan through generic_bignum and hit whatever
    179  1.1  skrll    happens to be loaded before it in memory.  And its way too complicated
    180  1.1  skrll    for me to fix right.  Thus a hack.  JF:  Just make generic_bignum bigger,
    181  1.1  skrll    and never write into the early words, thus they'll always be zero.
    182  1.1  skrll    I hate Dean's floating-point code.  Bleh.  */
    183  1.1  skrll LITTLENUM_TYPE generic_bignum[SIZE_OF_LARGE_NUMBER + 6];
    184  1.1  skrll 
    185  1.1  skrll FLONUM_TYPE generic_floating_point_number = {
    186  1.1  skrll   &generic_bignum[6],		/* low.  (JF: Was 0)  */
    187  1.1  skrll   &generic_bignum[SIZE_OF_LARGE_NUMBER + 6 - 1], /* high.  JF: (added +6)  */
    188  1.1  skrll   0,				/* leader.  */
    189  1.1  skrll   0,				/* exponent.  */
    190  1.1  skrll   0				/* sign.  */
    191  1.1  skrll };
    192  1.1  skrll 
    193  1.1  skrll 
    194  1.1  skrll static void
    196  1.1  skrll floating_constant (expressionS *expressionP)
    197  1.1  skrll {
    198  1.1  skrll   /* input_line_pointer -> floating-point constant.  */
    199  1.1  skrll   int error_code;
    200  1.1  skrll 
    201  1.1  skrll   error_code = atof_generic (&input_line_pointer, ".", EXP_CHARS,
    202  1.1  skrll 			     &generic_floating_point_number);
    203  1.1  skrll 
    204  1.1  skrll   if (error_code)
    205  1.1  skrll     {
    206  1.1  skrll       if (error_code == ERROR_EXPONENT_OVERFLOW)
    207  1.1  skrll 	{
    208  1.1  skrll 	  as_bad (_("bad floating-point constant: exponent overflow"));
    209  1.1  skrll 	}
    210  1.1  skrll       else
    211  1.1  skrll 	{
    212  1.1  skrll 	  as_bad (_("bad floating-point constant: unknown error code=%d"),
    213  1.1  skrll 		  error_code);
    214  1.1  skrll 	}
    215  1.1  skrll     }
    216  1.1  skrll   expressionP->X_op = O_big;
    217  1.1  skrll   /* input_line_pointer -> just after constant, which may point to
    218  1.1  skrll      whitespace.  */
    219  1.1  skrll   expressionP->X_add_number = -1;
    220  1.1  skrll }
    221  1.1  skrll 
    222  1.1  skrll static valueT
    223  1.1  skrll generic_bignum_to_int32 (void)
    224  1.1  skrll {
    225  1.1  skrll   valueT number =
    226  1.1  skrll 	   ((generic_bignum[1] & LITTLENUM_MASK) << LITTLENUM_NUMBER_OF_BITS)
    227  1.1  skrll 	   | (generic_bignum[0] & LITTLENUM_MASK);
    228  1.1  skrll   number &= 0xffffffff;
    229  1.1  skrll   return number;
    230  1.1  skrll }
    231  1.1  skrll 
    232  1.1  skrll #ifdef BFD64
    233  1.1  skrll static valueT
    234  1.1  skrll generic_bignum_to_int64 (void)
    235  1.1  skrll {
    236  1.1  skrll   valueT number =
    237  1.1  skrll     ((((((((valueT) generic_bignum[3] & LITTLENUM_MASK)
    238  1.1  skrll 	  << LITTLENUM_NUMBER_OF_BITS)
    239  1.1  skrll 	 | ((valueT) generic_bignum[2] & LITTLENUM_MASK))
    240  1.1  skrll 	<< LITTLENUM_NUMBER_OF_BITS)
    241  1.1  skrll        | ((valueT) generic_bignum[1] & LITTLENUM_MASK))
    242  1.1  skrll       << LITTLENUM_NUMBER_OF_BITS)
    243  1.1  skrll      | ((valueT) generic_bignum[0] & LITTLENUM_MASK));
    244  1.1  skrll   return number;
    245  1.1  skrll }
    246  1.1  skrll #endif
    247  1.1  skrll 
    248  1.1  skrll static void
    249  1.1  skrll integer_constant (int radix, expressionS *expressionP)
    250  1.1  skrll {
    251  1.1  skrll   char *start;		/* Start of number.  */
    252  1.1  skrll   char *suffix = NULL;
    253  1.1  skrll   char c;
    254  1.1  skrll   valueT number;	/* Offset or (absolute) value.  */
    255  1.1  skrll   short int digit;	/* Value of next digit in current radix.  */
    256  1.1  skrll   short int maxdig = 0;	/* Highest permitted digit value.  */
    257  1.1  skrll   int too_many_digits = 0;	/* If we see >= this number of.  */
    258  1.1  skrll   char *name;		/* Points to name of symbol.  */
    259  1.1  skrll   symbolS *symbolP;	/* Points to symbol.  */
    260  1.1  skrll 
    261  1.1  skrll   int small;			/* True if fits in 32 bits.  */
    262  1.1  skrll 
    263  1.1  skrll   /* May be bignum, or may fit in 32 bits.  */
    264  1.1  skrll   /* Most numbers fit into 32 bits, and we want this case to be fast.
    265  1.1  skrll      so we pretend it will fit into 32 bits.  If, after making up a 32
    266  1.1  skrll      bit number, we realise that we have scanned more digits than
    267  1.1  skrll      comfortably fit into 32 bits, we re-scan the digits coding them
    268  1.1  skrll      into a bignum.  For decimal and octal numbers we are
    269  1.1  skrll      conservative: Some numbers may be assumed bignums when in fact
    270  1.1  skrll      they do fit into 32 bits.  Numbers of any radix can have excess
    271  1.1  skrll      leading zeros: We strive to recognise this and cast them back
    272  1.1  skrll      into 32 bits.  We must check that the bignum really is more than
    273  1.1  skrll      32 bits, and change it back to a 32-bit number if it fits.  The
    274  1.1  skrll      number we are looking for is expected to be positive, but if it
    275  1.1  skrll      fits into 32 bits as an unsigned number, we let it be a 32-bit
    276  1.1  skrll      number.  The cavalier approach is for speed in ordinary cases.  */
    277  1.1  skrll   /* This has been extended for 64 bits.  We blindly assume that if
    278  1.1  skrll      you're compiling in 64-bit mode, the target is a 64-bit machine.
    279  1.1  skrll      This should be cleaned up.  */
    280  1.1  skrll 
    281  1.1  skrll #ifdef BFD64
    282  1.1  skrll #define valuesize 64
    283  1.1  skrll #else /* includes non-bfd case, mostly */
    284  1.1  skrll #define valuesize 32
    285  1.1  skrll #endif
    286  1.1  skrll 
    287  1.1  skrll   if ((NUMBERS_WITH_SUFFIX || flag_m68k_mri) && radix == 0)
    288  1.1  skrll     {
    289  1.1  skrll       int flt = 0;
    290  1.1  skrll 
    291  1.1  skrll       /* In MRI mode, the number may have a suffix indicating the
    292  1.1  skrll 	 radix.  For that matter, it might actually be a floating
    293  1.1  skrll 	 point constant.  */
    294  1.1  skrll       for (suffix = input_line_pointer; ISALNUM (*suffix); suffix++)
    295  1.1  skrll 	{
    296  1.1  skrll 	  if (*suffix == 'e' || *suffix == 'E')
    297  1.1  skrll 	    flt = 1;
    298  1.1  skrll 	}
    299  1.1  skrll 
    300  1.1  skrll       if (suffix == input_line_pointer)
    301  1.1  skrll 	{
    302  1.1  skrll 	  radix = 10;
    303  1.1  skrll 	  suffix = NULL;
    304  1.1  skrll 	}
    305  1.1  skrll       else
    306  1.1  skrll 	{
    307  1.1  skrll 	  c = *--suffix;
    308  1.1  skrll 	  c = TOUPPER (c);
    309  1.1  skrll 	  /* If we have both NUMBERS_WITH_SUFFIX and LOCAL_LABELS_FB,
    310  1.1  skrll 	     we distinguish between 'B' and 'b'.  This is the case for
    311  1.1  skrll 	     Z80.  */
    312  1.1  skrll 	  if ((NUMBERS_WITH_SUFFIX && LOCAL_LABELS_FB ? *suffix : c) == 'B')
    313  1.1  skrll 	    radix = 2;
    314  1.1  skrll 	  else if (c == 'D')
    315  1.1  skrll 	    radix = 10;
    316  1.1  skrll 	  else if (c == 'O' || c == 'Q')
    317  1.1  skrll 	    radix = 8;
    318  1.1  skrll 	  else if (c == 'H')
    319  1.1  skrll 	    radix = 16;
    320  1.1  skrll 	  else if (suffix[1] == '.' || c == 'E' || flt)
    321  1.1  skrll 	    {
    322  1.1  skrll 	      floating_constant (expressionP);
    323  1.1  skrll 	      return;
    324  1.1  skrll 	    }
    325  1.1  skrll 	  else
    326  1.1  skrll 	    {
    327  1.1  skrll 	      radix = 10;
    328  1.1  skrll 	      suffix = NULL;
    329  1.1  skrll 	    }
    330  1.1  skrll 	}
    331  1.1  skrll     }
    332  1.1  skrll 
    333  1.1  skrll   switch (radix)
    334  1.1  skrll     {
    335  1.1  skrll     case 2:
    336  1.1  skrll       maxdig = 2;
    337  1.1  skrll       too_many_digits = valuesize + 1;
    338  1.1  skrll       break;
    339  1.1  skrll     case 8:
    340  1.1  skrll       maxdig = radix = 8;
    341  1.1  skrll       too_many_digits = (valuesize + 2) / 3 + 1;
    342  1.1  skrll       break;
    343  1.1  skrll     case 16:
    344  1.1  skrll       maxdig = radix = 16;
    345  1.1  skrll       too_many_digits = (valuesize + 3) / 4 + 1;
    346  1.1  skrll       break;
    347  1.1  skrll     case 10:
    348  1.1  skrll       maxdig = radix = 10;
    349  1.1  skrll       too_many_digits = (valuesize + 11) / 4; /* Very rough.  */
    350  1.1  skrll     }
    351  1.1  skrll #undef valuesize
    352  1.1  skrll   start = input_line_pointer;
    353  1.1  skrll   c = *input_line_pointer++;
    354  1.1  skrll   for (number = 0;
    355  1.1  skrll        (digit = hex_value (c)) < maxdig;
    356  1.1  skrll        c = *input_line_pointer++)
    357  1.1  skrll     {
    358  1.1  skrll       number = number * radix + digit;
    359  1.1  skrll     }
    360  1.1  skrll   /* c contains character after number.  */
    361  1.1  skrll   /* input_line_pointer->char after c.  */
    362  1.1  skrll   small = (input_line_pointer - start - 1) < too_many_digits;
    363  1.1  skrll 
    364  1.1  skrll   if (radix == 16 && c == '_')
    365  1.1  skrll     {
    366  1.1  skrll       /* This is literal of the form 0x333_0_12345678_1.
    367  1.1  skrll 	 This example is equivalent to 0x00000333000000001234567800000001.  */
    368  1.1  skrll 
    369  1.1  skrll       int num_little_digits = 0;
    370  1.1  skrll       int i;
    371  1.1  skrll       input_line_pointer = start;	/* -> 1st digit.  */
    372  1.1  skrll 
    373  1.1  skrll       know (LITTLENUM_NUMBER_OF_BITS == 16);
    374  1.1  skrll 
    375  1.1  skrll       for (c = '_'; c == '_'; num_little_digits += 2)
    376  1.1  skrll 	{
    377  1.1  skrll 
    378  1.1  skrll 	  /* Convert one 64-bit word.  */
    379  1.1  skrll 	  int ndigit = 0;
    380  1.1  skrll 	  number = 0;
    381  1.1  skrll 	  for (c = *input_line_pointer++;
    382  1.1  skrll 	       (digit = hex_value (c)) < maxdig;
    383  1.1  skrll 	       c = *(input_line_pointer++))
    384  1.1  skrll 	    {
    385  1.1  skrll 	      number = number * radix + digit;
    386  1.1  skrll 	      ndigit++;
    387  1.1  skrll 	    }
    388  1.1  skrll 
    389  1.1  skrll 	  /* Check for 8 digit per word max.  */
    390  1.1  skrll 	  if (ndigit > 8)
    391  1.1  skrll 	    as_bad (_("a bignum with underscores may not have more than 8 hex digits in any word"));
    392  1.1  skrll 
    393  1.1  skrll 	  /* Add this chunk to the bignum.
    394  1.1  skrll 	     Shift things down 2 little digits.  */
    395  1.1  skrll 	  know (LITTLENUM_NUMBER_OF_BITS == 16);
    396  1.1  skrll 	  for (i = min (num_little_digits + 1, SIZE_OF_LARGE_NUMBER - 1);
    397  1.1  skrll 	       i >= 2;
    398  1.1  skrll 	       i--)
    399  1.1  skrll 	    generic_bignum[i] = generic_bignum[i - 2];
    400  1.1  skrll 
    401  1.1  skrll 	  /* Add the new digits as the least significant new ones.  */
    402  1.1  skrll 	  generic_bignum[0] = number & 0xffffffff;
    403  1.1  skrll 	  generic_bignum[1] = number >> 16;
    404  1.1  skrll 	}
    405  1.1  skrll 
    406  1.1  skrll       /* Again, c is char after number, input_line_pointer->after c.  */
    407  1.1  skrll 
    408  1.1  skrll       if (num_little_digits > SIZE_OF_LARGE_NUMBER - 1)
    409  1.1  skrll 	num_little_digits = SIZE_OF_LARGE_NUMBER - 1;
    410  1.1  skrll 
    411  1.1  skrll       assert (num_little_digits >= 4);
    412  1.1  skrll 
    413  1.1  skrll       if (num_little_digits != 8)
    414  1.1  skrll 	as_bad (_("a bignum with underscores must have exactly 4 words"));
    415  1.1  skrll 
    416  1.1  skrll       /* We might have some leading zeros.  These can be trimmed to give
    417  1.1  skrll 	 us a change to fit this constant into a small number.  */
    418  1.1  skrll       while (generic_bignum[num_little_digits - 1] == 0
    419  1.1  skrll 	     && num_little_digits > 1)
    420  1.1  skrll 	num_little_digits--;
    421  1.1  skrll 
    422  1.1  skrll       if (num_little_digits <= 2)
    423  1.1  skrll 	{
    424  1.1  skrll 	  /* will fit into 32 bits.  */
    425  1.1  skrll 	  number = generic_bignum_to_int32 ();
    426  1.1  skrll 	  small = 1;
    427  1.1  skrll 	}
    428  1.1  skrll #ifdef BFD64
    429  1.1  skrll       else if (num_little_digits <= 4)
    430  1.1  skrll 	{
    431  1.1  skrll 	  /* Will fit into 64 bits.  */
    432  1.1  skrll 	  number = generic_bignum_to_int64 ();
    433  1.1  skrll 	  small = 1;
    434  1.1  skrll 	}
    435  1.1  skrll #endif
    436  1.1  skrll       else
    437  1.1  skrll 	{
    438  1.1  skrll 	  small = 0;
    439  1.1  skrll 
    440  1.1  skrll 	  /* Number of littlenums in the bignum.  */
    441  1.1  skrll 	  number = num_little_digits;
    442  1.1  skrll 	}
    443  1.1  skrll     }
    444  1.1  skrll   else if (!small)
    445  1.1  skrll     {
    446  1.1  skrll       /* We saw a lot of digits. manufacture a bignum the hard way.  */
    447  1.1  skrll       LITTLENUM_TYPE *leader;	/* -> high order littlenum of the bignum.  */
    448  1.1  skrll       LITTLENUM_TYPE *pointer;	/* -> littlenum we are frobbing now.  */
    449  1.1  skrll       long carry;
    450  1.1  skrll 
    451  1.1  skrll       leader = generic_bignum;
    452  1.1  skrll       generic_bignum[0] = 0;
    453  1.1  skrll       generic_bignum[1] = 0;
    454  1.1  skrll       generic_bignum[2] = 0;
    455  1.1  skrll       generic_bignum[3] = 0;
    456  1.1  skrll       input_line_pointer = start;	/* -> 1st digit.  */
    457  1.1  skrll       c = *input_line_pointer++;
    458  1.1  skrll       for (; (carry = hex_value (c)) < maxdig; c = *input_line_pointer++)
    459  1.1  skrll 	{
    460  1.1  skrll 	  for (pointer = generic_bignum; pointer <= leader; pointer++)
    461  1.1  skrll 	    {
    462  1.1  skrll 	      long work;
    463  1.1  skrll 
    464  1.1  skrll 	      work = carry + radix * *pointer;
    465  1.1  skrll 	      *pointer = work & LITTLENUM_MASK;
    466  1.1  skrll 	      carry = work >> LITTLENUM_NUMBER_OF_BITS;
    467  1.1  skrll 	    }
    468  1.1  skrll 	  if (carry)
    469  1.1  skrll 	    {
    470  1.1  skrll 	      if (leader < generic_bignum + SIZE_OF_LARGE_NUMBER - 1)
    471  1.1  skrll 		{
    472  1.1  skrll 		  /* Room to grow a longer bignum.  */
    473  1.1  skrll 		  *++leader = carry;
    474  1.1  skrll 		}
    475  1.1  skrll 	    }
    476  1.1  skrll 	}
    477  1.1  skrll       /* Again, c is char after number.  */
    478  1.1  skrll       /* input_line_pointer -> after c.  */
    479  1.1  skrll       know (LITTLENUM_NUMBER_OF_BITS == 16);
    480  1.1  skrll       if (leader < generic_bignum + 2)
    481  1.1  skrll 	{
    482  1.1  skrll 	  /* Will fit into 32 bits.  */
    483  1.1  skrll 	  number = generic_bignum_to_int32 ();
    484  1.1  skrll 	  small = 1;
    485  1.1  skrll 	}
    486  1.1  skrll #ifdef BFD64
    487  1.1  skrll       else if (leader < generic_bignum + 4)
    488  1.1  skrll 	{
    489  1.1  skrll 	  /* Will fit into 64 bits.  */
    490  1.1  skrll 	  number = generic_bignum_to_int64 ();
    491  1.1  skrll 	  small = 1;
    492  1.1  skrll 	}
    493  1.1  skrll #endif
    494  1.1  skrll       else
    495  1.1  skrll 	{
    496  1.1  skrll 	  /* Number of littlenums in the bignum.  */
    497  1.1  skrll 	  number = leader - generic_bignum + 1;
    498  1.1  skrll 	}
    499  1.1  skrll     }
    500  1.1  skrll 
    501  1.1  skrll   if ((NUMBERS_WITH_SUFFIX || flag_m68k_mri)
    502  1.1  skrll       && suffix != NULL
    503  1.1  skrll       && input_line_pointer - 1 == suffix)
    504  1.1  skrll     c = *input_line_pointer++;
    505  1.1  skrll 
    506  1.1  skrll   if (small)
    507  1.1  skrll     {
    508  1.1  skrll       /* Here with number, in correct radix. c is the next char.
    509  1.1  skrll 	 Note that unlike un*x, we allow "011f" "0x9f" to both mean
    510  1.1  skrll 	 the same as the (conventional) "9f".
    511  1.1  skrll 	 This is simply easier than checking for strict canonical
    512  1.1  skrll 	 form.  Syntax sux!  */
    513  1.1  skrll 
    514  1.1  skrll       if (LOCAL_LABELS_FB && c == 'b')
    515  1.1  skrll 	{
    516  1.1  skrll 	  /* Backward ref to local label.
    517  1.1  skrll 	     Because it is backward, expect it to be defined.  */
    518  1.1  skrll 	  /* Construct a local label.  */
    519  1.1  skrll 	  name = fb_label_name ((int) number, 0);
    520  1.1  skrll 
    521  1.1  skrll 	  /* Seen before, or symbol is defined: OK.  */
    522  1.1  skrll 	  symbolP = symbol_find (name);
    523  1.1  skrll 	  if ((symbolP != NULL) && (S_IS_DEFINED (symbolP)))
    524  1.1  skrll 	    {
    525  1.1  skrll 	      /* Local labels are never absolute.  Don't waste time
    526  1.1  skrll 		 checking absoluteness.  */
    527  1.1  skrll 	      know (SEG_NORMAL (S_GET_SEGMENT (symbolP)));
    528  1.1  skrll 
    529  1.1  skrll 	      expressionP->X_op = O_symbol;
    530  1.1  skrll 	      expressionP->X_add_symbol = symbolP;
    531  1.1  skrll 	    }
    532  1.1  skrll 	  else
    533  1.1  skrll 	    {
    534  1.1  skrll 	      /* Either not seen or not defined.  */
    535  1.1  skrll 	      /* @@ Should print out the original string instead of
    536  1.1  skrll 		 the parsed number.  */
    537  1.1  skrll 	      as_bad (_("backward ref to unknown label \"%d:\""),
    538  1.1  skrll 		      (int) number);
    539  1.1  skrll 	      expressionP->X_op = O_constant;
    540  1.1  skrll 	    }
    541  1.1  skrll 
    542  1.1  skrll 	  expressionP->X_add_number = 0;
    543  1.1  skrll 	}			/* case 'b' */
    544  1.1  skrll       else if (LOCAL_LABELS_FB && c == 'f')
    545  1.1  skrll 	{
    546  1.1  skrll 	  /* Forward reference.  Expect symbol to be undefined or
    547  1.1  skrll 	     unknown.  undefined: seen it before.  unknown: never seen
    548  1.1  skrll 	     it before.
    549  1.1  skrll 
    550  1.1  skrll 	     Construct a local label name, then an undefined symbol.
    551  1.1  skrll 	     Don't create a xseg frag for it: caller may do that.
    552  1.1  skrll 	     Just return it as never seen before.  */
    553  1.1  skrll 	  name = fb_label_name ((int) number, 1);
    554  1.1  skrll 	  symbolP = symbol_find_or_make (name);
    555  1.1  skrll 	  /* We have no need to check symbol properties.  */
    556  1.1  skrll #ifndef many_segments
    557  1.1  skrll 	  /* Since "know" puts its arg into a "string", we
    558  1.1  skrll 	     can't have newlines in the argument.  */
    559  1.1  skrll 	  know (S_GET_SEGMENT (symbolP) == undefined_section || S_GET_SEGMENT (symbolP) == text_section || S_GET_SEGMENT (symbolP) == data_section);
    560  1.1  skrll #endif
    561  1.1  skrll 	  expressionP->X_op = O_symbol;
    562  1.1  skrll 	  expressionP->X_add_symbol = symbolP;
    563  1.1  skrll 	  expressionP->X_add_number = 0;
    564  1.1  skrll 	}			/* case 'f' */
    565  1.1  skrll       else if (LOCAL_LABELS_DOLLAR && c == '$')
    566  1.1  skrll 	{
    567  1.1  skrll 	  /* If the dollar label is *currently* defined, then this is just
    568  1.1  skrll 	     another reference to it.  If it is not *currently* defined,
    569  1.1  skrll 	     then this is a fresh instantiation of that number, so create
    570  1.1  skrll 	     it.  */
    571  1.1  skrll 
    572  1.1  skrll 	  if (dollar_label_defined ((long) number))
    573  1.1  skrll 	    {
    574  1.1  skrll 	      name = dollar_label_name ((long) number, 0);
    575  1.1  skrll 	      symbolP = symbol_find (name);
    576  1.1  skrll 	      know (symbolP != NULL);
    577  1.1  skrll 	    }
    578  1.1  skrll 	  else
    579  1.1  skrll 	    {
    580  1.1  skrll 	      name = dollar_label_name ((long) number, 1);
    581  1.1  skrll 	      symbolP = symbol_find_or_make (name);
    582  1.1  skrll 	    }
    583  1.1  skrll 
    584  1.1  skrll 	  expressionP->X_op = O_symbol;
    585  1.1  skrll 	  expressionP->X_add_symbol = symbolP;
    586  1.1  skrll 	  expressionP->X_add_number = 0;
    587  1.1  skrll 	}			/* case '$' */
    588  1.1  skrll       else
    589  1.1  skrll 	{
    590  1.1  skrll 	  expressionP->X_op = O_constant;
    591  1.1  skrll 	  expressionP->X_add_number = number;
    592  1.1  skrll 	  input_line_pointer--;	/* Restore following character.  */
    593  1.1  skrll 	}			/* Really just a number.  */
    594  1.1  skrll     }
    595  1.1  skrll   else
    596  1.1  skrll     {
    597  1.1  skrll       /* Not a small number.  */
    598  1.1  skrll       expressionP->X_op = O_big;
    599  1.1  skrll       expressionP->X_add_number = number;	/* Number of littlenums.  */
    600  1.1  skrll       input_line_pointer--;	/* -> char following number.  */
    601  1.1  skrll     }
    602  1.1  skrll }
    603  1.1  skrll 
    604  1.1  skrll /* Parse an MRI multi character constant.  */
    605  1.1  skrll 
    606  1.1  skrll static void
    607  1.1  skrll mri_char_constant (expressionS *expressionP)
    608  1.1  skrll {
    609  1.1  skrll   int i;
    610  1.1  skrll 
    611  1.1  skrll   if (*input_line_pointer == '\''
    612  1.1  skrll       && input_line_pointer[1] != '\'')
    613  1.1  skrll     {
    614  1.1  skrll       expressionP->X_op = O_constant;
    615  1.1  skrll       expressionP->X_add_number = 0;
    616  1.1  skrll       return;
    617  1.1  skrll     }
    618  1.1  skrll 
    619  1.1  skrll   /* In order to get the correct byte ordering, we must build the
    620  1.1  skrll      number in reverse.  */
    621  1.1  skrll   for (i = SIZE_OF_LARGE_NUMBER - 1; i >= 0; i--)
    622  1.1  skrll     {
    623  1.1  skrll       int j;
    624  1.1  skrll 
    625  1.1  skrll       generic_bignum[i] = 0;
    626  1.1  skrll       for (j = 0; j < CHARS_PER_LITTLENUM; j++)
    627  1.1  skrll 	{
    628  1.1  skrll 	  if (*input_line_pointer == '\'')
    629  1.1  skrll 	    {
    630  1.1  skrll 	      if (input_line_pointer[1] != '\'')
    631  1.1  skrll 		break;
    632  1.1  skrll 	      ++input_line_pointer;
    633  1.1  skrll 	    }
    634  1.1  skrll 	  generic_bignum[i] <<= 8;
    635  1.1  skrll 	  generic_bignum[i] += *input_line_pointer;
    636  1.1  skrll 	  ++input_line_pointer;
    637  1.1  skrll 	}
    638  1.1  skrll 
    639  1.1  skrll       if (i < SIZE_OF_LARGE_NUMBER - 1)
    640  1.1  skrll 	{
    641  1.1  skrll 	  /* If there is more than one littlenum, left justify the
    642  1.1  skrll 	     last one to make it match the earlier ones.  If there is
    643  1.1  skrll 	     only one, we can just use the value directly.  */
    644  1.1  skrll 	  for (; j < CHARS_PER_LITTLENUM; j++)
    645  1.1  skrll 	    generic_bignum[i] <<= 8;
    646  1.1  skrll 	}
    647  1.1  skrll 
    648  1.1  skrll       if (*input_line_pointer == '\''
    649  1.1  skrll 	  && input_line_pointer[1] != '\'')
    650  1.1  skrll 	break;
    651  1.1  skrll     }
    652  1.1  skrll 
    653  1.1  skrll   if (i < 0)
    654  1.1  skrll     {
    655  1.1  skrll       as_bad (_("character constant too large"));
    656  1.1  skrll       i = 0;
    657  1.1  skrll     }
    658  1.1  skrll 
    659  1.1  skrll   if (i > 0)
    660  1.1  skrll     {
    661  1.1  skrll       int c;
    662  1.1  skrll       int j;
    663  1.1  skrll 
    664  1.1  skrll       c = SIZE_OF_LARGE_NUMBER - i;
    665  1.1  skrll       for (j = 0; j < c; j++)
    666  1.1  skrll 	generic_bignum[j] = generic_bignum[i + j];
    667  1.1  skrll       i = c;
    668  1.1  skrll     }
    669  1.1  skrll 
    670  1.1  skrll   know (LITTLENUM_NUMBER_OF_BITS == 16);
    671  1.1  skrll   if (i > 2)
    672  1.1  skrll     {
    673  1.1  skrll       expressionP->X_op = O_big;
    674  1.1  skrll       expressionP->X_add_number = i;
    675  1.1  skrll     }
    676  1.1  skrll   else
    677  1.1  skrll     {
    678  1.1  skrll       expressionP->X_op = O_constant;
    679  1.1  skrll       if (i < 2)
    680  1.1  skrll 	expressionP->X_add_number = generic_bignum[0] & LITTLENUM_MASK;
    681  1.1  skrll       else
    682  1.1  skrll 	expressionP->X_add_number =
    683  1.1  skrll 	  (((generic_bignum[1] & LITTLENUM_MASK)
    684  1.1  skrll 	    << LITTLENUM_NUMBER_OF_BITS)
    685  1.1  skrll 	   | (generic_bignum[0] & LITTLENUM_MASK));
    686  1.1  skrll     }
    687  1.1  skrll 
    688  1.1  skrll   /* Skip the final closing quote.  */
    689  1.1  skrll   ++input_line_pointer;
    690  1.1  skrll }
    691  1.1  skrll 
    692  1.1  skrll /* Return an expression representing the current location.  This
    693  1.1  skrll    handles the magic symbol `.'.  */
    694  1.1  skrll 
    695  1.1  skrll static void
    696  1.1  skrll current_location (expressionS *expressionp)
    697  1.1  skrll {
    698  1.1  skrll   if (now_seg == absolute_section)
    699  1.1  skrll     {
    700  1.1  skrll       expressionp->X_op = O_constant;
    701  1.1  skrll       expressionp->X_add_number = abs_section_offset;
    702  1.1  skrll     }
    703  1.1  skrll   else
    704  1.1  skrll     {
    705  1.1  skrll       expressionp->X_op = O_symbol;
    706  1.1  skrll       expressionp->X_add_symbol = symbol_temp_new_now ();
    707  1.1  skrll       expressionp->X_add_number = 0;
    708  1.1  skrll     }
    709  1.1  skrll }
    710  1.1  skrll 
    711  1.1  skrll /* In:	Input_line_pointer points to 1st char of operand, which may
    712  1.1  skrll 	be a space.
    713  1.1  skrll 
    714  1.1  skrll    Out:	An expressionS.
    715  1.1  skrll 	The operand may have been empty: in this case X_op == O_absent.
    716  1.1  skrll 	Input_line_pointer->(next non-blank) char after operand.  */
    717  1.1  skrll 
    718  1.1  skrll static segT
    719  1.1  skrll operand (expressionS *expressionP, enum expr_mode mode)
    720  1.1  skrll {
    721  1.1  skrll   char c;
    722  1.1  skrll   symbolS *symbolP;	/* Points to symbol.  */
    723  1.1  skrll   char *name;		/* Points to name of symbol.  */
    724  1.1  skrll   segT segment;
    725  1.1  skrll 
    726  1.1  skrll   /* All integers are regarded as unsigned unless they are negated.
    727  1.1  skrll      This is because the only thing which cares whether a number is
    728  1.1  skrll      unsigned is the code in emit_expr which extends constants into
    729  1.1  skrll      bignums.  It should only sign extend negative numbers, so that
    730  1.1  skrll      something like ``.quad 0x80000000'' is not sign extended even
    731  1.1  skrll      though it appears negative if valueT is 32 bits.  */
    732  1.1  skrll   expressionP->X_unsigned = 1;
    733  1.1  skrll 
    734  1.1  skrll   /* Digits, assume it is a bignum.  */
    735  1.1  skrll 
    736  1.1  skrll   SKIP_WHITESPACE ();		/* Leading whitespace is part of operand.  */
    737  1.1  skrll   c = *input_line_pointer++;	/* input_line_pointer -> past char in c.  */
    738  1.1  skrll 
    739  1.1  skrll   if (is_end_of_line[(unsigned char) c])
    740  1.1  skrll     goto eol;
    741  1.1  skrll 
    742  1.1  skrll   switch (c)
    743  1.1  skrll     {
    744  1.1  skrll     case '1':
    745  1.1  skrll     case '2':
    746  1.1  skrll     case '3':
    747  1.1  skrll     case '4':
    748  1.1  skrll     case '5':
    749  1.1  skrll     case '6':
    750  1.1  skrll     case '7':
    751  1.1  skrll     case '8':
    752  1.1  skrll     case '9':
    753  1.1  skrll       input_line_pointer--;
    754  1.1  skrll 
    755  1.1  skrll       integer_constant ((NUMBERS_WITH_SUFFIX || flag_m68k_mri)
    756  1.1  skrll 			? 0 : 10,
    757  1.1  skrll 			expressionP);
    758  1.1  skrll       break;
    759  1.1  skrll 
    760  1.1  skrll #ifdef LITERAL_PREFIXDOLLAR_HEX
    761  1.1  skrll     case '$':
    762  1.1  skrll       /* $L is the start of a local label, not a hex constant.  */
    763  1.1  skrll       if (* input_line_pointer == 'L')
    764  1.1  skrll       goto isname;
    765  1.1  skrll       integer_constant (16, expressionP);
    766  1.1  skrll       break;
    767  1.1  skrll #endif
    768  1.1  skrll 
    769  1.1  skrll #ifdef LITERAL_PREFIXPERCENT_BIN
    770  1.1  skrll     case '%':
    771  1.1  skrll       integer_constant (2, expressionP);
    772  1.1  skrll       break;
    773  1.1  skrll #endif
    774  1.1  skrll 
    775  1.1  skrll     case '0':
    776  1.1  skrll       /* Non-decimal radix.  */
    777  1.1  skrll 
    778  1.1  skrll       if (NUMBERS_WITH_SUFFIX || flag_m68k_mri)
    779  1.1  skrll 	{
    780  1.1  skrll 	  char *s;
    781  1.1  skrll 
    782  1.1  skrll 	  /* Check for a hex or float constant.  */
    783  1.1  skrll 	  for (s = input_line_pointer; hex_p (*s); s++)
    784  1.1  skrll 	    ;
    785  1.1  skrll 	  if (*s == 'h' || *s == 'H' || *input_line_pointer == '.')
    786  1.1  skrll 	    {
    787  1.1  skrll 	      --input_line_pointer;
    788  1.1  skrll 	      integer_constant (0, expressionP);
    789  1.1  skrll 	      break;
    790  1.1  skrll 	    }
    791  1.1  skrll 	}
    792  1.1  skrll       c = *input_line_pointer;
    793  1.1  skrll       switch (c)
    794  1.1  skrll 	{
    795  1.1  skrll 	case 'o':
    796  1.1  skrll 	case 'O':
    797  1.1  skrll 	case 'q':
    798  1.1  skrll 	case 'Q':
    799  1.1  skrll 	case '8':
    800  1.1  skrll 	case '9':
    801  1.1  skrll 	  if (NUMBERS_WITH_SUFFIX || flag_m68k_mri)
    802  1.1  skrll 	    {
    803  1.1  skrll 	      integer_constant (0, expressionP);
    804  1.1  skrll 	      break;
    805  1.1  skrll 	    }
    806  1.1  skrll 	  /* Fall through.  */
    807  1.1  skrll 	default:
    808  1.1  skrll 	default_case:
    809  1.1  skrll 	  if (c && strchr (FLT_CHARS, c))
    810  1.1  skrll 	    {
    811  1.1  skrll 	      input_line_pointer++;
    812  1.1  skrll 	      floating_constant (expressionP);
    813  1.1  skrll 	      expressionP->X_add_number = - TOLOWER (c);
    814  1.1  skrll 	    }
    815  1.1  skrll 	  else
    816  1.1  skrll 	    {
    817  1.1  skrll 	      /* The string was only zero.  */
    818  1.1  skrll 	      expressionP->X_op = O_constant;
    819  1.1  skrll 	      expressionP->X_add_number = 0;
    820  1.1  skrll 	    }
    821  1.1  skrll 
    822  1.1  skrll 	  break;
    823  1.1  skrll 
    824  1.1  skrll 	case 'x':
    825  1.1  skrll 	case 'X':
    826  1.1  skrll 	  if (flag_m68k_mri)
    827  1.1  skrll 	    goto default_case;
    828  1.1  skrll 	  input_line_pointer++;
    829  1.1  skrll 	  integer_constant (16, expressionP);
    830  1.1  skrll 	  break;
    831  1.1  skrll 
    832  1.1  skrll 	case 'b':
    833  1.1  skrll 	  if (LOCAL_LABELS_FB && ! (flag_m68k_mri || NUMBERS_WITH_SUFFIX))
    834  1.1  skrll 	    {
    835  1.1  skrll 	      /* This code used to check for '+' and '-' here, and, in
    836  1.1  skrll 		 some conditions, fall through to call
    837  1.1  skrll 		 integer_constant.  However, that didn't make sense,
    838  1.1  skrll 		 as integer_constant only accepts digits.  */
    839  1.1  skrll 	      /* Some of our code elsewhere does permit digits greater
    840  1.1  skrll 		 than the expected base; for consistency, do the same
    841  1.1  skrll 		 here.  */
    842  1.1  skrll 	      if (input_line_pointer[1] < '0'
    843  1.1  skrll 		  || input_line_pointer[1] > '9')
    844  1.1  skrll 		{
    845  1.1  skrll 		  /* Parse this as a back reference to label 0.  */
    846  1.1  skrll 		  input_line_pointer--;
    847  1.1  skrll 		  integer_constant (10, expressionP);
    848  1.1  skrll 		  break;
    849  1.1  skrll 		}
    850  1.1  skrll 	      /* Otherwise, parse this as a binary number.  */
    851  1.1  skrll 	    }
    852  1.1  skrll 	  /* Fall through.  */
    853  1.1  skrll 	case 'B':
    854  1.1  skrll 	  input_line_pointer++;
    855  1.1  skrll 	  if (flag_m68k_mri || NUMBERS_WITH_SUFFIX)
    856  1.1  skrll 	    goto default_case;
    857  1.1  skrll 	  integer_constant (2, expressionP);
    858  1.1  skrll 	  break;
    859  1.1  skrll 
    860  1.1  skrll 	case '0':
    861  1.1  skrll 	case '1':
    862  1.1  skrll 	case '2':
    863  1.1  skrll 	case '3':
    864  1.1  skrll 	case '4':
    865  1.1  skrll 	case '5':
    866  1.1  skrll 	case '6':
    867  1.1  skrll 	case '7':
    868  1.1  skrll 	  integer_constant ((flag_m68k_mri || NUMBERS_WITH_SUFFIX)
    869  1.1  skrll 			    ? 0 : 8,
    870  1.1  skrll 			    expressionP);
    871  1.1  skrll 	  break;
    872  1.1  skrll 
    873  1.1  skrll 	case 'f':
    874  1.1  skrll 	  if (LOCAL_LABELS_FB)
    875  1.1  skrll 	    {
    876  1.1  skrll 	      /* If it says "0f" and it could possibly be a floating point
    877  1.1  skrll 		 number, make it one.  Otherwise, make it a local label,
    878  1.1  skrll 		 and try to deal with parsing the rest later.  */
    879  1.1  skrll 	      if (!input_line_pointer[1]
    880  1.1  skrll 		  || (is_end_of_line[0xff & input_line_pointer[1]])
    881  1.1  skrll 		  || strchr (FLT_CHARS, 'f') == NULL)
    882  1.1  skrll 		goto is_0f_label;
    883  1.1  skrll 	      {
    884  1.1  skrll 		char *cp = input_line_pointer + 1;
    885  1.1  skrll 		int r = atof_generic (&cp, ".", EXP_CHARS,
    886  1.1  skrll 				      &generic_floating_point_number);
    887  1.1  skrll 		switch (r)
    888  1.1  skrll 		  {
    889  1.1  skrll 		  case 0:
    890  1.1  skrll 		  case ERROR_EXPONENT_OVERFLOW:
    891  1.1  skrll 		    if (*cp == 'f' || *cp == 'b')
    892  1.1  skrll 		      /* Looks like a difference expression.  */
    893  1.1  skrll 		      goto is_0f_label;
    894  1.1  skrll 		    else if (cp == input_line_pointer + 1)
    895  1.1  skrll 		      /* No characters has been accepted -- looks like
    896  1.1  skrll 			 end of operand.  */
    897  1.1  skrll 		      goto is_0f_label;
    898  1.1  skrll 		    else
    899  1.1  skrll 		      goto is_0f_float;
    900  1.1  skrll 		  default:
    901  1.1  skrll 		    as_fatal (_("expr.c(operand): bad atof_generic return val %d"),
    902  1.1  skrll 			      r);
    903  1.1  skrll 		  }
    904  1.1  skrll 	      }
    905  1.1  skrll 
    906  1.1  skrll 	      /* Okay, now we've sorted it out.  We resume at one of these
    907  1.1  skrll 		 two labels, depending on what we've decided we're probably
    908  1.1  skrll 		 looking at.  */
    909  1.1  skrll 	    is_0f_label:
    910  1.1  skrll 	      input_line_pointer--;
    911  1.1  skrll 	      integer_constant (10, expressionP);
    912  1.1  skrll 	      break;
    913  1.1  skrll 
    914  1.1  skrll 	    is_0f_float:
    915  1.1  skrll 	      /* Fall through.  */
    916  1.1  skrll 	      ;
    917  1.1  skrll 	    }
    918  1.1  skrll 
    919  1.1  skrll 	case 'd':
    920  1.1  skrll 	case 'D':
    921  1.1  skrll 	  if (flag_m68k_mri || NUMBERS_WITH_SUFFIX)
    922  1.1  skrll 	    {
    923  1.1  skrll 	      integer_constant (0, expressionP);
    924  1.1  skrll 	      break;
    925  1.1  skrll 	    }
    926  1.1  skrll 	  /* Fall through.  */
    927  1.1  skrll 	case 'F':
    928  1.1  skrll 	case 'r':
    929  1.1  skrll 	case 'e':
    930  1.1  skrll 	case 'E':
    931  1.1  skrll 	case 'g':
    932  1.1  skrll 	case 'G':
    933  1.1  skrll 	  input_line_pointer++;
    934  1.1  skrll 	  floating_constant (expressionP);
    935  1.1  skrll 	  expressionP->X_add_number = - TOLOWER (c);
    936  1.1  skrll 	  break;
    937  1.1  skrll 
    938  1.1  skrll 	case '$':
    939  1.1  skrll 	  if (LOCAL_LABELS_DOLLAR)
    940  1.1  skrll 	    {
    941  1.1  skrll 	      integer_constant (10, expressionP);
    942  1.1  skrll 	      break;
    943  1.1  skrll 	    }
    944  1.1  skrll 	  else
    945  1.1  skrll 	    goto default_case;
    946  1.1  skrll 	}
    947  1.1  skrll 
    948  1.1  skrll       break;
    949  1.1  skrll 
    950  1.1  skrll     case '(':
    951  1.1  skrll #ifndef NEED_INDEX_OPERATOR
    952  1.1  skrll     case '[':
    953  1.1  skrll #endif
    954  1.1  skrll       /* Didn't begin with digit & not a name.  */
    955  1.1  skrll       if (mode != expr_defer)
    956  1.1  skrll 	segment = expression (expressionP);
    957  1.1  skrll       else
    958  1.1  skrll 	segment = deferred_expression (expressionP);
    959  1.1  skrll       /* expression () will pass trailing whitespace.  */
    960  1.1  skrll       if ((c == '(' && *input_line_pointer != ')')
    961  1.1  skrll 	  || (c == '[' && *input_line_pointer != ']'))
    962  1.1  skrll 	as_bad (_("missing '%c'"), c == '(' ? ')' : ']');
    963  1.1  skrll       else
    964  1.1  skrll 	input_line_pointer++;
    965  1.1  skrll       SKIP_WHITESPACE ();
    966  1.1  skrll       /* Here with input_line_pointer -> char after "(...)".  */
    967  1.1  skrll       return segment;
    968  1.1  skrll 
    969  1.1  skrll #ifdef TC_M68K
    970  1.1  skrll     case 'E':
    971  1.1  skrll       if (! flag_m68k_mri || *input_line_pointer != '\'')
    972  1.1  skrll 	goto de_fault;
    973  1.1  skrll       as_bad (_("EBCDIC constants are not supported"));
    974  1.1  skrll       /* Fall through.  */
    975  1.1  skrll     case 'A':
    976  1.1  skrll       if (! flag_m68k_mri || *input_line_pointer != '\'')
    977  1.1  skrll 	goto de_fault;
    978  1.1  skrll       ++input_line_pointer;
    979  1.1  skrll       /* Fall through.  */
    980  1.1  skrll #endif
    981  1.1  skrll     case '\'':
    982  1.1  skrll       if (! flag_m68k_mri)
    983  1.1  skrll 	{
    984  1.1  skrll 	  /* Warning: to conform to other people's assemblers NO
    985  1.1  skrll 	     ESCAPEMENT is permitted for a single quote.  The next
    986  1.1  skrll 	     character, parity errors and all, is taken as the value
    987  1.1  skrll 	     of the operand.  VERY KINKY.  */
    988  1.1  skrll 	  expressionP->X_op = O_constant;
    989  1.1  skrll 	  expressionP->X_add_number = *input_line_pointer++;
    990  1.1  skrll 	  break;
    991  1.1  skrll 	}
    992  1.1  skrll 
    993  1.1  skrll       mri_char_constant (expressionP);
    994  1.1  skrll       break;
    995  1.1  skrll 
    996  1.1  skrll #ifdef TC_M68K
    997  1.1  skrll     case '"':
    998  1.1  skrll       /* Double quote is the bitwise not operator in MRI mode.  */
    999  1.1  skrll       if (! flag_m68k_mri)
   1000  1.1  skrll 	goto de_fault;
   1001  1.1  skrll       /* Fall through.  */
   1002  1.1  skrll #endif
   1003  1.1  skrll     case '~':
   1004  1.1  skrll       /* '~' is permitted to start a label on the Delta.  */
   1005  1.1  skrll       if (is_name_beginner (c))
   1006  1.1  skrll 	goto isname;
   1007  1.1  skrll     case '!':
   1008  1.1  skrll     case '-':
   1009  1.1  skrll     case '+':
   1010  1.1  skrll       {
   1011  1.1  skrll 	operand (expressionP, mode);
   1012  1.1  skrll 	if (expressionP->X_op == O_constant)
   1013  1.1  skrll 	  {
   1014  1.1  skrll 	    /* input_line_pointer -> char after operand.  */
   1015  1.1  skrll 	    if (c == '-')
   1016  1.1  skrll 	      {
   1017  1.1  skrll 		expressionP->X_add_number = - expressionP->X_add_number;
   1018  1.1  skrll 		/* Notice: '-' may overflow: no warning is given.
   1019  1.1  skrll 		   This is compatible with other people's
   1020  1.1  skrll 		   assemblers.  Sigh.  */
   1021  1.1  skrll 		expressionP->X_unsigned = 0;
   1022  1.1  skrll 	      }
   1023  1.1  skrll 	    else if (c == '~' || c == '"')
   1024  1.1  skrll 	      expressionP->X_add_number = ~ expressionP->X_add_number;
   1025  1.1  skrll 	    else if (c == '!')
   1026  1.1  skrll 	      expressionP->X_add_number = ! expressionP->X_add_number;
   1027  1.1  skrll 	  }
   1028  1.1  skrll 	else if (expressionP->X_op == O_big
   1029  1.1  skrll 		 && expressionP->X_add_number <= 0
   1030  1.1  skrll 		 && c == '-'
   1031  1.1  skrll 		 && (generic_floating_point_number.sign == '+'
   1032  1.1  skrll 		     || generic_floating_point_number.sign == 'P'))
   1033  1.1  skrll 	  {
   1034  1.1  skrll 	    /* Negative flonum (eg, -1.000e0).  */
   1035  1.1  skrll 	    if (generic_floating_point_number.sign == '+')
   1036  1.1  skrll 	      generic_floating_point_number.sign = '-';
   1037  1.1  skrll 	    else
   1038  1.1  skrll 	      generic_floating_point_number.sign = 'N';
   1039  1.1  skrll 	  }
   1040  1.1  skrll 	else if (expressionP->X_op == O_big
   1041  1.1  skrll 		 && expressionP->X_add_number > 0)
   1042  1.1  skrll 	  {
   1043  1.1  skrll 	    int i;
   1044  1.1  skrll 
   1045  1.1  skrll 	    if (c == '~' || c == '-')
   1046  1.1  skrll 	      {
   1047  1.1  skrll 		for (i = 0; i < expressionP->X_add_number; ++i)
   1048  1.1  skrll 		  generic_bignum[i] = ~generic_bignum[i];
   1049  1.1  skrll 		if (c == '-')
   1050  1.1  skrll 		  for (i = 0; i < expressionP->X_add_number; ++i)
   1051  1.1  skrll 		    {
   1052  1.1  skrll 		      generic_bignum[i] += 1;
   1053  1.1  skrll 		      if (generic_bignum[i])
   1054  1.1  skrll 			break;
   1055  1.1  skrll 		    }
   1056  1.1  skrll 	      }
   1057  1.1  skrll 	    else if (c == '!')
   1058  1.1  skrll 	      {
   1059  1.1  skrll 		int nonzero = 0;
   1060  1.1  skrll 		for (i = 0; i < expressionP->X_add_number; ++i)
   1061  1.1  skrll 		  {
   1062  1.1  skrll 		    if (generic_bignum[i])
   1063  1.1  skrll 		      nonzero = 1;
   1064  1.1  skrll 		    generic_bignum[i] = 0;
   1065  1.1  skrll 		  }
   1066  1.1  skrll 		generic_bignum[0] = nonzero;
   1067  1.1  skrll 	      }
   1068  1.1  skrll 	  }
   1069  1.1  skrll 	else if (expressionP->X_op != O_illegal
   1070  1.1  skrll 		 && expressionP->X_op != O_absent)
   1071  1.1  skrll 	  {
   1072  1.1  skrll 	    if (c != '+')
   1073  1.1  skrll 	      {
   1074  1.1  skrll 		expressionP->X_add_symbol = make_expr_symbol (expressionP);
   1075  1.1  skrll 		if (c == '-')
   1076  1.1  skrll 		  expressionP->X_op = O_uminus;
   1077  1.1  skrll 		else if (c == '~' || c == '"')
   1078  1.1  skrll 		  expressionP->X_op = O_bit_not;
   1079  1.1  skrll 		else
   1080  1.1  skrll 		  expressionP->X_op = O_logical_not;
   1081  1.1  skrll 		expressionP->X_add_number = 0;
   1082  1.1  skrll 	      }
   1083  1.1  skrll 	  }
   1084  1.1  skrll 	else
   1085  1.1  skrll 	  as_warn (_("Unary operator %c ignored because bad operand follows"),
   1086  1.1  skrll 		   c);
   1087  1.1  skrll       }
   1088  1.1  skrll       break;
   1089  1.1  skrll 
   1090  1.1  skrll #if defined (DOLLAR_DOT) || defined (TC_M68K)
   1091  1.1  skrll     case '$':
   1092  1.1  skrll       /* '$' is the program counter when in MRI mode, or when
   1093  1.1  skrll 	 DOLLAR_DOT is defined.  */
   1094  1.1  skrll #ifndef DOLLAR_DOT
   1095  1.1  skrll       if (! flag_m68k_mri)
   1096  1.1  skrll 	goto de_fault;
   1097  1.1  skrll #endif
   1098  1.1  skrll       if (DOLLAR_AMBIGU && hex_p (*input_line_pointer))
   1099  1.1  skrll 	{
   1100  1.1  skrll 	  /* In MRI mode and on Z80, '$' is also used as the prefix
   1101  1.1  skrll 	     for a hexadecimal constant.  */
   1102  1.1  skrll 	  integer_constant (16, expressionP);
   1103  1.1  skrll 	  break;
   1104  1.1  skrll 	}
   1105  1.1  skrll 
   1106  1.1  skrll       if (is_part_of_name (*input_line_pointer))
   1107  1.1  skrll 	goto isname;
   1108  1.1  skrll 
   1109  1.1  skrll       current_location (expressionP);
   1110  1.1  skrll       break;
   1111  1.1  skrll #endif
   1112  1.1  skrll 
   1113  1.1  skrll     case '.':
   1114  1.1  skrll       if (!is_part_of_name (*input_line_pointer))
   1115  1.1  skrll 	{
   1116  1.1  skrll 	  current_location (expressionP);
   1117  1.1  skrll 	  break;
   1118  1.1  skrll 	}
   1119  1.1  skrll       else if ((strncasecmp (input_line_pointer, "startof.", 8) == 0
   1120  1.1  skrll 		&& ! is_part_of_name (input_line_pointer[8]))
   1121  1.1  skrll 	       || (strncasecmp (input_line_pointer, "sizeof.", 7) == 0
   1122  1.1  skrll 		   && ! is_part_of_name (input_line_pointer[7])))
   1123  1.1  skrll 	{
   1124  1.1  skrll 	  int start;
   1125  1.1  skrll 
   1126  1.1  skrll 	  start = (input_line_pointer[1] == 't'
   1127  1.1  skrll 		   || input_line_pointer[1] == 'T');
   1128  1.1  skrll 	  input_line_pointer += start ? 8 : 7;
   1129  1.1  skrll 	  SKIP_WHITESPACE ();
   1130  1.1  skrll 	  if (*input_line_pointer != '(')
   1131  1.1  skrll 	    as_bad (_("syntax error in .startof. or .sizeof."));
   1132  1.1  skrll 	  else
   1133  1.1  skrll 	    {
   1134  1.1  skrll 	      char *buf;
   1135  1.1  skrll 
   1136  1.1  skrll 	      ++input_line_pointer;
   1137  1.1  skrll 	      SKIP_WHITESPACE ();
   1138  1.1  skrll 	      name = input_line_pointer;
   1139  1.1  skrll 	      c = get_symbol_end ();
   1140  1.1  skrll 
   1141  1.1  skrll 	      buf = (char *) xmalloc (strlen (name) + 10);
   1142  1.1  skrll 	      if (start)
   1143  1.1  skrll 		sprintf (buf, ".startof.%s", name);
   1144  1.1  skrll 	      else
   1145  1.1  skrll 		sprintf (buf, ".sizeof.%s", name);
   1146  1.1  skrll 	      symbolP = symbol_make (buf);
   1147  1.1  skrll 	      free (buf);
   1148  1.1  skrll 
   1149  1.1  skrll 	      expressionP->X_op = O_symbol;
   1150  1.1  skrll 	      expressionP->X_add_symbol = symbolP;
   1151  1.1  skrll 	      expressionP->X_add_number = 0;
   1152  1.1  skrll 
   1153  1.1  skrll 	      *input_line_pointer = c;
   1154  1.1  skrll 	      SKIP_WHITESPACE ();
   1155  1.1  skrll 	      if (*input_line_pointer != ')')
   1156  1.1  skrll 		as_bad (_("syntax error in .startof. or .sizeof."));
   1157  1.1  skrll 	      else
   1158  1.1  skrll 		++input_line_pointer;
   1159  1.1  skrll 	    }
   1160  1.1  skrll 	  break;
   1161  1.1  skrll 	}
   1162  1.1  skrll       else
   1163  1.1  skrll 	{
   1164  1.1  skrll 	  goto isname;
   1165  1.1  skrll 	}
   1166  1.1  skrll 
   1167  1.1  skrll     case ',':
   1168  1.1  skrll     eol:
   1169  1.1  skrll       /* Can't imagine any other kind of operand.  */
   1170  1.1  skrll       expressionP->X_op = O_absent;
   1171  1.1  skrll       input_line_pointer--;
   1172  1.1  skrll       break;
   1173  1.1  skrll 
   1174  1.1  skrll #ifdef TC_M68K
   1175  1.1  skrll     case '%':
   1176  1.1  skrll       if (! flag_m68k_mri)
   1177  1.1  skrll 	goto de_fault;
   1178  1.1  skrll       integer_constant (2, expressionP);
   1179  1.1  skrll       break;
   1180  1.1  skrll 
   1181  1.1  skrll     case '@':
   1182  1.1  skrll       if (! flag_m68k_mri)
   1183  1.1  skrll 	goto de_fault;
   1184  1.1  skrll       integer_constant (8, expressionP);
   1185  1.1  skrll       break;
   1186  1.1  skrll 
   1187  1.1  skrll     case ':':
   1188  1.1  skrll       if (! flag_m68k_mri)
   1189  1.1  skrll 	goto de_fault;
   1190  1.1  skrll 
   1191  1.1  skrll       /* In MRI mode, this is a floating point constant represented
   1192  1.1  skrll 	 using hexadecimal digits.  */
   1193  1.1  skrll 
   1194  1.1  skrll       ++input_line_pointer;
   1195  1.1  skrll       integer_constant (16, expressionP);
   1196  1.1  skrll       break;
   1197  1.1  skrll 
   1198  1.1  skrll     case '*':
   1199  1.1  skrll       if (! flag_m68k_mri || is_part_of_name (*input_line_pointer))
   1200  1.1  skrll 	goto de_fault;
   1201  1.1  skrll 
   1202  1.1  skrll       current_location (expressionP);
   1203  1.1  skrll       break;
   1204  1.1  skrll #endif
   1205  1.1  skrll 
   1206  1.1  skrll     default:
   1207  1.1  skrll #ifdef TC_M68K
   1208  1.1  skrll     de_fault:
   1209  1.1  skrll #endif
   1210  1.1  skrll       if (is_name_beginner (c))	/* Here if did not begin with a digit.  */
   1211  1.1  skrll 	{
   1212  1.1  skrll 	  /* Identifier begins here.
   1213  1.1  skrll 	     This is kludged for speed, so code is repeated.  */
   1214  1.1  skrll 	isname:
   1215  1.1  skrll 	  name = --input_line_pointer;
   1216  1.1  skrll 	  c = get_symbol_end ();
   1217  1.1  skrll 
   1218  1.1  skrll #ifdef md_parse_name
   1219  1.1  skrll 	  /* This is a hook for the backend to parse certain names
   1220  1.1  skrll 	     specially in certain contexts.  If a name always has a
   1221  1.1  skrll 	     specific value, it can often be handled by simply
   1222  1.1  skrll 	     entering it in the symbol table.  */
   1223  1.1  skrll 	  if (md_parse_name (name, expressionP, mode, &c))
   1224  1.1  skrll 	    {
   1225  1.1  skrll 	      *input_line_pointer = c;
   1226  1.1  skrll 	      break;
   1227  1.1  skrll 	    }
   1228  1.1  skrll #endif
   1229  1.1  skrll 
   1230  1.1  skrll #ifdef TC_I960
   1231  1.1  skrll 	  /* The MRI i960 assembler permits
   1232  1.1  skrll 	         lda sizeof code,g13
   1233  1.1  skrll 	     FIXME: This should use md_parse_name.  */
   1234  1.1  skrll 	  if (flag_mri
   1235  1.1  skrll 	      && (strcasecmp (name, "sizeof") == 0
   1236  1.1  skrll 		  || strcasecmp (name, "startof") == 0))
   1237  1.1  skrll 	    {
   1238  1.1  skrll 	      int start;
   1239  1.1  skrll 	      char *buf;
   1240  1.1  skrll 
   1241  1.1  skrll 	      start = (name[1] == 't'
   1242  1.1  skrll 		       || name[1] == 'T');
   1243  1.1  skrll 
   1244  1.1  skrll 	      *input_line_pointer = c;
   1245  1.1  skrll 	      SKIP_WHITESPACE ();
   1246  1.1  skrll 
   1247  1.1  skrll 	      name = input_line_pointer;
   1248  1.1  skrll 	      c = get_symbol_end ();
   1249  1.1  skrll 
   1250  1.1  skrll 	      buf = (char *) xmalloc (strlen (name) + 10);
   1251  1.1  skrll 	      if (start)
   1252  1.1  skrll 		sprintf (buf, ".startof.%s", name);
   1253  1.1  skrll 	      else
   1254  1.1  skrll 		sprintf (buf, ".sizeof.%s", name);
   1255  1.1  skrll 	      symbolP = symbol_make (buf);
   1256  1.1  skrll 	      free (buf);
   1257  1.1  skrll 
   1258  1.1  skrll 	      expressionP->X_op = O_symbol;
   1259  1.1  skrll 	      expressionP->X_add_symbol = symbolP;
   1260  1.1  skrll 	      expressionP->X_add_number = 0;
   1261  1.1  skrll 
   1262  1.1  skrll 	      *input_line_pointer = c;
   1263  1.1  skrll 	      SKIP_WHITESPACE ();
   1264  1.1  skrll 
   1265  1.1  skrll 	      break;
   1266  1.1  skrll 	    }
   1267  1.1  skrll #endif
   1268  1.1  skrll 
   1269  1.1  skrll 	  symbolP = symbol_find_or_make (name);
   1270  1.1  skrll 
   1271  1.1  skrll 	  /* If we have an absolute symbol or a reg, then we know its
   1272  1.1  skrll 	     value now.  */
   1273  1.1  skrll 	  segment = S_GET_SEGMENT (symbolP);
   1274  1.1  skrll 	  if (mode != expr_defer && segment == absolute_section)
   1275  1.1  skrll 	    {
   1276  1.1  skrll 	      expressionP->X_op = O_constant;
   1277  1.1  skrll 	      expressionP->X_add_number = S_GET_VALUE (symbolP);
   1278  1.1  skrll 	    }
   1279  1.1  skrll 	  else if (mode != expr_defer && segment == reg_section)
   1280  1.1  skrll 	    {
   1281  1.1  skrll 	      expressionP->X_op = O_register;
   1282  1.1  skrll 	      expressionP->X_add_number = S_GET_VALUE (symbolP);
   1283  1.1  skrll 	    }
   1284  1.1  skrll 	  else
   1285  1.1  skrll 	    {
   1286  1.1  skrll 	      expressionP->X_op = O_symbol;
   1287  1.1  skrll 	      expressionP->X_add_symbol = symbolP;
   1288  1.1  skrll 	      expressionP->X_add_number = 0;
   1289  1.1  skrll 	    }
   1290  1.1  skrll 	  *input_line_pointer = c;
   1291  1.1  skrll 	}
   1292  1.1  skrll       else
   1293  1.1  skrll 	{
   1294  1.1  skrll 	  /* Let the target try to parse it.  Success is indicated by changing
   1295  1.1  skrll 	     the X_op field to something other than O_absent and pointing
   1296  1.1  skrll 	     input_line_pointer past the expression.  If it can't parse the
   1297  1.1  skrll 	     expression, X_op and input_line_pointer should be unchanged.  */
   1298  1.1  skrll 	  expressionP->X_op = O_absent;
   1299  1.1  skrll 	  --input_line_pointer;
   1300  1.1  skrll 	  md_operand (expressionP);
   1301  1.1  skrll 	  if (expressionP->X_op == O_absent)
   1302  1.1  skrll 	    {
   1303  1.1  skrll 	      ++input_line_pointer;
   1304  1.1  skrll 	      as_bad (_("bad expression"));
   1305  1.1  skrll 	      expressionP->X_op = O_constant;
   1306  1.1  skrll 	      expressionP->X_add_number = 0;
   1307  1.1  skrll 	    }
   1308  1.1  skrll 	}
   1309  1.1  skrll       break;
   1310  1.1  skrll     }
   1311  1.1  skrll 
   1312  1.1  skrll   /* It is more 'efficient' to clean up the expressionS when they are
   1313  1.1  skrll      created.  Doing it here saves lines of code.  */
   1314  1.1  skrll   clean_up_expression (expressionP);
   1315  1.1  skrll   SKIP_WHITESPACE ();		/* -> 1st char after operand.  */
   1316  1.1  skrll   know (*input_line_pointer != ' ');
   1317  1.1  skrll 
   1318  1.1  skrll   /* The PA port needs this information.  */
   1319  1.1  skrll   if (expressionP->X_add_symbol)
   1320  1.1  skrll     symbol_mark_used (expressionP->X_add_symbol);
   1321  1.1  skrll 
   1322  1.1  skrll   expressionP->X_add_symbol = symbol_clone_if_forward_ref (expressionP->X_add_symbol);
   1323  1.1  skrll   expressionP->X_op_symbol = symbol_clone_if_forward_ref (expressionP->X_op_symbol);
   1324  1.1  skrll 
   1325  1.1  skrll   switch (expressionP->X_op)
   1326  1.1  skrll     {
   1327  1.1  skrll     default:
   1328  1.1  skrll       return absolute_section;
   1329  1.1  skrll     case O_symbol:
   1330  1.1  skrll       return S_GET_SEGMENT (expressionP->X_add_symbol);
   1331  1.1  skrll     case O_register:
   1332  1.1  skrll       return reg_section;
   1333  1.1  skrll     }
   1334  1.1  skrll }
   1335  1.1  skrll 
   1336  1.1  skrll /* Internal.  Simplify a struct expression for use by expr ().  */
   1338  1.1  skrll 
   1339  1.1  skrll /* In:	address of an expressionS.
   1340  1.1  skrll 	The X_op field of the expressionS may only take certain values.
   1341  1.1  skrll 	Elsewise we waste time special-case testing. Sigh. Ditto SEG_ABSENT.
   1342  1.1  skrll 
   1343  1.1  skrll    Out:	expressionS may have been modified:
   1344  1.1  skrll 	Unused fields zeroed to help expr ().  */
   1345  1.1  skrll 
   1346  1.1  skrll static void
   1347  1.1  skrll clean_up_expression (expressionS *expressionP)
   1348  1.1  skrll {
   1349  1.1  skrll   switch (expressionP->X_op)
   1350  1.1  skrll     {
   1351  1.1  skrll     case O_illegal:
   1352  1.1  skrll     case O_absent:
   1353  1.1  skrll       expressionP->X_add_number = 0;
   1354  1.1  skrll       /* Fall through.  */
   1355  1.1  skrll     case O_big:
   1356  1.1  skrll     case O_constant:
   1357  1.1  skrll     case O_register:
   1358  1.1  skrll       expressionP->X_add_symbol = NULL;
   1359  1.1  skrll       /* Fall through.  */
   1360  1.1  skrll     case O_symbol:
   1361  1.1  skrll     case O_uminus:
   1362  1.1  skrll     case O_bit_not:
   1363  1.1  skrll       expressionP->X_op_symbol = NULL;
   1364  1.1  skrll       break;
   1365  1.1  skrll     default:
   1366  1.1  skrll       break;
   1367  1.1  skrll     }
   1368  1.1  skrll }
   1369  1.1  skrll 
   1370  1.1  skrll /* Expression parser.  */
   1372  1.1  skrll 
   1373  1.1  skrll /* We allow an empty expression, and just assume (absolute,0) silently.
   1374  1.1  skrll    Unary operators and parenthetical expressions are treated as operands.
   1375  1.1  skrll    As usual, Q==quantity==operand, O==operator, X==expression mnemonics.
   1376  1.1  skrll 
   1377  1.1  skrll    We used to do an aho/ullman shift-reduce parser, but the logic got so
   1378  1.1  skrll    warped that I flushed it and wrote a recursive-descent parser instead.
   1379  1.1  skrll    Now things are stable, would anybody like to write a fast parser?
   1380  1.1  skrll    Most expressions are either register (which does not even reach here)
   1381  1.1  skrll    or 1 symbol. Then "symbol+constant" and "symbol-symbol" are common.
   1382  1.1  skrll    So I guess it doesn't really matter how inefficient more complex expressions
   1383  1.1  skrll    are parsed.
   1384  1.1  skrll 
   1385  1.1  skrll    After expr(RANK,resultP) input_line_pointer->operator of rank <= RANK.
   1386  1.1  skrll    Also, we have consumed any leading or trailing spaces (operand does that)
   1387  1.1  skrll    and done all intervening operators.
   1388  1.1  skrll 
   1389  1.1  skrll    This returns the segment of the result, which will be
   1390  1.1  skrll    absolute_section or the segment of a symbol.  */
   1391  1.1  skrll 
   1392  1.1  skrll #undef __
   1393  1.1  skrll #define __ O_illegal
   1394  1.1  skrll #ifndef O_SINGLE_EQ
   1395  1.1  skrll #define O_SINGLE_EQ O_illegal
   1396  1.1  skrll #endif
   1397  1.1  skrll 
   1398  1.1  skrll /* Maps ASCII -> operators.  */
   1399  1.1  skrll static const operatorT op_encoding[256] = {
   1400  1.1  skrll   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
   1401  1.1  skrll   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
   1402  1.1  skrll 
   1403  1.1  skrll   __, O_bit_or_not, __, __, __, O_modulus, O_bit_and, __,
   1404  1.1  skrll   __, __, O_multiply, O_add, __, O_subtract, __, O_divide,
   1405  1.1  skrll   __, __, __, __, __, __, __, __,
   1406  1.1  skrll   __, __, __, __, O_lt, O_SINGLE_EQ, O_gt, __,
   1407  1.1  skrll   __, __, __, __, __, __, __, __,
   1408  1.1  skrll   __, __, __, __, __, __, __, __,
   1409  1.1  skrll   __, __, __, __, __, __, __, __,
   1410  1.1  skrll   __, __, __,
   1411  1.1  skrll #ifdef NEED_INDEX_OPERATOR
   1412  1.1  skrll   O_index,
   1413  1.1  skrll #else
   1414  1.1  skrll   __,
   1415  1.1  skrll #endif
   1416  1.1  skrll   __, __, O_bit_exclusive_or, __,
   1417  1.1  skrll   __, __, __, __, __, __, __, __,
   1418  1.1  skrll   __, __, __, __, __, __, __, __,
   1419  1.1  skrll   __, __, __, __, __, __, __, __,
   1420  1.1  skrll   __, __, __, __, O_bit_inclusive_or, __, __, __,
   1421  1.1  skrll 
   1422  1.1  skrll   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
   1423  1.1  skrll   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
   1424  1.1  skrll   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
   1425  1.1  skrll   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
   1426  1.1  skrll   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
   1427  1.1  skrll   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
   1428  1.1  skrll   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
   1429  1.1  skrll   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
   1430  1.1  skrll };
   1431  1.1  skrll 
   1432  1.1  skrll /* Rank	Examples
   1433  1.1  skrll    0	operand, (expression)
   1434  1.1  skrll    1	||
   1435  1.1  skrll    2	&&
   1436  1.1  skrll    3	== <> < <= >= >
   1437  1.1  skrll    4	+ -
   1438  1.1  skrll    5	used for * / % in MRI mode
   1439  1.1  skrll    6	& ^ ! |
   1440  1.1  skrll    7	* / % << >>
   1441  1.1  skrll    8	unary - unary ~
   1442  1.1  skrll */
   1443  1.1  skrll static operator_rankT op_rank[] = {
   1444  1.1  skrll   0,	/* O_illegal */
   1445  1.1  skrll   0,	/* O_absent */
   1446  1.1  skrll   0,	/* O_constant */
   1447  1.1  skrll   0,	/* O_symbol */
   1448  1.1  skrll   0,	/* O_symbol_rva */
   1449  1.1  skrll   0,	/* O_register */
   1450  1.1  skrll   0,	/* O_big */
   1451  1.1  skrll   9,	/* O_uminus */
   1452  1.1  skrll   9,	/* O_bit_not */
   1453  1.1  skrll   9,	/* O_logical_not */
   1454  1.1  skrll   8,	/* O_multiply */
   1455  1.1  skrll   8,	/* O_divide */
   1456  1.1  skrll   8,	/* O_modulus */
   1457  1.1  skrll   8,	/* O_left_shift */
   1458  1.1  skrll   8,	/* O_right_shift */
   1459  1.1  skrll   7,	/* O_bit_inclusive_or */
   1460  1.1  skrll   7,	/* O_bit_or_not */
   1461  1.1  skrll   7,	/* O_bit_exclusive_or */
   1462  1.1  skrll   7,	/* O_bit_and */
   1463  1.1  skrll   5,	/* O_add */
   1464  1.1  skrll   5,	/* O_subtract */
   1465  1.1  skrll   4,	/* O_eq */
   1466  1.1  skrll   4,	/* O_ne */
   1467  1.1  skrll   4,	/* O_lt */
   1468  1.1  skrll   4,	/* O_le */
   1469  1.1  skrll   4,	/* O_ge */
   1470  1.1  skrll   4,	/* O_gt */
   1471  1.1  skrll   3,	/* O_logical_and */
   1472  1.1  skrll   2,	/* O_logical_or */
   1473  1.1  skrll   1,	/* O_index */
   1474  1.1  skrll   0,	/* O_md1 */
   1475  1.1  skrll   0,	/* O_md2 */
   1476  1.1  skrll   0,	/* O_md3 */
   1477  1.1  skrll   0,	/* O_md4 */
   1478  1.1  skrll   0,	/* O_md5 */
   1479  1.1  skrll   0,	/* O_md6 */
   1480  1.1  skrll   0,	/* O_md7 */
   1481  1.1  skrll   0,	/* O_md8 */
   1482  1.1  skrll   0,	/* O_md9 */
   1483  1.1  skrll   0,	/* O_md10 */
   1484  1.1  skrll   0,	/* O_md11 */
   1485  1.1  skrll   0,	/* O_md12 */
   1486  1.1  skrll   0,	/* O_md13 */
   1487  1.1  skrll   0,	/* O_md14 */
   1488  1.1  skrll   0,	/* O_md15 */
   1489  1.1  skrll   0,	/* O_md16 */
   1490  1.1  skrll };
   1491  1.1  skrll 
   1492  1.1  skrll /* Unfortunately, in MRI mode for the m68k, multiplication and
   1493  1.1  skrll    division have lower precedence than the bit wise operators.  This
   1494  1.1  skrll    function sets the operator precedences correctly for the current
   1495  1.1  skrll    mode.  Also, MRI uses a different bit_not operator, and this fixes
   1496  1.1  skrll    that as well.  */
   1497  1.1  skrll 
   1498  1.1  skrll #define STANDARD_MUL_PRECEDENCE 8
   1499  1.1  skrll #define MRI_MUL_PRECEDENCE 6
   1500  1.1  skrll 
   1501  1.1  skrll void
   1502  1.1  skrll expr_set_precedence (void)
   1503  1.1  skrll {
   1504  1.1  skrll   if (flag_m68k_mri)
   1505  1.1  skrll     {
   1506  1.1  skrll       op_rank[O_multiply] = MRI_MUL_PRECEDENCE;
   1507  1.1  skrll       op_rank[O_divide] = MRI_MUL_PRECEDENCE;
   1508  1.1  skrll       op_rank[O_modulus] = MRI_MUL_PRECEDENCE;
   1509  1.1  skrll     }
   1510  1.1  skrll   else
   1511  1.1  skrll     {
   1512  1.1  skrll       op_rank[O_multiply] = STANDARD_MUL_PRECEDENCE;
   1513  1.1  skrll       op_rank[O_divide] = STANDARD_MUL_PRECEDENCE;
   1514  1.1  skrll       op_rank[O_modulus] = STANDARD_MUL_PRECEDENCE;
   1515  1.1  skrll     }
   1516  1.1  skrll }
   1517  1.1  skrll 
   1518  1.1  skrll /* Initialize the expression parser.  */
   1519  1.1  skrll 
   1520  1.1  skrll void
   1521  1.1  skrll expr_begin (void)
   1522  1.1  skrll {
   1523  1.1  skrll   expr_set_precedence ();
   1524  1.1  skrll 
   1525  1.1  skrll   /* Verify that X_op field is wide enough.  */
   1526  1.1  skrll   {
   1527  1.1  skrll     expressionS e;
   1528  1.1  skrll     e.X_op = O_max;
   1529  1.1  skrll     assert (e.X_op == O_max);
   1530  1.1  skrll   }
   1531  1.1  skrll }
   1532  1.1  skrll 
   1533  1.1  skrll /* Return the encoding for the operator at INPUT_LINE_POINTER, and
   1535  1.1  skrll    sets NUM_CHARS to the number of characters in the operator.
   1536  1.1  skrll    Does not advance INPUT_LINE_POINTER.  */
   1537  1.1  skrll 
   1538  1.1  skrll static inline operatorT
   1539  1.1  skrll operator (int *num_chars)
   1540  1.1  skrll {
   1541  1.1  skrll   int c;
   1542  1.1  skrll   operatorT ret;
   1543  1.1  skrll 
   1544  1.1  skrll   c = *input_line_pointer & 0xff;
   1545  1.1  skrll   *num_chars = 1;
   1546  1.1  skrll 
   1547  1.1  skrll   if (is_end_of_line[c])
   1548  1.1  skrll     return O_illegal;
   1549  1.1  skrll 
   1550  1.1  skrll   switch (c)
   1551  1.1  skrll     {
   1552  1.1  skrll     default:
   1553  1.1  skrll       return op_encoding[c];
   1554  1.1  skrll 
   1555  1.1  skrll     case '+':
   1556  1.1  skrll     case '-':
   1557  1.1  skrll       return op_encoding[c];
   1558  1.1  skrll 
   1559  1.1  skrll     case '<':
   1560  1.1  skrll       switch (input_line_pointer[1])
   1561  1.1  skrll 	{
   1562  1.1  skrll 	default:
   1563  1.1  skrll 	  return op_encoding[c];
   1564  1.1  skrll 	case '<':
   1565  1.1  skrll 	  ret = O_left_shift;
   1566  1.1  skrll 	  break;
   1567  1.1  skrll 	case '>':
   1568  1.1  skrll 	  ret = O_ne;
   1569  1.1  skrll 	  break;
   1570  1.1  skrll 	case '=':
   1571  1.1  skrll 	  ret = O_le;
   1572  1.1  skrll 	  break;
   1573  1.1  skrll 	}
   1574  1.1  skrll       *num_chars = 2;
   1575  1.1  skrll       return ret;
   1576  1.1  skrll 
   1577  1.1  skrll     case '=':
   1578  1.1  skrll       if (input_line_pointer[1] != '=')
   1579  1.1  skrll 	return op_encoding[c];
   1580  1.1  skrll 
   1581  1.1  skrll       *num_chars = 2;
   1582  1.1  skrll       return O_eq;
   1583  1.1  skrll 
   1584  1.1  skrll     case '>':
   1585  1.1  skrll       switch (input_line_pointer[1])
   1586  1.1  skrll 	{
   1587  1.1  skrll 	default:
   1588  1.1  skrll 	  return op_encoding[c];
   1589  1.1  skrll 	case '>':
   1590  1.1  skrll 	  ret = O_right_shift;
   1591  1.1  skrll 	  break;
   1592  1.1  skrll 	case '=':
   1593  1.1  skrll 	  ret = O_ge;
   1594  1.1  skrll 	  break;
   1595  1.1  skrll 	}
   1596  1.1  skrll       *num_chars = 2;
   1597  1.1  skrll       return ret;
   1598  1.1  skrll 
   1599  1.1  skrll     case '!':
   1600  1.1  skrll       switch (input_line_pointer[1])
   1601  1.1  skrll 	{
   1602  1.1  skrll 	case '!':
   1603  1.1  skrll 	  /* We accept !! as equivalent to ^ for MRI compatibility. */
   1604  1.1  skrll 	  *num_chars = 2;
   1605  1.1  skrll 	  return O_bit_exclusive_or;
   1606  1.1  skrll 	case '=':
   1607  1.1  skrll 	  /* We accept != as equivalent to <>.  */
   1608  1.1  skrll 	  *num_chars = 2;
   1609  1.1  skrll 	  return O_ne;
   1610  1.1  skrll 	default:
   1611  1.1  skrll 	  if (flag_m68k_mri)
   1612  1.1  skrll 	    return O_bit_inclusive_or;
   1613  1.1  skrll 	  return op_encoding[c];
   1614  1.1  skrll 	}
   1615  1.1  skrll 
   1616  1.1  skrll     case '|':
   1617  1.1  skrll       if (input_line_pointer[1] != '|')
   1618  1.1  skrll 	return op_encoding[c];
   1619  1.1  skrll 
   1620  1.1  skrll       *num_chars = 2;
   1621  1.1  skrll       return O_logical_or;
   1622  1.1  skrll 
   1623  1.1  skrll     case '&':
   1624  1.1  skrll       if (input_line_pointer[1] != '&')
   1625  1.1  skrll 	return op_encoding[c];
   1626  1.1  skrll 
   1627  1.1  skrll       *num_chars = 2;
   1628  1.1  skrll       return O_logical_and;
   1629  1.1  skrll     }
   1630  1.1  skrll 
   1631  1.1  skrll   /* NOTREACHED  */
   1632  1.1  skrll }
   1633  1.1  skrll 
   1634  1.1  skrll /* Parse an expression.  */
   1635  1.1  skrll 
   1636  1.1  skrll segT
   1637  1.1  skrll expr (int rankarg,		/* Larger # is higher rank.  */
   1638  1.1  skrll       expressionS *resultP,	/* Deliver result here.  */
   1639  1.1  skrll       enum expr_mode mode	/* Controls behavior.  */)
   1640  1.1  skrll {
   1641  1.1  skrll   operator_rankT rank = (operator_rankT) rankarg;
   1642  1.1  skrll   segT retval;
   1643  1.1  skrll   expressionS right;
   1644  1.1  skrll   operatorT op_left;
   1645  1.1  skrll   operatorT op_right;
   1646  1.1  skrll   int op_chars;
   1647  1.1  skrll 
   1648  1.1  skrll   know (rankarg >= 0);
   1649  1.1  skrll 
   1650  1.1  skrll   /* Save the value of dot for the fixup code.  */
   1651  1.1  skrll   if (rank == 0)
   1652  1.1  skrll     dot_value = frag_now_fix ();
   1653  1.1  skrll 
   1654  1.1  skrll   retval = operand (resultP, mode);
   1655  1.1  skrll 
   1656  1.1  skrll   /* operand () gobbles spaces.  */
   1657  1.1  skrll   know (*input_line_pointer != ' ');
   1658  1.1  skrll 
   1659  1.1  skrll   op_left = operator (&op_chars);
   1660  1.1  skrll   while (op_left != O_illegal && op_rank[(int) op_left] > rank)
   1661  1.1  skrll     {
   1662  1.1  skrll       segT rightseg;
   1663  1.1  skrll       bfd_vma frag_off;
   1664  1.1  skrll 
   1665  1.1  skrll       input_line_pointer += op_chars;	/* -> after operator.  */
   1666  1.1  skrll 
   1667  1.1  skrll       rightseg = expr (op_rank[(int) op_left], &right, mode);
   1668  1.1  skrll       if (right.X_op == O_absent)
   1669  1.1  skrll 	{
   1670  1.1  skrll 	  as_warn (_("missing operand; zero assumed"));
   1671  1.1  skrll 	  right.X_op = O_constant;
   1672  1.1  skrll 	  right.X_add_number = 0;
   1673  1.1  skrll 	  right.X_add_symbol = NULL;
   1674  1.1  skrll 	  right.X_op_symbol = NULL;
   1675  1.1  skrll 	}
   1676  1.1  skrll 
   1677  1.1  skrll       know (*input_line_pointer != ' ');
   1678  1.1  skrll 
   1679  1.1  skrll       if (op_left == O_index)
   1680  1.1  skrll 	{
   1681  1.1  skrll 	  if (*input_line_pointer != ']')
   1682  1.1  skrll 	    as_bad ("missing right bracket");
   1683  1.1  skrll 	  else
   1684  1.1  skrll 	    {
   1685  1.1  skrll 	      ++input_line_pointer;
   1686  1.1  skrll 	      SKIP_WHITESPACE ();
   1687  1.1  skrll 	    }
   1688  1.1  skrll 	}
   1689  1.1  skrll 
   1690  1.1  skrll       op_right = operator (&op_chars);
   1691  1.1  skrll 
   1692  1.1  skrll       know (op_right == O_illegal
   1693  1.1  skrll 	    || op_rank[(int) op_right] <= op_rank[(int) op_left]);
   1694  1.1  skrll       know ((int) op_left >= (int) O_multiply
   1695  1.1  skrll 	    && (int) op_left <= (int) O_index);
   1696  1.1  skrll 
   1697  1.1  skrll       /* input_line_pointer->after right-hand quantity.  */
   1698  1.1  skrll       /* left-hand quantity in resultP.  */
   1699  1.1  skrll       /* right-hand quantity in right.  */
   1700  1.1  skrll       /* operator in op_left.  */
   1701  1.1  skrll 
   1702  1.1  skrll       if (resultP->X_op == O_big)
   1703  1.1  skrll 	{
   1704  1.1  skrll 	  if (resultP->X_add_number > 0)
   1705  1.1  skrll 	    as_warn (_("left operand is a bignum; integer 0 assumed"));
   1706  1.1  skrll 	  else
   1707  1.1  skrll 	    as_warn (_("left operand is a float; integer 0 assumed"));
   1708  1.1  skrll 	  resultP->X_op = O_constant;
   1709  1.1  skrll 	  resultP->X_add_number = 0;
   1710  1.1  skrll 	  resultP->X_add_symbol = NULL;
   1711  1.1  skrll 	  resultP->X_op_symbol = NULL;
   1712  1.1  skrll 	}
   1713  1.1  skrll       if (right.X_op == O_big)
   1714  1.1  skrll 	{
   1715  1.1  skrll 	  if (right.X_add_number > 0)
   1716  1.1  skrll 	    as_warn (_("right operand is a bignum; integer 0 assumed"));
   1717  1.1  skrll 	  else
   1718  1.1  skrll 	    as_warn (_("right operand is a float; integer 0 assumed"));
   1719  1.1  skrll 	  right.X_op = O_constant;
   1720  1.1  skrll 	  right.X_add_number = 0;
   1721  1.1  skrll 	  right.X_add_symbol = NULL;
   1722  1.1  skrll 	  right.X_op_symbol = NULL;
   1723  1.1  skrll 	}
   1724  1.1  skrll 
   1725  1.1  skrll       /* Optimize common cases.  */
   1726  1.1  skrll #ifdef md_optimize_expr
   1727  1.1  skrll       if (md_optimize_expr (resultP, op_left, &right))
   1728  1.1  skrll 	{
   1729  1.1  skrll 	  /* Skip.  */
   1730  1.1  skrll 	  ;
   1731  1.1  skrll 	}
   1732  1.1  skrll       else
   1733  1.1  skrll #endif
   1734  1.1  skrll #ifndef md_register_arithmetic
   1735  1.1  skrll # define md_register_arithmetic 1
   1736  1.1  skrll #endif
   1737  1.1  skrll       if (op_left == O_add && right.X_op == O_constant
   1738  1.1  skrll 	  && (md_register_arithmetic || resultP->X_op != O_register))
   1739  1.1  skrll 	{
   1740  1.1  skrll 	  /* X + constant.  */
   1741  1.1  skrll 	  resultP->X_add_number += right.X_add_number;
   1742  1.1  skrll 	}
   1743  1.1  skrll       /* This case comes up in PIC code.  */
   1744  1.1  skrll       else if (op_left == O_subtract
   1745  1.1  skrll 	       && right.X_op == O_symbol
   1746  1.1  skrll 	       && resultP->X_op == O_symbol
   1747  1.1  skrll 	       && retval == rightseg
   1748  1.1  skrll #ifdef md_allow_local_subtract
   1749  1.1  skrll 	       && md_allow_local_subtract (resultP, & right, rightseg)
   1750  1.1  skrll #endif
   1751  1.1  skrll 	       && (SEG_NORMAL (rightseg)
   1752  1.1  skrll 		   || right.X_add_symbol == resultP->X_add_symbol)
   1753  1.1  skrll 	       && frag_offset_fixed_p (symbol_get_frag (resultP->X_add_symbol),
   1754  1.1  skrll 				       symbol_get_frag (right.X_add_symbol),
   1755  1.1  skrll 				       &frag_off))
   1756  1.1  skrll 	{
   1757  1.1  skrll 	  resultP->X_add_number -= right.X_add_number;
   1758  1.1  skrll 	  resultP->X_add_number -= frag_off / OCTETS_PER_BYTE;
   1759  1.1  skrll 	  resultP->X_add_number += (S_GET_VALUE (resultP->X_add_symbol)
   1760  1.1  skrll 				    - S_GET_VALUE (right.X_add_symbol));
   1761  1.1  skrll 	  resultP->X_op = O_constant;
   1762  1.1  skrll 	  resultP->X_add_symbol = 0;
   1763  1.1  skrll 	}
   1764  1.1  skrll       else if (op_left == O_subtract && right.X_op == O_constant
   1765  1.1  skrll 	       && (md_register_arithmetic || resultP->X_op != O_register))
   1766  1.1  skrll 	{
   1767  1.1  skrll 	  /* X - constant.  */
   1768  1.1  skrll 	  resultP->X_add_number -= right.X_add_number;
   1769  1.1  skrll 	}
   1770  1.1  skrll       else if (op_left == O_add && resultP->X_op == O_constant
   1771  1.1  skrll 	       && (md_register_arithmetic || right.X_op != O_register))
   1772  1.1  skrll 	{
   1773  1.1  skrll 	  /* Constant + X.  */
   1774  1.1  skrll 	  resultP->X_op = right.X_op;
   1775  1.1  skrll 	  resultP->X_add_symbol = right.X_add_symbol;
   1776  1.1  skrll 	  resultP->X_op_symbol = right.X_op_symbol;
   1777  1.1  skrll 	  resultP->X_add_number += right.X_add_number;
   1778  1.1  skrll 	  retval = rightseg;
   1779  1.1  skrll 	}
   1780  1.1  skrll       else if (resultP->X_op == O_constant && right.X_op == O_constant)
   1781  1.1  skrll 	{
   1782  1.1  skrll 	  /* Constant OP constant.  */
   1783  1.1  skrll 	  offsetT v = right.X_add_number;
   1784  1.1  skrll 	  if (v == 0 && (op_left == O_divide || op_left == O_modulus))
   1785  1.1  skrll 	    {
   1786  1.1  skrll 	      as_warn (_("division by zero"));
   1787  1.1  skrll 	      v = 1;
   1788  1.1  skrll 	    }
   1789  1.1  skrll 	  switch (op_left)
   1790  1.1  skrll 	    {
   1791  1.1  skrll 	    default:			abort ();
   1792  1.1  skrll 	    case O_multiply:		resultP->X_add_number *= v; break;
   1793  1.1  skrll 	    case O_divide:		resultP->X_add_number /= v; break;
   1794  1.1  skrll 	    case O_modulus:		resultP->X_add_number %= v; break;
   1795  1.1  skrll 	    case O_left_shift:		resultP->X_add_number <<= v; break;
   1796  1.1  skrll 	    case O_right_shift:
   1797  1.1  skrll 	      /* We always use unsigned shifts, to avoid relying on
   1798  1.1  skrll 		 characteristics of the compiler used to compile gas.  */
   1799  1.1  skrll 	      resultP->X_add_number =
   1800  1.1  skrll 		(offsetT) ((valueT) resultP->X_add_number >> (valueT) v);
   1801  1.1  skrll 	      break;
   1802  1.1  skrll 	    case O_bit_inclusive_or:	resultP->X_add_number |= v; break;
   1803  1.1  skrll 	    case O_bit_or_not:		resultP->X_add_number |= ~v; break;
   1804  1.1  skrll 	    case O_bit_exclusive_or:	resultP->X_add_number ^= v; break;
   1805  1.1  skrll 	    case O_bit_and:		resultP->X_add_number &= v; break;
   1806  1.1  skrll 	      /* Constant + constant (O_add) is handled by the
   1807  1.1  skrll 		 previous if statement for constant + X, so is omitted
   1808  1.1  skrll 		 here.  */
   1809  1.1  skrll 	    case O_subtract:		resultP->X_add_number -= v; break;
   1810  1.1  skrll 	    case O_eq:
   1811  1.1  skrll 	      resultP->X_add_number =
   1812  1.1  skrll 		resultP->X_add_number == v ? ~ (offsetT) 0 : 0;
   1813  1.1  skrll 	      break;
   1814  1.1  skrll 	    case O_ne:
   1815  1.1  skrll 	      resultP->X_add_number =
   1816  1.1  skrll 		resultP->X_add_number != v ? ~ (offsetT) 0 : 0;
   1817  1.1  skrll 	      break;
   1818  1.1  skrll 	    case O_lt:
   1819  1.1  skrll 	      resultP->X_add_number =
   1820  1.1  skrll 		resultP->X_add_number <  v ? ~ (offsetT) 0 : 0;
   1821  1.1  skrll 	      break;
   1822  1.1  skrll 	    case O_le:
   1823  1.1  skrll 	      resultP->X_add_number =
   1824  1.1  skrll 		resultP->X_add_number <= v ? ~ (offsetT) 0 : 0;
   1825  1.1  skrll 	      break;
   1826  1.1  skrll 	    case O_ge:
   1827  1.1  skrll 	      resultP->X_add_number =
   1828  1.1  skrll 		resultP->X_add_number >= v ? ~ (offsetT) 0 : 0;
   1829  1.1  skrll 	      break;
   1830  1.1  skrll 	    case O_gt:
   1831  1.1  skrll 	      resultP->X_add_number =
   1832  1.1  skrll 		resultP->X_add_number >  v ? ~ (offsetT) 0 : 0;
   1833  1.1  skrll 	      break;
   1834  1.1  skrll 	    case O_logical_and:
   1835  1.1  skrll 	      resultP->X_add_number = resultP->X_add_number && v;
   1836  1.1  skrll 	      break;
   1837  1.1  skrll 	    case O_logical_or:
   1838  1.1  skrll 	      resultP->X_add_number = resultP->X_add_number || v;
   1839  1.1  skrll 	      break;
   1840  1.1  skrll 	    }
   1841  1.1  skrll 	}
   1842  1.1  skrll       else if (resultP->X_op == O_symbol
   1843  1.1  skrll 	       && right.X_op == O_symbol
   1844  1.1  skrll 	       && (op_left == O_add
   1845  1.1  skrll 		   || op_left == O_subtract
   1846  1.1  skrll 		   || (resultP->X_add_number == 0
   1847  1.1  skrll 		       && right.X_add_number == 0)))
   1848  1.1  skrll 	{
   1849  1.1  skrll 	  /* Symbol OP symbol.  */
   1850  1.1  skrll 	  resultP->X_op = op_left;
   1851  1.1  skrll 	  resultP->X_op_symbol = right.X_add_symbol;
   1852  1.1  skrll 	  if (op_left == O_add)
   1853  1.1  skrll 	    resultP->X_add_number += right.X_add_number;
   1854  1.1  skrll 	  else if (op_left == O_subtract)
   1855  1.1  skrll 	    {
   1856  1.1  skrll 	      resultP->X_add_number -= right.X_add_number;
   1857  1.1  skrll 	      if (retval == rightseg && SEG_NORMAL (retval))
   1858  1.1  skrll 		{
   1859  1.1  skrll 		  retval = absolute_section;
   1860  1.1  skrll 		  rightseg = absolute_section;
   1861  1.1  skrll 		}
   1862  1.1  skrll 	    }
   1863  1.1  skrll 	}
   1864  1.1  skrll       else
   1865  1.1  skrll 	{
   1866  1.1  skrll 	  /* The general case.  */
   1867  1.1  skrll 	  resultP->X_add_symbol = make_expr_symbol (resultP);
   1868  1.1  skrll 	  resultP->X_op_symbol = make_expr_symbol (&right);
   1869  1.1  skrll 	  resultP->X_op = op_left;
   1870  1.1  skrll 	  resultP->X_add_number = 0;
   1871  1.1  skrll 	  resultP->X_unsigned = 1;
   1872  1.1  skrll 	}
   1873  1.1  skrll 
   1874  1.1  skrll       if (retval != rightseg)
   1875  1.1  skrll 	{
   1876  1.1  skrll 	  if (! SEG_NORMAL (retval))
   1877  1.1  skrll 	    {
   1878  1.1  skrll 	      if (retval != undefined_section || SEG_NORMAL (rightseg))
   1879  1.1  skrll 		retval = rightseg;
   1880  1.1  skrll 	    }
   1881  1.1  skrll 	  else if (SEG_NORMAL (rightseg)
   1882  1.1  skrll #ifdef DIFF_EXPR_OK
   1883  1.1  skrll 		   && op_left != O_subtract
   1884  1.1  skrll #endif
   1885  1.1  skrll 		   )
   1886  1.1  skrll 	    as_bad (_("operation combines symbols in different segments"));
   1887  1.1  skrll 	}
   1888  1.1  skrll 
   1889  1.1  skrll       op_left = op_right;
   1890  1.1  skrll     }				/* While next operator is >= this rank.  */
   1891  1.1  skrll 
   1892  1.1  skrll   /* The PA port needs this information.  */
   1893  1.1  skrll   if (resultP->X_add_symbol)
   1894  1.1  skrll     symbol_mark_used (resultP->X_add_symbol);
   1895  1.1  skrll 
   1896  1.1  skrll   if (rank == 0 && mode == expr_evaluate)
   1897  1.1  skrll     resolve_expression (resultP);
   1898  1.1  skrll 
   1899  1.1  skrll   return resultP->X_op == O_constant ? absolute_section : retval;
   1900  1.1  skrll }
   1901  1.1  skrll 
   1902  1.1  skrll /* Resolve an expression without changing any symbols/sub-expressions
   1903  1.1  skrll    used.  */
   1904  1.1  skrll 
   1905  1.1  skrll int
   1906  1.1  skrll resolve_expression (expressionS *expressionP)
   1907  1.1  skrll {
   1908  1.1  skrll   /* Help out with CSE.  */
   1909  1.1  skrll   valueT final_val = expressionP->X_add_number;
   1910  1.1  skrll   symbolS *add_symbol = expressionP->X_add_symbol;
   1911  1.1  skrll   symbolS *op_symbol = expressionP->X_op_symbol;
   1912  1.1  skrll   operatorT op = expressionP->X_op;
   1913  1.1  skrll   valueT left, right;
   1914  1.1  skrll   segT seg_left, seg_right;
   1915  1.1  skrll   fragS *frag_left, *frag_right;
   1916  1.1  skrll   bfd_vma frag_off;
   1917  1.1  skrll 
   1918  1.1  skrll   switch (op)
   1919  1.1  skrll     {
   1920  1.1  skrll     default:
   1921  1.1  skrll       return 0;
   1922  1.1  skrll 
   1923  1.1  skrll     case O_constant:
   1924  1.1  skrll     case O_register:
   1925  1.1  skrll       left = 0;
   1926  1.1  skrll       break;
   1927  1.1  skrll 
   1928  1.1  skrll     case O_symbol:
   1929  1.1  skrll     case O_symbol_rva:
   1930  1.1  skrll       if (!snapshot_symbol (&add_symbol, &left, &seg_left, &frag_left))
   1931  1.1  skrll 	return 0;
   1932  1.1  skrll 
   1933  1.1  skrll       break;
   1934  1.1  skrll 
   1935  1.1  skrll     case O_uminus:
   1936  1.1  skrll     case O_bit_not:
   1937  1.1  skrll     case O_logical_not:
   1938  1.1  skrll       if (!snapshot_symbol (&add_symbol, &left, &seg_left, &frag_left))
   1939  1.1  skrll 	return 0;
   1940  1.1  skrll 
   1941  1.1  skrll       if (seg_left != absolute_section)
   1942  1.1  skrll 	return 0;
   1943  1.1  skrll 
   1944  1.1  skrll       if (op == O_logical_not)
   1945  1.1  skrll 	left = !left;
   1946  1.1  skrll       else if (op == O_uminus)
   1947  1.1  skrll 	left = -left;
   1948  1.1  skrll       else
   1949  1.1  skrll 	left = ~left;
   1950  1.1  skrll       op = O_constant;
   1951  1.1  skrll       break;
   1952  1.1  skrll 
   1953  1.1  skrll     case O_multiply:
   1954  1.1  skrll     case O_divide:
   1955  1.1  skrll     case O_modulus:
   1956  1.1  skrll     case O_left_shift:
   1957  1.1  skrll     case O_right_shift:
   1958  1.1  skrll     case O_bit_inclusive_or:
   1959  1.1  skrll     case O_bit_or_not:
   1960  1.1  skrll     case O_bit_exclusive_or:
   1961  1.1  skrll     case O_bit_and:
   1962  1.1  skrll     case O_add:
   1963  1.1  skrll     case O_subtract:
   1964  1.1  skrll     case O_eq:
   1965  1.1  skrll     case O_ne:
   1966  1.1  skrll     case O_lt:
   1967  1.1  skrll     case O_le:
   1968  1.1  skrll     case O_ge:
   1969  1.1  skrll     case O_gt:
   1970  1.1  skrll     case O_logical_and:
   1971  1.1  skrll     case O_logical_or:
   1972  1.1  skrll       if (!snapshot_symbol (&add_symbol, &left, &seg_left, &frag_left)
   1973  1.1  skrll 	  || !snapshot_symbol (&op_symbol, &right, &seg_right, &frag_right))
   1974  1.1  skrll 	return 0;
   1975  1.1  skrll 
   1976  1.1  skrll       /* Simplify addition or subtraction of a constant by folding the
   1977  1.1  skrll 	 constant into X_add_number.  */
   1978  1.1  skrll       if (op == O_add)
   1979  1.1  skrll 	{
   1980  1.1  skrll 	  if (seg_right == absolute_section)
   1981  1.1  skrll 	    {
   1982  1.1  skrll 	      final_val += right;
   1983  1.1  skrll 	      op = O_symbol;
   1984  1.1  skrll 	      break;
   1985  1.1  skrll 	    }
   1986  1.1  skrll 	  else if (seg_left == absolute_section)
   1987  1.1  skrll 	    {
   1988  1.1  skrll 	      final_val += left;
   1989  1.1  skrll 	      left = right;
   1990  1.1  skrll 	      seg_left = seg_right;
   1991  1.1  skrll 	      add_symbol = op_symbol;
   1992  1.1  skrll 	      op = O_symbol;
   1993  1.1  skrll 	      break;
   1994  1.1  skrll 	    }
   1995  1.1  skrll 	}
   1996  1.1  skrll       else if (op == O_subtract)
   1997  1.1  skrll 	{
   1998  1.1  skrll 	  if (seg_right == absolute_section)
   1999  1.1  skrll 	    {
   2000  1.1  skrll 	      final_val -= right;
   2001  1.1  skrll 	      op = O_symbol;
   2002  1.1  skrll 	      break;
   2003  1.1  skrll 	    }
   2004  1.1  skrll 	}
   2005  1.1  skrll 
   2006  1.1  skrll       /* Equality and non-equality tests are permitted on anything.
   2007  1.1  skrll 	 Subtraction, and other comparison operators are permitted if
   2008  1.1  skrll 	 both operands are in the same section.
   2009  1.1  skrll 	 Shifts by constant zero are permitted on anything.
   2010  1.1  skrll 	 Multiplies, bit-ors, and bit-ands with constant zero are
   2011  1.1  skrll 	 permitted on anything.
   2012  1.1  skrll 	 Multiplies and divides by constant one are permitted on
   2013  1.1  skrll 	 anything.
   2014  1.1  skrll 	 Binary operations with both operands being the same register
   2015  1.1  skrll 	 or undefined symbol are permitted if the result doesn't depend
   2016  1.1  skrll 	 on the input value.
   2017  1.1  skrll 	 Otherwise, both operands must be absolute.  We already handled
   2018  1.1  skrll 	 the case of addition or subtraction of a constant above.  */
   2019  1.1  skrll       frag_off = 0;
   2020  1.1  skrll       if (!(seg_left == absolute_section
   2021  1.1  skrll 	       && seg_right == absolute_section)
   2022  1.1  skrll 	  && !(op == O_eq || op == O_ne)
   2023  1.1  skrll 	  && !((op == O_subtract
   2024  1.1  skrll 		|| op == O_lt || op == O_le || op == O_ge || op == O_gt)
   2025  1.1  skrll 	       && seg_left == seg_right
   2026  1.1  skrll 	       && (finalize_syms
   2027  1.1  skrll 		   || frag_offset_fixed_p (frag_left, frag_right, &frag_off))
   2028  1.1  skrll 	       && (seg_left != reg_section || left == right)
   2029  1.1  skrll 	       && (seg_left != undefined_section || add_symbol == op_symbol)))
   2030  1.1  skrll 	{
   2031  1.1  skrll 	  if ((seg_left == absolute_section && left == 0)
   2032  1.1  skrll 	      || (seg_right == absolute_section && right == 0))
   2033  1.1  skrll 	    {
   2034  1.1  skrll 	      if (op == O_bit_exclusive_or || op == O_bit_inclusive_or)
   2035  1.1  skrll 		{
   2036  1.1  skrll 		  if (seg_right != absolute_section || right != 0)
   2037  1.1  skrll 		    {
   2038  1.1  skrll 		      seg_left = seg_right;
   2039  1.1  skrll 		      left = right;
   2040  1.1  skrll 		      add_symbol = op_symbol;
   2041  1.1  skrll 		    }
   2042  1.1  skrll 		  op = O_symbol;
   2043  1.1  skrll 		  break;
   2044  1.1  skrll 		}
   2045  1.1  skrll 	      else if (op == O_left_shift || op == O_right_shift)
   2046  1.1  skrll 		{
   2047  1.1  skrll 		  if (seg_left != absolute_section || left != 0)
   2048  1.1  skrll 		    {
   2049  1.1  skrll 		      op = O_symbol;
   2050  1.1  skrll 		      break;
   2051  1.1  skrll 		    }
   2052  1.1  skrll 		}
   2053  1.1  skrll 	      else if (op != O_multiply
   2054  1.1  skrll 		       && op != O_bit_or_not && op != O_bit_and)
   2055  1.1  skrll 	        return 0;
   2056  1.1  skrll 	    }
   2057  1.1  skrll 	  else if (op == O_multiply
   2058  1.1  skrll 		   && seg_left == absolute_section && left == 1)
   2059  1.1  skrll 	    {
   2060  1.1  skrll 	      seg_left = seg_right;
   2061  1.1  skrll 	      left = right;
   2062  1.1  skrll 	      add_symbol = op_symbol;
   2063  1.1  skrll 	      op = O_symbol;
   2064  1.1  skrll 	      break;
   2065  1.1  skrll 	    }
   2066  1.1  skrll 	  else if ((op == O_multiply || op == O_divide)
   2067  1.1  skrll 		   && seg_right == absolute_section && right == 1)
   2068  1.1  skrll 	    {
   2069  1.1  skrll 	      op = O_symbol;
   2070  1.1  skrll 	      break;
   2071  1.1  skrll 	    }
   2072  1.1  skrll 	  else if (left != right
   2073  1.1  skrll 		   || ((seg_left != reg_section || seg_right != reg_section)
   2074  1.1  skrll 		       && (seg_left != undefined_section
   2075  1.1  skrll 			   || seg_right != undefined_section
   2076  1.1  skrll 			   || add_symbol != op_symbol)))
   2077  1.1  skrll 	    return 0;
   2078  1.1  skrll 	  else if (op == O_bit_and || op == O_bit_inclusive_or)
   2079  1.1  skrll 	    {
   2080  1.1  skrll 	      op = O_symbol;
   2081  1.1  skrll 	      break;
   2082  1.1  skrll 	    }
   2083  1.1  skrll 	  else if (op != O_bit_exclusive_or && op != O_bit_or_not)
   2084  1.1  skrll 	    return 0;
   2085  1.1  skrll 	}
   2086  1.1  skrll 
   2087  1.1  skrll       right += frag_off / OCTETS_PER_BYTE;
   2088  1.1  skrll       switch (op)
   2089  1.1  skrll 	{
   2090  1.1  skrll 	case O_add:			left += right; break;
   2091  1.1  skrll 	case O_subtract:		left -= right; break;
   2092  1.1  skrll 	case O_multiply:		left *= right; break;
   2093  1.1  skrll 	case O_divide:
   2094  1.1  skrll 	  if (right == 0)
   2095  1.1  skrll 	    return 0;
   2096  1.1  skrll 	  left = (offsetT) left / (offsetT) right;
   2097  1.1  skrll 	  break;
   2098  1.1  skrll 	case O_modulus:
   2099  1.1  skrll 	  if (right == 0)
   2100  1.1  skrll 	    return 0;
   2101  1.1  skrll 	  left = (offsetT) left % (offsetT) right;
   2102  1.1  skrll 	  break;
   2103  1.1  skrll 	case O_left_shift:		left <<= right; break;
   2104  1.1  skrll 	case O_right_shift:		left >>= right; break;
   2105  1.1  skrll 	case O_bit_inclusive_or:	left |= right; break;
   2106  1.1  skrll 	case O_bit_or_not:		left |= ~right; break;
   2107  1.1  skrll 	case O_bit_exclusive_or:	left ^= right; break;
   2108  1.1  skrll 	case O_bit_and:			left &= right; break;
   2109  1.1  skrll 	case O_eq:
   2110  1.1  skrll 	case O_ne:
   2111  1.1  skrll 	  left = (left == right
   2112  1.1  skrll 		  && seg_left == seg_right
   2113  1.1  skrll 		  && (finalize_syms || frag_left == frag_right)
   2114  1.1  skrll 		  && (seg_left != undefined_section
   2115  1.1  skrll 		      || add_symbol == op_symbol)
   2116  1.1  skrll 		  ? ~ (valueT) 0 : 0);
   2117  1.1  skrll 	  if (op == O_ne)
   2118  1.1  skrll 	    left = ~left;
   2119  1.1  skrll 	  break;
   2120  1.1  skrll 	case O_lt:
   2121  1.1  skrll 	  left = (offsetT) left <  (offsetT) right ? ~ (valueT) 0 : 0;
   2122  1.1  skrll 	  break;
   2123  1.1  skrll 	case O_le:
   2124  1.1  skrll 	  left = (offsetT) left <= (offsetT) right ? ~ (valueT) 0 : 0;
   2125  1.1  skrll 	  break;
   2126  1.1  skrll 	case O_ge:
   2127  1.1  skrll 	  left = (offsetT) left >= (offsetT) right ? ~ (valueT) 0 : 0;
   2128  1.1  skrll 	  break;
   2129  1.1  skrll 	case O_gt:
   2130  1.1  skrll 	  left = (offsetT) left >  (offsetT) right ? ~ (valueT) 0 : 0;
   2131  1.1  skrll 	  break;
   2132  1.1  skrll 	case O_logical_and:	left = left && right; break;
   2133  1.1  skrll 	case O_logical_or:	left = left || right; break;
   2134  1.1  skrll 	default:		abort ();
   2135  1.1  skrll 	}
   2136  1.1  skrll 
   2137  1.1  skrll       op = O_constant;
   2138  1.1  skrll       break;
   2139  1.1  skrll     }
   2140  1.1  skrll 
   2141  1.1  skrll   if (op == O_symbol)
   2142  1.1  skrll     {
   2143  1.1  skrll       if (seg_left == absolute_section)
   2144  1.1  skrll 	op = O_constant;
   2145  1.1  skrll       else if (seg_left == reg_section && final_val == 0)
   2146  1.1  skrll 	op = O_register;
   2147  1.1  skrll       else if (add_symbol != expressionP->X_add_symbol)
   2148  1.1  skrll 	final_val += left;
   2149  1.1  skrll       expressionP->X_add_symbol = add_symbol;
   2150  1.1  skrll     }
   2151  1.1  skrll   expressionP->X_op = op;
   2152  1.1  skrll 
   2153  1.1  skrll   if (op == O_constant || op == O_register)
   2154  1.1  skrll     final_val += left;
   2155  1.1  skrll   expressionP->X_add_number = final_val;
   2156  1.1  skrll 
   2157  1.1  skrll   return 1;
   2158  1.1  skrll }
   2159  1.1  skrll 
   2160  1.1  skrll /* This lives here because it belongs equally in expr.c & read.c.
   2162  1.1  skrll    expr.c is just a branch office read.c anyway, and putting it
   2163  1.1  skrll    here lessens the crowd at read.c.
   2164  1.1  skrll 
   2165  1.1  skrll    Assume input_line_pointer is at start of symbol name.
   2166  1.1  skrll    Advance input_line_pointer past symbol name.
   2167  1.1  skrll    Turn that character into a '\0', returning its former value.
   2168  1.1  skrll    This allows a string compare (RMS wants symbol names to be strings)
   2169  1.1  skrll    of the symbol name.
   2170  1.1  skrll    There will always be a char following symbol name, because all good
   2171  1.1  skrll    lines end in end-of-line.  */
   2172  1.1  skrll 
   2173  1.1  skrll char
   2174  1.1  skrll get_symbol_end (void)
   2175  1.1  skrll {
   2176  1.1  skrll   char c;
   2177  1.1  skrll 
   2178  1.1  skrll   /* We accept \001 in a name in case this is being called with a
   2179  1.1  skrll      constructed string.  */
   2180  1.1  skrll   if (is_name_beginner (c = *input_line_pointer++) || c == '\001')
   2181  1.1  skrll     {
   2182  1.1  skrll       while (is_part_of_name (c = *input_line_pointer++)
   2183  1.1  skrll 	     || c == '\001')
   2184  1.1  skrll 	;
   2185  1.1  skrll       if (is_name_ender (c))
   2186  1.1  skrll 	c = *input_line_pointer++;
   2187  1.1  skrll     }
   2188  1.1  skrll   *--input_line_pointer = 0;
   2189  1.1  skrll   return (c);
   2190  1.1  skrll }
   2191             
   2192             unsigned int
   2193             get_single_number (void)
   2194             {
   2195               expressionS exp;
   2196               operand (&exp, expr_normal);
   2197               return exp.X_add_number;
   2198             }
   2199