Signed-off-by: Tomek Grabiec <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel