2004-05-25 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / mini / mini-x86.h
1 #ifndef __MONO_MINI_X86_H__
2 #define __MONO_MINI_X86_H__
3
4 #include <mono/arch/x86/x86-codegen.h>
5 #ifdef PLATFORM_WIN32
6 #include <windows.h>
7 /* use SIG* defines if possible */
8 #ifdef HAVE_SIGNAL_H
9 #include <signal.h>
10 #endif
11
12 /* sigcontext surrogate */
13 struct sigcontext {
14         unsigned int eax;
15         unsigned int ebx;
16         unsigned int ecx;
17         unsigned int edx;
18         unsigned int ebp;
19         unsigned int esp;
20         unsigned int esi;
21         unsigned int edi;
22         unsigned int eip;
23 };
24
25 typedef void (* MonoW32ExceptionHandler) (int);
26 void win32_seh_init(void);
27 void win32_seh_cleanup(void);
28 void win32_seh_set_handler(int type, MonoW32ExceptionHandler handler);
29
30 #ifndef SIGFPE
31 #define SIGFPE 4
32 #endif
33
34 #ifndef SIGILL
35 #define SIGILL 8
36 #endif
37
38 #ifndef SIGSEGV
39 #define SIGSEGV 11
40 #endif
41
42 LONG CALLBACK seh_handler(EXCEPTION_POINTERS* ep);
43
44 #endif /* PLATFORM_WIN32 */
45
46 /* Enables OP_LSHL, OP_LSHL_IMM, OP_LSHR, OP_LSHR_IMM, OP_LSHR_UN, OP_LSHR_UN_IMM */
47 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS
48
49 #define MONO_MAX_IREGS 8
50 #define MONO_MAX_FREGS 6
51
52 #define MONO_ARCH_FRAME_ALIGNMENT 4
53
54 /* fixme: align to 16byte instead of 32byte (we align to 32byte to get 
55  * reproduceable results for benchmarks */
56 #define MONO_ARCH_CODE_ALIGNMENT 32
57
58 #define MONO_ARCH_BASEREG X86_EBP
59 #define MONO_ARCH_RETREG1 X86_EAX
60 #define MONO_ARCH_RETREG2 X86_EDX
61
62 #define MONO_ARCH_ENCODE_LREG(r1,r2) (r1 | (r2<<3))
63
64 #define inst_dreg_low dreg&7 
65 #define inst_dreg_high dreg>>3
66 #define inst_sreg1_low sreg1&7 
67 #define inst_sreg1_high sreg1>>3
68 #define inst_sreg2_low sreg2&7 
69 #define inst_sreg2_high sreg2>>3
70
71 struct MonoLMF {
72         gpointer    previous_lmf;
73         gpointer    lmf_addr;
74         MonoMethod *method;
75         guint32     ebx;
76         guint32     edi;
77         guint32     esi;
78         guint32     ebp;
79         guint32     eip;
80 };
81
82 typedef struct MonoCompileArch {
83 } MonoCompileArch;
84
85 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
86 # define SC_EAX sc_eax
87 # define SC_EBX sc_ebx
88 # define SC_ECX sc_ecx
89 # define SC_EDX sc_edx
90 # define SC_EBP sc_ebp
91 # define SC_EIP sc_eip
92 # define SC_ESP sc_esp
93 # define SC_EDI sc_edi
94 # define SC_ESI sc_esi
95 #else
96 # define SC_EAX eax
97 # define SC_EBX ebx
98 # define SC_ECX ecx
99 # define SC_EDX edx
100 # define SC_EBP ebp
101 # define SC_EIP eip
102 # define SC_ESP esp
103 # define SC_EDI edi
104 # define SC_ESI esi
105 #endif
106
107 typedef struct sigcontext MonoContext;
108
109 #define MONO_CONTEXT_SET_IP(ctx,ip) do { (ctx)->SC_EIP = (long)(ip); } while (0); 
110 #define MONO_CONTEXT_SET_BP(ctx,bp) do { (ctx)->SC_EBP = (long)(bp); } while (0); 
111 #define MONO_CONTEXT_SET_SP(ctx,esp) do { (ctx)->SC_ESP = (long)(esp); } while (0); 
112
113 #define MONO_CONTEXT_GET_IP(ctx) ((gpointer)((ctx)->SC_EIP))
114 #define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->SC_EBP))
115 #define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->SC_ESP))
116
117 #ifndef PLATFORM_WIN32
118 #ifdef HAVE_WORKING_SIGALTSTACK
119 #define MONO_ARCH_SIGSEGV_ON_ALTSTACK
120 /* NetBSD doesn't define SA_STACK */
121 #ifndef SA_STACK
122 #define SA_STACK SA_ONSTACK
123 #endif
124 #endif
125
126 #endif
127
128 #define MONO_ARCH_BIGMUL_INTRINS 1
129
130 #endif /* __MONO_MINI_X86_H__ */  
131