mirror of https://github.com/xemu-project/xemu.git
tcg: Introduce tcg_out_xchg
We will want a backend interface for register swapping. This is only properly defined for x86; all others get a stub version that always indicates failure. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
b3dfd5fc18
commit
767c250310
|
@ -1106,6 +1106,11 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
|
|||
tcg_out_insn(s, 3305, LDR, 0, rd);
|
||||
}
|
||||
|
||||
static bool tcg_out_xchg(TCGContext *s, TCGType type, TCGReg r1, TCGReg r2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
|
||||
tcg_target_long imm)
|
||||
{
|
||||
|
|
|
@ -2607,6 +2607,11 @@ static void tcg_out_movi(TCGContext *s, TCGType type,
|
|||
tcg_out_movi32(s, COND_AL, ret, arg);
|
||||
}
|
||||
|
||||
static bool tcg_out_xchg(TCGContext *s, TCGType type, TCGReg r1, TCGReg r2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
|
||||
tcg_target_long imm)
|
||||
{
|
||||
|
|
|
@ -460,6 +460,7 @@ static bool tcg_target_const_match(int64_t val, TCGType type, int ct)
|
|||
#define OPC_VPTERNLOGQ (0x25 | P_EXT3A | P_DATA16 | P_VEXW | P_EVEX)
|
||||
#define OPC_VZEROUPPER (0x77 | P_EXT)
|
||||
#define OPC_XCHG_ax_r32 (0x90)
|
||||
#define OPC_XCHG_EvGv (0x87)
|
||||
|
||||
#define OPC_GRP3_Eb (0xf6)
|
||||
#define OPC_GRP3_Ev (0xf7)
|
||||
|
@ -1078,6 +1079,13 @@ static void tcg_out_movi(TCGContext *s, TCGType type,
|
|||
}
|
||||
}
|
||||
|
||||
static bool tcg_out_xchg(TCGContext *s, TCGType type, TCGReg r1, TCGReg r2)
|
||||
{
|
||||
int rexw = type == TCG_TYPE_I32 ? 0 : P_REXW;
|
||||
tcg_out_modrm(s, OPC_XCHG_EvGv + rexw, r1, r2);
|
||||
return true;
|
||||
}
|
||||
|
||||
static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
|
||||
tcg_target_long imm)
|
||||
{
|
||||
|
|
|
@ -419,6 +419,11 @@ static void tcg_out_addi(TCGContext *s, TCGType type, TCGReg rd,
|
|||
}
|
||||
}
|
||||
|
||||
static bool tcg_out_xchg(TCGContext *s, TCGType type, TCGReg r1, TCGReg r2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
|
||||
tcg_target_long imm)
|
||||
{
|
||||
|
|
|
@ -595,6 +595,11 @@ static void tcg_out_extrl_i64_i32(TCGContext *s, TCGReg rd, TCGReg rs)
|
|||
tcg_out_ext32s(s, rd, rs);
|
||||
}
|
||||
|
||||
static bool tcg_out_xchg(TCGContext *s, TCGType type, TCGReg r1, TCGReg r2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
|
||||
tcg_target_long imm)
|
||||
{
|
||||
|
|
|
@ -1154,6 +1154,11 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg ret,
|
|||
}
|
||||
}
|
||||
|
||||
static bool tcg_out_xchg(TCGContext *s, TCGType type, TCGReg r1, TCGReg r2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
|
||||
tcg_target_long imm)
|
||||
{
|
||||
|
|
|
@ -561,6 +561,11 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
|
|||
tcg_out_opc_imm(s, OPC_LD, rd, rd, 0);
|
||||
}
|
||||
|
||||
static bool tcg_out_xchg(TCGContext *s, TCGType type, TCGReg r1, TCGReg r2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
|
||||
tcg_target_long imm)
|
||||
{
|
||||
|
|
|
@ -1076,6 +1076,11 @@ static inline bool tcg_out_sti(TCGContext *s, TCGType type, TCGArg val,
|
|||
return false;
|
||||
}
|
||||
|
||||
static bool tcg_out_xchg(TCGContext *s, TCGType type, TCGReg r1, TCGReg r2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
|
||||
tcg_target_long imm)
|
||||
{
|
||||
|
|
|
@ -542,6 +542,11 @@ static void tcg_out_extrl_i64_i32(TCGContext *s, TCGReg rd, TCGReg rs)
|
|||
tcg_out_mov(s, TCG_TYPE_I32, rd, rs);
|
||||
}
|
||||
|
||||
static bool tcg_out_xchg(TCGContext *s, TCGType type, TCGReg r1, TCGReg r2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
|
||||
tcg_target_long imm)
|
||||
{
|
||||
|
|
|
@ -115,6 +115,8 @@ static void tcg_out_exts_i32_i64(TCGContext *s, TCGReg ret, TCGReg arg);
|
|||
static void tcg_out_extu_i32_i64(TCGContext *s, TCGReg ret, TCGReg arg);
|
||||
static void tcg_out_extrl_i64_i32(TCGContext *s, TCGReg ret, TCGReg arg);
|
||||
static void tcg_out_addi_ptr(TCGContext *s, TCGReg, TCGReg, tcg_target_long);
|
||||
static bool tcg_out_xchg(TCGContext *s, TCGType type, TCGReg r1, TCGReg r2)
|
||||
__attribute__((unused));
|
||||
static void tcg_out_exit_tb(TCGContext *s, uintptr_t arg);
|
||||
static void tcg_out_goto_tb(TCGContext *s, int which);
|
||||
static void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||
|
|
|
@ -645,6 +645,11 @@ static void tcg_out_extrl_i64_i32(TCGContext *s, TCGReg rd, TCGReg rs)
|
|||
tcg_out_mov(s, TCG_TYPE_I32, rd, rs);
|
||||
}
|
||||
|
||||
static bool tcg_out_xchg(TCGContext *s, TCGType type, TCGReg r1, TCGReg r2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
|
||||
tcg_target_long imm)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue