On 8/20/25 04:21, Kohei Tokunaga wrote:
+static void tcg_wasm_out_bswap64( + TCGContext *s, TCGReg dest, TCGReg src) +{ + tcg_wasm_out_op_idx(s, OPC_GLOBAL_GET, REG_IDX(src)); + tcg_wasm_out_op_const(s, OPC_I64_CONST, 32); + tcg_wasm_out_op(s, OPC_I64_ROTR); + tcg_wasm_out_op_idx(s, OPC_LOCAL_SET, TMP64_LOCAL_0_IDX); + + tcg_wasm_out_op_idx(s, OPC_LOCAL_GET, TMP64_LOCAL_0_IDX); + tcg_wasm_out_op_const(s, OPC_I64_CONST, 0xff000000ff000000); + tcg_wasm_out_op(s, OPC_I64_AND); + tcg_wasm_out_op_const(s, OPC_I64_CONST, 24); + tcg_wasm_out_op(s, OPC_I64_SHR_U); + + tcg_wasm_out_op_idx(s, OPC_LOCAL_GET, TMP64_LOCAL_0_IDX); + tcg_wasm_out_op_const(s, OPC_I64_CONST, 0x00ff000000ff0000); + tcg_wasm_out_op(s, OPC_I64_AND); + tcg_wasm_out_op_const(s, OPC_I64_CONST, 8); + tcg_wasm_out_op(s, OPC_I64_SHR_U); + + tcg_wasm_out_op(s, OPC_I64_OR); + + tcg_wasm_out_op_idx(s, OPC_LOCAL_GET, TMP64_LOCAL_0_IDX); + tcg_wasm_out_op_const(s, OPC_I64_CONST, 0x0000ff000000ff00); + tcg_wasm_out_op(s, OPC_I64_AND); + tcg_wasm_out_op_const(s, OPC_I64_CONST, 8); + tcg_wasm_out_op(s, OPC_I64_SHL); + + tcg_wasm_out_op_idx(s, OPC_LOCAL_GET, TMP64_LOCAL_0_IDX); + tcg_wasm_out_op_const(s, OPC_I64_CONST, 0x000000ff000000ff); + tcg_wasm_out_op(s, OPC_I64_AND); + tcg_wasm_out_op_const(s, OPC_I64_CONST, 24); + tcg_wasm_out_op(s, OPC_I64_SHL); + + tcg_wasm_out_op(s, OPC_I64_OR); + + tcg_wasm_out_op(s, OPC_I64_OR); + tcg_wasm_out_op_idx(s, OPC_GLOBAL_SET, REG_IDX(dest)); +}
Is this any better than the default expansion? r~