ppc/svp64: obtain SVP64 disassembly context
authorDmitry Selyutin <ghostmansd@gmail.com>
Sun, 28 May 2023 22:04:57 +0000 (01:04 +0300)
committerDmitry Selyutin <ghostmansd@gmail.com>
Tue, 14 Nov 2023 19:53:35 +0000 (22:53 +0300)
opcodes/ppc-dis.c
opcodes/ppc-svp64-dis.c

index 81b9f5bcb126958f2a337610b5c71f0b588f0f49..9cdc7e359f5f4c50db2fe6fd9f6f374fd95fb27d 100644 (file)
@@ -952,7 +952,8 @@ print_got_plt (struct sec_buf *sb, uint64_t vma, struct disassemble_info *info)
 static void
 print_insn_powerpc_opcode (struct disassemble_info *info,
                           bfd_vma memaddr, uint64_t insn, ppc_cpu_t dialect,
-                          const struct powerpc_opcode *opcode)
+                          const struct powerpc_opcode *opcode,
+                          const struct svp64_ctx *svp64 ATTRIBUTE_UNUSED)
 {
   const ppc_opindex_t *opindex;
   const struct powerpc_operand *operand;
@@ -1142,6 +1143,8 @@ print_insn_powerpc (bfd_vma memaddr,
   bfd_byte buffer[4];
   int status;
   uint64_t insn;
+  struct svp64_ctx svp64_ctx;
+  const struct svp64_ctx *svp64;
   const struct powerpc_opcode *opcode;
   int insn_length = 4;  /* Assume we have a normal 4-byte instruction.  */
 
@@ -1168,6 +1171,7 @@ print_insn_powerpc (bfd_vma memaddr,
     insn = bfd_getl32 (buffer);
 
   /* Get the major opcode of the insn.  */
+  svp64 = NULL;
   opcode = NULL;
   if ((dialect & (PPC_OPCODE_POWER10 | PPC_OPCODE_SVP64)) != 0
       && PPC_OP (insn) == 0x1)
@@ -1185,9 +1189,10 @@ print_insn_powerpc (bfd_vma memaddr,
 
          if ((dialect & PPC_OPCODE_SVP64) != 0)
            {
-             opcode = svp64_lookup (temp_insn, dialect);
+             opcode = svp64_lookup (temp_insn, dialect, &svp64_ctx);
              if (opcode != NULL)
                {
+                 svp64 = &svp64_ctx;
                  insn = temp_insn;
                  insn_length = 8;
                }
@@ -1248,7 +1253,7 @@ print_insn_powerpc (bfd_vma memaddr,
                                    (unsigned int) insn);
     }
   else
-    print_insn_powerpc_opcode (info, memaddr, insn, dialect, opcode);
+    print_insn_powerpc_opcode (info, memaddr, insn, dialect, opcode, svp64);
 
   return insn_length;
 }
index c6bda0a84b380b075396199b760421f0421e4441..2ffecff825a22016069f81ab4c75081bf77ea2ca 100644 (file)
@@ -84,7 +84,8 @@ svp64_lookup_record (uint32_t insn,
 }
 
 static const struct powerpc_opcode *
-svp64_lookup (uint64_t insn, ppc_cpu_t dialect)
+svp64_lookup (uint64_t insn, ppc_cpu_t dialect,
+    struct svp64_ctx *svp64)
 {
   uint32_t suffix;
   unsigned long op;
@@ -92,13 +93,14 @@ svp64_lookup (uint64_t insn, ppc_cpu_t dialect)
   const struct svp64_record *record;
   const struct svp64_record *record_start;
   const struct svp64_record *record_end;
-  struct svp64_insn svp64_insn = {insn};
 
-  if ((svp64_insn_get_prefix_PO (&svp64_insn) != 0x1) ||
-      (svp64_insn_get_prefix_id (&svp64_insn) != 0x3))
+  svp64_insn_set (&svp64->insn, insn);
+
+  if ((svp64_insn_get_prefix_PO (&svp64->insn) != 0x1) ||
+      (svp64_insn_get_prefix_id (&svp64->insn) != 0x3))
     return NULL;
 
-  suffix = (uint32_t)svp64_insn_get_suffix (&svp64_insn);
+  suffix = (uint32_t)svp64_insn_get_suffix (&svp64->insn);
   opcode = lookup_powerpc (suffix, dialect & ~PPC_OPCODE_ANY);
   if (opcode == NULL && (dialect & PPC_OPCODE_ANY) != 0)
     opcode = lookup_powerpc (suffix, dialect);
@@ -112,5 +114,8 @@ svp64_lookup (uint64_t insn, ppc_cpu_t dialect)
   if (record == NULL)
     return NULL;
 
+  svp64->name = record->name;
+  svp64->desc = &record->desc;
+
   return opcode;
 }