#include <mono/utils/mono-context.h>
#include <glib.h>
-#ifdef __native_client_codegen__
-#define kNaClAlignmentARM 16
-#define kNaClAlignmentMaskARM (kNaClAlignmentARM - 1)
-#define kNaClLengthOfCallImm 4
-#endif
-
#if defined(ARM_FPU_NONE)
#define MONO_ARCH_SOFT_FLOAT_FALLBACK 1
#endif
GSHAREDVT_RET_I1 = 3,
GSHAREDVT_RET_U1 = 4,
GSHAREDVT_RET_I2 = 5,
- GSHAREDVT_RET_U2 = 6
+ GSHAREDVT_RET_U2 = 6,
+ GSHAREDVT_RET_VFP_R4 = 7,
+ GSHAREDVT_RET_VFP_R8 = 8
} GSharedVtRetMarshal;
typedef struct {
int calli;
/* Whenever this is a in or an out call */
int gsharedvt_in;
+ /* Whenever this call uses fp registers */
+ int have_fregs;
+ gpointer caller_cinfo, callee_cinfo;
/* Maps stack slots/registers in the caller to the stack slots/registers in the callee */
/* A negative value means a register, i.e. -1=r0, -2=r1 etc. */
int map [MONO_ZERO_LEN_ARRAY];
RegTypeBaseGen,
/* FP value passed in either an ireg or a vfp reg */
RegTypeFP,
+ /* Struct passed/returned in gregs */
RegTypeStructByVal,
RegTypeStructByAddr,
+ RegTypeStructByAddrOnStack,
/* gsharedvt argument passed by addr in greg */
RegTypeGSharedVtInReg,
/* gsharedvt argument passed by addr on stack */
guint16 vtsize; /* in param area */
/* RegTypeHFA */
int esize;
- /* RegTypeHFA */
+ /* RegTypeHFA/RegTypeStructByVal */
int nregs;
guint8 reg;
ArgStorage storage;
+ /* RegTypeStructByVal */
gint32 struct_size;
guint8 size : 4; /* 1, 2, 4, 8, or regs used by RegTypeStructByVal */
} ArgInfo;
typedef struct {
gpointer ss_trigger_page;
gpointer bp_trigger_page;
+ gpointer ss_tramp_addr;
guint8* bp_addrs [MONO_ZERO_LEN_ARRAY];
} SeqPointInfo;
#define PARAM_REGS 4
+#define FP_PARAM_REGS 8
#define DYN_CALL_STACK_ARGS 10
typedef struct {
- mgreg_t regs [PARAM_REGS + DYN_CALL_STACK_ARGS];
+ mgreg_t regs [PARAM_REGS + FP_PARAM_REGS];
+ double fpregs [FP_PARAM_REGS];
mgreg_t res, res2;
guint8 *ret;
+ guint32 has_fpregs;
} DynCallArgs;
void arm_patch (guchar *code, const guchar *target);
mono_arm_throw_exception_by_token (guint32 type_token, mgreg_t pc, mgreg_t sp, mgreg_t *int_regs, gdouble *fp_regs);
gpointer
-mono_arm_start_gsharedvt_call (GSharedVtCallInfo *info, gpointer *caller, gpointer *callee, gpointer mrgctx_reg);
+mono_arm_start_gsharedvt_call (GSharedVtCallInfo *info, gpointer *caller, gpointer *callee, gpointer mrgctx_reg, double *caller_fregs, double *callee_fregs);
typedef enum {
MONO_ARM_FPU_NONE = 0,
#define MONO_ARCH_USE_SIGACTION 1
-#if defined(__native_client__) || defined(HOST_WATCHOS)
+#if defined(HOST_WATCHOS)
#undef MONO_ARCH_USE_SIGACTION
#endif
#define MONO_ARCH_NEED_DIV_CHECK 1
-#define MONO_ARCH_HAVE_GENERALIZED_IMT_THUNK 1
+#define MONO_ARCH_HAVE_GENERALIZED_IMT_TRAMPOLINE 1
#define MONO_ARCH_HAVE_FULL_AOT_TRAMPOLINES 1
#define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1
#define MONO_ARCH_HAVE_PATCH_CODE_NEW 1
#define MONO_ARCH_HAVE_OP_GENERIC_CLASS_INIT 1
-#if defined(__native_client__)
-#undef MONO_ARCH_SOFT_DEBUG_SUPPORTED
-#undef MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX
-#undef MONO_ARCH_HAVE_CONTEXT_SET_INT_REG
-#endif
-
#define MONO_ARCH_HAVE_TLS_GET (mono_arm_have_tls_get ())
#define MONO_ARCH_HAVE_TLS_GET_REG 1
+#ifdef TARGET_WATCHOS
+#define MONO_ARCH_DISABLE_HW_TRAPS 1
+#define MONO_ARCH_HAVE_UNWIND_BACKTRACE 1
+#endif
+
/* ARM doesn't have too many registers, so we have to use a callee saved one */
#define MONO_ARCH_RGCTX_REG ARMREG_V5
#define MONO_ARCH_IMT_REG MONO_ARCH_RGCTX_REG
guint8*
mono_arm_patchable_bl (guint8 *code, int cond);
-#ifdef USE_JUMP_TABLES
-guint8*
-mono_arm_load_jumptable_entry_addr (guint8 *code, gpointer *jte, ARMReg reg);
-
-guint8*
-mono_arm_load_jumptable_entry (guint8 *code, gpointer *jte, ARMReg reg);
-#endif
-
gboolean
mono_arm_is_hard_float (void);