mirror of https://github.com/xemu-project/xemu.git
target/i386: move remaining conditional operations to new decoder
Move long-displacement Jcc, SETcc and CMOVcc to the new decoder. While filling in the tables makes the code seem longer, the new emitters are all just one line of code. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
40c4b92f1c
commit
2b8046f361
|
@ -999,6 +999,15 @@ static const X86OpEntry opcodes_0F[256] = {
|
|||
/* Incorrectly listed as Mq,Vq in the manual */
|
||||
[0x17] = X86_OP_ENTRY3(VMOVHPx_st, M,q, None,None, V,dq, vex5 p_00_66),
|
||||
|
||||
[0x40] = X86_OP_ENTRY2(CMOVcc, G,v, E,v, cpuid(CMOV)),
|
||||
[0x41] = X86_OP_ENTRY2(CMOVcc, G,v, E,v, cpuid(CMOV)),
|
||||
[0x42] = X86_OP_ENTRY2(CMOVcc, G,v, E,v, cpuid(CMOV)),
|
||||
[0x43] = X86_OP_ENTRY2(CMOVcc, G,v, E,v, cpuid(CMOV)),
|
||||
[0x44] = X86_OP_ENTRY2(CMOVcc, G,v, E,v, cpuid(CMOV)),
|
||||
[0x45] = X86_OP_ENTRY2(CMOVcc, G,v, E,v, cpuid(CMOV)),
|
||||
[0x46] = X86_OP_ENTRY2(CMOVcc, G,v, E,v, cpuid(CMOV)),
|
||||
[0x47] = X86_OP_ENTRY2(CMOVcc, G,v, E,v, cpuid(CMOV)),
|
||||
|
||||
[0x50] = X86_OP_ENTRY3(MOVMSK, G,y, None,None, U,x, vex7 p_00_66),
|
||||
[0x51] = X86_OP_GROUP3(sse_unary, V,x, H,x, W,x, vex2_rep3 p_00_66_f3_f2), /* sqrtps */
|
||||
[0x52] = X86_OP_GROUP3(sse_unary, V,x, H,x, W,x, vex4_rep5 p_00_f3), /* rsqrtps */
|
||||
|
@ -1026,6 +1035,24 @@ static const X86OpEntry opcodes_0F[256] = {
|
|||
[0x76] = X86_OP_ENTRY3(PCMPEQD, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
[0x77] = X86_OP_GROUP0(0F77),
|
||||
|
||||
[0x80] = X86_OP_ENTRYr(Jcc, J,z_f64),
|
||||
[0x81] = X86_OP_ENTRYr(Jcc, J,z_f64),
|
||||
[0x82] = X86_OP_ENTRYr(Jcc, J,z_f64),
|
||||
[0x83] = X86_OP_ENTRYr(Jcc, J,z_f64),
|
||||
[0x84] = X86_OP_ENTRYr(Jcc, J,z_f64),
|
||||
[0x85] = X86_OP_ENTRYr(Jcc, J,z_f64),
|
||||
[0x86] = X86_OP_ENTRYr(Jcc, J,z_f64),
|
||||
[0x87] = X86_OP_ENTRYr(Jcc, J,z_f64),
|
||||
|
||||
[0x90] = X86_OP_ENTRYw(SETcc, E,b),
|
||||
[0x91] = X86_OP_ENTRYw(SETcc, E,b),
|
||||
[0x92] = X86_OP_ENTRYw(SETcc, E,b),
|
||||
[0x93] = X86_OP_ENTRYw(SETcc, E,b),
|
||||
[0x94] = X86_OP_ENTRYw(SETcc, E,b),
|
||||
[0x95] = X86_OP_ENTRYw(SETcc, E,b),
|
||||
[0x96] = X86_OP_ENTRYw(SETcc, E,b),
|
||||
[0x97] = X86_OP_ENTRYw(SETcc, E,b),
|
||||
|
||||
[0x28] = X86_OP_ENTRY3(MOVDQ, V,x, None,None, W,x, vex1 p_00_66), /* MOVAPS */
|
||||
[0x29] = X86_OP_ENTRY3(MOVDQ, W,x, None,None, V,x, vex1 p_00_66), /* MOVAPS */
|
||||
[0x2A] = X86_OP_GROUP0(0F2A),
|
||||
|
@ -1038,6 +1065,15 @@ static const X86OpEntry opcodes_0F[256] = {
|
|||
[0x38] = X86_OP_GROUP0(0F38),
|
||||
[0x3a] = X86_OP_GROUP0(0F3A),
|
||||
|
||||
[0x48] = X86_OP_ENTRY2(CMOVcc, G,v, E,v, cpuid(CMOV)),
|
||||
[0x49] = X86_OP_ENTRY2(CMOVcc, G,v, E,v, cpuid(CMOV)),
|
||||
[0x4a] = X86_OP_ENTRY2(CMOVcc, G,v, E,v, cpuid(CMOV)),
|
||||
[0x4b] = X86_OP_ENTRY2(CMOVcc, G,v, E,v, cpuid(CMOV)),
|
||||
[0x4c] = X86_OP_ENTRY2(CMOVcc, G,v, E,v, cpuid(CMOV)),
|
||||
[0x4d] = X86_OP_ENTRY2(CMOVcc, G,v, E,v, cpuid(CMOV)),
|
||||
[0x4e] = X86_OP_ENTRY2(CMOVcc, G,v, E,v, cpuid(CMOV)),
|
||||
[0x4f] = X86_OP_ENTRY2(CMOVcc, G,v, E,v, cpuid(CMOV)),
|
||||
|
||||
[0x58] = X86_OP_ENTRY3(VADD, V,x, H,x, W,x, vex2_rep3 p_00_66_f3_f2),
|
||||
[0x59] = X86_OP_ENTRY3(VMUL, V,x, H,x, W,x, vex2_rep3 p_00_66_f3_f2),
|
||||
[0x5a] = X86_OP_GROUP0(0F5A),
|
||||
|
@ -1063,6 +1099,24 @@ static const X86OpEntry opcodes_0F[256] = {
|
|||
[0x7e] = X86_OP_GROUP0(0F7E),
|
||||
[0x7f] = X86_OP_GROUP0(0F7F),
|
||||
|
||||
[0x88] = X86_OP_ENTRYr(Jcc, J,z_f64),
|
||||
[0x89] = X86_OP_ENTRYr(Jcc, J,z_f64),
|
||||
[0x8a] = X86_OP_ENTRYr(Jcc, J,z_f64),
|
||||
[0x8b] = X86_OP_ENTRYr(Jcc, J,z_f64),
|
||||
[0x8c] = X86_OP_ENTRYr(Jcc, J,z_f64),
|
||||
[0x8d] = X86_OP_ENTRYr(Jcc, J,z_f64),
|
||||
[0x8e] = X86_OP_ENTRYr(Jcc, J,z_f64),
|
||||
[0x8f] = X86_OP_ENTRYr(Jcc, J,z_f64),
|
||||
|
||||
[0x98] = X86_OP_ENTRYw(SETcc, E,b),
|
||||
[0x99] = X86_OP_ENTRYw(SETcc, E,b),
|
||||
[0x9a] = X86_OP_ENTRYw(SETcc, E,b),
|
||||
[0x9b] = X86_OP_ENTRYw(SETcc, E,b),
|
||||
[0x9c] = X86_OP_ENTRYw(SETcc, E,b),
|
||||
[0x9d] = X86_OP_ENTRYw(SETcc, E,b),
|
||||
[0x9e] = X86_OP_ENTRYw(SETcc, E,b),
|
||||
[0x9f] = X86_OP_ENTRYw(SETcc, E,b),
|
||||
|
||||
[0xae] = X86_OP_GROUP0(group15),
|
||||
|
||||
[0xc2] = X86_OP_ENTRY4(VCMP, V,x, H,x, W,x, vex2_rep3 p_00_66_f3_f2),
|
||||
|
@ -1929,6 +1983,8 @@ static bool has_cpuid_feature(DisasContext *s, X86CPUIDFeature cpuid)
|
|||
switch (cpuid) {
|
||||
case X86_FEAT_None:
|
||||
return true;
|
||||
case X86_FEAT_CMOV:
|
||||
return (s->cpuid_features & CPUID_CMOV);
|
||||
case X86_FEAT_F16C:
|
||||
return (s->cpuid_ext_features & CPUID_EXT_F16C);
|
||||
case X86_FEAT_FMA:
|
||||
|
|
|
@ -107,6 +107,7 @@ typedef enum X86CPUIDFeature {
|
|||
X86_FEAT_AVX2,
|
||||
X86_FEAT_BMI1,
|
||||
X86_FEAT_BMI2,
|
||||
X86_FEAT_CMOV,
|
||||
X86_FEAT_CMPCCXADD,
|
||||
X86_FEAT_F16C,
|
||||
X86_FEAT_FMA,
|
||||
|
|
|
@ -1386,6 +1386,11 @@ static void gen_CMC(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
|||
tcg_gen_xori_tl(cpu_cc_src, cpu_cc_src, CC_C);
|
||||
}
|
||||
|
||||
static void gen_CMOVcc(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
{
|
||||
gen_cmovcc1(s, decode->b & 0xf, s->T0, s->T1);
|
||||
}
|
||||
|
||||
static void gen_CMPccXADD(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
{
|
||||
TCGLabel *label_top = gen_new_label();
|
||||
|
@ -3305,6 +3310,11 @@ static void gen_SCAS(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
|||
}
|
||||
}
|
||||
|
||||
static void gen_SETcc(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
{
|
||||
gen_setcc1(s, decode->b & 0xf, s->T0);
|
||||
}
|
||||
|
||||
static void gen_SHA1NEXTE(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
{
|
||||
gen_helper_sha1nexte(OP_PTR0, OP_PTR1, OP_PTR2);
|
||||
|
|
|
@ -3207,7 +3207,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
#ifndef CONFIG_USER_ONLY
|
||||
use_new &= b <= limit;
|
||||
#endif
|
||||
if (use_new && 0) {
|
||||
if (use_new && (b >= 0x138 && b <= 0x19f)) {
|
||||
disas_insn_new(s, cpu, b);
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue