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 * 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 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 * 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 * 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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