Get rid of the old mono_arch_find_jit_info functions + defines as all platforms suppo...
[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_ARCH_CPU_SPEC sparc_desc
9
10 #define MONO_MAX_IREGS 32
11 #define MONO_MAX_FREGS 32
12
13 /* Parameters used by the register allocator */
14
15 /* 
16  * Use %o0..%o5 as local registers, plus %l7 since we need an extra register for
17  * holding the sreg1 in call instructions.
18  */
19 #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))
20
21 #define MONO_ARCH_CALLEE_SAVED_REGS ((~MONO_ARCH_CALLEE_REGS) & ~(1 << sparc_g1))
22
23 #ifdef SPARCV9
24 /* Use %d34..%d62 as the double precision floating point local registers */
25 /* %d32 has the same encoding as %f1, so %d36%d38 == 0b1010 == 0xa */
26 #define MONO_ARCH_CALLEE_FREGS (0xaaaaaaa8)
27 #else
28 /* Use %f2..%f30 as the double precision floating point local registers */
29 #define MONO_ARCH_CALLEE_FREGS (0x55555554)
30 #endif
31
32 #define MONO_ARCH_CALLEE_SAVED_FREGS 0
33
34 #define MONO_ARCH_USE_FPSTACK FALSE
35 #define MONO_ARCH_FPSTACK_SIZE 0
36 #ifdef SPARCV9
37 #define MONO_ARCH_INST_FIXED_REG(desc) ((desc == 'o') ? sparc_o0 : -1)
38 #else
39 #define MONO_ARCH_INST_FIXED_REG(desc) ((desc == 'o') ? sparc_o0 : ((desc == 'l') ? sparc_o1 : -1))
40 #endif
41 #define MONO_ARCH_INST_SREG2_MASK(ins) (0)
42
43 #ifdef SPARCV9
44 #define MONO_ARCH_INST_IS_REGPAIR(desc) FALSE
45 #define MONO_ARCH_INST_REGPAIR_REG2(desc,hreg1) (-1)
46 #else
47 #define MONO_ARCH_INST_IS_REGPAIR(desc) ((desc == 'l') || (desc == 'L'))
48 #define MONO_ARCH_INST_REGPAIR_REG2(desc,hreg1) (((desc == 'l') ? sparc_o0 : (desc == 'L' ? (hreg1 + 1) : -1)))
49 #endif
50
51 #if SIZEOF_VOID_P == 8
52 #define MONO_ARCH_FRAME_ALIGNMENT 16
53 #else
54 #define MONO_ARCH_FRAME_ALIGNMENT 8
55 #endif
56
57 #define MONO_ARCH_CODE_ALIGNMENT 32
58
59 #define MONO_ARCH_RETREG1 sparc_i0
60
61 #ifdef SPARCV9
62 #define MONO_SPARC_STACK_BIAS 2047
63 #else
64 #define MONO_SPARC_STACK_BIAS 0
65 #endif
66
67 struct MonoLMF {
68         gpointer    previous_lmf;
69         gpointer    lmf_addr;
70         MonoMethod *method;
71         gpointer    ip;
72         gpointer    sp;
73         gpointer    ebp;
74 };
75
76 typedef struct MonoContext {
77         guint8 *ip;
78         gpointer *sp;
79         gpointer *fp;
80 } MonoContext;
81
82 typedef struct MonoCompileArch {
83         gint32 lmf_offset;
84         gint32 localloc_offset;
85         void *float_spill_slot;
86 } MonoCompileArch;
87
88 #define MONO_CONTEXT_SET_IP(ctx,eip) do { (ctx)->ip = (gpointer)(eip); } while (0); 
89 #define MONO_CONTEXT_SET_BP(ctx,ebp) do { (ctx)->fp = (gpointer*)(ebp); } while (0); 
90 #define MONO_CONTEXT_SET_SP(ctx,esp) do { (ctx)->sp = (gpointer*)(esp); } while (0); 
91
92 #define MONO_CONTEXT_GET_IP(ctx) ((gpointer)((ctx)->ip))
93 #define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->fp))
94 #define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->sp))
95
96 #define MONO_INIT_CONTEXT_FROM_FUNC(ctx,start_func) do {        \
97                 mono_arch_flush_register_windows ();    \
98                 MONO_CONTEXT_SET_IP ((ctx), (start_func));      \
99                 MONO_CONTEXT_SET_BP ((ctx), __builtin_frame_address (0));       \
100                 MONO_CONTEXT_SET_SP ((ctx), __builtin_frame_address (0));       \
101         } while (0)
102
103 #define MONO_ARCH_USE_SIGACTION 1
104
105 #ifdef HAVE_WORKING_SIGALTSTACK
106 /*#define MONO_ARCH_SIGSEGV_ON_ALTSTACK*/
107 #endif
108
109 #define MONO_ARCH_EMULATE_FCONV_TO_I8   1
110 #define MONO_ARCH_EMULATE_LCONV_TO_R8   1
111 #define MONO_ARCH_EMULATE_LCONV_TO_R4   1
112 #define MONO_ARCH_EMULATE_CONV_R8_UN    1
113 #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1
114 #define MONO_ARCH_EMULATE_FREM 1
115 #define MONO_ARCH_NEED_DIV_CHECK 1
116 #define MONO_ARCH_HAVE_IMT 1
117 #define MONO_ARCH_IMT_REG sparc_g1
118 #define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1
119
120 #ifdef SPARCV9
121 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS
122 #endif
123
124 #define MONO_ARCH_THIS_AS_FIRST_ARG 1
125
126 #ifndef __GNUC__
127 /* assume Sun compiler if not GCC */
128 static void * __builtin_return_address(int depth)
129 {
130         asm("ta      3");
131         asm("tst     %i0");
132         asm("be      retAddr_End");
133         asm("mov     %fp, %l0");
134         asm("retAddr_Start:");
135         asm("sub     %i0, 1, %i0");
136         asm("tst     %i0");
137         asm("bne     retAddr_Start");
138 #if SPARCV9
139         asm("ldx     [%l0+2159], %l0");
140         asm("retAddr_End:");
141         asm("ldx     [%l0+2167], %i0");
142 #else
143         asm("ld      [%l0+56], %l0");
144         asm("retAddr_End:");
145         asm("ld      [%l0+60], %i0");
146 #endif
147 }
148
149 static void * __builtin_frame_address(int depth)
150 {
151         asm("ta      3");
152         asm("tst     %i0");
153         asm("be      frameAddr_End");
154         asm("mov     %fp, %l0");
155         asm("frameAddr_Start:");
156         asm("sub     %i0, 1, %i0");
157         asm("tst     %i0");
158         asm("bne     frameAddr_Start");
159 #if SPARCV9
160         asm("ldx     [%l0+2159], %l0");
161         asm("frameAddr_End:");
162         asm("ldx     [%l0+2159], %i0");
163 #else
164         asm("ld      [%l0+56], %l0");
165         asm("frameAddr_End:");
166         asm("ld      [%l0+56], %i0");
167 #endif
168 }
169 #endif
170
171 gboolean mono_sparc_is_virtual_call (guint32 *code);
172
173 gpointer* mono_sparc_get_vcall_slot_addr (guint32 *code, mgreg_t *regs);
174
175 void mono_sparc_flushw (void);
176
177 gboolean mono_sparc_is_v9 (void);
178
179 gboolean mono_sparc_is_sparc64 (void);
180
181 struct MonoCompile;
182
183 guint32* mono_sparc_emit_save_lmf (guint32* code, guint32 lmf_offset);
184
185 guint32* mono_sparc_emit_restore_lmf (guint32 *code, guint32 lmf_offset);
186
187 #endif /* __MONO_MINI_SPARC_H__ */