Add more md operators
[deliverable/binutils-gdb.git] / gas / expr.c
index dfa7393e2dd363f68b36a56e88c2f5990fc31be7..ced12395bb916b0af04a45099bb772cced7d8c61 100644 (file)
@@ -1,5 +1,5 @@
 /* expr.c -operands, expressions-
-   Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 96, 97, 1998
+   Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 96, 97, 98, 1999
    Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 #include "obstack.h"
 
 static void floating_constant PARAMS ((expressionS * expressionP));
+static valueT generic_bignum_to_int32 PARAMS ((void));
+#ifdef BFD64
+static valueT generic_bignum_to_int64 PARAMS ((void));
+#endif
 static void integer_constant PARAMS ((int radix, expressionS * expressionP));
 static void mri_char_constant PARAMS ((expressionS *));
 static void current_location PARAMS ((expressionS *));
@@ -100,7 +104,7 @@ make_expr_symbol (expressionP)
                            ? absolute_section
                            : expr_section),
                           0, &zero_address_frag);
-  symbolP->sy_value = *expressionP;
+  symbol_set_value_expression (symbolP, expressionP);
 
   if (expressionP->X_op == O_constant)
     resolve_symbol_value (symbolP, 1);
@@ -385,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;
@@ -924,9 +928,13 @@ operand (expressionP)
                  {
                  case 0:
                  case ERROR_EXPONENT_OVERFLOW:
-                   if (cp[-1] == 'f' || cp[-1] == 'b')
+                   if (*cp == 'f' || *cp == 'b')
                      /* looks like a difference expression */
                      goto is_0f_label;
+                   else if (cp == input_line_pointer + 1)
+                     /* No characters has been accepted -- looks like
+                         end of operand. */
+                     goto is_0f_label;
                    else
                      goto is_0f_float;
                  default:
@@ -981,7 +989,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 */
@@ -1301,7 +1311,7 @@ operand (expressionP)
 
   /* The PA port needs this information.  */
   if (expressionP->X_add_symbol)
-    expressionP->X_add_symbol->sy_used = 1;
+    symbol_mark_used (expressionP->X_add_symbol);
 
   switch (expressionP->X_op)
     {
@@ -1348,8 +1358,8 @@ clean_up_expression (expressionP)
       break;
     case O_subtract:
       if (expressionP->X_op_symbol == expressionP->X_add_symbol
-         || ((expressionP->X_op_symbol->sy_frag
-              == expressionP->X_add_symbol->sy_frag)
+         || ((symbol_get_frag (expressionP->X_op_symbol)
+              == symbol_get_frag (expressionP->X_add_symbol))
              && SEG_NORMAL (S_GET_SEGMENT (expressionP->X_add_symbol))
              && (S_GET_VALUE (expressionP->X_op_symbol)
                  == S_GET_VALUE (expressionP->X_add_symbol))))
@@ -1407,7 +1417,13 @@ static const operatorT op_encoding[256] =
   __, __, __, __, __, __, __, __,
   __, __, __, __, __, __, __, __,
   __, __, __, __, __, __, __, __,
-  __, __, __, __, __, __, O_bit_exclusive_or, __,
+  __, __, __,
+#ifdef NEED_INDEX_OPERATOR
+  O_index,
+#else
+  __,
+#endif
+  __, __, O_bit_exclusive_or, __,
   __, __, __, __, __, __, __, __,
   __, __, __, __, __, __, __, __,
   __, __, __, __, __, __, __, __,
@@ -1445,28 +1461,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
@@ -1520,7 +1553,7 @@ operator ()
   int c;
   operatorT ret;
 
-  c = *input_line_pointer;
+  c = *input_line_pointer & 0xff;
 
   switch (c)
     {
@@ -1599,10 +1632,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;
@@ -1633,6 +1667,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))
@@ -1673,8 +1718,9 @@ expr (rank, resultP)
       if (right.X_op == O_big)
        {
          if (right.X_add_number > 0)
-         as_warn (_("right operand is a bignum; integer 0 assumed"));
-         as_warn (_("right operand is a float; integer 0 assumed"));
+           as_warn (_("right operand is a bignum; integer 0 assumed"));
+         else
+           as_warn (_("right operand is a float; integer 0 assumed"));
          right.X_op = O_constant;
          right.X_add_number = 0;
          right.X_add_symbol = NULL;
@@ -1691,8 +1737,8 @@ expr (rank, resultP)
       else if (op_left == O_subtract
               && right.X_op == O_symbol
               && resultP->X_op == O_symbol
-              && (right.X_add_symbol->sy_frag
-                  == resultP->X_add_symbol->sy_frag)
+              && (symbol_get_frag (right.X_add_symbol)
+                  == symbol_get_frag (resultP->X_add_symbol))
               && SEG_NORMAL (S_GET_SEGMENT (right.X_add_symbol)))
 
        {
@@ -1806,7 +1852,7 @@ expr (rank, resultP)
 
   /* The PA port needs this information.  */
   if (resultP->X_add_symbol)
-    resultP->X_add_symbol->sy_used = 1;
+    symbol_mark_used (resultP->X_add_symbol);
 
   return resultP->X_op == O_constant ? absolute_section : retval;
 }
@@ -1834,9 +1880,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.033065 seconds and 4 git commands to generate.