target-alpha: Convert ARITH3 to source/sink
Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
3d045dbca5
commit
cd2754addc
@ -1258,43 +1258,6 @@ static void gen_msk_l(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Code to call arith3 helpers */
|
|
||||||
#define ARITH3(name) \
|
|
||||||
static inline void glue(gen_, name)(int ra, int rb, int rc, int islit,\
|
|
||||||
uint8_t lit) \
|
|
||||||
{ \
|
|
||||||
if (unlikely(rc == 31)) \
|
|
||||||
return; \
|
|
||||||
\
|
|
||||||
if (ra != 31) { \
|
|
||||||
if (islit) { \
|
|
||||||
TCGv tmp = tcg_const_i64(lit); \
|
|
||||||
gen_helper_ ## name(cpu_ir[rc], cpu_ir[ra], tmp); \
|
|
||||||
tcg_temp_free(tmp); \
|
|
||||||
} else \
|
|
||||||
gen_helper_ ## name (cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]); \
|
|
||||||
} else { \
|
|
||||||
TCGv tmp1 = tcg_const_i64(0); \
|
|
||||||
if (islit) { \
|
|
||||||
TCGv tmp2 = tcg_const_i64(lit); \
|
|
||||||
gen_helper_ ## name (cpu_ir[rc], tmp1, tmp2); \
|
|
||||||
tcg_temp_free(tmp2); \
|
|
||||||
} else \
|
|
||||||
gen_helper_ ## name (cpu_ir[rc], tmp1, cpu_ir[rb]); \
|
|
||||||
tcg_temp_free(tmp1); \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
ARITH3(cmpbge)
|
|
||||||
ARITH3(minub8)
|
|
||||||
ARITH3(minsb8)
|
|
||||||
ARITH3(minuw4)
|
|
||||||
ARITH3(minsw4)
|
|
||||||
ARITH3(maxub8)
|
|
||||||
ARITH3(maxsb8)
|
|
||||||
ARITH3(maxuw4)
|
|
||||||
ARITH3(maxsw4)
|
|
||||||
ARITH3(perr)
|
|
||||||
|
|
||||||
#define MVIOP2(name) \
|
#define MVIOP2(name) \
|
||||||
static inline void glue(gen_, name)(int rb, int rc) \
|
static inline void glue(gen_, name)(int rb, int rc) \
|
||||||
{ \
|
{ \
|
||||||
@ -1765,7 +1728,7 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
|
|||||||
break;
|
break;
|
||||||
case 0x0F:
|
case 0x0F:
|
||||||
/* CMPBGE */
|
/* CMPBGE */
|
||||||
gen_cmpbge(ra, rb, rc, islit, lit);
|
gen_helper_cmpbge(vc, va, vb);
|
||||||
break;
|
break;
|
||||||
case 0x12:
|
case 0x12:
|
||||||
/* S8ADDL */
|
/* S8ADDL */
|
||||||
@ -2619,45 +2582,61 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
|
|||||||
|
|
||||||
case 0x1C:
|
case 0x1C:
|
||||||
vc = dest_gpr(ctx, rc);
|
vc = dest_gpr(ctx, rc);
|
||||||
|
if (fn7 == 0x70) {
|
||||||
|
/* FTOIT */
|
||||||
|
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_FIX);
|
||||||
|
REQUIRE_REG_31(rb);
|
||||||
|
va = load_fpr(ctx, ra);
|
||||||
|
tcg_gen_mov_i64(vc, va);
|
||||||
|
break;
|
||||||
|
} else if (fn7 == 0x78) {
|
||||||
|
/* FTOIS */
|
||||||
|
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_FIX);
|
||||||
|
REQUIRE_REG_31(rb);
|
||||||
|
t32 = tcg_temp_new_i32();
|
||||||
|
va = load_fpr(ctx, ra);
|
||||||
|
gen_helper_s_to_memory(t32, va);
|
||||||
|
tcg_gen_ext_i32_i64(vc, t32);
|
||||||
|
tcg_temp_free_i32(t32);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
vb = load_gpr_lit(ctx, rb, lit, islit);
|
||||||
switch (fn7) {
|
switch (fn7) {
|
||||||
case 0x00:
|
case 0x00:
|
||||||
/* SEXTB */
|
/* SEXTB */
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_BWX);
|
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_BWX);
|
||||||
REQUIRE_REG_31(ra);
|
REQUIRE_REG_31(ra);
|
||||||
vb = load_gpr_lit(ctx, rb, lit, islit);
|
|
||||||
tcg_gen_ext8s_i64(vc, vb);
|
tcg_gen_ext8s_i64(vc, vb);
|
||||||
break;
|
break;
|
||||||
case 0x01:
|
case 0x01:
|
||||||
/* SEXTW */
|
/* SEXTW */
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_BWX);
|
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_BWX);
|
||||||
REQUIRE_REG_31(ra);
|
REQUIRE_REG_31(ra);
|
||||||
vb = load_gpr_lit(ctx, rb, lit, islit);
|
|
||||||
tcg_gen_ext16s_i64(vc, vb);
|
tcg_gen_ext16s_i64(vc, vb);
|
||||||
break;
|
break;
|
||||||
case 0x30:
|
case 0x30:
|
||||||
/* CTPOP */
|
/* CTPOP */
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_CIX);
|
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_CIX);
|
||||||
REQUIRE_REG_31(ra);
|
REQUIRE_REG_31(ra);
|
||||||
vb = load_gpr_lit(ctx, rb, lit, islit);
|
|
||||||
gen_helper_ctpop(vc, vb);
|
gen_helper_ctpop(vc, vb);
|
||||||
break;
|
break;
|
||||||
case 0x31:
|
case 0x31:
|
||||||
/* PERR */
|
/* PERR */
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
||||||
gen_perr(ra, rb, rc, islit, lit);
|
va = load_gpr(ctx, ra);
|
||||||
|
gen_helper_perr(vc, va, vb);
|
||||||
break;
|
break;
|
||||||
case 0x32:
|
case 0x32:
|
||||||
/* CTLZ */
|
/* CTLZ */
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_CIX);
|
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_CIX);
|
||||||
REQUIRE_REG_31(ra);
|
REQUIRE_REG_31(ra);
|
||||||
vb = load_gpr_lit(ctx, rb, lit, islit);
|
|
||||||
gen_helper_ctlz(vc, vb);
|
gen_helper_ctlz(vc, vb);
|
||||||
break;
|
break;
|
||||||
case 0x33:
|
case 0x33:
|
||||||
/* CTTZ */
|
/* CTTZ */
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_CIX);
|
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_CIX);
|
||||||
REQUIRE_REG_31(ra);
|
REQUIRE_REG_31(ra);
|
||||||
vb = load_gpr_lit(ctx, rb, lit, islit);
|
|
||||||
gen_helper_cttz(vc, vb);
|
gen_helper_cttz(vc, vb);
|
||||||
break;
|
break;
|
||||||
case 0x34:
|
case 0x34:
|
||||||
@ -2687,59 +2666,50 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
|
|||||||
case 0x38:
|
case 0x38:
|
||||||
/* MINSB8 */
|
/* MINSB8 */
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
||||||
gen_minsb8(ra, rb, rc, islit, lit);
|
va = load_gpr(ctx, ra);
|
||||||
|
gen_helper_minsb8(vc, va, vb);
|
||||||
break;
|
break;
|
||||||
case 0x39:
|
case 0x39:
|
||||||
/* MINSW4 */
|
/* MINSW4 */
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
||||||
gen_minsw4(ra, rb, rc, islit, lit);
|
va = load_gpr(ctx, ra);
|
||||||
|
gen_helper_minsw4(vc, va, vb);
|
||||||
break;
|
break;
|
||||||
case 0x3A:
|
case 0x3A:
|
||||||
/* MINUB8 */
|
/* MINUB8 */
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
||||||
gen_minub8(ra, rb, rc, islit, lit);
|
va = load_gpr(ctx, ra);
|
||||||
|
gen_helper_minub8(vc, va, vb);
|
||||||
break;
|
break;
|
||||||
case 0x3B:
|
case 0x3B:
|
||||||
/* MINUW4 */
|
/* MINUW4 */
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
||||||
gen_minuw4(ra, rb, rc, islit, lit);
|
va = load_gpr(ctx, ra);
|
||||||
|
gen_helper_minuw4(vc, va, vb);
|
||||||
break;
|
break;
|
||||||
case 0x3C:
|
case 0x3C:
|
||||||
/* MAXUB8 */
|
/* MAXUB8 */
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
||||||
gen_maxub8(ra, rb, rc, islit, lit);
|
va = load_gpr(ctx, ra);
|
||||||
|
gen_helper_maxub8(vc, va, vb);
|
||||||
break;
|
break;
|
||||||
case 0x3D:
|
case 0x3D:
|
||||||
/* MAXUW4 */
|
/* MAXUW4 */
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
||||||
gen_maxuw4(ra, rb, rc, islit, lit);
|
va = load_gpr(ctx, ra);
|
||||||
|
gen_helper_maxuw4(vc, va, vb);
|
||||||
break;
|
break;
|
||||||
case 0x3E:
|
case 0x3E:
|
||||||
/* MAXSB8 */
|
/* MAXSB8 */
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
||||||
gen_maxsb8(ra, rb, rc, islit, lit);
|
va = load_gpr(ctx, ra);
|
||||||
|
gen_helper_maxsb8(vc, va, vb);
|
||||||
break;
|
break;
|
||||||
case 0x3F:
|
case 0x3F:
|
||||||
/* MAXSW4 */
|
/* MAXSW4 */
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_MVI);
|
||||||
gen_maxsw4(ra, rb, rc, islit, lit);
|
va = load_gpr(ctx, ra);
|
||||||
break;
|
gen_helper_maxsw4(vc, va, vb);
|
||||||
case 0x70:
|
|
||||||
/* FTOIT */
|
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_FIX);
|
|
||||||
REQUIRE_REG_31(rb);
|
|
||||||
va = load_fpr(ctx, ra);
|
|
||||||
tcg_gen_mov_i64(vc, va);
|
|
||||||
break;
|
|
||||||
case 0x78:
|
|
||||||
/* FTOIS */
|
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_FIX);
|
|
||||||
REQUIRE_REG_31(rb);
|
|
||||||
t32 = tcg_temp_new_i32();
|
|
||||||
va = load_fpr(ctx, ra);
|
|
||||||
gen_helper_s_to_memory(t32, va);
|
|
||||||
tcg_gen_ext_i32_i64(vc, t32);
|
|
||||||
tcg_temp_free_i32(t32);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
goto invalid_opc;
|
goto invalid_opc;
|
||||||
|
Loading…
Reference in New Issue
Block a user