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 <[email protected]>
> ---
> 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é <[email protected]>