Move from tcg-op-ldst.c and compute the width of the extract instead of using a switch.
Signed-off-by: Richard Henderson <[email protected]> --- tcg/tcg-op-ldst.c | 54 ----------------------------------------------- tcg/tcg-op.c | 21 ++++++++++++++++++ 2 files changed, 21 insertions(+), 54 deletions(-) diff --git a/tcg/tcg-op-ldst.c b/tcg/tcg-op-ldst.c index 22211ccb452..031c5ce926b 100644 --- a/tcg/tcg-op-ldst.c +++ b/tcg/tcg-op-ldst.c @@ -760,60 +760,6 @@ void tcg_gen_qemu_st_i128_chk(TCGv_i128 val, TCGTemp *addr, TCGArg idx, tcg_gen_qemu_st_i128_int(val, addr, idx, memop); } -void tcg_gen_ext_i32(TCGv_i32 ret, TCGv_i32 val, MemOp opc) -{ - switch (opc & MO_SSIZE) { - case MO_SB: - tcg_gen_ext8s_i32(ret, val); - break; - case MO_UB: - tcg_gen_ext8u_i32(ret, val); - break; - case MO_SW: - tcg_gen_ext16s_i32(ret, val); - break; - case MO_UW: - tcg_gen_ext16u_i32(ret, val); - break; - case MO_UL: - case MO_SL: - tcg_gen_mov_i32(ret, val); - break; - default: - g_assert_not_reached(); - } -} - -void tcg_gen_ext_i64(TCGv_i64 ret, TCGv_i64 val, MemOp opc) -{ - switch (opc & MO_SSIZE) { - case MO_SB: - tcg_gen_ext8s_i64(ret, val); - break; - case MO_UB: - tcg_gen_ext8u_i64(ret, val); - break; - case MO_SW: - tcg_gen_ext16s_i64(ret, val); - break; - case MO_UW: - tcg_gen_ext16u_i64(ret, val); - break; - case MO_SL: - tcg_gen_ext32s_i64(ret, val); - break; - case MO_UL: - tcg_gen_ext32u_i64(ret, val); - break; - case MO_UQ: - case MO_SQ: - tcg_gen_mov_i64(ret, val); - break; - default: - g_assert_not_reached(); - } -} - typedef void (*gen_atomic_cx_i32)(TCGv_i32, TCGv_env, TCGv_i64, TCGv_i32, TCGv_i32, TCGv_i32); typedef void (*gen_atomic_cx_i64)(TCGv_i64, TCGv_env, TCGv_i64, diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c index f0ab8e643d8..5c6e3a75224 100644 --- a/tcg/tcg-op.c +++ b/tcg/tcg-op.c @@ -1186,6 +1186,17 @@ static void gen_xori(TCGType type, TCGTemp *dst, TCGTemp *src1, int64_t src2) #undef DEF_RRUU #undef DEF_RRRUU +static void gen_ext(TCGType type, TCGTemp *dst, TCGTemp *src, MemOp mop) +{ + unsigned width = memop_size(mop) * 8; + + if (mop & MO_SIGN) { + gen_sextract(type, dst, src, 0, width); + } else { + gen_extract(type, dst, src, 0, width); + } +} + /* 32 bit ops */ /* @@ -1207,6 +1218,16 @@ void tcg_gen_extract2_i32(TCGv_i32 ret, TCGv_i32 al, TCGv_i32 ah, } } +void tcg_gen_ext_i32(TCGv_i32 dst, TCGv_i32 src, MemOp mop) +{ + gen_ext(TCG_TYPE_I32, tcgv_i32_temp(dst), tcgv_i32_temp(src), mop); +} + +void tcg_gen_ext_i64(TCGv_i64 dst, TCGv_i64 src, MemOp mop) +{ + gen_ext(TCG_TYPE_I64, tcgv_i64_temp(dst), tcgv_i64_temp(src), mop); +} + void tcg_gen_add2_i32(TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 al, TCGv_i32 ah, TCGv_i32 bl, TCGv_i32 bh) { -- 2.53.0
