[RFA] Prec x86 MMX 3DNow! SSE SSE2 SSE3 SSSE3 SSE4 support
Hui Zhu
teawater@gmail.com
Fri Dec 11 15:00:00 GMT 2009
OK.
Thanks,
Hui
On Fri, Dec 11, 2009 at 03:51, Michael Snyder <msnyder@vmware.com> wrote:
> Hui Zhu wrote:
>>
>> Hi guys,
>>
>> This patch make prec support x86 MMX 3DNow! SSE SSE2 SSE3 SSSE3 SSE4.
>> Please help me review it.
>
> Sounds like these are close to acceptance.
> Hui, can we get some testsuites, please?
> You can use Oza's tests for the 387 as a model for starting.
>
> Michael
>
>
>> 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