On 3/20/20 9:56 PM, Jiaxun Yang wrote:
> case OPC_SLE_CP2:
> - /*
> - * ??? Document is unclear: Set FCC[CC]. Does that mean the
> - * FD field is the CC field?
> - */
> + cond = TCG_COND_LE;
> + do_cc_cond:
> + {
> + int cc = (ctx->opcode >> 8) & 0x7;
> + lab = gen_new_label();
> + tcg_gen_ori_i32(fpu_fcr31, fpu_fcr31, 1 << get_fp_bit(cc));
> + tcg_gen_brcond_i64(cond, t0, t1, lab);
> + tcg_gen_xori_i32(fpu_fcr31, fpu_fcr31, 1 << get_fp_bit(cc));
> + gen_set_label(lab);
> + }
> + goto no_rd;
> + break;
There is no need for a branch here. This is a deposit operation.
TCGv_i64 t64 = tcg_temp_new_i64();
TCGv_i32 t32 = tcg_temp_new_i32();
tcg_gen_setcond_i64(cond, t64, t0, t1);
tcg_gen_extrl_i64_i32(t32, t64);
tcg_gen_deposit_i32(cpu_fcr31, cpu_fcr31, t32,
get_fp_bit(cc), 1);
tcg_temp_free_i32(t32);
tcg_temp_free_i64(t64);
r~