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