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 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, cc.reg, cc.reg2,
gen_op_mov_reg_v(ot, reg, cpu_T);
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.