2006-07-02 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / mini-ia64.h
1 #ifndef __MONO_MINI_IA64_H__
2 #define __MONO_MINI_IA64_H__
3
4 #include <glib.h>
5
6 #include <mono/arch/ia64/ia64-codegen.h>
7
8 /* FIXME: regset -> 128 bits ! */
9
10 #define MONO_MAX_IREGS 128
11 #define MONO_MAX_FREGS 128
12
13 /* Parameters used by the register allocator */
14
15 #define MONO_ARCH_HAS_XP_LOCAL_REGALLOC
16
17 /* r8..r11, r14..r29 */
18 #define MONO_ARCH_CALLEE_REGS ((regmask_t)(0x700UL) | (regmask_t)(0x3fffc000UL))
19
20 /* f6..f15, f33..f127 */
21 /* FIXME: Use the upper 64 bits as well */
22 #define MONO_ARCH_CALLEE_FREGS ((regmask_t)(0xfffffffe00000000UL) | ((regmask_t)(0x3ffUL) << 6))
23
24 #define MONO_ARCH_CALLEE_SAVED_REGS ~(MONO_ARCH_CALLEE_REGS)
25
26 #define MONO_ARCH_CALLEE_SAVED_FREGS 0
27
28 #define MONO_ARCH_USE_FPSTACK FALSE
29 #define MONO_ARCH_FPSTACK_SIZE 0
30
31 #define MONO_ARCH_INST_FIXED_REG(desc) ((desc == 'r') ? IA64_R8 : ((desc == 'g') ? 8 : -1))
32 #define MONO_ARCH_INST_IS_FLOAT(desc) ((desc == 'f') || (desc == 'g'))
33 #define MONO_ARCH_INST_SREG2_MASK(ins) (0)
34 #define MONO_ARCH_INST_IS_REGPAIR(desc) FALSE
35 #define MONO_ARCH_INST_REGPAIR_REG2(desc,hreg1) (-1)
36
37 #define MONO_ARCH_IS_GLOBAL_IREG(reg) (is_hard_ireg (reg) && ((reg) >= cfg->arch.reg_local0) && ((reg) < cfg->arch.reg_out0))
38
39 #define MONO_ARCH_FRAME_ALIGNMENT 16
40
41 #define MONO_ARCH_CODE_ALIGNMENT 16
42
43 #define MONO_ARCH_RETREG1 IA64_R8
44 #define MONO_ARCH_FRETREG1 8
45
46 #define MONO_ARCH_SIGNAL_STACK_SIZE SIGSTKSZ
47
48 struct MonoLMF {
49         guint64    ebp;
50 };
51
52 typedef struct MonoContext {
53         unw_cursor_t cursor;
54 } MonoContext;
55
56 typedef struct MonoCompileArch {
57         gint32 stack_alloc_size;
58         gint32 lmf_offset;
59         gint32 localloc_offset;
60         gint32 n_out_regs;
61         gint32 reg_in0;
62         gint32 reg_local0;
63         gint32 reg_out0;
64         gint32 reg_saved_ar_pfs;
65         gint32 reg_saved_b0;
66         gint32 reg_saved_sp;
67         gint32 reg_fp;
68         gint32 reg_saved_return_val;
69         guint32 prolog_end_offset, epilog_begin_offset, epilog_end_offset;
70         void *ret_var_addr_local;
71         unw_dyn_region_info_t *r_pro, *r_epilog;
72         void *last_bb;
73         Ia64CodegenState code;
74         gboolean omit_fp;
75         GHashTable *branch_targets;
76 } MonoCompileArch;
77
78 static inline unw_word_t
79 mono_ia64_context_get_ip (MonoContext *ctx)
80 {
81         unw_word_t ip;
82         int err;
83
84         err = unw_get_reg (&ctx->cursor, UNW_IA64_IP, &ip);
85         g_assert (err == 0);
86
87         /* Subtrack 1 so ip points into the actual instruction */
88         return ip - 1;
89 }
90
91 static inline unw_word_t
92 mono_ia64_context_get_sp (MonoContext *ctx)
93 {
94         unw_word_t sp;
95         int err;
96
97         err = unw_get_reg (&ctx->cursor, UNW_IA64_SP, &sp);
98         g_assert (err == 0);
99
100         return sp;
101 }
102
103 static inline unw_word_t
104 mono_ia64_context_get_fp (MonoContext *ctx)
105 {
106         unw_cursor_t new_cursor;
107         unw_word_t fp;
108         int err;
109
110         {
111                 unw_word_t ip, sp;
112
113                 err = unw_get_reg (&ctx->cursor, UNW_IA64_SP, &sp);
114                 g_assert (err == 0);
115
116                 err = unw_get_reg (&ctx->cursor, UNW_IA64_IP, &ip);
117                 g_assert (err == 0);
118         }
119
120         /* fp is the SP of the parent frame */
121         new_cursor = ctx->cursor;
122
123         err = unw_step (&new_cursor);
124         g_assert (err >= 0);
125
126         err = unw_get_reg (&new_cursor, UNW_IA64_SP, &fp);
127         g_assert (err == 0);
128
129         return fp;
130 }
131
132 #define MONO_CONTEXT_SET_IP(ctx,eip) do { int err = unw_set_reg (&(ctx)->cursor, UNW_IA64_IP, (unw_word_t)(eip)); g_assert (err == 0); } while (0)
133 #define MONO_CONTEXT_SET_BP(ctx,ebp) do { } while (0)
134 #define MONO_CONTEXT_SET_SP(ctx,esp) do { int err = unw_set_reg (&(ctx)->cursor, UNW_IA64_SP, (unw_word_t)(esp)); g_assert (err == 0); } while (0)
135
136 #define MONO_CONTEXT_GET_IP(ctx) ((gpointer)(mono_ia64_context_get_ip ((ctx))))
137 #define MONO_CONTEXT_GET_BP(ctx) ((gpointer)(mono_ia64_context_get_fp ((ctx))))
138 #define MONO_CONTEXT_GET_SP(ctx) ((gpointer)(mono_ia64_context_get_sp ((ctx))))
139
140 #define MONO_INIT_CONTEXT_FROM_FUNC(ctx,start_func) do {        \
141     MONO_INIT_CONTEXT_FROM_CURRENT (ctx); \
142 } while (0)
143
144 #define MONO_INIT_CONTEXT_FROM_CURRENT(ctx) do { \
145         int res; \
146         res = unw_getcontext (&unw_ctx); \
147         g_assert (res == 0); \
148         res = unw_init_local (&(ctx)->cursor, &unw_ctx); \
149         g_assert (res == 0); \
150 } while (0)
151
152 /* This is ia64 only */
153 #define MONO_CONTEXT_SET_FUNC(ctx, func) MONO_CONTEXT_SET_IP ((ctx), ((gpointer*)(func))[0])
154
155 #define MONO_ARCH_CONTEXT_DEF unw_context_t unw_ctx;
156
157 #define MONO_ARCH_USE_SIGACTION 1
158
159 #ifdef HAVE_WORKING_SIGALTSTACK
160 #define MONO_ARCH_SIGSEGV_ON_ALTSTACK
161 #endif
162
163 unw_dyn_region_info_t* mono_ia64_create_unwind_region (Ia64CodegenState *code);
164
165 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS 1
166 #define MONO_ARCH_NO_EMULATE_MUL_IMM 1
167
168 #define MONO_ARCH_EMULATE_CONV_R8_UN     1
169 #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1
170 #define MONO_ARCH_EMULATE_FREM           1
171 #define MONO_ARCH_EMULATE_MUL_DIV        1
172 #define MONO_ARCH_EMULATE_LONG_MUL_OPTS  1
173 #define MONO_ARCH_NEED_DIV_CHECK         1
174
175 #define MONO_ARCH_HAVE_IS_INT_OVERFLOW 1
176
177 #define MONO_ARCH_ENABLE_EMIT_STATE_OPT 1
178 #define MONO_ARCH_HAVE_INVALIDATE_METHOD 1
179 #define MONO_ARCH_HAVE_THROW_CORLIB_EXCEPTION 1
180 #define MONO_ARCH_HAVE_PIC_AOT 1
181 #define MONO_ARCH_HAVE_CREATE_TRAMPOLINE_FROM_TOKEN 1
182 #define MONO_ARCH_HAVE_CREATE_SPECIFIC_TRAMPOLINE 1
183 #define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE 1
184 #define MONO_ARCH_HAVE_SAVE_UNWIND_INFO 1
185 #define MONO_ARCH_HAVE_CREATE_VARS 1
186
187 #endif /* __MONO_MINI_IA64_H__ */