Signed-off-by: Tomek Grabiec <tgrab...@gmail.com> --- arch/x86/emit-code.c | 79 +++++++++++++++++++++++++++-------- arch/x86/include/arch/stack-frame.h | 2 +- test/arch-x86/Makefile | 1 + 3 files changed, 63 insertions(+), 19 deletions(-)
diff --git a/arch/x86/emit-code.c b/arch/x86/emit-code.c index 58322f7..3732b17 100644 --- a/arch/x86/emit-code.c +++ b/arch/x86/emit-code.c @@ -24,6 +24,7 @@ #include "vm/method.h" #include "vm/object.h" +#include "arch/init.h" #include "arch/instruction.h" #include "arch/memory.h" #include "arch/stack-frame.h" @@ -66,6 +67,9 @@ static void emit_restore_regs(struct buffer *buf); static void __emit_mov_xmm_membase(struct buffer *buf, enum machine_reg src, enum machine_reg base, unsigned long offs); static void __emit_mov_membase_xmm(struct buffer *buf, enum machine_reg base, unsigned long offs, enum machine_reg dst); +static void __emit_mov_64_xmm_membase(struct buffer *buf, enum machine_reg src, + enum machine_reg base, unsigned long offs); +static void __emit_mov_64_membase_xmm(struct buffer *buf, enum machine_reg base, unsigned long offs, enum machine_reg dst); /************************ * Common code emitters * @@ -1045,15 +1049,26 @@ void emit_prolog(struct buffer *buf, unsigned long nr_locals) __emit_push_reg(buf, MACH_REG_ESI); __emit_push_reg(buf, MACH_REG_EBX); - __emit_sub_imm_reg(buf, 4 * 8, MACH_REG_ESP); - __emit_mov_xmm_membase(buf, MACH_REG_XMM0, MACH_REG_ESP, 0); - __emit_mov_xmm_membase(buf, MACH_REG_XMM1, MACH_REG_ESP, 4); - __emit_mov_xmm_membase(buf, MACH_REG_XMM2, MACH_REG_ESP, 8); - __emit_mov_xmm_membase(buf, MACH_REG_XMM3, MACH_REG_ESP, 12); - __emit_mov_xmm_membase(buf, MACH_REG_XMM4, MACH_REG_ESP, 16); - __emit_mov_xmm_membase(buf, MACH_REG_XMM5, MACH_REG_ESP, 20); - __emit_mov_xmm_membase(buf, MACH_REG_XMM6, MACH_REG_ESP, 24); - __emit_mov_xmm_membase(buf, MACH_REG_XMM7, MACH_REG_ESP, 28); + __emit_sub_imm_reg(buf, 8 * 8, MACH_REG_ESP); + if (cpu_has(X86_FEATURE_SSE2)) { + __emit_mov_64_xmm_membase(buf, MACH_REG_XMM0, MACH_REG_ESP, 0); + __emit_mov_64_xmm_membase(buf, MACH_REG_XMM1, MACH_REG_ESP, 8); + __emit_mov_64_xmm_membase(buf, MACH_REG_XMM2, MACH_REG_ESP, 16); + __emit_mov_64_xmm_membase(buf, MACH_REG_XMM3, MACH_REG_ESP, 24); + __emit_mov_64_xmm_membase(buf, MACH_REG_XMM4, MACH_REG_ESP, 32); + __emit_mov_64_xmm_membase(buf, MACH_REG_XMM5, MACH_REG_ESP, 40); + __emit_mov_64_xmm_membase(buf, MACH_REG_XMM6, MACH_REG_ESP, 48); + __emit_mov_64_xmm_membase(buf, MACH_REG_XMM7, MACH_REG_ESP, 56); + } else { + __emit_mov_xmm_membase(buf, MACH_REG_XMM0, MACH_REG_ESP, 0); + __emit_mov_xmm_membase(buf, MACH_REG_XMM1, MACH_REG_ESP, 8); + __emit_mov_xmm_membase(buf, MACH_REG_XMM2, MACH_REG_ESP, 16); + __emit_mov_xmm_membase(buf, MACH_REG_XMM3, MACH_REG_ESP, 24); + __emit_mov_xmm_membase(buf, MACH_REG_XMM4, MACH_REG_ESP, 32); + __emit_mov_xmm_membase(buf, MACH_REG_XMM5, MACH_REG_ESP, 40); + __emit_mov_xmm_membase(buf, MACH_REG_XMM6, MACH_REG_ESP, 48); + __emit_mov_xmm_membase(buf, MACH_REG_XMM7, MACH_REG_ESP, 56); + } __emit_push_reg(buf, MACH_REG_EBP); __emit_mov_reg_reg(buf, MACH_REG_ESP, MACH_REG_EBP); @@ -1101,15 +1116,26 @@ static void emit_push_imm(struct buffer *buf, struct operand *operand) static void emit_restore_regs(struct buffer *buf) { - __emit_mov_membase_xmm(buf, MACH_REG_ESP, 0, MACH_REG_XMM0); - __emit_mov_membase_xmm(buf, MACH_REG_ESP, 4, MACH_REG_XMM1); - __emit_mov_membase_xmm(buf, MACH_REG_ESP, 8, MACH_REG_XMM2); - __emit_mov_membase_xmm(buf, MACH_REG_ESP, 12, MACH_REG_XMM3); - __emit_mov_membase_xmm(buf, MACH_REG_ESP, 16, MACH_REG_XMM4); - __emit_mov_membase_xmm(buf, MACH_REG_ESP, 20, MACH_REG_XMM5); - __emit_mov_membase_xmm(buf, MACH_REG_ESP, 24, MACH_REG_XMM6); - __emit_mov_membase_xmm(buf, MACH_REG_ESP, 28, MACH_REG_XMM7); - __emit_add_imm_reg(buf, 4 * 8, MACH_REG_ESP); + if (cpu_has(X86_FEATURE_SSE2)) { + __emit_mov_64_membase_xmm(buf, MACH_REG_ESP, 0, MACH_REG_XMM0); + __emit_mov_64_membase_xmm(buf, MACH_REG_ESP, 8, MACH_REG_XMM1); + __emit_mov_64_membase_xmm(buf, MACH_REG_ESP, 16, MACH_REG_XMM2); + __emit_mov_64_membase_xmm(buf, MACH_REG_ESP, 24, MACH_REG_XMM3); + __emit_mov_64_membase_xmm(buf, MACH_REG_ESP, 32, MACH_REG_XMM4); + __emit_mov_64_membase_xmm(buf, MACH_REG_ESP, 40, MACH_REG_XMM5); + __emit_mov_64_membase_xmm(buf, MACH_REG_ESP, 48, MACH_REG_XMM6); + __emit_mov_64_membase_xmm(buf, MACH_REG_ESP, 56, MACH_REG_XMM7); + } else { + __emit_mov_membase_xmm(buf, MACH_REG_ESP, 0, MACH_REG_XMM0); + __emit_mov_membase_xmm(buf, MACH_REG_ESP, 8, MACH_REG_XMM1); + __emit_mov_membase_xmm(buf, MACH_REG_ESP, 16, MACH_REG_XMM2); + __emit_mov_membase_xmm(buf, MACH_REG_ESP, 24, MACH_REG_XMM3); + __emit_mov_membase_xmm(buf, MACH_REG_ESP, 32, MACH_REG_XMM4); + __emit_mov_membase_xmm(buf, MACH_REG_ESP, 40, MACH_REG_XMM5); + __emit_mov_membase_xmm(buf, MACH_REG_ESP, 48, MACH_REG_XMM6); + __emit_mov_membase_xmm(buf, MACH_REG_ESP, 56, MACH_REG_XMM7); + } + __emit_add_imm_reg(buf, 8 * 8, MACH_REG_ESP); __emit_pop_reg(buf, MACH_REG_EBX); __emit_pop_reg(buf, MACH_REG_ESI); @@ -1625,6 +1651,23 @@ static void __emit_mov_membase_xmm(struct buffer *buf, enum machine_reg base, __emit_membase_reg(buf, 0x10, base, offs, dst); } +static void __emit_mov_64_xmm_membase(struct buffer *buf, enum machine_reg src, + enum machine_reg base, unsigned long offs) +{ + emit(buf, 0xf2); + emit(buf, 0x0f); + __emit_membase_reg(buf, 0x11, base, offs, src); + +} + +static void __emit_mov_64_membase_xmm(struct buffer *buf, enum machine_reg base, + unsigned long offs, enum machine_reg dst) +{ + emit(buf, 0xf2); + emit(buf, 0x0f); + __emit_membase_reg(buf, 0x10, base, offs, dst); +} + static void emit_mov_64_memindex_xmm(struct buffer *buf, struct operand *src, struct operand *dest) { diff --git a/arch/x86/include/arch/stack-frame.h b/arch/x86/include/arch/stack-frame.h index ac75c73..b0b42a2 100644 --- a/arch/x86/include/arch/stack-frame.h +++ b/arch/x86/include/arch/stack-frame.h @@ -18,7 +18,7 @@ struct native_stack_frame { struct jit_stack_frame { void *prev; /* previous stack frame link */ - unsigned long xmm[8]; + unsigned long long xmm[8]; unsigned long old_ebx; unsigned long old_esi; unsigned long old_edi; diff --git a/test/arch-x86/Makefile b/test/arch-x86/Makefile index eb387cb..5329f18 100644 --- a/test/arch-x86/Makefile +++ b/test/arch-x86/Makefile @@ -13,6 +13,7 @@ TOPLEVEL_OBJS := \ arch/x86/backtrace.o \ arch/x86/emit-code.o \ arch/x86/exception.o \ + arch/x86/init.o \ arch/x86/insn-selector.o \ arch/x86/registers$(ARCH_POSTFIX).o \ arch/x86/instruction.o \ -- 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