These functions cannot be shared between x86-32 and x86-64 code due to different calling conventions. They generate code that calls functions and, on x86-64, we need to pass arguments in registers.
Signed-off-by: Eduard - Gabriel Munteanu <eduard.munte...@linux360.ro> --- arch/x86/emit-code.c | 124 +++++++++++++++++++++++++------------------------- 1 files changed, 62 insertions(+), 62 deletions(-) diff --git a/arch/x86/emit-code.c b/arch/x86/emit-code.c index f20a0f0..96746b5 100644 --- a/arch/x86/emit-code.c +++ b/arch/x86/emit-code.c @@ -280,68 +280,6 @@ static void emit_jmp_branch(struct buffer *buf, struct basic_block *bb, struct i __emit_branch(buf, bb, 0x00, 0xe9, insn); } -void emit_lock(struct buffer *buf, struct vm_object *obj) -{ - __emit_push_imm(buf, (unsigned long)obj); - __emit_call(buf, vm_object_lock); - __emit_add_imm_reg(buf, PTR_SIZE, MACH_REG_xSP); - - __emit_push_reg(buf, MACH_REG_xAX); - emit_exception_test(buf, MACH_REG_xAX); - __emit_pop_reg(buf, MACH_REG_xAX); -} - -void emit_unlock(struct buffer *buf, struct vm_object *obj) -{ - /* Save caller-saved registers which contain method's return value */ - __emit_push_reg(buf, MACH_REG_xAX); - __emit_push_reg(buf, MACH_REG_xDX); - - __emit_push_imm(buf, (unsigned long)obj); - __emit_call(buf, vm_object_unlock); - __emit_add_imm_reg(buf, PTR_SIZE, MACH_REG_xSP); - - emit_exception_test(buf, MACH_REG_xAX); - - __emit_pop_reg(buf, MACH_REG_xDX); - __emit_pop_reg(buf, MACH_REG_xAX); -} - -void emit_lock_this(struct buffer *buf) -{ - unsigned long this_arg_offset; - - this_arg_offset = offsetof(struct jit_stack_frame, args); - - __emit_push_membase(buf, MACH_REG_xBP, this_arg_offset); - __emit_call(buf, vm_object_lock); - __emit_add_imm_reg(buf, PTR_SIZE, MACH_REG_xSP); - - __emit_push_reg(buf, MACH_REG_xAX); - emit_exception_test(buf, MACH_REG_xAX); - __emit_pop_reg(buf, MACH_REG_xAX); -} - -void emit_unlock_this(struct buffer *buf) -{ - unsigned long this_arg_offset; - - this_arg_offset = offsetof(struct jit_stack_frame, args); - - /* Save caller-saved registers which contain method's return value */ - __emit_push_reg(buf, MACH_REG_xAX); - __emit_push_reg(buf, MACH_REG_xDX); - - __emit_push_membase(buf, MACH_REG_xBP, this_arg_offset); - __emit_call(buf, vm_object_unlock); - __emit_add_imm_reg(buf, PTR_SIZE, MACH_REG_xSP); - - emit_exception_test(buf, MACH_REG_xAX); - - __emit_pop_reg(buf, MACH_REG_xDX); - __emit_pop_reg(buf, MACH_REG_xAX); -} - void backpatch_branch_target(struct buffer *buf, struct insn *insn, unsigned long target_offset) @@ -1957,6 +1895,68 @@ void emit_trampoline(struct compilation_unit *cu, jit_text_unlock(); } +void emit_lock(struct buffer *buf, struct vm_object *obj) +{ + __emit_push_imm(buf, (unsigned long)obj); + __emit_call(buf, vm_object_lock); + __emit_add_imm_reg(buf, PTR_SIZE, MACH_REG_xSP); + + __emit_push_reg(buf, MACH_REG_EAX); + emit_exception_test(buf, MACH_REG_EAX); + __emit_pop_reg(buf, MACH_REG_EAX); +} + +void emit_unlock(struct buffer *buf, struct vm_object *obj) +{ + /* Save caller-saved registers which contain method's return value */ + __emit_push_reg(buf, MACH_REG_EAX); + __emit_push_reg(buf, MACH_REG_EDX); + + __emit_push_imm(buf, (unsigned long)obj); + __emit_call(buf, vm_object_unlock); + __emit_add_imm_reg(buf, PTR_SIZE, MACH_REG_ESP); + + emit_exception_test(buf, MACH_REG_EAX); + + __emit_pop_reg(buf, MACH_REG_EDX); + __emit_pop_reg(buf, MACH_REG_EAX); +} + +void emit_lock_this(struct buffer *buf) +{ + unsigned long this_arg_offset; + + this_arg_offset = offsetof(struct jit_stack_frame, args); + + __emit_push_membase(buf, MACH_REG_EBP, this_arg_offset); + __emit_call(buf, vm_object_lock); + __emit_add_imm_reg(buf, PTR_SIZE, MACH_REG_ESP); + + __emit_push_reg(buf, MACH_REG_EAX); + emit_exception_test(buf, MACH_REG_EAX); + __emit_pop_reg(buf, MACH_REG_EAX); +} + +void emit_unlock_this(struct buffer *buf) +{ + unsigned long this_arg_offset; + + this_arg_offset = offsetof(struct jit_stack_frame, args); + + /* Save caller-saved registers which contain method's return value */ + __emit_push_reg(buf, MACH_REG_EAX); + __emit_push_reg(buf, MACH_REG_EDX); + + __emit_push_membase(buf, MACH_REG_EBP, this_arg_offset); + __emit_call(buf, vm_object_unlock); + __emit_add_imm_reg(buf, PTR_SIZE, MACH_REG_ESP); + + emit_exception_test(buf, MACH_REG_EAX); + + __emit_pop_reg(buf, MACH_REG_EDX); + __emit_pop_reg(buf, MACH_REG_EAX); +} + static void fixup_branch_target(uint8_t *target_p, void *target) { long cur = (long) (target - (void *) target_p) - 4; -- 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