Added support for NEC style assembler pseudo ops:
authorNick Clifton <nickc@redhat.com>
Thu, 21 Aug 1997 17:54:49 +0000 (17:54 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 21 Aug 1997 17:54:49 +0000 (17:54 +0000)
.section "name", <type>
.offset <expression>
.bss

gas/ChangeLog
gas/config/tc-v850.c

index 209963fb3c54066412e6bafd75a7041eefe91070..f17df67be30456c33608dd1c0d24face4974e610 100644 (file)
@@ -1,3 +1,11 @@
+start-sanitize-v850
+Thu Aug 21 10:54:27 1997  Nick Clifton  <nickc@cygnus.com>
+
+       * config/tc-v850.c (v850_section, v850_bss, v850_offset): New
+       functions.
+       (md_pseudo_table): New pseudo ops: .bss, .offset, .section
+end-sanitize-v850
+
 Thu Aug 21 00:59:53 1997  Doug Evans  <dje@canuck.cygnus.com>
 
        * config/tc-m32r.c (md_estimate_size_before_relax): Update recorded
index 944f27b9cde93692335971c1bea63b0010e7ac96..7663bee2e307a89295771038b22d4f2b0507452f 100644 (file)
@@ -40,7 +40,7 @@ struct reg_name
 const char comment_chars[] = "#";
 
 /* Characters which start a comment at the beginning of a line.  */
-const char line_comment_chars[] = ";#";
+const char line_comment_chars[] = ";#-";
 
 /* Characters which may be used to separate multiple commands on a 
    single line.  */
@@ -78,11 +78,52 @@ struct v850_fixup
 struct v850_fixup fixups[MAX_INSN_FIXUPS];
 static int fc;
 \f
+static void
+v850_section (int arg)
+{
+  char   saved_c;
+  char * ptr;
+  
+  for (ptr = input_line_pointer; * ptr != '\n' && * ptr != 0; ptr ++)
+    if (* ptr == ',')
+      break;
+
+  saved_c = * ptr;
+  * ptr = ';';
+  
+  obj_elf_section (arg);
+
+  * ptr = saved_c;
+}
+
+void
+v850_bss (int ignore)
+{
+  register int temp = get_absolute_expression ();
+  
+  subseg_set (bss_section, (subsegT) temp);
+  
+  demand_empty_rest_of_line ();
+}
+
+void
+v850_offset (int ignore)
+{
+  register int temp = get_absolute_expression ();
+  
+  subseg_set (now_seg, (subsegT) temp);
+  
+  demand_empty_rest_of_line ();
+}
+
 /* The target specific pseudo-ops which we support.  */
 const pseudo_typeS md_pseudo_table[] =
 {
-  {"word", cons, 4},
-  { NULL,       NULL,           0 }
+  {"bss",     v850_bss,     0},
+  {"offset",  v850_offset,  0},
+  {"section", v850_section, 0},
+  {"word",    cons,         4},
+  { NULL,     NULL,         0}
 };
 
 /* Opcode hash table.  */
@@ -130,11 +171,18 @@ static const struct reg_name pre_defined_registers[] =
   { "tp", 5 },                 /* tp - text ptr */
   { "zero", 0 },
 };
-#define REG_NAME_CNT   (sizeof(pre_defined_registers) / sizeof(struct reg_name))
+#define REG_NAME_CNT   (sizeof (pre_defined_registers) / sizeof (struct reg_name))
 
 
 static const struct reg_name system_registers[] = 
 {
+/* start-sanitize-v850e */
+  { "ctbp",  20 },
+  { "ctpc",  16 },
+  { "ctpsw", 17 },
+  { "dbpc",  18 },
+  { "dbpsw", 19 },
+/* end-sanitize-v850e */
   { "ecr", 4 },
   { "eipc", 0 },
   { "eipsw", 1 },
@@ -142,7 +190,7 @@ static const struct reg_name system_registers[] =
   { "fepsw", 3 },
   { "psw", 5 },
 };
