X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-amd64.h;h=3907fc83bfc01855bcb80dae675292b7b5cda9a4;hb=3dd824a7c5306569fbbe08e0f3e54f36619822d6;hp=3955cdeb12a99f87be2a3e0d8557019d93bcd584;hpb=94a37da6bb45784c999faf3874cf0e6184e38bd5;p=mono.git diff --git a/mono/mini/mini-amd64.h b/mono/mini/mini-amd64.h index 3955cdeb12a..3907fc83bfc 100644 --- a/mono/mini/mini-amd64.h +++ b/mono/mini/mini-amd64.h @@ -76,12 +76,16 @@ struct sigcontext { #define MONO_ARCH_SIGNAL_STACK_SIZE (16 * 1024) +#define MONO_ARCH_HAVE_RESTORE_STACK_SUPPORT 1 + #define MONO_ARCH_CPU_SPEC amd64_desc #define MONO_MAX_IREGS 16 #define MONO_MAX_FREGS AMD64_XMM_NREG +#define MONO_ARCH_FP_RETURN_REG AMD64_XMM0 + /* xmm15 is reserved for use by some opcodes */ #define MONO_ARCH_CALLEE_FREGS 0xef #define MONO_ARCH_CALLEE_SAVED_FREGS 0 @@ -89,9 +93,8 @@ struct sigcontext { #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_FPSTACK_SIZE 0 #define MONO_ARCH_INST_FIXED_REG(desc) ((desc == '\0') ? -1 : ((desc == 'i' ? -1 : ((desc == 'a') ? AMD64_RAX : ((desc == 's') ? AMD64_RCX : ((desc == 'd') ? AMD64_RDX : -1)))))) @@ -107,21 +110,9 @@ struct sigcontext { * reproduceable results for benchmarks */ #define MONO_ARCH_CODE_ALIGNMENT 32 -#define MONO_ARCH_BASEREG X86_EBP #define MONO_ARCH_RETREG1 X86_EAX #define MONO_ARCH_RETREG2 X86_EDX -#define MONO_ARCH_AOT_PLT_OFFSET_REG AMD64_RAX - -#define MONO_ARCH_ENCODE_LREG(r1,r2) (r1 | (r2<<3)) - -#define inst_dreg_low dreg&7 -#define inst_dreg_high dreg>>3 -#define inst_sreg1_low sreg1&7 -#define inst_sreg1_high sreg1>>3 -#define inst_sreg2_low sreg2&7 -#define inst_sreg2_high sreg2>>3 - struct MonoLMF { /* * If the lowest bit is set to 1, then this LMF has the rip field set. Otherwise, @@ -151,9 +142,13 @@ typedef struct MonoCompileArch { gint32 localloc_offset; gint32 reg_save_area_offset; gint32 stack_alloc_size; - gboolean omit_fp, omit_fp_computed; + gboolean omit_fp, omit_fp_computed, no_pushes; gpointer cinfo; gint32 async_point_count; + gpointer vret_addr_loc; +#ifdef PLATFORM_WIN32 + gpointer unwindinfo; +#endif } MonoCompileArch; typedef struct { @@ -226,9 +221,35 @@ typedef struct { #endif +#ifdef __OpenBSD__ +#undef MONO_ARCH_USE_SIGACTION +#endif + #endif /* PLATFORM_WIN32 */ -#ifdef __FreeBSD__ +#if defined (__NetBSD__) + +#define REG_RAX 14 +#define REG_RCX 3 +#define REG_RDX 2 +#define REG_RBX 13 +#define REG_RSP 24 +#define REG_RBP 12 +#define REG_RSI 1 +#define REG_RDI 0 +#define REG_R8 4 +#define REG_R9 5 +#define REG_R10 6 +#define REG_R11 7 +#define REG_R12 8 +#define REG_R13 9 +#define REG_R14 10 +#define REG_R15 11 +#define REG_RIP 21 + +#define MONO_ARCH_NOMAP32BIT + +#elif defined (__FreeBSD__) || defined (__OpenBSD__) #define REG_RAX 7 #define REG_RCX 4 @@ -256,6 +277,14 @@ typedef struct { #endif /* __FreeBSD__ */ +#ifdef PLATFORM_WIN32 +#define MONO_AMD64_ARG_REG1 AMD64_RCX +#define MONO_AMD64_ARG_REG2 AMD64_RDX +#else +#define MONO_AMD64_ARG_REG1 AMD64_RDI +#define MONO_AMD64_ARG_REG2 AMD64_RSI +#endif + #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS #define MONO_ARCH_NO_EMULATE_LONG_MUL_OPTS @@ -263,31 +292,85 @@ typedef struct { #define MONO_ARCH_EMULATE_FREM 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_ENABLE_MONO_LMF_VAR 1 #define MONO_ARCH_HAVE_INVALIDATE_METHOD 1 #define MONO_ARCH_HAVE_THROW_CORLIB_EXCEPTION 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 #define MONO_ARCH_HAVE_ATOMIC_ADD 1 #define MONO_ARCH_HAVE_ATOMIC_EXCHANGE 1 +#define MONO_ARCH_HAVE_ATOMIC_CAS 1 +#define MONO_ARCH_HAVE_FULL_AOT_TRAMPOLINES 1 #define MONO_ARCH_HAVE_IMT 1 +#define MONO_ARCH_HAVE_TLS_GET 1 #define MONO_ARCH_IMT_REG AMD64_R11 -#define MONO_ARCH_VTABLE_REG AMD64_R11 -#define MONO_ARCH_COMMON_VTABLE_TRAMPOLINE 1 +#define MONO_ARCH_VTABLE_REG MONO_AMD64_ARG_REG1 +/* + * We use r10 for the rgctx register rather than r11 because r11 is + * used by the trampoline as a scratch register and hence might be + * clobbered across method call boundaries. + */ +#define MONO_ARCH_RGCTX_REG AMD64_R10 +#define MONO_ARCH_HAVE_CMOV_OPS 1 #define MONO_ARCH_HAVE_NOTIFY_PENDING_EXC 1 +#define MONO_ARCH_HAVE_EXCEPTIONS_INIT 1 +#define MONO_ARCH_ENABLE_GLOBAL_RA 1 +#define MONO_ARCH_HAVE_GENERALIZED_IMT_THUNK 1 +#define MONO_ARCH_HAVE_LIVERANGE_OPS 1 +#define MONO_ARCH_HAVE_XP_UNWIND 1 +#define MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX 1 +#if !defined(PLATFORM_WIN32) && !defined(HAVE_MOVING_COLLECTOR) +#define MONO_ARCH_MONITOR_OBJECT_REG AMD64_RDI +#endif +#define MONO_ARCH_HAVE_STATIC_RGCTX_TRAMPOLINE 1 #define MONO_ARCH_AOT_SUPPORTED 1 -gboolean -mono_amd64_is_sse2 (void) MONO_INTERNAL; +#if !defined(PLATFORM_WIN32) || defined(__sun) +#define MONO_ARCH_ENABLE_MONITOR_IL_FASTPATH 1 +#endif + +#define MONO_ARCH_SUPPORT_TASKLETS 1 + +#ifndef PLATFORM_WIN32 +#define MONO_AMD64_NO_PUSHES 1 +#endif + +#define MONO_ARCH_GSHARED_SUPPORTED 1 + +#define MONO_ARCH_USE_OP_TAIL_CALL(caller_sig, callee_sig) mono_metadata_signature_equal ((caller_sig), (callee_sig)) + +/* Used for optimization, not complete */ +#define MONO_ARCH_IS_OP_MEMBASE(opcode) ((opcode) == OP_X86_PUSH_MEMBASE) + +#define MONO_ARCH_EMIT_BOUNDS_CHECK(cfg, array_reg, offset, index_reg) do { \ + MonoInst *inst; \ + MONO_INST_NEW ((cfg), inst, OP_AMD64_ICOMPARE_MEMBASE_REG); \ + inst->inst_basereg = array_reg; \ + inst->inst_offset = offset; \ + inst->sreg2 = index_reg; \ + MONO_ADD_INS ((cfg)->cbb, inst); \ + MONO_EMIT_NEW_COND_EXC (cfg, LE_UN, "IndexOutOfRangeException"); \ + } while (0) void mono_amd64_patch (unsigned char* code, gpointer target) MONO_INTERNAL; +void +mono_amd64_throw_exception (guint64 dummy1, guint64 dummy2, guint64 dummy3, guint64 dummy4, + guint64 dummy5, guint64 dummy6, + MonoObject *exc, guint64 rip, guint64 rsp, + guint64 rbx, guint64 rbp, guint64 r12, guint64 r13, + guint64 r14, guint64 r15, guint64 rdi, guint64 rsi, + guint64 rax, guint64 rcx, guint64 rdx, + guint64 rethrow); + +guint64 +mono_amd64_get_original_ip (void) MONO_INTERNAL; + +guint8* +mono_amd64_emit_tls_get (guint8* code, int dreg, int tls_offset) MONO_INTERNAL; + typedef struct { guint8 *address; guint8 saved_byte; @@ -295,5 +378,16 @@ typedef struct { extern MonoBreakpointInfo mono_breakpoint_info [MONO_BREAKPOINT_ARRAY_SIZE]; +#ifdef PLATFORM_WIN32 + +void mono_arch_unwindinfo_add_push_nonvol (gpointer* monoui, gpointer codebegin, gpointer nextip, guchar reg ); +void mono_arch_unwindinfo_add_set_fpreg (gpointer* monoui, gpointer codebegin, gpointer nextip, guchar reg ); +void mono_arch_unwindinfo_add_alloc_stack (gpointer* monoui, gpointer codebegin, gpointer nextip, guint size ); +guint mono_arch_unwindinfo_get_size (gpointer monoui); +void mono_arch_unwindinfo_install_unwind_info (gpointer* monoui, gpointer code, guint code_size); + +#define MONO_ARCH_HAVE_UNWIND_TABLE 1 +#endif + #endif /* __MONO_MINI_AMD64_H__ */