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]> --- include/tcg/tcg-op-common.h | 2 -- include/tcg/tcg-op-def.h.inc | 1 + tcg/tcg-op-ldst.c | 54 ------------------------------------ tcg/tcg-op.c | 13 +++++++++ 4 files changed, 14 insertions(+), 56 deletions(-) diff --git a/include/tcg/tcg-op-common.h b/include/tcg/tcg-op-common.h index ce9b5243911..7fad859a284 100644 --- a/include/tcg/tcg-op-common.h +++ b/include/tcg/tcg-op-common.h @@ -143,7 +143,6 @@ void tcg_gen_addcio_i32(TCGv_i32 r, TCGv_i32 co, void tcg_gen_mulu2_i32(TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 arg1, TCGv_i32 arg2); void tcg_gen_muls2_i32(TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 arg1, TCGv_i32 arg2); void tcg_gen_mulsu2_i32(TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 arg1, TCGv_i32 arg2); -void tcg_gen_ext_i32(TCGv_i32 ret, TCGv_i32 val, MemOp opc); void tcg_gen_bswap16_i32(TCGv_i32 ret, TCGv_i32 arg, int flags); void tcg_gen_bswap32_i32(TCGv_i32 ret, TCGv_i32 arg); void tcg_gen_hswap_i32(TCGv_i32 ret, TCGv_i32 arg); @@ -185,7 +184,6 @@ void tcg_gen_muls2_i64(TCGv_i64 rl, TCGv_i64 rh, TCGv_i64 arg1, TCGv_i64 arg2); void tcg_gen_mulsu2_i64(TCGv_i64 rl, TCGv_i64 rh, TCGv_i64 arg1, TCGv_i64 arg2); void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg); void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg); -void tcg_gen_ext_i64(TCGv_i64 ret, TCGv_i64 val, MemOp opc); void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg, int flags); void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg, int flags); void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg); diff --git a/include/tcg/tcg-op-def.h.inc b/include/tcg/tcg-op-def.h.inc index dfad7288bb4..c31c819ebdc 100644 --- a/include/tcg/tcg-op-def.h.inc +++ b/include/tcg/tcg-op-def.h.inc @@ -18,6 +18,7 @@ DEF4(deposit_z, TCGV, TCGV, unsigned, unsigned) DEF1(discard, TCGV) DEF3(div, TCGV, TCGV, TCGV) DEF3(divu, TCGV, TCGV, TCGV) +DEF3(ext, TCGV, TCGV, MemOp) DEF2(ext8s, TCGV, TCGV) DEF2(ext8u, TCGV, TCGV) DEF2(ext16s, TCGV, TCGV) 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 5c103bb8e4a..90accdb7714 100644 --- a/tcg/tcg-op.c +++ b/tcg/tcg-op.c @@ -361,6 +361,7 @@ void tcg_gen_plugin_mem_cb(TCGv_i64 addr, unsigned meminfo) #define C_TCGv_i64 tcgv_i64_temp #define C_int32_t #define C_int64_t +#define C_MemOp #define C_TCGCond #define C_TCGLabelPtr #define C_unsigned @@ -391,6 +392,7 @@ void tcg_gen_plugin_mem_cb(TCGv_i64 addr, unsigned meminfo) #undef C_TCGv_i64 #undef C_int32_t #undef C_int64_t +#undef C_MemOp #undef C_TCGCond #undef C_TCGLabelPtr #undef C_unsigned @@ -694,6 +696,17 @@ static void gen_eqv(TCGType type, TCGTemp *dst, TCGTemp *src1, TCGTemp *src2) } } +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); + } +} + static void gen_ext8s(TCGType type, TCGTemp *dst, TCGTemp *src) { gen_sextract(type, dst, src, 0, 8); -- 2.53.0
