2004-04-29 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[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 8
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 struct MonoLMF {
19         gpointer    previous_lmf;
20         gpointer    lmf_addr;
21         MonoMethod *method;
22         guint32     ip;
23         guint32     sp;
24         guint32     ebp;
25 };
26
27 typedef struct MonoContext {
28         guint32 ip;
29         guint32 *sp;
30         guint32 *fp;
31 } MonoContext;
32
33 typedef struct MonoCompileArch {
34         guint32 lmf_offset;
35         guint32 localloc_offset;
36 } MonoCompileArch;
37
38 #define MONO_CONTEXT_SET_IP(ctx,eip) do { (ctx)->ip = (long)(eip); } while (0); 
39 #define MONO_CONTEXT_SET_BP(ctx,ebp) do { (ctx)->fp = (long)(ebp); } while (0); 
40 #define MONO_CONTEXT_SET_SP(ctx,esp) do { (ctx)->sp = (long)(esp); } while (0); 
41
42 #define MONO_CONTEXT_GET_IP(ctx) ((gpointer)((ctx)->ip))
43 #define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->fp))
44 #define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->sp))
45
46 #define MONO_ARCH_USE_SIGACTION 1
47
48 #define MONO_ARCH_EMULATE_FCONV_TO_I8   1
49 #define MONO_ARCH_EMULATE_LCONV_TO_R8   1
50 #define MONO_ARCH_EMULATE_LCONV_TO_R4   1
51 #define MONO_ARCH_EMULATE_CONV_R8_UN    1
52 #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1
53 #define MONO_ARCH_EMULATE_FREM 1
54
55 #ifndef __GNUC__
56 /* assume Sun compiler if not GCC */
57 static void * __builtin_return_address(int depth)
58 {
59         asm("ta      3");
60         asm("tst     %i0");
61         asm("be      retAddr_End");
62         asm("mov     %fp, %l0");
63         asm("retAddr_Start:");
64         asm("sub     %i0, 1, %i0");
65         asm("tst     %i0");
66         asm("bne     retAddr_Start");
67         asm("ld      [%l0+56], %l0");
68         asm("retAddr_End:");
69         asm("ld      [%l0+60], %i0");
70 }
71
72 static void * __builtin_frame_address(int depth)
73 {
74         asm("ta      3");
75         asm("tst     %i0");
76         asm("be      frameAddr_End");
77         asm("mov     %fp, %l0");
78         asm("frameAddr_Start:");
79         asm("sub     %i0, 1, %i0");
80         asm("tst     %i0");
81         asm("bne     frameAddr_Start");
82         asm("ld      [%l0+56], %l0");
83         asm("frameAddr_End:");
84         asm("ld      [%l0+56], %i0");
85 }
86 #endif
87
88 gboolean mono_sparc_is_virtual_call (guint32 *code);
89
90 gpointer* mono_sparc_get_vcall_slot_addr (guint32 *code, guint32 *fp);
91
92 void mono_sparc_flushw (void);
93
94 gboolean mono_sparc_is_v9 (void);
95
96 struct MonoCompile;
97
98 guint32* mono_sparc_emit_save_lmf (guint32* code, guint32 lmf_offset);
99
100 guint32* mono_sparc_emit_restore_lmf (guint32 *code, guint32 lmf_offset);
101
102 #endif /* __MONO_MINI_SPARC_H__ */