};
#endif // sun, Solaris x86
-/* Enables OP_LSHL, OP_LSHL_IMM, OP_LSHR, OP_LSHR_IMM, OP_LSHR_UN, OP_LSHR_UN_IMM */
-#define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS
+#define MONO_ARCH_SIGNAL_STACK_SIZE (64 * 1024)
#define MONO_MAX_IREGS 16
#define MONO_MAX_FREGS AMD64_XMM_NREG
+#define MONO_ARCH_HAS_XP_LOCAL_REGALLOC
+
+/* xmm15 is reserved for use by some opcodes */
+#define MONO_ARCH_CALLEE_FREGS 0xef
+#define MONO_ARCH_CALLEE_SAVED_FREGS 0
+
+#define MONO_ARCH_CALLEE_REGS AMD64_CALLEE_REGS
+#define MONO_ARCH_CALLEE_SAVED_REGS AMD64_CALLEE_SAVED_REGS
+
+/* Setting this to FALSE means using SSE2 instructions for fp arithmetic */
+#define MONO_ARCH_USE_FPSTACK FALSE
+#define MONO_ARCH_FPSTACK_SIZE 6
+
+#define MONO_ARCH_INST_FIXED_REG(desc) ((desc == 's') ? AMD64_RCX : ((desc == 'a') ? AMD64_RAX : ((desc == 'd') ? AMD64_RDX : -1)))
+
+/* RDX is clobbered by the opcode implementation before accessing sreg2 */
+#define MONO_ARCH_INST_SREG2_MASK(ins) (((ins [MONO_INST_CLOB] == 'a') || (ins [MONO_INST_CLOB] == 'd')) ? (1 << AMD64_RDX) : 0)
+
+#define MONO_ARCH_INST_IS_REGPAIR(desc) FALSE
+#define MONO_ARCH_INST_REGPAIR_REG2(desc,hreg1) (-1)
+
#define MONO_ARCH_FRAME_ALIGNMENT 16
/* fixme: align to 16byte instead of 32byte (we align to 32byte to get
guint64 rip;
guint64 rbx;
guint64 ebp;
+ guint64 rsp;
guint64 r12;
guint64 r13;
guint64 r14;
typedef struct MonoCompileArch {
gint32 lmf_offset;
- gint32 localloc_offset;
+ gint32 localloc_offset;
+ gint32 reg_save_area_offset;
+ gint32 stack_alloc_size;
+ gboolean omit_fp, omit_fp_computed;
} MonoCompileArch;
typedef struct {
#ifdef HAVE_WORKING_SIGALTSTACK
-/*
- * FIXME: For some reason, when sigaltstack is enabled, the uc_mcontext member
- * in ucontext_t is not at the offset indicated by the definition of ucontext_t.
- */
-
-//#define MONO_ARCH_SIGSEGV_ON_ALTSTACK
+#define MONO_ARCH_SIGSEGV_ON_ALTSTACK
/* NetBSD doesn't define SA_STACK */
#ifndef SA_STACK
#endif
-/* Enables OP_LSHL, OP_LSHL_IMM, OP_LSHR, OP_LSHR_IMM, OP_LSHR_UN, OP_LSHR_UN_IMM */
#define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS
+#define MONO_ARCH_NO_EMULATE_LONG_MUL_OPTS
#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
#define MONO_ARCH_HAVE_IS_INT_OVERFLOW 1
#define MONO_ARCH_ENABLE_EMIT_STATE_OPT 1
+#define MONO_ARCH_ENABLE_REGALLOC_IN_EH_BLOCKS 1
#define MONO_ARCH_HAVE_INVALIDATE_METHOD 1
#define MONO_ARCH_HAVE_THROW_CORLIB_EXCEPTION 1
-#define MONO_ARCH_HAVE_OUT_OF_LINE_BBLOCKS 1
#define MONO_ARCH_HAVE_PIC_AOT 1
#define MONO_ARCH_HAVE_CREATE_TRAMPOLINE_FROM_TOKEN 1
+#define MONO_ARCH_HAVE_CREATE_SPECIFIC_TRAMPOLINE 1
+#define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE 1
#define MONO_ARCH_HAVE_CREATE_VARS 1
-gpointer*
-mono_amd64_get_vcall_slot_addr (guint8* code, guint64 *regs);
-
-void
-mono_amd64_exceptions_init (void);
-
-void
-mono_amd64_tramp_init (void);
-
-/* FIXME: */
-//#define MONO_ARCH_BIGMUL_INTRINS 1
+gboolean
+mono_amd64_is_sse2 (void);
#endif /* __MONO_MINI_AMD64_H__ */