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