1 #ifndef __MONO_MINI_IA64_H__
2 #define __MONO_MINI_IA64_H__
6 #include <mono/arch/ia64/ia64-codegen.h>
8 #define MONO_ARCH_CPU_SPEC ia64_desc
10 /* FIXME: regset -> 128 bits ! */
12 #define MONO_MAX_IREGS 128
13 #define MONO_MAX_FREGS 128
15 /* Parameters used by the register allocator */
17 /* r8..r11, r14..r29 */
18 #define MONO_ARCH_CALLEE_REGS ((regmask_t)(0xf00UL) | (regmask_t)(0x3fffc000UL))
20 /* f6..f15, f34..f127 */
21 /* FIXME: Use the upper 64 bits as well */
22 #define MONO_ARCH_CALLEE_FREGS ((regmask_t)(0xfffffffc00000000UL) | ((regmask_t)(0x3ffUL) << 6))
24 #define MONO_ARCH_CALLEE_SAVED_REGS ~(MONO_ARCH_CALLEE_REGS)
26 #define MONO_ARCH_CALLEE_SAVED_FREGS 0
28 #define MONO_ARCH_USE_FPSTACK FALSE
29 #define MONO_ARCH_FPSTACK_SIZE 0
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)
37 #define MONO_ARCH_IS_GLOBAL_IREG(reg) (is_hard_ireg (reg) && ((reg) >= cfg->arch.reg_local0) && ((reg) < cfg->arch.reg_out0))
39 #define MONO_ARCH_FRAME_ALIGNMENT 16
41 #define MONO_ARCH_CODE_ALIGNMENT 16
43 #define MONO_ARCH_RETREG1 IA64_R8
44 #define MONO_ARCH_FRETREG1 8
46 #define MONO_ARCH_SIGNAL_STACK_SIZE SIGSTKSZ
52 typedef struct MonoContext
{
54 /* Whenever the ip in 'cursor' points to the ip where the exception happened */
55 /* This is true for the initial context for exceptions thrown from signal handlers */
59 typedef struct MonoCompileArch
{
60 gint32 stack_alloc_size
;
62 gint32 localloc_offset
;
67 gint32 reg_saved_ar_pfs
;
71 gint32 reg_saved_return_val
;
72 guint32 prolog_end_offset
, epilog_begin_offset
, epilog_end_offset
;
73 void *ret_var_addr_local
;
74 unw_dyn_region_info_t
*r_pro
, *r_epilog
;
76 Ia64CodegenState code
;
78 GHashTable
*branch_targets
;
81 static inline unw_word_t
82 mono_ia64_context_get_ip (MonoContext
*ctx
)
87 err
= unw_get_reg (&ctx
->cursor
, UNW_IA64_IP
, &ip
);
90 if (ctx
->precise_ip
) {
93 /* Subtrack 1 so ip points into the actual instruction */
98 static inline unw_word_t
99 mono_ia64_context_get_sp (MonoContext
*ctx
)
104 err
= unw_get_reg (&ctx
->cursor
, UNW_IA64_SP
, &sp
);
110 static inline unw_word_t
111 mono_ia64_context_get_fp (MonoContext
*ctx
)
113 unw_cursor_t new_cursor
;
120 err
= unw_get_reg (&ctx
->cursor
, UNW_IA64_SP
, &sp
);
123 err
= unw_get_reg (&ctx
->cursor
, UNW_IA64_IP
, &ip
);
127 /* fp is the SP of the parent frame */
128 new_cursor
= ctx
->cursor
;
130 err
= unw_step (&new_cursor
);
133 err
= unw_get_reg (&new_cursor
, UNW_IA64_SP
, &fp
);
139 #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)
140 #define MONO_CONTEXT_SET_BP(ctx,ebp) do { } while (0)
141 #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)
143 #define MONO_CONTEXT_GET_IP(ctx) ((gpointer)(mono_ia64_context_get_ip ((ctx))))
144 #define MONO_CONTEXT_GET_BP(ctx) ((gpointer)(mono_ia64_context_get_fp ((ctx))))
145 #define MONO_CONTEXT_GET_SP(ctx) ((gpointer)(mono_ia64_context_get_sp ((ctx))))
147 #define MONO_INIT_CONTEXT_FROM_FUNC(ctx,start_func) do { \
148 MONO_INIT_CONTEXT_FROM_CURRENT (ctx); \
151 #define MONO_INIT_CONTEXT_FROM_CURRENT(ctx) do { \
153 res = unw_getcontext (&unw_ctx); \
154 g_assert (res == 0); \
155 res = unw_init_local (&(ctx)->cursor, &unw_ctx); \
156 g_assert (res == 0); \
159 /* This is ia64 only */
160 #define MONO_CONTEXT_SET_FUNC(ctx, func) MONO_CONTEXT_SET_IP ((ctx), ((gpointer*)(func))[0])
162 #define MONO_ARCH_CONTEXT_DEF unw_context_t unw_ctx;
164 #define MONO_ARCH_USE_SIGACTION 1
166 #ifdef HAVE_WORKING_SIGALTSTACK
167 /*#define MONO_ARCH_SIGSEGV_ON_ALTSTACK*/
170 unw_dyn_region_info_t
* mono_ia64_create_unwind_region (Ia64CodegenState
*code
);
172 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS 1
173 #define MONO_ARCH_NO_EMULATE_MUL_IMM 1
174 #define MONO_ARCH_NO_EMULATE_MUL 1
176 #define MONO_ARCH_EMULATE_CONV_R8_UN 1
177 #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1
178 #define MONO_ARCH_EMULATE_FREM 1
179 #define MONO_ARCH_EMULATE_MUL_DIV 1
180 #define MONO_ARCH_EMULATE_LONG_MUL_OPTS 1
181 #define MONO_ARCH_NEED_DIV_CHECK 1
183 #define MONO_ARCH_HAVE_IS_INT_OVERFLOW 1
185 #define MONO_ARCH_ENABLE_EMIT_STATE_OPT 1
186 #define MONO_ARCH_HAVE_INVALIDATE_METHOD 1
187 #define MONO_ARCH_HAVE_THROW_CORLIB_EXCEPTION 1
188 #define MONO_ARCH_HAVE_CREATE_TRAMPOLINE_FROM_TOKEN 1
189 #define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE 1
190 #define MONO_ARCH_HAVE_SAVE_UNWIND_INFO 1
191 #define MONO_ARCH_HAVE_ATOMIC_EXCHANGE 1
192 #define MONO_ARCH_HAVE_IMT 1
193 #define MONO_ARCH_COMMON_VTABLE_TRAMPOLINE 1
195 #endif /* __MONO_MINI_IA64_H__ */