gdb/mi: handle no condition argument case for -break-condition
[deliverable/binutils-gdb.git] / gdb / i386-tdep.c
index 46e5e32f0a603c1890d114d25d97c68720a96413..e436437c6832f9f8c2196d066e06b1877a17e36d 100644 (file)
@@ -1,6 +1,6 @@
 /* Intel 386 target-dependent stuff.
 
-   Copyright (C) 1988-2017 Free Software Foundation, Inc.
+   Copyright (C) 1988-2021 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -22,8 +22,7 @@
 #include "arch-utils.h"
 #include "command.h"
 #include "dummy-frame.h"
-#include "dwarf2-frame.h"
-#include "doublest.h"
+#include "dwarf2/frame.h"
 #include "frame.h"
 #include "frame-base.h"
 #include "frame-unwind.h"
 #include "symfile.h"
 #include "symtab.h"
 #include "target.h"
+#include "target-float.h"
 #include "value.h"
 #include "dis-asm.h"
 #include "disasm.h"
 #include "remote.h"
 #include "i386-tdep.h"
 #include "i387-tdep.h"
-#include "x86-xstate.h"
+#include "gdbsupport/x86-xstate.h"
+#include "x86-tdep.h"
+#include "expop.h"
 
 #include "record.h"
 #include "record-full.h"
 #include "parser-defs.h"
 #include <ctype.h>
 #include <algorithm>
+#include <unordered_set>
+#include "producer.h"
 
 /* Register names.  */
 
-static const char *i386_register_names[] =
+static const char * const i386_register_names[] =
 {
   "eax",   "ecx",    "edx",   "ebx",
   "esp",   "ebp",    "esi",   "edi",
@@ -81,56 +85,56 @@ static const char *i386_register_names[] =
   "mxcsr"
 };
 
-static const char *i386_zmm_names[] =
+static const char * const i386_zmm_names[] =
 {
   "zmm0",  "zmm1",   "zmm2",  "zmm3",
   "zmm4",  "zmm5",   "zmm6",  "zmm7"
 };
 
-static const char *i386_zmmh_names[] =
+static const char * const i386_zmmh_names[] =
 {
   "zmm0h",  "zmm1h",   "zmm2h",  "zmm3h",
   "zmm4h",  "zmm5h",   "zmm6h",  "zmm7h"
 };
 
-static const char *i386_k_names[] =
+static const char * const i386_k_names[] =
 {
   "k0",  "k1",   "k2",  "k3",
   "k4",  "k5",   "k6",  "k7"
 };
 
-static const char *i386_ymm_names[] =
+static const char * const i386_ymm_names[] =
 {
   "ymm0",  "ymm1",   "ymm2",  "ymm3",
   "ymm4",  "ymm5",   "ymm6",  "ymm7",
 };
 
-static const char *i386_ymmh_names[] =
+static const char * const i386_ymmh_names[] =
 {
   "ymm0h",  "ymm1h",   "ymm2h",  "ymm3h",
   "ymm4h",  "ymm5h",   "ymm6h",  "ymm7h",
 };
 
-static const char *i386_mpx_names[] =
+static const char * const i386_mpx_names[] =
 {
   "bnd0raw", "bnd1raw", "bnd2raw", "bnd3raw", "bndcfgu", "bndstatus"
 };
 
-static const char* i386_pkeys_names[] =
+static const char * const i386_pkeys_names[] =
 {
   "pkru"
 };
 
 /* Register names for MPX pseudo-registers.  */
 
-static const char *i386_bnd_names[] =
+static const char * const i386_bnd_names[] =
 {
   "bnd0", "bnd1", "bnd2", "bnd3"
 };
 
 /* Register names for MMX pseudo-registers.  */
 
-static const char *i386_mmx_names[] =
+static const char * const i386_mmx_names[] =
 {
   "mm0", "mm1", "mm2", "mm3",
   "mm4", "mm5", "mm6", "mm7"
@@ -138,7 +142,7 @@ static const char *i386_mmx_names[] =
 
 /* Register names for byte pseudo-registers.  */
 
-static const char *i386_byte_names[] =
+static const char * const i386_byte_names[] =
 {
   "al", "cl", "dl", "bl", 
   "ah", "ch", "dh", "bh"
@@ -146,7 +150,7 @@ static const char *i386_byte_names[] =
 
 /* Register names for word pseudo-registers.  */
 
-static const char *i386_word_names[] =
+static const char * const i386_word_names[] =
 {
   "ax", "cx", "dx", "bx",
   "", "bp", "si", "di"
@@ -487,11 +491,11 @@ i386_dbx_reg_to_regnum (struct gdbarch *gdbarch, int reg)
   if (reg >= 0 && reg <= 7)
     {
       /* General-purpose registers.  The debug info calls %ebp
-         register 4, and %esp register 5.  */
+        register 4, and %esp register 5.  */
       if (reg == 4)
-        return 5;
+       return 5;
       else if (reg == 5)
-        return 4;
+       return 4;
       else return reg;
     }
   else if (reg >= 12 && reg <= 19)
@@ -517,7 +521,7 @@ i386_dbx_reg_to_regnum (struct gdbarch *gdbarch, int reg)
     }
 
   /* This will hopefully provoke a warning.  */
-  return gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+  return gdbarch_num_cooked_regs (gdbarch);
 }
 
 /* Convert SVR4 DWARF register number REG to the appropriate register number
@@ -574,7 +578,7 @@ i386_svr4_reg_to_regnum (struct gdbarch *gdbarch, int reg)
   int regnum = i386_svr4_dwarf_reg_to_regnum (gdbarch, reg);
 
   if (regnum == -1)
-    return gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+    return gdbarch_num_cooked_regs (gdbarch);
   return regnum;
 }
 
@@ -658,11 +662,11 @@ i386_absolute_jmp_p (const gdb_byte *insn)
     {
       /* jump near, absolute indirect (/4).  */
       if ((insn[1] & 0x38) == 0x20)
-        return 1;
+       return 1;
 
       /* jump far, absolute indirect (/5).  */
       if ((insn[1] & 0x38) == 0x28)
-        return 1;
+       return 1;
     }
 
   return 0;
@@ -695,11 +699,11 @@ i386_absolute_call_p (const gdb_byte *insn)
     {
       /* Call near, absolute indirect (/2).  */
       if ((insn[1] & 0x38) == 0x10)
-        return 1;
+       return 1;
 
       /* Call far, absolute indirect (/3).  */
       if ((insn[1] & 0x38) == 0x18)
-        return 1;
+       return 1;
     }
 
   return 0;
@@ -796,13 +800,15 @@ i386_insn_is_jump (struct gdbarch *gdbarch, CORE_ADDR addr)
 
 /* Some kernels may run one past a syscall insn, so we have to cope.  */
 
-struct displaced_step_closure *
+displaced_step_copy_insn_closure_up
 i386_displaced_step_copy_insn (struct gdbarch *gdbarch,
                               CORE_ADDR from, CORE_ADDR to,
                               struct regcache *regs)
 {
   size_t len = gdbarch_max_insn_length (gdbarch);
-  gdb_byte *buf = (gdb_byte *) xmalloc (len);
+  std::unique_ptr<i386_displaced_step_copy_insn_closure> closure
+    (new i386_displaced_step_copy_insn_closure (len));
+  gdb_byte *buf = closure->buf.data ();
 
   read_memory (from, buf, len);
 
@@ -820,14 +826,12 @@ i386_displaced_step_copy_insn (struct gdbarch *gdbarch,
 
   write_memory (to, buf, len);
 
-  if (debug_displaced)
-    {
-      fprintf_unfiltered (gdb_stdlog, "displaced: copy %s->%s: ",
-                          paddress (gdbarch, from), paddress (gdbarch, to));
-      displaced_step_dump_bytes (gdb_stdlog, buf, len);
-    }
+  displaced_debug_printf ("%s->%s: %s",
+                         paddress (gdbarch, from), paddress (gdbarch, to),
+                         displaced_step_dump_bytes (buf, len).c_str ());
 
-  return (struct displaced_step_closure *) buf;
+  /* This is a work around for a problem with g++ 4.8.  */
+  return displaced_step_copy_insn_closure_up (closure.release ());
 }
 
 /* Fix up the state of registers and memory after having single-stepped
@@ -835,9 +839,9 @@ i386_displaced_step_copy_insn (struct gdbarch *gdbarch,
 
 void
 i386_displaced_step_fixup (struct gdbarch *gdbarch,
-                           struct displaced_step_closure *closure,
-                           CORE_ADDR from, CORE_ADDR to,
-                           struct regcache *regs)
+                          struct displaced_step_copy_insn_closure *closure_,
+                          CORE_ADDR from, CORE_ADDR to,
+                          struct regcache *regs)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
 
@@ -847,17 +851,15 @@ i386_displaced_step_fixup (struct gdbarch *gdbarch,
      applying it.  */
   ULONGEST insn_offset = to - from;
 
-  /* Our closure is a copy of the instruction.  */
-  gdb_byte *insn = (gdb_byte *) closure;
+  i386_displaced_step_copy_insn_closure *closure
+    = (i386_displaced_step_copy_insn_closure *) closure_;
+  gdb_byte *insn = closure->buf.data ();
   /* The start of the insn, needed in case we see some prefixes.  */
   gdb_byte *insn_start = insn;
 
-  if (debug_displaced)
-    fprintf_unfiltered (gdb_stdlog,
-                        "displaced: fixup (%s, %s), "
-                        "insn = 0x%02x 0x%02x ...\n",
-                        paddress (gdbarch, from), paddress (gdbarch, to),
-                       insn[0], insn[1]);
+  displaced_debug_printf ("fixup (%s, %s), insn = 0x%02x 0x%02x ...",
+                         paddress (gdbarch, from), paddress (gdbarch, to),
+                         insn[0], insn[1]);
 
   /* The list of issues to contend with here is taken from
      resume_execution in arch/i386/kernel/kprobes.c, Linux 2.6.20.
@@ -892,49 +894,41 @@ i386_displaced_step_fixup (struct gdbarch *gdbarch,
       regcache_cooked_read_unsigned (regs, I386_EIP_REGNUM, &orig_eip);
 
       /* A signal trampoline system call changes the %eip, resuming
-         execution of the main program after the signal handler has
-         returned.  That makes them like 'return' instructions; we
-         shouldn't relocate %eip.
-
-         But most system calls don't, and we do need to relocate %eip.
-
-         Our heuristic for distinguishing these cases: if stepping
-         over the system call instruction left control directly after
-         the instruction, the we relocate --- control almost certainly
-         doesn't belong in the displaced copy.  Otherwise, we assume
-         the instruction has put control where it belongs, and leave
-         it unrelocated.  Goodness help us if there are PC-relative
-         system calls.  */
+        execution of the main program after the signal handler has
+        returned.  That makes them like 'return' instructions; we
+        shouldn't relocate %eip.
+
+        But most system calls don't, and we do need to relocate %eip.
+
+        Our heuristic for distinguishing these cases: if stepping
+        over the system call instruction left control directly after
+        the instruction, the we relocate --- control almost certainly
+        doesn't belong in the displaced copy.  Otherwise, we assume
+        the instruction has put control where it belongs, and leave
+        it unrelocated.  Goodness help us if there are PC-relative
+        system calls.  */
       if (i386_syscall_p (insn, &insn_len)
-          && orig_eip != to + (insn - insn_start) + insn_len
+         && orig_eip != to + (insn - insn_start) + insn_len
          /* GDB can get control back after the insn after the syscall.
             Presumably this is a kernel bug.
             i386_displaced_step_copy_insn ensures its a nop,
             we add one to the length for it.  */
-          && orig_eip != to + (insn - insn_start) + insn_len + 1)
-        {
-          if (debug_displaced)
-            fprintf_unfiltered (gdb_stdlog,
-                                "displaced: syscall changed %%eip; "
-                                "not relocating\n");
-        }
+         && orig_eip != to + (insn - insn_start) + insn_len + 1)
+       displaced_debug_printf ("syscall changed %%eip; not relocating");
       else
-        {
-          ULONGEST eip = (orig_eip - insn_offset) & 0xffffffffUL;
+       {
+         ULONGEST eip = (orig_eip - insn_offset) & 0xffffffffUL;
 
          /* If we just stepped over a breakpoint insn, we don't backup
             the pc on purpose; this is to match behaviour without
             stepping.  */
 
-          regcache_cooked_write_unsigned (regs, I386_EIP_REGNUM, eip);
+         regcache_cooked_write_unsigned (regs, I386_EIP_REGNUM, eip);
 
-          if (debug_displaced)
-            fprintf_unfiltered (gdb_stdlog,
-                                "displaced: "
-                                "relocated %%eip from %s to %s\n",
-                                paddress (gdbarch, orig_eip),
-                               paddress (gdbarch, eip));
-        }
+         displaced_debug_printf ("relocated %%eip from %s to %s",
+                                 paddress (gdbarch, orig_eip),
+                                 paddress (gdbarch, eip));
+       }
     }
 
   /* If the instruction was PUSHFL, then the TF bit will be set in the
@@ -956,11 +950,9 @@ i386_displaced_step_fixup (struct gdbarch *gdbarch,
       retaddr = (retaddr - insn_offset) & 0xffffffffUL;
       write_memory_unsigned_integer (esp, retaddr_len, byte_order, retaddr);
 
-      if (debug_displaced)
-        fprintf_unfiltered (gdb_stdlog,
-                            "displaced: relocated return addr at %s to %s\n",
-                            paddress (gdbarch, esp),
-                            paddress (gdbarch, retaddr));
+      displaced_debug_printf ("relocated return addr at %s to %s",
+                             paddress (gdbarch, esp),
+                             paddress (gdbarch, retaddr));
     }
 }
 
@@ -1012,12 +1004,9 @@ i386_relocate_instruction (struct gdbarch *gdbarch,
       newrel = (oldloc - *to) + rel32;
       store_signed_integer (insn + 1, 4, byte_order, newrel);
 
-      if (debug_displaced)
-       fprintf_unfiltered (gdb_stdlog,
-                           "Adjusted insn rel32=%s at %s to"
-                           " rel32=%s at %s\n",
-                           hex_string (rel32), paddress (gdbarch, oldloc),
-                           hex_string (newrel), paddress (gdbarch, *to));
+      displaced_debug_printf ("adjusted insn rel32=%s at %s to rel32=%s at %s",
+                             hex_string (rel32), paddress (gdbarch, oldloc),
+                             hex_string (newrel), paddress (gdbarch, *to));
 
       /* Write the adjusted jump into its displaced location.  */
       append_insns (to, 5, insn);
@@ -1037,12 +1026,9 @@ i386_relocate_instruction (struct gdbarch *gdbarch,
       rel32 = extract_signed_integer (insn + offset, 4, byte_order);
       newrel = (oldloc - *to) + rel32;
       store_signed_integer (insn + offset, 4, byte_order, newrel);
-      if (debug_displaced)
-       fprintf_unfiltered (gdb_stdlog,
-                           "Adjusted insn rel32=%s at %s to"
-                           " rel32=%s at %s\n",
-                           hex_string (rel32), paddress (gdbarch, oldloc),
-                           hex_string (newrel), paddress (gdbarch, *to));
+      displaced_debug_printf ("adjusted insn rel32=%s at %s to rel32=%s at %s",
+                             hex_string (rel32), paddress (gdbarch, oldloc),
+                             hex_string (newrel), paddress (gdbarch, *to));
     }
 
   /* Write the adjusted instructions into their displaced
@@ -1141,7 +1127,7 @@ i386_follow_jump (struct gdbarch *gdbarch, CORE_ADDR pc)
          delta = read_memory_integer (pc + 2, 2, byte_order);
 
          /* Include the size of the jmp instruction (including the
-             0x66 prefix).  */
+            0x66 prefix).  */
          delta += 4;
        }
       else
@@ -1175,8 +1161,8 @@ i386_analyze_struct_return (CORE_ADDR pc, CORE_ADDR current_pc,
 {
   /* Functions that return a structure or union start with:
 
-        popl %eax             0x58
-        xchgl %eax, (%esp)    0x87 0x04 0x24
+       popl %eax             0x58
+       xchgl %eax, (%esp)    0x87 0x04 0x24
      or xchgl %eax, 0(%esp)   0x87 0x44 0x24 0x00
 
      (the System V compiler puts out the second `xchg' instruction,
@@ -1226,13 +1212,13 @@ i386_skip_probe (CORE_ADDR pc)
 {
   /* A function may start with
 
-        pushl constant
-        call _probe
+       pushl constant
+       call _probe
        addl $4, %esp
           
      followed by
 
-        pushl %ebp
+       pushl %ebp
 
      etc.  */
   gdb_byte buf[8];
@@ -1290,8 +1276,8 @@ i386_analyze_stack_align (CORE_ADDR pc, CORE_ADDR current_pc,
 
      "andl $-XXX, %esp" can be either 3 bytes or 6 bytes:
      
-       0x83 0xe4 0xf0                  andl $-16, %esp
-       0x81 0xe4 0x00 0xff 0xff 0xff   andl $-256, %esp
+       0x83 0xe4 0xf0                  andl $-16, %esp
+       0x81 0xe4 0x00 0xff 0xff 0xff   andl $-256, %esp
    */
 
   gdb_byte buf[14];
@@ -1482,7 +1468,7 @@ i386_match_insn_block (CORE_ADDR pc, struct i386_insn *insn_patterns)
    yet, and only the scratch registers %eax, %ecx and %edx can be
    touched.  */
 
-struct i386_insn i386_frame_setup_skip_insns[] =
+static i386_insn i386_frame_setup_skip_insns[] =
 {
   /* Check for `movb imm8, r' and `movl imm32, r'.
     
@@ -1501,7 +1487,7 @@ struct i386_insn i386_frame_setup_skip_insns[] =
   /* Check for `mov imm32, r32'.  Note that there is an alternative
      encoding for `mov m32, %eax'.
 
-     ??? Should we handle SIB adressing here?
+     ??? Should we handle SIB addressing here?
      ??? Should we handle 16-bit operand-sizes here?  */
 
   /* `movl m32, %eax' */
@@ -1531,6 +1517,24 @@ struct i386_insn i386_frame_setup_skip_insns[] =
   { 0 }
 };
 
+/* Check whether PC points to an endbr32 instruction.  */
+static CORE_ADDR
+i386_skip_endbr (CORE_ADDR pc)
+{
+  static const gdb_byte endbr32[] = { 0xf3, 0x0f, 0x1e, 0xfb };
+
+  gdb_byte buf[sizeof (endbr32)];
+
+  /* Stop there if we can't read the code */
+  if (target_read_code (pc, buf, sizeof (endbr32)))
+    return pc;
+
+  /* If the instruction isn't an endbr32, stop */
+  if (memcmp (buf, endbr32, sizeof (endbr32)) != 0)
+    return pc;
+
+  return pc + sizeof (endbr32);
+}
 
 /* Check whether PC points to a no-op instruction.  */
 static CORE_ADDR
@@ -1618,7 +1622,7 @@ i386_analyze_frame_setup (struct gdbarch *gdbarch,
       /* Check for some special instructions that might be migrated by
         GCC into the prologue and skip them.  At this point in the
         prologue, code should only touch the scratch registers %eax,
-        %ecx and %edx, so while the number of posibilities is sheer,
+        %ecx and %edx, so while the number of possibilities is sheer,
         it is limited.
 
         Make sure we only skip these instructions if we later see the
@@ -1808,6 +1812,7 @@ i386_analyze_prologue (struct gdbarch *gdbarch,
                       CORE_ADDR pc, CORE_ADDR current_pc,
                       struct i386_frame_cache *cache)
 {
+  pc = i386_skip_endbr (pc);
   pc = i386_skip_noop (pc);
   pc = i386_follow_jump (gdbarch, pc);
   pc = i386_analyze_struct_return (pc, current_pc, cache);
@@ -1841,12 +1846,14 @@ i386_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
        = skip_prologue_using_sal (gdbarch, func_addr);
       struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr);
 
-      /* Clang always emits a line note before the prologue and another
-        one after.  We trust clang to emit usable line notes.  */
+      /* LLVM backend (Clang/Flang) always emits a line note before the
+        prologue and another one after.  We trust clang and newer Intel
+        compilers to emit usable line notes.  */
       if (post_prologue_pc
          && (cust != NULL
              && COMPUNIT_PRODUCER (cust) != NULL
-             && startswith (COMPUNIT_PRODUCER (cust), "clang ")))
+             && (producer_is_llvm (COMPUNIT_PRODUCER (cust))
+             || producer_is_icc_ge_19 (COMPUNIT_PRODUCER (cust)))))
         return std::max (start_pc, post_prologue_pc);
     }
  
@@ -1861,10 +1868,10 @@ i386_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
      to get the address of the global offset table (GOT) into register
      %ebx:
 
-        call   0x0
+       call    0x0
        popl    %ebx
-        movl    %ebx,x(%ebp)    (optional)
-        addl    y,%ebx
+       movl    %ebx,x(%ebp)    (optional)
+       addl    y,%ebx
 
      This code is with the rest of the prologue (at the end of the
      function), so we have to skip it to get to the first real
@@ -1896,7 +1903,7 @@ i386_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
          else                  /* Unexpected instruction.  */
            delta = 0;
 
-          if (target_read_code (pc + delta, &op, 1))
+         if (target_read_code (pc + delta, &op, 1))
            return pc;
        }
 
@@ -1934,20 +1941,20 @@ i386_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
       gdb_byte buf[4];
 
       if (target_read_code (pc + 1, buf, sizeof buf) == 0)
-       {
+       {
          /* Make sure address is computed correctly as a 32bit
             integer even if CORE_ADDR is 64 bit wide.  */
-         struct bound_minimal_symbol s;
-         CORE_ADDR call_dest;
+         struct bound_minimal_symbol s;
+         CORE_ADDR call_dest;
 
          call_dest = pc + 5 + extract_signed_integer (buf, 4, byte_order);
          call_dest = call_dest & 0xffffffffU;
-         s = lookup_minimal_symbol_by_pc (call_dest);
-         if (s.minsym != NULL
-             && MSYMBOL_LINKAGE_NAME (s.minsym) != NULL
-             && strcmp (MSYMBOL_LINKAGE_NAME (s.minsym), "__main") == 0)
-           pc += 5;
-       }
+         s = lookup_minimal_symbol_by_pc (call_dest);
+         if (s.minsym != NULL
+             && s.minsym->linkage_name () != NULL
+             && strcmp (s.minsym->linkage_name (), "__main") == 0)
+           pc += 5;
+       }
     }
 
   return pc;
@@ -2079,16 +2086,15 @@ i386_frame_cache (struct frame_info *this_frame, void **this_cache)
   cache = i386_alloc_frame_cache ();
   *this_cache = cache;
 
-  TRY
+  try
     {
       i386_frame_cache_1 (this_frame, cache);
     }
-  CATCH (ex, RETURN_MASK_ERROR)
+  catch (const gdb_exception_error &ex)
     {
       if (ex.error != NOT_AVAILABLE_ERROR)
-       throw_exception (ex);
+       throw;
     }
-  END_CATCH
 
   return cache;
 }
