[RFA] Prec x86 MMX 3DNow! SSE SSE2 SSE3 SSSE3 SSE4 support

Michael Snyder msnyder@vmware.com
Mon Dec 7 16:54:00 GMT 2009


Hui Zhu wrote:
> Hi guys,
> 
> This patch make prec support x86 MMX 3DNow! SSE SSE2 SSE3 SSSE3 SSE4.
> Please help me review it.

Hui, do you think we are ready to commit the 387 patch before this one?


> 2009-12-07  Hui Zhu  <teawater@gmail.com>
> 
>         * i386-tdep.c (OT_DQUAD): New enum.
>         (i386_process_record): Add code for MMX, 3DNow!, SSE, SSE2,
>         SSE3, SSSE3 and SSE4.
> 
> ---
>  i386-tdep.c | 1217 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 1201 insertions(+), 16 deletions(-)
> 
> --- a/i386-tdep.c
> +++ b/i386-tdep.c
> @@ -2848,6 +2848,7 @@ enum
>    OT_WORD,
>    OT_LONG,
>    OT_QUAD,
> +  OT_DQUAD,
>  };
> 
>  /* i386 arith/logic operations */
> @@ -3217,6 +3218,7 @@ i386_process_record (struct gdbarch *gdb
>    int rex = 0;
>    uint8_t rex_w = -1;
>    uint8_t rex_r = 0;
> +  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> 
>    memset (&ir, 0, sizeof (struct i386_record_s));
>    ir.regcache = regcache;
> @@ -3226,7 +3228,7 @@ i386_process_record (struct gdbarch *gdb
>    ir.dflag = 1;
>    ir.override = -1;
>    ir.popl_esp_hack = 0;
> -  ir.regmap = gdbarch_tdep (gdbarch)->record_regmap;
> +  ir.regmap = tdep->record_regmap;
>    ir.gdbarch = gdbarch;
> 
>    if (record_debug > 1)
> @@ -3344,7 +3346,7 @@ reswitch:
>           return -1;
>         }
>        ir.addr++;
> -      opcode = (uint16_t) tmpu8 | 0x0f00;
> +      opcode = (uint32_t) tmpu8 | 0x0f00;
>        goto reswitch;
>        break;
> 
> @@ -4868,7 +4870,7 @@ reswitch:
>           }
>         ir.addr++;
>         if (tmpu8 != 0x80
> -           || gdbarch_tdep (gdbarch)->i386_intx80_record == NULL)
> +           || tdep->i386_intx80_record == NULL)
>           {
>             printf_unfiltered (_("Process record doesn't support "
>                                  "instruction int 0x%02x.\n"),
> @@ -4876,7 +4878,7 @@ reswitch:
>             ir.addr -= 2;
>             goto no_support;
>           }
> -       ret = gdbarch_tdep (gdbarch)->i386_intx80_record (ir.regcache);
> +       ret = tdep->i386_intx80_record (ir.regcache);
>         if (ret)
>           return ret;
>        }
> @@ -4973,14 +4975,14 @@ reswitch:
>              ir.addr -= 2;
>              goto no_support;
>            }
> -       if (gdbarch_tdep (gdbarch)->i386_sysenter_record == NULL)
> +       if (tdep->i386_sysenter_record == NULL)
>           {
>             printf_unfiltered (_("Process record doesn't support "
>                                  "instruction sysenter.\n"));
>             ir.addr -= 2;
>             goto no_support;
>           }
> -       ret = gdbarch_tdep (gdbarch)->i386_sysenter_record (ir.regcache);
> +       ret = tdep->i386_sysenter_record (ir.regcache);
>         if (ret)
>           return ret;
>        }
> @@ -4998,14 +5000,14 @@ reswitch:
>      case 0x0f05:
>        {
>         int ret;
> -       if (gdbarch_tdep (gdbarch)->i386_syscall_record == NULL)
> +       if (tdep->i386_syscall_record == NULL)
>           {
>             printf_unfiltered (_("Process record doesn't support "
>                                  "instruction syscall.\n"));
>             ir.addr -= 2;
>             goto no_support;
>           }
> -       ret = gdbarch_tdep (gdbarch)->i386_syscall_record (ir.regcache);
> +       ret = tdep->i386_syscall_record (ir.regcache);
>         if (ret)
>           return ret;
>        }
> @@ -5349,14 +5351,1196 @@ reswitch:
>        I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
>        break;
> 
> -      /* MMX/SSE/SSE2/PNI support */
> -      /* XXX */
> +    /* MMX 3DNow! SSE SSE2 SSE3 SSSE3 SSE4 */
> +    /* 3DNow! prefetch */
> +    case 0x0f0d:
> +      break;
> +
> +    /* 3DNow! femms */
> +    case 0x0f0e:
> +    /* emms */
> +    case 0x0f77:
> +      if (i386_fpc_regnum_p (gdbarch, I387_FTAG_REGNUM(tdep)))
> +        goto no_support;
> +      record_arch_list_add_reg (ir.regcache, I387_FTAG_REGNUM(tdep));
> +      break;
> +
> +    /* 3DNow! data */
> +    case 0x0f0f:
> +      if (i386_record_modrm (&ir))
> +       return -1;
> +      if (target_read_memory (ir.addr, &tmpu8, 1))
> +        {
> +          if (record_debug)
> +           printf_unfiltered (_("Process record: error reading memory at "
> +                                "addr %s len = 1.\n"),
> +                              paddress (gdbarch, ir.addr));
> +          return -1;
> +        }
> +      ir.addr++;
> +      switch (tmpu8)
> +        {
> +        /* 3DNow! pi2fw */
> +        case 0x0c:
> +        /* 3DNow! pi2fd */
> +        case 0x0d:
> +        /* 3DNow! pf2iw */
> +        case 0x1c:
> +        /* 3DNow! pf2id */
> +        case 0x1d:
> +        /* 3DNow! pfnacc */
> +        case 0x8a:
> +        /* 3DNow! pfpnacc */
> +        case 0x8e:
> +        /* 3DNow! pfcmpge */
> +        case 0x90:
> +        /* 3DNow! pfmin */
> +        case 0x94:
> +        /* 3DNow! pfrcp */
> +        case 0x96:
> +        /* 3DNow! pfrsqrt */
> +        case 0x97:
> +        /* 3DNow! pfsub */
> +        case 0x9a:
> +        /* 3DNow! pfadd */
> +        case 0x9e:
> +        /* 3DNow! pfcmpgt */
> +        case 0xa0:
> +        /* 3DNow! pfmax */
> +        case 0xa4:
> +        /* 3DNow! pfrcpit1 */
> +        case 0xa6:
> +        /* 3DNow! pfrsqit1 */
> +        case 0xa7:
> +        /* 3DNow! pfsubr */
> +        case 0xaa:
> +        /* 3DNow! pfacc */
> +        case 0xae:
> +        /* 3DNow! pfcmpeq */
> +        case 0xb0:
> +        /* 3DNow! pfmul */
> +        case 0xb4:
> +        /* 3DNow! pfrcpit2 */
> +        case 0xb6:
> +        /* 3DNow! pmulhrw */
> +        case 0xb7:
> +        /* 3DNow! pswapd */
> +        case 0xbb:
> +        /* 3DNow! pavgusb */
> +        case 0xbf:
> +          if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.reg))
> +            goto no_support_3dnow_data;
> +          record_arch_list_add_reg (ir.regcache, ir.reg);
> +          break;
> +
> +        default:
> +no_support_3dnow_data:
> +          opcode = (opcode << 8) | tmpu8;
> +          goto no_support;
> +          break;
> +        }
> +      break;
> +
> +    /* rsm */
> +    case 0x0faa:
> +      I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
> +      I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
> +      I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
> +      I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
> +      I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBX_REGNUM);
> +      I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
> +      I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
> +      I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
> +      I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
> +      break;
> +
> +    case 0x0fae:
> +      if (i386_record_modrm (&ir))
> +       return -1;
> +      switch(ir.reg)
> +        {
> +        /* fxsave */
> +        case 0:
> +          {
> +            uint64_t tmpu64;
> +
> +            I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
> +           if (i386_record_lea_modrm_addr (&ir, &tmpu64))
> +             return -1;
> +            if (record_arch_list_add_mem (tmpu64, 512))
> +              return -1;
> +          }
> +          break;
> +
> +        /* fxrstor */
> +        case 1:
> +          {
> +            int i;
> +
> +            I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
> +
> +            for (i = I387_MM0_REGNUM (tdep);
> +                 i386_mmx_regnum_p (gdbarch, i); i++)
> +              record_arch_list_add_reg (ir.regcache, i);
> +
> +            for (i = I387_XMM0_REGNUM (tdep);
> +                 i386_sse_regnum_p (gdbarch, i); i++)
> +              record_arch_list_add_reg (ir.regcache, i);
> +
> +            if (i386_mxcsr_regnum_p (gdbarch, I387_MXCSR_REGNUM(tdep)))
> +              record_arch_list_add_reg (ir.regcache, I387_MXCSR_REGNUM(tdep));
> +
> +            for (i = I387_ST0_REGNUM (tdep);
> +                 i386_fp_regnum_p (gdbarch, i); i++)
> +              record_arch_list_add_reg (ir.regcache, i);
> +
> +            for (i = I387_FCTRL_REGNUM (tdep);
> +                 i386_fpc_regnum_p (gdbarch, i); i++)
> +              record_arch_list_add_reg (ir.regcache, i);
> +          }
> +          break;
> +
> +        /* ldmxcsr */
> +        case 2:
> +          if (!i386_mxcsr_regnum_p (gdbarch, I387_MXCSR_REGNUM(tdep)))
> +            goto no_support;
> +          record_arch_list_add_reg (ir.regcache, I387_MXCSR_REGNUM(tdep));
> +          break;
> +
> +        /* stmxcsr */
> +        case 3:
> +          ir.ot = OT_LONG;
> +          if (i386_record_lea_modrm (&ir))
> +            return -1;
> +          break;
> +
> +        /* lfence */
> +        case 5:
> +        /* mfence */
> +        case 6:
> +        /* sfence clflush */
> +        case 7:
> +          break;
> +
> +        default:
> +          opcode = (opcode << 8) | ir.modrm;
> +          goto no_support;
> +          break;
> +        }
> +      break;
> +
> +    /* movnti */
> +    case 0x0fc3:
> +      ir.ot = (ir.dflag == 2) ? OT_QUAD : OT_LONG;
> +      if (i386_record_modrm (&ir))
> +       return -1;
> +      if (ir.mod == 3)
> +        goto no_support;
> +      ir.reg |= rex_r;
> +      if (i386_record_lea_modrm (&ir))
> +        return -1;
> +      break;
> +
> +    /* Add prefix to opcode.  */
> +    case 0x0f10:
> +    case 0x0f11:
> +    case 0x0f12:
> +    case 0x0f13:
> +    case 0x0f14:
> +    case 0x0f16:
> +    case 0x0f17:
> +    case 0x0f28:
> +    case 0x0f29:
> +    case 0x0f2a:
> +    case 0x0f2b:
> +    case 0x0f2c:
> +    case 0x0f2d:
> +    case 0x0f2e:
> +    case 0x0f2f:
> +    case 0x0f38:
> +    case 0x0f39:
> +    case 0x0f3a:
> +    case 0x0f50:
> +    case 0x0f51:
> +    case 0x0f52:
> +    case 0x0f53:
> +    case 0x0f54:
> +    case 0x0f55:
> +    case 0x0f56:
> +    case 0x0f57:
> +    case 0x0f58:
> +    case 0x0f59:
> +    case 0x0f5a:
> +    case 0x0f5b:
> +    case 0x0f5c:
> +    case 0x0f5d:
> +    case 0x0f5e:
> +    case 0x0f5f:
> +    case 0x0f60:
> +    case 0x0f61:
> +    case 0x0f62:
> +    case 0x0f63:
> +    case 0x0f64:
> +    case 0x0f65:
> +    case 0x0f66:
> +    case 0x0f67:
> +    case 0x0f68:
> +    case 0x0f69:
> +    case 0x0f6a:
> +    case 0x0f6b:
> +    case 0x0f6c:
> +    case 0x0f6d:
> +    case 0x0f6e:
> +    case 0x0f6f:
> +    case 0x0f70:
> +    case 0x0f71:
> +    case 0x0f72:
> +    case 0x0f73:
> +    case 0x0f74:
> +    case 0x0f75:
> +    case 0x0f76:
> +    case 0x0f7c:
> +    case 0x0f7d:
> +    case 0x0f7e:
> +    case 0x0f7f:
> +    case 0x0fb8:
> +    case 0x0fc2:
> +    case 0x0fc4:
> +    case 0x0fc5:
> +    case 0x0fc6:
> +    case 0x0fd0:
> +    case 0x0fd1:
> +    case 0x0fd2:
> +    case 0x0fd3:
> +    case 0x0fd4:
> +    case 0x0fd5:
> +    case 0x0fd6:
> +    case 0x0fd7:
> +    case 0x0fd8:
> +    case 0x0fd9:
> +    case 0x0fda:
> +    case 0x0fdb:
> +    case 0x0fdc:
> +    case 0x0fdd:
> +    case 0x0fde:
> +    case 0x0fdf:
> +    case 0x0fe0:
> +    case 0x0fe1:
> +    case 0x0fe2:
> +    case 0x0fe3:
> +    case 0x0fe4:
> +    case 0x0fe5:
> +    case 0x0fe6:
> +    case 0x0fe7:
> +    case 0x0fe8:
> +    case 0x0fe9:
> +    case 0x0fea:
> +    case 0x0feb:
> +    case 0x0fec:
> +    case 0x0fed:
> +    case 0x0fee:
> +    case 0x0fef:
> +    case 0x0ff0:
> +    case 0x0ff1:
> +    case 0x0ff2:
> +    case 0x0ff3:
> +    case 0x0ff4:
> +    case 0x0ff5:
> +    case 0x0ff6:
> +    case 0x0ff7:
> +    case 0x0ff8:
> +    case 0x0ff9:
> +    case 0x0ffa:
> +    case 0x0ffb:
> +    case 0x0ffc:
> +    case 0x0ffd:
> +    case 0x0ffe:
> +      switch (prefixes)
> +        {
> +        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 (target_read_memory (ir.addr, &tmpu8, 1))
> +            {
> +              if (record_debug)
> +               printf_unfiltered (_("Process record: error reading memory at "
> +                                    "addr %s len = 1.\n"),
> +                                  paddress (gdbarch, ir.addr));
> +                return -1;
> +            }
> +          ir.addr++;
> +          opcode = (uint32_t) tmpu8 | opcode << 4;
> +          goto reswitch_prefix_add;
> +          break;
> +
> +        /* movups */
> +        case 0x0f10:
> +        /* movupd */
> +        case 0x660f10:
> +        /* movss */
> +        case 0xf30f10:
> +        /* movsd */
> +        case 0xf20f10:
> +        /* movlps */
> +        case 0x0f12:
> +        /* movlpd */
> +        case 0x660f12:
> +        /* movsldup */
> +        case 0xf30f12:
> +        /* movddup */
> +        case 0xf20f12:
> +        /* unpcklps */
> +        case 0x0f14:
> +        /* unpcklpd */
> +        case 0x660f14:
> +        /* unpckhps */
> +        case 0x0f15:
> +        /* unpckhpd */
> +        case 0x660f15:
> +        /* movhps */
> +        case 0x0f16:
> +        /* movhpd */
> +        case 0x660f16:
> +        /* movshdup */
> +        case 0xf30f16:
> +        /* movaps */
> +        case 0x0f28:
> +        /* movapd */
> +        case 0x660f28:
> +        /* cvtpi2ps */
> +        case 0x0f2a:
> +        /* cvtpi2pd */
> +        case 0x660f2a:
> +        /* cvtsi2ss */
> +        case 0xf30f2a:
> +        /* cvtsi2sd */
> +        case 0xf20f2a:
> +        /* cvttps2pi */
> +        case 0x0f2c:
> +        /* cvttpd2pi */
> +        case 0x660f2c:
> +        /* cvtps2pi */
> +        case 0x0f2d:
> +        /* cvtpd2pi */
> +        case 0x660f2d:
> +        /* pshufb */
> +        case 0x660f3800:
> +        /* phaddw */
> +        case 0x660f3801:
> +        /* phaddd */
> +        case 0x660f3802:
> +        /* phaddsw */
> +        case 0x660f3803:
> +        /* pmaddubsw */
> +        case 0x660f3804:
> +        /* phsubw */
> +        case 0x660f3805:
> +        /* phsubd */
> +        case 0x660f3806:
> +        /* phaddsw */
> +        case 0x660f3807:
> +        /* psignb */
> +        case 0x660f3808:
> +        /* psignw */
> +        case 0x660f3809:
> +        /* psignd */
> +        case 0x660f380a:
> +        /* pmulhrsw */
> +        case 0x660f380b:
> +        /* pblendvb */
> +        case 0x660f3810:
> +        /* blendvps */
> +        case 0x660f3814:
> +        /* blendvpd */
> +        case 0x660f3815:
> +        /* pabsb */
> +        case 0x660f381c:
> +        /* pabsw */
> +        case 0x660f381d:
> +        /* pabsd */
> +        case 0x660f381e:
> +        /* pmovsxbw */
> +        case 0x660f3820:
> +        /* pmovsxbd */
> +        case 0x660f3821:
> +        /* pmovsxbq */
> +        case 0x660f3822:
> +        /* pmovsxwd */
> +        case 0x660f3823:
> +        /* pmovsxwq */
> +        case 0x660f3824:
> +        /* pmovsxdq */
> +        case 0x660f3825:
> +        /* pmuldq */
> +        case 0x660f3828:
> +        /* pcmpeqq */
> +        case 0x660f3829:
> +        /* movntdqa */
> +        case 0x660f382a:
> +        /* roundps */
> +        case 0x660f3a08:
> +        /* roundpd */
> +        case 0x660f3a09:
> +        /* roundss */
> +        case 0x660f3a0a:
> +        /* roundsd */
> +        case 0x660f3a0b:
> +        /* blendps */
> +        case 0x660f3a0c:
> +        /* blendpd */
> +        case 0x660f3a0d:
> +        /* pblendw */
> +        case 0x660f3a0e:
> +        /* palignr */
> +        case 0x660f3a0f:
> +        /* pinsrb */
> +        case 0x660f3a20:
> +        /* insertps */
> +        case 0x660f3a21:
> +        /* pinsrd pinsrq */
> +        case 0x660f3a22:
> +        /* dpps */
> +        case 0x660f3a40:
> +        /* dppd */
> +        case 0x660f3a41:
> +        /* mpsadbw */
> +        case 0x660f3a42:
> +        /* pcmpestrm */
> +        case 0x660f3a60:
> +        /* pcmpestri */
> +        case 0x660f3a61:
> +        /* pcmpistrm */
> +        case 0x660f3a62:
> +        /* pcmpistri */
> +        case 0x660f3a63:
> +        /* sqrtps */
> +        case 0x0f51:
> +        /* sqrtpd */
> +        case 0x660f51:
> +        /* sqrtsd */
> +        case 0xf20f51:
> +        /* sqrtss */
> +        case 0xf30f51:
> +        /* rsqrtps */
> +        case 0x0f52:
> +        /* rsqrtss */
> +        case 0xf30f52:
> +        /* rcpps */
> +        case 0x0f53:
> +        /* rcpss */
> +        case 0xf30f53:
> +        /* andps */
> +        case 0x0f54:
> +        /* andpd */
> +        case 0x660f54:
> +        /* andnps */
> +        case 0x0f55:
> +        /* andnpd */
> +        case 0x660f55:
> +        /* orps */
> +        case 0x0f56:
> +        /* orpd */
> +        case 0x660f56:
> +        /* xorps */
> +        case 0x0f57:
> +        /* xorpd */
> +        case 0x660f57:
> +        /* addps */
> +        case 0x0f58:
> +        /* addpd */
> +        case 0x660f58:
> +        /* addsd */
> +        case 0xf20f58:
> +        /* addss */
> +        case 0xf30f58:
> +        /* mulps */
> +        case 0x0f59:
> +        /* mulpd */
> +        case 0x660f59:
> +        /* mulsd */
> +        case 0xf20f59:
> +        /* mulss */
> +        case 0xf30f59:
> +        /* cvtps2pd */
> +        case 0x0f5a:
> +        /* cvtpd2ps */
> +        case 0x660f5a:
> +        /* cvtsd2ss */
> +        case 0xf20f5a:
> +        /* cvtss2sd */
> +        case 0xf30f5a:
> +        /* cvtdq2ps */
> +        case 0x0f5b:
> +        /* cvtps2dq */
> +        case 0x660f5b:
> +        /* cvttps2dq */
> +        case 0xf30f5b:
> +        /* subps */
> +        case 0x0f5c:
> +        /* subpd */
> +        case 0x660f5c:
> +        /* subsd */
> +        case 0xf20f5c:
> +        /* subss */
> +        case 0xf30f5c:
> +        /* minps */
> +        case 0x0f5d:
> +        /* minpd */
> +        case 0x660f5d:
> +        /* minsd */
> +        case 0xf20f5d:
> +        /* minss */
> +        case 0xf30f5d:
> +        /* divps */
> +        case 0x0f5e:
> +        /* divpd */
> +        case 0x660f5e:
> +        /* divsd */
> +        case 0xf20f5e:
> +        /* divss */
> +        case 0xf30f5e:
> +        /* maxps */
> +        case 0x0f5f:
> +        /* maxpd */
> +        case 0x660f5f:
> +        /* maxsd */
> +        case 0xf20f5f:
> +        /* maxss */
> +        case 0xf30f5f:
> +        /* punpcklbw */
> +        case 0x660f60:
> +        /* punpcklwd */
> +        case 0x660f61:
> +        /* punpckldq */
> +        case 0x660f62:
> +        /* packsswb */
> +        case 0x660f63:
> +        /* pcmpgtb */
> +        case 0x660f64:
> +        /* pcmpgtw */
> +        case 0x660f65:
> +        /* pcmpgtl */
> +        case 0x660f66:
> +        /* packuswb */
> +        case 0x660f67:
> +        /* punpckhbw */
> +        case 0x660f68:
> +        /* punpckhwd */
> +        case 0x660f69:
> +        /* punpckhdq */
> +        case 0x660f6a:
> +        /* packssdw */
> +        case 0x660f6b:
> +        /* punpcklqdq */
> +        case 0x660f6c:
> +        /* punpckhqdq */
> +        case 0x660f6d:
> +        /* movd */
> +        case 0x660f6e:
> +        /* movdqa */
> +        case 0x660f6f:
> +        /* movdqu */
> +        case 0xf30f6f:
> +        /* pshufd */
> +        case 0x660f70:
> +        /* pshuflw */
> +        case 0xf20f70:
> +        /* pshufhw */
> +        case 0xf30f70:
> +        /* pcmpeqb */
> +        case 0x660f74:
> +        /* pcmpeqw */
> +        case 0x660f75:
> +        /* pcmpeql */
> +        case 0x660f76:
> +        /* haddpd */
> +        case 0x660f7c:
> +        /* haddps */
> +        case 0xf20f7c:
> +        /* hsubpd */
> +        case 0x660f7d:
> +        /* hsubps */
> +        case 0xf20f7d:
> +        /* movq */
> +        case 0xf30f7e:
> +        /* cmpps */
> +        case 0x0fc2:
> +        /* cmppd */
> +        case 0x660fc2:
> +        /* cmpsd */
> +        case 0xf20fc2:
> +        /* cmpss */
> +        case 0xf30fc2:
> +        /* pinsrw */
> +        case 0x660fc4:
> +        /* shufps */
> +        case 0x0fc6:
> +        /* shufpd */
> +        case 0x660fc6:
> +        /* addsubpd */
> +        case 0x660fd0:
> +        /* addsubps */
> +        case 0xf20fd0:
> +        /* psrlw */
> +        case 0x660fd1:
> +        /* psrld */
> +        case 0x660fd2:
> +        /* psrlq */
> +        case 0x660fd3:
> +        /* paddq */
> +        case 0x660fd4:
> +        /* pmullw */
> +        case 0x660fd5:
> +        /* movq2dq */
> +        case 0xf30fd6:
> +        /* psubusb */
> +        case 0x660fd8:
> +        /* psubusw */
> +        case 0x660fd9:
> +        /* pminub */
> +        case 0x660fda:
> +        /* pand */
> +        case 0x660fdb:
> +        /* paddusb */
> +        case 0x660fdc:
> +        /* paddusw */
> +        case 0x660fdd:
> +        /* pmaxub */
> +        case 0x660fde:
> +        /* pandn */
> +        case 0x660fdf:
> +        /* pavgb */
> +        case 0x660fe0:
> +        /* psraw */
> +        case 0x660fe1:
> +        /* psrad */
> +        case 0x660fe2:
> +        /* pavgw */
> +        case 0x660fe3:
> +        /* pmulhuw */
> +        case 0x660fe4:
> +        /* pmulhw */
> +        case 0x660fe5:
> +        /* cvttpd2dq */
> +        case 0x660fe6:
> +        /* cvtpd2dq */
> +        case 0xf20fe6:
> +        /* cvtdq2pd */
> +        case 0xf30fe6:
> +        /* psubsb */
> +        case 0x660fe8:
> +        /* psubsw */
> +        case 0x660fe9:
> +        /* pminsw */
> +        case 0x660fea:
> +        /* por */
> +        case 0x660feb:
> +        /* paddsb */
> +        case 0x660fec:
> +        /* paddsw */
> +        case 0x660fed:
> +        /* pmaxsw */
> +        case 0x660fee:
> +        /* pxor */
> +        case 0x660fef:
> +        /* lddqu */
> +        case 0x660ff0:
> +        /* psllw */
> +        case 0x660ff1:
> +        /* pslld */
> +        case 0x660ff2:
> +        /* psllq */
> +        case 0x660ff3:
> +        /* pmuludq */
> +        case 0x660ff4:
> +        /* pmaddwd */
> +        case 0x660ff5:
> +        /* psadbw */
> +        case 0x660ff6:
> +        /* psubb */
> +        case 0x660ff8:
> +        /* psubw */
> +        case 0x660ff9:
> +        /* psubl */
> +        case 0x660ffa:
> +        /* psubq */
> +        case 0x660ffb:
> +        /* paddb */
> +        case 0x660ffc:
> +        /* paddw */
> +        case 0x660ffd:
> +        /* paddl */
> +        case 0x660ffe:
> +          if (i386_record_modrm (&ir))
> +           return -1;
> +          ir.reg |= rex_r;
> +          if (!i386_sse_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.reg))
> +            goto no_support;
> +          record_arch_list_add_reg (ir.regcache,
> +                                    I387_XMM0_REGNUM (tdep) + ir.reg);
> +          if ((opcode & 0xfffffffc) == 0x660f3a60)
> +            I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
> +          break;
> +
> +        /* movups */
> +        case 0x0f11:
> +        /* movupd */
> +        case 0x660f11:
> +        /* movss */
> +        case 0xf30f11:
> +        /* movsd */
> +        case 0xf20f11:
> +        /* movlps */
> +        case 0x0f13:
> +        /* movlpd */
> +        case 0x660f13:
> +        /* movhps */
> +        case 0x0f17:
> +        /* movhpd */
> +        case 0x660f17:
> +        /* movaps */
> +        case 0x0f29:
> +        /* movapd */
> +        case 0x660f29:
> +        /* pextrb */
> +        case 0x660f3a14:
> +        /* pextrw */
> +        case 0x660f3a15:
> +        /* pextrd pextrq */
> +        case 0x660f3a16:
> +        /* extractps */
> +        case 0x660f3a17:
> +        /* movdqa */
> +        case 0x660f7f:
> +        /* movdqu */
> +        case 0xf30f7f:
> +          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_sse_regnum_p (gdbarch, I387_XMM0_REGNUM
> (tdep) + ir.rm))
> +                goto no_support;
> +              record_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;
> +
> +        /* movntps */
> +        case 0x0f2b:
> +        /* movntpd */
> +        case 0x660f2b:
> +        /* movntq */
> +        case 0x0fe7:
> +        /* movntdq */
> +        case 0x660fe7:
> +          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;
> +
> +        /* cvttss2si */
> +        case 0xf30f2c:
> +        /* cvttsd2si */
> +        case 0xf20f2c:
> +        /* cvtss2si */
> +        case 0xf30f2d:
> +        /* cvtsd2si */
> +        case 0xf20f2d:
> +        /* crc32 */
> +        case 0xf20f38f0:
> +        /* crc32 */
> +        case 0xf20f38f1:
> +        /* movmskps */
> +        case 0x0f50:
> +        /* movmskpd */
> +        case 0x660f50:
> +        /* pextrw */
> +        case 0x0fc5:
> +        /* pextrw */
> +        case 0x660fc5:
> +        /* pmovmskb */
> +        case 0x0fd7:
> +        /* pmovmskb */
> +        case 0x660fd7:
> +          I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r);
> +          break;
> +
> +        /* pshufb */
> +        case 0x0f3800:
> +        /* phaddw */
> +        case 0x0f3801:
> +        /* phaddd */
> +        case 0x0f3802:
> +        /* phaddsw */
> +        case 0x0f3803:
> +        /* pmaddubsw */
> +        case 0x0f3804:
> +        /* phsubw */
> +        case 0x0f3805:
> +        /* phsubd */
> +        case 0x0f3806:
> +        /* phaddsw */
> +        case 0x0f3807:
> +        /* psignb */
> +        case 0x0f3808:
> +        /* psignw */
> +        case 0x0f3809:
> +        /* psignd */
> +        case 0x0f380a:
> +        /* pmulhrsw */
> +        case 0x0f380b:
> +        /* pabsb */
> +        case 0x0f381c:
> +        /* pabsw */
> +        case 0x0f381d:
> +        /* pabsd */
> +        case 0x0f381e:
> +        /* packusdw */
> +        case 0x0f382b:
> +        /* pmovzxbw */
> +        case 0x0f3830:
> +        /* pmovzxbd */
> +        case 0x0f3831:
> +        /* pmovzxbq */
> +        case 0x0f3832:
> +        /* pmovzxwd */
> +        case 0x0f3833:
> +        /* pmovzxwq */
> +        case 0x0f3834:
> +        /* pmovzxdq */
> +        case 0x0f3835:
> +        /* pcmpgtq */
> +        case 0x0f3837:
> +        /* pminsb */
> +        case 0x0f3838:
> +        /* pminsd */
> +        case 0x0f3839:
> +        /* pminuw */
> +        case 0x0f383a:
> +        /* pminud */
> +        case 0x0f383b:
> +        /* pmaxsb */
> +        case 0x0f383c:
> +        /* pmaxsd */
> +        case 0x0f383d:
> +        /* pmaxuw */
> +        case 0x0f383e:
> +        /* pmaxud */
> +        case 0x0f383f:
> +        /* pmulld */
> +        case 0x0f3840:
> +        /* phminposuw */
> +        case 0x0f3841:
> +        /* palignr */
> +        case 0x0f3a0f:
> +        /* punpcklbw */
> +        case 0x0f60:
> +        /* punpcklwd */
> +        case 0x0f61:
> +        /* punpckldq */
> +        case 0x0f62:
> +        /* packsswb */
> +        case 0x0f63:
> +        /* pcmpgtb */
> +        case 0x0f64:
> +        /* pcmpgtw */
> +        case 0x0f65:
> +        /* pcmpgtl */
> +        case 0x0f66:
> +        /* packuswb */
> +        case 0x0f67:
> +        /* punpckhbw */
> +        case 0x0f68:
> +        /* punpckhwd */
> +        case 0x0f69:
> +        /* punpckhdq */
> +        case 0x0f6a:
> +        /* packssdw */
> +        case 0x0f6b:
> +        /* movd */
> +        case 0x0f6e:
> +        /* movq */
> +        case 0x0f6f:
> +        /* pshufw */
> +        case 0x0f70:
> +        /* pcmpeqb */
> +        case 0x0f74:
> +        /* pcmpeqw */
> +        case 0x0f75:
> +        /* pcmpeql */
> +        case 0x0f76:
> +        /* pinsrw */
> +        case 0x0fc4:
> +        /* psrlw */
> +        case 0x0fd1:
> +        /* psrld */
> +        case 0x0fd2:
> +        /* psrlq */
> +        case 0x0fd3:
> +        /* paddq */
> +        case 0x0fd4:
> +        /* pmullw */
> +        case 0x0fd5:
> +        /* movdq2q */
> +        case 0xf20fd6:
> +        /* psubusb */
> +        case 0x0fd8:
> +        /* psubusw */
> +        case 0x0fd9:
> +        /* pminub */
> +        case 0x0fda:
> +        /* pand */
> +        case 0x0fdb:
> +        /* paddusb */
> +        case 0x0fdc:
> +        /* paddusw */
> +        case 0x0fdd:
> +        /* pmaxub */
> +        case 0x0fde:
> +        /* pandn */
> +        case 0x0fdf:
> +        /* pavgb */
> +        case 0x0fe0:
> +        /* psraw */
> +        case 0x0fe1:
> +        /* psrad */
> +        case 0x0fe2:
> +        /* pavgw */
> +        case 0x0fe3:
> +        /* pmulhuw */
> +        case 0x0fe4:
> +        /* pmulhw */
> +        case 0x0fe5:
> +        /* psubsb */
> +        case 0x0fe8:
> +        /* psubsw */
> +        case 0x0fe9:
> +        /* pminsw */
> +        case 0x0fea:
> +        /* por */
> +        case 0x0feb:
> +        /* paddsb */
> +        case 0x0fec:
> +        /* paddsw */
> +        case 0x0fed:
> +        /* pmaxsw */
> +        case 0x0fee:
> +        /* pxor */
> +        case 0x0fef:
> +        /* psllw */
> +        case 0x0ff1:
> +        /* pslld */
> +        case 0x0ff2:
> +        /* psllq */
> +        case 0x0ff3:
> +        /* pmuludq */
> +        case 0x0ff4:
> +        /* pmaddwd */
> +        case 0x0ff5:
> +        /* psadbw */
> +        case 0x0ff6:
> +        /* psubb */
> +        case 0x0ff8:
> +        /* psubw */
> +        case 0x0ff9:
> +        /* psubl */
> +        case 0x0ffa:
> +        /* psubq */
> +        case 0x0ffb:
> +        /* paddb */
> +        case 0x0ffc:
> +        /* paddw */
> +        case 0x0ffd:
> +        /* paddl */
> +        case 0x0ffe:
> +          if (i386_record_modrm (&ir))
> +           return -1;
> +          if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.reg))
> +            goto no_support;
> +          record_arch_list_add_reg (ir.regcache,
> +                                    I387_MM0_REGNUM (tdep) + ir.reg);
> +          break;
> +
> +        /* psllw */
> +        case 0x0f71:
> +        /* pslld */
> +        case 0x0f72:
> +        /* psllq */
> +        case 0x0f73:
> +          if (i386_record_modrm (&ir))
> +           return -1;
> +          if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.rm))
> +            goto no_support;
> +          record_arch_list_add_reg (ir.regcache,
> +                                    I387_MM0_REGNUM (tdep) + ir.rm);
> +          break;
> +
> +        /* psllw */
> +        case 0x660f71:
> +        /* pslld */
> +        case 0x660f72:
> +        /* psllq */
> +        case 0x660f73:
> +          if (i386_record_modrm (&ir))
> +           return -1;
> +          ir.rm |= ir.rex_b;
> +          if (!i386_sse_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.rm))
> +            goto no_support;
> +          record_arch_list_add_reg (ir.regcache,
> +                                    I387_XMM0_REGNUM (tdep) + ir.rm);
> +          break;
> +
> +        /* movd */
> +        case 0x0f7e:
> +        /* movd */
> +        case 0x660f7e:
> +          if (i386_record_modrm (&ir))
> +           return -1;
> +          if (ir.mod == 3)
> +            I386_RECORD_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;
> +
> +        /* movq */
> +        case 0x0f7f:
> +          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_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;
> +
> +        /* popcnt */
> +        case 0xf30fb8:
> +          if (i386_record_modrm (&ir))
> +           return -1;
> +          I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
> +          I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
> +          break;
> +
> +        /* movq */
> +        case 0x660fd6:
> +          if (i386_record_modrm (&ir))
> +           return -1;
> +          if (ir.mod == 3)
> +            {
> +              ir.rm |= ir.rex_b;
> +              if (!i386_sse_regnum_p (gdbarch, I387_XMM0_REGNUM
> (tdep) + ir.rm))
> +                goto no_support;
> +              record_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;
> +
> +        /* ptest */
> +        case 0x660f3817:
> +        /* ucomiss */
> +        case 0x0f2e:
> +        /* ucomisd */
> +        case 0x660f2e:
> +        /* comiss */
> +        case 0x0f2f:
> +        /* comisd */
> +        case 0x660f2f:
> +          I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
> +          break;
> +
> +        /* maskmovq */
> +        case 0x0ff7:
> +          regcache_raw_read_unsigned (ir.regcache,
> +                                      ir.regmap[X86_RECORD_REDI_REGNUM],
> +                                      &tmpulongest);
> +          if (record_arch_list_add_mem (tmpulongest, 64))
> +            return -1;
> +          break;
> +
> +        /* maskmovdqu */
> +        case 0x660ff7:
> +          regcache_raw_read_unsigned (ir.regcache,
> +                                      ir.regmap[X86_RECORD_REDI_REGNUM],
> +                                      &tmpulongest);
> +          if (record_arch_list_add_mem (tmpulongest, 128))
> +            return -1;
> +          break;
> +
> +        default:
> +          goto no_support;
> +          break;
> +        }
> +      break;
> 
>      default:
> -      if (opcode > 0xff)
> -       ir.addr -= 2;
> -      else
> -       ir.addr -= 1;
>        goto no_support;
>        break;
>      }
> @@ -5370,8 +6554,9 @@ reswitch:
> 
>  no_support:
>    printf_unfiltered (_("Process record doesn't support instruction 0x%02x "
> -                      "at address %s.\n"),
> -                    (unsigned int) (opcode), paddress (gdbarch, ir.addr));
> +                       "at address %s.\n"),
> +                     (unsigned int) (opcode),
> +                     paddress (gdbarch, ir.orig_addr));
>    return -1;
>  }



More information about the Gdb-patches mailing list