2004-06-10 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mono / mini / mini-sparc.h
index 8d9265db5c52c54da96b135bf77a8dd0fb3ddf84..9aaf0d7af21596c9446d451e0372a7c1743b8c74 100644 (file)
@@ -3,17 +3,15 @@
 
 #include <mono/arch/sparc/sparc-codegen.h>
 
+#include <glib.h>
+
 #define MONO_MAX_IREGS 32
 #define MONO_MAX_FREGS 32
 
 #define MONO_ARCH_FRAME_ALIGNMENT 8
 
-/* Also check this. */
 #define MONO_ARCH_CODE_ALIGNMENT 32
 
-/* BASEREG = Frame pointer
- * RETREG? = Return register (but is it for caller or callee?)
- */
 #define MONO_ARCH_BASEREG sparc_fp
 #define MONO_ARCH_RETREG1 sparc_i0
 
@@ -21,16 +19,87 @@ struct MonoLMF {
        gpointer    previous_lmf;
        gpointer    lmf_addr;
        MonoMethod *method;
+       guint32     ip;
+       guint32     sp;
        guint32     ebp;
-       guint32     eip;
 };
 
-#define MONO_ARCH_EMULATE_FCONV_TO_I8 1
-#define MONO_ARCH_EMULATE_LCONV_TO_R8 1
-#define MONO_ARCH_EMULATE_LCONV_TO_R4 1
+typedef struct MonoContext {
+       guint32 ip;
+       guint32 *sp;
+       guint32 *fp;
+} MonoContext;
+
+typedef struct MonoCompileArch {
+       guint32 lmf_offset;
+       guint32 localloc_offset;
+} MonoCompileArch;
+
+#define MONO_CONTEXT_SET_IP(ctx,eip) do { (ctx)->ip = (guint32)(eip); } while (0); 
+#define MONO_CONTEXT_SET_BP(ctx,ebp) do { (ctx)->fp = (guint32*)(ebp); } while (0); 
+#define MONO_CONTEXT_SET_SP(ctx,esp) do { (ctx)->sp = (guint32*)(esp); } while (0); 
+
+#define MONO_CONTEXT_GET_IP(ctx) ((gpointer)((ctx)->ip))
+#define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->fp))
+#define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->sp))
+
+#define MONO_ARCH_USE_SIGACTION 1
+
+//#define MONO_ARCH_SIGSEGV_ON_ALTSTACK
+
+#define MONO_ARCH_EMULATE_FCONV_TO_I8   1
+#define MONO_ARCH_EMULATE_LCONV_TO_R8   1
+#define MONO_ARCH_EMULATE_LCONV_TO_R4   1
+#define MONO_ARCH_EMULATE_CONV_R8_UN    1
 #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1
 #define MONO_ARCH_EMULATE_FREM 1
+#define MONO_ARCH_NEED_DIV_CHECK 1
+
+#ifndef __GNUC__
+/* assume Sun compiler if not GCC */
+static void * __builtin_return_address(int depth)
+{
+       asm("ta      3");
+       asm("tst     %i0");
+       asm("be      retAddr_End");
+       asm("mov     %fp, %l0");
+       asm("retAddr_Start:");
+       asm("sub     %i0, 1, %i0");
+       asm("tst     %i0");
+       asm("bne     retAddr_Start");
+       asm("ld      [%l0+56], %l0");
+       asm("retAddr_End:");
+       asm("ld      [%l0+60], %i0");
+}
+
+static void * __builtin_frame_address(int depth)
+{
+       asm("ta      3");
+       asm("tst     %i0");
+       asm("be      frameAddr_End");
+       asm("mov     %fp, %l0");
+       asm("frameAddr_Start:");
+       asm("sub     %i0, 1, %i0");
+       asm("tst     %i0");
+       asm("bne     frameAddr_Start");
+       asm("ld      [%l0+56], %l0");
+       asm("frameAddr_End:");
+       asm("ld      [%l0+56], %i0");
+}
+#endif
 
 gboolean mono_sparc_is_virtual_call (guint32 *code);
 
+gpointer* mono_sparc_get_vcall_slot_addr (guint32 *code, guint32 *fp);
+
+void mono_sparc_flushw (void);
+
+gboolean mono_sparc_is_v9 (void);
+
+struct MonoCompile;
+
+guint32* mono_sparc_emit_save_lmf (guint32* code, guint32 lmf_offset);
+
+guint32* mono_sparc_emit_restore_lmf (guint32 *code, guint32 lmf_offset);
+
 #endif /* __MONO_MINI_SPARC_H__ */