@@ -20,19 +20,19 @@
static bool trans_clz(DisasContext *ctx, arg_clz *a)
{
REQUIRE_EXT(ctx, RVB);
- return gen_unary(ctx, a, gen_clz);
+ return gen_unary(ctx, a, ctx->uxl32 ? gen_clzw : gen_clz);
}
static bool trans_ctz(DisasContext *ctx, arg_ctz *a)
{
REQUIRE_EXT(ctx, RVB);
- return gen_unary(ctx, a, gen_ctz);
+ return gen_unary(ctx, a, ctx->uxl32 ? gen_ctzw : gen_ctz);
}
static bool trans_cpop(DisasContext *ctx, arg_cpop *a)
{
REQUIRE_EXT(ctx, RVB);
- return gen_unary(ctx, a, tcg_gen_ctpop_tl);
+ return gen_unary(ctx, a, ctx->uxl32 ? gen_cpopw : tcg_gen_ctpop_tl);
}
static bool trans_andn(DisasContext *ctx, arg_andn *a)
@@ -56,43 +56,43 @@ static bool trans_xnor(DisasContext *ctx, arg_xnor *a)
static bool trans_pack(DisasContext *ctx, arg_pack *a)
{
REQUIRE_EXT(ctx, RVB);
- return gen_arith(ctx, a, gen_pack);
+ return gen_arith(ctx, a, ctx->uxl32 ? gen_packw : gen_pack);
}
static bool trans_packu(DisasContext *ctx, arg_packu *a)
{
REQUIRE_EXT(ctx, RVB);
- return gen_arith(ctx, a, gen_packu);
+ return gen_arith(ctx, a, ctx->uxl32 ? gen_packuw : gen_packu);
}
static bool trans_packh(DisasContext *ctx, arg_packh *a)
{
REQUIRE_EXT(ctx, RVB);
- return gen_arith(ctx, a, gen_packh);
+ return gen_arith(ctx, a, ctx->uxl32 ? gen_packhw : gen_packh);
}
static bool trans_min(DisasContext *ctx, arg_min *a)
{
REQUIRE_EXT(ctx, RVB);
- return gen_arith(ctx, a, tcg_gen_smin_tl);
+ return gen_arith_s(ctx, a, tcg_gen_smin_tl);
}
static bool trans_max(DisasContext *ctx, arg_max *a)
{
REQUIRE_EXT(ctx, RVB);
- return gen_arith(ctx, a, tcg_gen_smax_tl);
+ return gen_arith_s(ctx, a, tcg_gen_smax_tl);
}
static bool trans_minu(DisasContext *ctx, arg_minu *a)
{
REQUIRE_EXT(ctx, RVB);
- return gen_arith(ctx, a, tcg_gen_umin_tl);
+ return gen_arith_u(ctx, a, tcg_gen_umin_tl);
}
static bool trans_maxu(DisasContext *ctx, arg_maxu *a)
{
REQUIRE_EXT(ctx, RVB);
- return gen_arith(ctx, a, tcg_gen_umax_tl);
+ return gen_arith_u(ctx, a, tcg_gen_umax_tl);
}
static bool trans_sext_b(DisasContext *ctx, arg_sext_b *a)
@@ -170,36 +170,54 @@ static bool trans_sloi(DisasContext *ctx, arg_sloi *a)
static bool trans_sro(DisasContext *ctx, arg_sro *a)
{
REQUIRE_EXT(ctx, RVB);
+ if (ctx->uxl32) {
+ return trans_srow(ctx, a);
+ }
return gen_shift(ctx, a, gen_sro);
}
static bool trans_sroi(DisasContext *ctx, arg_sroi *a)
{
REQUIRE_EXT(ctx, RVB);
+ if (ctx->uxl32) {
+ return trans_sroiw(ctx, a);
+ }
return gen_shifti(ctx, a, gen_sro);
}
static bool trans_ror(DisasContext *ctx, arg_ror *a)
{
REQUIRE_EXT(ctx, RVB);
+ if (ctx->uxl32) {
+ return trans_rorw(ctx, a);
+ }
return gen_shift(ctx, a, tcg_gen_rotr_tl);
}
static bool trans_rori(DisasContext *ctx, arg_rori *a)
{
REQUIRE_EXT(ctx, RVB);
+ if (ctx->uxl32) {
+ return trans_roriw(ctx, a);
+ }
return gen_shifti(ctx, a, tcg_gen_rotr_tl);
}
static bool trans_rol(DisasContext *ctx, arg_rol *a)
{
REQUIRE_EXT(ctx, RVB);
+ if (ctx->uxl32) {
+ return trans_rolw(ctx, a);
+ }
return gen_shift(ctx, a, tcg_gen_rotl_tl);
}
static bool trans_grev(DisasContext *ctx, arg_grev *a)
{
REQUIRE_EXT(ctx, RVB);
+ if (ctx->uxl32) {
+ return trans_grevw(ctx, a);
+ }
return gen_shift(ctx, a, gen_helper_grev);
}
@@ -207,6 +225,9 @@ static bool trans_grevi(DisasContext *ctx, arg_grevi *a)
{
REQUIRE_EXT(ctx, RVB);
+ if (ctx->uxl32) {
+ return trans_grevi(ctx, a);
+ }
if (a->shamt >= TARGET_LONG_BITS) {
return false;
}
@@ -217,12 +238,18 @@ static bool trans_grevi(DisasContext *ctx, arg_grevi *a)
static bool trans_gorc(DisasContext *ctx, arg_gorc *a)
{
REQUIRE_EXT(ctx, RVB);
+ if (ctx->uxl32) {
+ return trans_gorcw(ctx, a);
+ }
return gen_shift(ctx, a, gen_helper_gorc);
}
static bool trans_gorci(DisasContext *ctx, arg_gorci *a)
{
REQUIRE_EXT(ctx, RVB);
+ if (ctx->uxl32) {
+ return trans_gorciw(ctx, a);
+ }
return gen_shifti(ctx, a, gen_helper_gorc);
}
@@ -742,6 +742,14 @@ static void gen_packuw(TCGv ret, TCGv arg1, TCGv arg2)
tcg_temp_free(t);
}
+static void gen_packhw(TCGv ret, TCGv arg1, TCGv arg2)
+{
+ TCGv t = tcg_temp_new();
+ tcg_gen_ext8u_tl(t, arg2);
+ tcg_gen_deposit_tl(ret, arg1, t, 8, 24);
+ tcg_temp_free(t);
+}
+
static void gen_rorw(TCGv ret, TCGv arg1, TCGv arg2)
{
TCGv_i32 t1 = tcg_temp_new_i32();
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com> --- target/riscv/insn_trans/trans_rvb.c.inc | 47 +++++++++++++++++++------ target/riscv/translate.c | 8 +++++ 2 files changed, 45 insertions(+), 10 deletions(-)