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