This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [RFA] Prec x86 MMX 3DNow! SSE SSE2 SSE3 SSSE3 SSE4 support
- From: Michael Snyder <msnyder at vmware dot com>
- To: Hui Zhu <teawater at gmail dot com>
- Cc: gdb-patches ml <gdb-patches at sourceware dot org>, Mark Kettenis <mark dot kettenis at xs4all dot nl>
- Date: Mon, 07 Dec 2009 09:15:21 -0800
- Subject: Re: [RFA] Prec x86 MMX 3DNow! SSE SSE2 SSE3 SSSE3 SSE4 support
- References: <daef60380912070700t70e2a9ffg652549c285809b98@mail.gmail.com>
Hui Zhu wrote:
Hi guys,
This patch make prec support x86 MMX 3DNow! SSE SSE2 SSE3 SSSE3 SSE4.
Please help me review it.
OK, here's your stylistic review:
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"),
Long line string.
+ paddress (gdbarch, ir.addr));
+ return -1;
+ }
+ ir.addr++;
+ switch (tmpu8)
+ {
+ /* 3DNow! pi2fw */
+ case 0x0c:
Could you consider making these one line instead of two?
Like this:
case 0x0c: /* 3DNow! pi2fw */
I think it would increase readability and decrease ambiguity.
Right now, it's hard to tell whether the comment belongs to
the case above or the case below.
+ /* 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))
Break up long line.
+ 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));
Break up long line.
+
+ 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 up long line.
+ 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:
I think GCC has an extension that allows you to specify
a range of cases on a single line. Just a suggestion...
+ switch (prefixes)
+ {
+ case PREFIX_REPNZ:
+ opcode |= 0xf20000;
+ break;
+ case PREFIX_DATA:
+ opcode |= 0x660000;
+ break;
+ case PREFIX_REPZ:
+ opcode |= 0xf30000;
+ break;
+ }
+reswitch_prefix_add:
I think the standard calls for at least one leading space
before the label.
+ 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"),
Re-adjust string for long line.
+ paddress (gdbarch, ir.addr));
+ return -1;
+ }
+ ir.addr++;
+ opcode = (uint32_t) tmpu8 | opcode << 4;
+ goto reswitch_prefix_add;
+ break;
+
+ /* movups */
+ case 0x0f10:
Same request re: cases and comments on one line.
+ /* 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))
Break up long line.
+ 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))
Break up long line.
+ 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))
Long line.
+ 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))
Long line.
+ 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))
Long line.
+ 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))
Break up long line.
+ 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"),
Long line string.
+ (unsigned int) (opcode),
+ paddress (gdbarch, ir.orig_addr));
return -1;
}