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