it will be used to implement tableswitch.

Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 arch/x86/emit-code.c                |    9 +++++++++
 arch/x86/include/arch/instruction.h |    2 ++
 arch/x86/instruction.c              |   12 ++++++++++++
 arch/x86/lir-printer.c              |    7 +++++++
 4 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/arch/x86/emit-code.c b/arch/x86/emit-code.c
index 2afd1fb..f6f59c2 100644
--- a/arch/x86/emit-code.c
+++ b/arch/x86/emit-code.c
@@ -1377,6 +1377,14 @@ static void emit_mov_xmm_membase(struct buffer *buf, 
struct operand *src,
        emit_membase_reg(buf, 0x11, dest, src);
 }
 
+static void emit_jmp_memindex(struct buffer *buf, struct operand *target)
+{
+       emit(buf, 0xff);
+       emit(buf, encode_modrm(0x00, 0x04, 0x04));
+       emit(buf, encode_sib(target->shift, encode_reg(&target->index_reg),
+                            encode_reg(&target->base_reg)));
+}
+
 struct emitter emitters[] = {
        GENERIC_X86_EMITTERS,
        DECL_EMITTER(INSN_ADC_IMM_REG, emit_adc_imm_reg, TWO_OPERANDS),
@@ -1402,6 +1410,7 @@ struct emitter emitters[] = {
        DECL_EMITTER(INSN_FSTP_MEMBASE, emit_fstp_membase, TWO_OPERANDS),
        DECL_EMITTER(INSN_CONV_GPR_TO_FPU, emit_conv_gpr_to_fpu, TWO_OPERANDS),
        DECL_EMITTER(INSN_CONV_FPU_TO_GPR, emit_conv_fpu_to_gpr, TWO_OPERANDS),
+       DECL_EMITTER(INSN_JMP_MEMINDEX, emit_jmp_memindex, SINGLE_OPERAND),
        DECL_EMITTER(INSN_MOV_MEMBASE_XMM, emit_mov_membase_xmm, TWO_OPERANDS),
        DECL_EMITTER(INSN_MOV_XMM_MEMBASE, emit_mov_xmm_membase, TWO_OPERANDS),
        DECL_EMITTER(INSN_MOV_IMM_MEMBASE, emit_mov_imm_membase, TWO_OPERANDS),
diff --git a/arch/x86/include/arch/instruction.h 
b/arch/x86/include/arch/instruction.h
index 13c8540..9cb35ac 100644
--- a/arch/x86/include/arch/instruction.h
+++ b/arch/x86/include/arch/instruction.h
@@ -86,6 +86,7 @@ enum insn_type {
        INSN_JG_BRANCH,
        INSN_JLE_BRANCH,
        INSN_JL_BRANCH,
+       INSN_JMP_MEMINDEX,
        INSN_JMP_BRANCH,
        INSN_JNE_BRANCH,
        INSN_MOV_IMM_MEMBASE,
@@ -169,6 +170,7 @@ static inline unsigned long lir_position(struct 
use_position *reg)
 struct insn *insn(enum insn_type);
 struct insn *memlocal_reg_insn(enum insn_type, struct stack_slot *, struct 
var_info *);
 struct insn *membase_reg_insn(enum insn_type, struct var_info *, long, struct 
var_info *);
+struct insn *memindex_insn(enum insn_type, struct var_info *, struct var_info 
*, unsigned char);
 struct insn *memindex_reg_insn(enum insn_type, struct var_info *, struct 
var_info *, unsigned char, struct var_info *);
 struct insn *reg_memindex_insn(enum insn_type, struct var_info *, struct 
var_info *, struct var_info *, unsigned char);
 struct insn *reg_membase_insn(enum insn_type, struct var_info *, struct 
var_info *, long);
diff --git a/arch/x86/instruction.c b/arch/x86/instruction.c
index 7e798f5..f6ffe20 100644
--- a/arch/x86/instruction.c
+++ b/arch/x86/instruction.c
@@ -187,6 +187,18 @@ struct insn *membase_reg_insn(enum insn_type insn_type, 
struct var_info *src_bas
        return insn;
 }
 
+struct insn *memindex_insn(enum insn_type insn_type,
+                          struct var_info *src_base_reg,
+                          struct var_info *src_index_reg,
+                          unsigned char src_shift)
+{
+       struct insn *insn = alloc_insn(insn_type);
+       if (insn) {
+               init_memindex_operand(insn, 0, src_base_reg, src_index_reg, 
src_shift);
+       }
+       return insn;
+}
+
 struct insn *memindex_reg_insn(enum insn_type insn_type,
                               struct var_info *src_base_reg, struct var_info 
*src_index_reg,
                               unsigned char src_shift, struct var_info 
*dest_reg)
diff --git a/arch/x86/lir-printer.c b/arch/x86/lir-printer.c
index 1af6759..a9bcaff 100644
--- a/arch/x86/lir-printer.c
+++ b/arch/x86/lir-printer.c
@@ -408,6 +408,12 @@ static int print_jmp_branch(struct string *str, struct 
insn *insn)
        return print_branch(str, &insn->operand);
 }
 
+static int print_jmp_memindex(struct string *str, struct insn *insn)
+{
+       print_func_name(str);
+       return print_memindex(str, &insn->operand);
+}
+
 static int print_jne_branch(struct string *str, struct insn *insn)
 {
        print_func_name(str);
@@ -739,6 +745,7 @@ static print_insn_fn insn_printers[] = {
        [INSN_JLE_BRANCH] = print_jle_branch,
        [INSN_JL_BRANCH] = print_jl_branch,
        [INSN_JMP_BRANCH] = print_jmp_branch,
+       [INSN_JMP_MEMINDEX] = print_jmp_memindex,
        [INSN_JNE_BRANCH] = print_jne_branch,
        [INSN_MOV_IMM_MEMBASE] = print_mov_imm_membase,
        [INSN_MOV_IMM_REG] = print_mov_imm_reg,
-- 
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
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to