Signed-off-by: Vegard Nossum <[email protected]>
---
arch/x86/emit-code.c | 23 +++++++++++++++++++++++
arch/x86/include/arch/instruction.h | 2 ++
arch/x86/instruction.c | 10 ++++++++++
arch/x86/use-def.c | 1 +
4 files changed, 36 insertions(+), 0 deletions(-)
diff --git a/arch/x86/emit-code.c b/arch/x86/emit-code.c
index 91fcf2b..887c716 100644
--- a/arch/x86/emit-code.c
+++ b/arch/x86/emit-code.c
@@ -1050,6 +1050,28 @@ static void emit_sbb_reg_reg(struct buffer *buf, struct
operand *src,
emit_reg_reg(buf, 0x19, src, dest);
}
+static void __emit_test_imm_memdisp(struct buffer *buf,
+ long imm, long disp)
+{
+ /* XXX: Supports only byte or long imms */
+
+ if (is_imm_8(imm))
+ emit(buf, 0xf6);
+ else
+ emit(buf, 0xf7);
+
+ emit(buf, 0x04);
+ emit(buf, 0x25);
+ emit_imm32(buf, disp);
+ emit_imm(buf, imm);
+}
+
+static void emit_test_imm_memdisp(struct buffer *buf,
+ struct operand *imm, struct operand *disp)
+{
+ __emit_test_imm_memdisp(buf, imm->imm, disp->imm);
+}
+
void emit_prolog(struct buffer *buf, unsigned long nr_locals)
{
/* Unconditionally push callee-saved registers */
@@ -1812,6 +1834,7 @@ struct emitter emitters[] = {
DECL_EMITTER(INSN_SUB_IMM_REG, emit_sub_imm_reg, TWO_OPERANDS),
DECL_EMITTER(INSN_SUB_MEMBASE_REG, emit_sub_membase_reg, TWO_OPERANDS),
DECL_EMITTER(INSN_SUB_REG_REG, emit_sub_reg_reg, TWO_OPERANDS),
+ DECL_EMITTER(INSN_TEST_IMM_MEMDISP, emit_test_imm_memdisp,
TWO_OPERANDS),
DECL_EMITTER(INSN_TEST_MEMBASE_REG, emit_test_membase_reg,
TWO_OPERANDS),
DECL_EMITTER(INSN_XOR_MEMBASE_REG, emit_xor_membase_reg, TWO_OPERANDS),
DECL_EMITTER(INSN_XOR_IMM_REG, emit_xor_imm_reg, TWO_OPERANDS),
diff --git a/arch/x86/include/arch/instruction.h
b/arch/x86/include/arch/instruction.h
index 9140484..2ee8787 100644
--- a/arch/x86/include/arch/instruction.h
+++ b/arch/x86/include/arch/instruction.h
@@ -165,6 +165,7 @@ enum insn_type {
INSN_SUB_IMM_REG,
INSN_SUB_MEMBASE_REG,
INSN_SUB_REG_REG,
+ INSN_TEST_IMM_MEMDISP,
INSN_TEST_MEMBASE_REG,
INSN_XOR_MEMBASE_REG,
INSN_XOR_IMM_REG,
@@ -221,6 +222,7 @@ struct insn *reg_reg_insn(enum insn_type, struct var_info
*, struct var_info *);
struct insn *imm_reg_insn(enum insn_type, unsigned long, struct var_info *);
struct insn *memdisp_reg_insn(enum insn_type, unsigned long, struct var_info
*);
struct insn *reg_memdisp_insn(enum insn_type, struct var_info *, unsigned
long);
+struct insn *imm_memdisp_insn(enum insn_type, long, long);
struct insn *imm_membase_insn(enum insn_type, unsigned long, struct var_info
*, long);
struct insn *imm_insn(enum insn_type, unsigned long);
struct insn *rel_insn(enum insn_type, unsigned long);
diff --git a/arch/x86/instruction.c b/arch/x86/instruction.c
index f6ffe20..720dfec 100644
--- a/arch/x86/instruction.c
+++ b/arch/x86/instruction.c
@@ -280,6 +280,16 @@ struct insn *reg_memdisp_insn(enum insn_type insn_type,
return insn;
}
+struct insn *imm_memdisp_insn(enum insn_type insn_type, long imm, long disp)
+{
+ struct insn *insn = alloc_insn(insn_type);
+ if (insn) {
+ init_imm_operand(insn, 0, imm);
+ init_imm_operand(insn, 1, imm);
+ }
+ return insn;
+}
+
struct insn *imm_membase_insn(enum insn_type insn_type, unsigned long imm,
struct var_info *base_reg, long disp)
{
diff --git a/arch/x86/use-def.c b/arch/x86/use-def.c
index 86218b7..02baea2 100644
--- a/arch/x86/use-def.c
+++ b/arch/x86/use-def.c
@@ -148,6 +148,7 @@ static struct insn_info insn_infos[] = {
DECLARE_INFO(INSN_SUB_IMM_REG, USE_DST | DEF_DST),
DECLARE_INFO(INSN_SUB_MEMBASE_REG, USE_SRC | USE_DST | DEF_DST),
DECLARE_INFO(INSN_SUB_REG_REG, USE_SRC | USE_DST | DEF_DST),
+ DECLARE_INFO(INSN_TEST_IMM_MEMDISP, USE_NONE | DEF_NONE),
DECLARE_INFO(INSN_TEST_MEMBASE_REG, USE_SRC | USE_DST | DEF_NONE),
DECLARE_INFO(INSN_XOR_MEMBASE_REG, USE_SRC | USE_DST | DEF_DST),
DECLARE_INFO(INSN_XOR_IMM_REG, USE_SRC | USE_DST | DEF_DST),
--
1.6.0.6
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Jatovm-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel