#endif /* HAVE_WORKING_SIGALTSTACK */
#endif /* !PLATFORM_WIN32 */
+#define MONO_ARCH_SUPPORT_SIMD_INTRINSICS 1
+
+#ifndef DISABLE_SIMD
+#define MONO_ARCH_SIMD_INTRINSICS 1
+#define MONO_ARCH_NEED_SIMD_BANK 1
+#endif
+
/* we should lower this size and make sure we don't call heavy stack users in the segv handler */
#define MONO_ARCH_SIGNAL_STACK_SIZE (16 * 1024)
+#define MONO_ARCH_HAVE_RESTORE_STACK_SUPPORT 1
#define MONO_ARCH_CPU_SPEC x86_desc
#define MONO_MAX_IREGS 8
#define MONO_MAX_FREGS 8
+#define MONO_MAX_XREGS 8
/* Parameters used by the register allocator */
#define MONO_ARCH_CALLEE_REGS X86_CALLEE_REGS
#define MONO_ARCH_CALLEE_FREGS (0xff & ~(regmask (MONO_ARCH_FPSTACK_SIZE)))
#define MONO_ARCH_CALLEE_SAVED_FREGS 0
+/* All registers are clobered by a call */
+#define MONO_ARCH_CALLEE_XREGS (0xff & ~(regmask (MONO_MAX_XREGS)))
+#define MONO_ARCH_CALLEE_SAVED_XREGS 0
+
#define MONO_ARCH_USE_FPSTACK TRUE
#define MONO_ARCH_FPSTACK_SIZE 6
#define MONO_ARCH_INST_IS_REGPAIR(desc) (desc == 'l' || desc == 'L')
#define MONO_ARCH_INST_REGPAIR_REG2(desc,hreg1) (desc == 'l' ? X86_EDX : -1)
-#if __APPLE__
+/* must be at a power of 2 and >= 8 */
#define MONO_ARCH_FRAME_ALIGNMENT 16
-#else
-/* For storing doubles on the stack */
-#define MONO_ARCH_FRAME_ALIGNMENT 8
-#endif
/* fixme: align to 16byte instead of 32byte (we align to 32byte to get
* 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_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 {
/* Offset by 1 if this is a trampoline LMF frame */
guint32 previous_lmf;
#define MONO_ARCH_VTABLE_REG X86_EDX
#define MONO_ARCH_COMMON_VTABLE_TRAMPOLINE 1
#define MONO_ARCH_RGCTX_REG X86_EDX
-#define MONO_ARCH_ENABLE_NORMALIZE_OPCODES 1
+#define MONO_ARCH_HAVE_GENERALIZED_IMT_THUNK 1
+#if defined(__linux__) && !defined(HAVE_MOVING_COLLECTOR)
+#define MONO_ARCH_MONITOR_OBJECT_REG X86_EAX
+#endif
#define MONO_ARCH_HAVE_CMOV_OPS 1
+#ifdef MONO_ARCH_SIMD_INTRINSICS
+#define MONO_ARCH_HAVE_DECOMPOSE_OPTS 1
+#define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1
+#endif
+
#if !defined(__APPLE__)
#define MONO_ARCH_AOT_SUPPORTED 1
#endif
+#if defined(__linux__) || defined(__sun)
+#define MONO_ARCH_ENABLE_MONITOR_IL_FASTPATH 1
+#endif
+
/* Used for optimization, not complete */
#define MONO_ARCH_IS_OP_MEMBASE(opcode) ((opcode) == OP_X86_PUSH_MEMBASE)
extern MonoBreakpointInfo mono_breakpoint_info [MONO_BREAKPOINT_ARRAY_SIZE];
+guint8*
+mono_x86_emit_tls_get (guint8* code, int dreg, int tls_offset) MONO_INTERNAL;
+
#endif /* __MONO_MINI_X86_H__ */