Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 arch/x86/include/arch/registers.h    |   14 +++++++++++++-
 arch/x86/include/arch/registers_32.h |    3 +++
 arch/x86/include/arch/registers_64.h |   12 ++++++++++++
 arch/x86/use-def.c                   |   27 +++++++++++++++++++++++++--
 jit/compilation-unit.c               |    6 +++++-
 jit/compiler.c                       |    2 ++
 6 files changed, 60 insertions(+), 4 deletions(-)

diff --git a/arch/x86/include/arch/registers.h 
b/arch/x86/include/arch/registers.h
index d00b0fd..9398dd7 100644
--- a/arch/x86/include/arch/registers.h
+++ b/arch/x86/include/arch/registers.h
@@ -1,5 +1,17 @@
+#ifndef __JATO_ARCH_REGISTERS
+#define __JATO_ARCH_REGISTERS
+
+#include <stdbool.h>
+
 #ifdef CONFIG_X86_32
 # include "registers_32.h"
 #else
 # include "registers_64.h"
-#endif
+#endif /* CONFIG_X86_32 */
+
+static inline bool is_fpu_register(enum machine_reg reg)
+{
+       return reg > MACH_REG_XMM0 && reg < NR_REGISTERS;
+}
+
+#endif /* __JATO_ARCH_REGISTERS */
diff --git a/arch/x86/include/arch/registers_32.h 
b/arch/x86/include/arch/registers_32.h
index 05df975..30e852a 100644
--- a/arch/x86/include/arch/registers_32.h
+++ b/arch/x86/include/arch/registers_32.h
@@ -14,6 +14,8 @@ enum machine_reg {
        MACH_REG_ESI,
        MACH_REG_EDI,
 
+       /* All registers from this up to NR_REGISTERS must be FPU
+          registers. It's needed for is_fpu_register(). */
        MACH_REG_XMM0,
        MACH_REG_XMM1,
        MACH_REG_XMM2,
@@ -46,6 +48,7 @@ enum machine_reg {
 };
 
 #define GPR_VM_TYPE    J_INT
+#define FPU_VM_TYPE    J_DOUBLE
 
 const char *reg_name(enum machine_reg reg);
 enum machine_reg_type reg_type(enum machine_reg reg);
diff --git a/arch/x86/include/arch/registers_64.h 
b/arch/x86/include/arch/registers_64.h
index d3330e3..6fdf23b 100644
--- a/arch/x86/include/arch/registers_64.h
+++ b/arch/x86/include/arch/registers_64.h
@@ -20,6 +20,17 @@ enum machine_reg {
        MACH_REG_R14,
        MACH_REG_R15,
 
+       /* All registers from this up to NR_REGISTERS must be FPU
+          registers. It's needed for is_fpu_register(). */
+       MACH_REG_XMM0,
+       MACH_REG_XMM1,
+       MACH_REG_XMM2,
+       MACH_REG_XMM3,
+       MACH_REG_XMM4,
+       MACH_REG_XMM5,
+       MACH_REG_XMM6,
+       MACH_REG_XMM7,
+
        /* The above registers are available for register allocator.  */
        NR_REGISTERS,
 
@@ -43,6 +54,7 @@ enum machine_reg {
 };
 
 #define GPR_VM_TYPE    J_LONG
+#define FPU_VM_TYPE    J_DOUBLE
 
 const char *reg_name(enum machine_reg reg);
 enum machine_reg_type reg_type(enum machine_reg reg);
diff --git a/arch/x86/use-def.c b/arch/x86/use-def.c
index 68cc940..b4c515c 100644
--- a/arch/x86/use-def.c
+++ b/arch/x86/use-def.c
@@ -23,14 +23,29 @@ enum {
        USE_SRC         = 1024,
        USE_FP          = 2048, /* frame pointer */
 
+       DEF_XMM0        = 1ul << 12,
+       DEF_XMM1        = 1ul << 13,
+       DEF_XMM2        = 1ul << 14,
+       DEF_XMM3        = 1ul << 15,
+       DEF_XMM4        = 1ul << 16,
+       DEF_XMM5        = 1ul << 17,
+       DEF_XMM6        = 1ul << 18,
+       DEF_XMM7        = 1ul << 19,
+
 #ifdef CONFIG_X86_32
        DEF_EAX         = DEF_xAX,
        DEF_ECX         = DEF_xCX,
        DEF_EDX         = DEF_xDX,
+       DEF_XMM0_XMM7   = DEF_XMM0 | DEF_XMM1 | DEF_XMM2 | DEF_XMM3 |
+                         DEF_XMM4 | DEF_XMM5 | DEF_XMM6 | DEF_XMM7,
+       DEF_CALLER_SAVED= DEF_xAX | DEF_xCX | DEF_xDX | DEF_XMM0_XMM7,
 #else
        DEF_RAX         = DEF_xAX,
        DEF_RCX         = DEF_xCX,
        DEF_RDX         = DEF_xDX,
+
+       /* XXX: This is not correct ABI */
+       DEF_CALLER_SAVED= DEF_xAX | DEF_xCX | DEF_xDX,
 #endif
 };
 
@@ -49,8 +64,8 @@ static struct insn_info insn_infos[] = {
        DECLARE_INFO(INSN_ADD_REG_REG, USE_SRC | USE_DST | DEF_DST),
        DECLARE_INFO(INSN_AND_MEMBASE_REG, USE_SRC | USE_DST | DEF_DST),
        DECLARE_INFO(INSN_AND_REG_REG, USE_SRC | USE_DST | DEF_DST),
-       DECLARE_INFO(INSN_CALL_REG, USE_SRC | DEF_xAX | DEF_xCX | DEF_xDX),
-       DECLARE_INFO(INSN_CALL_REL, USE_NONE | DEF_xAX | DEF_xCX | DEF_xDX),
+       DECLARE_INFO(INSN_CALL_REG, USE_SRC | DEF_CALLER_SAVED),
+       DECLARE_INFO(INSN_CALL_REL, USE_NONE | DEF_CALLER_SAVED),
        DECLARE_INFO(INSN_CLTD_REG_REG, USE_SRC | DEF_SRC | DEF_DST),
        DECLARE_INFO(INSN_CMP_IMM_REG, USE_DST),
        DECLARE_INFO(INSN_CMP_MEMBASE_REG, USE_SRC | USE_DST),
@@ -155,6 +170,14 @@ static struct mach_reg_def checkregs[] = {
        { MACH_REG_xAX, DEF_xAX },
        { MACH_REG_xCX, DEF_xCX },
        { MACH_REG_xDX, DEF_xDX },
+       { MACH_REG_XMM0, DEF_XMM0 },
+       { MACH_REG_XMM1, DEF_XMM1 },
+       { MACH_REG_XMM2, DEF_XMM2 },
+       { MACH_REG_XMM3, DEF_XMM3 },
+       { MACH_REG_XMM4, DEF_XMM4 },
+       { MACH_REG_XMM5, DEF_XMM5 },
+       { MACH_REG_XMM6, DEF_XMM6 },
+       { MACH_REG_XMM7, DEF_XMM7 },
 };
 
 
diff --git a/jit/compilation-unit.c b/jit/compilation-unit.c
index 9a207ac..6eefddd 100644
--- a/jit/compilation-unit.c
+++ b/jit/compilation-unit.c
@@ -101,7 +101,11 @@ struct compilation_unit *compilation_unit_alloc(struct 
vm_method *method)
                for (unsigned int i = 0; i < NR_FIXED_REGISTERS; ++i) {
                        struct var_info *ret;
 
-                       ret = do_get_var(cu, GPR_VM_TYPE, REG_TYPE_GPR);
+                       if (is_fpu_register(i))
+                               ret = do_get_var(cu, FPU_VM_TYPE, REG_TYPE_FPU);
+                       else
+                               ret = do_get_var(cu, GPR_VM_TYPE, REG_TYPE_GPR);
+
                        if (ret) {
                                ret->interval->reg = i;
                                ret->interval->fixed_reg = true;
diff --git a/jit/compiler.c b/jit/compiler.c
index 2f94e2f..b44db4a 100644
--- a/jit/compiler.c
+++ b/jit/compiler.c
@@ -92,6 +92,8 @@ int compile(struct compilation_unit *cu)
        if (opt_trace_liveness)
                trace_liveness(cu);
 
+       trace_flush();
+
        err = allocate_registers(cu);
        if (err)
                goto out;
-- 
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