-#define SYSREG_NAME_CNT        (sizeof(system_registers) / sizeof(struct reg_name))
+#define SYSREG_NAME_CNT        (sizeof (system_registers) / sizeof (struct reg_name))
 
 static const struct reg_name cc_names[] =
 {
@@ -193,8 +241,8 @@ reg_name_search (regs, regcount, name)
        high = middle - 1;
       else if (cmp > 0)
        low = middle + 1;
-      else 
-         return regs[middle].value;
+      else
+       return regs[middle].value;
     }
   while (low <= high);
   return -1;
@@ -258,8 +306,9 @@ register_name (expressionP)
  *     its original state.
  */
 static boolean
-system_register_name (expressionP)
-     expressionS *expressionP;
+system_register_name (expressionP, accept_numbers)
+     expressionS * expressionP;
+     boolean       accept_numbers;
 {
   int reg_number;
   char *name;
@@ -272,6 +321,31 @@ system_register_name (expressionP)
   c = get_symbol_end ();
   reg_number = reg_name_search (system_registers, SYSREG_NAME_CNT, name);
 
+  if (reg_number < 0
+      && accept_numbers)
+    {
+      * input_line_pointer = c;   /* put back the delimiting char */
+      input_line_pointer   = start; /* reset input_line pointer */
+      
+      reg_number = strtol (input_line_pointer, & input_line_pointer, 10);
+
+      /* Make sure that the register number is allowable. */
+      if (   reg_number < 0
+         || reg_number > 5
+/* start-sanitize-v850e */
+         && reg_number < 16
+         || reg_number > 20
+/* end-sanitize-v850e */
+            )
+       {
+         reg_number = -1;
+       }
+      else
+       {
+         c = * input_line_pointer;
+       }
+    }
+      
   /* look to see if it's in the register table */
   if (reg_number >= 0) 
     {
@@ -401,7 +475,7 @@ parse_register_list
              return false;
            }
        }
-      else if (system_register_name (& exp))
+      else if (system_register_name (& exp, true))
        {
          if (regs == type1_regs)
            {
@@ -736,7 +810,7 @@ md_assemble (str)
          hold = input_line_pointer;
          input_line_pointer = str;
          
-// fprintf (stderr, "operand: %s   index = %d, opcode = %s\n", input_line_pointer, opindex_ptr - opcode->operands, opcode->name );
+//fprintf (stderr, "operand: %s   index = %d, opcode = %s\n", input_line_pointer, opindex_ptr - opcode->operands, opcode->name );
 
          /* lo(), hi(), hi0(), etc... */
          if ((reloc = v850_reloc_prefix()) != BFD_RELOC_UNUSED)
@@ -817,9 +891,9 @@ md_assemble (str)
                }
              else if ((operand->flags & V850_OPERAND_SRG) != 0) 
                {
-                 if (!system_register_name (& ex))
+                 if (!system_register_name (& ex, true))
                    {
-                     errmsg = "invalid system register name";
+                     errmsg = "UGG invalid system register name";
                    }
                }
              else if ((operand->flags & V850_OPERAND_EP) != 0)
@@ -900,7 +974,7 @@ md_assemble (str)
                {
                  errmsg = "syntax error: register not expected";
                }
-             else if (system_register_name (&ex)
+             else if (system_register_name (& ex, false)
                       && (operand->flags & V850_OPERAND_SRG) == 0)
                {
                  errmsg = "syntax error: system register not expected";
@@ -1022,9 +1096,11 @@ md_assemble (str)
       else
        insn_size = 2;
 
+/* start-sanitize-v850e */
       /* Special case: 32 bit MOV */
       if ((insn & 0xffe0) == 0x0620)
        insn_size = 2;
+/* end_sanitize-v850e */
       
       f = frag_more (insn_size);
       
This page took 0.034259 seconds and 4 git commands to generate.