X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-sparc.h;h=f2b3b41d7963a5ae2a0c8b4ac632d74813ef8af5;hb=457c9722a4bc7ead4d13d62dd6c4c56dfa24d8c0;hp=7f06578493051be6a3c0613dd6d277e701fffca4;hpb=e375fbb5a7b7633ef2507c85b66d7b043dda3131;p=mono.git diff --git a/mono/mini/mini-sparc.h b/mono/mini/mini-sparc.h index 7f065784930..f2b3b41d796 100644 --- a/mono/mini/mini-sparc.h +++ b/mono/mini/mini-sparc.h @@ -2,6 +2,7 @@ #define __MONO_MINI_SPARC_H__ #include +#include #include @@ -12,15 +13,13 @@ /* Parameters used by the register allocator */ -#define MONO_ARCH_HAS_XP_LOCAL_REGALLOC - /* * Use %o0..%o5 as local registers, plus %l7 since we need an extra register for * holding the sreg1 in call instructions. */ #define MONO_ARCH_CALLEE_REGS ((1 << sparc_o0) | (1 << sparc_o1) | (1 << sparc_o2) | (1 << sparc_o3) | (1 << sparc_o4) | (1 << sparc_o5) | (1 << sparc_l7)) -#define MONO_ARCH_CALLEE_SAVED_REGS (~MONO_ARCH_CALLEE_REGS) +#define MONO_ARCH_CALLEE_SAVED_REGS ((~MONO_ARCH_CALLEE_REGS) & ~(1 << sparc_g1)) #ifdef SPARCV9 /* Use %d34..%d62 as the double precision floating point local registers */ @@ -58,7 +57,6 @@ #define MONO_ARCH_CODE_ALIGNMENT 32 -#define MONO_ARCH_BASEREG sparc_fp #define MONO_ARCH_RETREG1 sparc_i0 #ifdef SPARCV9 @@ -76,25 +74,12 @@ struct MonoLMF { gpointer ebp; }; -typedef struct MonoContext { - guint8 *ip; - gpointer *sp; - gpointer *fp; -} MonoContext; - typedef struct MonoCompileArch { gint32 lmf_offset; gint32 localloc_offset; + void *float_spill_slot; } MonoCompileArch; -#define MONO_CONTEXT_SET_IP(ctx,eip) do { (ctx)->ip = (gpointer)(eip); } while (0); -#define MONO_CONTEXT_SET_BP(ctx,ebp) do { (ctx)->fp = (gpointer*)(ebp); } while (0); -#define MONO_CONTEXT_SET_SP(ctx,esp) do { (ctx)->sp = (gpointer*)(esp); } while (0); - -#define MONO_CONTEXT_GET_IP(ctx) ((gpointer)((ctx)->ip)) -#define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->fp)) -#define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->sp)) - #define MONO_INIT_CONTEXT_FROM_FUNC(ctx,start_func) do { \ mono_arch_flush_register_windows (); \ MONO_CONTEXT_SET_IP ((ctx), (start_func)); \ @@ -102,17 +87,12 @@ typedef struct MonoCompileArch { MONO_CONTEXT_SET_SP ((ctx), __builtin_frame_address (0)); \ } while (0) -#ifndef __linux__ -/* - * Can't use sigaction on sparc/linux, since it doesn't support SA_SIGINFO. Instead, we - * have to use the obsolete sigcontext parameter: - * http://www.ussg.iu.edu/hypermail/linux/kernel/0110.3/1531.html. - */ +#define MONO_ARCH_INIT_TOP_LMF_ENTRY(lmf) do { (lmf)->ebp = -1; } while (0) + #define MONO_ARCH_USE_SIGACTION 1 -#endif #ifdef HAVE_WORKING_SIGALTSTACK -#define MONO_ARCH_SIGSEGV_ON_ALTSTACK +/*#define MONO_ARCH_SIGSEGV_ON_ALTSTACK*/ #endif #define MONO_ARCH_EMULATE_FCONV_TO_I8 1 @@ -122,15 +102,19 @@ typedef struct MonoCompileArch { #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1 #define MONO_ARCH_EMULATE_FREM 1 #define MONO_ARCH_NEED_DIV_CHECK 1 -#define MONO_ARCH_ENABLE_EMIT_STATE_OPT 1 -#define MONO_ARCH_HAVE_THROW_CORLIB_EXCEPTION 1 -#define MONO_ARCH_HAVE_CREATE_TRAMPOLINE_FROM_TOKEN 1 -#define MONO_ARCH_HAVE_CREATE_SPECIFIC_TRAMPOLINE 1 +#define MONO_ARCH_HAVE_IMT 1 +#define MONO_ARCH_IMT_REG sparc_g1 +#define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1 +#define MONO_ARCH_HAVE_TLS_INIT 1 + +void mono_arch_tls_init (void); #ifdef SPARCV9 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS #endif +#define MONO_ARCH_THIS_AS_FIRST_ARG 1 + #ifndef __GNUC__ /* assume Sun compiler if not GCC */ static void * __builtin_return_address(int depth) @@ -178,7 +162,7 @@ static void * __builtin_frame_address(int depth) gboolean mono_sparc_is_virtual_call (guint32 *code); -gpointer* mono_sparc_get_vcall_slot_addr (guint32 *code, gpointer *regs); +gpointer* mono_sparc_get_vcall_slot_addr (guint32 *code, mgreg_t *regs); void mono_sparc_flushw (void);