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