mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 17:23:56 -06:00
tcg: Convert bswap64 to TCGOutOpUnary
Use TCGOutOpUnary instead of TCGOutOpBswap because the flags are not used with this opcode; they are merely present for uniformity with the smaller bswaps. Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
7498d882cb
commit
613b571c93
23 changed files with 144 additions and 104 deletions
|
@ -710,19 +710,6 @@ static void tcg_out_bswap_subr(TCGContext *s, const tcg_insn_unit *sub)
|
|||
}
|
||||
}
|
||||
|
||||
static void tcg_out_bswap64(TCGContext *s, TCGReg ret, TCGReg arg)
|
||||
{
|
||||
if (use_mips32r2_instructions) {
|
||||
tcg_out_opc_reg(s, OPC_DSBH, ret, 0, arg);
|
||||
tcg_out_opc_reg(s, OPC_DSHD, ret, 0, ret);
|
||||
} else {
|
||||
tcg_out_bswap_subr(s, bswap64_addr);
|
||||
/* delay slot -- never omit the insn, like tcg_out_mov might. */
|
||||
tcg_out_opc_reg(s, OPC_OR, TCG_TMP0, arg, TCG_REG_ZERO);
|
||||
tcg_out_mov(s, TCG_TYPE_I32, ret, TCG_TMP3);
|
||||
}
|
||||
}
|
||||
|
||||
static void tcg_out_ext32u(TCGContext *s, TCGReg ret, TCGReg arg)
|
||||
{
|
||||
tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
|
||||
|
@ -2176,6 +2163,26 @@ static const TCGOutOpBswap outop_bswap32 = {
|
|||
.out_rr = tgen_bswap32,
|
||||
};
|
||||
|
||||
#if TCG_TARGET_REG_BITS == 64
|
||||
static void tgen_bswap64(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg)
|
||||
{
|
||||
if (use_mips32r2_instructions) {
|
||||
tcg_out_opc_reg(s, OPC_DSBH, ret, 0, arg);
|
||||
tcg_out_opc_reg(s, OPC_DSHD, ret, 0, ret);
|
||||
} else {
|
||||
tcg_out_bswap_subr(s, bswap64_addr);
|
||||
/* delay slot -- never omit the insn, like tcg_out_mov might. */
|
||||
tcg_out_opc_reg(s, OPC_OR, TCG_TMP0, arg, TCG_REG_ZERO);
|
||||
tcg_out_mov(s, TCG_TYPE_I32, ret, TCG_TMP3);
|
||||
}
|
||||
}
|
||||
|
||||
static const TCGOutOpUnary outop_bswap64 = {
|
||||
.base.static_constraint = C_O1_I1(r, r),
|
||||
.out_rr = tgen_bswap64,
|
||||
};
|
||||
#endif /* TCG_TARGET_REG_BITS == 64 */
|
||||
|
||||
static void tgen_neg(TCGContext *s, TCGType type, TCGReg a0, TCGReg a1)
|
||||
{
|
||||
tgen_sub(s, type, a0, TCG_REG_ZERO, a1);
|
||||
|
@ -2267,9 +2274,6 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
|
|||
tcg_out_ldst(s, i1, a0, a1, a2);
|
||||
break;
|
||||
|
||||
case INDEX_op_bswap64_i64:
|
||||
tcg_out_bswap64(s, a0, a1);
|
||||
break;
|
||||
case INDEX_op_extrh_i64_i32:
|
||||
tcg_out_dsra(s, a0, a1, 32);
|
||||
break;
|
||||
|
@ -2380,7 +2384,6 @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
|
|||
case INDEX_op_ld32s_i64:
|
||||
case INDEX_op_ld32u_i64:
|
||||
case INDEX_op_ld_i64:
|
||||
case INDEX_op_bswap64_i64:
|
||||
case INDEX_op_ext_i32_i64:
|
||||
case INDEX_op_extu_i32_i64:
|
||||
case INDEX_op_extrl_i64_i32:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue