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