On 6/26/21 8:36 AM, Richard Henderson wrote: > Merge tcg_out_bswap16 and tcg_out_bswap16s. Use the flags > in the internal uses for loads and stores. > > Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org> > Signed-off-by: Richard Henderson <richard.hender...@linaro.org> > --- > tcg/mips/tcg-target.c.inc | 63 +++++++++++++++++++-------------------- > 1 file changed, 30 insertions(+), 33 deletions(-)
> -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); > + > + /* With arg = abcd: */ > 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(); > + tcg_out_opc_reg(s, OPC_WSBH, ret, 0, arg); /* badc */ > + if (flags & TCG_BSWAP_OS) { > + tcg_out_opc_reg(s, OPC_SEH, ret, 0, ret); /* ssdc */ > + } else if ((flags & (TCG_BSWAP_IZ | TCG_BSWAP_OZ)) == TCG_BSWAP_OZ) { > + tcg_out_opc_imm(s, OPC_ANDI, ret, ret, 0xffff); /* 00dc */ > } > - > - 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); > + tcg_out_opc_sa(s, OPC_SRL, TCG_TMP0, arg, 8); /* 0abc */ > + if (!(flags & TCG_BSWAP_IZ)) { > + tcg_out_opc_imm(s, OPC_ANDI, TCG_TMP0, TCG_TMP0, 0x00ff); /* 000c */ > + } > + if (flags & TCG_BSWAP_OS) { > + tcg_out_opc_sa(s, OPC_SLL, ret, arg, 24); /* d000 */ > + tcg_out_opc_sa(s, OPC_SRA, ret, ret, 16); /* ssd0 */ > } else { > - /* ret and arg can't be register at */ > - if (ret == TCG_TMP0 || arg == TCG_TMP0) { > - tcg_abort(); > + tcg_out_opc_sa(s, OPC_SLL, ret, arg, 8); /* bcd0 */ > + if (flags & TCG_BSWAP_OZ) { > + tcg_out_opc_imm(s, OPC_ANDI, ret, ret, 0xff00); /* 00d0 */ > } > - > - tcg_out_opc_sa(s, OPC_SRL, TCG_TMP0, arg, 8); > - 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); > } > + tcg_out_opc_reg(s, OPC_OR, ret, ret, TCG_TMP0); /* ssdc */ > } Thanks for adding the comments!