Correctly check gcc version.
[deliverable/binutils-gdb.git] / gas / expr.c
index 9cfec2e655f2f4d400fe93a098c7ac4fa8eed7c4..851a406e018096743c544605d12297c4c360bf92 100644 (file)
@@ -1,5 +1,5 @@
 /* expr.c -operands, expressions-
-   Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 96, 97, 98, 1999
+   Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
    Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
@@ -327,7 +327,7 @@ integer_constant (radix, expressionP)
 #define valuesize 32
 #endif
 
-  if (flag_m68k_mri && radix == 0)
+  if ((NUMBERS_WITH_SUFFIX || flag_m68k_mri) && radix == 0)
     {
       int flt = 0;
 
@@ -389,7 +389,7 @@ integer_constant (radix, expressionP)
       break;
     case 10:
       maxdig = radix = 10;
-      too_many_digits = (valuesize + 12) / 4; /* very rough */
+      too_many_digits = (valuesize + 11) / 4; /* very rough */
     }
 #undef valuesize
   start = input_line_pointer;
@@ -541,7 +541,9 @@ integer_constant (radix, expressionP)
        }
     }
 
-  if (flag_m68k_mri && suffix != NULL && input_line_pointer - 1 == suffix)
+  if ((NUMBERS_WITH_SUFFIX || flag_m68k_mri) 
+      && suffix != NULL 
+      && input_line_pointer - 1 == suffix)
     c = *input_line_pointer++;
 
   if (small)
@@ -810,13 +812,15 @@ operand (expressionP)
     case '9':
       input_line_pointer--;
 
-      integer_constant (flag_m68k_mri ? 0 : 10, expressionP);
+      integer_constant ((NUMBERS_WITH_SUFFIX || flag_m68k_mri) 
+                        ? 0 : 10,
+                        expressionP);
       break;
 
     case '0':
       /* non-decimal radix */
 
-      if (flag_m68k_mri)
+      if (NUMBERS_WITH_SUFFIX || flag_m68k_mri)
        {
          char *s;
 
@@ -829,8 +833,7 @@ operand (expressionP)
              integer_constant (0, expressionP);
              break;
            }
