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