Apply patch supplied for case 102229 to implement new insns psrclr and psrset.
authorNick Clifton <nickc@redhat.com>
Mon, 25 Oct 1999 15:28:44 +0000 (15:28 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 25 Oct 1999 15:28:44 +0000 (15:28 +0000)
gas/config/tc-mcore.c
opcodes/ChangeLog
opcodes/mcore-dis.c
opcodes/mcore-opc.h

index 4f4e8e95670ff9a7ba9053d68cbd83a95a95da90..549b43d326a3f85b6c20b31e9523b257174aeaf0 100644 (file)
@@ -42,14 +42,15 @@ static void   mcore_float_cons PARAMS ((int));
 static void   mcore_stringer PARAMS ((int));
 static void   mcore_fill   PARAMS ((int));
 static int    log2 PARAMS ((unsigned int));
-static char * parse_reg PARAMS ((char *, unsigned *));
-static char * parse_creg PARAMS ((char *, unsigned *));
-static char * parse_exp PARAMS ((char *, expressionS *));
+static char * parse_reg    PARAMS ((char *, unsigned *));
+static char * parse_creg   PARAMS ((char *, unsigned *));
+static char * parse_exp    PARAMS ((char *, expressionS *));
+static char * parse_rt     PARAMS ((char *, char **, int, expressionS *));
+static char * parse_imm    PARAMS ((char *, unsigned *, unsigned, unsigned));
+static char * parse_mem    PARAMS ((char *, unsigned *, unsigned *, unsigned));
+static char * parse_psrmod PARAMS ((char *, unsigned *));
 static void   make_name PARAMS ((char *, char *, int));
 static int    enter_literal PARAMS ((expressionS *, int));
-static char * parse_rt PARAMS ((char *, char **, int, expressionS *));
-static char * parse_imm PARAMS ((char *, unsigned *, unsigned, unsigned));
-static char * parse_mem PARAMS ((char *, unsigned *, unsigned *, unsigned));
 static void   dump_literals PARAMS ((int));
 static void   check_literals PARAMS ((int, int));
 static void   mcore_s_text    PARAMS ((int));
@@ -60,7 +61,6 @@ static void   mcore_s_bss     PARAMS ((int));
 static void   mcore_s_comm    PARAMS ((int));
 #endif
 
-
 /* Several places in this file insert raw instructions into the
    object. They should use MCORE_INST_XXX macros to get the opcodes
    and then use these two macros to crack the MCORE_INST value into
@@ -336,16 +336,17 @@ mcore_fill (unused)
        }
 
       poolspan += size * repeat;
+      
+      check_literals (1, 0);
     }
   
   s_fill (unused);
 
-  check_literals (2, 0);
+  check_literals (1, 0);
 }
 
 /* Handle the section changing pseudo-ops.  These call through to the
    normal implementations, but they dump the literal pool first.  */
-
 static void
 mcore_s_text (ignore)
      int ignore;
@@ -588,6 +589,46 @@ parse_creg (s, reg)
   return s;
 }
 
+static char *
+parse_psrmod (s, reg)
+  char *     s;
+  unsigned * reg;
+{
+  int  i;
+  char buf[10];
+  static struct psrmods
+  {
+    char *       name;
+    unsigned int value;
+  }
+  psrmods[] =
+  {
+    { "ie", 1 },
+    { "fe", 2 },
+    { "ee", 4 },
+    { "af", 8 }        /* really 0 and non-combinable */
+  };
+  
+  for (i = 0; i < 2; i++)
+    buf[i] = isascii (s[i]) ? tolower (s[i]) : 0;
+  
+  for (i = sizeof (psrmods) / sizeof (psrmods[0]); i--;)
+    {
+      if (! strncmp (psrmods[i].name, buf, 2))
+       {
+          * reg = psrmods[i].value;
+         
+          return s + 2;
+       }
+    }
+  
+  as_bad (_("bad/missing psr specifier"));
+  
+  * reg = 0;
+  
+  return s;
+}
+
 static char *
 parse_exp (s, e)
      char * s;
@@ -713,7 +754,7 @@ check_literals (kind, offset)
   
   if (poolspan > SPANCLOSE && kind > 0)
     dump_literals (0);
-  else if (poolspan > SPANEXIT && kind > 1)
+  else if (/* poolspan > SPANEXIT &&*/ kind > 1)
     dump_literals (0);
   else if (poolspan >= (SPANPANIC - poolsize * 2))
     dump_literals (1);
@@ -1594,6 +1635,29 @@ md_assemble (str)
       output = frag_more (2);
       break;
 
+    case OPSR:
+      op_end = parse_psrmod (op_end + 1, & reg);
+      
+      /* Look for further selectors.  */
+      while (* op_end == ',')
+       {
+         unsigned value;
+           
+         op_end = parse_psrmod (op_end + 1, & value);
+         
+         if (value & reg)
+           as_bad (_("duplicated psr bit specifier"));
+         
+         reg |= value;
+       }
+      
+      if (reg > 8)
+       as_bad (_("`af' must appear alone"));
+       
+      inst |= (reg & 0x7);
+      output = frag_more (2);
+      break;
     default:
       as_bad (_("unimplemented opcode \"%s\""), name);
     }
