Merge from vendor branch OPENSSL:
[dragonfly.git] / contrib / binutils-2.15 / gas / expr.c
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 \f
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 \f
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 \f
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 \f
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       if (*input_line_pointer == '+')
1026         goto target_op;
1027       (void) operand (expressionP);
1028       break;
1029
1030 #ifdef TC_M68K
1031     case '"':
1032       /* Double quote is the bitwise not operator in MRI mode.  */
1033       if (! flag_m68k_mri)
1034         goto de_fault;
1035       /* Fall through.  */
1036 #endif
1037     case '~':
1038       /* '~' is permitted to start a label on the Delta.  */
1039       if (is_name_beginner (c))
1040         goto isname;
1041     case '!':
1042     case '-':
1043       {
1044         /* Do not accept --e as -(-e) */
1045         if (c == '-' && *input_line_pointer == '-')
1046           goto target_op;
1047         
1048         operand (expressionP);
1049         if (expressionP->X_op == O_constant)
1050           {
1051             /* input_line_pointer -> char after operand.  */
1052             if (c == '-')
1053               {
1054                 expressionP->X_add_number = - expressionP->X_add_number;
1055                 /* Notice: '-' may overflow: no warning is given.
1056                    This is compatible with other people's
1057                    assemblers.  Sigh.  */
1058                 expressionP->X_unsigned = 0;
1059               }
1060             else if (c == '~' || c == '"')
1061               expressionP->X_add_number = ~ expressionP->X_add_number;
1062             else
1063               expressionP->X_add_number = ! expressionP->X_add_number;
1064           }
1065         else if (expressionP->X_op == O_big
1066                  && expressionP->X_add_number <= 0
1067                  && c == '-'
1068                  && (generic_floating_point_number.sign == '+'
1069                      || generic_floating_point_number.sign == 'P'))
1070           {
1071             /* Negative flonum (eg, -1.000e0).  */
1072             if (generic_floating_point_number.sign == '+')
1073               generic_floating_point_number.sign = '-';
1074             else
1075               generic_floating_point_number.sign = 'N';
1076           }
1077         else if (expressionP->X_op != O_illegal
1078                  && expressionP->X_op != O_absent)
1079           {
1080             expressionP->X_add_symbol = make_expr_symbol (expressionP);
1081             if (c == '-')
1082               expressionP->X_op = O_uminus;
1083             else if (c == '~' || c == '"')
1084               expressionP->X_op = O_bit_not;
1085             else
1086               expressionP->X_op = O_logical_not;
1087             expressionP->X_add_number = 0;
1088           }
1089         else
1090           as_warn (_("Unary operator %c ignored because bad operand follows"),
1091                    c);
1092       }
1093       break;
1094
1095 #if defined (DOLLAR_DOT) || defined (TC_M68K)
1096     case '$':
1097       /* '$' is the program counter when in MRI mode, or when
1098          DOLLAR_DOT is defined.  */
1099 #ifndef DOLLAR_DOT
1100       if (! flag_m68k_mri)
1101         goto de_fault;
1102 #endif
1103       if (flag_m68k_mri && hex_p (*input_line_pointer))
1104         {
1105           /* In MRI mode, '$' is also used as the prefix for a
1106              hexadecimal constant.  */
1107           integer_constant (16, expressionP);
1108           break;
1109         }
1110
1111       if (is_part_of_name (*input_line_pointer))
1112         goto isname;
1113
1114       current_location (expressionP);
1115       break;
1116 #endif
1117
1118     case '.':
1119       if (!is_part_of_name (*input_line_pointer))
1120         {
1121           current_location (expressionP);
1122           break;
1123         }
1124       else if ((strncasecmp (input_line_pointer, "startof.", 8) == 0
1125                 && ! is_part_of_name (input_line_pointer[8]))
1126                || (strncasecmp (input_line_pointer, "sizeof.", 7) == 0
1127                    && ! is_part_of_name (input_line_pointer[7])))
1128         {
1129           int start;
1130
1131           start = (input_line_pointer[1] == 't'
1132                    || input_line_pointer[1] == 'T');
1133           input_line_pointer += start ? 8 : 7;
1134           SKIP_WHITESPACE ();
1135           if (*input_line_pointer != '(')
1136             as_bad (_("syntax error in .startof. or .sizeof."));
1137           else
1138             {
1139               char *buf;
1140
1141               ++input_line_pointer;
1142               SKIP_WHITESPACE ();
1143               name = input_line_pointer;
1144               c = get_symbol_end ();
1145
1146               buf = (char *) xmalloc (strlen (name) + 10);
1147               if (start)
1148                 sprintf (buf, ".startof.%s", name);
1149               else
1150                 sprintf (buf, ".sizeof.%s", name);
1151               symbolP = symbol_make (buf);
1152               free (buf);
1153
1154               expressionP->X_op = O_symbol;
1155               expressionP->X_add_symbol = symbolP;
1156               expressionP->X_add_number = 0;
1157
1158               *input_line_pointer = c;
1159               SKIP_WHITESPACE ();
1160               if (*input_line_pointer != ')')
1161                 as_bad (_("syntax error in .startof. or .sizeof."));
1162               else
1163                 ++input_line_pointer;
1164             }
1165           break;
1166         }
1167       else
1168         {
1169           goto isname;
1170         }
1171
1172     case ',':
1173     eol:
1174       /* Can't imagine any other kind of operand.  */
1175       expressionP->X_op = O_absent;
1176       input_line_pointer--;
1177       break;
1178
1179 #ifdef TC_M68K
1180     case '%':
1181       if (! flag_m68k_mri)
1182         goto de_fault;
1183       integer_constant (2, expressionP);
1184       break;
1185
1186     case '@':
1187       if (! flag_m68k_mri)
1188         goto de_fault;
1189       integer_constant (8, expressionP);
1190       break;
1191
1192     case ':':
1193       if (! flag_m68k_mri)
1194         goto de_fault;
1195
1196       /* In MRI mode, this is a floating point constant represented
1197          using hexadecimal digits.  */
1198
1199       ++input_line_pointer;
1200       integer_constant (16, expressionP);
1201       break;
1202
1203     case '*':
1204       if (! flag_m68k_mri || is_part_of_name (*input_line_pointer))
1205         goto de_fault;
1206
1207       current_location (expressionP);
1208       break;
1209 #endif
1210
1211     default:
1212 #ifdef TC_M68K
1213     de_fault:
1214 #endif
1215       if (is_name_beginner (c)) /* Here if did not begin with a digit.  */
1216         {
1217           /* Identifier begins here.
1218              This is kludged for speed, so code is repeated.  */
1219         isname:
1220           name = --input_line_pointer;
1221           c = get_symbol_end ();
1222
1223 #ifdef md_parse_name
1224           /* This is a hook for the backend to parse certain names
1225              specially in certain contexts.  If a name always has a
1226              specific value, it can often be handled by simply
1227              entering it in the symbol table.  */
1228           if (md_parse_name (name, expressionP, &c))
1229             {
1230               *input_line_pointer = c;
1231               break;
1232             }
1233 #endif
1234
1235 #ifdef TC_I960
1236           /* The MRI i960 assembler permits
1237                  lda sizeof code,g13
1238              FIXME: This should use md_parse_name.  */
1239           if (flag_mri
1240               && (strcasecmp (name, "sizeof") == 0
1241                   || strcasecmp (name, "startof") == 0))
1242             {
1243               int start;
1244               char *buf;
1245
1246               start = (name[1] == 't'
1247                        || name[1] == 'T');
1248
1249               *input_line_pointer = c;
1250               SKIP_WHITESPACE ();
1251
1252               name = input_line_pointer;
1253               c = get_symbol_end ();
1254
1255               buf = (char *) xmalloc (strlen (name) + 10);
1256               if (start)
1257                 sprintf (buf, ".startof.%s", name);
1258               else
1259                 sprintf (buf, ".sizeof.%s", name);
1260               symbolP = symbol_make (buf);
1261               free (buf);
1262
1263               expressionP->X_op = O_symbol;
1264               expressionP->X_add_symbol = symbolP;
1265               expressionP->X_add_number = 0;
1266
1267               *input_line_pointer = c;
1268               SKIP_WHITESPACE ();
1269
1270               break;
1271             }
1272 #endif
1273
1274           symbolP = symbol_find_or_make (name);
1275
1276           /* If we have an absolute symbol or a reg, then we know its
1277              value now.  */
1278           segment = S_GET_SEGMENT (symbolP);
1279           if (segment == absolute_section)
1280             {
1281               expressionP->X_op = O_constant;
1282               expressionP->X_add_number = S_GET_VALUE (symbolP);
1283             }
1284           else if (segment == reg_section)
1285             {
1286               expressionP->X_op = O_register;
1287               expressionP->X_add_number = S_GET_VALUE (symbolP);
1288             }
1289           else
1290             {
1291               expressionP->X_op = O_symbol;
1292               expressionP->X_add_symbol = symbolP;
1293               expressionP->X_add_number = 0;
1294             }
1295           *input_line_pointer = c;
1296         }
1297       else
1298         {
1299         target_op:
1300           /* Let the target try to parse it.  Success is indicated by changing
1301              the X_op field to something other than O_absent and pointing
1302              input_line_pointer past the expression.  If it can't parse the
1303              expression, X_op and input_line_pointer should be unchanged.  */
1304           expressionP->X_op = O_absent;
1305           --input_line_pointer;
1306           md_operand (expressionP);
1307           if (expressionP->X_op == O_absent)
1308             {
1309               ++input_line_pointer;
1310               as_bad (_("bad expression"));
1311               expressionP->X_op = O_constant;
1312               expressionP->X_add_number = 0;
1313             }
1314         }
1315       break;
1316     }
1317
1318   /* It is more 'efficient' to clean up the expressionS when they are
1319      created.  Doing it here saves lines of code.  */
1320   clean_up_expression (expressionP);
1321   SKIP_WHITESPACE ();           /* -> 1st char after operand.  */
1322   know (*input_line_pointer != ' ');
1323
1324   /* The PA port needs this information.  */
1325   if (expressionP->X_add_symbol)
1326     symbol_mark_used (expressionP->X_add_symbol);
1327
1328   switch (expressionP->X_op)
1329     {
1330     default:
1331       return absolute_section;
1332     case O_symbol:
1333       return S_GET_SEGMENT (expressionP->X_add_symbol);
1334     case O_register:
1335       return reg_section;
1336     }
1337 }
1338 \f
1339 /* Internal.  Simplify a struct expression for use by expr ().  */
1340
1341 /* In:  address of an expressionS.
1342         The X_op field of the expressionS may only take certain values.
1343         Elsewise we waste time special-case testing. Sigh. Ditto SEG_ABSENT.
1344
1345    Out: expressionS may have been modified:
1346         Unused fields zeroed to help expr ().  */
1347
1348 static void
1349 clean_up_expression (expressionS *expressionP)
1350 {
1351   switch (expressionP->X_op)
1352     {
1353     case O_illegal:
1354     case O_absent:
1355       expressionP->X_add_number = 0;
1356       /* Fall through.  */
1357     case O_big:
1358     case O_constant:
1359     case O_register:
1360       expressionP->X_add_symbol = NULL;
1361       /* Fall through.  */
1362     case O_symbol:
1363     case O_uminus:
1364     case O_bit_not:
1365       expressionP->X_op_symbol = NULL;
1366       break;
1367     default:
1368       break;
1369     }
1370 }
1371 \f
1372 /* Expression parser.  */
1373
1374 /* We allow an empty expression, and just assume (absolute,0) silently.
1375    Unary operators and parenthetical expressions are treated as operands.
1376    As usual, Q==quantity==operand, O==operator, X==expression mnemonics.
1377
1378    We used to do an aho/ullman shift-reduce parser, but the logic got so
1379    warped that I flushed it and wrote a recursive-descent parser instead.
1380    Now things are stable, would anybody like to write a fast parser?
1381    Most expressions are either register (which does not even reach here)
1382    or 1 symbol. Then "symbol+constant" and "symbol-symbol" are common.
1383    So I guess it doesn't really matter how inefficient more complex expressions
1384    are parsed.
1385
1386    After expr(RANK,resultP) input_line_pointer->operator of rank <= RANK.
1387    Also, we have consumed any leading or trailing spaces (operand does that)
1388    and done all intervening operators.
1389
1390    This returns the segment of the result, which will be
1391    absolute_section or the segment of a symbol.  */
1392
1393 #undef __
1394 #define __ O_illegal
1395
1396 /* Maps ASCII -> operators.  */
1397 static const operatorT op_encoding[256] = {
1398   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1399   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1400
1401   __, O_bit_or_not, __, __, __, O_modulus, O_bit_and, __,
1402   __, __, O_multiply, O_add, __, O_subtract, __, O_divide,
1403   __, __, __, __, __, __, __, __,
1404   __, __, __, __, O_lt, __, O_gt, __,
1405   __, __, __, __, __, __, __, __,
1406   __, __, __, __, __, __, __, __,
1407   __, __, __, __, __, __, __, __,
1408   __, __, __,
1409 #ifdef NEED_INDEX_OPERATOR
1410   O_index,
1411 #else
1412   __,
1413 #endif
1414   __, __, O_bit_exclusive_or, __,
1415   __, __, __, __, __, __, __, __,
1416   __, __, __, __, __, __, __, __,
1417   __, __, __, __, __, __, __, __,
1418   __, __, __, __, O_bit_inclusive_or, __, __, __,
1419
1420   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1421   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1422   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1423   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1424   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1425   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1426   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1427   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
1428 };
1429
1430 /* Rank Examples
1431    0    operand, (expression)
1432    1    ||
1433    2    &&
1434    3    == <> < <= >= >
1435    4    + -
1436    5    used for * / % in MRI mode
1437    6    & ^ ! |
1438    7    * / % << >>
1439    8    unary - unary ~
1440 */
1441 static operator_rankT op_rank[] = {
1442   0,    /* O_illegal */
1443   0,    /* O_absent */
1444   0,    /* O_constant */
1445   0,    /* O_symbol */
1446   0,    /* O_symbol_rva */
1447   0,    /* O_register */
1448   0,    /* O_big */
1449   9,    /* O_uminus */
1450   9,    /* O_bit_not */
1451   9,    /* O_logical_not */
1452   8,    /* O_multiply */
1453   8,    /* O_divide */
1454   8,    /* O_modulus */
1455   8,    /* O_left_shift */
1456   8,    /* O_right_shift */
1457   7,    /* O_bit_inclusive_or */
1458   7,    /* O_bit_or_not */
1459   7,    /* O_bit_exclusive_or */
1460   7,    /* O_bit_and */
1461   5,    /* O_add */
1462   5,    /* O_subtract */
1463   4,    /* O_eq */
1464   4,    /* O_ne */
1465   4,    /* O_lt */
1466   4,    /* O_le */
1467   4,    /* O_ge */
1468   4,    /* O_gt */
1469   3,    /* O_logical_and */
1470   2,    /* O_logical_or */
1471   1,    /* O_index */
1472   0,    /* O_md1 */
1473   0,    /* O_md2 */
1474   0,    /* O_md3 */
1475   0,    /* O_md4 */
1476   0,    /* O_md5 */
1477   0,    /* O_md6 */
1478   0,    /* O_md7 */
1479   0,    /* O_md8 */
1480   0,    /* O_md9 */
1481   0,    /* O_md10 */
1482   0,    /* O_md11 */
1483   0,    /* O_md12 */
1484   0,    /* O_md13 */
1485   0,    /* O_md14 */
1486   0,    /* O_md15 */
1487   0,    /* O_md16 */
1488 };
1489
1490 /* Unfortunately, in MRI mode for the m68k, multiplication and
1491    division have lower precedence than the bit wise operators.  This
1492    function sets the operator precedences correctly for the current
1493    mode.  Also, MRI uses a different bit_not operator, and this fixes
1494    that as well.  */
1495
1496 #define STANDARD_MUL_PRECEDENCE 8
1497 #define MRI_MUL_PRECEDENCE 6
1498
1499 void
1500 expr_set_precedence (void)
1501 {
1502   if (flag_m68k_mri)
1503     {
1504       op_rank[O_multiply] = MRI_MUL_PRECEDENCE;
1505       op_rank[O_divide] = MRI_MUL_PRECEDENCE;
1506       op_rank[O_modulus] = MRI_MUL_PRECEDENCE;
1507     }
1508   else
1509     {
1510       op_rank[O_multiply] = STANDARD_MUL_PRECEDENCE;
1511       op_rank[O_divide] = STANDARD_MUL_PRECEDENCE;
1512       op_rank[O_modulus] = STANDARD_MUL_PRECEDENCE;
1513     }
1514 }
1515
1516 /* Initialize the expression parser.  */
1517
1518 void
1519 expr_begin (void)
1520 {
1521   expr_set_precedence ();
1522
1523   /* Verify that X_op field is wide enough.  */
1524   {
1525     expressionS e;
1526     e.X_op = O_max;
1527     assert (e.X_op == O_max);
1528   }
1529 }
1530 \f
1531 /* Return the encoding for the operator at INPUT_LINE_POINTER, and
1532    sets NUM_CHARS to the number of characters in the operator.
1533    Does not advance INPUT_LINE_POINTER.  */
1534
1535 static inline operatorT
1536 operator (int *num_chars)
1537 {
1538   int c;
1539   operatorT ret;
1540
1541   c = *input_line_pointer & 0xff;
1542   *num_chars = 1;
1543
1544   if (is_end_of_line[c])
1545     return O_illegal;
1546
1547   switch (c)
1548     {
1549     default:
1550       return op_encoding[c];
1551
1552     case '+':
1553     case '-':
1554       /* Do not allow a++b and a--b to be a + (+b) and a - (-b) */
1555       if (input_line_pointer[1] != c)
1556         return op_encoding[c];
1557       return O_illegal;
1558
1559     case '<':
1560       switch (input_line_pointer[1])
1561         {
1562         default:
1563           return op_encoding[c];
1564         case '<':
1565           ret = O_left_shift;
1566           break;
1567         case '>':
1568           ret = O_ne;
1569           break;
1570         case '=':
1571           ret = O_le;
1572           break;
1573         }
1574       *num_chars = 2;
1575       return ret;
1576
1577     case '=':
1578       if (input_line_pointer[1] != '=')
1579         return op_encoding[c];
1580
1581       *num_chars = 2;
1582       return O_eq;
1583
1584     case '>':
1585       switch (input_line_pointer[1])
1586         {
1587         default:
1588           return op_encoding[c];
1589         case '>':
1590           ret = O_right_shift;
1591           break;
1592         case '=':
1593           ret = O_ge;
1594           break;
1595         }
1596       *num_chars = 2;
1597       return ret;
1598
1599     case '!':
1600       /* We accept !! as equivalent to ^ for MRI compatibility.  */
1601       if (input_line_pointer[1] != '!')
1602         {
1603           if (flag_m68k_mri)
1604             return O_bit_inclusive_or;
1605           return op_encoding[c];
1606         }
1607       *num_chars = 2;
1608       return O_bit_exclusive_or;
1609
1610     case '|':
1611       if (input_line_pointer[1] != '|')
1612         return op_encoding[c];
1613
1614       *num_chars = 2;
1615       return O_logical_or;
1616
1617     case '&':
1618       if (input_line_pointer[1] != '&')
1619         return op_encoding[c];
1620
1621       *num_chars = 2;
1622       return O_logical_and;
1623     }
1624
1625   /* NOTREACHED  */
1626 }
1627
1628 /* Parse an expression.  */
1629
1630 segT
1631 expr (int rankarg,              /* Larger # is higher rank.  */
1632       expressionS *resultP      /* Deliver result here.  */)
1633 {
1634   operator_rankT rank = (operator_rankT) rankarg;
1635   segT retval;
1636   expressionS right;
1637   operatorT op_left;
1638   operatorT op_right;
1639   int op_chars;
1640
1641   know (rank >= 0);
1642
1643   /* Save the value of dot for the fixup code.  */
1644   if (rank == 0)
1645     dot_value = frag_now_fix ();
1646
1647   retval = operand (resultP);
1648
1649   /* operand () gobbles spaces.  */
1650   know (*input_line_pointer != ' ');
1651
1652   op_left = operator (&op_chars);
1653   while (op_left != O_illegal && op_rank[(int) op_left] > rank)
1654     {
1655       segT rightseg;
1656
1657       input_line_pointer += op_chars;   /* -> after operator.  */
1658
1659       rightseg = expr (op_rank[(int) op_left], &right);
1660       if (right.X_op == O_absent)
1661         {
1662           as_warn (_("missing operand; zero assumed"));
1663           right.X_op = O_constant;
1664           right.X_add_number = 0;
1665           right.X_add_symbol = NULL;
1666           right.X_op_symbol = NULL;
1667         }
1668
1669       know (*input_line_pointer != ' ');
1670
1671       if (op_left == O_index)
1672         {
1673           if (*input_line_pointer != ']')
1674             as_bad ("missing right bracket");
1675           else
1676             {
1677               ++input_line_pointer;
1678               SKIP_WHITESPACE ();
1679             }
1680         }
1681
1682       op_right = operator (&op_chars);
1683
1684       know (op_right == O_illegal
1685             || op_rank[(int) op_right] <= op_rank[(int) op_left]);
1686       know ((int) op_left >= (int) O_multiply
1687             && (int) op_left <= (int) O_logical_or);
1688
1689       /* input_line_pointer->after right-hand quantity.  */
1690       /* left-hand quantity in resultP.  */
1691       /* right-hand quantity in right.  */
1692       /* operator in op_left.  */
1693
1694       if (resultP->X_op == O_big)
1695         {
1696           if (resultP->X_add_number > 0)
1697             as_warn (_("left operand is a bignum; integer 0 assumed"));
1698           else
1699             as_warn (_("left operand is a float; integer 0 assumed"));
1700           resultP->X_op = O_constant;
1701           resultP->X_add_number = 0;
1702           resultP->X_add_symbol = NULL;
1703           resultP->X_op_symbol = NULL;
1704         }
1705       if (right.X_op == O_big)
1706         {
1707           if (right.X_add_number > 0)
1708             as_warn (_("right operand is a bignum; integer 0 assumed"));
1709           else
1710             as_warn (_("right operand is a float; integer 0 assumed"));
1711           right.X_op = O_constant;
1712           right.X_add_number = 0;
1713           right.X_add_symbol = NULL;
1714           right.X_op_symbol = NULL;
1715         }
1716
1717       /* Optimize common cases.  */
1718 #ifdef md_optimize_expr
1719       if (md_optimize_expr (resultP, op_left, &right))
1720         {
1721           /* Skip.  */
1722           ;
1723         }
1724       else
1725 #endif
1726       if (op_left == O_add && right.X_op == O_constant)
1727         {
1728           /* X + constant.  */
1729           resultP->X_add_number += right.X_add_number;
1730         }
1731       /* This case comes up in PIC code.  */
1732       else if (op_left == O_subtract
1733                && right.X_op == O_symbol
1734                && resultP->X_op == O_symbol
1735                && (symbol_get_frag (right.X_add_symbol)
1736                    == symbol_get_frag (resultP->X_add_symbol))
1737                && (SEG_NORMAL (rightseg)
1738                    || right.X_add_symbol == resultP->X_add_symbol))
1739         {
1740           resultP->X_add_number -= right.X_add_number;
1741           resultP->X_add_number += (S_GET_VALUE (resultP->X_add_symbol)
1742                                     - S_GET_VALUE (right.X_add_symbol));
1743           resultP->X_op = O_constant;
1744           resultP->X_add_symbol = 0;
1745         }
1746       else if (op_left == O_subtract && right.X_op == O_constant)
1747         {
1748           /* X - constant.  */
1749           resultP->X_add_number -= right.X_add_number;
1750         }
1751       else if (op_left == O_add && resultP->X_op == O_constant)
1752         {
1753           /* Constant + X.  */
1754           resultP->X_op = right.X_op;
1755           resultP->X_add_symbol = right.X_add_symbol;
1756           resultP->X_op_symbol = right.X_op_symbol;
1757           resultP->X_add_number += right.X_add_number;
1758           retval = rightseg;
1759         }
1760       else if (resultP->X_op == O_constant && right.X_op == O_constant)
1761         {
1762           /* Constant OP constant.  */
1763           offsetT v = right.X_add_number;
1764           if (v == 0 && (op_left == O_divide || op_left == O_modulus))
1765             {
1766               as_warn (_("division by zero"));
1767               v = 1;
1768             }
1769           switch (op_left)
1770             {
1771             default:                    abort ();
1772             case O_multiply:            resultP->X_add_number *= v; break;
1773             case O_divide:              resultP->X_add_number /= v; break;
1774             case O_modulus:             resultP->X_add_number %= v; break;
1775             case O_left_shift:          resultP->X_add_number <<= v; break;
1776             case O_right_shift:
1777               /* We always use unsigned shifts, to avoid relying on
1778                  characteristics of the compiler used to compile gas.  */
1779               resultP->X_add_number =
1780                 (offsetT) ((valueT) resultP->X_add_number >> (valueT) v);
1781               break;
1782             case O_bit_inclusive_or:    resultP->X_add_number |= v; break;
1783             case O_bit_or_not:          resultP->X_add_number |= ~v; break;
1784             case O_bit_exclusive_or:    resultP->X_add_number ^= v; break;
1785             case O_bit_and:             resultP->X_add_number &= v; break;
1786             case O_add:                 resultP->X_add_number += v; break;
1787             case O_subtract:            resultP->X_add_number -= v; break;
1788             case O_eq:
1789               resultP->X_add_number =
1790                 resultP->X_add_number == v ? ~ (offsetT) 0 : 0;
1791               break;
1792             case O_ne:
1793               resultP->X_add_number =
1794                 resultP->X_add_number != v ? ~ (offsetT) 0 : 0;
1795               break;
1796             case O_lt:
1797               resultP->X_add_number =
1798                 resultP->X_add_number <  v ? ~ (offsetT) 0 : 0;
1799               break;
1800             case O_le:
1801               resultP->X_add_number =
1802                 resultP->X_add_number <= v ? ~ (offsetT) 0 : 0;
1803               break;
1804             case O_ge:
1805               resultP->X_add_number =
1806                 resultP->X_add_number >= v ? ~ (offsetT) 0 : 0;
1807               break;
1808             case O_gt:
1809               resultP->X_add_number =
1810                 resultP->X_add_number >  v ? ~ (offsetT) 0 : 0;
1811               break;
1812             case O_logical_and:
1813               resultP->X_add_number = resultP->X_add_number && v;
1814               break;
1815             case O_logical_or:
1816               resultP->X_add_number = resultP->X_add_number || v;
1817               break;
1818             }
1819         }
1820       else if (resultP->X_op == O_symbol
1821                && right.X_op == O_symbol
1822                && (op_left == O_add
1823                    || op_left == O_subtract
1824                    || (resultP->X_add_number == 0
1825                        && right.X_add_number == 0)))
1826         {
1827           /* Symbol OP symbol.  */
1828           resultP->X_op = op_left;
1829           resultP->X_op_symbol = right.X_add_symbol;
1830           if (op_left == O_add)
1831             resultP->X_add_number += right.X_add_number;
1832           else if (op_left == O_subtract)
1833             {
1834               resultP->X_add_number -= right.X_add_number;
1835               if (retval == rightseg && SEG_NORMAL (retval))
1836                 {
1837                   retval = absolute_section;
1838                   rightseg = absolute_section;
1839                 }
1840             }
1841         }
1842       else
1843         {
1844           /* The general case.  */
1845           resultP->X_add_symbol = make_expr_symbol (resultP);
1846           resultP->X_op_symbol = make_expr_symbol (&right);
1847           resultP->X_op = op_left;
1848           resultP->X_add_number = 0;
1849           resultP->X_unsigned = 1;
1850         }
1851
1852       if (retval != rightseg)
1853         {
1854           if (! SEG_NORMAL (retval))
1855             {
1856               if (retval != undefined_section || SEG_NORMAL (rightseg))
1857                 retval = rightseg;
1858             }
1859           else if (SEG_NORMAL (rightseg)
1860 #ifdef DIFF_EXPR_OK
1861                    && op_left != O_subtract
1862 #endif
1863                    )
1864             as_bad (_("operation combines symbols in different segments"));
1865         }
1866
1867       op_left = op_right;
1868     }                           /* While next operator is >= this rank.  */
1869
1870   /* The PA port needs this information.  */
1871   if (resultP->X_add_symbol)
1872     symbol_mark_used (resultP->X_add_symbol);
1873
1874   return resultP->X_op == O_constant ? absolute_section : retval;
1875 }
1876 \f
1877 /* This lives here because it belongs equally in expr.c & read.c.
1878    expr.c is just a branch office read.c anyway, and putting it
1879    here lessens the crowd at read.c.
1880
1881    Assume input_line_pointer is at start of symbol name.
1882    Advance input_line_pointer past symbol name.
1883    Turn that character into a '\0', returning its former value.
1884    This allows a string compare (RMS wants symbol names to be strings)
1885    of the symbol name.
1886    There will always be a char following symbol name, because all good
1887    lines end in end-of-line.  */
1888
1889 char
1890 get_symbol_end (void)
1891 {
1892   char c;
1893
1894   /* We accept \001 in a name in case this is being called with a
1895      constructed string.  */
1896   if (is_name_beginner (c = *input_line_pointer++) || c == '\001')
1897     {
1898       while (is_part_of_name (c = *input_line_pointer++)
1899              || c == '\001')
1900         ;
1901       if (is_name_ender (c))
1902         c = *input_line_pointer++;
1903     }
1904   *--input_line_pointer = 0;
1905   return (c);
1906 }
1907
1908 unsigned int
1909 get_single_number (void)
1910 {
1911   expressionS exp;
1912   operand (&exp);
1913   return exp.X_add_number;
1914 }