mirror of https://github.com/xemu-project/xemu.git
target/i386: clean up repeated string operations
Do not bother generating inline wrappers for gen_repz and gen_repz2; use s->prefix to separate REPZ from REPNZ in the case of SCAS and CMPS. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
f0e754d3ce
commit
6605817b1a
|
@ -1508,10 +1508,8 @@ static void gen_CMPccXADD(DisasContext *s, CPUX86State *env, X86DecodedInsn *dec
|
|||
static void gen_CMPS(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
{
|
||||
MemOp ot = decode->op[2].ot;
|
||||
if (s->prefix & PREFIX_REPNZ) {
|
||||
gen_repz_cmps(s, ot, 1);
|
||||
} else if (s->prefix & PREFIX_REPZ) {
|
||||
gen_repz_cmps(s, ot, 0);
|
||||
if (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ)) {
|
||||
gen_repz_nz(s, ot, gen_cmps);
|
||||
} else {
|
||||
gen_cmps(s, ot);
|
||||
}
|
||||
|
@ -1834,7 +1832,7 @@ static void gen_INS(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
|||
|
||||
translator_io_start(&s->base);
|
||||
if (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ)) {
|
||||
gen_repz_ins(s, ot);
|
||||
gen_repz(s, ot, gen_ins);
|
||||
} else {
|
||||
gen_ins(s, ot);
|
||||
}
|
||||
|
@ -1993,7 +1991,7 @@ static void gen_LODS(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
|||
{
|
||||
MemOp ot = decode->op[2].ot;
|
||||
if (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ)) {
|
||||
gen_repz_lods(s, ot);
|
||||
gen_repz(s, ot, gen_lods);
|
||||
} else {
|
||||
gen_lods(s, ot);
|
||||
}
|
||||
|
@ -2155,7 +2153,7 @@ static void gen_MOVS(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
|||
{
|
||||
MemOp ot = decode->op[2].ot;
|
||||
if (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ)) {
|
||||
gen_repz_movs(s, ot);
|
||||
gen_repz(s, ot, gen_movs);
|
||||
} else {
|
||||
gen_movs(s, ot);
|
||||
}
|
||||
|
@ -2321,7 +2319,7 @@ static void gen_OUTS(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
|||
|
||||
translator_io_start(&s->base);
|
||||
if (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ)) {
|
||||
gen_repz_outs(s, ot);
|
||||
gen_repz(s, ot, gen_outs);
|
||||
} else {
|
||||
gen_outs(s, ot);
|
||||
}
|
||||
|
@ -3329,10 +3327,8 @@ static void gen_SBB(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
|||
static void gen_SCAS(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
{
|
||||
MemOp ot = decode->op[2].ot;
|
||||
if (s->prefix & PREFIX_REPNZ) {
|
||||
gen_repz_scas(s, ot, 1);
|
||||
} else if (s->prefix & PREFIX_REPZ) {
|
||||
gen_repz_scas(s, ot, 0);
|
||||
if (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ)) {
|
||||
gen_repz_nz(s, ot, gen_scas);
|
||||
} else {
|
||||
gen_scas(s, ot);
|
||||
}
|
||||
|
@ -3495,7 +3491,7 @@ static void gen_STOS(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
|||
{
|
||||
MemOp ot = decode->op[1].ot;
|
||||
if (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ)) {
|
||||
gen_repz_stos(s, ot);
|
||||
gen_repz(s, ot, gen_stos);
|
||||
} else {
|
||||
gen_stos(s, ot);
|
||||
}
|
||||
|
|
|
@ -1327,14 +1327,12 @@ static void gen_repz(DisasContext *s, MemOp ot,
|
|||
gen_jmp_rel_csize(s, -cur_insn_len(s), 0);
|
||||
}
|
||||
|
||||
#define GEN_REPZ(op) \
|
||||
static inline void gen_repz_ ## op(DisasContext *s, MemOp ot) \
|
||||
{ gen_repz(s, ot, gen_##op); }
|
||||
|
||||
static void gen_repz2(DisasContext *s, MemOp ot, int nz,
|
||||
void (*fn)(DisasContext *s, MemOp ot))
|
||||
static void gen_repz_nz(DisasContext *s, MemOp ot,
|
||||
void (*fn)(DisasContext *s, MemOp ot))
|
||||
{
|
||||
TCGLabel *l2;
|
||||
int nz = (s->prefix & PREFIX_REPNZ) ? 1 : 0;
|
||||
|
||||
l2 = gen_jz_ecx_string(s);
|
||||
fn(s, ot);
|
||||
gen_op_add_reg_im(s, s->aflag, R_ECX, -1);
|
||||
|
@ -1350,18 +1348,6 @@ static void gen_repz2(DisasContext *s, MemOp ot, int nz,
|
|||
gen_jmp_rel_csize(s, -cur_insn_len(s), 0);
|
||||
}
|
||||
|
||||
#define GEN_REPZ2(op) \
|
||||
static inline void gen_repz_ ## op(DisasContext *s, MemOp ot, int nz) \
|
||||
{ gen_repz2(s, ot, nz, gen_##op); }
|
||||
|
||||
GEN_REPZ(movs)
|
||||
GEN_REPZ(stos)
|
||||
GEN_REPZ(lods)
|
||||
GEN_REPZ(ins)
|
||||
GEN_REPZ(outs)
|
||||
GEN_REPZ2(scas)
|
||||
GEN_REPZ2(cmps)
|
||||
|
||||
static void gen_helper_fp_arith_ST0_FT0(int op)
|
||||
{
|
||||
switch (op) {
|
||||
|
|
Loading…
Reference in New Issue