On 9/20/21 1:04 AM, WANG Xuerui wrote:
+ case INDEX_op_bswap32_i32: + tcg_out_opc_revb_2h(s, a0, a1); + tcg_out_opc_rotri_w(s, a0, a0, 16); + break; + case INDEX_op_bswap64_i64: + tcg_out_opc_revb_d(s, a0, a1); + break;
You're missing INDEX_op_bswap32_i64, which in addition has a third argument consisting of TCG_BSWAP_* bits.
I would have expected revb_2w to be the preferred implementation of bswap32. I would expect something like
case INDEX_op_bswap32_i32: /* All 32-bit values are computed sign-extended in the register. */ a2 = TCG_BSWAP_OS; /* fall through */ case INDEX_op_bswap32_i64: tcg_out_opc_revb_2w(s, a0, a1); if (a2 & TCG_BSWAP_OS) { tcg_out_ext32s(s, a0, a0); } else if (a2 & TCG_BSWAP_OZ) { tcg_out_ext32u(s, a0, a0); } break; r~