* config/tc-m68k.c (struct m68k_cpu): Add alias field.
authorIan Lance Taylor <ian@airs.com>
Wed, 7 Feb 1996 19:35:15 +0000 (19:35 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 7 Feb 1996 19:35:15 +0000 (19:35 +0000)
(archs): Initialize new field.
(m68k_ip): Don't list alias names when listing CPUs which support
an instruction.

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

index f3fd84184ccf8f821aecfa4c2e40277fc24c9302..b7165a73942d867372cb66eddb80e4ae03c13c96 100644 (file)
@@ -1,5 +1,17 @@
 Wed Feb  7 14:12:03 1996  Ian Lance Taylor  <ian@cygnus.com>
 
+       * config/tc-m68k.c (struct m68k_cpu): Add alias field.
+       (archs): Initialize new field.
+       (m68k_ip): Don't list alias names when listing CPUs which support
+       an instruction.
+
+       * as.c (main): Call parse_args before read_begin.
+       * app.c (do_scrub_chars): If flag_m68k_mri, don't put a dot in
+       front of generated pseudo-ops.
+       * read.c (potable): Ignore "name".
+       (s_app_file): Permit a single quote after the string, since one
+       may appear in m68k MRI mode.
+
        * configure.in: Check for --enable-shared.  If linking against
        shared BFD and opcodes, fix library name on SunOS, and try to set
        -rpath reasonably.
index 660cfc23bdafd21d0e96ffcd4213dd4e06fc4253..fe6c9bd0c7dc0e2bd2a43c65eb2791cf258006ff 100644 (file)
@@ -1,5 +1,5 @@
 /* tc-m68k.c -- Assemble for the m68k family
-   Copyright (C) 1987, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
+   Copyright (C) 1987, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -315,36 +315,37 @@ static int current_architecture;
 struct m68k_cpu {
   unsigned long arch;
   const char *name;
+  int alias;
 };
 
 static const struct m68k_cpu archs[] = {
-  { m68000, "68000" },
-  { m68010, "68010" },
-  { m68020, "68020" },
-  { m68030, "68030" },
-  { m68040, "68040" },
-  { m68060, "68060" },
-  { cpu32,  "cpu32" },
-  { m68881, "68881" },
-  { m68851, "68851" },
+  { m68000, "68000", 0 },
+  { m68010, "68010", 0 },
+  { m68020, "68020", 0 },
+  { m68030, "68030", 0 },
+  { m68040, "68040", 0 },
+  { m68060, "68060", 0 },
+  { cpu32,  "cpu32", 0 },
+  { m68881, "68881", 0 },
+  { m68851, "68851", 0 },
   /* Aliases (effectively, so far as gas is concerned) for the above
      cpus.  */
-  { m68020, "68k" },
-  { m68000, "68302" },
-  { m68000, "68008" },
-  { m68000, "68ec000" },
-  { m68000, "68hc000" },
-  { m68000, "68hc001" },
-  { m68020, "68ec020" },
-  { m68030, "68ec030" },
-  { m68040, "68ec040" },
-  { cpu32,  "68330" },
-  { cpu32,  "68331" },
-  { cpu32,  "68332" },
-  { cpu32,  "68333" },
-  { cpu32,  "68340" },
-  { cpu32,  "68360" },
-  { m68881, "68882" },
+  { m68020, "68k", 1 },
+  { m68000, "68302", 1 },
+  { m68000, "68008", 1 },
+  { m68000, "68ec000", 1 },
+  { m68000, "68hc000", 1 },
+  { m68000, "68hc001", 1 },
+  { m68020, "68ec020", 1 },
+  { m68030, "68ec030", 1 },
+  { m68040, "68ec040", 1 },
+  { cpu32,  "68330", 1 },
+  { cpu32,  "68331", 1 },
+  { cpu32,  "68332", 1 },
+  { cpu32,  "68333", 1 },
+  { cpu32,  "68340", 1 },
+  { cpu32,  "68360", 1 },
+  { m68881, "68882", 1 },
 };
 
 static const int n_archs = sizeof (archs) / sizeof (archs[0]);
@@ -433,6 +434,8 @@ const pseudo_typeS md_pseudo_table[] =
 #ifdef OBJ_ELF
   {"swbeg", s_ignore, 0},
 #endif
+  {"extend", float_cons, 'x'},
+  {"ldouble", float_cons, 'x'},
 
   /* The following pseudo-ops are supported for MRI compatibility.  */
   {"chip", s_chip, 0},
@@ -592,7 +595,7 @@ tc_gen_reloc (section, fixp)
   arelent *reloc;
   bfd_reloc_code_real_type code;
 
-  if (fixP->fx_tcbit)
+  if (fixp->fx_tcbit)
     abort ();
 
 #define F(SZ,PCREL)            (((SZ) << 1) + (PCREL))
@@ -835,6 +838,11 @@ m68k_ip (instring)
                           && (opP->disp.exp.X_op != O_constant
                               || ! isword (opP->disp.exp.X_add_number)))
                    losing++;
+                 else if (s[1] == 'W'
+                          && ! isvar (&opP->disp)
+                          && (opP->disp.exp.X_op != O_constant
+                              || ! issword (opP->disp.exp.X_add_number)))
+                   losing++;
                  break;
 
                case '^':
@@ -1355,7 +1363,8 @@ m68k_ip (instring)
                    for (idx = 0; idx < sizeof (archs) / sizeof (archs[0]);
                         idx++)
                      {
-                       if (archs[idx].arch & ok_arch)
+                       if ((archs[idx].arch & ok_arch)
+                           && ! archs[idx].alias)
                          {
                            if (got_one)
                              {
@@ -1435,6 +1444,12 @@ m68k_ip (instring)
                  addword (nextword);
                  baseo = 0;
                  break;
+               case 'W':
+                 if (!issword (nextword))
+                   opP->error = "operand out of range";
+                 addword (nextword);
+                 baseo = 0;
+                 break;
                case 'l':
                  addword (nextword >> 16);
                  addword (nextword);
@@ -1929,6 +1944,13 @@ m68k_ip (instring)
              if (isvar (&opP->disp))
                the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
              break;
+           case 'W':
+             if (!issword (tmpreg))
+               opP->error = "out of range";
+             insop (tmpreg, opcode);
+             if (isvar (&opP->disp))
+               the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
+             break;
            case 'l':
              /* Because of the way insop works, we put these two out
                 backwards.  */
@@ -2510,6 +2532,7 @@ install_operand (mode, val)
       break;
     case 'b':
     case 'w':
+    case 'W':
     case 'l':
       break;
     case 'e':
@@ -5718,6 +5741,8 @@ s_mri_until (qual)
 
   input_line_pointer = s;
 
+  pop_mri_control ();
+
   if (flag_mri)
     {
       while (! is_end_of_line[(unsigned char) *input_line_pointer])