index c4f4045caf9668c02d96f3dc720d00c7da8e5ffa..9160f9e04a9556f08a68d5b09feed07eddeb7170 100644 (file)
@@ -1,3 +1,11 @@
+1999-10-25  Nick Clifton  <nickc@cygnus.com>
+
+       * mcore-opc.h (enum mcore_opclass): Add class OPSR.
+       (mcore_table): Add psrclr and psrset instructions.
+
+       * mcore-dis.c (array imsk): Add mask for OPSR class.
+       (print_insn_mcore): Add decode for OPSR class insns.
+
 1999-10-18  Michael Meissner  <meissner@cygnus.com>
 
        * alpha-opc.c (alpha_operands): Fill in missing initializer.
index 793de68c73f9073da3e84097240f76cce8d16f76..2c9f041d773c332cd87fcecef3d0a28088f0ad91 100644 (file)
@@ -57,6 +57,52 @@ static const unsigned short imsk[] =
     /* OMc */ 0xFF00,
     /* SIa */ 0xFE00,
 
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#include <stdio.h>
+#define STATIC_TABLE
+#define DEFINE_TABLE
+
+#include "mcore-opc.h"
+#include "dis-asm.h"
+
+/* Mask for each mcore_opclass: */
+static const unsigned short imsk[] =
+{
+    /* O0  */ 0xFFFF,
+    /* OT  */ 0xFFFC,
+    /* O1  */ 0xFFF0,
+    /* OC  */ 0xFFE0,
+    /* O2  */ 0xFF00,
+    /* X1  */ 0xFFF0,
+    /* OI  */ 0xFE00,
+    /* OB  */ 0xFE00,
+             
+    /* OMa */ 0xFFF0,
+    /* SI  */ 0xFE00,
+    /* I7  */ 0xF800,
+    /* LS  */ 0xF000,
+    /* BR  */ 0xF800,
+    /* BL  */ 0xFF00,
+    /* LR  */ 0xF000,
+    /* LJ  */ 0xFF00,
+             
+    /* RM  */ 0xFFF0,
+    /* RQ  */ 0xFFF0,
+    /* JSR */ 0xFFF0,
+    /* JMP */ 0xFFF0,
+    /* OBRa*/ 0xFFF0,
+    /* OBRb*/ 0xFF80,
+    /* OBRc*/ 0xFF00,
+    /* OBR2*/ 0xFE00,
+             
+    /* O1R1*/ 0xFFF0,
+    /* OMb */ 0xFF80,
+    /* OMc */ 0xFF00,
+    /* SIa */ 0xFE00,
+
+  /* OPSR  */ 0xFFF8,   /* psrset/psrclr */
+                
     /* JC  */ 0,               /* JC,JU,JL don't appear in object */
     /* JU  */ 0,
     /* JL  */ 0,
@@ -237,6 +283,18 @@ print_insn_mcore (memaddr, info)
          }
          break;
          
+       case OPSR:
+         {
+           static char * fields[] = 
+           {
+             "af", "ie",    "fe",    "fe,ie", 
+             "ee", "ee,ie", "ee,fe", "ee,fe,ie"
+           };
+           
+           fprintf (stream, "\t%s", fields[inst & 0x7]);
+         }
+         break;
+
        default:
          /* if the disassembler lags the instruction set */
          fprintf (stream, "\tundecoded operands, inst is 0x%04x", inst);
index 606ba846efd4619922c2e7ebb5dc8e17726c344b..208b8812317d83161ff58d03463401dc19caafc6 100644 (file)
@@ -23,7 +23,7 @@ typedef enum
   O0,    OT,   O1,   OC,   O2,    X1,    OI,    OB,
   OMa,   SI,   I7,   LS,   BR,    BL,    LR,    LJ,
   RM,    RQ,   JSR,  JMP,  OBRa,  OBRb,  OBRc,  OBR2,
-  O1R1,  OMb,  OMc,  SIa,
+  O1R1,  OMb,  OMc,  SIa,  OPSR,
   JC,    JU,   JL,   RSI,  DO21,  OB2
 }
 mcore_opclass;
@@ -99,6 +99,8 @@ mcore_opcode_info mcore_table[] =
   { "tst",     O2,     0,      0x0E00 },
   { "cmpne",   O2,     0,      0x0F00 },
   { "mfcr",    OC,     0,      0x1000 },
+  { "psrclr",  OPSR,   0,      0x11F0 },
+  { "psrset",  OPSR,   0,      0x11F8 },
   { "mov",     O2,     0,      0x1200 },
   { "bgenr",   O2,     0,      0x1300 },
   { "rsub",    O2,     0,      0x1400 },