* ppc-opc.c (insert_bdm): -Many comment.
authorAlan Modra <amodra@gmail.com>
Fri, 2 Feb 2007 01:24:43 +0000 (01:24 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 2 Feb 2007 01:24:43 +0000 (01:24 +0000)
(valid_bo): Add "extract" param.  Accept both powerpc and power4
BO fields when disassembling with -Many.
(insert_bo, extract_bo, insert_boe, extract_boe): Adjust valid_bo call.

opcodes/ChangeLog
opcodes/ppc-opc.c

index 68233e3058bec218bece5860a82e81a1713fb647..36e30ae552ccf27f9eca3a8a8d74870aa1808bde 100644 (file)
@@ -1,3 +1,10 @@
+2007-02-02  Alan Modra  <amodra@bigpond.net.au>
+
+       * ppc-opc.c (insert_bdm): -Many comment.
+       (valid_bo): Add "extract" param.  Accept both powerpc and power4
+       BO fields when disassembling with -Many.
+       (insert_bo, extract_bo, insert_boe, extract_boe): Adjust valid_bo call.
+
 2007-01-08  Kazu Hirata  <kazu@codesourcery.com>
 
        * m68k-opc.c (m68k_opcodes): Replace cpu32 with
index 5295dfd3567d11a1f7338b6317d529561a82c18a..a0b675be5698c96c59505e3ad10adf93b750d309 100644 (file)
@@ -1,6 +1,6 @@
 /* ppc-opc.c -- PowerPC opcode list
    Copyright 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004,
-   2005 Free Software Foundation, Inc.
+   2005, 2006, 2007 Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support
 
    This file is part of GDB, GAS, and the GNU binutils.
@@ -683,7 +683,11 @@ extract_bd (unsigned long insn,
    the "y" bit.  "at" == 00 => no hint, "at" == 01 => unpredictable,
    "at" == 10 => not taken, "at" == 11 => taken.  The "t" bit is 00001
    in BO field, the "a" bit is 00010 for branch on CR(BI) and 01000
-   for branch on CTR.  We only handle the taken/not-taken hint here.  */
+   for branch on CTR.  We only handle the taken/not-taken hint here.
+   Note that we don't relax the conditions tested here when
+   disassembling with -Many because insns using extract_bdm and
+   extract_bdp always occur in pairs.  One or the other will always
+   be valid.  */
 
 static unsigned long
 insert_bdm (unsigned long insn,
@@ -774,10 +778,11 @@ extract_bdp (unsigned long insn,
 /* Check for legal values of a BO field.  */
 
 static int
-valid_bo (long value, int dialect)
+valid_bo (long value, int dialect, int extract)
 {
   if ((dialect & PPC_OPCODE_POWER4) == 0)
     {
+      int valid;
       /* Certain encodings have bits that are required to be zero.
         These are (z must be zero, y may be anything):
             001zy
@@ -790,36 +795,43 @@ valid_bo (long value, int dialect)
        {
        default:
        case 0:
-         return 1;
+         valid = 1;
+         break;
        case 0x4:
-         return (value & 0x2) == 0;
+         valid = (value & 0x2) == 0;
+         break;
        case 0x10:
-         return (value & 0x8) == 0;
+         valid = (value & 0x8) == 0;
+         break;
        case 0x14:
-         return value == 0x14;
+         valid = value == 0x14;
+         break;
        }
+      /* When disassembling with -Many, accept power4 encodings too.  */
+      if (valid
+         || (dialect & PPC_OPCODE_ANY) == 0
+         || !extract)
+       return valid;
     }
+
+  /* Certain encodings have bits that are required to be zero.
+     These are (z must be zero, a & t may be anything):
+        0000z
+        0001z
+        0100z
+        0101z
+        001at
+        011at
+        1a00t
+        1a01t
+        1z1zz
+  */
+  if ((value & 0x14) == 0)
+    return (value & 0x1) == 0;
+  else if ((value & 0x14) == 0x14)
+    return value == 0x14;
   else
-    {
-      /* Certain encodings have bits that are required to be zero.
-        These are (z must be zero, a & t may be anything):
-            0000z
-            0001z
-            0100z
-            0101z
-            001at
-            011at
-            1a00t
-            1a01t
-            1z1zz
-      */
-      if ((value & 0x14) == 0)
-       return (value & 0x1) == 0;
-      else if ((value & 0x14) == 0x14)
-       return value == 0x14;
-      else
-       return 1;
-    }
+    return 1;
 }
 
 /* The BO field in a B form instruction.  Warn about attempts to set
@@ -831,7 +843,7 @@ insert_bo (unsigned long insn,
           int dialect,
           const char **errmsg)
 {
-  if (!valid_bo (value, dialect))
+  if (!valid_bo (value, dialect, 0))
     *errmsg = _("invalid conditional option");
   return insn | ((value & 0x1f) << 21);
 }
@@ -844,7 +856,7 @@ extract_bo (unsigned long insn,
   long value;
 
   value = (insn >> 21) & 0x1f;
-  if (!valid_bo (value, dialect))
+  if (!valid_bo (value, dialect, 1))
     *invalid = 1;
   return value;
 }
@@ -859,7 +871,7 @@ insert_boe (unsigned long insn,
            int dialect,
            const char **errmsg)
 {
-  if (!valid_bo (value, dialect))
+  if (!valid_bo (value, dialect, 0))
     *errmsg = _("invalid conditional option");
   else if ((value & 1) != 0)
     *errmsg = _("attempt to set y bit when using + or - modifier");
@@ -875,7 +887,7 @@ extract_boe (unsigned long insn,
   long value;
 
   value = (insn >> 21) & 0x1f;
-  if (!valid_bo (value, dialect))
+  if (!valid_bo (value, dialect, 1))
     *invalid = 1;
   return value & 0x1e;
 }