target/i386: remove now-converted opcodes from old decoder
Send all converted opcodes to disas_insn_new() directly from the big decoding switch statement; once more, the debugging/bisecting logic disappears. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
3519b813e1
commit
aef4f4affd
@ -207,15 +207,4 @@ DEF_HELPER_1(emms, void, env)
|
|||||||
#define SHIFT 2
|
#define SHIFT 2
|
||||||
#include "tcg/ops_sse_header.h.inc"
|
#include "tcg/ops_sse_header.h.inc"
|
||||||
|
|
||||||
DEF_HELPER_3(rclb, tl, env, tl, tl)
|
|
||||||
DEF_HELPER_3(rclw, tl, env, tl, tl)
|
|
||||||
DEF_HELPER_3(rcll, tl, env, tl, tl)
|
|
||||||
DEF_HELPER_3(rcrb, tl, env, tl, tl)
|
|
||||||
DEF_HELPER_3(rcrw, tl, env, tl, tl)
|
|
||||||
DEF_HELPER_3(rcrl, tl, env, tl, tl)
|
|
||||||
#ifdef TARGET_X86_64
|
|
||||||
DEF_HELPER_3(rclq, tl, env, tl, tl)
|
|
||||||
DEF_HELPER_3(rcrq, tl, env, tl, tl)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
DEF_HELPER_1(rdrand, tl, env)
|
DEF_HELPER_1(rdrand, tl, env)
|
||||||
|
@ -2227,9 +2227,6 @@ static void disas_insn_new(DisasContext *s, CPUState *cpu, int b)
|
|||||||
X86DecodeFunc decode_func = decode_root;
|
X86DecodeFunc decode_func = decode_root;
|
||||||
uint8_t cc_live;
|
uint8_t cc_live;
|
||||||
|
|
||||||
#ifdef CONFIG_USER_ONLY
|
|
||||||
if (limit) { --limit; }
|
|
||||||
#endif
|
|
||||||
s->has_modrm = false;
|
s->has_modrm = false;
|
||||||
|
|
||||||
next_byte:
|
next_byte:
|
||||||
|
@ -29,22 +29,6 @@
|
|||||||
|
|
||||||
//#define DEBUG_MULDIV
|
//#define DEBUG_MULDIV
|
||||||
|
|
||||||
/* modulo 9 table */
|
|
||||||
static const uint8_t rclb_table[32] = {
|
|
||||||
0, 1, 2, 3, 4, 5, 6, 7,
|
|
||||||
8, 0, 1, 2, 3, 4, 5, 6,
|
|
||||||
7, 8, 0, 1, 2, 3, 4, 5,
|
|
||||||
6, 7, 8, 0, 1, 2, 3, 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* modulo 17 table */
|
|
||||||
static const uint8_t rclw_table[32] = {
|
|
||||||
0, 1, 2, 3, 4, 5, 6, 7,
|
|
||||||
8, 9, 10, 11, 12, 13, 14, 15,
|
|
||||||
16, 0, 1, 2, 3, 4, 5, 6,
|
|
||||||
7, 8, 9, 10, 11, 12, 13, 14,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* division, flags are undefined */
|
/* division, flags are undefined */
|
||||||
|
|
||||||
void helper_divb_AL(CPUX86State *env, target_ulong t0)
|
void helper_divb_AL(CPUX86State *env, target_ulong t0)
|
||||||
@ -447,24 +431,6 @@ target_ulong helper_pext(target_ulong src, target_ulong mask)
|
|||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SHIFT 0
|
|
||||||
#include "shift_helper_template.h.inc"
|
|
||||||
#undef SHIFT
|
|
||||||
|
|
||||||
#define SHIFT 1
|
|
||||||
#include "shift_helper_template.h.inc"
|
|
||||||
#undef SHIFT
|
|
||||||
|
|
||||||
#define SHIFT 2
|
|
||||||
#include "shift_helper_template.h.inc"
|
|
||||||
#undef SHIFT
|
|
||||||
|
|
||||||
#ifdef TARGET_X86_64
|
|
||||||
#define SHIFT 3
|
|
||||||
#include "shift_helper_template.h.inc"
|
|
||||||
#undef SHIFT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Test that BIT is enabled in CR4. If not, raise an illegal opcode
|
/* Test that BIT is enabled in CR4. If not, raise an illegal opcode
|
||||||
exception. This reduces the requirements for rare CR4 bits being
|
exception. This reduces the requirements for rare CR4 bits being
|
||||||
mapped into HFLAGS. */
|
mapped into HFLAGS. */
|
||||||
|
@ -1,108 +0,0 @@
|
|||||||
/*
|
|
||||||
* x86 shift helpers
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008 Fabrice Bellard
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define DATA_BITS (1 << (3 + SHIFT))
|
|
||||||
#define SHIFT_MASK (DATA_BITS - 1)
|
|
||||||
#if DATA_BITS <= 32
|
|
||||||
#define SHIFT1_MASK 0x1f
|
|
||||||
#else
|
|
||||||
#define SHIFT1_MASK 0x3f
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if DATA_BITS == 8
|
|
||||||
#define SUFFIX b
|
|
||||||
#define DATA_MASK 0xff
|
|
||||||
#elif DATA_BITS == 16
|
|
||||||
#define SUFFIX w
|
|
||||||
#define DATA_MASK 0xffff
|
|
||||||
#elif DATA_BITS == 32
|
|
||||||
#define SUFFIX l
|
|
||||||
#define DATA_MASK 0xffffffff
|
|
||||||
#elif DATA_BITS == 64
|
|
||||||
#define SUFFIX q
|
|
||||||
#define DATA_MASK 0xffffffffffffffffULL
|
|
||||||
#else
|
|
||||||
#error unhandled operand size
|
|
||||||
#endif
|
|
||||||
|
|
||||||
target_ulong glue(helper_rcl, SUFFIX)(CPUX86State *env, target_ulong t0,
|
|
||||||
target_ulong t1)
|
|
||||||
{
|
|
||||||
int count, eflags;
|
|
||||||
target_ulong src;
|
|
||||||
target_long res;
|
|
||||||
|
|
||||||
count = t1 & SHIFT1_MASK;
|
|
||||||
#if DATA_BITS == 16
|
|
||||||
count = rclw_table[count];
|
|
||||||
#elif DATA_BITS == 8
|
|
||||||
count = rclb_table[count];
|
|
||||||
#endif
|
|
||||||
if (count) {
|
|
||||||
eflags = env->cc_src;
|
|
||||||
t0 &= DATA_MASK;
|
|
||||||
src = t0;
|
|
||||||
res = (t0 << count) | ((target_ulong)(eflags & CC_C) << (count - 1));
|
|
||||||
if (count > 1) {
|
|
||||||
res |= t0 >> (DATA_BITS + 1 - count);
|
|
||||||
}
|
|
||||||
t0 = res;
|
|
||||||
env->cc_src = (eflags & ~(CC_C | CC_O)) |
|
|
||||||
(lshift(src ^ t0, 11 - (DATA_BITS - 1)) & CC_O) |
|
|
||||||
((src >> (DATA_BITS - count)) & CC_C);
|
|
||||||
}
|
|
||||||
return t0;
|
|
||||||
}
|
|
||||||
|
|
||||||
target_ulong glue(helper_rcr, SUFFIX)(CPUX86State *env, target_ulong t0,
|
|
||||||
target_ulong t1)
|
|
||||||
{
|
|
||||||
int count, eflags;
|
|
||||||
target_ulong src;
|
|
||||||
target_long res;
|
|
||||||
|
|
||||||
count = t1 & SHIFT1_MASK;
|
|
||||||
#if DATA_BITS == 16
|
|
||||||
count = rclw_table[count];
|
|
||||||
#elif DATA_BITS == 8
|
|
||||||
count = rclb_table[count];
|
|
||||||
#endif
|
|
||||||
if (count) {
|
|
||||||
eflags = env->cc_src;
|
|
||||||
t0 &= DATA_MASK;
|
|
||||||
src = t0;
|
|
||||||
res = (t0 >> count) |
|
|
||||||
((target_ulong)(eflags & CC_C) << (DATA_BITS - count));
|
|
||||||
if (count > 1) {
|
|
||||||
res |= t0 << (DATA_BITS + 1 - count);
|
|
||||||
}
|
|
||||||
t0 = res;
|
|
||||||
env->cc_src = (eflags & ~(CC_C | CC_O)) |
|
|
||||||
(lshift(src ^ t0, 11 - (DATA_BITS - 1)) & CC_O) |
|
|
||||||
((src >> (count - 1)) & CC_C);
|
|
||||||
}
|
|
||||||
return t0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef DATA_BITS
|
|
||||||
#undef SHIFT_MASK
|
|
||||||
#undef SHIFT1_MASK
|
|
||||||
#undef DATA_TYPE
|
|
||||||
#undef DATA_MASK
|
|
||||||
#undef SUFFIX
|
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user