* new parsing option
[external/binutils.git] / gas / expr.c
1 /* expr.c -operands, expressions-
2    Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
3    Free Software Foundation, Inc.
4
5    This file is part of GAS, the GNU Assembler.
6
7    GAS is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2, or (at your option)
10    any later version.
11
12    GAS is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GAS; see the file COPYING.  If not, write to the Free
19    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20    02111-1307, USA. */
21
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
29 #include <ctype.h>
30 #include <string.h>
31 #define min(a, b)       ((a) < (b) ? (a) : (b))
32
33 #include "as.h"
34 #include "obstack.h"
35
36 static void floating_constant PARAMS ((expressionS * expressionP));
37 static valueT generic_bignum_to_int32 PARAMS ((void));
38 #ifdef BFD64
39 static valueT generic_bignum_to_int64 PARAMS ((void));
40 #endif
41 static void integer_constant PARAMS ((int radix, expressionS * expressionP));
42 static void mri_char_constant PARAMS ((expressionS *));
43 static void current_location PARAMS ((expressionS *));
44 static void clean_up_expression PARAMS ((expressionS * expressionP));
45 static segT operand PARAMS ((expressionS *));
46 static operatorT operator PARAMS ((void));
47
48 extern const char EXP_CHARS[], FLT_CHARS[];
49
50 /* We keep a mapping of expression symbols to file positions, so that
51    we can provide better error messages.  */
52
53 struct expr_symbol_line
54 {
55   struct expr_symbol_line *next;
56   symbolS *sym;
57   char *file;
58   unsigned int line;
59 };
60
61 static struct expr_symbol_line *expr_symbol_lines;
62 \f
63 /* Build a dummy symbol to hold a complex expression.  This is how we
64    build expressions up out of other expressions.  The symbol is put
65    into the fake section expr_section.  */
66
67 symbolS *
68 make_expr_symbol (expressionP)
69      expressionS *expressionP;
70 {
71   expressionS zero;
72   const char *fake;
73   symbolS *symbolP;
74   struct expr_symbol_line *n;
75
76   if (expressionP->X_op == O_symbol
77       && expressionP->X_add_number == 0)
78     return expressionP->X_add_symbol;
79
80   if (expressionP->X_op == O_big)
81     {
82       /* This won't work, because the actual value is stored in
83          generic_floating_point_number or generic_bignum, and we are
84          going to lose it if we haven't already.  */
85       if (expressionP->X_add_number > 0)
86         as_bad (_("bignum invalid; zero assumed"));
87       else
88         as_bad (_("floating point number invalid; zero assumed"));
89       zero.X_op = O_constant;
90       zero.X_add_number = 0;
91       zero.X_unsigned = 0;
92       clean_up_expression (&zero);
93       expressionP = &zero;
94     }
95
96   fake = FAKE_LABEL_NAME;
97
98   /* Putting constant symbols in absolute_section rather than
99      expr_section is convenient for the old a.out code, for which
100      S_GET_SEGMENT does not always retrieve the value put in by
101      S_SET_SEGMENT.  */
102   symbolP = symbol_create (fake,
103                            (expressionP->X_op == O_constant
104                             ? absolute_section
105                             : expr_section),
106                            0, &zero_address_frag);
107   symbol_set_value_expression (symbolP, expressionP);
108
109   if (expressionP->X_op == O_constant)
110     resolve_symbol_value (symbolP, 1);
111
112   n = (struct expr_symbol_line *) xmalloc (sizeof *n);
113   n->sym = symbolP;
114   as_where (&n->file, &n->line);
115   n->next = expr_symbol_lines;
116   expr_symbol_lines = n;
117
118   return symbolP;
119 }
120
121 /* Return the file and line number for an expr symbol.  Return
122    non-zero if something was found, 0 if no information is known for
123    the symbol.  */
124
125 int
126 expr_symbol_where (sym, pfile, pline)
127      symbolS *sym;
128      char **pfile;
129      unsigned int *pline;
130 {
131   register struct expr_symbol_line *l;
132
133   for (l = expr_symbol_lines; l != NULL; l = l->next)
134     {
135       if (l->sym == sym)
136         {
137           *pfile = l->file;
138           *pline = l->line;
139           return 1;
140         }
141     }
142
143   return 0;
144 }
145 \f
146 /* Utilities for building expressions.
147    Since complex expressions are recorded as symbols for use in other
148    expressions these return a symbolS * and not an expressionS *.
149    These explicitly do not take an "add_number" argument.  */
150 /* ??? For completeness' sake one might want expr_build_symbol.
151    It would just return its argument.  */
152
153 /* Build an expression for an unsigned constant.
154    The corresponding one for signed constants is missing because
155    there's currently no need for it.  One could add an unsigned_p flag
156    but that seems more clumsy.  */
157
158 symbolS *
159 expr_build_uconstant (value)
160      offsetT value;
161 {
162   expressionS e;
163
164   e.X_op = O_constant;
165   e.X_add_number = value;
166   e.X_unsigned = 1;
167   return make_expr_symbol (&e);
168 }
169
170 /* Build an expression for OP s1.  */
171
172 symbolS *
173 expr_build_unary (op, s1)
174      operatorT op;
175      symbolS *s1;
176 {
177   expressionS e;
178
179   e.X_op = op;
180   e.X_add_symbol = s1;
181   e.X_add_number = 0;
182   return make_expr_symbol (&e);
183 }
184
185 /* Build an expression for s1 OP s2.  */
186
187 symbolS *
188 expr_build_binary (op, s1, s2)
189      operatorT op;
190      symbolS *s1;
191      symbolS *s2;
192 {
193   expressionS e;
194
195   e.X_op = op;
196   e.X_add_symbol = s1;
197   e.X_op_symbol = s2;
198   e.X_add_number = 0;
199   return make_expr_symbol (&e);
200 }
201
202 /* Build an expression for the current location ('.').  */
203
204 symbolS *
205 expr_build_dot ()
206 {
207   expressionS e;
208
209   current_location (&e);
210   return make_expr_symbol (&e);
211 }
212 \f
213 /*
214  * Build any floating-point literal here.
215  * Also build any bignum literal here.
216  */
217
218 /* Seems atof_machine can backscan through generic_bignum and hit whatever
219    happens to be loaded before it in memory.  And its way too complicated
220    for me to fix right.  Thus a hack.  JF:  Just make generic_bignum bigger,
221    and never write into the early words, thus they'll always be zero.
222    I hate Dean's floating-point code.  Bleh.  */
223 LITTLENUM_TYPE generic_bignum[SIZE_OF_LARGE_NUMBER + 6];
224 FLONUM_TYPE generic_floating_point_number =
225 {
226   &generic_bignum[6],           /* low (JF: Was 0) */
227   &generic_bignum[SIZE_OF_LARGE_NUMBER + 6 - 1], /* high JF: (added +6) */
228   0,                            /* leader */
229   0,                            /* exponent */
230   0                             /* sign */
231 };
232 /* If nonzero, we've been asked to assemble nan, +inf or -inf */
233 int generic_floating_point_magic;
234 \f
235 static void
236 floating_constant (expressionP)
237      expressionS *expressionP;
238 {
239   /* input_line_pointer->*/
240   /* floating-point constant. */
241   int error_code;
242
243   error_code = atof_generic (&input_line_pointer, ".", EXP_CHARS,
244                              &generic_floating_point_number);
245
246   if (error_code)
247     {
248       if (error_code == ERROR_EXPONENT_OVERFLOW)
249         {
250           as_bad (_("bad floating-point constant: exponent overflow, probably assembling junk"));
251         }
252       else
253         {
254           as_bad (_("bad floating-point constant: unknown error code=%d."), error_code);
255         }
256     }
257   expressionP->X_op = O_big;
258   /* input_line_pointer->just after constant, */
259   /* which may point to whitespace. */
260   expressionP->X_add_number = -1;
261 }
262
263 static valueT 
264 generic_bignum_to_int32 () 
265 {
266   valueT number =
267            ((generic_bignum[1] & LITTLENUM_MASK) << LITTLENUM_NUMBER_OF_BITS)
268            | (generic_bignum[0] & LITTLENUM_MASK);
269   number &= 0xffffffff;
270   return number;
271 }
272
273 #ifdef BFD64
274 static valueT 
275 generic_bignum_to_int64 () 
276 {
277   valueT number = 
278            ((((((((valueT) generic_bignum[3] & LITTLENUM_MASK)
279                  << LITTLENUM_NUMBER_OF_BITS)
280                 | ((valueT) generic_bignum[2] & LITTLENUM_MASK))
281                << LITTLENUM_NUMBER_OF_BITS)
282               | ((valueT) generic_bignum[1] & LITTLENUM_MASK))
283              << LITTLENUM_NUMBER_OF_BITS)
284             | ((valueT) generic_bignum[0] & LITTLENUM_MASK));
285   return number;
286 }
287 #endif
288
289 static void
290 integer_constant (radix, expressionP)
291      int radix;
292      expressionS *expressionP;
293 {
294   char *start;          /* start of number. */
295   char *suffix = NULL;
296   char c;
297   valueT number;        /* offset or (absolute) value */
298   short int digit;      /* value of next digit in current radix */
299   short int maxdig = 0;/* highest permitted digit value. */
300   int too_many_digits = 0;      /* if we see >= this number of */
301   char *name;           /* points to name of symbol */
302   symbolS *symbolP;     /* points to symbol */
303
304   int small;                    /* true if fits in 32 bits. */
305
306   /* May be bignum, or may fit in 32 bits. */
307   /* Most numbers fit into 32 bits, and we want this case to be fast.
308      so we pretend it will fit into 32 bits.  If, after making up a 32
309      bit number, we realise that we have scanned more digits than
310      comfortably fit into 32 bits, we re-scan the digits coding them
311      into a bignum.  For decimal and octal numbers we are
312      conservative: Some numbers may be assumed bignums when in fact
313      they do fit into 32 bits.  Numbers of any radix can have excess
314      leading zeros: We strive to recognise this and cast them back
315      into 32 bits.  We must check that the bignum really is more than
316      32 bits, and change it back to a 32-bit number if it fits.  The
317      number we are looking for is expected to be positive, but if it
318      fits into 32 bits as an unsigned number, we let it be a 32-bit
319      number.  The cavalier approach is for speed in ordinary cases. */
320   /* This has been extended for 64 bits.  We blindly assume that if
321      you're compiling in 64-bit mode, the target is a 64-bit machine.
322      This should be cleaned up.  */
323
324 #ifdef BFD64
325 #define valuesize 64
326 #else /* includes non-bfd case, mostly */
327 #define valuesize 32
328 #endif
329
330   if ((NUMBERS_WITH_SUFFIX || flag_m68k_mri) && radix == 0)
331     {
332       int flt = 0;
333
334       /* In MRI mode, the number may have a suffix indicating the
335          radix.  For that matter, it might actually be a floating
336          point constant.  */
337       for (suffix = input_line_pointer;
338            isalnum ((unsigned char) *suffix);
339            suffix++)
340         {
341           if (*suffix == 'e' || *suffix == 'E')
342             flt = 1;
343         }
344
345       if (suffix == input_line_pointer)
346         {
347           radix = 10;
348           suffix = NULL;
349         }
350       else
351         {
352           c = *--suffix;
353           if (islower ((unsigned char) c))
354             c = toupper (c);
355           if (c == 'B')
356             radix = 2;
357           else if (c == 'D')
358             radix = 10;
359           else if (c == 'O' || c == 'Q')
360             radix = 8;
361           else if (c == 'H')
362             radix = 16;
363           else if (suffix[1] == '.' || c == 'E' || flt)
364             {
365               floating_constant (expressionP);
366               return;
367             }
368           else
369             {
370               radix = 10;
371               suffix = NULL;
372             }
373         }
374     }
375
376   switch (radix)
377     {
378     case 2:
379       maxdig = 2;
380       too_many_digits = valuesize + 1;
381       break;
382     case 8:
383       maxdig = radix = 8;
384       too_many_digits = (valuesize + 2) / 3 + 1;
385       break;
386     case 16:
387       maxdig = radix = 16;
388       too_many_digits = (valuesize + 3) / 4 + 1;
389       break;
390     case 10:
391       maxdig = radix = 10;
392       too_many_digits = (valuesize + 11) / 4; /* very rough */
393     }
394 #undef valuesize
395   start = input_line_pointer;
396   c = *input_line_pointer++;
397   for (number = 0;
398        (digit = hex_value (c)) < maxdig;
399        c = *input_line_pointer++)
400     {
401       number = number * radix + digit;
402     }
403   /* c contains character after number. */
404   /* input_line_pointer->char after c. */
405   small = (input_line_pointer - start - 1) < too_many_digits;
406
407   if (radix == 16 && c == '_') 
408     {
409       /* This is literal of the form 0x333_0_12345678_1.
410          This example is equivalent to 0x00000333000000001234567800000001.  */
411
412       int num_little_digits = 0;
413       int i;
414       input_line_pointer = start;       /*->1st digit. */
415
416       know (LITTLENUM_NUMBER_OF_BITS == 16);
417
418       for (c = '_'; c == '_'; num_little_digits+=2)
419         {
420
421           /* Convert one 64-bit word. */
422           int ndigit = 0; 
423           number = 0;
424           for (c = *input_line_pointer++;
425                (digit = hex_value (c)) < maxdig;
426                c = *(input_line_pointer++))
427             {
428               number = number * radix + digit;
429               ndigit++;
430             }
431
432           /* Check for 8 digit per word max.  */
433           if (ndigit > 8) 
434             as_bad (_("A bignum with underscores may not have more than 8 hex digits in any word."));
435
436           /* Add this chunk to the bignum.  Shift things down 2 little digits.*/
437           know (LITTLENUM_NUMBER_OF_BITS == 16);
438           for (i = min (num_little_digits + 1, SIZE_OF_LARGE_NUMBER - 1); i >= 2; i--)
439             generic_bignum[i] = generic_bignum[i-2];
440
441           /* Add the new digits as the least significant new ones. */
442           generic_bignum[0] = number & 0xffffffff;
443           generic_bignum[1] = number >> 16;
444         }
445
446       /* Again, c is char after number, input_line_pointer->after c. */
447
448       if (num_little_digits > SIZE_OF_LARGE_NUMBER - 1)
449         num_little_digits = SIZE_OF_LARGE_NUMBER - 1;
450
451       assert (num_little_digits >= 4);
452
453       if (num_little_digits != 8)
454         as_bad (_("A bignum with underscores must have exactly 4 words."));
455
456       /* We might have some leading zeros.  These can be trimmed to give
457        * us a change to fit this constant into a small number.
458        */
459       while (generic_bignum[num_little_digits-1] == 0 && num_little_digits > 1)
460         num_little_digits--;
461         
462       if (num_little_digits <= 2)
463         {
464           /* will fit into 32 bits. */
465           number = generic_bignum_to_int32 ();
466           small = 1;
467         }
468 #ifdef BFD64
469       else if (num_little_digits <= 4)
470         {
471           /* Will fit into 64 bits.  */
472           number = generic_bignum_to_int64 ();
473           small = 1;
474         }
475 #endif
476       else
477         {
478           small = 0;
479           number = num_little_digits; /* number of littlenums in the bignum. */
480         }
481     }
482   else if (!small)
483     {
484       /*
485        * we saw a lot of digits. manufacture a bignum the hard way.
486        */
487       LITTLENUM_TYPE *leader;   /*->high order littlenum of the bignum. */
488       LITTLENUM_TYPE *pointer;  /*->littlenum we are frobbing now. */
489       long carry;
490
491       leader = generic_bignum;
492       generic_bignum[0] = 0;
493       generic_bignum[1] = 0;
494       generic_bignum[2] = 0;
495       generic_bignum[3] = 0;
496       input_line_pointer = start;       /*->1st digit. */
497       c = *input_line_pointer++;
498       for (;
499            (carry = hex_value (c)) < maxdig;
500            c = *input_line_pointer++)
501         {
502           for (pointer = generic_bignum;
503                pointer <= leader;
504                pointer++)
505             {
506               long work;
507
508               work = carry + radix * *pointer;
509               *pointer = work & LITTLENUM_MASK;
510               carry = work >> LITTLENUM_NUMBER_OF_BITS;
511             }
512           if (carry)
513             {
514               if (leader < generic_bignum + SIZE_OF_LARGE_NUMBER - 1)
515                 {
516                   /* room to grow a longer bignum. */
517                   *++leader = carry;
518                 }
519             }
520         }
521       /* again, c is char after number, */
522       /* input_line_pointer->after c. */
523       know (LITTLENUM_NUMBER_OF_BITS == 16);
524       if (leader < generic_bignum + 2)
525         {
526           /* will fit into 32 bits. */
527           number = generic_bignum_to_int32 ();
528           small = 1;
529         }
530 #ifdef BFD64
531       else if (leader < generic_bignum + 4)
532         {
533           /* Will fit into 64 bits.  */
534           number = generic_bignum_to_int64 ();
535           small = 1;
536         }
537 #endif
538       else
539         {
540           number = leader - generic_bignum + 1; /* number of littlenums in the bignum. */
541         }
542     }
543
544   if ((NUMBERS_WITH_SUFFIX || flag_m68k_mri)
545       && suffix != NULL
546       && input_line_pointer - 1 == suffix)
547     c = *input_line_pointer++;
548
549   if (small)
550     {
551       /*
552        * here with number, in correct radix. c is the next char.
553        * note that unlike un*x, we allow "011f" "0x9f" to
554        * both mean the same as the (conventional) "9f". this is simply easier
555        * than checking for strict canonical form. syntax sux!
556        */
557
558       if (LOCAL_LABELS_FB && c == 'b')
559         {
560           /*
561            * backward ref to local label.
562            * because it is backward, expect it to be defined.
563            */
564           /* Construct a local label.  */
565           name = fb_label_name ((int) number, 0);
566
567           /* seen before, or symbol is defined: ok */
568           symbolP = symbol_find (name);
569           if ((symbolP != NULL) && (S_IS_DEFINED (symbolP)))
570             {
571               /* local labels are never absolute. don't waste time
572                  checking absoluteness. */
573               know (SEG_NORMAL (S_GET_SEGMENT (symbolP)));
574
575               expressionP->X_op = O_symbol;
576               expressionP->X_add_symbol = symbolP;
577             }
578           else
579             {
580               /* either not seen or not defined. */
581               /* @@ Should print out the original string instead of
582                  the parsed number.  */
583               as_bad (_("backw. ref to unknown label \"%d:\", 0 assumed."),
584                       (int) number);
585               expressionP->X_op = O_constant;
586             }
587
588           expressionP->X_add_number = 0;
589         }                       /* case 'b' */
590       else if (LOCAL_LABELS_FB && c == 'f')
591         {
592           /*
593            * forward reference. expect symbol to be undefined or
594            * unknown. undefined: seen it before. unknown: never seen
595            * it before.
596            * construct a local label name, then an undefined symbol.
597            * don't create a xseg frag for it: caller may do that.
598            * just return it as never seen before.
599            */
600           name = fb_label_name ((int) number, 1);
601           symbolP = symbol_find_or_make (name);
602           /* we have no need to check symbol properties. */
603 #ifndef many_segments
604           /* since "know" puts its arg into a "string", we
605              can't have newlines in the argument.  */
606           know (S_GET_SEGMENT (symbolP) == undefined_section || S_GET_SEGMENT (symbolP) == text_section || S_GET_SEGMENT (symbolP) == data_section);
607 #endif
608           expressionP->X_op = O_symbol;
609           expressionP->X_add_symbol = symbolP;
610           expressionP->X_add_number = 0;
611         }                       /* case 'f' */
612       else if (LOCAL_LABELS_DOLLAR && c == '$')
613         {
614           /* If the dollar label is *currently* defined, then this is just
615              another reference to it.  If it is not *currently* defined,
616              then this is a fresh instantiation of that number, so create
617              it.  */
618
619           if (dollar_label_defined ((long) number))
620             {
621               name = dollar_label_name ((long) number, 0);
622               symbolP = symbol_find (name);
623               know (symbolP != NULL);
624             }
625           else
626             {
627               name = dollar_label_name ((long) number, 1);
628               symbolP = symbol_find_or_make (name);
629             }
630
631           expressionP->X_op = O_symbol;
632           expressionP->X_add_symbol = symbolP;
633           expressionP->X_add_number = 0;
634         }                       /* case '$' */
635       else
636         {
637           expressionP->X_op = O_constant;
638 #ifdef TARGET_WORD_SIZE
639           /* Sign extend NUMBER.  */
640           number |= (-(number >> (TARGET_WORD_SIZE - 1))) << (TARGET_WORD_SIZE - 1);
641 #endif
642           expressionP->X_add_number = number;
643           input_line_pointer--; /* restore following character. */
644         }                       /* really just a number */
645     }
646   else
647     {
648       /* not a small number */
649       expressionP->X_op = O_big;
650       expressionP->X_add_number = number;       /* number of littlenums */
651       input_line_pointer--;     /*->char following number. */
652     }
653 }
654
655 /* Parse an MRI multi character constant.  */
656
657 static void
658 mri_char_constant (expressionP)
659      expressionS *expressionP;
660 {
661   int i;
662
663   if (*input_line_pointer == '\''
664       && input_line_pointer[1] != '\'')
665     {
666       expressionP->X_op = O_constant;
667       expressionP->X_add_number = 0;
668       return;
669     }
670
671   /* In order to get the correct byte ordering, we must build the
672      number in reverse.  */
673   for (i = SIZE_OF_LARGE_NUMBER - 1; i >= 0; i--)
674     {
675       int j;
676
677       generic_bignum[i] = 0;
678       for (j = 0; j < CHARS_PER_LITTLENUM; j++)
679         {
680           if (*input_line_pointer == '\'')
681             {
682               if (input_line_pointer[1] != '\'')
683                 break;
684               ++input_line_pointer;
685             }
686           generic_bignum[i] <<= 8;
687           generic_bignum[i] += *input_line_pointer;
688           ++input_line_pointer;
689         }
690
691       if (i < SIZE_OF_LARGE_NUMBER - 1)
692         {
693           /* If there is more than one littlenum, left justify the
694              last one to make it match the earlier ones.  If there is
695              only one, we can just use the value directly.  */
696           for (; j < CHARS_PER_LITTLENUM; j++)
697             generic_bignum[i] <<= 8;
698         }
699
700       if (*input_line_pointer == '\''
701           && input_line_pointer[1] != '\'')
702         break;
703     }
704
705   if (i < 0)
706     {
707       as_bad (_("Character constant too large"));
708       i = 0;
709     }
710
711   if (i > 0)
712     {
713       int c;
714       int j;
715
716       c = SIZE_OF_LARGE_NUMBER - i;
717       for (j = 0; j < c; j++)
718         generic_bignum[j] = generic_bignum[i + j];
719       i = c;
720     }
721
722   know (LITTLENUM_NUMBER_OF_BITS == 16);
723   if (i > 2)
724     {
725       expressionP->X_op = O_big;
726       expressionP->X_add_number = i;
727     }
728   else
729     {
730       expressionP->X_op = O_constant;
731       if (i < 2)
732         expressionP->X_add_number = generic_bignum[0] & LITTLENUM_MASK;
733       else
734         expressionP->X_add_number =
735           (((generic_bignum[1] & LITTLENUM_MASK)
736             << LITTLENUM_NUMBER_OF_BITS)
737            | (generic_bignum[0] & LITTLENUM_MASK));
738     }
739
740   /* Skip the final closing quote.  */
741   ++input_line_pointer;
742 }
743
744 /* Return an expression representing the current location.  This
745    handles the magic symbol `.'.  */
746
747 static void
748 current_location (expressionp)
749      expressionS *expressionp;
750 {
751   if (now_seg == absolute_section)
752     {
753       expressionp->X_op = O_constant;
754       expressionp->X_add_number = abs_section_offset;
755     }
756   else
757     {
758       symbolS *symbolp;
759
760       symbolp = symbol_new (FAKE_LABEL_NAME, now_seg,
761                             (valueT) frag_now_fix (),
762                             frag_now);
763       expressionp->X_op = O_symbol;
764       expressionp->X_add_symbol = symbolp;
765       expressionp->X_add_number = 0;
766     }
767 }
768
769 /*
770  * Summary of operand().
771  *
772  * in:  Input_line_pointer points to 1st char of operand, which may
773  *      be a space.
774  *
775  * out: A expressionS.
776  *      The operand may have been empty: in this case X_op == O_absent.
777  *      Input_line_pointer->(next non-blank) char after operand.
778  */
779
780 static segT
781 operand (expressionP)
782      expressionS *expressionP;
783 {
784   char c;
785   symbolS *symbolP;     /* points to symbol */
786   char *name;           /* points to name of symbol */
787   segT segment;
788
789   /* All integers are regarded as unsigned unless they are negated.
790      This is because the only thing which cares whether a number is
791      unsigned is the code in emit_expr which extends constants into
792      bignums.  It should only sign extend negative numbers, so that
793      something like ``.quad 0x80000000'' is not sign extended even
794      though it appears negative if valueT is 32 bits.  */
795   expressionP->X_unsigned = 1;
796
797   /* digits, assume it is a bignum. */
798
799   SKIP_WHITESPACE ();           /* leading whitespace is part of operand. */
800   c = *input_line_pointer++;    /* input_line_pointer->past char in c. */
801
802   if (is_end_of_line[(unsigned char) c])
803     goto eol;
804
805   switch (c)
806     {
807     case '1':
808     case '2':
809     case '3':
810     case '4':
811     case '5':
812     case '6':
813     case '7':
814     case '8':
815     case '9':
816       input_line_pointer--;
817
818       integer_constant ((NUMBERS_WITH_SUFFIX || flag_m68k_mri)
819                         ? 0 : 10,
820                         expressionP);
821       break;
822
823 #ifdef LITERAL_PREFIXDOLLAR_HEX
824     case '$':
825       integer_constant (16, expressionP);
826       break;
827 #endif
828
829 #ifdef LITERAL_PREFIXPERCENT_BIN
830     case '%':
831       integer_constant (2, expressionP);
832       break;
833 #endif
834
835     case '0':
836       /* non-decimal radix */
837
838       if (NUMBERS_WITH_SUFFIX || flag_m68k_mri)
839         {
840           char *s;
841
842           /* Check for a hex constant.  */
843           for (s = input_line_pointer; hex_p (*s); s++)
844             ;
845           if (*s == 'h' || *s == 'H')
846             {
847               --input_line_pointer;
848               integer_constant (0, expressionP);
849               break;
850             }
851         }
852       c = *input_line_pointer;
853       switch (c)
854         {
855         case 'o':
856         case 'O':
857         case 'q':
858         case 'Q':
859         case '8':
860         case '9':
861           if (NUMBERS_WITH_SUFFIX || flag_m68k_mri)
862             {
863               integer_constant (0, expressionP);
864               break;
865             }
866           /* Fall through.  */
867         default:
868         default_case:
869           if (c && strchr (FLT_CHARS, c))
870             {
871               input_line_pointer++;
872               floating_constant (expressionP);
873               expressionP->X_add_number =
874                 - (isupper ((unsigned char) c) ? tolower (c) : c);
875             }
876           else
877             {
878               /* The string was only zero */
879               expressionP->X_op = O_constant;
880               expressionP->X_add_number = 0;
881             }
882
883           break;
884
885         case 'x':
886         case 'X':
887           if (flag_m68k_mri)
888             goto default_case;
889           input_line_pointer++;
890           integer_constant (16, expressionP);
891           break;
892
893         case 'b':
894           if (LOCAL_LABELS_FB && ! (flag_m68k_mri || NUMBERS_WITH_SUFFIX))
895             {
896               /* This code used to check for '+' and '-' here, and, in
897                  some conditions, fall through to call
898                  integer_constant.  However, that didn't make sense,
899                  as integer_constant only accepts digits.  */
900               /* Some of our code elsewhere does permit digits greater
901                  than the expected base; for consistency, do the same
902                  here.  */
903               if (input_line_pointer[1] < '0'
904                   || input_line_pointer[1] > '9')
905                 {
906                   /* Parse this as a back reference to label 0.  */
907                   input_line_pointer--;
908                   integer_constant (10, expressionP);
909                   break;
910                 }
911               /* Otherwise, parse this as a binary number.  */
912             }
913           /* Fall through.  */
914         case 'B':
915           input_line_pointer++;
916           if (flag_m68k_mri || NUMBERS_WITH_SUFFIX)
917             goto default_case;
918           integer_constant (2, expressionP);
919           break;
920
921         case '0':
922         case '1':
923         case '2':
924         case '3':
925         case '4':
926         case '5':
927         case '6':
928         case '7':
929           integer_constant ((flag_m68k_mri || NUMBERS_WITH_SUFFIX)
930                             ? 0 : 8, 
931                             expressionP);
932           break;
933
934         case 'f':
935           if (LOCAL_LABELS_FB)
936             {
937               /* If it says "0f" and it could possibly be a floating point
938                  number, make it one.  Otherwise, make it a local label,
939                  and try to deal with parsing the rest later.  */
940               if (!input_line_pointer[1]
941                   || (is_end_of_line[0xff & input_line_pointer[1]])
942                   || strchr (FLT_CHARS, 'f') == NULL)
943                 goto is_0f_label;
944               {
945                 char *cp = input_line_pointer + 1;
946                 int r = atof_generic (&cp, ".", EXP_CHARS,
947                                       &generic_floating_point_number);
948                 switch (r)
949                   {
950                   case 0:
951                   case ERROR_EXPONENT_OVERFLOW:
952                     if (*cp == 'f' || *cp == 'b')
953                       /* looks like a difference expression */
954                       goto is_0f_label;
955                     else if (cp == input_line_pointer + 1)
956                       /* No characters has been accepted -- looks like
957                          end of operand. */
958                       goto is_0f_label;
959                     else
960                       goto is_0f_float;
961                   default:
962                     as_fatal (_("expr.c(operand): bad atof_generic return val %d"),
963                               r);
964                   }
965               }
966
967               /* Okay, now we've sorted it out.  We resume at one of these
968                  two labels, depending on what we've decided we're probably
969                  looking at.  */
970             is_0f_label:
971               input_line_pointer--;
972               integer_constant (10, expressionP);
973               break;
974
975             is_0f_float:
976               /* fall through */
977               ;
978             }
979
980         case 'd':
981         case 'D':
982           if (flag_m68k_mri || NUMBERS_WITH_SUFFIX)
983             {
984               integer_constant (0, expressionP);
985               break;
986             }
987           /* Fall through.  */
988         case 'F':
989         case 'r':
990         case 'e':
991         case 'E':
992         case 'g':
993         case 'G':
994           input_line_pointer++;
995           floating_constant (expressionP);
996           expressionP->X_add_number =
997             - (isupper ((unsigned char) c) ? tolower (c) : c);
998           break;
999
1000         case '$':
1001           if (LOCAL_LABELS_DOLLAR)
1002             {
1003               integer_constant (10, expressionP);
1004               break;
1005             }
1006           else
1007             goto default_case;
1008         }
1009
1010       break;
1011
1012     case '(':
1013 #ifndef NEED_INDEX_OPERATOR
1014     case '[':
1015 #endif
1016       /* didn't begin with digit & not a name */
1017       segment = expression (expressionP);
1018       /* Expression() will pass trailing whitespace */
1019       if ((c == '(' && *input_line_pointer != ')')
1020           || (c == '[' && *input_line_pointer != ']'))
1021         {
1022 #ifdef RELAX_PAREN_GROUPING
1023           if (c != '(')
1024 #endif
1025             as_bad (_("Missing '%c' assumed"), c == '(' ? ')' : ']');
1026         }
1027       else
1028         input_line_pointer++;
1029       SKIP_WHITESPACE ();
1030       /* here with input_line_pointer->char after "(...)" */
1031       return segment;
1032
1033 #ifdef TC_M68K
1034     case 'E':
1035       if (! flag_m68k_mri || *input_line_pointer != '\'')
1036         goto de_fault;
1037       as_bad (_("EBCDIC constants are not supported"));
1038       /* Fall through.  */
1039     case 'A':
1040       if (! flag_m68k_mri || *input_line_pointer != '\'')
1041         goto de_fault;
1042       ++input_line_pointer;
1043       /* Fall through.  */
1044 #endif
1045     case '\'':
1046       if (! flag_m68k_mri)
1047         {
1048           /* Warning: to conform to other people's assemblers NO
1049              ESCAPEMENT is permitted for a single quote. The next
1050              character, parity errors and all, is taken as the value
1051              of the operand. VERY KINKY.  */
1052           expressionP->X_op = O_constant;
1053           expressionP->X_add_number = *input_line_pointer++;
1054           break;
1055         }
1056
1057       mri_char_constant (expressionP);
1058       break;
1059
1060     case '+':
1061       (void) operand (expressionP);
1062       break;
1063
1064 #ifdef TC_M68K
1065     case '"':
1066       /* Double quote is the bitwise not operator in MRI mode.  */
1067       if (! flag_m68k_mri)
1068         goto de_fault;
1069       /* Fall through.  */
1070 #endif
1071     case '~':
1072       /* ~ is permitted to start a label on the Delta.  */
1073       if (is_name_beginner (c))
1074         goto isname;
1075     case '!':
1076     case '-':
1077       {
1078         operand (expressionP);
1079         if (expressionP->X_op == O_constant)
1080           {
1081             /* input_line_pointer -> char after operand */
1082             if (c == '-')
1083               {
1084                 expressionP->X_add_number = - expressionP->X_add_number;
1085                 /* Notice: '-' may overflow: no warning is given. This is
1086                    compatible with other people's assemblers. Sigh.  */
1087                 expressionP->X_unsigned = 0;
1088               }
1089             else if (c == '~' || c == '"')
1090               expressionP->X_add_number = ~ expressionP->X_add_number;
1091             else
1092               expressionP->X_add_number = ! expressionP->X_add_number;
1093           }
1094         else if (expressionP->X_op != O_illegal
1095                  && expressionP->X_op != O_absent)
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         else
1107           as_warn (_("Unary operator %c ignored because bad operand follows"),
1108                    c);
1109       }
1110       break;
1111
1112 #if defined (DOLLAR_DOT) || defined (TC_M68K)
1113     case '$':
1114       /* $ is the program counter when in MRI mode, or when DOLLAR_DOT
1115          is defined.  */
1116 #ifndef DOLLAR_DOT
1117       if (! flag_m68k_mri)
1118         goto de_fault;
1119 #endif
1120       if (flag_m68k_mri && hex_p (*input_line_pointer))
1121         {
1122           /* In MRI mode, $ is also used as the prefix for a
1123              hexadecimal constant.  */
1124           integer_constant (16, expressionP);
1125           break;
1126         }
1127
1128       if (is_part_of_name (*input_line_pointer))
1129         goto isname;
1130
1131       current_location (expressionP);
1132       break;
1133 #endif
1134
1135     case '.':
1136       if (!is_part_of_name (*input_line_pointer))
1137         {
1138           current_location (expressionP);
1139           break;
1140         }
1141       else if ((strncasecmp (input_line_pointer, "startof.", 8) == 0
1142                 && ! is_part_of_name (input_line_pointer[8]))
1143                || (strncasecmp (input_line_pointer, "sizeof.", 7) == 0
1144                    && ! is_part_of_name (input_line_pointer[7])))
1145         {
1146           int start;
1147
1148           start = (input_line_pointer[1] == 't'
1149                    || input_line_pointer[1] == 'T');
1150           input_line_pointer += start ? 8 : 7;
1151           SKIP_WHITESPACE ();
1152           if (*input_line_pointer != '(')
1153             as_bad (_("syntax error in .startof. or .sizeof."));
1154           else
1155             {
1156               char *buf;
1157
1158               ++input_line_pointer;
1159               SKIP_WHITESPACE ();
1160               name = input_line_pointer;
1161               c = get_symbol_end ();
1162
1163               buf = (char *) xmalloc (strlen (name) + 10);
1164               if (start)
1165                 sprintf (buf, ".startof.%s", name);
1166               else
1167                 sprintf (buf, ".sizeof.%s", name);
1168               symbolP = symbol_make (buf);
1169               free (buf);
1170
1171               expressionP->X_op = O_symbol;
1172               expressionP->X_add_symbol = symbolP;
1173               expressionP->X_add_number = 0;
1174
1175               *input_line_pointer = c;
1176               SKIP_WHITESPACE ();
1177               if (*input_line_pointer != ')')
1178                 as_bad (_("syntax error in .startof. or .sizeof."));
1179               else
1180                 ++input_line_pointer;
1181             }
1182           break;
1183         }
1184       else
1185         {
1186           goto isname;
1187         }
1188
1189     case ',':
1190     eol:
1191       /* can't imagine any other kind of operand */
1192       expressionP->X_op = O_absent;
1193       input_line_pointer--;
1194       break;
1195
1196 #ifdef TC_M68K
1197     case '%':
1198       if (! flag_m68k_mri)
1199         goto de_fault;
1200       integer_constant (2, expressionP);
1201       break;
1202
1203     case '@':
1204       if (! flag_m68k_mri)
1205         goto de_fault;
1206       integer_constant (8, expressionP);
1207       break;
1208
1209     case ':':
1210       if (! flag_m68k_mri)
1211         goto de_fault;
1212
1213       /* In MRI mode, this is a floating point constant represented
1214          using hexadecimal digits.  */
1215
1216       ++input_line_pointer;
1217       integer_constant (16, expressionP);
1218       break;
1219
1220     case '*':
1221       if (! flag_m68k_mri || is_part_of_name (*input_line_pointer))
1222         goto de_fault;
1223
1224       current_location (expressionP);
1225       break;
1226 #endif
1227
1228     default:
1229 #ifdef TC_M68K
1230     de_fault:
1231 #endif
1232       if (is_name_beginner (c)) /* here if did not begin with a digit */
1233         {
1234           /*
1235            * Identifier begins here.
1236            * This is kludged for speed, so code is repeated.
1237            */
1238         isname:
1239           name = --input_line_pointer;
1240           c = get_symbol_end ();
1241
1242 #ifdef md_parse_name
1243           /* This is a hook for the backend to parse certain names
1244              specially in certain contexts.  If a name always has a
1245              specific value, it can often be handled by simply
1246              entering it in the symbol table.  */
1247           if (md_parse_name (name, expressionP))
1248             {
1249               *input_line_pointer = c;
1250               break;
1251             }
1252 #endif
1253
1254 #ifdef TC_I960
1255           /* The MRI i960 assembler permits
1256                  lda sizeof code,g13
1257              FIXME: This should use md_parse_name.  */
1258           if (flag_mri
1259               && (strcasecmp (name, "sizeof") == 0
1260                   || strcasecmp (name, "startof") == 0))
1261             {
1262               int start;
1263               char *buf;
1264
1265               start = (name[1] == 't'
1266                        || name[1] == 'T');
1267
1268               *input_line_pointer = c;
1269               SKIP_WHITESPACE ();
1270
1271               name = input_line_pointer;
1272               c = get_symbol_end ();
1273
1274               buf = (char *) xmalloc (strlen (name) + 10);
1275               if (start)
1276                 sprintf (buf, ".startof.%s", name);
1277               else
1278                 sprintf (buf, ".sizeof.%s", name);
1279               symbolP = symbol_make (buf);
1280               free (buf);
1281
1282               expressionP->X_op = O_symbol;
1283               expressionP->X_add_symbol = symbolP;
1284               expressionP->X_add_number = 0;
1285
1286               *input_line_pointer = c;
1287               SKIP_WHITESPACE ();
1288
1289               break;
1290             }         
1291 #endif
1292
1293           symbolP = symbol_find_or_make (name);
1294
1295           /* If we have an absolute symbol or a reg, then we know its
1296              value now.  */
1297           segment = S_GET_SEGMENT (symbolP);
1298           if (segment == absolute_section)
1299             {
1300               expressionP->X_op = O_constant;
1301               expressionP->X_add_number = S_GET_VALUE (symbolP);
1302             }
1303           else if (segment == reg_section)
1304             {
1305               expressionP->X_op = O_register;
1306               expressionP->X_add_number = S_GET_VALUE (symbolP);
1307             }
1308           else
1309             {
1310               expressionP->X_op = O_symbol;
1311               expressionP->X_add_symbol = symbolP;
1312               expressionP->X_add_number = 0;
1313             }
1314           *input_line_pointer = c;
1315         }
1316       else
1317         {
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 passed 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   /*
1337    * It is more 'efficient' to clean up the expressionS when they are created.
1338    * Doing it here saves lines of code.
1339    */
1340   clean_up_expression (expressionP);
1341   SKIP_WHITESPACE ();           /*->1st char after operand. */
1342   know (*input_line_pointer != ' ');
1343
1344   /* The PA port needs this information.  */
1345   if (expressionP->X_add_symbol)
1346     symbol_mark_used (expressionP->X_add_symbol);
1347
1348   switch (expressionP->X_op)
1349     {
1350     default:
1351       return absolute_section;
1352     case O_symbol:
1353       return S_GET_SEGMENT (expressionP->X_add_symbol);
1354     case O_register:
1355       return reg_section;
1356     }
1357 }                               /* operand() */
1358 \f
1359 /* Internal. Simplify a struct expression for use by expr() */
1360
1361 /*
1362  * In:  address of a expressionS.
1363  *      The X_op field of the expressionS may only take certain values.
1364  *      Elsewise we waste time special-case testing. Sigh. Ditto SEG_ABSENT.
1365  * Out: expressionS may have been modified:
1366  *      'foo-foo' symbol references cancelled to 0,
1367  *              which changes X_op from O_subtract to O_constant.
1368  *      Unused fields zeroed to help expr().
1369  */
1370
1371 static void
1372 clean_up_expression (expressionP)
1373      expressionS *expressionP;
1374 {
1375   switch (expressionP->X_op)
1376     {
1377     case O_illegal:
1378     case O_absent:
1379       expressionP->X_add_number = 0;
1380       /* Fall through.  */
1381     case O_big:
1382     case O_constant:
1383     case O_register:
1384       expressionP->X_add_symbol = NULL;
1385       /* Fall through.  */
1386     case O_symbol:
1387     case O_uminus:
1388     case O_bit_not:
1389       expressionP->X_op_symbol = NULL;
1390       break;
1391     case O_subtract:
1392       if (expressionP->X_op_symbol == expressionP->X_add_symbol
1393           || ((symbol_get_frag (expressionP->X_op_symbol)
1394                == symbol_get_frag (expressionP->X_add_symbol))
1395               && SEG_NORMAL (S_GET_SEGMENT (expressionP->X_add_symbol))
1396               && (S_GET_VALUE (expressionP->X_op_symbol)
1397                   == S_GET_VALUE (expressionP->X_add_symbol))))
1398         {
1399           addressT diff = (S_GET_VALUE (expressionP->X_add_symbol)
1400                            - S_GET_VALUE (expressionP->X_op_symbol));
1401
1402           expressionP->X_op = O_constant;
1403           expressionP->X_add_symbol = NULL;
1404           expressionP->X_op_symbol = NULL;
1405           expressionP->X_add_number += diff;
1406         }
1407       break;
1408     default:
1409       break;
1410     }
1411 }
1412 \f
1413 /* Expression parser. */
1414
1415 /*
1416  * We allow an empty expression, and just assume (absolute,0) silently.
1417  * Unary operators and parenthetical expressions are treated as operands.
1418  * As usual, Q==quantity==operand, O==operator, X==expression mnemonics.
1419  *
1420  * We used to do a aho/ullman shift-reduce parser, but the logic got so
1421  * warped that I flushed it and wrote a recursive-descent parser instead.
1422  * Now things are stable, would anybody like to write a fast parser?
1423  * Most expressions are either register (which does not even reach here)
1424  * or 1 symbol. Then "symbol+constant" and "symbol-symbol" are common.
1425  * So I guess it doesn't really matter how inefficient more complex expressions
1426  * are parsed.
1427  *
1428  * After expr(RANK,resultP) input_line_pointer->operator of rank <= RANK.
1429  * Also, we have consumed any leading or trailing spaces (operand does that)
1430  * and done all intervening operators.
1431  *
1432  * This returns the segment of the result, which will be
1433  * absolute_section or the segment of a symbol.
1434  */
1435
1436 #undef __
1437 #define __ O_illegal
1438
1439 static const operatorT op_encoding[256] =
1440 {                               /* maps ASCII->operators */
1441
1442   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1443   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1444
1445   __, O_bit_or_not, __, __, __, O_modulus, O_bit_and, __,
1446   __, __, O_multiply, O_add, __, O_subtract, __, O_divide,
1447   __, __, __, __, __, __, __, __,
1448   __, __, __, __, O_lt, __, O_gt, __,
1449   __, __, __, __, __, __, __, __,
1450   __, __, __, __, __, __, __, __,
1451   __, __, __, __, __, __, __, __,
1452   __, __, __,
1453 #ifdef NEED_INDEX_OPERATOR
1454   O_index,
1455 #else
1456   __,
1457 #endif
1458   __, __, O_bit_exclusive_or, __,
1459   __, __, __, __, __, __, __, __,
1460   __, __, __, __, __, __, __, __,
1461   __, __, __, __, __, __, __, __,
1462   __, __, __, __, O_bit_inclusive_or, __, __, __,
1463
1464   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1465   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1466   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1467   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1468   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1469   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1470   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1471   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
1472 };
1473
1474
1475 /*
1476  *      Rank    Examples
1477  *      0       operand, (expression)
1478  *      1       ||
1479  *      2       &&
1480  *      3       = <> < <= >= >
1481  *      4       + -
1482  *      5       used for * / % in MRI mode
1483  *      6       & ^ ! |
1484  *      7       * / % << >>
1485  *      8       unary - unary ~
1486  */
1487 static operator_rankT op_rank[] =
1488 {
1489   0,    /* O_illegal */
1490   0,    /* O_absent */
1491   0,    /* O_constant */
1492   0,    /* O_symbol */
1493   0,    /* O_symbol_rva */
1494   0,    /* O_register */
1495   0,    /* O_bit */
1496   9,    /* O_uminus */
1497   9,    /* O_bit_not */
1498   9,    /* O_logical_not */
1499   8,    /* O_multiply */
1500   8,    /* O_divide */
1501   8,    /* O_modulus */
1502   8,    /* O_left_shift */
1503   8,    /* O_right_shift */
1504   7,    /* O_bit_inclusive_or */
1505   7,    /* O_bit_or_not */
1506   7,    /* O_bit_exclusive_or */
1507   7,    /* O_bit_and */
1508   5,    /* O_add */
1509   5,    /* O_subtract */
1510   4,    /* O_eq */
1511   4,    /* O_ne */
1512   4,    /* O_lt */
1513   4,    /* O_le */
1514   4,    /* O_ge */
1515   4,    /* O_gt */
1516   3,    /* O_logical_and */
1517   2,    /* O_logical_or */
1518   1,    /* O_index */
1519   0,    /* O_md1 */
1520   0,    /* O_md2 */
1521   0,    /* O_md3 */
1522   0,    /* O_md4 */
1523   0,    /* O_md5 */
1524   0,    /* O_md6 */
1525   0,    /* O_md7 */
1526   0,    /* O_md8 */
1527   0,    /* O_md9 */
1528   0,    /* O_md10 */
1529   0,    /* O_md11 */
1530   0,    /* O_md12 */
1531   0,    /* O_md13 */
1532   0,    /* O_md14 */
1533   0,    /* O_md15 */
1534   0,    /* O_md16 */
1535 };
1536
1537 /* Unfortunately, in MRI mode for the m68k, multiplication and
1538    division have lower precedence than the bit wise operators.  This
1539    function sets the operator precedences correctly for the current
1540    mode.  Also, MRI uses a different bit_not operator, and this fixes
1541    that as well.  */
1542
1543 #define STANDARD_MUL_PRECEDENCE (7)
1544 #define MRI_MUL_PRECEDENCE (5)
1545
1546 void
1547 expr_set_precedence ()
1548 {
1549   if (flag_m68k_mri)
1550     {
1551       op_rank[O_multiply] = MRI_MUL_PRECEDENCE;
1552       op_rank[O_divide] = MRI_MUL_PRECEDENCE;
1553       op_rank[O_modulus] = MRI_MUL_PRECEDENCE;
1554     }
1555   else
1556     {
1557       op_rank[O_multiply] = STANDARD_MUL_PRECEDENCE;
1558       op_rank[O_divide] = STANDARD_MUL_PRECEDENCE;
1559       op_rank[O_modulus] = STANDARD_MUL_PRECEDENCE;
1560     }
1561 }
1562
1563 /* Initialize the expression parser.  */
1564
1565 void
1566 expr_begin ()
1567 {
1568   expr_set_precedence ();
1569
1570   /* Verify that X_op field is wide enough.  */
1571   {
1572     expressionS e;
1573     e.X_op = O_max;
1574     assert (e.X_op == O_max);
1575   }
1576 }
1577 \f
1578 /* Return the encoding for the operator at INPUT_LINE_POINTER.
1579    Advance INPUT_LINE_POINTER to the last character in the operator
1580    (i.e., don't change it for a single character operator).  */
1581
1582 static inline operatorT
1583 operator ()
1584 {
1585   int c;
1586   operatorT ret;
1587
1588   c = *input_line_pointer & 0xff;
1589
1590   if (is_end_of_line[c])
1591     return O_illegal;
1592
1593   switch (c)
1594     {
1595     default:
1596       return op_encoding[c];
1597
1598     case '<':
1599       switch (input_line_pointer[1])
1600         {
1601         default:
1602           return op_encoding[c];
1603         case '<':
1604           ret = O_left_shift;
1605           break;
1606         case '>':
1607           ret = O_ne;
1608           break;
1609         case '=':
1610           ret = O_le;
1611           break;
1612         }
1613       ++input_line_pointer;
1614       return ret;
1615
1616     case '=':
1617       if (input_line_pointer[1] != '=')
1618         return op_encoding[c];
1619
1620       ++input_line_pointer;
1621       return O_eq;
1622
1623     case '>':
1624       switch (input_line_pointer[1])
1625         {
1626         default:
1627           return op_encoding[c];
1628         case '>':
1629           ret = O_right_shift;
1630           break;
1631         case '=':
1632           ret = O_ge;
1633           break;
1634         }
1635       ++input_line_pointer;
1636       return ret;
1637
1638     case '!':
1639       /* We accept !! as equivalent to ^ for MRI compatibility.  */
1640       if (input_line_pointer[1] != '!')
1641         {
1642           if (flag_m68k_mri)
1643             return O_bit_inclusive_or;
1644           return op_encoding[c];
1645         }
1646       ++input_line_pointer;
1647       return O_bit_exclusive_or;
1648
1649     case '|':
1650       if (input_line_pointer[1] != '|')
1651         return op_encoding[c];
1652
1653       ++input_line_pointer;
1654       return O_logical_or;
1655
1656     case '&':
1657       if (input_line_pointer[1] != '&')
1658         return op_encoding[c];
1659
1660       ++input_line_pointer;
1661       return O_logical_and;
1662     }
1663
1664   /*NOTREACHED*/
1665 }
1666
1667 /* Parse an expression.  */
1668
1669 segT
1670 expr (rankarg, resultP)
1671      int rankarg;       /* Larger # is higher rank. */
1672      expressionS *resultP;      /* Deliver result here. */
1673 {
1674   operator_rankT rank = (operator_rankT) rankarg;
1675   segT retval;
1676   expressionS right;
1677   operatorT op_left;
1678   operatorT op_right;
1679
1680   know (rank >= 0);
1681
1682   retval = operand (resultP);
1683
1684   know (*input_line_pointer != ' ');    /* Operand() gobbles spaces. */
1685
1686   op_left = operator ();
1687   while (op_left != O_illegal && op_rank[(int) op_left] > rank)
1688     {
1689       segT rightseg;
1690
1691       input_line_pointer++;     /*->after 1st character of operator. */
1692
1693       rightseg = expr (op_rank[(int) op_left], &right);
1694       if (right.X_op == O_absent)
1695         {
1696           as_warn (_("missing operand; zero assumed"));
1697           right.X_op = O_constant;
1698           right.X_add_number = 0;
1699           right.X_add_symbol = NULL;
1700           right.X_op_symbol = NULL;
1701         }
1702
1703       know (*input_line_pointer != ' ');
1704
1705       if (op_left == O_index)
1706         {
1707           if (*input_line_pointer != ']')
1708             as_bad ("missing right bracket");
1709           else
1710             {
1711               ++input_line_pointer;
1712               SKIP_WHITESPACE ();
1713             }
1714         }
1715
1716       if (retval == undefined_section)
1717         {
1718           if (SEG_NORMAL (rightseg))
1719             retval = rightseg;
1720         }
1721       else if (! SEG_NORMAL (retval))
1722         retval = rightseg;
1723       else if (SEG_NORMAL (rightseg)
1724                && retval != rightseg
1725 #ifdef DIFF_EXPR_OK
1726                && op_left != O_subtract
1727 #endif
1728                )
1729         as_bad (_("operation combines symbols in different segments"));
1730
1731       op_right = operator ();
1732
1733       know (op_right == O_illegal || op_rank[(int) op_right] <= op_rank[(int) op_left]);
1734       know ((int) op_left >= (int) O_multiply
1735             && (int) op_left <= (int) O_logical_or);
1736
1737       /* input_line_pointer->after right-hand quantity. */
1738       /* left-hand quantity in resultP */
1739       /* right-hand quantity in right. */
1740       /* operator in op_left. */
1741
1742       if (resultP->X_op == O_big)
1743         {
1744           if (resultP->X_add_number > 0)
1745             as_warn (_("left operand is a bignum; integer 0 assumed"));
1746           else
1747             as_warn (_("left operand is a float; integer 0 assumed"));
1748           resultP->X_op = O_constant;
1749           resultP->X_add_number = 0;
1750           resultP->X_add_symbol = NULL;
1751           resultP->X_op_symbol = NULL;
1752         }
1753       if (right.X_op == O_big)
1754         {
1755           if (right.X_add_number > 0)
1756             as_warn (_("right operand is a bignum; integer 0 assumed"));
1757           else
1758             as_warn (_("right operand is a float; integer 0 assumed"));
1759           right.X_op = O_constant;
1760           right.X_add_number = 0;
1761           right.X_add_symbol = NULL;
1762           right.X_op_symbol = NULL;
1763         }
1764
1765       /* Optimize common cases.  */
1766 #ifdef md_optimize_expr
1767       if (md_optimize_expr (resultP, op_left, &right))
1768         {
1769           /* skip */;
1770         }
1771       else
1772 #endif
1773       if (op_left == O_add && right.X_op == O_constant)
1774         {
1775           /* X + constant.  */
1776           resultP->X_add_number += right.X_add_number;
1777         }
1778       /* This case comes up in PIC code.  */
1779       else if (op_left == O_subtract
1780                && right.X_op == O_symbol
1781                && resultP->X_op == O_symbol
1782                && (symbol_get_frag (right.X_add_symbol)
1783                    == symbol_get_frag (resultP->X_add_symbol))
1784                && SEG_NORMAL (S_GET_SEGMENT (right.X_add_symbol)))
1785
1786         {
1787           resultP->X_add_number -= right.X_add_number;
1788           resultP->X_add_number += (S_GET_VALUE (resultP->X_add_symbol)
1789                                     - S_GET_VALUE (right.X_add_symbol));
1790           resultP->X_op = O_constant;
1791           resultP->X_add_symbol = 0;
1792         }
1793       else if (op_left == O_subtract && right.X_op == O_constant)
1794         {
1795           /* X - constant.  */
1796           resultP->X_add_number -= right.X_add_number;
1797         }
1798       else if (op_left == O_add && resultP->X_op == O_constant)
1799         {
1800           /* Constant + X.  */
1801           resultP->X_op = right.X_op;
1802           resultP->X_add_symbol = right.X_add_symbol;
1803           resultP->X_op_symbol = right.X_op_symbol;
1804           resultP->X_add_number += right.X_add_number;
1805           retval = rightseg;
1806         }
1807       else if (resultP->X_op == O_constant && right.X_op == O_constant)
1808         {
1809           /* Constant OP constant.  */
1810           offsetT v = right.X_add_number;
1811           if (v == 0 && (op_left == O_divide || op_left == O_modulus))
1812             {
1813               as_warn (_("division by zero"));
1814               v = 1;
1815             }
1816           switch (op_left)
1817             {
1818             default:                    abort ();
1819             case O_multiply:            resultP->X_add_number *= v; break;
1820             case O_divide:              resultP->X_add_number /= v; break;
1821             case O_modulus:             resultP->X_add_number %= v; break;
1822             case O_left_shift:          resultP->X_add_number <<= v; break;
1823             case O_right_shift:
1824               /* We always use unsigned shifts, to avoid relying on
1825                  characteristics of the compiler used to compile gas.  */
1826               resultP->X_add_number =
1827                 (offsetT) ((valueT) resultP->X_add_number >> (valueT) v);
1828               break;
1829             case O_bit_inclusive_or:    resultP->X_add_number |= v; break;
1830             case O_bit_or_not:          resultP->X_add_number |= ~v; break;
1831             case O_bit_exclusive_or:    resultP->X_add_number ^= v; break;
1832             case O_bit_and:             resultP->X_add_number &= v; break;
1833             case O_add:                 resultP->X_add_number += v; break;
1834             case O_subtract:            resultP->X_add_number -= v; break;
1835             case O_eq:
1836               resultP->X_add_number =
1837                 resultP->X_add_number == v ? ~ (offsetT) 0 : 0;
1838               break;
1839             case O_ne:
1840               resultP->X_add_number =
1841                 resultP->X_add_number != v ? ~ (offsetT) 0 : 0;
1842               break;
1843             case O_lt:
1844               resultP->X_add_number =
1845                 resultP->X_add_number <  v ? ~ (offsetT) 0 : 0;
1846               break;
1847             case O_le:
1848               resultP->X_add_number =
1849                 resultP->X_add_number <= v ? ~ (offsetT) 0 : 0;
1850               break;
1851             case O_ge:
1852               resultP->X_add_number =
1853                 resultP->X_add_number >= v ? ~ (offsetT) 0 : 0;
1854               break;
1855             case O_gt:
1856               resultP->X_add_number =
1857                 resultP->X_add_number >  v ? ~ (offsetT) 0 : 0;
1858               break;
1859             case O_logical_and:
1860               resultP->X_add_number = resultP->X_add_number && v;
1861               break;
1862             case O_logical_or:
1863               resultP->X_add_number = resultP->X_add_number || v;
1864               break;
1865             }
1866         }
1867       else if (resultP->X_op == O_symbol
1868                && right.X_op == O_symbol
1869                && (op_left == O_add
1870                    || op_left == O_subtract
1871                    || (resultP->X_add_number == 0
1872                        && right.X_add_number == 0)))
1873         {
1874           /* Symbol OP symbol.  */
1875           resultP->X_op = op_left;
1876           resultP->X_op_symbol = right.X_add_symbol;
1877           if (op_left == O_add)
1878             resultP->X_add_number += right.X_add_number;
1879           else if (op_left == O_subtract)
1880             resultP->X_add_number -= right.X_add_number;
1881         }
1882       else
1883         {
1884           /* The general case.  */
1885           resultP->X_add_symbol = make_expr_symbol (resultP);
1886           resultP->X_op_symbol = make_expr_symbol (&right);
1887           resultP->X_op = op_left;
1888           resultP->X_add_number = 0;
1889           resultP->X_unsigned = 1;
1890         }
1891
1892       op_left = op_right;
1893     }                           /* While next operator is >= this rank. */
1894
1895   /* The PA port needs this information.  */
1896   if (resultP->X_add_symbol)
1897     symbol_mark_used (resultP->X_add_symbol);
1898
1899   return resultP->X_op == O_constant ? absolute_section : retval;
1900 }
1901 \f
1902 /*
1903  *                      get_symbol_end()
1904  *
1905  * This lives here because it belongs equally in expr.c & read.c.
1906  * Expr.c is just a branch office read.c anyway, and putting it
1907  * here lessens the crowd at read.c.
1908  *
1909  * Assume input_line_pointer is at start of symbol name.
1910  * Advance input_line_pointer past symbol name.
1911  * Turn that character into a '\0', returning its former value.
1912  * This allows a string compare (RMS wants symbol names to be strings)
1913  * of the symbol name.
1914  * There will always be a char following symbol name, because all good
1915  * lines end in end-of-line.
1916  */
1917 char
1918 get_symbol_end ()
1919 {
1920   char c;
1921
1922   /* We accept \001 in a name in case this is being called with a
1923      constructed string.  */
1924   if (is_name_beginner (c = *input_line_pointer++) || c == '\001')
1925     {
1926       while (is_part_of_name (c = *input_line_pointer++)
1927              || c == '\001')
1928         ;
1929       if (is_name_ender (c))
1930         c = *input_line_pointer++;
1931     }
1932   *--input_line_pointer = 0;
1933   return (c);
1934 }
1935
1936
1937 unsigned int
1938 get_single_number ()
1939 {
1940   expressionS exp;
1941   operand (&exp);
1942   return exp.X_add_number;
1943
1944 }
1945
1946 /* end of expr.c */