#include <mono/arch/sparc/sparc-codegen.h>
+#include <glib.h>
+
#define MONO_MAX_IREGS 32
#define MONO_MAX_FREGS 32
guint32 ebp;
};
+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);
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__ */