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