Commit 4187b64f5a for qemu.org
commit 4187b64f5a86b91e08b78288718779d74fe11660
Author: Richard Henderson <richard.henderson@linaro.org>
Date: Fri Aug 28 07:05:31 2026 -0700
tcg/x86_64: Implement INDEX_op_lea
Reviewed-by: Matt Turner <mattst88@gmail.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
diff --git a/tcg/x86_64/tcg-target-con-set.h b/tcg/x86_64/tcg-target-con-set.h
index 7df9bf4917..2529539f89 100644
--- a/tcg/x86_64/tcg-target-con-set.h
+++ b/tcg/x86_64/tcg-target-con-set.h
@@ -47,6 +47,7 @@ C_O1_I2(r, r, r)
C_O1_I2(r, r, re)
C_O1_I2(r, r, ri)
C_O1_I2(r, rO, re)
+C_O1_I2(r, rz, r)
C_O1_I2(x, x, x)
C_N1_I2(r, r, r)
C_N1_I2(r, r, rW)
diff --git a/tcg/x86_64/tcg-target-has.h b/tcg/x86_64/tcg-target-has.h
index 6ffae51f92..f1d3d256ee 100644
--- a/tcg/x86_64/tcg-target-has.h
+++ b/tcg/x86_64/tcg-target-has.h
@@ -105,7 +105,7 @@ tcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len)
}
#define TCG_TARGET_extract_valid tcg_target_extract_valid
-#define TCG_TARGET_lea_sh_valid(type, sh) 0
-#define TCG_TARGET_lea_imm_valid(type, imm) 0
+#define TCG_TARGET_lea_sh_valid(type, sh) ((sh) <= 3)
+#define TCG_TARGET_lea_imm_valid(type, imm) ((imm) == (int32_t)(imm))
#endif
diff --git a/tcg/x86_64/tcg-target.c.inc b/tcg/x86_64/tcg-target.c.inc
index d85e95a32b..3fca0693e2 100644
--- a/tcg/x86_64/tcg-target.c.inc
+++ b/tcg/x86_64/tcg-target.c.inc
@@ -3361,8 +3361,17 @@ static const TCGOutOpStore outop_st = {
.out_i = tgen_st_i,
};
+static void tgen_lea(TCGContext *s, TCGType type, TCGReg a0, TCGReg a1,
+ TCGReg a2, unsigned sh, tcg_target_long imm)
+{
+ int rexw = type == TCG_TYPE_I32 ? 0 : P_REXW;
+ tcg_out_modrm_sib_offset(s, OPC_LEA + rexw, a0, a1, a2, sh, imm);
+}
+
static const TCGOutOpLea outop_lea = {
- .base.static_constraint = C_NotImplemented,
+ /* Allow "lea imm(, a2, sh), a0" via TCG_REG_ZERO constraint */
+ .base.static_constraint = C_O1_I2(r, rz, r),
+ .out = tgen_lea,
};
static int const umin_insn[4] = {
diff --git a/tcg/x86_64/tcg-target.h b/tcg/x86_64/tcg-target.h
index 7109722f24..3444bcdca0 100644
--- a/tcg/x86_64/tcg-target.h
+++ b/tcg/x86_64/tcg-target.h
@@ -80,4 +80,6 @@ typedef enum {
TCG_REG_CALL_STACK = TCG_REG_ESP
} TCGReg;
+#define TCG_REG_ZERO TCG_REG_NONE
+
#endif