1 #ifndef __MONO_MINI_SPARC_H__
2 #define __MONO_MINI_SPARC_H__
4 #include <mono/arch/sparc/sparc-codegen.h>
8 #define MONO_MAX_IREGS 32
9 #define MONO_MAX_FREGS 32
11 #define MONO_ARCH_FRAME_ALIGNMENT (sizeof (gpointer) * 2)
13 #define MONO_ARCH_CODE_ALIGNMENT 32
15 #define MONO_ARCH_BASEREG sparc_fp
16 #define MONO_ARCH_RETREG1 sparc_i0
19 #define MONO_SPARC_STACK_BIAS 2047
21 #define MONO_SPARC_STACK_BIAS 0
25 gpointer previous_lmf;
33 typedef struct MonoContext {
39 typedef struct MonoCompileArch {
41 gint32 localloc_offset;
44 #define MONO_CONTEXT_SET_IP(ctx,eip) do { (ctx)->ip = (gpointer)(eip); } while (0);
45 #define MONO_CONTEXT_SET_BP(ctx,ebp) do { (ctx)->fp = (gpointer*)(ebp); } while (0);
46 #define MONO_CONTEXT_SET_SP(ctx,esp) do { (ctx)->sp = (gpointer*)(esp); } while (0);
48 #define MONO_CONTEXT_GET_IP(ctx) ((gpointer)((ctx)->ip))
49 #define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->fp))
50 #define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->sp))
52 #define MONO_INIT_CONTEXT_FROM_FUNC(ctx,start_func) do { \
53 mono_arch_flush_register_windows (); \
54 MONO_CONTEXT_SET_IP ((ctx), (start_func)); \
55 MONO_CONTEXT_SET_BP ((ctx), __builtin_frame_address (0)); \
58 #define MONO_ARCH_USE_SIGACTION 1
60 #ifdef HAVE_WORKING_SIGALTSTACK
61 #define MONO_ARCH_SIGSEGV_ON_ALTSTACK
64 #define MONO_ARCH_EMULATE_FCONV_TO_I8 1
65 #define MONO_ARCH_EMULATE_LCONV_TO_R8 1
66 #define MONO_ARCH_EMULATE_LCONV_TO_R4 1
67 #define MONO_ARCH_EMULATE_CONV_R8_UN 1
68 #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1
69 #define MONO_ARCH_EMULATE_FREM 1
70 #define MONO_ARCH_NEED_DIV_CHECK 1
71 #define MONO_ARCH_HAVE_THROW_CORLIB_EXCEPTION 1
74 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS
78 /* assume Sun compiler if not GCC */
79 static void * __builtin_return_address(int depth)
83 asm("be retAddr_End");
85 asm("retAddr_Start:");
86 asm("sub %i0, 1, %i0");
88 asm("bne retAddr_Start");
90 asm("ldx [%l0+2159], %l0");
92 asm("ldx [%l0+2167], %i0");
94 asm("ld [%l0+56], %l0");
96 asm("ld [%l0+60], %i0");
100 static void * __builtin_frame_address(int depth)
104 asm("be frameAddr_End");
106 asm("frameAddr_Start:");
107 asm("sub %i0, 1, %i0");
109 asm("bne frameAddr_Start");
111 asm("ldx [%l0+2159], %l0");
112 asm("frameAddr_End:");
113 asm("ldx [%l0+2159], %i0");
115 asm("ld [%l0+56], %l0");
116 asm("frameAddr_End:");
117 asm("ld [%l0+56], %i0");
122 gboolean mono_sparc_is_virtual_call (guint32 *code);
124 gpointer* mono_sparc_get_vcall_slot_addr (guint32 *code, gpointer *fp);
126 void mono_sparc_flushw (void);
128 gboolean mono_sparc_is_v9 (void);
130 gboolean mono_sparc_is_sparc64 (void);
134 guint32* mono_sparc_emit_save_lmf (guint32* code, guint32 lmf_offset);
136 guint32* mono_sparc_emit_restore_lmf (guint32 *code, guint32 lmf_offset);
138 #endif /* __MONO_MINI_SPARC_H__ */