xref: /dflybsd-src/contrib/binutils-2.34/gas/expr.c (revision b52ef7118d1621abed722c5bbbd542210290ecef)
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