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