-       }
-
+        }
       c = *input_line_pointer;
       switch (c)
        {
@@ -840,7 +843,7 @@ operand (expressionP)
        case 'Q':
        case '8':
        case '9':
-         if (flag_m68k_mri)
+         if (NUMBERS_WITH_SUFFIX || flag_m68k_mri)
            {
              integer_constant (0, expressionP);
              break;
@@ -873,7 +876,7 @@ operand (expressionP)
          break;
 
        case 'b':
-         if (LOCAL_LABELS_FB && ! flag_m68k_mri)
+         if (LOCAL_LABELS_FB && ! (flag_m68k_mri || NUMBERS_WITH_SUFFIX))
            {
              /* This code used to check for '+' and '-' here, and, in
                 some conditions, fall through to call
@@ -895,7 +898,7 @@ operand (expressionP)
          /* Fall through.  */
        case 'B':
          input_line_pointer++;
-         if (flag_m68k_mri)
+         if (flag_m68k_mri || NUMBERS_WITH_SUFFIX)
            goto default_case;
          integer_constant (2, expressionP);
          break;
@@ -908,7 +911,9 @@ operand (expressionP)
        case '5':
        case '6':
        case '7':
-         integer_constant (flag_m68k_mri ? 0 : 8, expressionP);
+         integer_constant ((flag_m68k_mri || NUMBERS_WITH_SUFFIX)
+                            ? 0 : 8, 
+                            expressionP);
          break;
 
        case 'f':
@@ -918,7 +923,8 @@ operand (expressionP)
                 number, make it one.  Otherwise, make it a local label,
                 and try to deal with parsing the rest later.  */
              if (!input_line_pointer[1]
-                 || (is_end_of_line[0xff & input_line_pointer[1]]))
+                 || (is_end_of_line[0xff & input_line_pointer[1]])
+                 || strchr (FLT_CHARS, 'f') == NULL)
                goto is_0f_label;
              {
                char *cp = input_line_pointer + 1;
@@ -958,7 +964,7 @@ operand (expressionP)
 
        case 'd':
        case 'D':
-         if (flag_m68k_mri)
+         if (flag_m68k_mri || NUMBERS_WITH_SUFFIX)
            {
              integer_constant (0, expressionP);
              break;
@@ -989,7 +995,9 @@ operand (expressionP)
       break;
 
     case '(':
+#ifndef NEED_INDEX_OPERATOR
     case '[':
+#endif
       /* didn't begin with digit & not a name */
       segment = expression (expressionP);
       /* Expression() will pass trailing whitespace */
@@ -1003,6 +1011,7 @@ operand (expressionP)
       /* here with input_line_pointer->char after "(...)" */
       return segment;
 
+#ifdef TC_M68K
     case 'E':
       if (! flag_m68k_mri || *input_line_pointer != '\'')
        goto de_fault;
@@ -1013,6 +1022,7 @@ operand (expressionP)
        goto de_fault;
       ++input_line_pointer;
       /* Fall through.  */
+#endif
     case '\'':
       if (! flag_m68k_mri)
        {
@@ -1032,11 +1042,13 @@ operand (expressionP)
       (void) operand (expressionP);
       break;
 
+#ifdef TC_M68K
     case '"':
       /* Double quote is the bitwise not operator in MRI mode.  */
       if (! flag_m68k_mri)
        goto de_fault;
       /* Fall through.  */
+#endif
     case '~':
       /* ~ is permitted to start a label on the Delta.  */
       if (is_name_beginner (c))
@@ -1078,6 +1090,7 @@ operand (expressionP)
       }
       break;
 
+#if defined (DOLLAR_DOT) || defined (TC_M68K)
     case '$':
       /* $ is the program counter when in MRI mode, or when DOLLAR_DOT
          is defined.  */
@@ -1098,6 +1111,7 @@ operand (expressionP)
 
       current_location (expressionP);
       break;
+#endif
 
     case '.':
       if (!is_part_of_name (*input_line_pointer))
@@ -1161,6 +1175,7 @@ operand (expressionP)
       input_line_pointer--;
       break;
 
+#ifdef TC_M68K
     case '%':
       if (! flag_m68k_mri)
        goto de_fault;
@@ -1190,9 +1205,12 @@ operand (expressionP)
 
       current_location (expressionP);
       break;
+#endif
 
     default:
+#ifdef TC_M68K
     de_fault:
+#endif
       if (is_end_of_line[(unsigned char) c])
        goto eol;
       if (is_name_beginner (c))        /* here if did not begin with a digit */
@@ -1415,7 +1433,13 @@ static const operatorT op_encoding[256] =
   __, __, __, __, __, __, __, __,
   __, __, __, __, __, __, __, __,
   __, __, __, __, __, __, __, __,
-  __, __, __, __, __, __, O_bit_exclusive_or, __,
+  __, __, __,
+#ifdef NEED_INDEX_OPERATOR
+  O_index,
+#else
+  __,
+#endif
+  __, __, O_bit_exclusive_or, __,
   __, __, __, __, __, __, __, __,
   __, __, __, __, __, __, __, __,
   __, __, __, __, __, __, __, __,
@@ -1453,28 +1477,45 @@ static operator_rankT op_rank[] =
   0,   /* O_symbol_rva */
   0,   /* O_register */
   0,   /* O_bit */
-  8,   /* O_uminus */
-  8,   /* O_bit_not */
-  8,   /* O_logical_not */
-  7,   /* O_multiply */
-  7,   /* O_divide */
-  7,   /* O_modulus */
-  7,   /* O_left_shift */
-  7,   /* O_right_shift */
-  6,   /* O_bit_inclusive_or */
-  6,   /* O_bit_or_not */
-  6,   /* O_bit_exclusive_or */
-  6,   /* O_bit_and */
-  4,   /* O_add */
-  4,   /* O_subtract */
-  3,   /* O_eq */
-  3,   /* O_ne */
-  3,   /* O_lt */
-  3,   /* O_le */
-  3,   /* O_ge */
-  3,   /* O_gt */
-  2,   /* O_logical_and */
-  1    /* O_logical_or */
+  9,   /* O_uminus */
+  9,   /* O_bit_not */
+  9,   /* O_logical_not */
+  8,   /* O_multiply */
+  8,   /* O_divide */
+  8,   /* O_modulus */
+  8,   /* O_left_shift */
+  8,   /* O_right_shift */
+  7,   /* O_bit_inclusive_or */
+  7,   /* O_bit_or_not */
+  7,   /* O_bit_exclusive_or */
+  7,   /* O_bit_and */
+  5,   /* O_add */
+  5,   /* O_subtract */
+  4,   /* O_eq */
+  4,   /* O_ne */
+  4,   /* O_lt */
+  4,   /* O_le */
+  4,   /* O_ge */
+  4,   /* O_gt */
+  3,   /* O_logical_and */
+  2,   /* O_logical_or */
+  1,   /* O_index */
+  0,   /* O_md1 */
+  0,   /* O_md2 */
+  0,   /* O_md3 */
+  0,   /* O_md4 */
+  0,   /* O_md5 */
+  0,   /* O_md6 */
+  0,   /* O_md7 */
+  0,   /* O_md8 */
+  0,   /* O_md9 */
+  0,   /* O_md10 */
+  0,   /* O_md11 */
+  0,   /* O_md12 */
+  0,   /* O_md13 */
+  0,   /* O_md14 */
+  0,   /* O_md15 */
+  0,   /* O_md16 */
 };
 
 /* Unfortunately, in MRI mode for the m68k, multiplication and
@@ -1607,10 +1648,11 @@ operator ()
 /* Parse an expression.  */
 
 segT
-expr (rank, resultP)
-     operator_rankT rank;      /* Larger # is higher rank. */
+expr (rankarg, resultP)
+     int rankarg;      /* Larger # is higher rank. */
      expressionS *resultP;     /* Deliver result here. */
 {
+  operator_rankT rank = (operator_rankT) rankarg;
   segT retval;
   expressionS right;
   operatorT op_left;
@@ -1641,6 +1683,17 @@ expr (rank, resultP)
 
       know (*input_line_pointer != ' ');
 
+      if (op_left == O_index)
+       {
+         if (*input_line_pointer != ']')
+           as_bad ("missing right bracket");
+         else
+           {
+             ++input_line_pointer;
+             SKIP_WHITESPACE ();
+           }
+       }
+
       if (retval == undefined_section)
        {
          if (SEG_NORMAL (rightseg))
@@ -1691,6 +1744,13 @@ expr (rank, resultP)
        }
 
       /* Optimize common cases.  */
+#ifdef md_optimize_expr
+      if (md_optimize_expr (resultP, op_left, &right))
+       {
+         /* skip */;
+       }
+      else
+#endif
       if (op_left == O_add && right.X_op == O_constant)
        {
          /* X + constant.  */
@@ -1843,9 +1903,13 @@ get_symbol_end ()
   /* We accept \001 in a name in case this is being called with a
      constructed string.  */
   if (is_name_beginner (c = *input_line_pointer++) || c == '\001')
-    while (is_part_of_name (c = *input_line_pointer++)
-          || c == '\001')
-      ;
+    {
+      while (is_part_of_name (c = *input_line_pointer++)
+            || c == '\001')
+       ;
+      if (is_name_ender (c))
+       c = *input_line_pointer++;
+    }
   *--input_line_pointer = 0;
   return (c);
 }
This page took 0.027442 seconds and 4 git commands to generate.