copying the latest Sys.Web.Services from trunk.
[mono.git] / mono / mini / mini-sparc.h
1 #ifndef __MONO_MINI_SPARC_H__
2 #define __MONO_MINI_SPARC_H__
3
4 #include <mono/arch/sparc/sparc-codegen.h>
5
6 #include <glib.h>
7
8 #define MONO_MAX_IREGS 32
9 #define MONO_MAX_FREGS 32
10
11 #define MONO_ARCH_FRAME_ALIGNMENT (sizeof (gpointer) * 2)
12
13 #define MONO_ARCH_CODE_ALIGNMENT 32
14
15 #define MONO_ARCH_BASEREG sparc_fp
16 #define MONO_ARCH_RETREG1 sparc_i0
17
18 #ifdef SPARCV9
19 #define MONO_SPARC_STACK_BIAS 2047
20 #else
21 #define MONO_SPARC_STACK_BIAS 0
22 #endif
23
24 struct MonoLMF {
25         gpointer    previous_lmf;
26         gpointer    lmf_addr;
27         MonoMethod *method;
28         gpointer    ip;
29         gpointer    sp;
30         gpointer    ebp;
31 };
32
33 typedef struct MonoContext {
34         guint8 *ip;
35         gpointer *sp;
36         gpointer *fp;
37 } MonoContext;
38
39 typedef struct MonoCompileArch {
40         gint32 lmf_offset;
41         gint32 localloc_offset;
42 } MonoCompileArch;
43
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); 
47
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))
51
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));       \
56         } while (0)
57
58 #define MONO_ARCH_USE_SIGACTION 1
59
60 #ifdef HAVE_WORKING_SIGALTSTACK
61 #define MONO_ARCH_SIGSEGV_ON_ALTSTACK
62 #endif
63
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
72
73 #ifdef SPARCV9
74 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS
75 #endif
76
77 #ifndef __GNUC__
78 /* assume Sun compiler if not GCC */
79 static void * __builtin_return_address(int depth)
80 {
81         asm("ta      3");
82         asm("tst     %i0");
83         asm("be      retAddr_End");
84         asm("mov     %fp, %l0");
85         asm("retAddr_Start:");
86         asm("sub     %i0, 1, %i0");
87         asm("tst     %i0");
88         asm("bne     retAddr_Start");
89 #if SPARCV9
90         asm("ldx     [%l0+2159], %l0");
91         asm("retAddr_End:");
92         asm("ldx     [%l0+2167], %i0");
93 #else
94         asm("ld      [%l0+56], %l0");
95         asm("retAddr_End:");
96         asm("ld      [%l0+60], %i0");
97 #endif
98 }
99
100 static void * __builtin_frame_address(int depth)
101 {
102         asm("ta      3");
103         asm("tst     %i0");
104         asm("be      frameAddr_End");
105         asm("mov     %fp, %l0");
106         asm("frameAddr_Start:");
107         asm("sub     %i0, 1, %i0");
108         asm("tst     %i0");
109         asm("bne     frameAddr_Start");
110 #if SPARCV9
111         asm("ldx     [%l0+2159], %l0");
112         asm("frameAddr_End:");
113         asm("ldx     [%l0+2159], %i0");
114 #else
115         asm("ld      [%l0+56], %l0");
116         asm("frameAddr_End:");
117         asm("ld      [%l0+56], %i0");
118 #endif
119 }
120 #endif
121
122 gboolean mono_sparc_is_virtual_call (guint32 *code);
123
124 gpointer* mono_sparc_get_vcall_slot_addr (guint32 *code, gpointer *fp);
125
126 void mono_sparc_flushw (void);
127
128 gboolean mono_sparc_is_v9 (void);
129
130 gboolean mono_sparc_is_sparc64 (void);
131
132 struct MonoCompile;
133
134 guint32* mono_sparc_emit_save_lmf (guint32* code, guint32 lmf_offset);
135
136 guint32* mono_sparc_emit_restore_lmf (guint32 *code, guint32 lmf_offset);
137
138 #endif /* __MONO_MINI_SPARC_H__ */