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