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