/** * \file * Copyright 2011 Xamarin Inc * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ #ifndef __MONO_MINI_ARM_H__ #define __MONO_MINI_ARM_H__ #include #include #include #if defined(ARM_FPU_NONE) #define MONO_ARCH_SOFT_FLOAT_FALLBACK 1 #endif #if defined(__ARM_EABI__) #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define ARM_ARCHITECTURE "armel" #else #define ARM_ARCHITECTURE "armeb" #endif #else #define ARM_ARCHITECTURE "arm" #endif #if defined(ARM_FPU_VFP) #define ARM_FP_MODEL "vfp" #elif defined(ARM_FPU_NONE) #define ARM_FP_MODEL "vfp+fallback" #elif defined(ARM_FPU_VFP_HARD) #define ARM_FP_MODEL "vfp+hard" #else #error "At least one of ARM_FPU_NONE, ARM_FPU_VFP or ARM_FPU_VFP_HARD must be defined." #endif #define MONO_ARCH_ARCHITECTURE ARM_ARCHITECTURE "," ARM_FP_MODEL #define MONO_ARCH_CPU_SPEC mono_arm_cpu_desc #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define ARM_LSW_REG ARMREG_R0 #define ARM_MSW_REG ARMREG_R1 #else #define ARM_LSW_REG ARMREG_R1 #define ARM_MSW_REG ARMREG_R0 #endif #define MONO_MAX_IREGS 16 #define MONO_SAVED_GREGS 10 /* r4-r11, ip, lr */ /* r4-r11, ip, lr: registers saved in the LMF */ #define MONO_ARM_REGSAVE_MASK 0x5ff0 #define MONO_ARM_FIRST_SAVED_REG ARMREG_R4 #define MONO_ARM_NUM_SAVED_REGS 10 /* Parameters used by the register allocator */ #define MONO_ARCH_CALLEE_REGS ((1<regs [0] = (gsize)exc; } while (0) #define MONO_INIT_CONTEXT_FROM_FUNC(ctx,func) do { \ MONO_CONTEXT_SET_BP ((ctx), __builtin_frame_address (0)); \ MONO_CONTEXT_SET_SP ((ctx), __builtin_frame_address (0)); \ MONO_CONTEXT_SET_IP ((ctx), (func)); \ } while (0) #define MONO_ARCH_INIT_TOP_LMF_ENTRY(lmf) void mono_arm_throw_exception (MonoObject *exc, mgreg_t pc, mgreg_t sp, mgreg_t *int_regs, gdouble *fp_regs); void mono_arm_throw_exception_by_token (guint32 type_token, mgreg_t pc, mgreg_t sp, mgreg_t *int_regs, gdouble *fp_regs); void mono_arm_resume_unwind (guint32 dummy1, mgreg_t pc, mgreg_t sp, mgreg_t *int_regs, gdouble *fp_regs); gboolean mono_arm_thumb_supported (void); gboolean mono_arm_eabi_supported (void); int mono_arm_i8_align (void); GSList* mono_arm_get_exception_trampolines (gboolean aot); guint8* mono_arm_get_thumb_plt_entry (guint8 *code); guint8* mono_arm_patchable_b (guint8 *code, int cond); guint8* mono_arm_patchable_bl (guint8 *code, int cond); gboolean mono_arm_is_hard_float (void); void mono_arm_unaligned_stack (MonoMethod *method); /* MonoJumpInfo **ji */ guint8* mono_arm_emit_aotconst (gpointer ji, guint8 *code, guint8 *buf, int dreg, int patch_type, gconstpointer data); CallInfo* mono_arch_get_call_info (MonoMemPool *mp, MonoMethodSignature *sig); #endif /* __MONO_MINI_ARM_H__ */