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