gas/
[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, 2003, 2004, 2005
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           expressionP->X_add_number = number;
613           input_line_pointer--; /* Restore following character.  */
614         }                       /* Really just a number.  */
615     }
616   else
617     {
618       /* Not a small number.  */
619       expressionP->X_op = O_big;
620       expressionP->X_add_number = number;       /* Number of littlenums.  */
621       input_line_pointer--;     /* -> char following number.  */
622     }
623 }
624
625 /* Parse an MRI multi character constant.  */
626
627 static void
628 mri_char_constant (expressionS *expressionP)
629 {
630   int i;
631
632   if (*input_line_pointer == '\''
633       && input_line_pointer[1] != '\'')
634     {
635       expressionP->X_op = O_constant;
636       expressionP->X_add_number = 0;
637       return;
638     }
639
640   /* In order to get the correct byte ordering, we must build the
641      number in reverse.  */
642   for (i = SIZE_OF_LARGE_NUMBER - 1; i >= 0; i--)
643     {
644       int j;
645
646       generic_bignum[i] = 0;
647       for (j = 0; j < CHARS_PER_LITTLENUM; j++)
648         {
649           if (*input_line_pointer == '\'')
650             {
651               if (input_line_pointer[1] != '\'')
652                 break;
653               ++input_line_pointer;
654             }
655           generic_bignum[i] <<= 8;
656           generic_bignum[i] += *input_line_pointer;
657           ++input_line_pointer;
658         }
659
660       if (i < SIZE_OF_LARGE_NUMBER - 1)
661         {
662           /* If there is more than one littlenum, left justify the
663              last one to make it match the earlier ones.  If there is
664              only one, we can just use the value directly.  */
665           for (; j < CHARS_PER_LITTLENUM; j++)
666             generic_bignum[i] <<= 8;
667         }
668
669       if (*input_line_pointer == '\''
670           && input_line_pointer[1] != '\'')
671         break;
672     }
673
674   if (i < 0)
675     {
676       as_bad (_("character constant too large"));
677       i = 0;
678     }
679
680   if (i > 0)
681     {
682       int c;
683       int j;
684
685       c = SIZE_OF_LARGE_NUMBER - i;
686       for (j = 0; j < c; j++)
687         generic_bignum[j] = generic_bignum[i + j];
688       i = c;
689     }
690
691   know (LITTLENUM_NUMBER_OF_BITS == 16);
692   if (i > 2)
693     {
694       expressionP->X_op = O_big;
695       expressionP->X_add_number = i;
696     }
697   else
698     {
699       expressionP->X_op = O_constant;
700       if (i < 2)
701         expressionP->X_add_number = generic_bignum[0] & LITTLENUM_MASK;
702       else
703         expressionP->X_add_number =
704           (((generic_bignum[1] & LITTLENUM_MASK)
705             << LITTLENUM_NUMBER_OF_BITS)
706            | (generic_bignum[0] & LITTLENUM_MASK));
707     }
708
709   /* Skip the final closing quote.  */
710   ++input_line_pointer;
711 }
712
713 /* Return an expression representing the current location.  This
714    handles the magic symbol `.'.  */
715
716 static void
717 current_location (expressionS *expressionp)
718 {
719   if (now_seg == absolute_section)
720     {
721       expressionp->X_op = O_constant;
722       expressionp->X_add_number = abs_section_offset;
723     }
724   else
725     {
726       expressionp->X_op = O_symbol;
727       expressionp->X_add_symbol = symbol_temp_new_now ();
728       expressionp->X_add_number = 0;
729     }
730 }
731
732 /* In:  Input_line_pointer points to 1st char of operand, which may
733         be a space.
734
735    Out: An expressionS.
736         The operand may have been empty: in this case X_op == O_absent.
737         Input_line_pointer->(next non-blank) char after operand.  */
738
739 static segT
740 operand (expressionS *expressionP)
741 {
742   char c;
743   symbolS *symbolP;     /* Points to symbol.  */
744   char *name;           /* Points to name of symbol.  */
745   segT segment;
746
747   /* All integers are regarded as unsigned unless they are negated.
748      This is because the only thing which cares whether a number is
749      unsigned is the code in emit_expr which extends constants into
750      bignums.  It should only sign extend negative numbers, so that
751      something like ``.quad 0x80000000'' is not sign extended even
752      though it appears negative if valueT is 32 bits.  */
753   expressionP->X_unsigned = 1;
754
755   /* Digits, assume it is a bignum.  */
756
757   SKIP_WHITESPACE ();           /* Leading whitespace is part of operand.  */
758   c = *input_line_pointer++;    /* input_line_pointer -> past char in c.  */
759
760   if (is_end_of_line[(unsigned char) c])
761     goto eol;
762
763   switch (c)
764     {
765     case '1':
766     case '2':
767     case '3':
768     case '4':
769     case '5':
770     case '6':
771     case '7':
772     case '8':
773     case '9':
774       input_line_pointer--;
775
776       integer_constant ((NUMBERS_WITH_SUFFIX || flag_m68k_mri)
777                         ? 0 : 10,
778                         expressionP);
779       break;
780
781 #ifdef LITERAL_PREFIXDOLLAR_HEX
782     case '$':
783       /* $L is the start of a local label, not a hex constant.  */
784       if (* input_line_pointer == 'L')
785       goto isname;
786       integer_constant (16, expressionP);
787       break;
788 #endif
789
790 #ifdef LITERAL_PREFIXPERCENT_BIN
791     case '%':
792       integer_constant (2, expressionP);
793       break;
794 #endif
795
796     case '0':
797       /* Non-decimal radix.  */
798
799       if (NUMBERS_WITH_SUFFIX || flag_m68k_mri)
800         {
801           char *s;
802
803           /* Check for a hex or float constant.  */
804           for (s = input_line_pointer; hex_p (*s); s++)
805             ;
806           if (*s == 'h' || *s == 'H' || *input_line_pointer == '.')
807             {
808               --input_line_pointer;
809               integer_constant (0, expressionP);
810               break;
811             }
812         }
813       c = *input_line_pointer;
814       switch (c)
815         {
816         case 'o':
817         case 'O':
818         case 'q':
819         case 'Q':
820         case '8':
821         case '9':
822           if (NUMBERS_WITH_SUFFIX || flag_m68k_mri)
823             {
824               integer_constant (0, expressionP);
825               break;
826             }
827           /* Fall through.  */
828         default:
829         default_case:
830           if (c && strchr (FLT_CHARS, c))
831             {
832               input_line_pointer++;
833               floating_constant (expressionP);
834               expressionP->X_add_number = - TOLOWER (c);
835             }
836           else
837             {
838               /* The string was only zero.  */
839               expressionP->X_op = O_constant;
840               expressionP->X_add_number = 0;
841             }
842
843           break;
844
845         case 'x':
846         case 'X':
847           if (flag_m68k_mri)
848             goto default_case;
849           input_line_pointer++;
850           integer_constant (16, expressionP);
851           break;
852
853         case 'b':
854           if (LOCAL_LABELS_FB && ! (flag_m68k_mri || NUMBERS_WITH_SUFFIX))
855             {
856               /* This code used to check for '+' and '-' here, and, in
857                  some conditions, fall through to call
858                  integer_constant.  However, that didn't make sense,
859                  as integer_constant only accepts digits.  */
860               /* Some of our code elsewhere does permit digits greater
861                  than the expected base; for consistency, do the same
862                  here.  */
863               if (input_line_pointer[1] < '0'
864                   || input_line_pointer[1] > '9')
865                 {
866                   /* Parse this as a back reference to label 0.  */
867                   input_line_pointer--;
868                   integer_constant (10, expressionP);
869                   break;
870                 }
871               /* Otherwise, parse this as a binary number.  */
872             }
873           /* Fall through.  */
874         case 'B':
875           input_line_pointer++;
876           if (flag_m68k_mri || NUMBERS_WITH_SUFFIX)
877             goto default_case;
878           integer_constant (2, expressionP);
879           break;
880
881         case '0':
882         case '1':
883         case '2':
884         case '3':
885         case '4':
886         case '5':
887         case '6':
888         case '7':
889           integer_constant ((flag_m68k_mri || NUMBERS_WITH_SUFFIX)
890                             ? 0 : 8,
891                             expressionP);
892           break;
893
894         case 'f':
895           if (LOCAL_LABELS_FB)
896             {
897               /* If it says "0f" and it could possibly be a floating point
898                  number, make it one.  Otherwise, make it a local label,
899                  and try to deal with parsing the rest later.  */
900               if (!input_line_pointer[1]
901                   || (is_end_of_line[0xff & input_line_pointer[1]])
902                   || strchr (FLT_CHARS, 'f') == NULL)
903                 goto is_0f_label;
904               {
905                 char *cp = input_line_pointer + 1;
906                 int r = atof_generic (&cp, ".", EXP_CHARS,
907                                       &generic_floating_point_number);
908                 switch (r)
909                   {
910                   case 0:
911                   case ERROR_EXPONENT_OVERFLOW:
912                     if (*cp == 'f' || *cp == 'b')
913                       /* Looks like a difference expression.  */
914                       goto is_0f_label;
915                     else if (cp == input_line_pointer + 1)
916                       /* No characters has been accepted -- looks like
917                          end of operand.  */
918                       goto is_0f_label;
919                     else
920                       goto is_0f_float;
921                   default:
922                     as_fatal (_("expr.c(operand): bad atof_generic return val %d"),
923                               r);
924                   }
925               }
926
927               /* Okay, now we've sorted it out.  We resume at one of these
928                  two labels, depending on what we've decided we're probably
929                  looking at.  */
930             is_0f_label:
931               input_line_pointer--;
932               integer_constant (10, expressionP);
933               break;
934
935             is_0f_float:
936               /* Fall through.  */
937               ;
938             }
939
940         case 'd':
941         case 'D':
942           if (flag_m68k_mri || NUMBERS_WITH_SUFFIX)
943             {
944               integer_constant (0, expressionP);
945               break;
946             }
947           /* Fall through.  */
948         case 'F':
949         case 'r':
950         case 'e':
951         case 'E':
952         case 'g':
953         case 'G':
954           input_line_pointer++;
955           floating_constant (expressionP);
956           expressionP->X_add_number = - TOLOWER (c);
957           break;
958
959         case '$':
960           if (LOCAL_LABELS_DOLLAR)
961             {
962               integer_constant (10, expressionP);
963               break;
964             }
965           else
966             goto default_case;
967         }
968
969       break;
970
971     case '(':
972 #ifndef NEED_INDEX_OPERATOR
973     case '[':
974 #endif
975       /* Didn't begin with digit & not a name.  */
976       segment = expression (expressionP);
977       /* expression () will pass trailing whitespace.  */
978       if ((c == '(' && *input_line_pointer != ')')
979           || (c == '[' && *input_line_pointer != ']'))
980         as_bad (_("missing '%c'"), c == '(' ? ')' : ']');
981       else
982         input_line_pointer++;
983       SKIP_WHITESPACE ();
984       /* Here with input_line_pointer -> char after "(...)".  */
985       return segment;
986
987 #ifdef TC_M68K
988     case 'E':
989       if (! flag_m68k_mri || *input_line_pointer != '\'')
990         goto de_fault;
991       as_bad (_("EBCDIC constants are not supported"));
992       /* Fall through.  */
993     case 'A':
994       if (! flag_m68k_mri || *input_line_pointer != '\'')
995         goto de_fault;
996       ++input_line_pointer;
997       /* Fall through.  */
998 #endif
999     case '\'':
1000       if (! flag_m68k_mri)
1001         {
1002           /* Warning: to conform to other people's assemblers NO
1003              ESCAPEMENT is permitted for a single quote.  The next
1004              character, parity errors and all, is taken as the value
1005              of the operand.  VERY KINKY.  */
1006           expressionP->X_op = O_constant;
1007           expressionP->X_add_number = *input_line_pointer++;
1008           break;
1009         }
1010
1011       mri_char_constant (expressionP);
1012       break;
1013
1014 #ifdef TC_M68K
1015     case '"':
1016       /* Double quote is the bitwise not operator in MRI mode.  */
1017       if (! flag_m68k_mri)
1018         goto de_fault;
1019       /* Fall through.  */
1020 #endif
1021     case '~':
1022       /* '~' is permitted to start a label on the Delta.  */
1023       if (is_name_beginner (c))
1024         goto isname;
1025     case '!':
1026     case '-':
1027     case '+':
1028       {
1029         /* Do not accept ++e or --e as +(+e) or -(-e)
1030            Disabled, since the preprocessor removes whitespace.  */
1031         if (0 && (c == '-' || c == '+') && *input_line_pointer == c)
1032           goto target_op;
1033         
1034         operand (expressionP);
1035         if (expressionP->X_op == O_constant)
1036           {
1037             /* input_line_pointer -> char after operand.  */
1038             if (c == '-')
1039               {
1040                 expressionP->X_add_number = - expressionP->X_add_number;
1041                 /* Notice: '-' may overflow: no warning is given.
1042                    This is compatible with other people's
1043                    assemblers.  Sigh.  */
1044                 expressionP->X_unsigned = 0;
1045               }
1046             else if (c == '~' || c == '"')
1047               expressionP->X_add_number = ~ expressionP->X_add_number;
1048             else if (c == '!')
1049               expressionP->X_add_number = ! expressionP->X_add_number;
1050           }
1051         else if (expressionP->X_op == O_big
1052                  && expressionP->X_add_number <= 0
1053                  && c == '-'
1054                  && (generic_floating_point_number.sign == '+'
1055                      || generic_floating_point_number.sign == 'P'))
1056           {
1057             /* Negative flonum (eg, -1.000e0).  */
1058             if (generic_floating_point_number.sign == '+')
1059               generic_floating_point_number.sign = '-';
1060             else
1061               generic_floating_point_number.sign = 'N';
1062           }
1063         else if (expressionP->X_op == O_big
1064                  && expressionP->X_add_number > 0)
1065           {
1066             int i;
1067
1068             if (c == '~' || c == '-')
1069               {
1070                 for (i = 0; i < expressionP->X_add_number; ++i)
1071                   generic_bignum[i] = ~generic_bignum[i];
1072                 if (c == '-')
1073                   for (i = 0; i < expressionP->X_add_number; ++i)
1074                     {
1075                       generic_bignum[i] += 1;
1076                       if (generic_bignum[i])
1077                         break;
1078                     }
1079               }
1080             else if (c == '!')
1081               {
1082                 int nonzero = 0;
1083                 for (i = 0; i < expressionP->X_add_number; ++i)
1084                   {
1085                     if (generic_bignum[i])
1086                       nonzero = 1;
1087                     generic_bignum[i] = 0;
1088                   }
1089                 generic_bignum[0] = nonzero;
1090               }
1091           }
1092         else if (expressionP->X_op != O_illegal
1093                  && expressionP->X_op != O_absent)
1094           {
1095             if (c != '+')
1096               {
1097                 expressionP->X_add_symbol = make_expr_symbol (expressionP);
1098                 if (c == '-')
1099                   expressionP->X_op = O_uminus;
1100                 else if (c == '~' || c == '"')
1101                   expressionP->X_op = O_bit_not;
1102                 else
1103                   expressionP->X_op = O_logical_not;
1104                 expressionP->X_add_number = 0;
1105               }
1106           }
1107         else
1108           as_warn (_("Unary operator %c ignored because bad operand follows"),
1109                    c);
1110       }
1111       break;
1112
1113 #if defined (DOLLAR_DOT) || defined (TC_M68K)
1114     case '$':
1115       /* '$' is the program counter when in MRI mode, or when
1116          DOLLAR_DOT is defined.  */
1117 #ifndef DOLLAR_DOT
1118       if (! flag_m68k_mri)
1119         goto de_fault;
1120 #endif
1121       if (flag_m68k_mri && hex_p (*input_line_pointer))
1122         {
1123           /* In MRI mode, '$' is also used as the prefix for a
1124              hexadecimal constant.  */
1125           integer_constant (16, expressionP);
1126           break;
1127         }
1128
1129       if (is_part_of_name (*input_line_pointer))
1130         goto isname;
1131
1132       current_location (expressionP);
1133       break;
1134 #endif
1135
1136     case '.':
1137       if (!is_part_of_name (*input_line_pointer))
1138         {
1139           current_location (expressionP);
1140           break;
1141         }
1142       else if ((strncasecmp (input_line_pointer, "startof.", 8) == 0
1143                 && ! is_part_of_name (input_line_pointer[8]))
1144                || (strncasecmp (input_line_pointer, "sizeof.", 7) == 0
1145                    && ! is_part_of_name (input_line_pointer[7])))
1146         {
1147           int start;
1148
1149           start = (input_line_pointer[1] == 't'
1150                    || input_line_pointer[1] == 'T');
1151           input_line_pointer += start ? 8 : 7;
1152           SKIP_WHITESPACE ();
1153           if (*input_line_pointer != '(')
1154             as_bad (_("syntax error in .startof. or .sizeof."));
1155           else
1156             {
1157               char *buf;
1158
1159               ++input_line_pointer;
1160               SKIP_WHITESPACE ();
1161               name = input_line_pointer;
1162               c = get_symbol_end ();
1163
1164               buf = (char *) xmalloc (strlen (name) + 10);
1165               if (start)
1166                 sprintf (buf, ".startof.%s", name);
1167               else
1168                 sprintf (buf, ".sizeof.%s", name);
1169               symbolP = symbol_make (buf);
1170               free (buf);
1171
1172               expressionP->X_op = O_symbol;
1173               expressionP->X_add_symbol = symbolP;
1174               expressionP->X_add_number = 0;
1175
1176               *input_line_pointer = c;
1177               SKIP_WHITESPACE ();
1178               if (*input_line_pointer != ')')
1179                 as_bad (_("syntax error in .startof. or .sizeof."));
1180               else
1181                 ++input_line_pointer;
1182             }
1183           break;
1184         }
1185       else
1186         {
1187           goto isname;
1188         }
1189
1190     case ',':
1191     eol:
1192       /* Can't imagine any other kind of operand.  */
1193       expressionP->X_op = O_absent;
1194       input_line_pointer--;
1195       break;
1196
1197 #ifdef TC_M68K
1198     case '%':
1199       if (! flag_m68k_mri)
1200         goto de_fault;
1201       integer_constant (2, expressionP);
1202       break;
1203
1204     case '@':
1205       if (! flag_m68k_mri)
1206         goto de_fault;
1207       integer_constant (8, expressionP);
1208       break;
1209
1210     case ':':
1211       if (! flag_m68k_mri)
1212         goto de_fault;
1213
1214       /* In MRI mode, this is a floating point constant represented
1215          using hexadecimal digits.  */
1216
1217       ++input_line_pointer;
1218       integer_constant (16, expressionP);
1219       break;
1220
1221     case '*':
1222       if (! flag_m68k_mri || is_part_of_name (*input_line_pointer))
1223         goto de_fault;
1224
1225       current_location (expressionP);
1226       break;
1227 #endif
1228
1229     default:
1230 #ifdef TC_M68K
1231     de_fault:
1232 #endif
1233       if (is_name_beginner (c)) /* Here if did not begin with a digit.  */
1234         {
1235           /* Identifier begins here.
1236              This is kludged for speed, so code is repeated.  */
1237         isname:
1238           name = --input_line_pointer;
1239           c = get_symbol_end ();
1240
1241 #ifdef md_parse_name
1242           /* This is a hook for the backend to parse certain names
1243              specially in certain contexts.  If a name always has a
1244              specific value, it can often be handled by simply
1245              entering it in the symbol table.  */
1246           if (md_parse_name (name, expressionP, &c))
1247             {
1248               *input_line_pointer = c;
1249               break;
1250             }
1251 #endif
1252
1253 #ifdef TC_I960
1254           /* The MRI i960 assembler permits
1255                  lda sizeof code,g13
1256              FIXME: This should use md_parse_name.  */
1257           if (flag_mri
1258               && (strcasecmp (name, "sizeof") == 0
1259                   || strcasecmp (name, "startof") == 0))
1260             {
1261               int start;
1262               char *buf;
1263
1264               start = (name[1] == 't'
1265                        || name[1] == 'T');
1266
1267               *input_line_pointer = c;
1268               SKIP_WHITESPACE ();
1269
1270               name = input_line_pointer;
1271               c = get_symbol_end ();
1272
1273               buf = (char *) xmalloc (strlen (name) + 10);
1274               if (start)
1275                 sprintf (buf, ".startof.%s", name);
1276               else
1277                 sprintf (buf, ".sizeof.%s", name);
1278               symbolP = symbol_make (buf);
1279               free (buf);
1280
1281               expressionP->X_op = O_symbol;
1282               expressionP->X_add_symbol = symbolP;
1283               expressionP->X_add_number = 0;
1284
1285               *input_line_pointer = c;
1286               SKIP_WHITESPACE ();
1287
1288               break;
1289             }
1290 #endif
1291
1292           symbolP = symbol_find_or_make (name);
1293
1294           /* If we have an absolute symbol or a reg, then we know its
1295              value now.  */
1296           segment = S_GET_SEGMENT (symbolP);
1297           if (segment == absolute_section)
1298             {
1299               expressionP->X_op = O_constant;
1300               expressionP->X_add_number = S_GET_VALUE (symbolP);
1301             }
1302           else if (segment == reg_section)
1303             {
1304               expressionP->X_op = O_register;
1305               expressionP->X_add_number = S_GET_VALUE (symbolP);
1306             }
1307           else
1308             {
1309               expressionP->X_op = O_symbol;
1310               expressionP->X_add_symbol = symbolP;
1311               expressionP->X_add_number = 0;
1312             }
1313           *input_line_pointer = c;
1314         }
1315       else
1316         {
1317         target_op:
1318           /* Let the target try to parse it.  Success is indicated by changing
1319              the X_op field to something other than O_absent and pointing
1320              input_line_pointer past the expression.  If it can't parse the
1321              expression, X_op and input_line_pointer should be unchanged.  */
1322           expressionP->X_op = O_absent;
1323           --input_line_pointer;
1324           md_operand (expressionP);
1325           if (expressionP->X_op == O_absent)
1326             {
1327               ++input_line_pointer;
1328               as_bad (_("bad expression"));
1329               expressionP->X_op = O_constant;
1330               expressionP->X_add_number = 0;
1331             }
1332         }
1333       break;
1334     }
1335
1336   /* It is more 'efficient' to clean up the expressionS when they are
1337      created.  Doing it here saves lines of code.  */
1338   clean_up_expression (expressionP);
1339   SKIP_WHITESPACE ();           /* -> 1st char after operand.  */
1340   know (*input_line_pointer != ' ');
1341
1342   /* The PA port needs this information.  */
1343   if (expressionP->X_add_symbol)
1344     symbol_mark_used (expressionP->X_add_symbol);
1345
1346   switch (expressionP->X_op)
1347     {
1348     default:
1349       return absolute_section;
1350     case O_symbol:
1351       return S_GET_SEGMENT (expressionP->X_add_symbol);
1352     case O_register:
1353       return reg_section;
1354     }
1355 }
1356 \f
1357 /* Internal.  Simplify a struct expression for use by expr ().  */
1358
1359 /* In:  address of an expressionS.
1360         The X_op field of the expressionS may only take certain values.
1361         Elsewise we waste time special-case testing. Sigh. Ditto SEG_ABSENT.
1362
1363    Out: expressionS may have been modified:
1364         Unused fields zeroed to help expr ().  */
1365
1366 static void
1367 clean_up_expression (expressionS *expressionP)
1368 {
1369   switch (expressionP->X_op)
1370     {
1371     case O_illegal:
1372     case O_absent:
1373       expressionP->X_add_number = 0;
1374       /* Fall through.  */
1375     case O_big:
1376     case O_constant:
1377     case O_register:
1378       expressionP->X_add_symbol = NULL;
1379       /* Fall through.  */
1380     case O_symbol:
1381     case O_uminus:
1382     case O_bit_not:
1383       expressionP->X_op_symbol = NULL;
1384       break;
1385     default:
1386       break;
1387     }
1388 }
1389 \f
1390 /* Expression parser.  */
1391
1392 /* We allow an empty expression, and just assume (absolute,0) silently.
1393    Unary operators and parenthetical expressions are treated as operands.
1394    As usual, Q==quantity==operand, O==operator, X==expression mnemonics.
1395
1396    We used to do an aho/ullman shift-reduce parser, but the logic got so
1397    warped that I flushed it and wrote a recursive-descent parser instead.
1398    Now things are stable, would anybody like to write a fast parser?
1399    Most expressions are either register (which does not even reach here)
1400    or 1 symbol. Then "symbol+constant" and "symbol-symbol" are common.
1401    So I guess it doesn't really matter how inefficient more complex expressions
1402    are parsed.
1403
1404    After expr(RANK,resultP) input_line_pointer->operator of rank <= RANK.
1405    Also, we have consumed any leading or trailing spaces (operand does that)
1406    and done all intervening operators.
1407
1408    This returns the segment of the result, which will be
1409    absolute_section or the segment of a symbol.  */
1410
1411 #undef __
1412 #define __ O_illegal
1413
1414 /* Maps ASCII -> operators.  */
1415 static const operatorT op_encoding[256] = {
1416   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1417   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1418
1419   __, O_bit_or_not, __, __, __, O_modulus, O_bit_and, __,
1420   __, __, O_multiply, O_add, __, O_subtract, __, O_divide,
1421   __, __, __, __, __, __, __, __,
1422   __, __, __, __, O_lt, __, O_gt, __,
1423   __, __, __, __, __, __, __, __,
1424   __, __, __, __, __, __, __, __,
1425   __, __, __, __, __, __, __, __,
1426   __, __, __,
1427 #ifdef NEED_INDEX_OPERATOR
1428   O_index,
1429 #else
1430   __,
1431 #endif
1432   __, __, O_bit_exclusive_or, __,
1433   __, __, __, __, __, __, __, __,
1434   __, __, __, __, __, __, __, __,
1435   __, __, __, __, __, __, __, __,
1436   __, __, __, __, O_bit_inclusive_or, __, __, __,
1437
1438   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1439   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1440   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1441   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1442   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1443   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1444   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1445   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
1446 };
1447
1448 /* Rank Examples
1449    0    operand, (expression)
1450    1    ||
1451    2    &&
1452    3    == <> < <= >= >
1453    4    + -
1454    5    used for * / % in MRI mode
1455    6    & ^ ! |
1456    7    * / % << >>
1457    8    unary - unary ~
1458 */
1459 static operator_rankT op_rank[] = {
1460   0,    /* O_illegal */
1461   0,    /* O_absent */
1462   0,    /* O_constant */
1463   0,    /* O_symbol */
1464   0,    /* O_symbol_rva */
1465   0,    /* O_register */
1466   0,    /* O_big */
1467   9,    /* O_uminus */
1468   9,    /* O_bit_not */
1469   9,    /* O_logical_not */
1470   8,    /* O_multiply */
1471   8,    /* O_divide */
1472   8,    /* O_modulus */
1473   8,    /* O_left_shift */
1474   8,    /* O_right_shift */
1475   7,    /* O_bit_inclusive_or */
1476   7,    /* O_bit_or_not */
1477   7,    /* O_bit_exclusive_or */
1478   7,    /* O_bit_and */
1479   5,    /* O_add */
1480   5,    /* O_subtract */
1481   4,    /* O_eq */
1482   4,    /* O_ne */
1483   4,    /* O_lt */
1484   4,    /* O_le */
1485   4,    /* O_ge */
1486   4,    /* O_gt */
1487   3,    /* O_logical_and */
1488   2,    /* O_logical_or */
1489   1,    /* O_index */
1490   0,    /* O_md1 */
1491   0,    /* O_md2 */
1492   0,    /* O_md3 */
1493   0,    /* O_md4 */
1494   0,    /* O_md5 */
1495   0,    /* O_md6 */
1496   0,    /* O_md7 */
1497   0,    /* O_md8 */
1498   0,    /* O_md9 */
1499   0,    /* O_md10 */
1500   0,    /* O_md11 */
1501   0,    /* O_md12 */
1502   0,    /* O_md13 */
1503   0,    /* O_md14 */
1504   0,    /* O_md15 */
1505   0,    /* O_md16 */
1506 };
1507
1508 /* Unfortunately, in MRI mode for the m68k, multiplication and
1509    division have lower precedence than the bit wise operators.  This
1510    function sets the operator precedences correctly for the current
1511    mode.  Also, MRI uses a different bit_not operator, and this fixes
1512    that as well.  */
1513
1514 #define STANDARD_MUL_PRECEDENCE 8
1515 #define MRI_MUL_PRECEDENCE 6
1516
1517 void
1518 expr_set_precedence (void)
1519 {
1520   if (flag_m68k_mri)
1521     {
1522       op_rank[O_multiply] = MRI_MUL_PRECEDENCE;
1523       op_rank[O_divide] = MRI_MUL_PRECEDENCE;
1524       op_rank[O_modulus] = MRI_MUL_PRECEDENCE;
1525     }
1526   else
1527     {
1528       op_rank[O_multiply] = STANDARD_MUL_PRECEDENCE;
1529       op_rank[O_divide] = STANDARD_MUL_PRECEDENCE;
1530       op_rank[O_modulus] = STANDARD_MUL_PRECEDENCE;
1531     }
1532 }
1533
1534 /* Initialize the expression parser.  */
1535
1536 void
1537 expr_begin (void)
1538 {
1539   expr_set_precedence ();
1540
1541   /* Verify that X_op field is wide enough.  */
1542   {
1543     expressionS e;
1544     e.X_op = O_max;
1545     assert (e.X_op == O_max);
1546   }
1547 }
1548 \f
1549 /* Return the encoding for the operator at INPUT_LINE_POINTER, and
1550    sets NUM_CHARS to the number of characters in the operator.
1551    Does not advance INPUT_LINE_POINTER.  */
1552
1553 static inline operatorT
1554 operator (int *num_chars)
1555 {
1556   int c;
1557   operatorT ret;
1558
1559   c = *input_line_pointer & 0xff;
1560   *num_chars = 1;
1561
1562   if (is_end_of_line[c])
1563     return O_illegal;
1564
1565   switch (c)
1566     {
1567     default:
1568       return op_encoding[c];
1569
1570     case '+':
1571     case '-':
1572       /* Do not allow a++b and a--b to be a + (+b) and a - (-b)
1573          Disabled, since the preprocessor removes whitespace.  */
1574       if (1 || input_line_pointer[1] != c)
1575         return op_encoding[c];
1576       return O_illegal;
1577
1578     case '<':
1579       switch (input_line_pointer[1])
1580         {
1581         default:
1582           return op_encoding[c];
1583         case '<':
1584           ret = O_left_shift;
1585           break;
1586         case '>':
1587           ret = O_ne;
1588           break;
1589         case '=':
1590           ret = O_le;
1591           break;
1592         }
1593       *num_chars = 2;
1594       return ret;
1595
1596     case '=':
1597       if (input_line_pointer[1] != '=')
1598         return op_encoding[c];
1599
1600       *num_chars = 2;
1601       return O_eq;
1602
1603     case '>':
1604       switch (input_line_pointer[1])
1605         {
1606         default:
1607           return op_encoding[c];
1608         case '>':
1609           ret = O_right_shift;
1610           break;
1611         case '=':
1612           ret = O_ge;
1613           break;
1614         }
1615       *num_chars = 2;
1616       return ret;
1617
1618     case '!':
1619       /* We accept !! as equivalent to ^ for MRI compatibility.  */
1620       if (input_line_pointer[1] != '!')
1621         {
1622           if (flag_m68k_mri)
1623             return O_bit_inclusive_or;
1624           return op_encoding[c];
1625         }
1626       *num_chars = 2;
1627       return O_bit_exclusive_or;
1628
1629     case '|':
1630       if (input_line_pointer[1] != '|')
1631         return op_encoding[c];
1632
1633       *num_chars = 2;
1634       return O_logical_or;
1635
1636     case '&':
1637       if (input_line_pointer[1] != '&')
1638         return op_encoding[c];
1639
1640       *num_chars = 2;
1641       return O_logical_and;
1642     }
1643
1644   /* NOTREACHED  */
1645 }
1646
1647 /* Parse an expression.  */
1648
1649 segT
1650 expr (int rankarg,              /* Larger # is higher rank.  */
1651       expressionS *resultP      /* Deliver result here.  */)
1652 {
1653   operator_rankT rank = (operator_rankT) rankarg;
1654   segT retval;
1655   expressionS right;
1656   operatorT op_left;
1657   operatorT op_right;
1658   int op_chars;
1659
1660   know (rank >= 0);
1661
1662   /* Save the value of dot for the fixup code.  */
1663   if (rank == 0)
1664     dot_value = frag_now_fix ();
1665
1666   retval = operand (resultP);
1667
1668   /* operand () gobbles spaces.  */
1669   know (*input_line_pointer != ' ');
1670
1671   op_left = operator (&op_chars);
1672   while (op_left != O_illegal && op_rank[(int) op_left] > rank)
1673     {
1674       segT rightseg;
1675
1676       input_line_pointer += op_chars;   /* -> after operator.  */
1677
1678       rightseg = expr (op_rank[(int) op_left], &right);
1679       if (right.X_op == O_absent)
1680         {
1681           as_warn (_("missing operand; zero assumed"));
1682           right.X_op = O_constant;
1683           right.X_add_number = 0;
1684           right.X_add_symbol = NULL;
1685           right.X_op_symbol = NULL;
1686         }
1687
1688       know (*input_line_pointer != ' ');
1689
1690       if (op_left == O_index)
1691         {
1692           if (*input_line_pointer != ']')
1693             as_bad ("missing right bracket");
1694           else
1695             {
1696               ++input_line_pointer;
1697               SKIP_WHITESPACE ();
1698             }
1699         }
1700
1701       op_right = operator (&op_chars);
1702
1703       know (op_right == O_illegal
1704             || op_rank[(int) op_right] <= op_rank[(int) op_left]);
1705       know ((int) op_left >= (int) O_multiply
1706             && (int) op_left <= (int) O_index);
1707
1708       /* input_line_pointer->after right-hand quantity.  */
1709       /* left-hand quantity in resultP.  */
1710       /* right-hand quantity in right.  */
1711       /* operator in op_left.  */
1712
1713       if (resultP->X_op == O_big)
1714         {
1715           if (resultP->X_add_number > 0)
1716             as_warn (_("left operand is a bignum; integer 0 assumed"));
1717           else
1718             as_warn (_("left operand is a float; integer 0 assumed"));
1719           resultP->X_op = O_constant;
1720           resultP->X_add_number = 0;
1721           resultP->X_add_symbol = NULL;
1722           resultP->X_op_symbol = NULL;
1723         }
1724       if (right.X_op == O_big)
1725         {
1726           if (right.X_add_number > 0)
1727             as_warn (_("right operand is a bignum; integer 0 assumed"));
1728           else
1729             as_warn (_("right operand is a float; integer 0 assumed"));
1730           right.X_op = O_constant;
1731           right.X_add_number = 0;
1732           right.X_add_symbol = NULL;
1733           right.X_op_symbol = NULL;
1734         }
1735
1736       /* Optimize common cases.  */
1737 #ifdef md_optimize_expr
1738       if (md_optimize_expr (resultP, op_left, &right))
1739         {
1740           /* Skip.  */
1741           ;
1742         }
1743       else
1744 #endif
1745       if (op_left == O_add && right.X_op == O_constant)
1746         {
1747           /* X + constant.  */
1748           resultP->X_add_number += right.X_add_number;
1749         }
1750       /* This case comes up in PIC code.  */
1751       else if (op_left == O_subtract
1752                && right.X_op == O_symbol
1753                && resultP->X_op == O_symbol
1754                && (symbol_get_frag (right.X_add_symbol)
1755                    == symbol_get_frag (resultP->X_add_symbol))
1756                && (SEG_NORMAL (rightseg)
1757                    || right.X_add_symbol == resultP->X_add_symbol))
1758         {
1759           resultP->X_add_number -= right.X_add_number;
1760           resultP->X_add_number += (S_GET_VALUE (resultP->X_add_symbol)
1761                                     - S_GET_VALUE (right.X_add_symbol));
1762           resultP->X_op = O_constant;
1763           resultP->X_add_symbol = 0;
1764         }
1765       else if (op_left == O_subtract && right.X_op == O_constant)
1766         {
1767           /* X - constant.  */
1768           resultP->X_add_number -= right.X_add_number;
1769         }
1770       else if (op_left == O_add && resultP->X_op == O_constant)
1771         {
1772           /* Constant + X.  */
1773           resultP->X_op = right.X_op;
1774           resultP->X_add_symbol = right.X_add_symbol;
1775           resultP->X_op_symbol = right.X_op_symbol;
1776           resultP->X_add_number += right.X_add_number;
1777           retval = rightseg;
1778         }
1779       else if (resultP->X_op == O_constant && right.X_op == O_constant)
1780         {
1781           /* Constant OP constant.  */
1782           offsetT v = right.X_add_number;
1783           if (v == 0 && (op_left == O_divide || op_left == O_modulus))
1784             {
1785               as_warn (_("division by zero"));
1786               v = 1;
1787             }
1788           switch (op_left)
1789             {
1790             default:                    abort ();
1791             case O_multiply:            resultP->X_add_number *= v; break;
1792             case O_divide:              resultP->X_add_number /= v; break;
1793             case O_modulus:             resultP->X_add_number %= v; break;
1794             case O_left_shift:          resultP->X_add_number <<= v; break;
1795             case O_right_shift:
1796               /* We always use unsigned shifts, to avoid relying on
1797                  characteristics of the compiler used to compile gas.  */
1798               resultP->X_add_number =
1799                 (offsetT) ((valueT) resultP->X_add_number >> (valueT) v);
1800               break;
1801             case O_bit_inclusive_or:    resultP->X_add_number |= v; break;
1802             case O_bit_or_not:          resultP->X_add_number |= ~v; break;
1803             case O_bit_exclusive_or:    resultP->X_add_number ^= v; break;
1804             case O_bit_and:             resultP->X_add_number &= v; break;
1805             case O_add:                 resultP->X_add_number += v; break;
1806             case O_subtract:            resultP->X_add_number -= v; break;
1807             case O_eq:
1808               resultP->X_add_number =
1809                 resultP->X_add_number == v ? ~ (offsetT) 0 : 0;
1810               break;
1811             case O_ne:
1812               resultP->X_add_number =
1813                 resultP->X_add_number != v ? ~ (offsetT) 0 : 0;
1814               break;
1815             case O_lt:
1816               resultP->X_add_number =
1817                 resultP->X_add_number <  v ? ~ (offsetT) 0 : 0;
1818               break;
1819             case O_le:
1820               resultP->X_add_number =
1821                 resultP->X_add_number <= v ? ~ (offsetT) 0 : 0;
1822               break;
1823             case O_ge:
1824               resultP->X_add_number =
1825                 resultP->X_add_number >= v ? ~ (offsetT) 0 : 0;
1826               break;
1827             case O_gt:
1828               resultP->X_add_number =
1829                 resultP->X_add_number >  v ? ~ (offsetT) 0 : 0;
1830               break;
1831             case O_logical_and:
1832               resultP->X_add_number = resultP->X_add_number && v;
1833               break;
1834             case O_logical_or:
1835               resultP->X_add_number = resultP->X_add_number || v;
1836               break;
1837             }
1838         }
1839       else if (resultP->X_op == O_symbol
1840                && right.X_op == O_symbol
1841                && (op_left == O_add
1842                    || op_left == O_subtract
1843                    || (resultP->X_add_number == 0
1844                        && right.X_add_number == 0)))
1845         {
1846           /* Symbol OP symbol.  */
1847           resultP->X_op = op_left;
1848           resultP->X_op_symbol = right.X_add_symbol;
1849           if (op_left == O_add)
1850             resultP->X_add_number += right.X_add_number;
1851           else if (op_left == O_subtract)
1852             {
1853               resultP->X_add_number -= right.X_add_number;
1854               if (retval == rightseg && SEG_NORMAL (retval))
1855                 {
1856                   retval = absolute_section;
1857                   rightseg = absolute_section;
1858                 }
1859             }
1860         }
1861       else
1862         {
1863           /* The general case.  */
1864           resultP->X_add_symbol = make_expr_symbol (resultP);
1865           resultP->X_op_symbol = make_expr_symbol (&right);
1866           resultP->X_op = op_left;
1867           resultP->X_add_number = 0;
1868           resultP->X_unsigned = 1;
1869         }
1870
1871       if (retval != rightseg)
1872         {
1873           if (! SEG_NORMAL (retval))
1874             {
1875               if (retval != undefined_section || SEG_NORMAL (rightseg))
1876                 retval = rightseg;
1877             }
1878           else if (SEG_NORMAL (rightseg)
1879 #ifdef DIFF_EXPR_OK
1880                    && op_left != O_subtract
1881 #endif
1882                    )
1883             as_bad (_("operation combines symbols in different segments"));
1884         }
1885
1886       op_left = op_right;
1887     }                           /* While next operator is >= this rank.  */
1888
1889   /* The PA port needs this information.  */
1890   if (resultP->X_add_symbol)
1891     symbol_mark_used (resultP->X_add_symbol);
1892
1893   return resultP->X_op == O_constant ? absolute_section : retval;
1894 }
1895 \f
1896 /* This lives here because it belongs equally in expr.c & read.c.
1897    expr.c is just a branch office read.c anyway, and putting it
1898    here lessens the crowd at read.c.
1899
1900    Assume input_line_pointer is at start of symbol name.
1901    Advance input_line_pointer past symbol name.
1902    Turn that character into a '\0', returning its former value.
1903    This allows a string compare (RMS wants symbol names to be strings)
1904    of the symbol name.
1905    There will always be a char following symbol name, because all good
1906    lines end in end-of-line.  */
1907
1908 char
1909 get_symbol_end (void)
1910 {
1911   char c;
1912
1913   /* We accept \001 in a name in case this is being called with a
1914      constructed string.  */
1915   if (is_name_beginner (c = *input_line_pointer++) || c == '\001')
1916     {
1917       while (is_part_of_name (c = *input_line_pointer++)
1918              || c == '\001')
1919         ;
1920       if (is_name_ender (c))
1921         c = *input_line_pointer++;
1922     }
1923   *--input_line_pointer = 0;
1924   return (c);
1925 }
1926
1927 unsigned int
1928 get_single_number (void)
1929 {
1930   expressionS exp;
1931   operand (&exp);
1932   return exp.X_add_number;
1933 }