On 10/31/18 1:20 PM, Bastian Koppelmann wrote:
> static bool trans_slt(DisasContext *ctx, arg_slt *a)
> {
> - gen_arith(ctx, OPC_RISC_SLT, a->rd, a->rs1, a->rs2);
> + TCGv source1 = tcg_temp_new();
> + TCGv source2 = tcg_temp_new();
> +
> + gen_get_gpr(source1, a->rs1);
> + gen_get_gpr(source2, a->rs2);
> +
> + tcg_gen_setcond_tl(TCG_COND_LT, source1, source1, source2);
I do wonder about extracting this one line to gen_slt so that you can re-use
gen_arith and gen_arithi.
> + tcg_gen_setcond_tl(TCG_COND_LTU, source1, source1, source2);
Similarly.
> static bool trans_sllw(DisasContext *ctx, arg_sllw *a)
> {
> - gen_arith(ctx, OPC_RISC_SLLW, a->rd, a->rs1, a->rs2);
> + TCGv source1 = tcg_temp_new();
> + TCGv source2 = tcg_temp_new();
> +
> + gen_get_gpr(source1, a->rs1);
> + gen_get_gpr(source2, a->rs2);
> +
> + tcg_gen_andi_tl(source2, source2, 0x1F);
> + tcg_gen_shl_tl(source1, source1, source2);
> +
> + gen_set_gpr(a->rd, source1);
Missing the ext32s after the shift.
> static bool trans_srlw(DisasContext *ctx, arg_srlw *a)
> {
> - gen_arith(ctx, OPC_RISC_SRLW, a->rd, a->rs1, a->rs2);
> + TCGv source1 = tcg_temp_new();
> + TCGv source2 = tcg_temp_new();
> +
> + gen_get_gpr(source1, a->rs1);
> + gen_get_gpr(source2, a->rs2);
> +
> + /* clear upper 32 */
> + tcg_gen_ext32u_tl(source1, source1);
> + tcg_gen_andi_tl(source2, source2, 0x1F);
> + tcg_gen_shr_tl(source1, source1, source2);
Likewise. (Consider source2 == 0.)
> - case OPC_RISC_SRL:
> - tcg_gen_andi_tl(source2, source2, TARGET_LONG_BITS - 1);
> - tcg_gen_shr_tl(source1, source1, source2);
> - break;
...
> - case OPC_RISC_SRA:
> - tcg_gen_andi_tl(source2, source2, TARGET_LONG_BITS - 1);
> - tcg_gen_sar_tl(source1, source1, source2);
> - break;
I see that the bugs are in the original though, so fixing them in a separate
patch is certainly ok.
r~