target-alpha: Convert opcode 0x1C to source/sink
Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
1eaa1da7e4
commit
c67b67e511
@ -2833,43 +2833,30 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
|
||||
#else
|
||||
goto invalid_opc;
|
||||
#endif
|
||||
|
||||
case 0x1C:
|
||||
vc = dest_gpr(ctx, rc);
|
||||
switch (fn7) {
|
||||
case 0x00:
|
||||
/* SEXTB */
|
||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_BWX);
|
||||
REQUIRE_REG_31(ra);
|
||||
if (likely(rc != 31)) {
|
||||
if (islit) {
|
||||
tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int8_t)lit));
|
||||
} else {
|
||||
tcg_gen_ext8s_i64(cpu_ir[rc], cpu_ir[rb]);
|
||||
}
|
||||
}
|
||||
vb = load_gpr_lit(ctx, rb, lit, islit);
|
||||
tcg_gen_ext8s_i64(vc, vb);
|
||||
break;
|
||||
case 0x01:
|
||||
/* SEXTW */
|
||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_BWX);
|
||||
REQUIRE_REG_31(ra);
|
||||
if (likely(rc != 31)) {
|
||||
if (islit) {
|
||||
tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int16_t)lit));
|
||||
} else {
|
||||
tcg_gen_ext16s_i64(cpu_ir[rc], cpu_ir[rb]);
|
||||
}
|
||||
}
|
||||
vb = load_gpr_lit(ctx, rb, lit, islit);
|
||||
tcg_gen_ext16s_i64(vc, vb);
|
||||
break;
|
||||
case 0x30:
|
||||
/* CTPOP */
|
||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_CIX);
|
||||
REQUIRE_REG_31(ra);
|
||||
if (likely(rc != 31)) {
|
||||
if (islit) {
|
||||
tcg_gen_movi_i64(cpu_ir[rc], ctpop64(lit));
|
||||
} else {
|
||||
gen_helper_ctpop(cpu_ir[rc], cpu_ir[rb]);
|
||||
}
|
||||
}
|
||||
vb = load_gpr_lit(ctx, rb, lit, islit);
|
||||
gen_helper_ctpop(vc, vb);
|
||||
break;
|
||||
case 0x31:
|
||||
/* PERR */
|
||||
@ -2880,25 +2867,15 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
|
||||
/* CTLZ */
|
||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_CIX);
|
||||
REQUIRE_REG_31(ra);
|
||||
if (likely(rc != 31)) {
|
||||
if (islit) {
|
||||
tcg_gen_movi_i64(cpu_ir[rc], clz64(lit));
|
||||
} else {
|
||||
gen_helper_ctlz(cpu_ir[rc], cpu_ir[rb]);
|
||||
}
|
||||
}
|
||||
vb = load_gpr_lit(ctx, rb, lit, islit);
|
||||
gen_helper_ctlz(vc, vb);
|
||||
break;
|
||||
case 0x33:
|
||||
/* CTTZ */
|
||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_CIX);
|
||||
REQUIRE_REG_31(ra);
|
||||
if (likely(rc != 31)) {
|
||||
if (islit) {
|
||||
tcg_gen_movi_i64(cpu_ir[rc], ctz64(lit));
|
||||
} else {
|
||||
gen_helper_cttz(cpu_ir[rc], cpu_ir[rb]);
|
||||
}
|
||||
}
|
||||
vb = load_gpr_lit(ctx, rb, lit, islit);
|
||||
gen_helper_cttz(vc, vb);
|
||||
break;
|
||||
case 0x34:
|
||||
/* UNPKBW */
|
||||
@ -2968,30 +2945,18 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
|
||||
/* FTOIT */
|
||||
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_FIX);
|
||||
REQUIRE_REG_31(rb);
|
||||
if (likely(rc != 31)) {
|
||||
if (ra != 31) {
|
||||
tcg_gen_mov_i64(cpu_ir[rc], cpu_fir[ra]);
|
||||
} else {
|
||||
tcg_gen_movi_i64(cpu_ir[rc], 0);
|
||||
}
|
||||
}
|
||||
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);
|
||||
if (rc != 31) {
|
||||
TCGv_i32 tmp1 = tcg_temp_new_i32();
|
||||
if (ra != 31) {
|
||||
gen_helper_s_to_memory(tmp1, cpu_fir[ra]);
|
||||
} else {
|
||||
TCGv tmp2 = tcg_const_i64(0);
|
||||
gen_helper_s_to_memory(tmp1, tmp2);
|
||||
tcg_temp_free(tmp2);
|
||||
}
|
||||
tcg_gen_ext_i32_i64(cpu_ir[rc], tmp1);
|
||||
tcg_temp_free_i32(tmp1);
|
||||
}
|
||||
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;
|
||||
default:
|
||||
goto invalid_opc;
|
||||
|
Loading…
Reference in New Issue
Block a user