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