Merge branch 'vendor/OPENSSH'
[dragonfly.git] / contrib / binutils-2.24 / gas / expr.c
1 /* expr.c -operands, expressions-
2    Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011,
4    2012 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 3, 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, 51 Franklin Street - Fifth Floor, Boston, MA
21    02110-1301, 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 #define min(a, b)       ((a) < (b) ? (a) : (b))
29
30 #include "as.h"
31 #include "safe-ctype.h"
32 #include "obstack.h"
33
34 #ifdef HAVE_LIMITS_H
35 #include <limits.h>
36 #endif
37 #ifndef CHAR_BIT
38 #define CHAR_BIT 8
39 #endif
40
41 static void floating_constant (expressionS * expressionP);
42 static valueT generic_bignum_to_int32 (void);
43 #ifdef BFD64
44 static valueT generic_bignum_to_int64 (void);
45 #endif
46 static void integer_constant (int radix, expressionS * expressionP);
47 static void mri_char_constant (expressionS *);
48 static void clean_up_expression (expressionS * expressionP);
49 static segT operand (expressionS *, enum expr_mode);
50 static operatorT operatorf (int *);
51
52 extern const char EXP_CHARS[], FLT_CHARS[];
53
54 /* We keep a mapping of expression symbols to file positions, so that
55    we can provide better error messages.  */
56
57 struct expr_symbol_line {
58   struct expr_symbol_line *next;
59   symbolS *sym;
60   char *file;
61   unsigned int line;
62 };
63
64 static struct expr_symbol_line *expr_symbol_lines;
65 \f
66 /* Build a dummy symbol to hold a complex expression.  This is how we
67    build expressions up out of other expressions.  The symbol is put
68    into the fake section expr_section.  */
69
70 symbolS *
71 make_expr_symbol (expressionS *expressionP)
72 {
73   expressionS zero;
74   symbolS *symbolP;
75   struct expr_symbol_line *n;
76
77   if (expressionP->X_op == O_symbol
78       && expressionP->X_add_number == 0)
79     return expressionP->X_add_symbol;
80
81   if (expressionP->X_op == O_big)
82     {
83       /* This won't work, because the actual value is stored in
84          generic_floating_point_number or generic_bignum, and we are
85          going to lose it if we haven't already.  */
86       if (expressionP->X_add_number > 0)
87         as_bad (_("bignum invalid"));
88       else
89         as_bad (_("floating point number invalid"));
90       zero.X_op = O_constant;
91       zero.X_add_number = 0;
92       zero.X_unsigned = 0;
93       zero.X_extrabit = 0;
94       clean_up_expression (&zero);
95       expressionP = &zero;
96     }
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_LABEL_NAME,
103                            (expressionP->X_op == O_constant
104                             ? absolute_section
105                             : expressionP->X_op == O_register
106                               ? reg_section
107                               : expr_section),
108                            0, &zero_address_frag);
109   symbol_set_value_expression (symbolP, expressionP);
110
111   if (expressionP->X_op == O_constant)
112     resolve_symbol_value (symbolP);
113
114   n = (struct expr_symbol_line *) xmalloc (sizeof *n);
115   n->sym = symbolP;
116   as_where (&n->file, &n->line);
117   n->next = expr_symbol_lines;
118   expr_symbol_lines = n;
119
120   return symbolP;
121 }
122
123 /* Return the file and line number for an expr symbol.  Return
124    non-zero if something was found, 0 if no information is known for
125    the symbol.  */
126
127 int
128 expr_symbol_where (symbolS *sym, char **pfile, unsigned int *pline)
129 {
130   register struct expr_symbol_line *l;
131
132   for (l = expr_symbol_lines; l != NULL; l = l->next)
133     {
134       if (l->sym == sym)
135         {
136           *pfile = l->file;
137           *pline = l->line;
138           return 1;
139         }
140     }
141
142   return 0;
143 }
144 \f
145 /* Utilities for building expressions.
146    Since complex expressions are recorded as symbols for use in other
147    expressions these return a symbolS * and not an expressionS *.
148    These explicitly do not take an "add_number" argument.  */
149 /* ??? For completeness' sake one might want expr_build_symbol.
150    It would just return its argument.  */
151
152 /* Build an expression for an unsigned constant.
153    The corresponding one for signed constants is missing because
154    there's currently no need for it.  One could add an unsigned_p flag
155    but that seems more clumsy.  */
156
157 symbolS *
158 expr_build_uconstant (offsetT value)
159 {
160   expressionS e;
161
162   e.X_op = O_constant;
163   e.X_add_number = value;
164   e.X_unsigned = 1;
165   e.X_extrabit = 0;
166   return make_expr_symbol (&e);
167 }
168
169 /* Build an expression for the current location ('.').  */
170
171 symbolS *
172 expr_build_dot (void)
173 {
174   expressionS e;
175
176   current_location (&e);
177   return symbol_clone_if_forward_ref (make_expr_symbol (&e));
178 }
179 \f
180 /* Build any floating-point literal here.
181    Also build any bignum literal here.  */
182
183 /* Seems atof_machine can backscan through generic_bignum and hit whatever
184    happens to be loaded before it in memory.  And its way too complicated
185    for me to fix right.  Thus a hack.  JF:  Just make generic_bignum bigger,
186    and never write into the early words, thus they'll always be zero.
187    I hate Dean's floating-point code.  Bleh.  */
188 LITTLENUM_TYPE generic_bignum[SIZE_OF_LARGE_NUMBER + 6];
189
190 FLONUM_TYPE generic_floating_point_number = {
191   &generic_bignum[6],           /* low.  (JF: Was 0)  */
192   &generic_bignum[SIZE_OF_LARGE_NUMBER + 6 - 1], /* high.  JF: (added +6)  */
193   0,                            /* leader.  */
194   0,                            /* exponent.  */
195   0                             /* sign.  */
196 };
197
198 \f
199 static void
200 floating_constant (expressionS *expressionP)
201 {
202   /* input_line_pointer -> floating-point constant.  */
203   int error_code;
204
205   error_code = atof_generic (&input_line_pointer, ".", EXP_CHARS,
206                              &generic_floating_point_number);
207
208   if (error_code)
209     {
210       if (error_code == ERROR_EXPONENT_OVERFLOW)
211         {
212           as_bad (_("bad floating-point constant: exponent overflow"));
213         }
214       else
215         {
216           as_bad (_("bad floating-point constant: unknown error code=%d"),
217                   error_code);
218         }
219     }
220   expressionP->X_op = O_big;
221   /* input_line_pointer -> just after constant, which may point to
222      whitespace.  */
223   expressionP->X_add_number = -1;
224 }
225
226 static valueT
227 generic_bignum_to_int32 (void)
228 {
229   valueT number =
230            ((generic_bignum[1] & LITTLENUM_MASK) << LITTLENUM_NUMBER_OF_BITS)
231            | (generic_bignum[0] & LITTLENUM_MASK);
232   number &= 0xffffffff;
233   return number;
234 }
235
236 #ifdef BFD64
237 static valueT
238 generic_bignum_to_int64 (void)
239 {
240   valueT number =
241     ((((((((valueT) generic_bignum[3] & LITTLENUM_MASK)
242           << LITTLENUM_NUMBER_OF_BITS)
243          | ((valueT) generic_bignum[2] & LITTLENUM_MASK))
244         << LITTLENUM_NUMBER_OF_BITS)
245        | ((valueT) generic_bignum[1] & LITTLENUM_MASK))
246       << LITTLENUM_NUMBER_OF_BITS)
247      | ((valueT) generic_bignum[0] & LITTLENUM_MASK));
248   return number;
249 }
250 #endif
251
252 static void
253 integer_constant (int radix, expressionS *expressionP)
254 {
255   char *start;          /* Start of number.  */
256   char *suffix = NULL;
257   char c;
258   valueT number;        /* Offset or (absolute) value.  */
259   short int digit;      /* Value of next digit in current radix.  */
260   short int maxdig = 0; /* Highest permitted digit value.  */
261   int too_many_digits = 0;      /* If we see >= this number of.  */
262   char *name;           /* Points to name of symbol.  */
263   symbolS *symbolP;     /* Points to symbol.  */
264
265   int small;                    /* True if fits in 32 bits.  */
266
267   /* May be bignum, or may fit in 32 bits.  */
268   /* Most numbers fit into 32 bits, and we want this case to be fast.
269      so we pretend it will fit into 32 bits.  If, after making up a 32
270      bit number, we realise that we have scanned more digits than
271      comfortably fit into 32 bits, we re-scan the digits coding them
272      into a bignum.  For decimal and octal numbers we are
273      conservative: Some numbers may be assumed bignums when in fact
274      they do fit into 32 bits.  Numbers of any radix can have excess
275      leading zeros: We strive to recognise this and cast them back
276      into 32 bits.  We must check that the bignum really is more than
277      32 bits, and change it back to a 32-bit number if it fits.  The
278      number we are looking for is expected to be positive, but if it
279      fits into 32 bits as an unsigned number, we let it be a 32-bit
280      number.  The cavalier approach is for speed in ordinary cases.  */
281   /* This has been extended for 64 bits.  We blindly assume that if
282      you're compiling in 64-bit mode, the target is a 64-bit machine.
283      This should be cleaned up.  */
284
285 #ifdef BFD64
286 #define valuesize 64
287 #else /* includes non-bfd case, mostly */
288 #define valuesize 32
289 #endif
290
291   if ((NUMBERS_WITH_SUFFIX || flag_m68k_mri) && radix == 0)
292     {
293       int flt = 0;
294
295       /* In MRI mode, the number may have a suffix indicating the
296          radix.  For that matter, it might actually be a floating
297          point constant.  */
298       for (suffix = input_line_pointer; ISALNUM (*suffix); suffix++)
299         {
300           if (*suffix == 'e' || *suffix == 'E')
301             flt = 1;
302         }
303
304       if (suffix == input_line_pointer)
305         {
306           radix = 10;
307           suffix = NULL;
308         }
309       else
310         {
311           c = *--suffix;
312           c = TOUPPER (c);
313           /* If we have both NUMBERS_WITH_SUFFIX and LOCAL_LABELS_FB,
314              we distinguish between 'B' and 'b'.  This is the case for
315              Z80.  */
316           if ((NUMBERS_WITH_SUFFIX && LOCAL_LABELS_FB ? *suffix : c) == 'B')
317             radix = 2;
318           else if (c == 'D')
319             radix = 10;
320           else if (c == 'O' || c == 'Q')
321             radix = 8;
322           else if (c == 'H')
323             radix = 16;
324           else if (suffix[1] == '.' || c == 'E' || flt)
325             {
326               floating_constant (expressionP);
327               return;
328             }
329           else
330             {
331               radix = 10;
332               suffix = NULL;
333             }
334         }
335     }
336
337   switch (radix)
338     {
339     case 2:
340       maxdig = 2;
341       too_many_digits = valuesize + 1;
342       break;
343     case 8:
344       maxdig = radix = 8;
345       too_many_digits = (valuesize + 2) / 3 + 1;
346       break;
347     case 16:
348       maxdig = radix = 16;
349       too_many_digits = (valuesize + 3) / 4 + 1;
350       break;
351     case 10:
352       maxdig = radix = 10;
353       too_many_digits = (valuesize + 11) / 4; /* Very rough.  */
354     }
355 #undef valuesize
356   start = input_line_pointer;
357   c = *input_line_pointer++;
358   for (number = 0;
359        (digit = hex_value (c)) < maxdig;
360        c = *input_line_pointer++)
361     {
362       number = number * radix + digit;
363     }
364   /* c contains character after number.  */
365   /* input_line_pointer->char after c.  */
366   small = (input_line_pointer - start - 1) < too_many_digits;
367
368   if (radix == 16 && c == '_')
369     {
370       /* This is literal of the form 0x333_0_12345678_1.
371          This example is equivalent to 0x00000333000000001234567800000001.  */
372
373       int num_little_digits = 0;
374       int i;
375       input_line_pointer = start;       /* -> 1st digit.  */
376
377       know (LITTLENUM_NUMBER_OF_BITS == 16);
378
379       for (c = '_'; c == '_'; num_little_digits += 2)
380         {
381
382           /* Convert one 64-bit word.  */
383           int ndigit = 0;
384           number = 0;
385           for (c = *input_line_pointer++;
386                (digit = hex_value (c)) < maxdig;
387                c = *(input_line_pointer++))
388             {
389               number = number * radix + digit;
390               ndigit++;
391             }
392
393           /* Check for 8 digit per word max.  */
394           if (ndigit > 8)
395             as_bad (_("a bignum with underscores may not have more than 8 hex digits in any word"));
396
397           /* Add this chunk to the bignum.
398              Shift things down 2 little digits.  */
399           know (LITTLENUM_NUMBER_OF_BITS == 16);
400           for (i = min (num_little_digits + 1, SIZE_OF_LARGE_NUMBER - 1);
401                i >= 2;
402                i--)
403             generic_bignum[i] = generic_bignum[i - 2];
404
405           /* Add the new digits as the least significant new ones.  */
406           generic_bignum[0] = number & 0xffffffff;
407           generic_bignum[1] = number >> 16;
408         }
409
410       /* Again, c is char after number, input_line_pointer->after c.  */
411
412       if (num_little_digits > SIZE_OF_LARGE_NUMBER - 1)
413         num_little_digits = SIZE_OF_LARGE_NUMBER - 1;
414
415       gas_assert (num_little_digits >= 4);
416
417       if (num_little_digits != 8)
418         as_bad (_("a bignum with underscores must have exactly 4 words"));
419
420       /* We might have some leading zeros.  These can be trimmed to give
421          us a change to fit this constant into a small number.  */
422       while (generic_bignum[num_little_digits - 1] == 0
423              && num_little_digits > 1)
424         num_little_digits--;
425
426       if (num_little_digits <= 2)
427         {
428           /* will fit into 32 bits.  */
429           number = generic_bignum_to_int32 ();
430           small = 1;
431         }
432 #ifdef BFD64
433       else if (num_little_digits <= 4)
434         {
435           /* Will fit into 64 bits.  */
436           number = generic_bignum_to_int64 ();
437           small = 1;
438         }
439 #endif
440       else
441         {
442           small = 0;
443
444           /* Number of littlenums in the bignum.  */
445           number = num_little_digits;
446         }
447     }
448   else if (!small)
449     {
450       /* We saw a lot of digits. manufacture a bignum the hard way.  */
451       LITTLENUM_TYPE *leader;   /* -> high order littlenum of the bignum.  */
452       LITTLENUM_TYPE *pointer;  /* -> littlenum we are frobbing now.  */
453       long carry;
454
455       leader = generic_bignum;
456       generic_bignum[0] = 0;
457       generic_bignum[1] = 0;
458       generic_bignum[2] = 0;
459       generic_bignum[3] = 0;
460       input_line_pointer = start;       /* -> 1st digit.  */
461       c = *input_line_pointer++;
462       for (; (carry = hex_value (c)) < maxdig; c = *input_line_pointer++)
463         {
464           for (pointer = generic_bignum; pointer <= leader; pointer++)
465             {
466               long work;
467
468               work = carry + radix * *pointer;
469               *pointer = work & LITTLENUM_MASK;
470               carry = work >> LITTLENUM_NUMBER_OF_BITS;
471             }
472           if (carry)
473             {
474               if (leader < generic_bignum + SIZE_OF_LARGE_NUMBER - 1)
475                 {
476                   /* Room to grow a longer bignum.  */
477                   *++leader = carry;
478                 }
479             }
480         }
481       /* Again, c is char after number.  */
482       /* input_line_pointer -> after c.  */
483       know (LITTLENUM_NUMBER_OF_BITS == 16);
484       if (leader < generic_bignum + 2)
485         {
486           /* Will fit into 32 bits.  */
487           number = generic_bignum_to_int32 ();
488           small = 1;
489         }
490 #ifdef BFD64
491       else if (leader < generic_bignum + 4)
492         {
493           /* Will fit into 64 bits.  */
494           number = generic_bignum_to_int64 ();
495           small = 1;
496         }
497 #endif
498       else
499         {
500           /* Number of littlenums in the bignum.  */
501           number = leader - generic_bignum + 1;
502         }
503     }
504
505   if ((NUMBERS_WITH_SUFFIX || flag_m68k_mri)
506       && suffix != NULL
507       && input_line_pointer - 1 == suffix)
508     c = *input_line_pointer++;
509
510   if (small)
511     {
512       /* Here with number, in correct radix. c is the next char.
513          Note that unlike un*x, we allow "011f" "0x9f" to both mean
514          the same as the (conventional) "9f".
515          This is simply easier than checking for strict canonical
516          form.  Syntax sux!  */
517
518       if (LOCAL_LABELS_FB && c == 'b')
519         {
520           /* Backward ref to local label.
521              Because it is backward, expect it to be defined.  */
522           /* Construct a local label.  */
523           name = fb_label_name ((int) number, 0);
524
525           /* Seen before, or symbol is defined: OK.  */
526           symbolP = symbol_find (name);
527           if ((symbolP != NULL) && (S_IS_DEFINED (symbolP)))
528             {
529               /* Local labels are never absolute.  Don't waste time
530                  checking absoluteness.  */
531               know (SEG_NORMAL (S_GET_SEGMENT (symbolP)));
532
533               expressionP->X_op = O_symbol;
534               expressionP->X_add_symbol = symbolP;
535             }
536           else
537             {
538               /* Either not seen or not defined.  */
539               /* @@ Should print out the original string instead of
540                  the parsed number.  */
541               as_bad (_("backward ref to unknown label \"%d:\""),
542                       (int) number);
543               expressionP->X_op = O_constant;
544             }
545
546           expressionP->X_add_number = 0;
547         }                       /* case 'b' */
548       else if (LOCAL_LABELS_FB && c == 'f')
549         {
550           /* Forward reference.  Expect symbol to be undefined or
551              unknown.  undefined: seen it before.  unknown: never seen
552              it before.
553
554              Construct a local label name, then an undefined symbol.
555              Don't create a xseg frag for it: caller may do that.
556              Just return it as never seen before.  */
557           name = fb_label_name ((int) number, 1);
558           symbolP = symbol_find_or_make (name);
559           /* We have no need to check symbol properties.  */
560 #ifndef many_segments
561           /* Since "know" puts its arg into a "string", we
562              can't have newlines in the argument.  */
563           know (S_GET_SEGMENT (symbolP) == undefined_section || S_GET_SEGMENT (symbolP) == text_section || S_GET_SEGMENT (symbolP) == data_section);
564 #endif
565           expressionP->X_op = O_symbol;
566           expressionP->X_add_symbol = symbolP;
567           expressionP->X_add_number = 0;
568         }                       /* case 'f' */
569       else if (LOCAL_LABELS_DOLLAR && c == '$')
570         {
571           /* If the dollar label is *currently* defined, then this is just
572              another reference to it.  If it is not *currently* defined,
573              then this is a fresh instantiation of that number, so create
574              it.  */
575
576           if (dollar_label_defined ((long) number))
577             {
578               name = dollar_label_name ((long) number, 0);
579               symbolP = symbol_find (name);
580               know (symbolP != NULL);
581             }
582           else
583             {
584               name = dollar_label_name ((long) number, 1);
585               symbolP = symbol_find_or_make (name);
586             }
587
588           expressionP->X_op = O_symbol;
589           expressionP->X_add_symbol = symbolP;
590           expressionP->X_add_number = 0;
591         }                       /* case '$' */
592       else
593         {
594           expressionP->X_op = O_constant;
595           expressionP->X_add_number = number;
596           input_line_pointer--; /* Restore following character.  */
597         }                       /* Really just a number.  */
598     }
599   else
600     {
601       /* Not a small number.  */
602       expressionP->X_op = O_big;
603       expressionP->X_add_number = number;       /* Number of littlenums.  */
604       input_line_pointer--;     /* -> char following number.  */
605     }
606 }
607
608 /* Parse an MRI multi character constant.  */
609
610 static void
611 mri_char_constant (expressionS *expressionP)
612 {
613   int i;
614
615   if (*input_line_pointer == '\''
616       && input_line_pointer[1] != '\'')
617     {
618       expressionP->X_op = O_constant;
619       expressionP->X_add_number = 0;
620       return;
621     }
622
623   /* In order to get the correct byte ordering, we must build the
624      number in reverse.  */
625   for (i = SIZE_OF_LARGE_NUMBER - 1; i >= 0; i--)
626     {
627       int j;
628
629       generic_bignum[i] = 0;
630       for (j = 0; j < CHARS_PER_LITTLENUM; j++)
631         {
632           if (*input_line_pointer == '\'')
633             {
634               if (input_line_pointer[1] != '\'')
635                 break;
636               ++input_line_pointer;
637             }
638           generic_bignum[i] <<= 8;
639           generic_bignum[i] += *input_line_pointer;
640           ++input_line_pointer;
641         }
642
643       if (i < SIZE_OF_LARGE_NUMBER - 1)
644         {
645           /* If there is more than one littlenum, left justify the
646              last one to make it match the earlier ones.  If there is
647              only one, we can just use the value directly.  */
648           for (; j < CHARS_PER_LITTLENUM; j++)
649             generic_bignum[i] <<= 8;
650         }
651
652       if (*input_line_pointer == '\''
653           && input_line_pointer[1] != '\'')
654         break;
655     }
656
657   if (i < 0)
658     {
659       as_bad (_("character constant too large"));
660       i = 0;
661     }
662
663   if (i > 0)
664     {
665       int c;
666       int j;
667
668       c = SIZE_OF_LARGE_NUMBER - i;
669       for (j = 0; j < c; j++)
670         generic_bignum[j] = generic_bignum[i + j];
671       i = c;
672     }
673
674   know (LITTLENUM_NUMBER_OF_BITS == 16);
675   if (i > 2)
676     {
677       expressionP->X_op = O_big;
678       expressionP->X_add_number = i;
679     }
680   else
681     {
682       expressionP->X_op = O_constant;
683       if (i < 2)
684         expressionP->X_add_number = generic_bignum[0] & LITTLENUM_MASK;
685       else
686         expressionP->X_add_number =
687           (((generic_bignum[1] & LITTLENUM_MASK)
688             << LITTLENUM_NUMBER_OF_BITS)
689            | (generic_bignum[0] & LITTLENUM_MASK));
690     }
691
692   /* Skip the final closing quote.  */
693   ++input_line_pointer;
694 }
695
696 /* Return an expression representing the current location.  This
697    handles the magic symbol `.'.  */
698
699 void
700 current_location (expressionS *expressionp)
701 {
702   if (now_seg == absolute_section)
703     {
704       expressionp->X_op = O_constant;
705       expressionp->X_add_number = abs_section_offset;
706     }
707   else
708     {
709       expressionp->X_op = O_symbol;
710       expressionp->X_add_symbol = &dot_symbol;
711       expressionp->X_add_number = 0;
712     }
713 }
714
715 /* In:  Input_line_pointer points to 1st char of operand, which may
716         be a space.
717
718    Out: An expressionS.
719         The operand may have been empty: in this case X_op == O_absent.
720         Input_line_pointer->(next non-blank) char after operand.  */
721
722 static segT
723 operand (expressionS *expressionP, enum expr_mode mode)
724 {
725   char c;
726   symbolS *symbolP;     /* Points to symbol.  */
727   char *name;           /* Points to name of symbol.  */
728   segT segment;
729
730   /* All integers are regarded as unsigned unless they are negated.
731      This is because the only thing which cares whether a number is
732      unsigned is the code in emit_expr which extends constants into
733      bignums.  It should only sign extend negative numbers, so that
734      something like ``.quad 0x80000000'' is not sign extended even
735      though it appears negative if valueT is 32 bits.  */
736   expressionP->X_unsigned = 1;
737   expressionP->X_extrabit = 0;
738
739   /* Digits, assume it is a bignum.  */
740
741   SKIP_WHITESPACE ();           /* Leading whitespace is part of operand.  */
742   c = *input_line_pointer++;    /* input_line_pointer -> past char in c.  */
743
744   if (is_end_of_line[(unsigned char) c])
745     goto eol;
746
747   switch (c)
748     {
749     case '1':
750     case '2':
751     case '3':
752     case '4':
753     case '5':
754     case '6':
755     case '7':
756     case '8':
757     case '9':
758       input_line_pointer--;
759
760       integer_constant ((NUMBERS_WITH_SUFFIX || flag_m68k_mri)
761                         ? 0 : 10,
762                         expressionP);
763       break;
764
765 #ifdef LITERAL_PREFIXDOLLAR_HEX
766     case '$':
767       /* $L is the start of a local label, not a hex constant.  */
768       if (* input_line_pointer == 'L')
769       goto isname;
770       integer_constant (16, expressionP);
771       break;
772 #endif
773
774 #ifdef LITERAL_PREFIXPERCENT_BIN
775     case '%':
776       integer_constant (2, expressionP);
777       break;
778 #endif
779
780     case '0':
781       /* Non-decimal radix.  */
782
783       if (NUMBERS_WITH_SUFFIX || flag_m68k_mri)
784         {
785           char *s;
786
787           /* Check for a hex or float constant.  */
788           for (s = input_line_pointer; hex_p (*s); s++)
789             ;
790           if (*s == 'h' || *s == 'H' || *input_line_pointer == '.')
791             {
792               --input_line_pointer;
793               integer_constant (0, expressionP);
794               break;
795             }
796         }
797       c = *input_line_pointer;
798       switch (c)
799         {
800         case 'o':
801         case 'O':
802         case 'q':
803         case 'Q':
804         case '8':
805         case '9':
806           if (NUMBERS_WITH_SUFFIX || flag_m68k_mri)
807             {
808               integer_constant (0, expressionP);
809               break;
810             }
811           /* Fall through.  */
812         default:
813         default_case:
814           if (c && strchr (FLT_CHARS, c))
815             {
816               input_line_pointer++;
817               floating_constant (expressionP);
818               expressionP->X_add_number = - TOLOWER (c);
819             }
820           else
821             {
822               /* The string was only zero.  */
823               expressionP->X_op = O_constant;
824               expressionP->X_add_number = 0;
825             }
826
827           break;
828
829         case 'x':
830         case 'X':
831           if (flag_m68k_mri)
832             goto default_case;
833           input_line_pointer++;
834           integer_constant (16, expressionP);
835           break;
836
837         case 'b':
838           if (LOCAL_LABELS_FB && ! (flag_m68k_mri || NUMBERS_WITH_SUFFIX))
839             {
840               /* This code used to check for '+' and '-' here, and, in
841                  some conditions, fall through to call
842                  integer_constant.  However, that didn't make sense,
843                  as integer_constant only accepts digits.  */
844               /* Some of our code elsewhere does permit digits greater
845                  than the expected base; for consistency, do the same
846                  here.  */
847               if (input_line_pointer[1] < '0'
848                   || input_line_pointer[1] > '9')
849                 {
850                   /* Parse this as a back reference to label 0.  */
851                   input_line_pointer--;
852                   integer_constant (10, expressionP);
853                   break;
854                 }
855               /* Otherwise, parse this as a binary number.  */
856             }
857           /* Fall through.  */
858         case 'B':
859           input_line_pointer++;
860           if (flag_m68k_mri || NUMBERS_WITH_SUFFIX)
861             goto default_case;
862           integer_constant (2, expressionP);
863           break;
864
865         case '0':
866         case '1':
867         case '2':
868         case '3':
869         case '4':
870         case '5':
871         case '6':
872         case '7':
873           integer_constant ((flag_m68k_mri || NUMBERS_WITH_SUFFIX)
874                             ? 0 : 8,
875                             expressionP);
876           break;
877
878         case 'f':
879           if (LOCAL_LABELS_FB)
880             {
881               /* If it says "0f" and it could possibly be a floating point
882                  number, make it one.  Otherwise, make it a local label,
883                  and try to deal with parsing the rest later.  */
884               if (!input_line_pointer[1]
885                   || (is_end_of_line[0xff & input_line_pointer[1]])
886                   || strchr (FLT_CHARS, 'f') == NULL)
887                 goto is_0f_label;
888               {
889                 char *cp = input_line_pointer + 1;
890                 int r = atof_generic (&cp, ".", EXP_CHARS,
891                                       &generic_floating_point_number);
892                 switch (r)
893                   {
894                   case 0:
895                   case ERROR_EXPONENT_OVERFLOW:
896                     if (*cp == 'f' || *cp == 'b')
897                       /* Looks like a difference expression.  */
898                       goto is_0f_label;
899                     else if (cp == input_line_pointer + 1)
900                       /* No characters has been accepted -- looks like
901                          end of operand.  */
902                       goto is_0f_label;
903                     else
904                       goto is_0f_float;
905                   default:
906                     as_fatal (_("expr.c(operand): bad atof_generic return val %d"),
907                               r);
908                   }
909               }
910
911               /* Okay, now we've sorted it out.  We resume at one of these
912                  two labels, depending on what we've decided we're probably
913                  looking at.  */
914             is_0f_label:
915               input_line_pointer--;
916               integer_constant (10, expressionP);
917               break;
918
919             is_0f_float:
920               /* Fall through.  */
921               ;
922             }
923
924         case 'd':
925         case 'D':
926           if (flag_m68k_mri || NUMBERS_WITH_SUFFIX)
927             {
928               integer_constant (0, expressionP);
929               break;
930             }
931           /* Fall through.  */
932         case 'F':
933         case 'r':
934         case 'e':
935         case 'E':
936         case 'g':
937         case 'G':
938           input_line_pointer++;
939           floating_constant (expressionP);
940           expressionP->X_add_number = - TOLOWER (c);
941           break;
942
943         case '$':
944           if (LOCAL_LABELS_DOLLAR)
945             {
946               integer_constant (10, expressionP);
947               break;
948             }
949           else
950             goto default_case;
951         }
952
953       break;
954
955 #ifndef NEED_INDEX_OPERATOR
956     case '[':
957 # ifdef md_need_index_operator
958       if (md_need_index_operator())
959         goto de_fault;
960 # endif
961       /* FALLTHROUGH */
962 #endif
963     case '(':
964       /* Didn't begin with digit & not a name.  */
965       segment = expr (0, expressionP, mode);
966       /* expression () will pass trailing whitespace.  */
967       if ((c == '(' && *input_line_pointer != ')')
968           || (c == '[' && *input_line_pointer != ']'))
969         as_bad (_("missing '%c'"), c == '(' ? ')' : ']');
970       else
971         input_line_pointer++;
972       SKIP_WHITESPACE ();
973       /* Here with input_line_pointer -> char after "(...)".  */
974       return segment;
975
976 #ifdef TC_M68K
977     case 'E':
978       if (! flag_m68k_mri || *input_line_pointer != '\'')
979         goto de_fault;
980       as_bad (_("EBCDIC constants are not supported"));
981       /* Fall through.  */
982     case 'A':
983       if (! flag_m68k_mri || *input_line_pointer != '\'')
984         goto de_fault;
985       ++input_line_pointer;
986       /* Fall through.  */
987 #endif
988     case '\'':
989       if (! flag_m68k_mri)
990         {
991           /* Warning: to conform to other people's assemblers NO
992              ESCAPEMENT is permitted for a single quote.  The next
993              character, parity errors and all, is taken as the value
994              of the operand.  VERY KINKY.  */
995           expressionP->X_op = O_constant;
996           expressionP->X_add_number = *input_line_pointer++;
997           break;
998         }
999
1000       mri_char_constant (expressionP);
1001       break;
1002
1003 #ifdef TC_M68K
1004     case '"':
1005       /* Double quote is the bitwise not operator in MRI mode.  */
1006       if (! flag_m68k_mri)
1007         goto de_fault;
1008       /* Fall through.  */
1009 #endif
1010     case '~':
1011       /* '~' is permitted to start a label on the Delta.  */
1012       if (is_name_beginner (c))
1013         goto isname;
1014     case '!':
1015     case '-':
1016     case '+':
1017       {
1018 #ifdef md_operator
1019       unary:
1020 #endif
1021         operand (expressionP, mode);
1022         if (expressionP->X_op == O_constant)
1023           {
1024             /* input_line_pointer -> char after operand.  */
1025             if (c == '-')
1026               {
1027                 expressionP->X_add_number = - expressionP->X_add_number;
1028                 /* Notice: '-' may overflow: no warning is given.
1029                    This is compatible with other people's
1030                    assemblers.  Sigh.  */
1031                 expressionP->X_unsigned = 0;
1032                 if (expressionP->X_add_number)
1033                   expressionP->X_extrabit ^= 1;
1034               }
1035             else if (c == '~' || c == '"')
1036               expressionP->X_add_number = ~ expressionP->X_add_number;
1037             else if (c == '!')
1038               expressionP->X_add_number = ! expressionP->X_add_number;
1039           }
1040         else if (expressionP->X_op == O_big
1041                  && expressionP->X_add_number <= 0
1042                  && c == '-'
1043                  && (generic_floating_point_number.sign == '+'
1044                      || generic_floating_point_number.sign == 'P'))
1045           {
1046             /* Negative flonum (eg, -1.000e0).  */
1047             if (generic_floating_point_number.sign == '+')
1048               generic_floating_point_number.sign = '-';
1049             else
1050               generic_floating_point_number.sign = 'N';
1051           }
1052         else if (expressionP->X_op == O_big
1053                  && expressionP->X_add_number > 0)
1054           {
1055             int i;
1056
1057             if (c == '~' || c == '-')
1058               {
1059                 for (i = 0; i < expressionP->X_add_number; ++i)
1060                   generic_bignum[i] = ~generic_bignum[i];
1061
1062                 /* Extend the bignum to at least the size of .octa.  */
1063                 if (expressionP->X_add_number < SIZE_OF_LARGE_NUMBER)
1064                   {
1065                     expressionP->X_add_number = SIZE_OF_LARGE_NUMBER;
1066                     for (; i < expressionP->X_add_number; ++i)
1067                       generic_bignum[i] = ~(LITTLENUM_TYPE) 0;
1068                   }
1069
1070                 if (c == '-')
1071                   for (i = 0; i < expressionP->X_add_number; ++i)
1072                     {
1073                       generic_bignum[i] += 1;
1074                       if (generic_bignum[i])
1075                         break;
1076                     }
1077               }
1078             else if (c == '!')
1079               {
1080                 for (i = 0; i < expressionP->X_add_number; ++i)
1081                   if (generic_bignum[i] != 0)
1082                     break;
1083                 expressionP->X_add_number = i >= expressionP->X_add_number;
1084                 expressionP->X_op = O_constant;
1085                 expressionP->X_unsigned = 1;
1086                 expressionP->X_extrabit = 0;
1087               }
1088           }
1089         else if (expressionP->X_op != O_illegal
1090                  && expressionP->X_op != O_absent)
1091           {
1092             if (c != '+')
1093               {
1094                 expressionP->X_add_symbol = make_expr_symbol (expressionP);
1095                 if (c == '-')
1096                   expressionP->X_op = O_uminus;
1097                 else if (c == '~' || c == '"')
1098                   expressionP->X_op = O_bit_not;
1099                 else
1100                   expressionP->X_op = O_logical_not;
1101                 expressionP->X_add_number = 0;
1102               }
1103           }
1104         else
1105           as_warn (_("Unary operator %c ignored because bad operand follows"),
1106                    c);
1107       }
1108       break;
1109
1110 #if defined (DOLLAR_DOT) || defined (TC_M68K)
1111     case '$':
1112       /* '$' is the program counter when in MRI mode, or when
1113          DOLLAR_DOT is defined.  */
1114 #ifndef DOLLAR_DOT
1115       if (! flag_m68k_mri)
1116         goto de_fault;
1117 #endif
1118       if (DOLLAR_AMBIGU && hex_p (*input_line_pointer))
1119         {
1120           /* In MRI mode and on Z80, '$' is also used as the prefix
1121              for a hexadecimal constant.  */
1122           integer_constant (16, expressionP);
1123           break;
1124         }
1125
1126       if (is_part_of_name (*input_line_pointer))
1127         goto isname;
1128
1129       current_location (expressionP);
1130       break;
1131 #endif
1132
1133     case '.':
1134       if (!is_part_of_name (*input_line_pointer))
1135         {
1136           current_location (expressionP);
1137           break;
1138         }
1139       else if ((strncasecmp (input_line_pointer, "startof.", 8) == 0
1140                 && ! is_part_of_name (input_line_pointer[8]))
1141                || (strncasecmp (input_line_pointer, "sizeof.", 7) == 0
1142                    && ! is_part_of_name (input_line_pointer[7])))
1143         {
1144           int start;
1145
1146           start = (input_line_pointer[1] == 't'
1147                    || input_line_pointer[1] == 'T');
1148           input_line_pointer += start ? 8 : 7;
1149           SKIP_WHITESPACE ();
1150           if (*input_line_pointer != '(')
1151             as_bad (_("syntax error in .startof. or .sizeof."));
1152           else
1153             {
1154               char *buf;
1155
1156               ++input_line_pointer;
1157               SKIP_WHITESPACE ();
1158               name = input_line_pointer;
1159               c = get_symbol_end ();
1160
1161               buf = (char *) xmalloc (strlen (name) + 10);
1162               if (start)
1163                 sprintf (buf, ".startof.%s", name);
1164               else
1165                 sprintf (buf, ".sizeof.%s", name);
1166               symbolP = symbol_make (buf);
1167               free (buf);
1168
1169               expressionP->X_op = O_symbol;
1170               expressionP->X_add_symbol = symbolP;
1171               expressionP->X_add_number = 0;
1172
1173               *input_line_pointer = c;
1174               SKIP_WHITESPACE ();
1175               if (*input_line_pointer != ')')
1176                 as_bad (_("syntax error in .startof. or .sizeof."));
1177               else
1178                 ++input_line_pointer;
1179             }
1180           break;
1181         }
1182       else
1183         {
1184           goto isname;
1185         }
1186
1187     case ',':
1188     eol:
1189       /* Can't imagine any other kind of operand.  */
1190       expressionP->X_op = O_absent;
1191       input_line_pointer--;
1192       break;
1193
1194 #ifdef TC_M68K
1195     case '%':
1196       if (! flag_m68k_mri)
1197         goto de_fault;
1198       integer_constant (2, expressionP);
1199       break;
1200
1201     case '@':
1202       if (! flag_m68k_mri)
1203         goto de_fault;
1204       integer_constant (8, expressionP);
1205       break;
1206
1207     case ':':
1208       if (! flag_m68k_mri)
1209         goto de_fault;
1210
1211       /* In MRI mode, this is a floating point constant represented
1212          using hexadecimal digits.  */
1213
1214       ++input_line_pointer;
1215       integer_constant (16, expressionP);
1216       break;
1217
1218     case '*':
1219       if (! flag_m68k_mri || is_part_of_name (*input_line_pointer))
1220         goto de_fault;
1221
1222       current_location (expressionP);
1223       break;
1224 #endif
1225
1226     default:
1227 #if defined(md_need_index_operator) || defined(TC_M68K)
1228     de_fault:
1229 #endif
1230       if (is_name_beginner (c)) /* Here if did not begin with a digit.  */
1231         {
1232           /* Identifier begins here.
1233              This is kludged for speed, so code is repeated.  */
1234         isname:
1235           name = --input_line_pointer;
1236           c = get_symbol_end ();
1237
1238 #ifdef md_operator
1239           {
1240             operatorT op = md_operator (name, 1, &c);
1241
1242             switch (op)
1243               {
1244               case O_uminus:
1245                 *input_line_pointer = c;
1246                 c = '-';
1247                 goto unary;
1248               case O_bit_not:
1249                 *input_line_pointer = c;
1250                 c = '~';
1251                 goto unary;
1252               case O_logical_not:
1253                 *input_line_pointer = c;
1254                 c = '!';
1255                 goto unary;
1256               case O_illegal:
1257                 as_bad (_("invalid use of operator \"%s\""), name);
1258                 break;
1259               default:
1260                 break;
1261               }
1262             if (op != O_absent && op != O_illegal)
1263               {
1264                 *input_line_pointer = c;
1265                 expr (9, expressionP, mode);
1266                 expressionP->X_add_symbol = make_expr_symbol (expressionP);
1267                 expressionP->X_op_symbol = NULL;
1268                 expressionP->X_add_number = 0;
1269                 expressionP->X_op = op;
1270                 break;
1271               }
1272           }
1273 #endif
1274
1275 #ifdef md_parse_name
1276           /* This is a hook for the backend to parse certain names
1277              specially in certain contexts.  If a name always has a
1278              specific value, it can often be handled by simply
1279              entering it in the symbol table.  */
1280           if (md_parse_name (name, expressionP, mode, &c))
1281             {
1282               *input_line_pointer = c;
1283               break;
1284             }
1285 #endif
1286
1287 #ifdef TC_I960
1288           /* The MRI i960 assembler permits
1289                  lda sizeof code,g13
1290              FIXME: This should use md_parse_name.  */
1291           if (flag_mri
1292               && (strcasecmp (name, "sizeof") == 0
1293                   || strcasecmp (name, "startof") == 0))
1294             {
1295               int start;
1296               char *buf;
1297
1298               start = (name[1] == 't'
1299                        || name[1] == 'T');
1300
1301               *input_line_pointer = c;
1302               SKIP_WHITESPACE ();
1303
1304               name = input_line_pointer;
1305               c = get_symbol_end ();
1306
1307               buf = (char *) xmalloc (strlen (name) + 10);
1308               if (start)
1309                 sprintf (buf, ".startof.%s", name);
1310               else
1311                 sprintf (buf, ".sizeof.%s", name);
1312               symbolP = symbol_make (buf);
1313               free (buf);
1314
1315               expressionP->X_op = O_symbol;
1316               expressionP->X_add_symbol = symbolP;
1317               expressionP->X_add_number = 0;
1318
1319               *input_line_pointer = c;
1320               SKIP_WHITESPACE ();
1321
1322               break;
1323             }
1324 #endif
1325
1326           symbolP = symbol_find_or_make (name);
1327
1328           /* If we have an absolute symbol or a reg, then we know its
1329              value now.  */
1330           segment = S_GET_SEGMENT (symbolP);
1331           if (mode != expr_defer
1332               && segment == absolute_section
1333               && !S_FORCE_RELOC (symbolP, 0))
1334             {
1335               expressionP->X_op = O_constant;
1336               expressionP->X_add_number = S_GET_VALUE (symbolP);
1337             }
1338           else if (mode != expr_defer && segment == reg_section)
1339             {
1340               expressionP->X_op = O_register;
1341               expressionP->X_add_number = S_GET_VALUE (symbolP);
1342             }
1343           else
1344             {
1345               expressionP->X_op = O_symbol;
1346               expressionP->X_add_symbol = symbolP;
1347               expressionP->X_add_number = 0;
1348             }
1349           *input_line_pointer = c;
1350         }
1351       else
1352         {
1353           /* Let the target try to parse it.  Success is indicated by changing
1354              the X_op field to something other than O_absent and pointing
1355              input_line_pointer past the expression.  If it can't parse the
1356              expression, X_op and input_line_pointer should be unchanged.  */
1357           expressionP->X_op = O_absent;
1358           --input_line_pointer;
1359           md_operand (expressionP);
1360           if (expressionP->X_op == O_absent)
1361             {
1362               ++input_line_pointer;
1363               as_bad (_("bad expression"));
1364               expressionP->X_op = O_constant;
1365               expressionP->X_add_number = 0;
1366             }
1367         }
1368       break;
1369     }
1370
1371   /* It is more 'efficient' to clean up the expressionS when they are
1372      created.  Doing it here saves lines of code.  */
1373   clean_up_expression (expressionP);
1374   SKIP_WHITESPACE ();           /* -> 1st char after operand.  */
1375   know (*input_line_pointer != ' ');
1376
1377   /* The PA port needs this information.  */
1378   if (expressionP->X_add_symbol)
1379     symbol_mark_used (expressionP->X_add_symbol);
1380
1381   if (mode != expr_defer)
1382     {
1383       expressionP->X_add_symbol
1384         = symbol_clone_if_forward_ref (expressionP->X_add_symbol);
1385       expressionP->X_op_symbol
1386         = symbol_clone_if_forward_ref (expressionP->X_op_symbol);
1387     }
1388
1389   switch (expressionP->X_op)
1390     {
1391     default:
1392       return absolute_section;
1393     case O_symbol:
1394       return S_GET_SEGMENT (expressionP->X_add_symbol);
1395     case O_register:
1396       return reg_section;
1397     }
1398 }
1399 \f
1400 /* Internal.  Simplify a struct expression for use by expr ().  */
1401
1402 /* In:  address of an expressionS.
1403         The X_op field of the expressionS may only take certain values.
1404         Elsewise we waste time special-case testing. Sigh. Ditto SEG_ABSENT.
1405
1406    Out: expressionS may have been modified:
1407         Unused fields zeroed to help expr ().  */
1408
1409 static void
1410 clean_up_expression (expressionS *expressionP)
1411 {
1412   switch (expressionP->X_op)
1413     {
1414     case O_illegal:
1415     case O_absent:
1416       expressionP->X_add_number = 0;
1417       /* Fall through.  */
1418     case O_big:
1419     case O_constant:
1420     case O_register:
1421       expressionP->X_add_symbol = NULL;
1422       /* Fall through.  */
1423     case O_symbol:
1424     case O_uminus:
1425     case O_bit_not:
1426       expressionP->X_op_symbol = NULL;
1427       break;
1428     default:
1429       break;
1430     }
1431 }
1432 \f
1433 /* Expression parser.  */
1434
1435 /* We allow an empty expression, and just assume (absolute,0) silently.
1436    Unary operators and parenthetical expressions are treated as operands.
1437    As usual, Q==quantity==operand, O==operator, X==expression mnemonics.
1438
1439    We used to do an aho/ullman shift-reduce parser, but the logic got so
1440    warped that I flushed it and wrote a recursive-descent parser instead.
1441    Now things are stable, would anybody like to write a fast parser?
1442    Most expressions are either register (which does not even reach here)
1443    or 1 symbol. Then "symbol+constant" and "symbol-symbol" are common.
1444    So I guess it doesn't really matter how inefficient more complex expressions
1445    are parsed.
1446
1447    After expr(RANK,resultP) input_line_pointer->operator of rank <= RANK.
1448    Also, we have consumed any leading or trailing spaces (operand does that)
1449    and done all intervening operators.
1450
1451    This returns the segment of the result, which will be
1452    absolute_section or the segment of a symbol.  */
1453
1454 #undef __
1455 #define __ O_illegal
1456 #ifndef O_SINGLE_EQ
1457 #define O_SINGLE_EQ O_illegal
1458 #endif
1459
1460 /* Maps ASCII -> operators.  */
1461 static const operatorT op_encoding[256] = {
1462   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1463   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1464
1465   __, O_bit_or_not, __, __, __, O_modulus, O_bit_and, __,
1466   __, __, O_multiply, O_add, __, O_subtract, __, O_divide,
1467   __, __, __, __, __, __, __, __,
1468   __, __, __, __, O_lt, O_SINGLE_EQ, O_gt, __,
1469   __, __, __, __, __, __, __, __,
1470   __, __, __, __, __, __, __, __,
1471   __, __, __, __, __, __, __, __,
1472   __, __, __,
1473 #ifdef NEED_INDEX_OPERATOR
1474   O_index,
1475 #else
1476   __,
1477 #endif
1478   __, __, O_bit_exclusive_or, __,
1479   __, __, __, __, __, __, __, __,
1480   __, __, __, __, __, __, __, __,
1481   __, __, __, __, __, __, __, __,
1482   __, __, __, __, O_bit_inclusive_or, __, __, __,
1483
1484   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1485   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1486   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1487   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1488   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1489   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1490   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
1491   __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
1492 };
1493
1494 /* Rank Examples
1495    0    operand, (expression)
1496    1    ||
1497    2    &&
1498    3    == <> < <= >= >
1499    4    + -
1500    5    used for * / % in MRI mode
1501    6    & ^ ! |
1502    7    * / % << >>
1503    8    unary - unary ~
1504 */
1505 static operator_rankT op_rank[O_max] = {
1506   0,    /* O_illegal */
1507   0,    /* O_absent */
1508   0,    /* O_constant */
1509   0,    /* O_symbol */
1510   0,    /* O_symbol_rva */
1511   0,    /* O_register */
1512   0,    /* O_big */
1513   9,    /* O_uminus */
1514   9,    /* O_bit_not */
1515   9,    /* O_logical_not */
1516   8,    /* O_multiply */
1517   8,    /* O_divide */
1518   8,    /* O_modulus */
1519   8,    /* O_left_shift */
1520   8,    /* O_right_shift */
1521   7,    /* O_bit_inclusive_or */
1522   7,    /* O_bit_or_not */
1523   7,    /* O_bit_exclusive_or */
1524   7,    /* O_bit_and */
1525   5,    /* O_add */
1526   5,    /* O_subtract */
1527   4,    /* O_eq */
1528   4,    /* O_ne */
1529   4,    /* O_lt */
1530   4,    /* O_le */
1531   4,    /* O_ge */
1532   4,    /* O_gt */
1533   3,    /* O_logical_and */
1534   2,    /* O_logical_or */
1535   1,    /* O_index */
1536 };
1537
1538 /* Unfortunately, in MRI mode for the m68k, multiplication and
1539    division have lower precedence than the bit wise operators.  This
1540    function sets the operator precedences correctly for the current
1541    mode.  Also, MRI uses a different bit_not operator, and this fixes
1542    that as well.  */
1543
1544 #define STANDARD_MUL_PRECEDENCE 8
1545 #define MRI_MUL_PRECEDENCE 6
1546
1547 void
1548 expr_set_precedence (void)
1549 {
1550   if (flag_m68k_mri)
1551     {
1552       op_rank[O_multiply] = MRI_MUL_PRECEDENCE;
1553       op_rank[O_divide] = MRI_MUL_PRECEDENCE;
1554       op_rank[O_modulus] = MRI_MUL_PRECEDENCE;
1555     }
1556   else
1557     {
1558       op_rank[O_multiply] = STANDARD_MUL_PRECEDENCE;
1559       op_rank[O_divide] = STANDARD_MUL_PRECEDENCE;
1560       op_rank[O_modulus] = STANDARD_MUL_PRECEDENCE;
1561     }
1562 }
1563
1564 void
1565 expr_set_rank (operatorT op, operator_rankT rank)
1566 {
1567   gas_assert (op >= O_md1 && op < ARRAY_SIZE (op_rank));
1568   op_rank[op] = rank;
1569 }
1570
1571 /* Initialize the expression parser.  */
1572
1573 void
1574 expr_begin (void)
1575 {
1576   expr_set_precedence ();
1577
1578   /* Verify that X_op field is wide enough.  */
1579   {
1580     expressionS e;
1581     e.X_op = O_max;
1582     gas_assert (e.X_op == O_max);
1583   }
1584 }
1585 \f
1586 /* Return the encoding for the operator at INPUT_LINE_POINTER, and
1587    sets NUM_CHARS to the number of characters in the operator.
1588    Does not advance INPUT_LINE_POINTER.  */
1589
1590 static inline operatorT
1591 operatorf (int *num_chars)
1592 {
1593   int c;
1594   operatorT ret;
1595
1596   c = *input_line_pointer & 0xff;
1597   *num_chars = 1;
1598
1599   if (is_end_of_line[c])
1600     return O_illegal;
1601
1602 #ifdef md_operator
1603   if (is_name_beginner (c))
1604     {
1605       char *name = input_line_pointer;
1606       char ec = get_symbol_end ();
1607
1608       ret = md_operator (name, 2, &ec);
1609       switch (ret)
1610         {
1611         case O_absent:
1612           *input_line_pointer = ec;
1613           input_line_pointer = name;
1614           break;
1615         case O_uminus:
1616         case O_bit_not:
1617         case O_logical_not:
1618           as_bad (_("invalid use of operator \"%s\""), name);
1619           ret = O_illegal;
1620           /* FALLTHROUGH */
1621         default:
1622           *input_line_pointer = ec;
1623           *num_chars = input_line_pointer - name;
1624           input_line_pointer = name;
1625           return ret;
1626         }
1627     }
1628 #endif
1629
1630   switch (c)
1631     {
1632     default:
1633       ret = op_encoding[c];
1634 #ifdef md_operator
1635       if (ret == O_illegal)
1636         {
1637           char *start = input_line_pointer;
1638
1639           ret = md_operator (NULL, 2, NULL);
1640           if (ret != O_illegal)
1641             *num_chars = input_line_pointer - start;
1642           input_line_pointer = start;
1643         }
1644 #endif
1645       return ret;
1646
1647     case '+':
1648     case '-':
1649       return op_encoding[c];
1650
1651     case '<':
1652       switch (input_line_pointer[1])
1653         {
1654         default:
1655           return op_encoding[c];
1656         case '<':
1657           ret = O_left_shift;
1658           break;
1659         case '>':
1660           ret = O_ne;
1661           break;
1662         case '=':
1663           ret = O_le;
1664           break;
1665         }
1666       *num_chars = 2;
1667       return ret;
1668
1669     case '=':
1670       if (input_line_pointer[1] != '=')
1671         return op_encoding[c];
1672
1673       *num_chars = 2;
1674       return O_eq;
1675
1676     case '>':
1677       switch (input_line_pointer[1])
1678         {
1679         default:
1680           return op_encoding[c];
1681         case '>':
1682           ret = O_right_shift;
1683           break;
1684         case '=':
1685           ret = O_ge;
1686           break;
1687         }
1688       *num_chars = 2;
1689       return ret;
1690
1691     case '!':
1692       switch (input_line_pointer[1])
1693         {
1694         case '!':
1695           /* We accept !! as equivalent to ^ for MRI compatibility. */
1696           *num_chars = 2;
1697           return O_bit_exclusive_or;
1698         case '=':
1699           /* We accept != as equivalent to <>.  */
1700           *num_chars = 2;
1701           return O_ne;
1702         default:
1703           if (flag_m68k_mri)
1704             return O_bit_inclusive_or;
1705           return op_encoding[c];
1706         }
1707
1708     case '|':
1709       if (input_line_pointer[1] != '|')
1710         return op_encoding[c];
1711
1712       *num_chars = 2;
1713       return O_logical_or;
1714
1715     case '&':
1716       if (input_line_pointer[1] != '&')
1717         return op_encoding[c];
1718
1719       *num_chars = 2;
1720       return O_logical_and;
1721     }
1722
1723   /* NOTREACHED  */
1724 }
1725
1726 /* Implement "word-size + 1 bit" addition for
1727    {resultP->X_extrabit:resultP->X_add_number} + {rhs_highbit:amount}.  This
1728    is used so that the full range of unsigned word values and the full range of
1729    signed word values can be represented in an O_constant expression, which is
1730    useful e.g. for .sleb128 directives.  */
1731
1732 void
1733 add_to_result (expressionS *resultP, offsetT amount, int rhs_highbit)
1734 {
1735   valueT ures = resultP->X_add_number;
1736   valueT uamount = amount;
1737
1738   resultP->X_add_number += amount;
1739
1740   resultP->X_extrabit ^= rhs_highbit;
1741
1742   if (ures + uamount < ures)
1743     resultP->X_extrabit ^= 1;
1744 }
1745
1746 /* Similarly, for subtraction.  */
1747
1748 void
1749 subtract_from_result (expressionS *resultP, offsetT amount, int rhs_highbit)
1750 {
1751   valueT ures = resultP->X_add_number;
1752   valueT uamount = amount;
1753
1754   resultP->X_add_number -= amount;
1755
1756   resultP->X_extrabit ^= rhs_highbit;
1757
1758   if (ures < uamount)
1759     resultP->X_extrabit ^= 1;
1760 }
1761
1762 /* Parse an expression.  */
1763
1764 segT
1765 expr (int rankarg,              /* Larger # is higher rank.  */
1766       expressionS *resultP,     /* Deliver result here.  */
1767       enum expr_mode mode       /* Controls behavior.  */)
1768 {
1769   operator_rankT rank = (operator_rankT) rankarg;
1770   segT retval;
1771   expressionS right;
1772   operatorT op_left;
1773   operatorT op_right;
1774   int op_chars;
1775
1776   know (rankarg >= 0);
1777
1778   /* Save the value of dot for the fixup code.  */
1779   if (rank == 0)
1780     {
1781       dot_value = frag_now_fix ();
1782       dot_frag = frag_now;
1783     }
1784
1785   retval = operand (resultP, mode);
1786
1787   /* operand () gobbles spaces.  */
1788   know (*input_line_pointer != ' ');
1789
1790   op_left = operatorf (&op_chars);
1791   while (op_left != O_illegal && op_rank[(int) op_left] > rank)
1792     {
1793       segT rightseg;
1794       offsetT frag_off;
1795
1796       input_line_pointer += op_chars;   /* -> after operator.  */
1797
1798       right.X_md = 0;
1799       rightseg = expr (op_rank[(int) op_left], &right, mode);
1800       if (right.X_op == O_absent)
1801         {
1802           as_warn (_("missing operand; zero assumed"));
1803           right.X_op = O_constant;
1804           right.X_add_number = 0;
1805           right.X_add_symbol = NULL;
1806           right.X_op_symbol = NULL;
1807         }
1808
1809       know (*input_line_pointer != ' ');
1810
1811       if (op_left == O_index)
1812         {
1813           if (*input_line_pointer != ']')
1814             as_bad ("missing right bracket");
1815           else
1816             {
1817               ++input_line_pointer;
1818               SKIP_WHITESPACE ();
1819             }
1820         }
1821
1822       op_right = operatorf (&op_chars);
1823
1824       know (op_right == O_illegal || op_left == O_index
1825             || op_rank[(int) op_right] <= op_rank[(int) op_left]);
1826       know ((int) op_left >= (int) O_multiply);
1827 #ifndef md_operator
1828       know ((int) op_left <= (int) O_index);
1829 #else
1830       know ((int) op_left < (int) O_max);
1831 #endif
1832
1833       /* input_line_pointer->after right-hand quantity.  */
1834       /* left-hand quantity in resultP.  */
1835       /* right-hand quantity in right.  */
1836       /* operator in op_left.  */
1837
1838       if (resultP->X_op == O_big)
1839         {
1840           if (resultP->X_add_number > 0)
1841             as_warn (_("left operand is a bignum; integer 0 assumed"));
1842           else
1843             as_warn (_("left operand is a float; integer 0 assumed"));
1844           resultP->X_op = O_constant;
1845           resultP->X_add_number = 0;
1846           resultP->X_add_symbol = NULL;
1847           resultP->X_op_symbol = NULL;
1848         }
1849       if (right.X_op == O_big)
1850         {
1851           if (right.X_add_number > 0)
1852             as_warn (_("right operand is a bignum; integer 0 assumed"));
1853           else
1854             as_warn (_("right operand is a float; integer 0 assumed"));
1855           right.X_op = O_constant;
1856           right.X_add_number = 0;
1857           right.X_add_symbol = NULL;
1858           right.X_op_symbol = NULL;
1859         }
1860
1861       /* Optimize common cases.  */
1862 #ifdef md_optimize_expr
1863       if (md_optimize_expr (resultP, op_left, &right))
1864         {
1865           /* Skip.  */
1866           ;
1867         }
1868       else
1869 #endif
1870 #ifndef md_register_arithmetic
1871 # define md_register_arithmetic 1
1872 #endif
1873       if (op_left == O_add && right.X_op == O_constant
1874           && (md_register_arithmetic || resultP->X_op != O_register))
1875         {
1876           /* X + constant.  */
1877           add_to_result (resultP, right.X_add_number, right.X_extrabit);
1878         }
1879       /* This case comes up in PIC code.  */
1880       else if (op_left == O_subtract
1881                && right.X_op == O_symbol
1882                && resultP->X_op == O_symbol
1883                && retval == rightseg
1884 #ifdef md_allow_local_subtract
1885                && md_allow_local_subtract (resultP, & right, rightseg)
1886 #endif
1887                && ((SEG_NORMAL (rightseg)
1888                     && !S_FORCE_RELOC (resultP->X_add_symbol, 0)
1889                     && !S_FORCE_RELOC (right.X_add_symbol, 0))
1890                    || right.X_add_symbol == resultP->X_add_symbol)
1891                && frag_offset_fixed_p (symbol_get_frag (resultP->X_add_symbol),
1892                                        symbol_get_frag (right.X_add_symbol),
1893                                        &frag_off))
1894         {
1895           offsetT symval_diff = S_GET_VALUE (resultP->X_add_symbol)
1896                                 - S_GET_VALUE (right.X_add_symbol);
1897           subtract_from_result (resultP, right.X_add_number, right.X_extrabit);
1898           subtract_from_result (resultP, frag_off / OCTETS_PER_BYTE, 0);
1899           add_to_result (resultP, symval_diff, symval_diff < 0);
1900           resultP->X_op = O_constant;
1901           resultP->X_add_symbol = 0;
1902         }
1903       else if (op_left == O_subtract && right.X_op == O_constant
1904                && (md_register_arithmetic || resultP->X_op != O_register))
1905         {
1906           /* X - constant.  */
1907           subtract_from_result (resultP, right.X_add_number, right.X_extrabit);
1908         }
1909       else if (op_left == O_add && resultP->X_op == O_constant
1910                && (md_register_arithmetic || right.X_op != O_register))
1911         {
1912           /* Constant + X.  */
1913           resultP->X_op = right.X_op;
1914           resultP->X_add_symbol = right.X_add_symbol;
1915           resultP->X_op_symbol = right.X_op_symbol;
1916           add_to_result (resultP, right.X_add_number, right.X_extrabit);
1917           retval = rightseg;
1918         }
1919       else if (resultP->X_op == O_constant && right.X_op == O_constant)
1920         {
1921           /* Constant OP constant.  */
1922           offsetT v = right.X_add_number;
1923           if (v == 0 && (op_left == O_divide || op_left == O_modulus))
1924             {
1925               as_warn (_("division by zero"));
1926               v = 1;
1927             }
1928           if ((valueT) v >= sizeof(valueT) * CHAR_BIT
1929               && (op_left == O_left_shift || op_left == O_right_shift))
1930             {
1931               as_warn_value_out_of_range (_("shift count"), v, 0,
1932                                           sizeof(valueT) * CHAR_BIT - 1,
1933                                           NULL, 0);
1934               resultP->X_add_number = v = 0;
1935             }
1936           switch (op_left)
1937             {
1938             default:                    goto general;
1939             case O_multiply:            resultP->X_add_number *= v; break;
1940             case O_divide:              resultP->X_add_number /= v; break;
1941             case O_modulus:             resultP->X_add_number %= v; break;
1942             case O_left_shift:          resultP->X_add_number <<= v; break;
1943             case O_right_shift:
1944               /* We always use unsigned shifts, to avoid relying on
1945                  characteristics of the compiler used to compile gas.  */
1946               resultP->X_add_number =
1947                 (offsetT) ((valueT) resultP->X_add_number >> (valueT) v);
1948               break;
1949             case O_bit_inclusive_or:    resultP->X_add_number |= v; break;
1950             case O_bit_or_not:          resultP->X_add_number |= ~v; break;
1951             case O_bit_exclusive_or:    resultP->X_add_number ^= v; break;
1952             case O_bit_and:             resultP->X_add_number &= v; break;
1953               /* Constant + constant (O_add) is handled by the
1954                  previous if statement for constant + X, so is omitted
1955                  here.  */
1956             case O_subtract:
1957               subtract_from_result (resultP, v, 0);
1958               break;
1959             case O_eq:
1960               resultP->X_add_number =
1961                 resultP->X_add_number == v ? ~ (offsetT) 0 : 0;
1962               break;
1963             case O_ne:
1964               resultP->X_add_number =
1965                 resultP->X_add_number != v ? ~ (offsetT) 0 : 0;
1966               break;
1967             case O_lt:
1968               resultP->X_add_number =
1969                 resultP->X_add_number <  v ? ~ (offsetT) 0 : 0;
1970               break;
1971             case O_le:
1972               resultP->X_add_number =
1973                 resultP->X_add_number <= v ? ~ (offsetT) 0 : 0;
1974               break;
1975             case O_ge:
1976               resultP->X_add_number =
1977                 resultP->X_add_number >= v ? ~ (offsetT) 0 : 0;
1978               break;
1979             case O_gt:
1980               resultP->X_add_number =
1981                 resultP->X_add_number >  v ? ~ (offsetT) 0 : 0;
1982               break;
1983             case O_logical_and:
1984               resultP->X_add_number = resultP->X_add_number && v;
1985               break;
1986             case O_logical_or:
1987               resultP->X_add_number = resultP->X_add_number || v;
1988               break;
1989             }
1990         }
1991       else if (resultP->X_op == O_symbol
1992                && right.X_op == O_symbol
1993                && (op_left == O_add
1994                    || op_left == O_subtract
1995                    || (resultP->X_add_number == 0
1996                        && right.X_add_number == 0)))
1997         {
1998           /* Symbol OP symbol.  */
1999           resultP->X_op = op_left;
2000           resultP->X_op_symbol = right.X_add_symbol;
2001           if (op_left == O_add)
2002             add_to_result (resultP, right.X_add_number, right.X_extrabit);
2003           else if (op_left == O_subtract)
2004             {
2005               subtract_from_result (resultP, right.X_add_number,
2006                                     right.X_extrabit);
2007               if (retval == rightseg
2008                   && SEG_NORMAL (retval)
2009                   && !S_FORCE_RELOC (resultP->X_add_symbol, 0)
2010                   && !S_FORCE_RELOC (right.X_add_symbol, 0))
2011                 {
2012                   retval = absolute_section;
2013                   rightseg = absolute_section;
2014                 }
2015             }
2016         }
2017       else
2018         {
2019         general:
2020           /* The general case.  */
2021           resultP->X_add_symbol = make_expr_symbol (resultP);
2022           resultP->X_op_symbol = make_expr_symbol (&right);
2023           resultP->X_op = op_left;
2024           resultP->X_add_number = 0;
2025           resultP->X_unsigned = 1;
2026           resultP->X_extrabit = 0;
2027         }
2028
2029       if (retval != rightseg)
2030         {
2031           if (retval == undefined_section)
2032             ;
2033           else if (rightseg == undefined_section)
2034             retval = rightseg;
2035           else if (retval == expr_section)
2036             ;
2037           else if (rightseg == expr_section)
2038             retval = rightseg;
2039           else if (retval == reg_section)
2040             ;
2041           else if (rightseg == reg_section)
2042             retval = rightseg;
2043           else if (rightseg == absolute_section)
2044             ;
2045           else if (retval == absolute_section)
2046             retval = rightseg;
2047 #ifdef DIFF_EXPR_OK
2048           else if (op_left == O_subtract)
2049             ;
2050 #endif
2051           else
2052             as_bad (_("operation combines symbols in different segments"));
2053         }
2054
2055       op_left = op_right;
2056     }                           /* While next operator is >= this rank.  */
2057
2058   /* The PA port needs this information.  */
2059   if (resultP->X_add_symbol)
2060     symbol_mark_used (resultP->X_add_symbol);
2061
2062   if (rank == 0 && mode == expr_evaluate)
2063     resolve_expression (resultP);
2064
2065   return resultP->X_op == O_constant ? absolute_section : retval;
2066 }
2067
2068 /* Resolve an expression without changing any symbols/sub-expressions
2069    used.  */
2070
2071 int
2072 resolve_expression (expressionS *expressionP)
2073 {
2074   /* Help out with CSE.  */
2075   valueT final_val = expressionP->X_add_number;
2076   symbolS *add_symbol = expressionP->X_add_symbol;
2077   symbolS *orig_add_symbol = add_symbol;
2078   symbolS *op_symbol = expressionP->X_op_symbol;
2079   operatorT op = expressionP->X_op;
2080   valueT left, right;
2081   segT seg_left, seg_right;
2082   fragS *frag_left, *frag_right;
2083   offsetT frag_off;
2084
2085   switch (op)
2086     {
2087     default:
2088       return 0;
2089
2090     case O_constant:
2091     case O_register:
2092       left = 0;
2093       break;
2094
2095     case O_symbol:
2096     case O_symbol_rva:
2097       if (!snapshot_symbol (&add_symbol, &left, &seg_left, &frag_left))
2098         return 0;
2099
2100       break;
2101
2102     case O_uminus:
2103     case O_bit_not:
2104     case O_logical_not:
2105       if (!snapshot_symbol (&add_symbol, &left, &seg_left, &frag_left))
2106         return 0;
2107
2108       if (seg_left != absolute_section)
2109         return 0;
2110
2111       if (op == O_logical_not)
2112         left = !left;
2113       else if (op == O_uminus)
2114         left = -left;
2115       else
2116         left = ~left;
2117       op = O_constant;
2118       break;
2119
2120     case O_multiply:
2121     case O_divide:
2122     case O_modulus:
2123     case O_left_shift:
2124     case O_right_shift:
2125     case O_bit_inclusive_or:
2126     case O_bit_or_not:
2127     case O_bit_exclusive_or:
2128     case O_bit_and:
2129     case O_add:
2130     case O_subtract:
2131     case O_eq:
2132     case O_ne:
2133     case O_lt:
2134     case O_le:
2135     case O_ge:
2136     case O_gt:
2137     case O_logical_and:
2138     case O_logical_or:
2139       if (!snapshot_symbol (&add_symbol, &left, &seg_left, &frag_left)
2140           || !snapshot_symbol (&op_symbol, &right, &seg_right, &frag_right))
2141         return 0;
2142
2143       /* Simplify addition or subtraction of a constant by folding the
2144          constant into X_add_number.  */
2145       if (op == O_add)
2146         {
2147           if (seg_right == absolute_section)
2148             {
2149               final_val += right;
2150               op = O_symbol;
2151               break;
2152             }
2153           else if (seg_left == absolute_section)
2154             {
2155               final_val += left;
2156               left = right;
2157               seg_left = seg_right;
2158               add_symbol = op_symbol;
2159               orig_add_symbol = expressionP->X_op_symbol;
2160               op = O_symbol;
2161               break;
2162             }
2163         }
2164       else if (op == O_subtract)
2165         {
2166           if (seg_right == absolute_section)
2167             {
2168               final_val -= right;
2169               op = O_symbol;
2170               break;
2171             }
2172         }
2173
2174       /* Equality and non-equality tests are permitted on anything.
2175          Subtraction, and other comparison operators are permitted if
2176          both operands are in the same section.
2177          Shifts by constant zero are permitted on anything.
2178          Multiplies, bit-ors, and bit-ands with constant zero are
2179          permitted on anything.
2180          Multiplies and divides by constant one are permitted on
2181          anything.
2182          Binary operations with both operands being the same register
2183          or undefined symbol are permitted if the result doesn't depend
2184          on the input value.
2185          Otherwise, both operands must be absolute.  We already handled
2186          the case of addition or subtraction of a constant above.  */
2187       frag_off = 0;
2188       if (!(seg_left == absolute_section
2189                && seg_right == absolute_section)
2190           && !(op == O_eq || op == O_ne)
2191           && !((op == O_subtract
2192                 || op == O_lt || op == O_le || op == O_ge || op == O_gt)
2193                && seg_left == seg_right
2194                && (finalize_syms
2195                    || frag_offset_fixed_p (frag_left, frag_right, &frag_off))
2196                && (seg_left != reg_section || left == right)
2197                && (seg_left != undefined_section || add_symbol == op_symbol)))
2198         {
2199           if ((seg_left == absolute_section && left == 0)
2200               || (seg_right == absolute_section && right == 0))
2201             {
2202               if (op == O_bit_exclusive_or || op == O_bit_inclusive_or)
2203                 {
2204                   if (!(seg_right == absolute_section && right == 0))
2205                     {
2206                       seg_left = seg_right;
2207                       left = right;
2208                       add_symbol = op_symbol;
2209                       orig_add_symbol = expressionP->X_op_symbol;
2210                     }
2211                   op = O_symbol;
2212                   break;
2213                 }
2214               else if (op == O_left_shift || op == O_right_shift)
2215                 {
2216                   if (!(seg_left == absolute_section && left == 0))
2217                     {
2218                       op = O_symbol;
2219                       break;
2220                     }
2221                 }
2222               else if (op != O_multiply
2223                        && op != O_bit_or_not && op != O_bit_and)
2224                 return 0;
2225             }
2226           else if (op == O_multiply
2227                    && seg_left == absolute_section && left == 1)
2228             {
2229               seg_left = seg_right;
2230               left = right;
2231               add_symbol = op_symbol;
2232               orig_add_symbol = expressionP->X_op_symbol;
2233               op = O_symbol;
2234               break;
2235             }
2236           else if ((op == O_multiply || op == O_divide)
2237                    && seg_right == absolute_section && right == 1)
2238             {
2239               op = O_symbol;
2240               break;
2241             }
2242           else if (!(left == right
2243                      && ((seg_left == reg_section && seg_right == reg_section)
2244                          || (seg_left == undefined_section
2245                              && seg_right == undefined_section
2246                              && add_symbol == op_symbol))))
2247             return 0;
2248           else if (op == O_bit_and || op == O_bit_inclusive_or)
2249             {
2250               op = O_symbol;
2251               break;
2252             }
2253           else if (op != O_bit_exclusive_or && op != O_bit_or_not)
2254             return 0;
2255         }
2256
2257       right += frag_off / OCTETS_PER_BYTE;
2258       switch (op)
2259         {
2260         case O_add:                     left += right; break;
2261         case O_subtract:                left -= right; break;
2262         case O_multiply:                left *= right; break;
2263         case O_divide:
2264           if (right == 0)
2265             return 0;
2266           left = (offsetT) left / (offsetT) right;
2267           break;
2268         case O_modulus:
2269           if (right == 0)
2270             return 0;
2271           left = (offsetT) left % (offsetT) right;
2272           break;
2273         case O_left_shift:              left <<= right; break;
2274         case O_right_shift:             left >>= right; break;
2275         case O_bit_inclusive_or:        left |= right; break;
2276         case O_bit_or_not:              left |= ~right; break;
2277         case O_bit_exclusive_or:        left ^= right; break;
2278         case O_bit_and:                 left &= right; break;
2279         case O_eq:
2280         case O_ne:
2281           left = (left == right
2282                   && seg_left == seg_right
2283                   && (finalize_syms || frag_left == frag_right)
2284                   && (seg_left != undefined_section
2285                       || add_symbol == op_symbol)
2286                   ? ~ (valueT) 0 : 0);
2287           if (op == O_ne)
2288             left = ~left;
2289           break;
2290         case O_lt:
2291           left = (offsetT) left <  (offsetT) right ? ~ (valueT) 0 : 0;
2292           break;
2293         case O_le:
2294           left = (offsetT) left <= (offsetT) right ? ~ (valueT) 0 : 0;
2295           break;
2296         case O_ge:
2297           left = (offsetT) left >= (offsetT) right ? ~ (valueT) 0 : 0;
2298           break;
2299         case O_gt:
2300           left = (offsetT) left >  (offsetT) right ? ~ (valueT) 0 : 0;
2301           break;
2302         case O_logical_and:     left = left && right; break;
2303         case O_logical_or:      left = left || right; break;
2304         default:                abort ();
2305         }
2306
2307       op = O_constant;
2308       break;
2309     }
2310
2311   if (op == O_symbol)
2312     {
2313       if (seg_left == absolute_section)
2314         op = O_constant;
2315       else if (seg_left == reg_section && final_val == 0)
2316         op = O_register;
2317       else if (!symbol_same_p (add_symbol, orig_add_symbol))
2318         final_val += left;
2319       expressionP->X_add_symbol = add_symbol;
2320     }
2321   expressionP->X_op = op;
2322
2323   if (op == O_constant || op == O_register)
2324     final_val += left;
2325   expressionP->X_add_number = final_val;
2326
2327   return 1;
2328 }
2329 \f
2330 /* This lives here because it belongs equally in expr.c & read.c.
2331    expr.c is just a branch office read.c anyway, and putting it
2332    here lessens the crowd at read.c.
2333
2334    Assume input_line_pointer is at start of symbol name.
2335    Advance input_line_pointer past symbol name.
2336    Turn that character into a '\0', returning its former value.
2337    This allows a string compare (RMS wants symbol names to be strings)
2338    of the symbol name.
2339    There will always be a char following symbol name, because all good
2340    lines end in end-of-line.  */
2341
2342 char
2343 get_symbol_end (void)
2344 {
2345   char c;
2346
2347   /* We accept \001 in a name in case this is being called with a
2348      constructed string.  */
2349   if (is_name_beginner (c = *input_line_pointer++) || c == '\001')
2350     {
2351       while (is_part_of_name (c = *input_line_pointer++)
2352              || c == '\001')
2353         ;
2354       if (is_name_ender (c))
2355         c = *input_line_pointer++;
2356     }
2357   *--input_line_pointer = 0;
2358   return (c);
2359 }
2360
2361 unsigned int
2362 get_single_number (void)
2363 {
2364   expressionS exp;
2365   operand (&exp, expr_normal);
2366   return exp.X_add_number;
2367 }