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

Reply via email to