Hi Richard, On 6/14/21 10:37 AM, Richard Henderson wrote: > Merge tcg_out_bswap16 and tcg_out_bswap16s. Use the flags > in the internal uses for loads and stores. > > Signed-off-by: Richard Henderson <richard.hender...@linaro.org> > --- > tcg/mips/tcg-target.c.inc | 60 ++++++++++++++++++--------------------- > 1 file changed, 28 insertions(+), 32 deletions(-) > > diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc > index 5944448b2a..7a5634419c 100644 > --- a/tcg/mips/tcg-target.c.inc > +++ b/tcg/mips/tcg-target.c.inc > @@ -540,39 +540,36 @@ static void tcg_out_movi(TCGContext *s, TCGType type, > } > } > > -static inline void tcg_out_bswap16(TCGContext *s, TCGReg ret, TCGReg arg) > +static void tcg_out_bswap16(TCGContext *s, TCGReg ret, TCGReg arg, int flags) > { > + /* ret and arg can't be register tmp0 */ > + tcg_debug_assert(ret != TCG_TMP0); > + tcg_debug_assert(arg != TCG_TMP0); > + > if (use_mips32r2_instructions) { > tcg_out_opc_reg(s, OPC_WSBH, ret, 0, arg); > - } else { > - /* ret and arg can't be register at */ > - if (ret == TCG_TMP0 || arg == TCG_TMP0) { > - tcg_abort(); > + if (flags & TCG_BSWAP_OS) { > + tcg_out_opc_reg(s, OPC_SEH, ret, 0, ret); > + } else if ((flags & (TCG_BSWAP_IZ | TCG_BSWAP_OZ)) == TCG_BSWAP_OZ) { > + tcg_out_opc_imm(s, OPC_ANDI, ret, ret, 0xffff); > } > - > - tcg_out_opc_sa(s, OPC_SRL, TCG_TMP0, arg, 8); > - tcg_out_opc_sa(s, OPC_SLL, ret, arg, 8); > - tcg_out_opc_imm(s, OPC_ANDI, ret, ret, 0xff00); > - tcg_out_opc_reg(s, OPC_OR, ret, ret, TCG_TMP0); > + return; > } > -} > > -static inline void tcg_out_bswap16s(TCGContext *s, TCGReg ret, TCGReg arg) > -{ > - if (use_mips32r2_instructions) { > - tcg_out_opc_reg(s, OPC_WSBH, ret, 0, arg); > - tcg_out_opc_reg(s, OPC_SEH, ret, 0, ret); > - } else { > - /* ret and arg can't be register at */ > - if (ret == TCG_TMP0 || arg == TCG_TMP0) { > - tcg_abort(); > - } > - > - tcg_out_opc_sa(s, OPC_SRL, TCG_TMP0, arg, 8); > + tcg_out_opc_sa(s, OPC_SRL, TCG_TMP0, arg, 8); > + if (!(flags & TCG_BSWAP_IZ)) { > + tcg_out_opc_imm(s, OPC_ANDI, TCG_TMP0, TCG_TMP0, 0x00ff); > + } > + if (flags & TCG_BSWAP_OS) { > tcg_out_opc_sa(s, OPC_SLL, ret, arg, 24); > tcg_out_opc_sa(s, OPC_SRA, ret, ret, 16); > - tcg_out_opc_reg(s, OPC_OR, ret, ret, TCG_TMP0); > + } else { > + tcg_out_opc_sa(s, OPC_SLL, ret, arg, 8); > + if (flags & TCG_BSWAP_OZ) { > + tcg_out_opc_imm(s, OPC_ANDI, ret, ret, 0xff00); > + } > } > + tcg_out_opc_reg(s, OPC_OR, ret, ret, TCG_TMP0); > }
Do you mind including the comments (after reviewing them ;) )? static void tcg_out_bswap16(TCGContext *s, TCGReg ret, TCGReg arg, int flags) { /* ret and arg can't be register tmp0 */ tcg_debug_assert(ret != TCG_TMP0); tcg_debug_assert(arg != TCG_TMP0); /* src = abcd efgh */ if (use_mips32r2_instructions) { tcg_out_opc_reg(s, OPC_WSBH, ret, 0, arg); /* ret = cdab ghef */ if (flags & TCG_BSWAP_OS) { tcg_out_opc_reg(s, OPC_SEH, ret, 0, ret); /* ret = ssss ghef */ } else if ((flags & (TCG_BSWAP_IZ | TCG_BSWAP_OZ)) == TCG_BSWAP_OZ) { tcg_out_opc_imm(s, OPC_ANDI, ret, ret, 0xffff); /* ret = 0000 ghef */ } return; } tcg_out_opc_sa(s, OPC_SRL, TCG_TMP0, arg, 8); /* t0 = ssab cdef */ if (!(flags & TCG_BSWAP_IZ)) { /* t0 = 0000 00ef */ tcg_out_opc_imm(s, OPC_ANDI, TCG_TMP0, TCG_TMP0, 0x00ff); } if (flags & TCG_BSWAP_OS) { tcg_out_opc_sa(s, OPC_SLL, ret, arg, 24); /* ret = gh.. .... */ tcg_out_opc_sa(s, OPC_SRA, ret, ret, 16); /* ret = ssss gh.. */ } else { tcg_out_opc_sa(s, OPC_SLL, ret, arg, 8); /* ret = cdef gh.. */ if (flags & TCG_BSWAP_OZ) { /* ret = 0000 gh.. */ tcg_out_opc_imm(s, OPC_ANDI, ret, ret, 0xff00); } } tcg_out_opc_reg(s, OPC_OR, ret, ret, TCG_TMP0); /* OZ: ret = 0000 ghef */ /* OS: ret = ssss ghef */ } Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org>