target-alpha: Convert opcode 0x1C to source/sink

Signed-off-by: Richard Henderson <rth@twiddle.net>
master
Richard Henderson 2014-03-19 09:20:37 -07:00
parent 1eaa1da7e4
commit c67b67e511
1 changed files with 19 additions and 54 deletions

View File

@ -2833,43 +2833,30 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
#else #else
goto invalid_opc; goto invalid_opc;
#endif #endif
case 0x1C: case 0x1C:
vc = dest_gpr(ctx, rc);
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);
if (likely(rc != 31)) { vb = load_gpr_lit(ctx, rb, lit, islit);
if (islit) { tcg_gen_ext8s_i64(vc, vb);
tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int8_t)lit));
} else {
tcg_gen_ext8s_i64(cpu_ir[rc], cpu_ir[rb]);
}
}
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);
if (likely(rc != 31)) { vb = load_gpr_lit(ctx, rb, lit, islit);
if (islit) { tcg_gen_ext16s_i64(vc, vb);
tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int16_t)lit));
} else {
tcg_gen_ext16s_i64(cpu_ir[rc], cpu_ir[rb]);
}
}
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);
if (likely(rc != 31)) { vb = load_gpr_lit(ctx, rb, lit, islit);
if (islit) { gen_helper_ctpop(vc, vb);
tcg_gen_movi_i64(cpu_ir[rc], ctpop64(lit));
} else {
gen_helper_ctpop(cpu_ir[rc], cpu_ir[rb]);
}
}
break; break;
case 0x31: case 0x31:
/* PERR */ /* PERR */
@ -2880,25 +2867,15 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
/* CTLZ */ /* CTLZ */
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_CIX); REQUIRE_TB_FLAG(TB_FLAGS_AMASK_CIX);
REQUIRE_REG_31(ra); REQUIRE_REG_31(ra);
if (likely(rc != 31)) { vb = load_gpr_lit(ctx, rb, lit, islit);
if (islit) { gen_helper_ctlz(vc, vb);
tcg_gen_movi_i64(cpu_ir[rc], clz64(lit));
} else {
gen_helper_ctlz(cpu_ir[rc], cpu_ir[rb]);
}
}
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);
if (likely(rc != 31)) { vb = load_gpr_lit(ctx, rb, lit, islit);
if (islit) { gen_helper_cttz(vc, vb);
tcg_gen_movi_i64(cpu_ir[rc], ctz64(lit));
} else {
gen_helper_cttz(cpu_ir[rc], cpu_ir[rb]);
}
}
break; break;
case 0x34: case 0x34:
/* UNPKBW */ /* UNPKBW */
@ -2968,30 +2945,18 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
/* FTOIT */ /* FTOIT */
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_FIX); REQUIRE_TB_FLAG(TB_FLAGS_AMASK_FIX);
REQUIRE_REG_31(rb); REQUIRE_REG_31(rb);
if (likely(rc != 31)) { va = load_fpr(ctx, ra);
if (ra != 31) { tcg_gen_mov_i64(vc, va);
tcg_gen_mov_i64(cpu_ir[rc], cpu_fir[ra]);
} else {
tcg_gen_movi_i64(cpu_ir[rc], 0);
}
}
break; break;
case 0x78: case 0x78:
/* FTOIS */ /* FTOIS */
REQUIRE_TB_FLAG(TB_FLAGS_AMASK_FIX); REQUIRE_TB_FLAG(TB_FLAGS_AMASK_FIX);
REQUIRE_REG_31(rb); REQUIRE_REG_31(rb);
if (rc != 31) { t32 = tcg_temp_new_i32();
TCGv_i32 tmp1 = tcg_temp_new_i32(); va = load_fpr(ctx, ra);
if (ra != 31) { gen_helper_s_to_memory(t32, va);
gen_helper_s_to_memory(tmp1, cpu_fir[ra]); tcg_gen_ext_i32_i64(vc, t32);
} else { tcg_temp_free_i32(t32);
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);
}
break; break;
default: default:
goto invalid_opc; goto invalid_opc;