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
35static void floating_constant (expressionS * expressionP);
36static valueT generic_bignum_to_int32 (void);
37#ifdef BFD64
38static valueT generic_bignum_to_int64 (void);
39#endif
40static void integer_constant (int radix, expressionS * expressionP);
41static void mri_char_constant (expressionS *);
42static void current_location (expressionS *);
43static void clean_up_expression (expressionS * expressionP);
44static segT operand (expressionS *);
45static operatorT operator (int *);
46
47extern 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
52struct expr_symbol_line {
53  struct expr_symbol_line *next;
54  symbolS *sym;
55  char *file;
56  unsigned int line;
57};
58
59static 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
65symbolS *
66make_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
119int
120expr_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
149symbolS *
150expr_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
162symbolS *
163expr_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
175symbolS *
176expr_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
189symbolS *
190expr_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.  */
206LITTLENUM_TYPE generic_bignum[SIZE_OF_LARGE_NUMBER + 6];
207
208FLONUM_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.  */
217int generic_floating_point_magic;
218
219static void
220floating_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
246static valueT
247generic_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
257static valueT
258generic_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
272static void
273integer_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
631static void
632mri_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
720static void
721current_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
743static segT
744operand (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
1386static void
1387clean_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.  */
1435static 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*/
1479static 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
1537void
1538expr_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
1556void
1557expr_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
1573static inline operatorT
1574operator (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
1669segT
1670expr (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
1928char
1929get_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
1947unsigned int
1948get_single_number (void)
1949{
1950  expressionS exp;
1951  operand (&exp);
1952  return exp.X_add_number;
1953}
1954