merge -r 53370:58178
[mono.git] / mono / mini / mini-amd64.h
index 1e39425cb3a5d3ddb47f49a225257beda8870c9b..f829a3b55db440dea051f636cc2f86e8f88bacb6 100644 (file)
@@ -73,13 +73,33 @@ struct sigcontext {
 };
 #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 
@@ -106,6 +126,7 @@ struct MonoLMF {
        guint64     rip;
        guint64     rbx;
        guint64     ebp;
+       guint64     rsp;
        guint64     r12;
        guint64     r13;
        guint64     r14;
@@ -114,7 +135,10 @@ struct MonoLMF {
 
 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 {
@@ -191,12 +215,7 @@ 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
@@ -206,34 +225,26 @@ typedef struct {
 
 #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__ */