@@ -2190,6 +2196,7 @@ i386_frame_prev_register (struct frame_info *this_frame, void **this_cache,
 
 static const struct frame_unwind i386_frame_unwind =
 {
+  "i386 prologue",
   NORMAL_FRAME,
   i386_frame_unwind_stop_reason,
   i386_frame_this_id,
@@ -2249,7 +2256,7 @@ i386_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
   cache = i386_alloc_frame_cache ();
   *this_cache = cache;
 
-  TRY
+  try
     {
       cache->pc = get_frame_func (this_frame);
 
@@ -2263,12 +2270,11 @@ i386_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
 
       cache->base_p = 1;
     }
-  CATCH (ex, RETURN_MASK_ERROR)
+  catch (const gdb_exception_error &ex)
     {
       if (ex.error != NOT_AVAILABLE_ERROR)
-       throw_exception (ex);
+       throw;
     }
-  END_CATCH
 
   return cache;
 }
@@ -2312,6 +2318,7 @@ i386_epilogue_frame_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind i386_epilogue_frame_unwind =
 {
+  "i386 epilogue",
   NORMAL_FRAME,
   i386_epilogue_frame_unwind_stop_reason,
   i386_epilogue_frame_this_id,
@@ -2330,7 +2337,7 @@ static const struct frame_unwind i386_epilogue_frame_unwind =
 
 /* Static chain passed in register.  */
 
-struct i386_insn i386_tramp_chain_in_reg_insns[] =
+static i386_insn i386_tramp_chain_in_reg_insns[] =
 {
   /* `movl imm32, %eax' and `movl imm32, %ecx' */
   { 5, { 0xb8 }, { 0xfe } },
@@ -2343,7 +2350,7 @@ struct i386_insn i386_tramp_chain_in_reg_insns[] =
 
 /* Static chain passed on stack (when regparm=3).  */
 
-struct i386_insn i386_tramp_chain_on_stack_insns[] =
+static i386_insn i386_tramp_chain_on_stack_insns[] =
 {
   /* `push imm32' */
   { 5, { 0x68 }, { 0xff } },
@@ -2393,6 +2400,7 @@ i386_stack_tramp_frame_sniffer (const struct frame_unwind *self,
 
 static const struct frame_unwind i386_stack_tramp_frame_unwind =
 {
+  "i386 stack tramp",
   NORMAL_FRAME,
   i386_epilogue_frame_unwind_stop_reason,
   i386_epilogue_frame_this_id,
@@ -2435,7 +2443,7 @@ i386_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
 
   cache = i386_alloc_frame_cache ();
 
-  TRY
+  try
     {
       get_frame_register (this_frame, I386_ESP_REGNUM, buf);
       cache->base = extract_unsigned_integer (buf, 4, byte_order) - 4;
@@ -2459,12 +2467,11 @@ i386_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
 
       cache->base_p = 1;
     }
-  CATCH (ex, RETURN_MASK_ERROR)
+  catch (const gdb_exception_error &ex)
     {
       if (ex.error != NOT_AVAILABLE_ERROR)
-       throw_exception (ex);
+       throw;
     }
-  END_CATCH
 
   *this_cache = cache;
   return cache;
@@ -2541,6 +2548,7 @@ i386_sigtramp_frame_sniffer (const struct frame_unwind *self,
 
 static const struct frame_unwind i386_sigtramp_frame_unwind =
 {
+  "i386 sigtramp",
   SIGTRAMP_FRAME,
   i386_sigtramp_frame_unwind_stop_reason,
   i386_sigtramp_frame_this_id,
@@ -2630,19 +2638,21 @@ static int
 i386_16_byte_align_p (struct type *type)
 {
   type = check_typedef (type);
-  if ((TYPE_CODE (type) == TYPE_CODE_DECFLOAT
-       || (TYPE_CODE (type) == TYPE_CODE_ARRAY && TYPE_VECTOR (type)))
+  if ((type->code () == TYPE_CODE_DECFLOAT
+       || (type->code () == TYPE_CODE_ARRAY && type->is_vector ()))
       && TYPE_LENGTH (type) == 16)
     return 1;
-  if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
+  if (type->code () == TYPE_CODE_ARRAY)
     return i386_16_byte_align_p (TYPE_TARGET_TYPE (type));
-  if (TYPE_CODE (type) == TYPE_CODE_STRUCT
-      || TYPE_CODE (type) == TYPE_CODE_UNION)
+  if (type->code () == TYPE_CODE_STRUCT
+      || type->code () == TYPE_CODE_UNION)
     {
       int i;
-      for (i = 0; i < TYPE_NFIELDS (type); i++)
+      for (i = 0; i < type->num_fields (); i++)
        {
-         if (i386_16_byte_align_p (TYPE_FIELD_TYPE (type, i)))
+         if (field_is_static (&type->field (i)))
+           continue;
+         if (i386_16_byte_align_p (type->field (i).type ()))
            return 1;
        }
     }
@@ -2665,11 +2675,15 @@ i386_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp, CORE_ADDR funaddr,
   return sp - 16;
 }
 
-static CORE_ADDR
-i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
-                     struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
-                     struct value **args, CORE_ADDR sp, int struct_return,
-                     CORE_ADDR struct_addr)
+/* The "push_dummy_call" gdbarch method, optionally with the thiscall
+   calling convention.  */
+
+CORE_ADDR
+i386_thiscall_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
+                              struct regcache *regcache, CORE_ADDR bp_addr,
+                              int nargs, struct value **args, CORE_ADDR sp,
+                              function_call_return_method return_method,
+                              CORE_ADDR struct_addr, bool thiscall)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   gdb_byte buf[4];
@@ -2692,7 +2706,7 @@ i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
     {
       int args_space_used = 0;
 
-      if (struct_return)
+      if (return_method == return_method_struct)
        {
          if (write_pass)
            {
@@ -2705,7 +2719,7 @@ i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
            args_space += 4;
        }
 
-      for (i = 0; i < nargs; i++)
+      for (i = thiscall ? 1 : 0; i < nargs; i++)
        {
          int len = TYPE_LENGTH (value_enclosing_type (args[i]));
 
@@ -2752,10 +2766,14 @@ i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 
   /* Finally, update the stack pointer...  */
   store_unsigned_integer (buf, 4, byte_order, sp);
-  regcache_cooked_write (regcache, I386_ESP_REGNUM, buf);
+  regcache->cooked_write (I386_ESP_REGNUM, buf);
 
   /* ...and fake a frame pointer.  */
-  regcache_cooked_write (regcache, I386_EBP_REGNUM, buf);
+  regcache->cooked_write (I386_EBP_REGNUM, buf);
+
+  /* The 'this' pointer needs to be in ECX.  */
+  if (thiscall)
+    regcache->cooked_write (I386_ECX_REGNUM, value_contents_all (args[0]));
 
   /* MarkK wrote: This "+ 8" is all over the place:
      (i386_frame_this_id, i386_sigtramp_frame_this_id,
@@ -2769,6 +2787,20 @@ i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   return sp + 8;
 }
 
+/* Implement the "push_dummy_call" gdbarch method.  */
+
+static CORE_ADDR
+i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
+                     struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
+                     struct value **args, CORE_ADDR sp,
+                     function_call_return_method return_method,
+                     CORE_ADDR struct_addr)
+{
+  return i386_thiscall_push_dummy_call (gdbarch, function, regcache, bp_addr,
+                                       nargs, args, sp, return_method,
+                                       struct_addr, false);
+}
+
 /* These registers are used for returning integers (and on some
    targets also for returning `struct' and `union' values when their
    size and alignment match an integer type).  */
@@ -2786,7 +2818,7 @@ i386_extract_return_value (struct gdbarch *gdbarch, struct type *type,
   int len = TYPE_LENGTH (type);
   gdb_byte buf[I386_MAX_REGISTER_SIZE];
 
-  if (TYPE_CODE (type) == TYPE_CODE_FLT)
+  if (type->code () == TYPE_CODE_FLT)
     {
       if (tdep->st0_regnum < 0)
        {
@@ -2799,8 +2831,8 @@ i386_extract_return_value (struct gdbarch *gdbarch, struct type *type,
         its contents to the desired type.  This is probably not
         exactly how it would happen on the target itself, but it is
         the best we can do.  */
-      regcache_raw_read (regcache, I386_ST0_REGNUM, buf);
-      convert_typed_floating (buf, i387_ext_type (gdbarch), valbuf, type);
+      regcache->raw_read (I386_ST0_REGNUM, buf);
+      target_float_convert (buf, i387_ext_type (gdbarch), valbuf, type);
     }
   else
     {
@@ -2809,14 +2841,14 @@ i386_extract_return_value (struct gdbarch *gdbarch, struct type *type,
 
       if (len <= low_size)
        {
-         regcache_raw_read (regcache, LOW_RETURN_REGNUM, buf);
+         regcache->raw_read (LOW_RETURN_REGNUM, buf);
          memcpy (valbuf, buf, len);
        }
       else if (len <= (low_size + high_size))
        {
-         regcache_raw_read (regcache, LOW_RETURN_REGNUM, buf);
+         regcache->raw_read (LOW_RETURN_REGNUM, buf);
          memcpy (valbuf, buf, low_size);
-         regcache_raw_read (regcache, HIGH_RETURN_REGNUM, buf);
+         regcache->raw_read (HIGH_RETURN_REGNUM, buf);
          memcpy (valbuf + low_size, buf, len - low_size);
        }
       else
@@ -2836,7 +2868,7 @@ i386_store_return_value (struct gdbarch *gdbarch, struct type *type,
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   int len = TYPE_LENGTH (type);
 
-  if (TYPE_CODE (type) == TYPE_CODE_FLT)
+  if (type->code () == TYPE_CODE_FLT)
     {
       ULONGEST fstat;
       gdb_byte buf[I386_MAX_REGISTER_SIZE];
@@ -2848,27 +2880,27 @@ i386_store_return_value (struct gdbarch *gdbarch, struct type *type,
        }
 
       /* Returning floating-point values is a bit tricky.  Apart from
-         storing the return value in %st(0), we have to simulate the
-         state of the FPU at function return point.  */
+        storing the return value in %st(0), we have to simulate the
+        state of the FPU at function return point.  */
 
       /* Convert the value found in VALBUF to the extended
         floating-point format used by the FPU.  This is probably
         not exactly how it would happen on the target itself, but
         it is the best we can do.  */
-      convert_typed_floating (valbuf, type, buf, i387_ext_type (gdbarch));
-      regcache_raw_write (regcache, I386_ST0_REGNUM, buf);
+      target_float_convert (valbuf, type, buf, i387_ext_type (gdbarch));
+      regcache->raw_write (I386_ST0_REGNUM, buf);
 
       /* Set the top of the floating-point register stack to 7.  The
-         actual value doesn't really matter, but 7 is what a normal
-         function return would end up with if the program started out
-         with a freshly initialized FPU.  */
+        actual value doesn't really matter, but 7 is what a normal
+        function return would end up with if the program started out
+        with a freshly initialized FPU.  */
       regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM (tdep), &fstat);
       fstat |= (7 << 11);
       regcache_raw_write_unsigned (regcache, I387_FSTAT_REGNUM (tdep), fstat);
 
       /* Mark %st(1) through %st(7) as empty.  Since we set the top of
-         the floating-point register stack to 7, the appropriate value
-         for the tag word is 0x3fff.  */
+        the floating-point register stack to 7, the appropriate value
+        for the tag word is 0x3fff.  */
       regcache_raw_write_unsigned (regcache, I387_FTAG_REGNUM (tdep), 0x3fff);
     }
   else
@@ -2877,12 +2909,12 @@ i386_store_return_value (struct gdbarch *gdbarch, struct type *type,
       int high_size = register_size (gdbarch, HIGH_RETURN_REGNUM);
 
       if (len <= low_size)
-       regcache_raw_write_part (regcache, LOW_RETURN_REGNUM, 0, len, valbuf);
+       regcache->raw_write_part (LOW_RETURN_REGNUM, 0, len, valbuf);
       else if (len <= (low_size + high_size))
        {
-         regcache_raw_write (regcache, LOW_RETURN_REGNUM, valbuf);
-         regcache_raw_write_part (regcache, HIGH_RETURN_REGNUM, 0,
-                                  len - low_size, valbuf + low_size);
+         regcache->raw_write (LOW_RETURN_REGNUM, valbuf);
+         regcache->raw_write_part (HIGH_RETURN_REGNUM, 0, len - low_size,
+                                   valbuf + low_size);
        }
       else
        internal_error (__FILE__, __LINE__,
@@ -2913,12 +2945,12 @@ static int
 i386_reg_struct_return_p (struct gdbarch *gdbarch, struct type *type)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
-  enum type_code code = TYPE_CODE (type);
+  enum type_code code = type->code ();
   int len = TYPE_LENGTH (type);
 
   gdb_assert (code == TYPE_CODE_STRUCT
-              || code == TYPE_CODE_UNION
-              || code == TYPE_CODE_ARRAY);
+             || code == TYPE_CODE_UNION
+             || code == TYPE_CODE_ARRAY);
 
   if (struct_convention == pcc_struct_convention
       || (struct_convention == default_struct_convention
@@ -2927,10 +2959,10 @@ i386_reg_struct_return_p (struct gdbarch *gdbarch, struct type *type)
 
   /* Structures consisting of a single `float', `double' or 'long
      double' member are returned in %st(0).  */
-  if (code == TYPE_CODE_STRUCT && TYPE_NFIELDS (type) == 1)
+  if (code == TYPE_CODE_STRUCT && type->num_fields () == 1)
     {
-      type = check_typedef (TYPE_FIELD_TYPE (type, 0));
-      if (TYPE_CODE (type) == TYPE_CODE_FLT)
+      type = check_typedef (type->field (0).type ());
+      if (type->code () == TYPE_CODE_FLT)
        return (len == 4 || len == 8 || len == 12);
     }
 
@@ -2948,13 +2980,13 @@ i386_return_value (struct gdbarch *gdbarch, struct value *function,
                   struct type *type, struct regcache *regcache,
                   gdb_byte *readbuf, const gdb_byte *writebuf)
 {
-  enum type_code code = TYPE_CODE (type);
+  enum type_code code = type->code ();
 
   if (((code == TYPE_CODE_STRUCT
        || code == TYPE_CODE_UNION
        || code == TYPE_CODE_ARRAY)
        && !i386_reg_struct_return_p (gdbarch, type))
-      /* Complex double and long double uses the struct return covention.  */
+      /* Complex double and long double uses the struct return convention.  */
       || (code == TYPE_CODE_COMPLEX && TYPE_LENGTH (type) == 16)
       || (code == TYPE_CODE_COMPLEX && TYPE_LENGTH (type) == 24)
       /* 128-bit decimal float uses the struct return convention.  */
@@ -2972,10 +3004,10 @@ i386_return_value (struct gdbarch *gdbarch, struct value *function,
         value just after the function has returned.  */
 
       /* Note that the ABI doesn't mention functions returning arrays,
-         which is something possible in certain languages such as Ada.
-         In this case, the value is returned as if it was wrapped in
-         a record, so the convention applied to records also applies
-         to arrays.  */
+        which is something possible in certain languages such as Ada.
+        In this case, the value is returned as if it was wrapped in
+        a record, so the convention applied to records also applies
+        to arrays.  */
 
       if (readbuf)
        {
@@ -2995,9 +3027,9 @@ i386_return_value (struct gdbarch *gdbarch, struct value *function,
      the structure.  Since that should work for all structures that
      have only one member, we don't bother to check the member's type
      here.  */
-  if (code == TYPE_CODE_STRUCT && TYPE_NFIELDS (type) == 1)
+  if (code == TYPE_CODE_STRUCT && type->num_fields () == 1)
     {
-      type = check_typedef (TYPE_FIELD_TYPE (type, 0));
+      type = check_typedef (type->field (0).type ());
       return i386_return_value (gdbarch, function, type, regcache,
                                readbuf, writebuf);
     }
@@ -3055,7 +3087,7 @@ i386_bnd_type (struct gdbarch *gdbarch)
       append_composite_type_field (t, "lbound", bt->builtin_data_ptr);
       append_composite_type_field (t, "ubound", bt->builtin_data_ptr);
 
-      TYPE_NAME (t) = "builtin_type_bound128";
+      t->set_name ("builtin_type_bound128");
       tdep->i386_bnd_type = t;
     }
 
@@ -3078,13 +3110,14 @@ i386_zmm_type (struct gdbarch *gdbarch)
 #if 0
       union __gdb_builtin_type_vec512i
       {
-       int128_t uint128[4];
-       int64_t v4_int64[8];
-       int32_t v8_int32[16];
-       int16_t v16_int16[32];
-       int8_t v32_int8[64];
-       double v4_double[8];
-       float v8_float[16];
+       int128_t v4_int128[4];
+       int64_t v8_int64[8];
+       int32_t v16_int32[16];
+       int16_t v32_int16[32];
+       int8_t v64_int8[64];
+       double v8_double[8];
+       float v16_float[16];
+       bfloat16_t v32_bfloat16[32];
       };
 #endif
 
@@ -3092,6 +3125,8 @@ i386_zmm_type (struct gdbarch *gdbarch)
 
       t = arch_composite_type (gdbarch,
                               "__gdb_builtin_type_vec512i", TYPE_CODE_UNION);
+      append_composite_type_field (t, "v32_bfloat16",
+                                  init_vector_type (bt->builtin_bfloat16, 32));
       append_composite_type_field (t, "v16_float",
                                   init_vector_type (bt->builtin_float, 16));
       append_composite_type_field (t, "v8_double",
@@ -3107,8 +3142,8 @@ i386_zmm_type (struct gdbarch *gdbarch)
       append_composite_type_field (t, "v4_int128",
                                   init_vector_type (bt->builtin_int128, 4));
 
-      TYPE_VECTOR (t) = 1;
-      TYPE_NAME (t) = "builtin_type_vec512i";
+      t->set_is_vector (true);
+      t->set_name ("builtin_type_vec512i");
       tdep->i386_zmm_type = t;
     }
 
@@ -3131,13 +3166,14 @@ i386_ymm_type (struct gdbarch *gdbarch)
 #if 0
       union __gdb_builtin_type_vec256i
       {
-        int128_t uint128[2];
-        int64_t v2_int64[4];
-        int32_t v4_int32[8];
-        int16_t v8_int16[16];
-        int8_t v16_int8[32];
-        double v2_double[4];
-        float v4_float[8];
+       int128_t v2_int128[2];
+       int64_t v4_int64[4];
+       int32_t v8_int32[8];
+       int16_t v16_int16[16];
+       int8_t v32_int8[32];
+       double v4_double[4];
+       float v8_float[8];
+       bfloat16_t v16_bfloat16[16];
       };
 #endif
 
@@ -3145,6 +3181,8 @@ i386_ymm_type (struct gdbarch *gdbarch)
 
       t = arch_composite_type (gdbarch,
                               "__gdb_builtin_type_vec256i", TYPE_CODE_UNION);
+      append_composite_type_field (t, "v16_bfloat16",
+                                  init_vector_type (bt->builtin_bfloat16, 16));
       append_composite_type_field (t, "v8_float",
                                   init_vector_type (bt->builtin_float, 8));
       append_composite_type_field (t, "v4_double",
@@ -3160,8 +3198,8 @@ i386_ymm_type (struct gdbarch *gdbarch)
       append_composite_type_field (t, "v2_int128",
                                   init_vector_type (bt->builtin_int128, 2));
 
-      TYPE_VECTOR (t) = 1;
-      TYPE_NAME (t) = "builtin_type_vec256i";
+      t->set_is_vector (true);
+      t->set_name ("builtin_type_vec256i");
       tdep->i386_ymm_type = t;
     }
 
@@ -3182,10 +3220,10 @@ i386_mmx_type (struct gdbarch *gdbarch)
 #if 0
       union __gdb_builtin_type_vec64i
       {
-        int64_t uint64;
-        int32_t v2_int32[2];
-        int16_t v4_int16[4];
-        int8_t v8_int8[8];
+       int64_t uint64;
+       int32_t v2_int32[2];
+       int16_t v4_int16[4];
+       int8_t v8_int8[8];
       };
 #endif
 
@@ -3202,8 +3240,8 @@ i386_mmx_type (struct gdbarch *gdbarch)
       append_composite_type_field (t, "v8_int8",
                                   init_vector_type (bt->builtin_int8, 8));
 
-      TYPE_VECTOR (t) = 1;
-      TYPE_NAME (t) = "builtin_type_vec64i";
+      t->set_is_vector (true);
+      t->set_name ("builtin_type_vec64i");
       tdep->i386_mmx_type = t;
     }
 
@@ -3246,15 +3284,15 @@ i386_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
    the MMX registers need to be mapped onto floating point registers.  */
 
 static int
-i386_mmx_regnum_to_fp_regnum (struct regcache *regcache, int regnum)
+i386_mmx_regnum_to_fp_regnum (readable_regcache *regcache, int regnum)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (get_regcache_arch (regcache));
+  struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
   int mmxreg, fpreg;
   ULONGEST fstat;
   int tos;
 
   mmxreg = regnum - tdep->mm0_regnum;
-  regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM (tdep), &fstat);
+  regcache->raw_read (I387_FSTAT_REGNUM (tdep), &fstat);
   tos = (fstat >> 11) & 0x7;
   fpreg = (mmxreg + tos) % 8;
 
@@ -3267,7 +3305,7 @@ i386_mmx_regnum_to_fp_regnum (struct regcache *regcache, int regnum)
 
 void
 i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
-                                     struct regcache *regcache,
+                                     readable_regcache *regcache,
                                      int regnum,
                                      struct value *result_value)
 {
@@ -3280,7 +3318,7 @@ i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
       int fpnum = i386_mmx_regnum_to_fp_regnum (regcache, regnum);
 
       /* Extract (always little endian).  */
-      status = regcache_raw_read (regcache, fpnum, raw_buf);
+      status = regcache->raw_read (fpnum, raw_buf);
       if (status != REG_VALID)
        mark_value_bytes_unavailable (result_value, 0,
                                      TYPE_LENGTH (value_type (result_value)));
@@ -3295,9 +3333,8 @@ i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
          regnum -= tdep->bnd0_regnum;
 
          /* Extract (always little endian).  Read lower 128bits.  */
-         status = regcache_raw_read (regcache,
-                                     I387_BND0R_REGNUM (tdep) + regnum,
-                                     raw_buf);
+         status = regcache->raw_read (I387_BND0R_REGNUM (tdep) + regnum,
+                                      raw_buf);
          if (status != REG_VALID)
            mark_value_bytes_unavailable (result_value, 0, 16);
          else
@@ -3319,9 +3356,7 @@ i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
          regnum -= tdep->k0_regnum;
 
          /* Extract (always little endian).  */
-         status = regcache_raw_read (regcache,
-                                     tdep->k0_regnum + regnum,
-                                     raw_buf);
+         status = regcache->raw_read (tdep->k0_regnum + regnum, raw_buf);
          if (status != REG_VALID)
            mark_value_bytes_unavailable (result_value, 0, 8);
          else
@@ -3334,18 +3369,16 @@ i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
          if (regnum < num_lower_zmm_regs)
            {
              /* Extract (always little endian).  Read lower 128bits.  */
-             status = regcache_raw_read (regcache,
-                                         I387_XMM0_REGNUM (tdep) + regnum,
-                                         raw_buf);
+             status = regcache->raw_read (I387_XMM0_REGNUM (tdep) + regnum,
+                                          raw_buf);
              if (status != REG_VALID)
                mark_value_bytes_unavailable (result_value, 0, 16);
              else
                memcpy (buf, raw_buf, 16);
 
              /* Extract (always little endian).  Read upper 128bits.  */
-             status = regcache_raw_read (regcache,
-                                         tdep->ymm0h_regnum + regnum,
-                                         raw_buf);
+             status = regcache->raw_read (tdep->ymm0h_regnum + regnum,
+                                          raw_buf);
              if (status != REG_VALID)
                mark_value_bytes_unavailable (result_value, 16, 16);
              else
@@ -3354,20 +3387,18 @@ i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
          else
            {
              /* Extract (always little endian).  Read lower 128bits.  */
-             status = regcache_raw_read (regcache,
-                                         I387_XMM16_REGNUM (tdep) + regnum
-                                         - num_lower_zmm_regs,
-                                         raw_buf);
+             status = regcache->raw_read (I387_XMM16_REGNUM (tdep) + regnum
+                                          - num_lower_zmm_regs,
+                                          raw_buf);
              if (status != REG_VALID)
                mark_value_bytes_unavailable (result_value, 0, 16);
              else
                memcpy (buf, raw_buf, 16);
 
              /* Extract (always little endian).  Read upper 128bits.  */
-             status = regcache_raw_read (regcache,
-                                         I387_YMM16H_REGNUM (tdep) + regnum
-                                         - num_lower_zmm_regs,
-                                         raw_buf);
+             status = regcache->raw_read (I387_YMM16H_REGNUM (tdep) + regnum
+                                          - num_lower_zmm_regs,
+                                          raw_buf);
              if (status != REG_VALID)
                mark_value_bytes_unavailable (result_value, 16, 16);
              else
@@ -3375,9 +3406,8 @@ i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
            }
 
          /* Read upper 256bits.  */
-         status = regcache_raw_read (regcache,
-                                     tdep->zmm0h_regnum + regnum,
-                                     raw_buf);
+         status = regcache->raw_read (tdep->zmm0h_regnum + regnum,
+                                      raw_buf);
          if (status != REG_VALID)
            mark_value_bytes_unavailable (result_value, 32, 32);
          else
@@ -3388,17 +3418,15 @@ i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
          regnum -= tdep->ymm0_regnum;
 
          /* Extract (always little endian).  Read lower 128bits.  */
-         status = regcache_raw_read (regcache,
-                                     I387_XMM0_REGNUM (tdep) + regnum,
-                                     raw_buf);
+         status = regcache->raw_read (I387_XMM0_REGNUM (tdep) + regnum,
+                                      raw_buf);
          if (status != REG_VALID)
            mark_value_bytes_unavailable (result_value, 0, 16);
          else
            memcpy (buf, raw_buf, 16);
          /* Read upper 128bits.  */
-         status = regcache_raw_read (regcache,
-                                     tdep->ymm0h_regnum + regnum,
-                                     raw_buf);
+         status = regcache->raw_read (tdep->ymm0h_regnum + regnum,
+                                      raw_buf);
          if (status != REG_VALID)
            mark_value_bytes_unavailable (result_value, 16, 32);
          else
@@ -3408,17 +3436,15 @@ i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
        {
          regnum -= tdep->ymm16_regnum;
          /* Extract (always little endian).  Read lower 128bits.  */
-         status = regcache_raw_read (regcache,
-                                     I387_XMM16_REGNUM (tdep) + regnum,
-                                     raw_buf);
+         status = regcache->raw_read (I387_XMM16_REGNUM (tdep) + regnum,
+                                      raw_buf);
          if (status != REG_VALID)
            mark_value_bytes_unavailable (result_value, 0, 16);
          else
            memcpy (buf, raw_buf, 16);
          /* Read upper 128bits.  */
-         status = regcache_raw_read (regcache,
-                                     tdep->ymm16h_regnum + regnum,
-                                     raw_buf);
+         status = regcache->raw_read (tdep->ymm16h_regnum + regnum,
+                                      raw_buf);
          if (status != REG_VALID)
            mark_value_bytes_unavailable (result_value, 16, 16);
          else
@@ -3429,7 +3455,7 @@ i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
          int gpnum = regnum - tdep->ax_regnum;
 
          /* Extract (always little endian).  */
-         status = regcache_raw_read (regcache, gpnum, raw_buf);
+         status = regcache->raw_read (gpnum, raw_buf);
          if (status != REG_VALID)
            mark_value_bytes_unavailable (result_value, 0,
                                          TYPE_LENGTH (value_type (result_value)));
@@ -3442,7 +3468,7 @@ i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
 
          /* Extract (always little endian).  We read both lower and
             upper registers.  */
-         status = regcache_raw_read (regcache, gpnum % 4, raw_buf);
+         status = regcache->raw_read (gpnum % 4, raw_buf);
          if (status != REG_VALID)
            mark_value_bytes_unavailable (result_value, 0,
                                          TYPE_LENGTH (value_type (result_value)));
@@ -3458,7 +3484,7 @@ i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
 
 static struct value *
 i386_pseudo_register_read_value (struct gdbarch *gdbarch,
-                                struct regcache *regcache,
+                                readable_regcache *regcache,
                                 int regnum)
 {
   struct value *result;
@@ -3483,11 +3509,11 @@ i386_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
       int fpnum = i386_mmx_regnum_to_fp_regnum (regcache, regnum);
 
       /* Read ...  */
-      regcache_raw_read (regcache, fpnum, raw_buf);
+      regcache->raw_read (fpnum, raw_buf);
       /* ... Modify ... (always little endian).  */
       memcpy (raw_buf, buf, register_size (gdbarch, regnum));
       /* ... Write.  */
-      regcache_raw_write (regcache, fpnum, raw_buf);
+      regcache->raw_write (fpnum, raw_buf);
     }
   else
     {
@@ -3505,9 +3531,8 @@ i386_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
          upper = extract_unsigned_integer (buf + size, size, byte_order);
 
          /* Fetching register buffer.  */
-         regcache_raw_read (regcache,
-                            I387_BND0R_REGNUM (tdep) + regnum,
-                            raw_buf);
+         regcache->raw_read (I387_BND0R_REGNUM (tdep) + regnum,
+                             raw_buf);
 
          upper = ~upper;
 
@@ -3515,18 +3540,13 @@ i386_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
          memcpy (raw_buf, &lower, 8);
          memcpy (raw_buf + 8, &upper, 8);
 
-
-         regcache_raw_write (regcache,
-                             I387_BND0R_REGNUM (tdep) + regnum,
-                             raw_buf);
+         regcache->raw_write (I387_BND0R_REGNUM (tdep) + regnum, raw_buf);
        }
       else if (i386_k_regnum_p (gdbarch, regnum))
        {
          regnum -= tdep->k0_regnum;
 
-         regcache_raw_write (regcache,
-                             tdep->k0_regnum + regnum,
-                             buf);
+         regcache->raw_write (tdep->k0_regnum + regnum, buf);
        }
       else if (i386_zmm_regnum_p (gdbarch, regnum))
        {
@@ -3535,82 +3555,64 @@ i386_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
          if (regnum < num_lower_zmm_regs)
            {
              /* Write lower 128bits.  */
-             regcache_raw_write (regcache,
-                                 I387_XMM0_REGNUM (tdep) + regnum,
-                                 buf);
+             regcache->raw_write (I387_XMM0_REGNUM (tdep) + regnum, buf);
              /* Write upper 128bits.  */
-             regcache_raw_write (regcache,
-                                 I387_YMM0_REGNUM (tdep) + regnum,
-                                 buf + 16);
+             regcache->raw_write (I387_YMM0_REGNUM (tdep) + regnum, buf + 16);
            }
          else
            {
              /* Write lower 128bits.  */
-             regcache_raw_write (regcache,
-                                 I387_XMM16_REGNUM (tdep) + regnum
-                                 - num_lower_zmm_regs,
-                                 buf);
+             regcache->raw_write (I387_XMM16_REGNUM (tdep) + regnum
+                                  - num_lower_zmm_regs, buf);
              /* Write upper 128bits.  */
-             regcache_raw_write (regcache,
-                                 I387_YMM16H_REGNUM (tdep) + regnum
-                                 - num_lower_zmm_regs,
-                                 buf + 16);
+             regcache->raw_write (I387_YMM16H_REGNUM (tdep) + regnum
+                                  - num_lower_zmm_regs, buf + 16);
            }
          /* Write upper 256bits.  */
-         regcache_raw_write (regcache,
-                             tdep->zmm0h_regnum + regnum,
-                             buf + 32);
+         regcache->raw_write (tdep->zmm0h_regnum + regnum, buf + 32);
        }
       else if (i386_ymm_regnum_p (gdbarch, regnum))
        {
          regnum -= tdep->ymm0_regnum;
 
          /* ... Write lower 128bits.  */
-         regcache_raw_write (regcache,
-                            I387_XMM0_REGNUM (tdep) + regnum,
-                            buf);
+         regcache->raw_write (I387_XMM0_REGNUM (tdep) + regnum, buf);
          /* ... Write upper 128bits.  */
-         regcache_raw_write (regcache,
-                            tdep->ymm0h_regnum + regnum,
-                            buf + 16);
+         regcache->raw_write (tdep->ymm0h_regnum + regnum, buf + 16);
        }
       else if (i386_ymm_avx512_regnum_p (gdbarch, regnum))
        {
          regnum -= tdep->ymm16_regnum;
 
          /* ... Write lower 128bits.  */
-         regcache_raw_write (regcache,
-                             I387_XMM16_REGNUM (tdep) + regnum,
-                             buf);
+         regcache->raw_write (I387_XMM16_REGNUM (tdep) + regnum, buf);
          /* ... Write upper 128bits.  */
-         regcache_raw_write (regcache,
-                             tdep->ymm16h_regnum + regnum,
-                             buf + 16);
+         regcache->raw_write (tdep->ymm16h_regnum + regnum, buf + 16);
        }
       else if (i386_word_regnum_p (gdbarch, regnum))
        {
          int gpnum = regnum - tdep->ax_regnum;
 
          /* Read ...  */
-         regcache_raw_read (regcache, gpnum, raw_buf);
+         regcache->raw_read (gpnum, raw_buf);
          /* ... Modify ... (always little endian).  */
          memcpy (raw_buf, buf, 2);
          /* ... Write.  */
-         regcache_raw_write (regcache, gpnum, raw_buf);
+         regcache->raw_write (gpnum, raw_buf);
        }
       else if (i386_byte_regnum_p (gdbarch, regnum))
        {
          int gpnum = regnum - tdep->al_regnum;
 
          /* Read ...  We read both lower and upper registers.  */
-         regcache_raw_read (regcache, gpnum % 4, raw_buf);
+         regcache->raw_read (gpnum % 4, raw_buf);
          /* ... Modify ... (always little endian).  */
          if (gpnum >= 4)
            memcpy (raw_buf + 1, buf, 1);
          else
            memcpy (raw_buf, buf, 1);
          /* ... Write.  */
-         regcache_raw_write (regcache, gpnum % 4, raw_buf);
+         regcache->raw_write (gpnum % 4, raw_buf);
        }
       else
        internal_error (__FILE__, __LINE__, _("invalid regnum"));
@@ -3785,8 +3787,10 @@ i386_register_to_value (struct frame_info *frame, int regnum,
       gdb_assert (register_size (gdbarch, regnum) == 4);
 
       if (!get_frame_register_bytes (frame, regnum, 0,
-                                    register_size (gdbarch, regnum),
-                                    to, optimizedp, unavailablep))
+                                    gdb::make_array_view (to,
+                                                       register_size (gdbarch,
+                                                                      regnum)),
+                                    optimizedp, unavailablep))
        return 0;
 
       regnum = i386_next_regnum (regnum);
@@ -3837,7 +3841,7 @@ void
 i386_supply_gregset (const struct regset *regset, struct regcache *regcache,
                     int regnum, const void *gregs, size_t len)
 {
-  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  struct gdbarch *gdbarch = regcache->arch ();
   const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   const gdb_byte *regs = (const gdb_byte *) gregs;
   int i;
@@ -3848,7 +3852,7 @@ i386_supply_gregset (const struct regset *regset, struct regcache *regcache,
     {
       if ((regnum == i || regnum == -1)
          && tdep->gregset_reg_offset[i] != -1)
-       regcache_raw_supply (regcache, i, regs + tdep->gregset_reg_offset[i]);
+       regcache->raw_supply (i, regs + tdep->gregset_reg_offset[i]);
     }
 }
 
@@ -3862,7 +3866,7 @@ i386_collect_gregset (const struct regset *regset,
                      const struct regcache *regcache,
                      int regnum, void *gregs, size_t len)
 {
-  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  struct gdbarch *gdbarch = regcache->arch ();
   const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   gdb_byte *regs = (gdb_byte *) gregs;
   int i;
@@ -3873,7 +3877,7 @@ i386_collect_gregset (const struct regset *regset,
     {
       if ((regnum == i || regnum == -1)
          && tdep->gregset_reg_offset[i] != -1)
-       regcache_raw_collect (regcache, i, regs + tdep->gregset_reg_offset[i]);
+       regcache->raw_collect (i, regs + tdep->gregset_reg_offset[i]);
     }
 }
 
@@ -3885,7 +3889,7 @@ static void
 i386_supply_fpregset (const struct regset *regset, struct regcache *regcache,
                      int regnum, const void *fpregs, size_t len)
 {
-  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  struct gdbarch *gdbarch = regcache->arch ();
   const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
   if (len == I387_SIZEOF_FXSAVE)
@@ -3908,7 +3912,7 @@ i386_collect_fpregset (const struct regset *regset,
                       const struct regcache *regcache,
                       int regnum, void *fpregs, size_t len)
 {
-  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  struct gdbarch *gdbarch = regcache->arch ();
   const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
   if (len == I387_SIZEOF_FXSAVE)
@@ -3943,9 +3947,11 @@ i386_iterate_over_regset_sections (struct gdbarch *gdbarch,
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
-  cb (".reg", tdep->sizeof_gregset, &i386_gregset, NULL, cb_data);
+  cb (".reg", tdep->sizeof_gregset, tdep->sizeof_gregset, &i386_gregset, NULL,
+      cb_data);
   if (tdep->sizeof_fpregset)
-    cb (".reg2", tdep->sizeof_fpregset, tdep->fpregset, NULL, cb_data);
+    cb (".reg2", tdep->sizeof_fpregset, tdep->sizeof_fpregset, tdep->fpregset,
+       NULL, cb_data);
 }
 \f
 
@@ -3965,7 +3971,7 @@ i386_pe_skip_trampoline_code (struct frame_info *frame,
        read_memory_unsigned_integer (pc + 2, 4, byte_order);
       struct minimal_symbol *indsym =
        indirect ? lookup_minimal_symbol_by_pc (indirect).minsym : 0;
-      const char *symname = indsym ? MSYMBOL_LINKAGE_NAME (indsym) : 0;
+      const char *symname = indsym ? indsym->linkage_name () : 0;
 
       if (symname)
        {
@@ -4066,10 +4072,10 @@ i386_stap_is_single_operand (struct gdbarch *gdbarch, const char *s)
    This function parses operands of the form `-8+3+1(%rbp)', which
    must be interpreted as `*(-8 + 3 - 1 + (void *) $eax)'.
 
-   Return 1 if the operand was parsed successfully, zero
+   Return true if the operand was parsed successfully, false
    otherwise.  */
 
-static int
+static expr::operation_up
 i386_stap_parse_special_token_triplet (struct gdbarch *gdbarch,
                                       struct stap_parse_info *p)
 {
@@ -4077,26 +4083,24 @@ i386_stap_parse_special_token_triplet (struct gdbarch *gdbarch,
 
   if (isdigit (*s) || *s == '-' || *s == '+')
     {
-      int got_minus[3];
+      bool got_minus[3];
       int i;
       long displacements[3];
       const char *start;
-      char *regname;
       int len;
-      struct stoken str;
       char *endp;
 
-      got_minus[0] = 0;
+      got_minus[0] = false;
       if (*s == '+')
        ++s;
       else if (*s == '-')
        {
          ++s;
-         got_minus[0] = 1;
+         got_minus[0] = true;
        }
 
       if (!isdigit ((unsigned char) *s))
-       return 0;
+       return {};
 
       displacements[0] = strtol (s, &endp, 10);
       s = endp;
@@ -4104,20 +4108,20 @@ i386_stap_parse_special_token_triplet (struct gdbarch *gdbarch,
       if (*s != '+' && *s != '-')
        {
          /* We are not dealing with a triplet.  */
-         return 0;
+         return {};
        }
 
-      got_minus[1] = 0;
+      got_minus[1] = false;
       if (*s == '+')
        ++s;
       else
        {
          ++s;
-         got_minus[1] = 1;
+         got_minus[1] = true;
        }
 
       if (!isdigit ((unsigned char) *s))
-       return 0;
+       return {};
 
       displacements[1] = strtol (s, &endp, 10);
       s = endp;
@@ -4125,26 +4129,26 @@ i386_stap_parse_special_token_triplet (struct gdbarch *gdbarch,
       if (*s != '+' && *s != '-')
        {
          /* We are not dealing with a triplet.  */
-         return 0;
+         return {};
        }
 
-      got_minus[2] = 0;
+      got_minus[2] = false;
       if (*s == '+')
        ++s;
       else
        {
          ++s;
-         got_minus[2] = 1;
+         got_minus[2] = true;
        }
 
       if (!isdigit ((unsigned char) *s))
-       return 0;
+       return {};
 
       displacements[2] = strtol (s, &endp, 10);
       s = endp;
 
       if (*s != '(' || s[1] != '%')
-       return 0;
+       return {};
 
       s += 2;
       start = s;
@@ -4153,57 +4157,46 @@ i386_stap_parse_special_token_triplet (struct gdbarch *gdbarch,
        ++s;
 
       if (*s++ != ')')
-       return 0;
+       return {};
 
       len = s - start - 1;
-      regname = (char *) alloca (len + 1);
+      std::string regname (start, len);
 
-      strncpy (regname, start, len);
-      regname[len] = '\0';
-
-      if (user_reg_map_name_to_regnum (gdbarch, regname, len) == -1)
+      if (user_reg_map_name_to_regnum (gdbarch, regname.c_str (), len) == -1)
        error (_("Invalid register name `%s' on expression `%s'."),
-              regname, p->saved_arg);
+              regname.c_str (), p->saved_arg);
 
+      LONGEST value = 0;
       for (i = 0; i < 3; i++)
        {
-         write_exp_elt_opcode (&p->pstate, OP_LONG);
-         write_exp_elt_type
-           (&p->pstate, builtin_type (gdbarch)->builtin_long);
-         write_exp_elt_longcst (&p->pstate, displacements[i]);
-         write_exp_elt_opcode (&p->pstate, OP_LONG);
+         LONGEST this_val = displacements[i];
          if (got_minus[i])
-           write_exp_elt_opcode (&p->pstate, UNOP_NEG);
+           this_val = -this_val;
+         value += this_val;
        }
 
-      write_exp_elt_opcode (&p->pstate, OP_REGISTER);
-      str.ptr = regname;
-      str.length = len;
-      write_exp_string (&p->pstate, str);
-      write_exp_elt_opcode (&p->pstate, OP_REGISTER);
-
-      write_exp_elt_opcode (&p->pstate, UNOP_CAST);
-      write_exp_elt_type (&p->pstate,
-                         builtin_type (gdbarch)->builtin_data_ptr);
-      write_exp_elt_opcode (&p->pstate, UNOP_CAST);
-
-      write_exp_elt_opcode (&p->pstate, BINOP_ADD);
-      write_exp_elt_opcode (&p->pstate, BINOP_ADD);
-      write_exp_elt_opcode (&p->pstate, BINOP_ADD);
+      p->arg = s;
 
-      write_exp_elt_opcode (&p->pstate, UNOP_CAST);
-      write_exp_elt_type (&p->pstate,
-                         lookup_pointer_type (p->arg_type));
-      write_exp_elt_opcode (&p->pstate, UNOP_CAST);
+      using namespace expr;
 
-      write_exp_elt_opcode (&p->pstate, UNOP_IND);
+      struct type *long_type = builtin_type (gdbarch)->builtin_long;
+      operation_up offset
+       = make_operation<long_const_operation> (long_type, value);
 
-      p->arg = s;
+      operation_up reg
+       = make_operation<register_operation> (std::move (regname));
+      struct type *void_ptr = builtin_type (gdbarch)->builtin_data_ptr;
+      reg = make_operation<unop_cast_operation> (std::move (reg), void_ptr);
 
-      return 1;
+      operation_up sum
+       = make_operation<add_operation> (std::move (reg), std::move (offset));
+      struct type *arg_ptr_type = lookup_pointer_type (p->arg_type);
+      sum = make_operation<unop_cast_operation> (std::move (sum),
+                                                arg_ptr_type);
+      return make_operation<unop_ind_operation> (std::move (sum));
     }
 
-  return 0;
+  return {};
 }
 
 /* Helper function for i386_stap_parse_special_token.
@@ -4212,10 +4205,10 @@ i386_stap_parse_special_token_triplet (struct gdbarch *gdbarch,
    (register index * size) + offset', as represented in
    `(%rcx,%rax,8)', or `[OFFSET](BASE_REG,INDEX_REG[,SIZE])'.
 
-   Return 1 if the operand was parsed successfully, zero
+   Return true if the operand was parsed successfully, false
    otherwise.  */
 
-static int
+static expr::operation_up
 i386_stap_parse_special_token_three_arg_disp (struct gdbarch *gdbarch,
                                              struct stap_parse_info *p)
 {
@@ -4223,27 +4216,24 @@ i386_stap_parse_special_token_three_arg_disp (struct gdbarch *gdbarch,
 
   if (isdigit (*s) || *s == '(' || *s == '-' || *s == '+')
     {
-      int offset_minus = 0;
+      bool offset_minus = false;
       long offset = 0;
-      int size_minus = 0;
+      bool size_minus = false;
       long size = 0;
       const char *start;
-      char *base;
       int len_base;
-      char *index;
       int len_index;
-      struct stoken base_token, index_token;
 
       if (*s == '+')
        ++s;
       else if (*s == '-')
        {
          ++s;
-         offset_minus = 1;
+         offset_minus = true;
        }
 
       if (offset_minus && !isdigit (*s))
-       return 0;
+       return {};
 
       if (isdigit (*s))
        {
@@ -4254,7 +4244,7 @@ i386_stap_parse_special_token_three_arg_disp (struct gdbarch *gdbarch,
        }
 
       if (*s != '(' || s[1] != '%')
-       return 0;
+       return {};
 
       s += 2;
       start = s;
@@ -4263,16 +4253,14 @@ i386_stap_parse_special_token_three_arg_disp (struct gdbarch *gdbarch,
        ++s;
 
       if (*s != ',' || s[1] != '%')
-       return 0;
+       return {};
 
       len_base = s - start;
-      base = (char *) alloca (len_base + 1);
-      strncpy (base, start, len_base);
-      base[len_base] = '\0';
+      std::string base (start, len_base);
 
-      if (user_reg_map_name_to_regnum (gdbarch, base, len_base) == -1)
+      if (user_reg_map_name_to_regnum (gdbarch, base.c_str (), len_base) == -1)
        error (_("Invalid register name `%s' on expression `%s'."),
-              base, p->saved_arg);
+              base.c_str (), p->saved_arg);
 
       s += 2;
       start = s;
@@ -4281,16 +4269,15 @@ i386_stap_parse_special_token_three_arg_disp (struct gdbarch *gdbarch,
        ++s;
 
       len_index = s - start;
-      index = (char *) alloca (len_index + 1);
-      strncpy (index, start, len_index);
-      index[len_index] = '\0';
+      std::string index (start, len_index);
 
-      if (user_reg_map_name_to_regnum (gdbarch, index, len_index) == -1)
+      if (user_reg_map_name_to_regnum (gdbarch, index.c_str (),
+                                      len_index) == -1)
        error (_("Invalid register name `%s' on expression `%s'."),
-              index, p->saved_arg);
+              index.c_str (), p->saved_arg);
 
       if (*s != ',' && *s != ')')
-       return 0;
+       return {};
 
       if (*s == ',')
        {
@@ -4302,92 +4289,67 @@ i386_stap_parse_special_token_three_arg_disp (struct gdbarch *gdbarch,
          else if (*s == '-')
            {
              ++s;
-             size_minus = 1;
+             size_minus = true;
            }
 
          size = strtol (s, &endp, 10);
          s = endp;
 
          if (*s != ')')
-           return 0;
+           return {};
        }
 
       ++s;
+      p->arg = s;
+
+      using namespace expr;
+
+      struct type *long_type = builtin_type (gdbarch)->builtin_long;
+      operation_up reg = make_operation<register_operation> (std::move (base));
 
-      if (offset)
+      if (offset != 0)
        {
-         write_exp_elt_opcode (&p->pstate, OP_LONG);
-         write_exp_elt_type (&p->pstate,
-                             builtin_type (gdbarch)->builtin_long);
-         write_exp_elt_longcst (&p->pstate, offset);
-         write_exp_elt_opcode (&p->pstate, OP_LONG);
          if (offset_minus)
-           write_exp_elt_opcode (&p->pstate, UNOP_NEG);
+           offset = -offset;
+         operation_up value
+           = make_operation<long_const_operation> (long_type, offset);
+         reg = make_operation<add_operation> (std::move (reg),
+                                              std::move (value));
        }
 
-      write_exp_elt_opcode (&p->pstate, OP_REGISTER);
-      base_token.ptr = base;
-      base_token.length = len_base;
-      write_exp_string (&p->pstate, base_token);
-      write_exp_elt_opcode (&p->pstate, OP_REGISTER);
+      operation_up ind_reg
+       = make_operation<register_operation> (std::move (index));
 
-      if (offset)
-       write_exp_elt_opcode (&p->pstate, BINOP_ADD);
-
-      write_exp_elt_opcode (&p->pstate, OP_REGISTER);
-      index_token.ptr = index;
-      index_token.length = len_index;
-      write_exp_string (&p->pstate, index_token);
-      write_exp_elt_opcode (&p->pstate, OP_REGISTER);
-
-      if (size)
+      if (size != 0)
        {
-         write_exp_elt_opcode (&p->pstate, OP_LONG);
-         write_exp_elt_type (&p->pstate,
-                             builtin_type (gdbarch)->builtin_long);
-         write_exp_elt_longcst (&p->pstate, size);
-         write_exp_elt_opcode (&p->pstate, OP_LONG);
          if (size_minus)
-           write_exp_elt_opcode (&p->pstate, UNOP_NEG);
-         write_exp_elt_opcode (&p->pstate, BINOP_MUL);
+           size = -size;
+         operation_up value
+           = make_operation<long_const_operation> (long_type, size);
+         ind_reg = make_operation<mul_operation> (std::move (ind_reg),
+                                                  std::move (value));
        }
 
-      write_exp_elt_opcode (&p->pstate, BINOP_ADD);
-
-      write_exp_elt_opcode (&p->pstate, UNOP_CAST);
-      write_exp_elt_type (&p->pstate,
-                         lookup_pointer_type (p->arg_type));
-      write_exp_elt_opcode (&p->pstate, UNOP_CAST);
+      operation_up sum
+       = make_operation<add_operation> (std::move (reg),
+                                        std::move (ind_reg));
 
-      write_exp_elt_opcode (&p->pstate, UNOP_IND);
-
-      p->arg = s;
-
-      return 1;
+      struct type *arg_ptr_type = lookup_pointer_type (p->arg_type);
+      sum = make_operation<unop_cast_operation> (std::move (sum),
+                                                arg_ptr_type);
+      return make_operation<unop_ind_operation> (std::move (sum));
     }
 
-  return 0;
+  return {};
 }
 
 /* Implementation of `gdbarch_stap_parse_special_token', as defined in
    gdbarch.h.  */
 
-int
+expr::operation_up
 i386_stap_parse_special_token (struct gdbarch *gdbarch,
                               struct stap_parse_info *p)
 {
-  /* In order to parse special tokens, we use a state-machine that go
-     through every known token and try to get a match.  */
-  enum
-    {
-      TRIPLET,
-      THREE_ARG_DISPLACEMENT,
-      DONE
-    };
-  int current_state;
-
-  current_state = TRIPLET;
-
   /* The special tokens to be parsed here are:
 
      - `register base + (register index * size) + offset', as represented
@@ -4396,26 +4358,36 @@ i386_stap_parse_special_token (struct gdbarch *gdbarch,
      - Operands of the form `-8+3+1(%rbp)', which must be interpreted as
      `*(-8 + 3 - 1 + (void *) $eax)'.  */
 
-  while (current_state != DONE)
-    {
-      switch (current_state)
-       {
-       case TRIPLET:
-         if (i386_stap_parse_special_token_triplet (gdbarch, p))
-           return 1;
-         break;
+  expr::operation_up result
+    = i386_stap_parse_special_token_triplet (gdbarch, p);
 
-       case THREE_ARG_DISPLACEMENT:
-         if (i386_stap_parse_special_token_three_arg_disp (gdbarch, p))
-           return 1;
-         break;
-       }
+  if (result == nullptr)
+    result = i386_stap_parse_special_token_three_arg_disp (gdbarch, p);
 
-      /* Advancing to the next state.  */
-      ++current_state;
-    }
+  return result;
+}
 
-  return 0;
+/* Implementation of 'gdbarch_stap_adjust_register', as defined in
+   gdbarch.h.  */
+
+static std::string
+i386_stap_adjust_register (struct gdbarch *gdbarch, struct stap_parse_info *p,
+                          const std::string &regname, int regnum)
+{
+  static const std::unordered_set<std::string> reg_assoc
+    = { "ax", "bx", "cx", "dx",
+       "si", "di", "bp", "sp" };
+
+  /* If we are dealing with a register whose size is less than the size
+     specified by the "[-]N@" prefix, and it is one of the registers that
+     we know has an extended variant available, then use the extended
+     version of the register instead.  */
+  if (register_size (gdbarch, regnum) < TYPE_LENGTH (p->arg_type)
+      && reg_assoc.find (regname) != reg_assoc.end ())
+    return "e" + regname;
+
+  /* Otherwise, just use the requested register.  */
+  return regname;
 }
 
 \f
@@ -4431,6 +4403,15 @@ i386_gnu_triplet_regexp (struct gdbarch *gdbarch)
 
 \f
 
+/* Implement the "in_indirect_branch_thunk" gdbarch function.  */
+
+static bool
+i386_in_indirect_branch_thunk (struct gdbarch *gdbarch, CORE_ADDR pc)
+{
+  return x86_in_indirect_branch_thunk (pc, i386_register_names,
+                                      I386_EAX_REGNUM, I386_EIP_REGNUM);
+}
+
 /* Generic ELF.  */
 
 void
@@ -4457,6 +4438,11 @@ i386_elf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
                                      i386_stap_is_single_operand);
   set_gdbarch_stap_parse_special_token (gdbarch,
                                        i386_stap_parse_special_token);
+  set_gdbarch_stap_adjust_register (gdbarch,
+                                   i386_stap_adjust_register);
+
+  set_gdbarch_in_indirect_branch_thunk (gdbarch,
+                                       i386_in_indirect_branch_thunk);
 }
 
 /* System V Release 4 (SVR4).  */
@@ -4516,8 +4502,8 @@ i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
   const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   int fp_regnum_p, mmx_regnum_p, xmm_regnum_p, mxcsr_regnum_p,
       ymm_regnum_p, ymmh_regnum_p, ymm_avx512_regnum_p, ymmh_avx512_regnum_p,
-      bndr_regnum_p, bnd_regnum_p, k_regnum_p, zmm_regnum_p, zmmh_regnum_p,
-      zmm_avx512_regnum_p, mpx_ctrl_regnum_p, xmm_avx512_regnum_p,
+      bndr_regnum_p, bnd_regnum_p, zmm_regnum_p, zmmh_regnum_p,
+      mpx_ctrl_regnum_p, xmm_avx512_regnum_p,
       avx512_p, avx_p, sse_p, pkru_regnum_p;
 
   /* Don't include pseudo registers, except for MMX, in any register
@@ -4756,23 +4742,23 @@ i386_record_lea_modrm_addr (struct i386_record_s *irp, uint64_t *addr)
 
       offset64 = 0;
       if (base != 0xff)
-        {
+       {
          if (base == 4 && irp->popl_esp_hack)
            *addr += irp->popl_esp_hack;
          regcache_raw_read_unsigned (irp->regcache, irp->regmap[base],
-                                      &offset64);
+                                     &offset64);
        }
       if (irp->aflag == 2)
-        {
+       {
          *addr += offset64;
-        }
+       }
       else
-        *addr = (uint32_t) (offset64 + *addr);
+       *addr = (uint32_t) (offset64 + *addr);
 
       if (havesib && (index != 4 || scale != 0))
        {
          regcache_raw_read_unsigned (irp->regcache, irp->regmap[index],
-                                      &offset64);
+                                     &offset64);
          if (irp->aflag == 2)
            *addr += offset64 << scale;
          else
@@ -4821,65 +4807,65 @@ i386_record_lea_modrm_addr (struct i386_record_s *irp, uint64_t *addr)
        case 0:
          regcache_raw_read_unsigned (irp->regcache,
                                      irp->regmap[X86_RECORD_REBX_REGNUM],
-                                      &offset64);
+                                     &offset64);
          *addr = (uint32_t) (*addr + offset64);
          regcache_raw_read_unsigned (irp->regcache,
                                      irp->regmap[X86_RECORD_RESI_REGNUM],
-                                      &offset64);
+                                     &offset64);
          *addr = (uint32_t) (*addr + offset64);
          break;
        case 1:
          regcache_raw_read_unsigned (irp->regcache,
                                      irp->regmap[X86_RECORD_REBX_REGNUM],
-                                      &offset64);
+                                     &offset64);
          *addr = (uint32_t) (*addr + offset64);
          regcache_raw_read_unsigned (irp->regcache,
                                      irp->regmap[X86_RECORD_REDI_REGNUM],
-                                      &offset64);
+                                     &offset64);
          *addr = (uint32_t) (*addr + offset64);
          break;
        case 2:
          regcache_raw_read_unsigned (irp->regcache,
                                      irp->regmap[X86_RECORD_REBP_REGNUM],
-                                      &offset64);
+                                     &offset64);
          *addr = (uint32_t) (*addr + offset64);
          regcache_raw_read_unsigned (irp->regcache,
                                      irp->regmap[X86_RECORD_RESI_REGNUM],
-                                      &offset64);
+                                     &offset64);
          *addr = (uint32_t) (*addr + offset64);
          break;
        case 3:
          regcache_raw_read_unsigned (irp->regcache,
                                      irp->regmap[X86_RECORD_REBP_REGNUM],
-                                      &offset64);
+                                     &offset64);
          *addr = (uint32_t) (*addr + offset64);
          regcache_raw_read_unsigned (irp->regcache,
                                      irp->regmap[X86_RECORD_REDI_REGNUM],
-                                      &offset64);
+                                     &offset64);
          *addr = (uint32_t) (*addr + offset64);
          break;
        case 4:
          regcache_raw_read_unsigned (irp->regcache,
                                      irp->regmap[X86_RECORD_RESI_REGNUM],
-                                      &offset64);
+                                     &offset64);
          *addr = (uint32_t) (*addr + offset64);
          break;
        case 5:
          regcache_raw_read_unsigned (irp->regcache,
                                      irp->regmap[X86_RECORD_REDI_REGNUM],
-                                      &offset64);
+                                     &offset64);
          *addr = (uint32_t) (*addr + offset64);
          break;
        case 6:
          regcache_raw_read_unsigned (irp->regcache,
                                      irp->regmap[X86_RECORD_REBP_REGNUM],
-                                      &offset64);
+                                     &offset64);
          *addr = (uint32_t) (*addr + offset64);
          break;
        case 7:
          regcache_raw_read_unsigned (irp->regcache,
                                      irp->regmap[X86_RECORD_REBX_REGNUM],
-                                      &offset64);
+                                     &offset64);
          *addr = (uint32_t) (*addr + offset64);
          break;
        }
@@ -4903,14 +4889,14 @@ i386_record_lea_modrm (struct i386_record_s *irp)
   if (irp->override >= 0)
     {
       if (record_full_memory_query)
-        {
-          if (yquery (_("\
+       {
+         if (yquery (_("\
 Process record ignores the memory change of instruction at address %s\n\
 because it can't get the value of the segment register.\n\
 Do you want to stop the program?"),
-                      paddress (gdbarch, irp->orig_addr)))
+                     paddress (gdbarch, irp->orig_addr)))
            return -1;
-        }
+       }
 
       return 0;
     }
@@ -4955,8 +4941,8 @@ i386_record_push (struct i386_record_s *irp, int size)
    wrong, 0 otherwise.  */
 
 static int i386_record_floats (struct gdbarch *gdbarch,
-                               struct i386_record_s *ir,
-                               uint32_t iregnum)
+                              struct i386_record_s *ir,
+                              uint32_t iregnum)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   int i;
@@ -4969,32 +4955,30 @@ static int i386_record_floats (struct gdbarch *gdbarch,
   if (I386_SAVE_FPU_REGS == iregnum)
     {
       for (i = I387_ST0_REGNUM (tdep); i <= I387_ST0_REGNUM (tdep) + 7; i++)
-        {
-          if (record_full_arch_list_add_reg (ir->regcache, i))
-            return -1;
-        }
+       {
+         if (record_full_arch_list_add_reg (ir->regcache, i))
+           return -1;
+       }
     }
   else if (I386_SAVE_FPU_ENV == iregnum)
     {
       for (i = I387_FCTRL_REGNUM (tdep); i <= I387_FOP_REGNUM (tdep); i++)
              {
              if (record_full_arch_list_add_reg (ir->regcache, i))
-               return -1;
+               return -1;
              }
     }
   else if (I386_SAVE_FPU_ENV_REG_STACK == iregnum)
     {
       for (i = I387_ST0_REGNUM (tdep); i <= I387_FOP_REGNUM (tdep); i++)
-      {
-        if (record_full_arch_list_add_reg (ir->regcache, i))
-          return -1;
-      }
+       if (record_full_arch_list_add_reg (ir->regcache, i))
+         return -1;
     }
   else if ((iregnum >= I387_ST0_REGNUM (tdep)) &&
-           (iregnum <= I387_FOP_REGNUM (tdep)))
+          (iregnum <= I387_FOP_REGNUM (tdep)))
     {
       if (record_full_arch_list_add_reg (ir->regcache,iregnum))
-        return -1;
+       return -1;
     }
   else
     {
@@ -5006,7 +4990,7 @@ static int i386_record_floats (struct gdbarch *gdbarch,
     for (i = I387_FCTRL_REGNUM (tdep); i <= I387_FOP_REGNUM (tdep); i++)
       {
       if (record_full_arch_list_add_reg (ir->regcache, i))
-        return -1;
+       return -1;
       }
     }
   return 0;
@@ -5048,7 +5032,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
 
   if (record_debug > 1)
     fprintf_unfiltered (gdb_stdlog, "Process record: i386_process_record "
-                                   "addr = %s\n",
+                                   "addr = %s\n",
                        paddress (gdbarch, ir.addr));
 
   /* prefixes */
@@ -5092,33 +5076,33 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
        case ADDR_PREFIX_OPCODE:
          prefixes |= PREFIX_ADDR;
          break;
-        case 0x40:     /* i386 inc %eax */
-        case 0x41:     /* i386 inc %ecx */
-        case 0x42:     /* i386 inc %edx */
-        case 0x43:     /* i386 inc %ebx */
-        case 0x44:     /* i386 inc %esp */
-        case 0x45:     /* i386 inc %ebp */
-        case 0x46:     /* i386 inc %esi */
-        case 0x47:     /* i386 inc %edi */
-        case 0x48:     /* i386 dec %eax */
-        case 0x49:     /* i386 dec %ecx */
-        case 0x4a:     /* i386 dec %edx */
-        case 0x4b:     /* i386 dec %ebx */
-        case 0x4c:     /* i386 dec %esp */
-        case 0x4d:     /* i386 dec %ebp */
-        case 0x4e:     /* i386 dec %esi */
-        case 0x4f:     /* i386 dec %edi */
-          if (ir.regmap[X86_RECORD_R8_REGNUM]) /* 64 bit target */
-            {
-               /* REX */
-               rex_w = (opcode8 >> 3) & 1;
-               rex_r = (opcode8 & 0x4) << 1;
-               ir.rex_x = (opcode8 & 0x2) << 2;
-               ir.rex_b = (opcode8 & 0x1) << 3;
-            }
+       case 0x40:      /* i386 inc %eax */
+       case 0x41:      /* i386 inc %ecx */
+       case 0x42:      /* i386 inc %edx */
+       case 0x43:      /* i386 inc %ebx */
+       case 0x44:      /* i386 inc %esp */
+       case 0x45:      /* i386 inc %ebp */
+       case 0x46:      /* i386 inc %esi */
+       case 0x47:      /* i386 inc %edi */
+       case 0x48:      /* i386 dec %eax */
+       case 0x49:      /* i386 dec %ecx */
+       case 0x4a:      /* i386 dec %edx */
+       case 0x4b:      /* i386 dec %ebx */
+       case 0x4c:      /* i386 dec %esp */
+       case 0x4d:      /* i386 dec %ebp */
+       case 0x4e:      /* i386 dec %esi */
+       case 0x4f:      /* i386 dec %edi */
+         if (ir.regmap[X86_RECORD_R8_REGNUM])  /* 64 bit target */
+           {
+              /* REX */
+              rex_w = (opcode8 >> 3) & 1;
+              rex_r = (opcode8 & 0x4) << 1;
+              ir.rex_x = (opcode8 & 0x2) << 2;
+              ir.rex_b = (opcode8 & 0x1) << 3;
+           }
          else                                  /* 32 bit target */
            goto out_prefixes;
-          break;
+         break;
        default:
          goto out_prefixes;
          break;
@@ -5132,7 +5116,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
   else
     {
       if (prefixes & PREFIX_DATA)
-        ir.dflag ^= 1;
+       ir.dflag ^= 1;
     }
   if (prefixes & PREFIX_ADDR)
     ir.aflag ^= 1;
@@ -5219,7 +5203,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
                }
              else
                {
-                  ir.rm |= ir.rex_b;
+                 ir.rm |= ir.rex_b;
                  if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
                    ir.rm &= 0x3;
                  I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
@@ -5228,7 +5212,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
            case 1:    /* OP Gv, Ev */
              if (i386_record_modrm (&ir))
                return -1;
-              ir.reg |= rex_r;
+             ir.reg |= rex_r;
              if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
                ir.reg &= 0x3;
              I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
@@ -5257,10 +5241,10 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
 
          if (ir.mod != 3)
            {
-              if (opcode == 0x83)
-                ir.rip_offset = 1;
-              else
-                ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
+             if (opcode == 0x83)
+               ir.rip_offset = 1;
+             else
+               ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
              if (i386_record_lea_modrm (&ir))
                return -1;
            }
@@ -5302,7 +5286,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
        return -1;
 
       if (ir.mod != 3 && ir.reg == 0)
-        ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
+       ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
 
       switch (ir.reg)
        {
@@ -5318,7 +5302,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
            }
          else
            {
-              ir.rm |= ir.rex_b;
+             ir.rm |= ir.rex_b;
              if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
                ir.rm &= 0x3;
              I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
@@ -5357,9 +5341,9 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
        {
        case 0:    /* inc */
        case 1:    /* dec */
-          if ((opcode & 1) == 0)
+         if ((opcode & 1) == 0)
            ir.ot = OT_BYTE;
-          else
+         else
            ir.ot = ir.dflag + OT_WORD;
          if (ir.mod != 3)
            {
@@ -5376,8 +5360,8 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
          I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
          break;
        case 2:    /* call */
-          if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
-            ir.dflag = 2;
+         if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
+           ir.dflag = 2;
          if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
            return -1;
          I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
@@ -5393,8 +5377,8 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
          I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
          break;
        case 6:    /* push */
-          if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
-            ir.dflag = 2;
+         if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
+           ir.dflag = 2;
          if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
            return -1;
          break;
@@ -5429,9 +5413,9 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
       if (i386_record_modrm (&ir))
        return -1;
       if (opcode == 0x69)
-        ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
+       ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
       else if (opcode == 0x6b)
-        ir.rip_offset = 1;
+       ir.rip_offset = 1;
       ir.reg |= rex_r;
       if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
        ir.reg &= 0x3;
@@ -5478,7 +5462,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
        return -1;
       if (ir.mod == 3)
        {
-          ir.reg |= rex_r;
+         ir.reg |= rex_r;
          I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
          if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
            ir.reg &= 0x3;
@@ -5542,7 +5526,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
     case 0x68:
     case 0x6a:
       if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
-        ir.dflag = 2;
+       ir.dflag = 2;
       if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
        return -1;
       break;
@@ -5552,7 +5536,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
     case 0x16:    /* push ss */
     case 0x1e:    /* push ds */
       if (ir.regmap[X86_RECORD_R8_REGNUM])
-        {
+       {
          ir.addr -= 1;
          goto no_support;
        }
@@ -5563,7 +5547,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
     case 0x0fa0:    /* push fs */
     case 0x0fa8:    /* push gs */
       if (ir.regmap[X86_RECORD_R8_REGNUM])
-        {
+       {
          ir.addr -= 2;
          goto no_support;
        }
@@ -5573,7 +5557,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
 
     case 0x60:    /* pusha */
       if (ir.regmap[X86_RECORD_R8_REGNUM])
-        {
+       {
          ir.addr -= 1;
          goto no_support;
        }
@@ -5595,7 +5579,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
 
     case 0x61:    /* popa */
       if (ir.regmap[X86_RECORD_R8_REGNUM])
-        {
+       {
          ir.addr -= 1;
          goto no_support;
        }
@@ -5609,14 +5593,14 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
       if (ir.regmap[X86_RECORD_R8_REGNUM])
        ir.ot = ir.dflag ? OT_QUAD : OT_WORD;
       else
-        ir.ot = ir.dflag + OT_WORD;
+       ir.ot = ir.dflag + OT_WORD;
       if (i386_record_modrm (&ir))
        return -1;
       if (ir.mod == 3)
        I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
       else
        {
-          ir.popl_esp_hack = 1 << ir.ot;
+         ir.popl_esp_hack = 1 << ir.ot;
          if (i386_record_lea_modrm (&ir))
            return -1;
        }
@@ -5626,7 +5610,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
     case 0xc8:    /* enter */
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
       if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
-        ir.dflag = 2;
+       ir.dflag = 2;
       if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
        return -1;
       break;
@@ -5638,7 +5622,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
 
     case 0x07:    /* pop es */
       if (ir.regmap[X86_RECORD_R8_REGNUM])
-        {
+       {
          ir.addr -= 1;
          goto no_support;
        }
@@ -5649,7 +5633,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
 
     case 0x17:    /* pop ss */
       if (ir.regmap[X86_RECORD_R8_REGNUM])
-        {
+       {
          ir.addr -= 1;
          goto no_support;
        }
@@ -5660,7 +5644,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
 
     case 0x1f:    /* pop ds */
       if (ir.regmap[X86_RECORD_R8_REGNUM])
-        {
+       {
          ir.addr -= 1;
          goto no_support;
        }
@@ -5695,14 +5679,14 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
 
       if (ir.mod != 3)
        {
-          if (opcode == 0xc6 || opcode == 0xc7)
+         if (opcode == 0xc6 || opcode == 0xc7)
            ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
          if (i386_record_lea_modrm (&ir))
            return -1;
        }
       else
        {
-          if (opcode == 0xc6 || opcode == 0xc7)
+         if (opcode == 0xc6 || opcode == 0xc7)
            ir.rm |= ir.rex_b;
          if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
            ir.rm &= 0x3;
@@ -5809,47 +5793,47 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
     case 0xa2:    /* mov EAX */
     case 0xa3:
       if (ir.override >= 0)
-        {
-          if (record_full_memory_query)
-            {
-              if (yquery (_("\
+       {
+         if (record_full_memory_query)
+           {
+             if (yquery (_("\
 Process record ignores the memory change of instruction at address %s\n\
 because it can't get the value of the segment register.\n\
 Do you want to stop the program?"),
-                          paddress (gdbarch, ir.orig_addr)))
-                return -1;
-            }
+                         paddress (gdbarch, ir.orig_addr)))
+               return -1;
+           }
        }
       else
        {
-          if ((opcode & 1) == 0)
+         if ((opcode & 1) == 0)
            ir.ot = OT_BYTE;
          else
            ir.ot = ir.dflag + OT_WORD;
          if (ir.aflag == 2)
            {
-              if (record_read_memory (gdbarch, ir.addr, buf, 8))
+             if (record_read_memory (gdbarch, ir.addr, buf, 8))
                return -1;
              ir.addr += 8;
              addr = extract_unsigned_integer (buf, 8, byte_order);
            }
-          else if (ir.aflag)
+         else if (ir.aflag)
            {
-              if (record_read_memory (gdbarch, ir.addr, buf, 4))
+             if (record_read_memory (gdbarch, ir.addr, buf, 4))
                return -1;
              ir.addr += 4;
-              addr = extract_unsigned_integer (buf, 4, byte_order);
+             addr = extract_unsigned_integer (buf, 4, byte_order);
            }
-          else
+         else
            {
-              if (record_read_memory (gdbarch, ir.addr, buf, 2))
+             if (record_read_memory (gdbarch, ir.addr, buf, 2))
                return -1;
              ir.addr += 2;
-              addr = extract_unsigned_integer (buf, 2, byte_order);
+             addr = extract_unsigned_integer (buf, 2, byte_order);
            }
          if (record_full_arch_list_add_mem (addr, 1 << ir.ot))
            return -1;
-        }
+       }
       break;
 
     case 0xb0:    /* mov R, Ib */
@@ -5916,7 +5900,7 @@ Do you want to stop the program?"),
     case 0xc4:    /* les Gv */
     case 0xc5:    /* lds Gv */
       if (ir.regmap[X86_RECORD_R8_REGNUM])
-        {
+       {
          ir.addr -= 1;
          goto no_support;
        }
@@ -6024,21 +6008,21 @@ Do you want to stop the program?"),
          switch (ir.reg)
            {
            case 0x02:
-            case 0x12:
-            case 0x22:
-            case 0x32:
+           case 0x12:
+           case 0x22:
+           case 0x32:
              /* For fcom, ficom nothing to do.  */
-              break;
+             break;
            case 0x03:
-            case 0x13:
-            case 0x23:
-            case 0x33:
+           case 0x13:
+           case 0x23:
+           case 0x33:
              /* For fcomp, ficomp pop FPU stack, store all.  */
-              if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
-                return -1;
-              break;
-            case 0x00:
-            case 0x01:
+             if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
+               return -1;
+             break;
+           case 0x00:
+           case 0x01:
            case 0x04:
            case 0x05:
            case 0x06:
@@ -6061,11 +6045,11 @@ Do you want to stop the program?"),
            case 0x35:
            case 0x36:
            case 0x37:
-              /* For fadd, fmul, fsub, fsubr, fdiv, fdivr, fiadd, fimul,
-                 fisub, fisubr, fidiv, fidivr, modR/M.reg is an extension
-                 of code,  always affects st(0) register.  */
-              if (i386_record_floats (gdbarch, &ir, I387_ST0_REGNUM (tdep)))
-                return -1;
+             /* For fadd, fmul, fsub, fsubr, fdiv, fdivr, fiadd, fimul,
+                fisub, fisubr, fidiv, fidivr, modR/M.reg is an extension
+                of code,  always affects st(0) register.  */
+             if (i386_record_floats (gdbarch, &ir, I387_ST0_REGNUM (tdep)))
+               return -1;
              break;
            case 0x08:
            case 0x0a:
@@ -6074,7 +6058,7 @@ Do you want to stop the program?"),
            case 0x19:
            case 0x1a:
            case 0x1b:
-            case 0x1d:
+           case 0x1d:
            case 0x28:
            case 0x29:
            case 0x2a:
@@ -6083,8 +6067,8 @@ Do you want to stop the program?"),
            case 0x39:
            case 0x3a:
            case 0x3b:
-            case 0x3c:
-            case 0x3d:
+           case 0x3c:
+           case 0x3d:
              switch (ir.reg & 7)
                {
                case 0:
@@ -6167,21 +6151,21 @@ Do you want to stop the program?"),
                }
              break;
            case 0x0c:
-              /* Insn fldenv.  */
-              if (i386_record_floats (gdbarch, &ir,
-                                      I386_SAVE_FPU_ENV_REG_STACK))
-                return -1;
-              break;
+             /* Insn fldenv.  */
+             if (i386_record_floats (gdbarch, &ir,
+                                     I386_SAVE_FPU_ENV_REG_STACK))
+               return -1;
+             break;
            case 0x0d:
-              /* Insn fldcw.  */
-              if (i386_record_floats (gdbarch, &ir, I387_FCTRL_REGNUM (tdep)))
-                return -1;
-              break;
+             /* Insn fldcw.  */
+             if (i386_record_floats (gdbarch, &ir, I387_FCTRL_REGNUM (tdep)))
+               return -1;
+             break;
            case 0x2c:
-              /* Insn frstor.  */
-              if (i386_record_floats (gdbarch, &ir,
-                                      I386_SAVE_FPU_ENV_REG_STACK))
-                return -1;
+             /* Insn frstor.  */
+             if (i386_record_floats (gdbarch, &ir,
+                                     I386_SAVE_FPU_ENV_REG_STACK))
+               return -1;
              break;
            case 0x0e:
              if (ir.dflag)
@@ -6199,9 +6183,9 @@ Do you want to stop the program?"),
            case 0x2f:
              if (record_full_arch_list_add_mem (addr64, 2))
                return -1;
-              /* Insn fstp, fbstp.  */
-              if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
-                return -1;
+             /* Insn fstp, fbstp.  */
+             if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
+               return -1;
              break;
            case 0x1f:
            case 0x3e:
@@ -6244,7 +6228,7 @@ Do you want to stop the program?"),
        }
       /* Opcode is an extension of modR/M byte.  */
       else
-        {
+       {
          switch (opcode)
            {
            case 0xd8:
@@ -6260,7 +6244,7 @@ Do you want to stop the program?"),
                                              I386_SAVE_FPU_REGS))
                        return -1;
                    }
-                  else
+                 else
                    {
                      if (i386_record_floats (gdbarch, &ir,
                                              I387_ST0_REGNUM (tdep)))
@@ -6276,8 +6260,8 @@ Do you want to stop the program?"),
                        }
                    }
                }
-              else
-                {
+             else
+               {
                  switch (ir.modrm)
                    {
                    case 0xe0:
@@ -6322,15 +6306,15 @@ Do you want to stop the program?"),
                      break;
                    }
                }
-              break;
-            case 0xda:
-              if (0xe9 == ir.modrm)
-                {
+             break;
+           case 0xda:
+             if (0xe9 == ir.modrm)
+               {
                  if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
                    return -1;
-                }
-              else if ((0x0c == ir.modrm >> 4) || (0x0d == ir.modrm >> 4))
-                {
+               }
+             else if ((0x0c == ir.modrm >> 4) || (0x0d == ir.modrm >> 4))
+               {
                  if (i386_record_floats (gdbarch, &ir,
                                          I387_ST0_REGNUM (tdep)))
                    return -1;
@@ -6348,16 +6332,16 @@ Do you want to stop the program?"),
                                              ((ir.modrm & 0x0f) - 0x08)))
                        return -1;
                    }
-                }
-              break;
-            case 0xdb:
-              if (0xe3 == ir.modrm)
-                {
+               }
+             break;
+           case 0xdb:
+             if (0xe3 == ir.modrm)
+               {
                  if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_ENV))
                    return -1;
-                }
-              else if ((0x0c == ir.modrm >> 4) || (0x0d == ir.modrm >> 4))
-                {
+               }
+             else if ((0x0c == ir.modrm >> 4) || (0x0d == ir.modrm >> 4))
+               {
                  if (i386_record_floats (gdbarch, &ir,
                                          I387_ST0_REGNUM (tdep)))
                    return -1;
@@ -6375,13 +6359,13 @@ Do you want to stop the program?"),
                                              ((ir.modrm & 0x0f) - 0x08)))
                        return -1;
                    }
-                }
-              break;
-            case 0xdc:
-              if ((0x0c == ir.modrm >> 4)
+               }
+             break;
+           case 0xdc:
+             if ((0x0c == ir.modrm >> 4)
                  || (0x0d == ir.modrm >> 4)
                  || (0x0f == ir.modrm >> 4))
-                {
+               {
                  if ((ir.modrm & 0x0f) <= 7)
                    {
                      if (i386_record_floats (gdbarch, &ir,
@@ -6396,55 +6380,55 @@ Do you want to stop the program?"),
                                              ((ir.modrm & 0x0f) - 0x08)))
                        return -1;
                    }
-                }
+               }
              break;
-            case 0xdd:
-              if (0x0c == ir.modrm >> 4)
-                {
-                  if (i386_record_floats (gdbarch, &ir,
-                                          I387_FTAG_REGNUM (tdep)))
-                    return -1;
-                }
-              else if ((0x0d == ir.modrm >> 4) || (0x0e == ir.modrm >> 4))
-                {
-                  if ((ir.modrm & 0x0f) <= 7)
-                    {
+           case 0xdd:
+             if (0x0c == ir.modrm >> 4)
+               {
+                 if (i386_record_floats (gdbarch, &ir,
+                                         I387_FTAG_REGNUM (tdep)))
+                   return -1;
+               }
+             else if ((0x0d == ir.modrm >> 4) || (0x0e == ir.modrm >> 4))
+               {
+                 if ((ir.modrm & 0x0f) <= 7)
+                   {
                      if (i386_record_floats (gdbarch, &ir,
                                              I387_ST0_REGNUM (tdep) +
                                              (ir.modrm & 0x0f)))
                        return -1;
-                    }
-                  else
-                    {
-                      if (i386_record_floats (gdbarch, &ir,
+                   }
+                 else
+                   {
+                     if (i386_record_floats (gdbarch, &ir,
                                              I386_SAVE_FPU_REGS))
-                        return -1;
-                    }
-                }
-              break;
-            case 0xde:
-              if ((0x0c == ir.modrm >> 4)
+                       return -1;
+                   }
+               }
+             break;
+           case 0xde:
+             if ((0x0c == ir.modrm >> 4)
                  || (0x0e == ir.modrm >> 4)
                  || (0x0f == ir.modrm >> 4)
                  || (0xd9 == ir.modrm))
-                {
+               {
                  if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
                    return -1;
-                }
-              break;
-            case 0xdf:
-              if (0xe0 == ir.modrm)
-                {
+               }
+             break;
+           case 0xdf:
+             if (0xe0 == ir.modrm)
+               {
                  if (record_full_arch_list_add_reg (ir.regcache,
                                                     I386_EAX_REGNUM))
                    return -1;
-                }
-              else if ((0x0f == ir.modrm >> 4) || (0x0e == ir.modrm >> 4))
-                {
+               }
+             else if ((0x0f == ir.modrm >> 4) || (0x0e == ir.modrm >> 4))
+               {
                  if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
                    return -1;
-                }
-              break;
+               }
+             break;
            }
        }
       break;
@@ -6456,51 +6440,51 @@ Do you want to stop the program?"),
     case 0x6c:    /* insS */
     case 0x6d:
       regcache_raw_read_unsigned (ir.regcache,
-                                  ir.regmap[X86_RECORD_RECX_REGNUM],
-                                  &addr);
+                                 ir.regmap[X86_RECORD_RECX_REGNUM],
+                                 &addr);
       if (addr)
-        {
-          ULONGEST es, ds;
+       {
+         ULONGEST es, ds;
 
-          if ((opcode & 1) == 0)
+         if ((opcode & 1) == 0)
            ir.ot = OT_BYTE;
-          else
+         else
            ir.ot = ir.dflag + OT_WORD;
-          regcache_raw_read_unsigned (ir.regcache,
-                                      ir.regmap[X86_RECORD_REDI_REGNUM],
-                                      &addr);
-
-          regcache_raw_read_unsigned (ir.regcache,
-                                      ir.regmap[X86_RECORD_ES_REGNUM],
-                                      &es);
-          regcache_raw_read_unsigned (ir.regcache,
-                                      ir.regmap[X86_RECORD_DS_REGNUM],
-                                      &ds);
-          if (ir.aflag && (es != ds))
-            {
-              /* addr += ((uint32_t) read_register (I386_ES_REGNUM)) << 4; */
-              if (record_full_memory_query)
-                {
-                  if (yquery (_("\
+         regcache_raw_read_unsigned (ir.regcache,
+                                     ir.regmap[X86_RECORD_REDI_REGNUM],
+                                     &addr);
+
+         regcache_raw_read_unsigned (ir.regcache,
+                                     ir.regmap[X86_RECORD_ES_REGNUM],
+                                     &es);
+         regcache_raw_read_unsigned (ir.regcache,
+                                     ir.regmap[X86_RECORD_DS_REGNUM],
+                                     &ds);
+         if (ir.aflag && (es != ds))
+           {
+             /* addr += ((uint32_t) read_register (I386_ES_REGNUM)) << 4; */
+             if (record_full_memory_query)
+               {
+                 if (yquery (_("\
 Process record ignores the memory change of instruction at address %s\n\
 because it can't get the value of the segment register.\n\
 Do you want to stop the program?"),
-                              paddress (gdbarch, ir.orig_addr)))
-                    return -1;
-                }
-            }
-          else
-            {
-              if (record_full_arch_list_add_mem (addr, 1 << ir.ot))
-                return -1;
-            }
-
-          if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
-            I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
-          if (opcode == 0xa4 || opcode == 0xa5)
-            I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
-          I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
-          I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
+                             paddress (gdbarch, ir.orig_addr)))
+                   return -1;
+               }
+           }
+         else
+           {
+             if (record_full_arch_list_add_mem (addr, 1 << ir.ot))
+               return -1;
+           }
+
+         if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
+           I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
+         if (opcode == 0xa4 || opcode == 0xa5)
+           I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
+         I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
+         I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
        }
       break;
 
@@ -6509,7 +6493,7 @@ Do you want to stop the program?"),
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
       if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
-        I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
+       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
       break;
 
@@ -6518,7 +6502,7 @@ Do you want to stop the program?"),
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
       if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
-        I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
+       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
       break;
 
@@ -6526,7 +6510,7 @@ Do you want to stop the program?"),
     case 0xaf:
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
       if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
-        I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
+       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
       break;
 
@@ -6534,7 +6518,7 @@ Do you want to stop the program?"),
     case 0x6f:
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
       if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
-        I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
+       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
       break;
 
@@ -6569,20 +6553,20 @@ Do you want to stop the program?"),
 
     case 0xe8:    /* call im */
       if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
-        ir.dflag = 2;
+       ir.dflag = 2;
       if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
-        return -1;
+       return -1;
       break;
 
     case 0x9a:    /* lcall im */
       if (ir.regmap[X86_RECORD_R8_REGNUM])
-        {
-          ir.addr -= 1;
-          goto no_support;
-        }
+       {
+         ir.addr -= 1;
+         goto no_support;
+       }
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM);
       if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
-        return -1;
+       return -1;
       break;
 
     case 0xe9:    /* jmp im */
@@ -6643,7 +6627,7 @@ Do you want to stop the program?"),
       if (i386_record_modrm (&ir))
        return -1;
       if (ir.mod == 3)
-        I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rex_b ? (ir.rm | ir.rex_b)
+       I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rex_b ? (ir.rm | ir.rex_b)
                                            : (ir.rm & 0x3));
       else
        {
@@ -6680,9 +6664,9 @@ Do you want to stop the program?"),
     case 0x9c:    /* pushf */
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
       if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
-        ir.dflag = 2;
+       ir.dflag = 2;
       if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
-        return -1;
+       return -1;
       break;
 
     case 0x9d:    /* popf */
@@ -6692,10 +6676,10 @@ Do you want to stop the program?"),
 
     case 0x9e:    /* sahf */
       if (ir.regmap[X86_RECORD_R8_REGNUM])
-        {
-          ir.addr -= 1;
-          goto no_support;
-        }
+       {
+         ir.addr -= 1;
+         goto no_support;
+       }
       /* FALLTHROUGH */
     case 0xf5:    /* cmc */
     case 0xf8:    /* clc */
@@ -6707,10 +6691,10 @@ Do you want to stop the program?"),
 
     case 0x9f:    /* lahf */
       if (ir.regmap[X86_RECORD_R8_REGNUM])
-        {
-          ir.addr -= 1;
-          goto no_support;
-        }
+       {
+         ir.addr -= 1;
+         goto no_support;
+       }
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
       break;
@@ -6728,8 +6712,8 @@ Do you want to stop the program?"),
        }
       if (ir.reg != 4)
        {
-          if (ir.mod == 3)
-            I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
+         if (ir.mod == 3)
+           I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
          else
            {
              if (i386_record_lea_modrm (&ir))
@@ -6748,34 +6732,34 @@ Do you want to stop the program?"),
     case 0x0fbb:    /* btc */
       ir.ot = ir.dflag + OT_WORD;
       if (i386_record_modrm (&ir))
-        return -1;
+       return -1;
       if (ir.mod == 3)
-        I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
+       I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
       else
-        {
-          uint64_t addr64;
-          if (i386_record_lea_modrm_addr (&ir, &addr64))
-            return -1;
-          regcache_raw_read_unsigned (ir.regcache,
-                                      ir.regmap[ir.reg | rex_r],
-                                      &addr);
-          switch (ir.dflag)
-            {
-            case 0:
-              addr64 += ((int16_t) addr >> 4) << 4;
-              break;
-            case 1:
-              addr64 += ((int32_t) addr >> 5) << 5;
-              break;
-            case 2:
-              addr64 += ((int64_t) addr >> 6) << 6;
-              break;
-            }
-          if (record_full_arch_list_add_mem (addr64, 1 << ir.ot))
-            return -1;
-          if (i386_record_lea_modrm (&ir))
-            return -1;
-        }
+       {
+         uint64_t addr64;
+         if (i386_record_lea_modrm_addr (&ir, &addr64))
+           return -1;
+         regcache_raw_read_unsigned (ir.regcache,
+                                     ir.regmap[ir.reg | rex_r],
+                                     &addr);
+         switch (ir.dflag)
+           {
+           case 0:
+             addr64 += ((int16_t) addr >> 4) << 4;
+             break;
+           case 1:
+             addr64 += ((int32_t) addr >> 5) << 5;
+             break;
+           case 2:
+             addr64 += ((int64_t) addr >> 6) << 6;
+             break;
+           }
+         if (record_full_arch_list_add_mem (addr64, 1 << ir.ot))
+           return -1;
+         if (i386_record_lea_modrm (&ir))
+           return -1;
+       }
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
       break;
 
@@ -6793,10 +6777,10 @@ Do you want to stop the program?"),
     case 0xd4:    /* aam */
     case 0xd5:    /* aad */
       if (ir.regmap[X86_RECORD_R8_REGNUM])
-        {
-          ir.addr -= 1;
-          goto no_support;
-        }
+       {
+         ir.addr -= 1;
+         goto no_support;
+       }
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
       break;
@@ -6881,10 +6865,10 @@ Do you want to stop the program?"),
 
     case 0xd6:    /* salc */
       if (ir.regmap[X86_RECORD_R8_REGNUM])
-        {
-          ir.addr -= 1;
-          goto no_support;
-        }
+       {
+         ir.addr -= 1;
+         goto no_support;
+       }
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
       break;
@@ -6919,11 +6903,11 @@ Do you want to stop the program?"),
     case 0x0f34:    /* sysenter */
       {
        int ret;
-        if (ir.regmap[X86_RECORD_R8_REGNUM])
-          {
-            ir.addr -= 2;
-            goto no_support;
-          }
+       if (ir.regmap[X86_RECORD_R8_REGNUM])
+         {
+           ir.addr -= 2;
+           goto no_support;
+         }
        if (tdep->i386_sysenter_record == NULL)
          {
            printf_unfiltered (_("Process record does not support "
@@ -6962,7 +6946,7 @@ Do you want to stop the program?"),
 
     case 0x0f07:    /* sysret */
       printf_unfiltered (_("Process record does not support "
-                           "instruction sysret.\n"));
+                          "instruction sysret.\n"));
       ir.addr -= 2;
       goto no_support;
       break;
@@ -6989,7 +6973,7 @@ Do you want to stop the program?"),
        case 0:  /* sldt */
        case 1:  /* str  */
          if (ir.mod == 3)
-            I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
+           I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
          else
            {
              ir.ot = OT_WORD;
@@ -7002,7 +6986,7 @@ Do you want to stop the program?"),
          break;
        case 4:  /* verr */
        case 5:  /* verw */
-          I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
+         I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
          break;
        default:
          ir.addr -= 3;
@@ -7029,15 +7013,15 @@ Do you want to stop the program?"),
              }
            if (ir.override >= 0)
              {
-                if (record_full_memory_query)
-                  {
-                    if (yquery (_("\
+               if (record_full_memory_query)
+                 {
+                   if (yquery (_("\
 Process record ignores the memory change of instruction at address %s\n\
 because it can't get the value of the segment register.\n\
 Do you want to stop the program?"),
-                                paddress (gdbarch, ir.orig_addr)))
+                               paddress (gdbarch, ir.orig_addr)))
                      return -1;
-                  }
+                 }
              }
            else
              {
@@ -7046,16 +7030,16 @@ Do you want to stop the program?"),
                if (record_full_arch_list_add_mem (addr64, 2))
                  return -1;
                addr64 += 2;
-                if (ir.regmap[X86_RECORD_R8_REGNUM])
-                  {
-                    if (record_full_arch_list_add_mem (addr64, 8))
+               if (ir.regmap[X86_RECORD_R8_REGNUM])
+                 {
+                   if (record_full_arch_list_add_mem (addr64, 8))
                      return -1;
-                  }
-                else
-                  {
-                    if (record_full_arch_list_add_mem (addr64, 4))
+                 }
+               else
+                 {
+                   if (record_full_arch_list_add_mem (addr64, 4))
                      return -1;
-                  }
+                 }
              }
          }
          break;
@@ -7081,15 +7065,15 @@ Do you want to stop the program?"),
              /* sidt */
              if (ir.override >= 0)
                {
-                  if (record_full_memory_query)
-                    {
-                      if (yquery (_("\
+                 if (record_full_memory_query)
+                   {
+                     if (yquery (_("\
 Process record ignores the memory change of instruction at address %s\n\
 because it can't get the value of the segment register.\n\
 Do you want to stop the program?"),
-                                  paddress (gdbarch, ir.orig_addr)))
-                        return -1;
-                    }
+                                 paddress (gdbarch, ir.orig_addr)))
+                       return -1;
+                   }
                }
              else
                {
@@ -7100,16 +7084,16 @@ Do you want to stop the program?"),
                  if (record_full_arch_list_add_mem (addr64, 2))
                    return -1;
                  addr64 += 2;
-                  if (ir.regmap[X86_RECORD_R8_REGNUM])
-                    {
-                      if (record_full_arch_list_add_mem (addr64, 8))
-                       return -1;
-                    }
-                  else
-                    {
-                      if (record_full_arch_list_add_mem (addr64, 4))
-                       return -1;
-                    }
+                 if (ir.regmap[X86_RECORD_R8_REGNUM])
+                   {
+                     if (record_full_arch_list_add_mem (addr64, 8))
+                       return -1;
+                   }
+                 else
+                   {
+                     if (record_full_arch_list_add_mem (addr64, 4))
+                       return -1;
+                   }
                }
            }
          break;
@@ -7127,6 +7111,7 @@ Do you want to stop the program?"),
              else if (ir.rm == 1)
                break;
            }
+         /* Fall through.  */
        case 3:  /* lidt */
          if (ir.mod == 3)
            {
@@ -7156,13 +7141,13 @@ Do you want to stop the program?"),
          if (ir.mod == 3)
            {
              if (ir.rm == 0 && ir.regmap[X86_RECORD_R8_REGNUM])
-               I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_GS_REGNUM);
+               I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_GS_REGNUM);
              else
-               {
-                 ir.addr -= 3;
-                 opcode = opcode << 8 | ir.modrm;
-                 goto no_support;
-               }
+               {
+                 ir.addr -= 3;
+                 opcode = opcode << 8 | ir.modrm;
+                 goto no_support;
+               }
            }
          else
            I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
@@ -7183,18 +7168,18 @@ Do you want to stop the program?"),
       if (i386_record_modrm (&ir))
        return -1;
       if (ir.mod == 3 || ir.regmap[X86_RECORD_R8_REGNUM])
-        {
-          I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.regmap[X86_RECORD_R8_REGNUM]
+       {
+         I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.regmap[X86_RECORD_R8_REGNUM]
                                              ? (ir.reg | rex_r) : ir.rm);
-        }
+       }
       else
-        {
-          ir.ot = ir.dflag ? OT_LONG : OT_WORD;
-          if (i386_record_lea_modrm (&ir))
-            return -1;
-        }
+       {
+         ir.ot = ir.dflag ? OT_LONG : OT_WORD;
+         if (i386_record_lea_modrm (&ir))
+           return -1;
+       }
       if (!ir.regmap[X86_RECORD_R8_REGNUM])
-        I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
+       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
       break;
 
     case 0x0f02:    /* lar */
@@ -7209,7 +7194,7 @@ Do you want to stop the program?"),
       if (i386_record_modrm (&ir))
        return -1;
       if (ir.mod == 3 && ir.reg == 3)
-        {
+       {
          ir.addr -= 3;
          opcode = opcode << 8 | ir.modrm;
          goto no_support;
@@ -7246,7 +7231,7 @@ Do you want to stop the program?"),
          if (opcode & 2)
            I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
          else
-            I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
+           I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
          break;
        default:
          ir.addr -= 3;
@@ -7268,7 +7253,7 @@ Do you want to stop the program?"),
          goto no_support;
        }
       if (opcode & 2)
-        I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
+       I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
       else
        I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
       break;
@@ -7285,7 +7270,7 @@ Do you want to stop the program?"),
     case 0x0f0e:    /* 3DNow! femms */
     case 0x0f77:    /* emms */
       if (i386_fpc_regnum_p (gdbarch, I387_FTAG_REGNUM(tdep)))
-        goto no_support;
+       goto no_support;
       record_full_arch_list_add_reg (ir.regcache, I387_FTAG_REGNUM(tdep));
       break;
 
@@ -7296,42 +7281,42 @@ Do you want to stop the program?"),
        return -1;
       ir.addr++;
       switch (opcode8)
-        {
-        case 0x0c:    /* 3DNow! pi2fw */
-        case 0x0d:    /* 3DNow! pi2fd */
-        case 0x1c:    /* 3DNow! pf2iw */
-        case 0x1d:    /* 3DNow! pf2id */
-        case 0x8a:    /* 3DNow! pfnacc */
-        case 0x8e:    /* 3DNow! pfpnacc */
-        case 0x90:    /* 3DNow! pfcmpge */
-        case 0x94:    /* 3DNow! pfmin */
-        case 0x96:    /* 3DNow! pfrcp */
-        case 0x97:    /* 3DNow! pfrsqrt */
-        case 0x9a:    /* 3DNow! pfsub */
-        case 0x9e:    /* 3DNow! pfadd */
-        case 0xa0:    /* 3DNow! pfcmpgt */
-        case 0xa4:    /* 3DNow! pfmax */
-        case 0xa6:    /* 3DNow! pfrcpit1 */
-        case 0xa7:    /* 3DNow! pfrsqit1 */
-        case 0xaa:    /* 3DNow! pfsubr */
-        case 0xae:    /* 3DNow! pfacc */
-        case 0xb0:    /* 3DNow! pfcmpeq */
-        case 0xb4:    /* 3DNow! pfmul */
-        case 0xb6:    /* 3DNow! pfrcpit2 */
-        case 0xb7:    /* 3DNow! pmulhrw */
-        case 0xbb:    /* 3DNow! pswapd */
-        case 0xbf:    /* 3DNow! pavgusb */
-          if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.reg))
-            goto no_support_3dnow_data;
-          record_full_arch_list_add_reg (ir.regcache, ir.reg);
-          break;
-
-        default:
+       {
+       case 0x0c:    /* 3DNow! pi2fw */
+       case 0x0d:    /* 3DNow! pi2fd */
+       case 0x1c:    /* 3DNow! pf2iw */
+       case 0x1d:    /* 3DNow! pf2id */
+       case 0x8a:    /* 3DNow! pfnacc */
+       case 0x8e:    /* 3DNow! pfpnacc */
+       case 0x90:    /* 3DNow! pfcmpge */
+       case 0x94:    /* 3DNow! pfmin */
+       case 0x96:    /* 3DNow! pfrcp */
+       case 0x97:    /* 3DNow! pfrsqrt */
+       case 0x9a:    /* 3DNow! pfsub */
+       case 0x9e:    /* 3DNow! pfadd */
+       case 0xa0:    /* 3DNow! pfcmpgt */
+       case 0xa4:    /* 3DNow! pfmax */
+       case 0xa6:    /* 3DNow! pfrcpit1 */
+       case 0xa7:    /* 3DNow! pfrsqit1 */
+       case 0xaa:    /* 3DNow! pfsubr */
+       case 0xae:    /* 3DNow! pfacc */
+       case 0xb0:    /* 3DNow! pfcmpeq */
+       case 0xb4:    /* 3DNow! pfmul */
+       case 0xb6:    /* 3DNow! pfrcpit2 */
+       case 0xb7:    /* 3DNow! pmulhrw */
+       case 0xbb:    /* 3DNow! pswapd */
+       case 0xbf:    /* 3DNow! pavgusb */
+         if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.reg))
+           goto no_support_3dnow_data;
+         record_full_arch_list_add_reg (ir.regcache, ir.reg);
+         break;
+
+       default:
 no_support_3dnow_data:
-          opcode = (opcode << 8) | opcode8;
-          goto no_support;
-          break;
-        }
+         opcode = (opcode << 8) | opcode8;
+         goto no_support;
+         break;
+       }
       break;
 
     case 0x0faa:    /* rsm */
@@ -7350,69 +7335,69 @@ no_support_3dnow_data:
       if (i386_record_modrm (&ir))
        return -1;
       switch(ir.reg)
-        {
-        case 0:    /* fxsave */
-          {
-            uint64_t tmpu64;
+       {
+       case 0:    /* fxsave */
+         {
+           uint64_t tmpu64;
 
-            I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
+           I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
            if (i386_record_lea_modrm_addr (&ir, &tmpu64))
              return -1;
-            if (record_full_arch_list_add_mem (tmpu64, 512))
-              return -1;
-          }
-          break;
+           if (record_full_arch_list_add_mem (tmpu64, 512))
+             return -1;
+         }
+         break;
 
-        case 1:    /* fxrstor */
-          {
-            int i;
+       case 1:    /* fxrstor */
+         {
+           int i;
 
-            I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
+           I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
 
-            for (i = I387_MM0_REGNUM (tdep);
-                 i386_mmx_regnum_p (gdbarch, i); i++)
-              record_full_arch_list_add_reg (ir.regcache, i);
+           for (i = I387_MM0_REGNUM (tdep);
+                i386_mmx_regnum_p (gdbarch, i); i++)
+             record_full_arch_list_add_reg (ir.regcache, i);
 
-            for (i = I387_XMM0_REGNUM (tdep);
-                 i386_xmm_regnum_p (gdbarch, i); i++)
-              record_full_arch_list_add_reg (ir.regcache, i);
+           for (i = I387_XMM0_REGNUM (tdep);
+                i386_xmm_regnum_p (gdbarch, i); i++)
+             record_full_arch_list_add_reg (ir.regcache, i);
 
-            if (i386_mxcsr_regnum_p (gdbarch, I387_MXCSR_REGNUM(tdep)))
-              record_full_arch_list_add_reg (ir.regcache,
+           if (i386_mxcsr_regnum_p (gdbarch, I387_MXCSR_REGNUM(tdep)))
+             record_full_arch_list_add_reg (ir.regcache,
                                             I387_MXCSR_REGNUM(tdep));
 
-            for (i = I387_ST0_REGNUM (tdep);
-                 i386_fp_regnum_p (gdbarch, i); i++)
-              record_full_arch_list_add_reg (ir.regcache, i);
-
-            for (i = I387_FCTRL_REGNUM (tdep);
-                 i386_fpc_regnum_p (gdbarch, i); i++)
-              record_full_arch_list_add_reg (ir.regcache, i);
-          }
-          break;
-
-        case 2:    /* ldmxcsr */
-          if (!i386_mxcsr_regnum_p (gdbarch, I387_MXCSR_REGNUM(tdep)))
-            goto no_support;
-          record_full_arch_list_add_reg (ir.regcache, I387_MXCSR_REGNUM(tdep));
-          break;
-
-        case 3:    /* stmxcsr */
-          ir.ot = OT_LONG;
-          if (i386_record_lea_modrm (&ir))
-            return -1;
-          break;
-
-        case 5:    /* lfence */
-        case 6:    /* mfence */
-        case 7:    /* sfence clflush */
-          break;
-
-        default:
-          opcode = (opcode << 8) | ir.modrm;
-          goto no_support;
-          break;
-        }
+           for (i = I387_ST0_REGNUM (tdep);
+                i386_fp_regnum_p (gdbarch, i); i++)
+             record_full_arch_list_add_reg (ir.regcache, i);
+
+           for (i = I387_FCTRL_REGNUM (tdep);
+                i386_fpc_regnum_p (gdbarch, i); i++)
+             record_full_arch_list_add_reg (ir.regcache, i);
+         }
+         break;
+
+       case 2:    /* ldmxcsr */
+         if (!i386_mxcsr_regnum_p (gdbarch, I387_MXCSR_REGNUM(tdep)))
+           goto no_support;
+         record_full_arch_list_add_reg (ir.regcache, I387_MXCSR_REGNUM(tdep));
+         break;
+
+       case 3:    /* stmxcsr */
+         ir.ot = OT_LONG;
+         if (i386_record_lea_modrm (&ir))
+           return -1;
+         break;
+
+       case 5:    /* lfence */
+       case 6:    /* mfence */
+       case 7:    /* sfence clflush */
+         break;
+
+       default:
+         opcode = (opcode << 8) | ir.modrm;
+         goto no_support;
+         break;
+       }
       break;
 
     case 0x0fc3:    /* movnti */
@@ -7420,10 +7405,10 @@ no_support_3dnow_data:
       if (i386_record_modrm (&ir))
        return -1;
       if (ir.mod == 3)
-        goto no_support;
+       goto no_support;
       ir.reg |= rex_r;
       if (i386_record_lea_modrm (&ir))
-        return -1;
+       return -1;
       break;
 
     /* Add prefix to opcode.  */
@@ -7543,541 +7528,541 @@ no_support_3dnow_data:
     case 0x0ffe:
       /* Mask out PREFIX_ADDR.  */
       switch ((prefixes & ~PREFIX_ADDR))
-        {
-        case PREFIX_REPNZ:
-          opcode |= 0xf20000;
-          break;
-        case PREFIX_DATA:
-          opcode |= 0x660000;
-          break;
-        case PREFIX_REPZ:
-          opcode |= 0xf30000;
-          break;
-        }
+       {
+       case PREFIX_REPNZ:
+         opcode |= 0xf20000;
+         break;
+       case PREFIX_DATA:
+         opcode |= 0x660000;
+         break;
+       case PREFIX_REPZ:
+         opcode |= 0xf30000;
+         break;
+       }
 reswitch_prefix_add:
       switch (opcode)
-        {
-        case 0x0f38:
-        case 0x660f38:
-        case 0xf20f38:
-        case 0x0f3a:
-        case 0x660f3a:
-          if (record_read_memory (gdbarch, ir.addr, &opcode8, 1))
+       {
+       case 0x0f38:
+       case 0x660f38:
+       case 0xf20f38:
+       case 0x0f3a:
+       case 0x660f3a:
+         if (record_read_memory (gdbarch, ir.addr, &opcode8, 1))
            return -1;
-          ir.addr++;
-          opcode = (uint32_t) opcode8 | opcode << 8;
-          goto reswitch_prefix_add;
-          break;
-
-        case 0x0f10:        /* movups */
-        case 0x660f10:      /* movupd */
-        case 0xf30f10:      /* movss */
-        case 0xf20f10:      /* movsd */
-        case 0x0f12:        /* movlps */
-        case 0x660f12:      /* movlpd */
-        case 0xf30f12:      /* movsldup */
-        case 0xf20f12:      /* movddup */
-        case 0x0f14:        /* unpcklps */
-        case 0x660f14:      /* unpcklpd */
-        case 0x0f15:        /* unpckhps */
-        case 0x660f15:      /* unpckhpd */
-        case 0x0f16:        /* movhps */
-        case 0x660f16:      /* movhpd */
-        case 0xf30f16:      /* movshdup */
-        case 0x0f28:        /* movaps */
-        case 0x660f28:      /* movapd */
-        case 0x0f2a:        /* cvtpi2ps */
-        case 0x660f2a:      /* cvtpi2pd */
-        case 0xf30f2a:      /* cvtsi2ss */
-        case 0xf20f2a:      /* cvtsi2sd */
-        case 0x0f2c:        /* cvttps2pi */
-        case 0x660f2c:      /* cvttpd2pi */
-        case 0x0f2d:        /* cvtps2pi */
-        case 0x660f2d:      /* cvtpd2pi */
-        case 0x660f3800:    /* pshufb */
-        case 0x660f3801:    /* phaddw */
-        case 0x660f3802:    /* phaddd */
-        case 0x660f3803:    /* phaddsw */
-        case 0x660f3804:    /* pmaddubsw */
-        case 0x660f3805:    /* phsubw */
-        case 0x660f3806:    /* phsubd */
-        case 0x660f3807:    /* phsubsw */
-        case 0x660f3808:    /* psignb */
-        case 0x660f3809:    /* psignw */
-        case 0x660f380a:    /* psignd */
-        case 0x660f380b:    /* pmulhrsw */
-        case 0x660f3810:    /* pblendvb */
-        case 0x660f3814:    /* blendvps */
-        case 0x660f3815:    /* blendvpd */
-        case 0x660f381c:    /* pabsb */
-        case 0x660f381d:    /* pabsw */
-        case 0x660f381e:    /* pabsd */
-        case 0x660f3820:    /* pmovsxbw */
-        case 0x660f3821:    /* pmovsxbd */
-        case 0x660f3822:    /* pmovsxbq */
-        case 0x660f3823:    /* pmovsxwd */
-        case 0x660f3824:    /* pmovsxwq */
-        case 0x660f3825:    /* pmovsxdq */
-        case 0x660f3828:    /* pmuldq */
-        case 0x660f3829:    /* pcmpeqq */
-        case 0x660f382a:    /* movntdqa */
-        case 0x660f3a08:    /* roundps */
-        case 0x660f3a09:    /* roundpd */
-        case 0x660f3a0a:    /* roundss */
-        case 0x660f3a0b:    /* roundsd */
-        case 0x660f3a0c:    /* blendps */
-        case 0x660f3a0d:    /* blendpd */
-        case 0x660f3a0e:    /* pblendw */
-        case 0x660f3a0f:    /* palignr */
-        case 0x660f3a20:    /* pinsrb */
-        case 0x660f3a21:    /* insertps */
-        case 0x660f3a22:    /* pinsrd pinsrq */
-        case 0x660f3a40:    /* dpps */
-        case 0x660f3a41:    /* dppd */
-        case 0x660f3a42:    /* mpsadbw */
-        case 0x660f3a60:    /* pcmpestrm */
-        case 0x660f3a61:    /* pcmpestri */
-        case 0x660f3a62:    /* pcmpistrm */
-        case 0x660f3a63:    /* pcmpistri */
-        case 0x0f51:        /* sqrtps */
-        case 0x660f51:      /* sqrtpd */
-        case 0xf20f51:      /* sqrtsd */
-        case 0xf30f51:      /* sqrtss */
-        case 0x0f52:        /* rsqrtps */
-        case 0xf30f52:      /* rsqrtss */
-        case 0x0f53:        /* rcpps */
-        case 0xf30f53:      /* rcpss */
-        case 0x0f54:        /* andps */
-        case 0x660f54:      /* andpd */
-        case 0x0f55:        /* andnps */
-        case 0x660f55:      /* andnpd */
-        case 0x0f56:        /* orps */
-        case 0x660f56:      /* orpd */
-        case 0x0f57:        /* xorps */
-        case 0x660f57:      /* xorpd */
-        case 0x0f58:        /* addps */
-        case 0x660f58:      /* addpd */
-        case 0xf20f58:      /* addsd */
-        case 0xf30f58:      /* addss */
-        case 0x0f59:        /* mulps */
-        case 0x660f59:      /* mulpd */
-        case 0xf20f59:      /* mulsd */
-        case 0xf30f59:      /* mulss */
-        case 0x0f5a:        /* cvtps2pd */
-        case 0x660f5a:      /* cvtpd2ps */
-        case 0xf20f5a:      /* cvtsd2ss */
-        case 0xf30f5a:      /* cvtss2sd */
-        case 0x0f5b:        /* cvtdq2ps */
-        case 0x660f5b:      /* cvtps2dq */
-        case 0xf30f5b:      /* cvttps2dq */
-        case 0x0f5c:        /* subps */
-        case 0x660f5c:      /* subpd */
-        case 0xf20f5c:      /* subsd */
-        case 0xf30f5c:      /* subss */
-        case 0x0f5d:        /* minps */
-        case 0x660f5d:      /* minpd */
-        case 0xf20f5d:      /* minsd */
-        case 0xf30f5d:      /* minss */
-        case 0x0f5e:        /* divps */
-        case 0x660f5e:      /* divpd */
-        case 0xf20f5e:      /* divsd */
-        case 0xf30f5e:      /* divss */
-        case 0x0f5f:        /* maxps */
-        case 0x660f5f:      /* maxpd */
-        case 0xf20f5f:      /* maxsd */
-        case 0xf30f5f:      /* maxss */
-        case 0x660f60:      /* punpcklbw */
-        case 0x660f61:      /* punpcklwd */
-        case 0x660f62:      /* punpckldq */
-        case 0x660f63:      /* packsswb */
-        case 0x660f64:      /* pcmpgtb */
-        case 0x660f65:      /* pcmpgtw */
-        case 0x660f66:      /* pcmpgtd */
-        case 0x660f67:      /* packuswb */
-        case 0x660f68:      /* punpckhbw */
-        case 0x660f69:      /* punpckhwd */
-        case 0x660f6a:      /* punpckhdq */
-        case 0x660f6b:      /* packssdw */
-        case 0x660f6c:      /* punpcklqdq */
-        case 0x660f6d:      /* punpckhqdq */
-        case 0x660f6e:      /* movd */
-        case 0x660f6f:      /* movdqa */
-        case 0xf30f6f:      /* movdqu */
-        case 0x660f70:      /* pshufd */
-        case 0xf20f70:      /* pshuflw */
-        case 0xf30f70:      /* pshufhw */
-        case 0x660f74:      /* pcmpeqb */
-        case 0x660f75:      /* pcmpeqw */
-        case 0x660f76:      /* pcmpeqd */
-        case 0x660f7c:      /* haddpd */
-        case 0xf20f7c:      /* haddps */
-        case 0x660f7d:      /* hsubpd */
-        case 0xf20f7d:      /* hsubps */
-        case 0xf30f7e:      /* movq */
-        case 0x0fc2:        /* cmpps */
-        case 0x660fc2:      /* cmppd */
-        case 0xf20fc2:      /* cmpsd */
-        case 0xf30fc2:      /* cmpss */
-        case 0x660fc4:      /* pinsrw */
-        case 0x0fc6:        /* shufps */
-        case 0x660fc6:      /* shufpd */
-        case 0x660fd0:      /* addsubpd */
-        case 0xf20fd0:      /* addsubps */
-        case 0x660fd1:      /* psrlw */
-        case 0x660fd2:      /* psrld */
-        case 0x660fd3:      /* psrlq */
-        case 0x660fd4:      /* paddq */
-        case 0x660fd5:      /* pmullw */
-        case 0xf30fd6:      /* movq2dq */
-        case 0x660fd8:      /* psubusb */
-        case 0x660fd9:      /* psubusw */
-        case 0x660fda:      /* pminub */
-        case 0x660fdb:      /* pand */
-        case 0x660fdc:      /* paddusb */
-        case 0x660fdd:      /* paddusw */
-        case 0x660fde:      /* pmaxub */
-        case 0x660fdf:      /* pandn */
-        case 0x660fe0:      /* pavgb */
-        case 0x660fe1:      /* psraw */
-        case 0x660fe2:      /* psrad */
-        case 0x660fe3:      /* pavgw */
-        case 0x660fe4:      /* pmulhuw */
-        case 0x660fe5:      /* pmulhw */
-        case 0x660fe6:      /* cvttpd2dq */
-        case 0xf20fe6:      /* cvtpd2dq */
-        case 0xf30fe6:      /* cvtdq2pd */
-        case 0x660fe8:      /* psubsb */
-        case 0x660fe9:      /* psubsw */
-        case 0x660fea:      /* pminsw */
-        case 0x660feb:      /* por */
-        case 0x660fec:      /* paddsb */
-        case 0x660fed:      /* paddsw */
-        case 0x660fee:      /* pmaxsw */
-        case 0x660fef:      /* pxor */
-        case 0xf20ff0:      /* lddqu */
-        case 0x660ff1:      /* psllw */
-        case 0x660ff2:      /* pslld */
-        case 0x660ff3:      /* psllq */
-        case 0x660ff4:      /* pmuludq */
-        case 0x660ff5:      /* pmaddwd */
-        case 0x660ff6:      /* psadbw */
-        case 0x660ff8:      /* psubb */
-        case 0x660ff9:      /* psubw */
-        case 0x660ffa:      /* psubd */
-        case 0x660ffb:      /* psubq */
-        case 0x660ffc:      /* paddb */
-        case 0x660ffd:      /* paddw */
-        case 0x660ffe:      /* paddd */
-          if (i386_record_modrm (&ir))
+         ir.addr++;
+         opcode = (uint32_t) opcode8 | opcode << 8;
+         goto reswitch_prefix_add;
+         break;
+
+       case 0x0f10:        /* movups */
+       case 0x660f10:      /* movupd */
+       case 0xf30f10:      /* movss */
+       case 0xf20f10:      /* movsd */
+       case 0x0f12:        /* movlps */
+       case 0x660f12:      /* movlpd */
+       case 0xf30f12:      /* movsldup */
+       case 0xf20f12:      /* movddup */
+       case 0x0f14:        /* unpcklps */
+       case 0x660f14:      /* unpcklpd */
+       case 0x0f15:        /* unpckhps */
+       case 0x660f15:      /* unpckhpd */
+       case 0x0f16:        /* movhps */
+       case 0x660f16:      /* movhpd */
+       case 0xf30f16:      /* movshdup */
+       case 0x0f28:        /* movaps */
+       case 0x660f28:      /* movapd */
+       case 0x0f2a:        /* cvtpi2ps */
+       case 0x660f2a:      /* cvtpi2pd */
+       case 0xf30f2a:      /* cvtsi2ss */
+       case 0xf20f2a:      /* cvtsi2sd */
+       case 0x0f2c:        /* cvttps2pi */
+       case 0x660f2c:      /* cvttpd2pi */
+       case 0x0f2d:        /* cvtps2pi */
+       case 0x660f2d:      /* cvtpd2pi */
+       case 0x660f3800:    /* pshufb */
+       case 0x660f3801:    /* phaddw */
+       case 0x660f3802:    /* phaddd */
+       case 0x660f3803:    /* phaddsw */
+       case 0x660f3804:    /* pmaddubsw */
+       case 0x660f3805:    /* phsubw */
+       case 0x660f3806:    /* phsubd */
+       case 0x660f3807:    /* phsubsw */
+       case 0x660f3808:    /* psignb */
+       case 0x660f3809:    /* psignw */
+       case 0x660f380a:    /* psignd */
+       case 0x660f380b:    /* pmulhrsw */
+       case 0x660f3810:    /* pblendvb */
+       case 0x660f3814:    /* blendvps */
+       case 0x660f3815:    /* blendvpd */
+       case 0x660f381c:    /* pabsb */
+       case 0x660f381d:    /* pabsw */
+       case 0x660f381e:    /* pabsd */
+       case 0x660f3820:    /* pmovsxbw */
+       case 0x660f3821:    /* pmovsxbd */
+       case 0x660f3822:    /* pmovsxbq */
+       case 0x660f3823:    /* pmovsxwd */
+       case 0x660f3824:    /* pmovsxwq */
+       case 0x660f3825:    /* pmovsxdq */
+       case 0x660f3828:    /* pmuldq */
+       case 0x660f3829:    /* pcmpeqq */
+       case 0x660f382a:    /* movntdqa */
+       case 0x660f3a08:    /* roundps */
+       case 0x660f3a09:    /* roundpd */
+       case 0x660f3a0a:    /* roundss */
+       case 0x660f3a0b:    /* roundsd */
+       case 0x660f3a0c:    /* blendps */
+       case 0x660f3a0d:    /* blendpd */
+       case 0x660f3a0e:    /* pblendw */
+       case 0x660f3a0f:    /* palignr */
+       case 0x660f3a20:    /* pinsrb */
+       case 0x660f3a21:    /* insertps */
+       case 0x660f3a22:    /* pinsrd pinsrq */
+       case 0x660f3a40:    /* dpps */
+       case 0x660f3a41:    /* dppd */
+       case 0x660f3a42:    /* mpsadbw */
+       case 0x660f3a60:    /* pcmpestrm */
+       case 0x660f3a61:    /* pcmpestri */
+       case 0x660f3a62:    /* pcmpistrm */
+       case 0x660f3a63:    /* pcmpistri */
+       case 0x0f51:        /* sqrtps */
+       case 0x660f51:      /* sqrtpd */
+       case 0xf20f51:      /* sqrtsd */
+       case 0xf30f51:      /* sqrtss */
+       case 0x0f52:        /* rsqrtps */
+       case 0xf30f52:      /* rsqrtss */
+       case 0x0f53:        /* rcpps */
+       case 0xf30f53:      /* rcpss */
+       case 0x0f54:        /* andps */
+       case 0x660f54:      /* andpd */
+       case 0x0f55:        /* andnps */
+       case 0x660f55:      /* andnpd */
+       case 0x0f56:        /* orps */
+       case 0x660f56:      /* orpd */
+       case 0x0f57:        /* xorps */
+       case 0x660f57:      /* xorpd */
+       case 0x0f58:        /* addps */
+       case 0x660f58:      /* addpd */
+       case 0xf20f58:      /* addsd */
+       case 0xf30f58:      /* addss */
+       case 0x0f59:        /* mulps */
+       case 0x660f59:      /* mulpd */
+       case 0xf20f59:      /* mulsd */
+       case 0xf30f59:      /* mulss */
+       case 0x0f5a:        /* cvtps2pd */
+       case 0x660f5a:      /* cvtpd2ps */
+       case 0xf20f5a:      /* cvtsd2ss */
+       case 0xf30f5a:      /* cvtss2sd */
+       case 0x0f5b:        /* cvtdq2ps */
+       case 0x660f5b:      /* cvtps2dq */
+       case 0xf30f5b:      /* cvttps2dq */
+       case 0x0f5c:        /* subps */
+       case 0x660f5c:      /* subpd */
+       case 0xf20f5c:      /* subsd */
+       case 0xf30f5c:      /* subss */
+       case 0x0f5d:        /* minps */
+       case 0x660f5d:      /* minpd */
+       case 0xf20f5d:      /* minsd */
+       case 0xf30f5d:      /* minss */
+       case 0x0f5e:        /* divps */
+       case 0x660f5e:      /* divpd */
+       case 0xf20f5e:      /* divsd */
+       case 0xf30f5e:      /* divss */
+       case 0x0f5f:        /* maxps */
+       case 0x660f5f:      /* maxpd */
+       case 0xf20f5f:      /* maxsd */
+       case 0xf30f5f:      /* maxss */
+       case 0x660f60:      /* punpcklbw */
+       case 0x660f61:      /* punpcklwd */
+       case 0x660f62:      /* punpckldq */
+       case 0x660f63:      /* packsswb */
+       case 0x660f64:      /* pcmpgtb */
+       case 0x660f65:      /* pcmpgtw */
+       case 0x660f66:      /* pcmpgtd */
+       case 0x660f67:      /* packuswb */
+       case 0x660f68:      /* punpckhbw */
+       case 0x660f69:      /* punpckhwd */
+       case 0x660f6a:      /* punpckhdq */
+       case 0x660f6b:      /* packssdw */
+       case 0x660f6c:      /* punpcklqdq */
+       case 0x660f6d:      /* punpckhqdq */
+       case 0x660f6e:      /* movd */
+       case 0x660f6f:      /* movdqa */
+       case 0xf30f6f:      /* movdqu */
+       case 0x660f70:      /* pshufd */
+       case 0xf20f70:      /* pshuflw */
+       case 0xf30f70:      /* pshufhw */
+       case 0x660f74:      /* pcmpeqb */
+       case 0x660f75:      /* pcmpeqw */
+       case 0x660f76:      /* pcmpeqd */
+       case 0x660f7c:      /* haddpd */
+       case 0xf20f7c:      /* haddps */
+       case 0x660f7d:      /* hsubpd */
+       case 0xf20f7d:      /* hsubps */
+       case 0xf30f7e:      /* movq */
+       case 0x0fc2:        /* cmpps */
+       case 0x660fc2:      /* cmppd */
+       case 0xf20fc2:      /* cmpsd */
+       case 0xf30fc2:      /* cmpss */
+       case 0x660fc4:      /* pinsrw */
+       case 0x0fc6:        /* shufps */
+       case 0x660fc6:      /* shufpd */
+       case 0x660fd0:      /* addsubpd */
+       case 0xf20fd0:      /* addsubps */
+       case 0x660fd1:      /* psrlw */
+       case 0x660fd2:      /* psrld */
+       case 0x660fd3:      /* psrlq */
+       case 0x660fd4:      /* paddq */
+       case 0x660fd5:      /* pmullw */
+       case 0xf30fd6:      /* movq2dq */
+       case 0x660fd8:      /* psubusb */
+       case 0x660fd9:      /* psubusw */
+       case 0x660fda:      /* pminub */
+       case 0x660fdb:      /* pand */
+       case 0x660fdc:      /* paddusb */
+       case 0x660fdd:      /* paddusw */
+       case 0x660fde:      /* pmaxub */
+       case 0x660fdf:      /* pandn */
+       case 0x660fe0:      /* pavgb */
+       case 0x660fe1:      /* psraw */
+       case 0x660fe2:      /* psrad */
+       case 0x660fe3:      /* pavgw */
+       case 0x660fe4:      /* pmulhuw */
+       case 0x660fe5:      /* pmulhw */
+       case 0x660fe6:      /* cvttpd2dq */
+       case 0xf20fe6:      /* cvtpd2dq */
+       case 0xf30fe6:      /* cvtdq2pd */
+       case 0x660fe8:      /* psubsb */
+       case 0x660fe9:      /* psubsw */
+       case 0x660fea:      /* pminsw */
+       case 0x660feb:      /* por */
+       case 0x660fec:      /* paddsb */
+       case 0x660fed:      /* paddsw */
+       case 0x660fee:      /* pmaxsw */
+       case 0x660fef:      /* pxor */
+       case 0xf20ff0:      /* lddqu */
+       case 0x660ff1:      /* psllw */
+       case 0x660ff2:      /* pslld */
+       case 0x660ff3:      /* psllq */
+       case 0x660ff4:      /* pmuludq */
+       case 0x660ff5:      /* pmaddwd */
+       case 0x660ff6:      /* psadbw */
+       case 0x660ff8:      /* psubb */
+       case 0x660ff9:      /* psubw */
+       case 0x660ffa:      /* psubd */
+       case 0x660ffb:      /* psubq */
+       case 0x660ffc:      /* paddb */
+       case 0x660ffd:      /* paddw */
+       case 0x660ffe:      /* paddd */
+         if (i386_record_modrm (&ir))
            return -1;
-          ir.reg |= rex_r;
-          if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.reg))
-            goto no_support;
-          record_full_arch_list_add_reg (ir.regcache,
+         ir.reg |= rex_r;
+         if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.reg))
+           goto no_support;
+         record_full_arch_list_add_reg (ir.regcache,
                                         I387_XMM0_REGNUM (tdep) + ir.reg);
-          if ((opcode & 0xfffffffc) == 0x660f3a60)
-            I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
-          break;
-
-        case 0x0f11:        /* movups */
-        case 0x660f11:      /* movupd */
-        case 0xf30f11:      /* movss */
-        case 0xf20f11:      /* movsd */
-        case 0x0f13:        /* movlps */
-        case 0x660f13:      /* movlpd */
-        case 0x0f17:        /* movhps */
-        case 0x660f17:      /* movhpd */
-        case 0x0f29:        /* movaps */
-        case 0x660f29:      /* movapd */
-        case 0x660f3a14:    /* pextrb */
-        case 0x660f3a15:    /* pextrw */
-        case 0x660f3a16:    /* pextrd pextrq */
-        case 0x660f3a17:    /* extractps */
-        case 0x660f7f:      /* movdqa */
-        case 0xf30f7f:      /* movdqu */
-          if (i386_record_modrm (&ir))
+         if ((opcode & 0xfffffffc) == 0x660f3a60)
+           I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
+         break;
+
+       case 0x0f11:        /* movups */
+       case 0x660f11:      /* movupd */
+       case 0xf30f11:      /* movss */
+       case 0xf20f11:      /* movsd */
+       case 0x0f13:        /* movlps */
+       case 0x660f13:      /* movlpd */
+       case 0x0f17:        /* movhps */
+       case 0x660f17:      /* movhpd */
+       case 0x0f29:        /* movaps */
+       case 0x660f29:      /* movapd */
+       case 0x660f3a14:    /* pextrb */
+       case 0x660f3a15:    /* pextrw */
+       case 0x660f3a16:    /* pextrd pextrq */
+       case 0x660f3a17:    /* extractps */
+       case 0x660f7f:      /* movdqa */
+       case 0xf30f7f:      /* movdqu */
+         if (i386_record_modrm (&ir))
            return -1;
-          if (ir.mod == 3)
-            {
-              if (opcode == 0x0f13 || opcode == 0x660f13
-                  || opcode == 0x0f17 || opcode == 0x660f17)
-                goto no_support;
-              ir.rm |= ir.rex_b;
-              if (!i386_xmm_regnum_p (gdbarch,
+         if (ir.mod == 3)
+           {
+             if (opcode == 0x0f13 || opcode == 0x660f13
+                 || opcode == 0x0f17 || opcode == 0x660f17)
+               goto no_support;
+             ir.rm |= ir.rex_b;
+             if (!i386_xmm_regnum_p (gdbarch,
                                      I387_XMM0_REGNUM (tdep) + ir.rm))
-                goto no_support;
-              record_full_arch_list_add_reg (ir.regcache,
+               goto no_support;
+             record_full_arch_list_add_reg (ir.regcache,
                                             I387_XMM0_REGNUM (tdep) + ir.rm);
-            }
-          else
-            {
-              switch (opcode)
-                {
-                  case 0x660f3a14:
-                    ir.ot = OT_BYTE;
-                    break;
-                  case 0x660f3a15:
-                    ir.ot = OT_WORD;
-                    break;
-                  case 0x660f3a16:
-                    ir.ot = OT_LONG;
-                    break;
-                  case 0x660f3a17:
-                    ir.ot = OT_QUAD;
-                    break;
-                  default:
-                    ir.ot = OT_DQUAD;
-                    break;
-                }
-              if (i386_record_lea_modrm (&ir))
-                return -1;
-            }
-          break;
-
-        case 0x0f2b:      /* movntps */
-        case 0x660f2b:    /* movntpd */
-        case 0x0fe7:      /* movntq */
-        case 0x660fe7:    /* movntdq */
-          if (ir.mod == 3)
-            goto no_support;
-          if (opcode == 0x0fe7)
-            ir.ot = OT_QUAD;
-          else
-            ir.ot = OT_DQUAD;
-          if (i386_record_lea_modrm (&ir))
-            return -1;
-          break;
-
-        case 0xf30f2c:      /* cvttss2si */
-        case 0xf20f2c:      /* cvttsd2si */
-        case 0xf30f2d:      /* cvtss2si */
-        case 0xf20f2d:      /* cvtsd2si */
-        case 0xf20f38f0:    /* crc32 */
-        case 0xf20f38f1:    /* crc32 */
-        case 0x0f50:        /* movmskps */
-        case 0x660f50:      /* movmskpd */
-        case 0x0fc5:        /* pextrw */
-        case 0x660fc5:      /* pextrw */
-        case 0x0fd7:        /* pmovmskb */
-        case 0x660fd7:      /* pmovmskb */
-          I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg | rex_r);
-          break;
-
-        case 0x0f3800:    /* pshufb */
-        case 0x0f3801:    /* phaddw */
-        case 0x0f3802:    /* phaddd */
-        case 0x0f3803:    /* phaddsw */
-        case 0x0f3804:    /* pmaddubsw */
-        case 0x0f3805:    /* phsubw */
-        case 0x0f3806:    /* phsubd */
-        case 0x0f3807:    /* phsubsw */
-        case 0x0f3808:    /* psignb */
-        case 0x0f3809:    /* psignw */
-        case 0x0f380a:    /* psignd */
-        case 0x0f380b:    /* pmulhrsw */
-        case 0x0f381c:    /* pabsb */
-        case 0x0f381d:    /* pabsw */
-        case 0x0f381e:    /* pabsd */
-        case 0x0f382b:    /* packusdw */
-        case 0x0f3830:    /* pmovzxbw */
-        case 0x0f3831:    /* pmovzxbd */
-        case 0x0f3832:    /* pmovzxbq */
-        case 0x0f3833:    /* pmovzxwd */
-        case 0x0f3834:    /* pmovzxwq */
-        case 0x0f3835:    /* pmovzxdq */
-        case 0x0f3837:    /* pcmpgtq */
-        case 0x0f3838:    /* pminsb */
-        case 0x0f3839:    /* pminsd */
-        case 0x0f383a:    /* pminuw */
-        case 0x0f383b:    /* pminud */
-        case 0x0f383c:    /* pmaxsb */
-        case 0x0f383d:    /* pmaxsd */
-        case 0x0f383e:    /* pmaxuw */
-        case 0x0f383f:    /* pmaxud */
-        case 0x0f3840:    /* pmulld */
-        case 0x0f3841:    /* phminposuw */
-        case 0x0f3a0f:    /* palignr */
-        case 0x0f60:      /* punpcklbw */
-        case 0x0f61:      /* punpcklwd */
-        case 0x0f62:      /* punpckldq */
-        case 0x0f63:      /* packsswb */
-        case 0x0f64:      /* pcmpgtb */
-        case 0x0f65:      /* pcmpgtw */
-        case 0x0f66:      /* pcmpgtd */
-        case 0x0f67:      /* packuswb */
-        case 0x0f68:      /* punpckhbw */
-        case 0x0f69:      /* punpckhwd */
-        case 0x0f6a:      /* punpckhdq */
-        case 0x0f6b:      /* packssdw */
-        case 0x0f6e:      /* movd */
-        case 0x0f6f:      /* movq */
-        case 0x0f70:      /* pshufw */
-        case 0x0f74:      /* pcmpeqb */
-        case 0x0f75:      /* pcmpeqw */
-        case 0x0f76:      /* pcmpeqd */
-        case 0x0fc4:      /* pinsrw */
-        case 0x0fd1:      /* psrlw */
-        case 0x0fd2:      /* psrld */
-        case 0x0fd3:      /* psrlq */
-        case 0x0fd4:      /* paddq */
-        case 0x0fd5:      /* pmullw */
-        case 0xf20fd6:    /* movdq2q */
-        case 0x0fd8:      /* psubusb */
-        case 0x0fd9:      /* psubusw */
-        case 0x0fda:      /* pminub */
-        case 0x0fdb:      /* pand */
-        case 0x0fdc:      /* paddusb */
-        case 0x0fdd:      /* paddusw */
-        case 0x0fde:      /* pmaxub */
-        case 0x0fdf:      /* pandn */
-        case 0x0fe0:      /* pavgb */
-        case 0x0fe1:      /* psraw */
-        case 0x0fe2:      /* psrad */
-        case 0x0fe3:      /* pavgw */
-        case 0x0fe4:      /* pmulhuw */
-        case 0x0fe5:      /* pmulhw */
-        case 0x0fe8:      /* psubsb */
-        case 0x0fe9:      /* psubsw */
-        case 0x0fea:      /* pminsw */
-        case 0x0feb:      /* por */
-        case 0x0fec:      /* paddsb */
-        case 0x0fed:      /* paddsw */
-        case 0x0fee:      /* pmaxsw */
-        case 0x0fef:      /* pxor */
-        case 0x0ff1:      /* psllw */
-        case 0x0ff2:      /* pslld */
-        case 0x0ff3:      /* psllq */
-        case 0x0ff4:      /* pmuludq */
-        case 0x0ff5:      /* pmaddwd */
-        case 0x0ff6:      /* psadbw */
-        case 0x0ff8:      /* psubb */
-        case 0x0ff9:      /* psubw */
-        case 0x0ffa:      /* psubd */
-        case 0x0ffb:      /* psubq */
-        case 0x0ffc:      /* paddb */
-        case 0x0ffd:      /* paddw */
-        case 0x0ffe:      /* paddd */
-          if (i386_record_modrm (&ir))
+           }
+         else
+           {
+             switch (opcode)
+               {
+                 case 0x660f3a14:
+                   ir.ot = OT_BYTE;
+                   break;
+                 case 0x660f3a15:
+                   ir.ot = OT_WORD;
+                   break;
+                 case 0x660f3a16:
+                   ir.ot = OT_LONG;
+                   break;
+                 case 0x660f3a17:
+                   ir.ot = OT_QUAD;
+                   break;
+                 default:
+                   ir.ot = OT_DQUAD;
+                   break;
+               }
+             if (i386_record_lea_modrm (&ir))
+               return -1;
+           }
+         break;
+
+       case 0x0f2b:      /* movntps */
+       case 0x660f2b:    /* movntpd */
+       case 0x0fe7:      /* movntq */
+       case 0x660fe7:    /* movntdq */
+         if (ir.mod == 3)
+           goto no_support;
+         if (opcode == 0x0fe7)
+           ir.ot = OT_QUAD;
+         else
+           ir.ot = OT_DQUAD;
+         if (i386_record_lea_modrm (&ir))
            return -1;
-          if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.reg))
-            goto no_support;
-          record_full_arch_list_add_reg (ir.regcache,
+         break;
+
+       case 0xf30f2c:      /* cvttss2si */
+       case 0xf20f2c:      /* cvttsd2si */
+       case 0xf30f2d:      /* cvtss2si */
+       case 0xf20f2d:      /* cvtsd2si */
+       case 0xf20f38f0:    /* crc32 */
+       case 0xf20f38f1:    /* crc32 */
+       case 0x0f50:        /* movmskps */
+       case 0x660f50:      /* movmskpd */
+       case 0x0fc5:        /* pextrw */
+       case 0x660fc5:      /* pextrw */
+       case 0x0fd7:        /* pmovmskb */
+       case 0x660fd7:      /* pmovmskb */
+         I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg | rex_r);
+         break;
+
+       case 0x0f3800:    /* pshufb */
+       case 0x0f3801:    /* phaddw */
+       case 0x0f3802:    /* phaddd */
+       case 0x0f3803:    /* phaddsw */
+       case 0x0f3804:    /* pmaddubsw */
+       case 0x0f3805:    /* phsubw */
+       case 0x0f3806:    /* phsubd */
+       case 0x0f3807:    /* phsubsw */
+       case 0x0f3808:    /* psignb */
+       case 0x0f3809:    /* psignw */
+       case 0x0f380a:    /* psignd */
+       case 0x0f380b:    /* pmulhrsw */
+       case 0x0f381c:    /* pabsb */
+       case 0x0f381d:    /* pabsw */
+       case 0x0f381e:    /* pabsd */
+       case 0x0f382b:    /* packusdw */
+       case 0x0f3830:    /* pmovzxbw */
+       case 0x0f3831:    /* pmovzxbd */
+       case 0x0f3832:    /* pmovzxbq */
+       case 0x0f3833:    /* pmovzxwd */
+       case 0x0f3834:    /* pmovzxwq */
+       case 0x0f3835:    /* pmovzxdq */
+       case 0x0f3837:    /* pcmpgtq */
+       case 0x0f3838:    /* pminsb */
+       case 0x0f3839:    /* pminsd */
+       case 0x0f383a:    /* pminuw */
+       case 0x0f383b:    /* pminud */
+       case 0x0f383c:    /* pmaxsb */
+       case 0x0f383d:    /* pmaxsd */
+       case 0x0f383e:    /* pmaxuw */
+       case 0x0f383f:    /* pmaxud */
+       case 0x0f3840:    /* pmulld */
+       case 0x0f3841:    /* phminposuw */
+       case 0x0f3a0f:    /* palignr */
+       case 0x0f60:      /* punpcklbw */
+       case 0x0f61:      /* punpcklwd */
+       case 0x0f62:      /* punpckldq */
+       case 0x0f63:      /* packsswb */
+       case 0x0f64:      /* pcmpgtb */
+       case 0x0f65:      /* pcmpgtw */
+       case 0x0f66:      /* pcmpgtd */
+       case 0x0f67:      /* packuswb */
+       case 0x0f68:      /* punpckhbw */
+       case 0x0f69:      /* punpckhwd */
+       case 0x0f6a:      /* punpckhdq */
+       case 0x0f6b:      /* packssdw */
+       case 0x0f6e:      /* movd */
+       case 0x0f6f:      /* movq */
+       case 0x0f70:      /* pshufw */
+       case 0x0f74:      /* pcmpeqb */
+       case 0x0f75:      /* pcmpeqw */
+       case 0x0f76:      /* pcmpeqd */
+       case 0x0fc4:      /* pinsrw */
+       case 0x0fd1:      /* psrlw */
+       case 0x0fd2:      /* psrld */
+       case 0x0fd3:      /* psrlq */
+       case 0x0fd4:      /* paddq */
+       case 0x0fd5:      /* pmullw */
+       case 0xf20fd6:    /* movdq2q */
+       case 0x0fd8:      /* psubusb */
+       case 0x0fd9:      /* psubusw */
+       case 0x0fda:      /* pminub */
+       case 0x0fdb:      /* pand */
+       case 0x0fdc:      /* paddusb */
+       case 0x0fdd:      /* paddusw */
+       case 0x0fde:      /* pmaxub */
+       case 0x0fdf:      /* pandn */
+       case 0x0fe0:      /* pavgb */
+       case 0x0fe1:      /* psraw */
+       case 0x0fe2:      /* psrad */
+       case 0x0fe3:      /* pavgw */
+       case 0x0fe4:      /* pmulhuw */
+       case 0x0fe5:      /* pmulhw */
+       case 0x0fe8:      /* psubsb */
+       case 0x0fe9:      /* psubsw */
+       case 0x0fea:      /* pminsw */
+       case 0x0feb:      /* por */
+       case 0x0fec:      /* paddsb */
+       case 0x0fed:      /* paddsw */
+       case 0x0fee:      /* pmaxsw */
+       case 0x0fef:      /* pxor */
+       case 0x0ff1:      /* psllw */
+       case 0x0ff2:      /* pslld */
+       case 0x0ff3:      /* psllq */
+       case 0x0ff4:      /* pmuludq */
+       case 0x0ff5:      /* pmaddwd */
+       case 0x0ff6:      /* psadbw */
+       case 0x0ff8:      /* psubb */
+       case 0x0ff9:      /* psubw */
+       case 0x0ffa:      /* psubd */
+       case 0x0ffb:      /* psubq */
+       case 0x0ffc:      /* paddb */
+       case 0x0ffd:      /* paddw */
+       case 0x0ffe:      /* paddd */
+         if (i386_record_modrm (&ir))
+           return -1;
+         if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.reg))
+           goto no_support;
+         record_full_arch_list_add_reg (ir.regcache,
                                         I387_MM0_REGNUM (tdep) + ir.reg);
-          break;
+         break;
 
-        case 0x0f71:    /* psllw */
-        case 0x0f72:    /* pslld */
-        case 0x0f73:    /* psllq */
-          if (i386_record_modrm (&ir))
+       case 0x0f71:    /* psllw */
+       case 0x0f72:    /* pslld */
+       case 0x0f73:    /* psllq */
+         if (i386_record_modrm (&ir))
            return -1;
-          if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.rm))
-            goto no_support;
-          record_full_arch_list_add_reg (ir.regcache,
+         if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.rm))
+           goto no_support;
+         record_full_arch_list_add_reg (ir.regcache,
                                         I387_MM0_REGNUM (tdep) + ir.rm);
-          break;
+         break;
 
-        case 0x660f71:    /* psllw */
-        case 0x660f72:    /* pslld */
-        case 0x660f73:    /* psllq */
-          if (i386_record_modrm (&ir))
+       case 0x660f71:    /* psllw */
+       case 0x660f72:    /* pslld */
+       case 0x660f73:    /* psllq */
+         if (i386_record_modrm (&ir))
            return -1;
-          ir.rm |= ir.rex_b;
-          if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.rm))
-            goto no_support;
-          record_full_arch_list_add_reg (ir.regcache,
+         ir.rm |= ir.rex_b;
+         if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.rm))
+           goto no_support;
+         record_full_arch_list_add_reg (ir.regcache,
                                         I387_XMM0_REGNUM (tdep) + ir.rm);
-          break;
+         break;
 
-        case 0x0f7e:      /* movd */
-        case 0x660f7e:    /* movd */
-          if (i386_record_modrm (&ir))
+       case 0x0f7e:      /* movd */
+       case 0x660f7e:    /* movd */
+         if (i386_record_modrm (&ir))
            return -1;
-          if (ir.mod == 3)
-            I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
-          else
-            {
-              if (ir.dflag == 2)
-                ir.ot = OT_QUAD;
-              else
-                ir.ot = OT_LONG;
-              if (i386_record_lea_modrm (&ir))
-                return -1;
-            }
-          break;
-
-        case 0x0f7f:    /* movq */
-          if (i386_record_modrm (&ir))
+         if (ir.mod == 3)
+           I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
+         else
+           {
+             if (ir.dflag == 2)
+               ir.ot = OT_QUAD;
+             else
+               ir.ot = OT_LONG;
+             if (i386_record_lea_modrm (&ir))
+               return -1;
+           }
+         break;
+
+       case 0x0f7f:    /* movq */
+         if (i386_record_modrm (&ir))
            return -1;
-          if (ir.mod == 3)
-            {
-              if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.rm))
-                goto no_support;
-              record_full_arch_list_add_reg (ir.regcache,
+         if (ir.mod == 3)
+           {
+             if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.rm))
+               goto no_support;
+             record_full_arch_list_add_reg (ir.regcache,
                                             I387_MM0_REGNUM (tdep) + ir.rm);
-            }
-          else
-            {
-              ir.ot = OT_QUAD;
-              if (i386_record_lea_modrm (&ir))
-                return -1;
-            }
-          break;
-
-        case 0xf30fb8:    /* popcnt */
-          if (i386_record_modrm (&ir))
+           }
+         else
+           {
+             ir.ot = OT_QUAD;
+             if (i386_record_lea_modrm (&ir))
+               return -1;
+           }
+         break;
+
+       case 0xf30fb8:    /* popcnt */
+         if (i386_record_modrm (&ir))
            return -1;
-          I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
-          I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
-          break;
+         I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
+         I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
+         break;
 
-        case 0x660fd6:    /* movq */
-          if (i386_record_modrm (&ir))
+       case 0x660fd6:    /* movq */
+         if (i386_record_modrm (&ir))
            return -1;
-          if (ir.mod == 3)
-            {
-              ir.rm |= ir.rex_b;
-              if (!i386_xmm_regnum_p (gdbarch,
+         if (ir.mod == 3)
+           {
+             ir.rm |= ir.rex_b;
+             if (!i386_xmm_regnum_p (gdbarch,
                                      I387_XMM0_REGNUM (tdep) + ir.rm))
-                goto no_support;
-              record_full_arch_list_add_reg (ir.regcache,
+               goto no_support;
+             record_full_arch_list_add_reg (ir.regcache,
                                             I387_XMM0_REGNUM (tdep) + ir.rm);
-            }
-          else
-            {
-              ir.ot = OT_QUAD;
-              if (i386_record_lea_modrm (&ir))
-                return -1;
-            }
-          break;
-
-        case 0x660f3817:    /* ptest */
-        case 0x0f2e:        /* ucomiss */
-        case 0x660f2e:      /* ucomisd */
-        case 0x0f2f:        /* comiss */
-        case 0x660f2f:      /* comisd */
-          I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
-          break;
-
-        case 0x0ff7:    /* maskmovq */
-          regcache_raw_read_unsigned (ir.regcache,
-                                      ir.regmap[X86_RECORD_REDI_REGNUM],
-                                      &addr);
-          if (record_full_arch_list_add_mem (addr, 64))
-            return -1;
-          break;
-
-        case 0x660ff7:    /* maskmovdqu */
-          regcache_raw_read_unsigned (ir.regcache,
-                                      ir.regmap[X86_RECORD_REDI_REGNUM],
-                                      &addr);
-          if (record_full_arch_list_add_mem (addr, 128))
-            return -1;
-          break;
-
-        default:
-          goto no_support;
-          break;
-        }
+           }
+         else
+           {
+             ir.ot = OT_QUAD;
+             if (i386_record_lea_modrm (&ir))
+               return -1;
+           }
+         break;
+
+       case 0x660f3817:    /* ptest */
+       case 0x0f2e:        /* ucomiss */
+       case 0x660f2e:      /* ucomisd */
+       case 0x0f2f:        /* comiss */
+       case 0x660f2f:      /* comisd */
+         I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
+         break;
+
+       case 0x0ff7:    /* maskmovq */
+         regcache_raw_read_unsigned (ir.regcache,
+                                     ir.regmap[X86_RECORD_REDI_REGNUM],
+                                     &addr);
+         if (record_full_arch_list_add_mem (addr, 64))
+           return -1;
+         break;
+
+       case 0x660ff7:    /* maskmovdqu */
+         regcache_raw_read_unsigned (ir.regcache,
+                                     ir.regmap[X86_RECORD_REDI_REGNUM],
+                                     &addr);
+         if (record_full_arch_list_add_mem (addr, 128))
+           return -1;
+         break;
+
+       default:
+         goto no_support;
+         break;
+       }
       break;
 
     default:
@@ -8094,9 +8079,9 @@ reswitch_prefix_add:
 
  no_support:
   printf_unfiltered (_("Process record does not support instruction 0x%02x "
-                       "at address %s.\n"),
-                     (unsigned int) (opcode),
-                     paddress (gdbarch, ir.orig_addr));
+                      "at address %s.\n"),
+                    (unsigned int) (opcode),
+                    paddress (gdbarch, ir.orig_addr));
   return -1;
 }
 
@@ -8121,7 +8106,7 @@ static const int i386_record_regmap[] =
 
 static int
 i386_fast_tracepoint_valid_at (struct gdbarch *gdbarch, CORE_ADDR addr,
-                              char **msg)
+                              std::string *msg)
 {
   int len, jumplen;
 
@@ -8154,15 +8139,15 @@ i386_fast_tracepoint_valid_at (struct gdbarch *gdbarch, CORE_ADDR addr,
       /* Return a bit of target-specific detail to add to the caller's
         generic failure message.  */
       if (msg)
-       *msg = xstrprintf (_("; instruction is only %d bytes long, "
-                            "need at least %d bytes for the jump"),
-                          len, jumplen);
+       *msg = string_printf (_("; instruction is only %d bytes long, "
+                               "need at least %d bytes for the jump"),
+                             len, jumplen);
       return 0;
     }
   else
     {
       if (msg)
-       *msg = NULL;
+       msg->clear ();
       return 1;
     }
 }
@@ -8171,14 +8156,21 @@ i386_fast_tracepoint_valid_at (struct gdbarch *gdbarch, CORE_ADDR addr,
    length LEN in bits.  If non-NULL, NAME is the name of its type.
    If no suitable type is found, return NULL.  */
 
-const struct floatformat **
+static const struct floatformat **
 i386_floatformat_for_type (struct gdbarch *gdbarch,
                           const char *name, int len)
 {
   if (len == 128 && name)
     if (strcmp (name, "__float128") == 0
        || strcmp (name, "_Float128") == 0
-       || strcmp (name, "complex _Float128") == 0)
+       || strcmp (name, "complex _Float128") == 0
+       || strcmp (name, "complex(kind=16)") == 0
+       || strcmp (name, "complex*32") == 0
+       || strcmp (name, "COMPLEX*32") == 0
+       || strcmp (name, "quad complex") == 0
+       || strcmp (name, "real(kind=16)") == 0
+       || strcmp (name, "real*16") == 0
+       || strcmp (name, "REAL*16") == 0)
       return floatformats_ia64_quad;
 
   return default_floatformat_for_type (gdbarch, name, len);
@@ -8192,7 +8184,7 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
   const struct tdesc_feature *feature_core;
 
   const struct tdesc_feature *feature_sse, *feature_avx, *feature_mpx,
-                            *feature_avx512, *feature_pkeys;
+                            *feature_avx512, *feature_pkeys, *feature_segments;
   int i, num_regs, valid_p;
 
   if (! tdesc_has_registers (tdesc))
@@ -8215,6 +8207,9 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
   /* Try AVX512 registers.  */
   feature_avx512 = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.avx512");
 
+  /* Try segment base registers.  */
+  feature_segments = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.segments");
+
   /* Try PKEYS  */
   feature_pkeys = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.pkeys");
 
@@ -8324,6 +8319,16 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
            tdep->mpx_register_names[i]);
     }
 
+  if (feature_segments)
+    {
+      if (tdep->fsbase_regnum < 0)
+       tdep->fsbase_regnum = I386_FSBASE_REGNUM;
+      valid_p &= tdesc_numbered_register (feature_segments, tdesc_data,
+                                         tdep->fsbase_regnum, "fs_base");
+      valid_p &= tdesc_numbered_register (feature_segments, tdesc_data,
+                                         tdep->fsbase_regnum + 1, "gs_base");
+    }
+
   if (feature_pkeys)
     {
       tdep->xcr0 |= X86_XSTATE_PKRU;
@@ -8343,6 +8348,31 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
   return valid_p;
 }
 
+\f
+
+/* Implement the type_align gdbarch function.  */
+
+static ULONGEST
+i386_type_align (struct gdbarch *gdbarch, struct type *type)
+{
+  type = check_typedef (type);
+
+  if (gdbarch_ptr_bit (gdbarch) == 32)
+    {
+      if ((type->code () == TYPE_CODE_INT
+          || type->code () == TYPE_CODE_FLT)
+         && TYPE_LENGTH (type) > 4)
+       return 4;
+
+      /* Handle x86's funny long double.  */
+      if (type->code () == TYPE_CODE_FLT
+         && gdbarch_long_double_bit (gdbarch) == TYPE_LENGTH (type) * 8)
+       return 4;
+    }
+
+  return 0;
+}
+
 \f
 /* Note: This is called for both i386 and amd64.  */
 
@@ -8351,7 +8381,6 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch_tdep *tdep;
   struct gdbarch *gdbarch;
-  struct tdesc_arch_data *tdesc_data;
   const struct target_desc *tdesc;
   int mm0_regnum;
   int ymm0_regnum;
@@ -8401,7 +8430,7 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   tdep->record_regmap = i386_record_regmap;
 
-  set_gdbarch_long_long_align_bit (gdbarch, 32);
+  set_gdbarch_type_align (gdbarch, i386_type_align);
 
   /* The format used for `long double' on almost all i386 targets is
      the i387 extended floating-point format.  In fact, of all targets
@@ -8414,6 +8443,9 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
      alignment.  */
   set_gdbarch_long_double_bit (gdbarch, 96);
 
+  /* Support of bfloat16 format.  */
+  set_gdbarch_bfloat16_format (gdbarch, floatformats_bfloat16);
+
   /* Support for floating-point data type variants.  */
   set_gdbarch_floatformat_for_type (gdbarch, i386_floatformat_for_type);
 
@@ -8535,14 +8567,14 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* Even though the default ABI only includes general-purpose registers,
      floating-point registers and the SSE registers, we have to leave a
      gap for the upper AVX, MPX and AVX512 registers.  */
-  set_gdbarch_num_regs (gdbarch, I386_PKEYS_NUM_REGS);
+  set_gdbarch_num_regs (gdbarch, I386_NUM_REGS);
 
   set_gdbarch_gnu_triplet_regexp (gdbarch, i386_gnu_triplet_regexp);
 
   /* Get the x86 target description from INFO.  */
   tdesc = info.target_desc;
   if (! tdesc_has_registers (tdesc))
-    tdesc = i386_target_description (X86_XSTATE_SSE_MASK);
+    tdesc = i386_target_description (X86_XSTATE_SSE_MASK, false);
   tdep->tdesc = tdesc;
 
   tdep->num_core_regs = I386_NUM_GREGS + I387_NUM_REGS;
@@ -8584,7 +8616,10 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   tdep->pkru_regnum = -1;
   tdep->num_pkeys_regs = 0;
 
-  tdesc_data = tdesc_data_alloc ();
+  /* No segment base registers.  */
+  tdep->fsbase_regnum = -1;
+
+  tdesc_arch_data_up tdesc_data = tdesc_data_alloc ();
 
   set_gdbarch_relocate_instruction (gdbarch, i386_relocate_instruction);
 
@@ -8597,12 +8632,11 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* Hook in ABI-specific overrides, if they have been registered.
      Note: If INFO specifies a 64 bit arch, this is where we turn
      a 32-bit i386 into a 64-bit amd64.  */
-  info.tdesc_data = tdesc_data;
+  info.tdesc_data = tdesc_data.get ();
   gdbarch_init_osabi (info, gdbarch);
 
-  if (!i386_validate_tdesc_p (tdep, tdesc_data))
+  if (!i386_validate_tdesc_p (tdep, tdesc_data.get ()))
     {
-      tdesc_data_cleanup (tdesc_data);
       xfree (tdep);
       gdbarch_free (gdbarch);
       return NULL;
@@ -8624,7 +8658,7 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* Target description may be changed.  */
   tdesc = tdep->tdesc;
 
-  tdesc_use_registers (gdbarch, tdesc, tdesc_data);
+  tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
 
   /* Override gdbarch_register_reggroup_p set in tdesc_use_registers.  */
   set_gdbarch_register_reggroup_p (gdbarch, tdep->register_reggroup_p);
@@ -8709,20 +8743,21 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 /* Return the target description for a specified XSAVE feature mask.  */
 
 const struct target_desc *
-i386_target_description (uint64_t xcr0)
+i386_target_description (uint64_t xcr0, bool segments)
 {
   static target_desc *i386_tdescs \
-    [2/*SSE*/][2/*AVX*/][2/*MPX*/][2/*AVX512*/][2/*PKRU*/] = {};
+    [2/*SSE*/][2/*AVX*/][2/*MPX*/][2/*AVX512*/][2/*PKRU*/][2/*segments*/] = {};
   target_desc **tdesc;
 
   tdesc = &i386_tdescs[(xcr0 & X86_XSTATE_SSE) ? 1 : 0]
     [(xcr0 & X86_XSTATE_AVX) ? 1 : 0]
     [(xcr0 & X86_XSTATE_MPX) ? 1 : 0]
     [(xcr0 & X86_XSTATE_AVX512) ? 1 : 0]
-    [(xcr0 & X86_XSTATE_PKRU) ? 1 : 0];
+    [(xcr0 & X86_XSTATE_PKRU) ? 1 : 0]
+    [segments ? 1 : 0];
 
   if (*tdesc == NULL)
-    *tdesc = i386_create_target_description (xcr0, false);
+    *tdesc = i386_create_target_description (xcr0, false, segments);
 
   return *tdesc;
 }
@@ -8740,7 +8775,7 @@ i386_mpx_bd_base (void)
   enum register_status regstatus;
 
   rcache = get_current_regcache ();
-  tdep = gdbarch_tdep (get_regcache_arch (rcache));
+  tdep = gdbarch_tdep (rcache->arch ());
 
   regstatus = regcache_raw_read_unsigned (rcache, tdep->bndcfgu_regnum, &ret);
 
@@ -8861,7 +8896,7 @@ i386_mpx_print_bounds (const CORE_ADDR bt_entry[4])
 
       size = (size > -1 ? size + 1 : size);
       uiout->text (", size = ");
-      uiout->field_fmt ("size", "%s", plongest (size));
+      uiout->field_string ("size", plongest (size));
 
       uiout->text (", metadata = ");
       uiout->field_core_addr ("metadata", gdbarch, bt_entry[3]);
@@ -8966,24 +9001,9 @@ i386_mpx_set_bounds (const char *args, int from_tty)
 
 static struct cmd_list_element *mpx_set_cmdlist, *mpx_show_cmdlist;
 
-/* Helper function for the CLI commands.  */
-
-static void
-set_mpx_cmd (const char *args, int from_tty)
-{
-  help_list (mpx_set_cmdlist, "set mpx ", all_commands, gdb_stdout);
-}
-
-/* Helper function for the CLI commands.  */
-
-static void
-show_mpx_cmd (const char *args, int from_tty)
-{
-  cmd_show_list (mpx_show_cmdlist, from_tty, "");
-}
-
+void _initialize_i386_tdep ();
 void
-_initialize_i386_tdep (void)
+_initialize_i386_tdep ()
 {
   register_gdbarch_init (bfd_arch_i386, i386_gdbarch_init);
 
@@ -9011,17 +9031,17 @@ is \"default\"."),
 
   /* Add "mpx" prefix for the set commands.  */
 
-  add_prefix_cmd ("mpx", class_support, set_mpx_cmd, _("\
+  add_basic_prefix_cmd ("mpx", class_support, _("\
 Set Intel Memory Protection Extensions specific variables."),
-                 &mpx_set_cmdlist, "set mpx ",
-                 0 /* allow-unknown */, &setlist);
+                       &mpx_set_cmdlist,
+                       0 /* allow-unknown */, &setlist);
 
   /* Add "mpx" prefix for the show commands.  */
 
-  add_prefix_cmd ("mpx", class_support, show_mpx_cmd, _("\
+  add_show_prefix_cmd ("mpx", class_support, _("\
 Show Intel Memory Protection Extensions specific variables."),
-                 &mpx_show_cmdlist, "show mpx ",
-                 0 /* allow-unknown */, &showlist);
+                      &mpx_show_cmdlist,
+                      0 /* allow-unknown */, &showlist);
 
   /* Add "bound" command for the show mpx commands list.  */
 
@@ -9045,28 +9065,4 @@ Show Intel Memory Protection Extensions specific variables."),
 
   /* Tell remote stub that we support XML target description.  */
   register_remote_support_xml ("i386");
-
-#if GDB_SELF_TEST
-  struct
-  {
-    const char *xml;
-    uint64_t mask;
-  } xml_masks[] = {
-    { "i386/i386.xml", X86_XSTATE_SSE_MASK },
-    { "i386/i386-mmx.xml", X86_XSTATE_X87_MASK },
-    { "i386/i386-avx.xml", X86_XSTATE_AVX_MASK },
-    { "i386/i386-mpx.xml", X86_XSTATE_MPX_MASK },
-    { "i386/i386-avx-mpx.xml", X86_XSTATE_AVX_MPX_MASK },
-    { "i386/i386-avx-avx512.xml", X86_XSTATE_AVX_AVX512_MASK },
-    { "i386/i386-avx-mpx-avx512-pku.xml",
-      X86_XSTATE_AVX_MPX_AVX512_PKU_MASK },
-  };
-
-  for (auto &a : xml_masks)
-    {
-      auto tdesc = i386_target_description (a.mask);
-
-      selftests::record_xml_tdesc (a.xml, tdesc);
-    }
-#endif /* GDB_SELF_TEST */
 }
This page took 0.111762 seconds and 4 git commands to generate.