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