Hi,

I'm still trying to understanding how disas_insn in
*target-i386/translate.c* works.

Currently I met "*case 0x140 ... 0x14f: /* cmov Gv, Ev */*",

I thought it just check the condition and execute the MOV according to the
condition.

However, in *gen_cmovcc1 *function, I have no idea where the condition
checks.

It seems to load source value (register or memory) into cpu_T[0] by
"*gen_ldst_modrm(env,
s, modrm, ot, OR_TMP0, 0);*", and I have no idea what "*CCPrepare cc;*"
doing, but I thought

*    tcg_gen_movcond_tl(cc.cond, cpu_T[0], cc.reg, cc.reg2,*
*                       cpu_T[0], cpu_regs[reg]);*
*    gen_op_mov_reg_v(ot, reg, cpu_T[0]);*

will give some hints.

*gen_op_mov_reg_v *function looks simply move the result into the
destination register, so I thought the condition checking is performed
in *tcg_gen_movcond_tl
*function.

When look into *tcg_gen_movcond_tl *function, I found it defined in*
tcg-op.h*, which:

*#define tcg_gen_movcond_tl tcg_gen_movcond_i32*

and in *tcg_gen_movcond_i32*, because I target on i386,
*TCG_TARGET_HAS_movcond_i32
*should be 1 and this function only execute:

    *tcg_gen_op6i_i32(INDEX_op_movcond_i32, ret, c1, c2, v1, v2, cond);*

I really have no idea what *tcg_gen_op6i_i32 *doing, the argument naming is
helpless (arg1 to arg6).

Did I track the wrong way?

I really appreciate any help you can provide.

Nier

Reply via email to