On Wed, Oct 21, 2026 at 10:26 AM Richard Henderson <[email protected]> wrote: > > Signed-off-by: Richard Henderson <[email protected]> > --- > include/tcg/tcg-op-common.h | 2 - > tcg/tcg-internal.h | 6 ++ > include/tcg/tcg-op-def.h.inc | 1 + > tcg/tcg-op.c | 120 ++++++++++------------------------- > 4 files changed, 41 insertions(+), 88 deletions(-) > > diff --git a/include/tcg/tcg-op-common.h b/include/tcg/tcg-op-common.h > index 9f5cae36c5..8f8560023a 100644 > --- a/include/tcg/tcg-op-common.h > +++ b/include/tcg/tcg-op-common.h > @@ -133,7 +133,6 @@ void tcg_gen_plugin_mem_cb(TCGv_i64 addr, unsigned > meminfo); > /* 32 bit ops */ > > void tcg_gen_mulsu2_i32(TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 arg1, TCGv_i32 > arg2); > -void tcg_gen_bswap16_i32(TCGv_i32 ret, TCGv_i32 arg, unsigned flags); > void tcg_gen_bswap32_i32(TCGv_i32 ret, TCGv_i32 arg); > void tcg_gen_hswap_i32(TCGv_i32 ret, TCGv_i32 arg); > void tcg_gen_revbit8_i32(TCGv_i32 ret, TCGv_i32 arg); > @@ -158,7 +157,6 @@ void tcg_gen_addN_i64(int n, TCGv_i64 *r, TCGv_i64 *a, > TCGv_i64 *b); > 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_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg, unsigned flags); > void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg, unsigned flags); > void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg); > void tcg_gen_hswap_i64(TCGv_i64 ret, TCGv_i64 arg); > diff --git a/tcg/tcg-internal.h b/tcg/tcg-internal.h > index 09899cb309..d6ea11d8fc 100644 > --- a/tcg/tcg-internal.h > +++ b/tcg/tcg-internal.h > @@ -108,6 +108,12 @@ static inline void tcg_gen_op_tt(TCGOpcode opc, TCGType > type, > tcg_gen_op2(opc, type, temp_arg(t0), temp_arg(t1)); > } > > +static inline void tcg_gen_op_tti(TCGOpcode opc, TCGType type, > + TCGTemp *t0, TCGTemp *t1, TCGArg a2) > +{ > + tcg_gen_op3(opc, type, temp_arg(t0), temp_arg(t1), a2); > +} > + > static inline void tcg_gen_op_ttt(TCGOpcode opc, TCGType type, > TCGTemp *t0, TCGTemp *t1, TCGTemp *t2) > { > diff --git a/include/tcg/tcg-op-def.h.inc b/include/tcg/tcg-op-def.h.inc > index b606aaab12..2ebcf4a066 100644 > --- a/include/tcg/tcg-op-def.h.inc > +++ b/include/tcg/tcg-op-def.h.inc > @@ -11,6 +11,7 @@ DEF3(andi, TCGV, TCGV, TINT) > DEF3(andc, TCGV, TCGV, TCGV) > DEF4(brcond, TCGCond, TCGV, TCGV, TCGLabelPtr) > DEF4(brcondi, TCGCond, TCGV, TINT, TCGLabelPtr) > +DEF3(bswap16, TCGV, TCGV, unsigned) > DEF2(clrsb, TCGV, TCGV) > DEF3(clz, TCGV, TCGV, TCGV) > DEF3(clzi, TCGV, TCGV, TINT) > diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c > index c3a8a04a4d..f1a79dc921 100644 > --- a/tcg/tcg-op.c > +++ b/tcg/tcg-op.c > @@ -425,6 +425,40 @@ void tcg_gen_brcondi(TCGType type, TCGCond cond, TCGTemp > *src1, > tcg_gen_brcond(type, cond, src1, tcg_constant_internal(type, src2), l); > } > > +void tcg_gen_bswap16(TCGType type, TCGTemp *dst, TCGTemp *src, unsigned > flags) > +{ > + /* Only one extension flag may be present. */ > + tcg_debug_assert(!(flags & TCG_BSWAP_OS) || !(flags & TCG_BSWAP_OZ)); > + > + if (tcg_op_supported(INDEX_op_bswap16, type, 0)) { > + tcg_gen_op_tti(INDEX_op_bswap16, type, dst, src, flags); > + } else { > + g_autoptr(TCGTemp) t0 = tcg_temp_new_ebb(type); > + g_autoptr(TCGTemp) t1 = tcg_temp_new_ebb(type); > + int width = tcg_type_bits(type); > + > + if (flags & TCG_BSWAP_IZ) { /* t0 = ...a */ > + tcg_gen_shri(type, t0, src, 8); > + } else { > + tcg_gen_extract(type, t0, src, 8, 8); > + } > + > + if (flags & TCG_BSWAP_OS) { > + tcg_gen_shli(type, t1, src, width - 8); /* t1 = b... */ > + tcg_gen_sari(type, t1, t1, width - 16); /* t1 = ssb. */ > + } else if (flags & TCG_BSWAP_OZ) { > + tcg_gen_ext8u(type, t1, src); /* t1 = ...b */ > + tcg_gen_shli(type, t1, t1, 8); /* t1 = ..b. */ > + } else { > + tcg_gen_shli(type, t1, src, 8); /* t1 = xab. */ > + } > + > + tcg_gen_or(type, dst, t0, t1); /* ret = ..ba (OZ) */ > + /* = ssba (OS) */ > + /* = xaba (0) */ > + } > +} > + > void tcg_gen_clrsb(TCGType type, TCGTemp *dst, TCGTemp *src) > { > if (tcg_op_supported(INDEX_op_clz, TCG_TYPE_REG, 0)) { > @@ -1294,49 +1328,6 @@ static void gen_bitswap_i64(TCGv_i64 ret, TCGv_i64 > arg, uint64_t mask) > tcg_temp_free_i64(t1); > } > > -/* > - * bswap16_i32: 16-bit byte swap on the low bits of a 32-bit value. > - * > - * Byte pattern: xxab -> yyba > - * > - * With TCG_BSWAP_IZ, x == zero, else undefined. > - * With TCG_BSWAP_OZ, y == zero, with TCG_BSWAP_OS y == sign, else undefined. > - */ > -void tcg_gen_bswap16_i32(TCGv_i32 ret, TCGv_i32 arg, unsigned flags) > -{ > - /* Only one extension flag may be present. */ > - tcg_debug_assert(!(flags & TCG_BSWAP_OS) || !(flags & TCG_BSWAP_OZ)); > - > - if (tcg_op_supported(INDEX_op_bswap16, TCG_TYPE_I32, 0)) { > - tcg_gen_op3i_i32(INDEX_op_bswap16, ret, arg, flags); > - } else { > - TCGv_i32 t0 = tcg_temp_ebb_new_i32(); > - TCGv_i32 t1 = tcg_temp_ebb_new_i32(); > - > - /* arg = ..ab (IZ) xxab (!IZ) */ > - tcg_gen_shri_i32(t0, arg, 8); /* t0 = ...a (IZ) .xxa (!IZ) */ > - if (!(flags & TCG_BSWAP_IZ)) { > - tcg_gen_ext8u_i32(t0, t0); /* t0 = ...a */ > - } > - > - if (flags & TCG_BSWAP_OS) { > - tcg_gen_shli_i32(t1, arg, 24); /* t1 = b... */ > - tcg_gen_sari_i32(t1, t1, 16); /* t1 = ssb. */ > - } else if (flags & TCG_BSWAP_OZ) { > - tcg_gen_ext8u_i32(t1, arg); /* t1 = ...b */ > - tcg_gen_shli_i32(t1, t1, 8); /* t1 = ..b. */ > - } else { > - tcg_gen_shli_i32(t1, arg, 8); /* t1 = xab. */ > - } > - > - tcg_gen_or_i32(ret, t0, t1); /* ret = ..ba (OZ) */ > - /* = ssba (OS) */ > - /* = xaba (no flag) */ > - tcg_temp_free_i32(t0); > - tcg_temp_free_i32(t1); > - } > -} > - > /* > * bswap32_i32: 32-bit byte swap on a 32-bit value. > * > @@ -1495,49 +1486,6 @@ void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg) > tcg_gen_extract_i64(ret, arg, 0, 32); > } > > -/* > - * bswap16_i64: 16-bit byte swap on the low bits of a 64-bit value. > - * > - * Byte pattern: xxxxxxxxab -> yyyyyyyyba > - * > - * With TCG_BSWAP_IZ, x == zero, else undefined. > - * With TCG_BSWAP_OZ, y == zero, with TCG_BSWAP_OS y == sign, else undefined. > - */
We're dropping this comment. Dunno if you want to keep it in the refactor.
