[Facades] Use the Open.snk key for the System.ValueTuple facade (#4173)
[mono-project.git] / mono / mini / mini-arm64.h
blob28745040b6b4db50673b3717e738fd56b4426e53
1 /*
2 * mini-arm64.h
4 * Copyright 2013 Xamarin Inc
6 * Based on mini-arm.h:
8 * Copyright 2011 Xamarin Inc
9 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
12 #ifndef __MONO_MINI_ARM64_H__
13 #define __MONO_MINI_ARM64_H__
15 #include <mono/arch/arm64/arm64-codegen.h>
16 #include <mono/mini/mini-arm64-gsharedvt.h>
18 #define MONO_ARCH_CPU_SPEC mono_arm64_cpu_desc
20 #define MONO_MAX_IREGS 32
21 #define MONO_MAX_FREGS 32
23 #define MONO_CONTEXT_SET_LLVM_EXC_REG(ctx, exc) do { (ctx)->regs [0] = (gsize)exc; } while (0)
25 #define MONO_INIT_CONTEXT_FROM_FUNC(ctx,func) do { \
26 MONO_CONTEXT_SET_BP ((ctx), __builtin_frame_address (0)); \
27 MONO_CONTEXT_SET_SP ((ctx), __builtin_frame_address (0)); \
28 MONO_CONTEXT_SET_IP ((ctx), (func)); \
29 } while (0)
31 #define MONO_ARCH_INIT_TOP_LMF_ENTRY(lmf)
33 /* Parameters used by the register allocator */
34 /* r0..r7, r9..r14 (r15 is the imt/rgctx reg) */
35 #define MONO_ARCH_CALLEE_REGS 0xfeff
36 /* r19..r28 */
37 #define MONO_ARCH_CALLEE_SAVED_REGS (0x3ff << 19)
39 /* v16/v17 is reserved for a scratch reg */
40 #define MONO_ARCH_CALLEE_FREGS 0xfffc00ff
41 /* v8..v15 */
42 #define MONO_ARCH_CALLEE_SAVED_FREGS 0xff00
44 #define MONO_ARCH_USE_FPSTACK FALSE
45 #define MONO_ARCH_FPSTACK_SIZE 0
47 #define MONO_ARCH_INST_SREG2_MASK(ins) (0)
49 #define MONO_ARCH_INST_FIXED_REG(desc) ((desc) == 'a' ? ARMREG_R0 : -1)
51 #define MONO_ARCH_INST_IS_REGPAIR(desc) (0)
53 #define MONO_ARCH_INST_IS_FLOAT(desc) ((desc) == 'f')
55 #define MONO_ARCH_INST_REGPAIR_REG2(desc,hreg1) (-1)
57 #define MONO_ARCH_USE_FPSTACK FALSE
59 #define MONO_ARCH_FRAME_ALIGNMENT 16
61 #define MONO_ARCH_CODE_ALIGNMENT 32
63 /* callee saved regs + fp + sp */
64 #define MONO_ARCH_LMF_REGS ((0x3ff << 19) | (1 << ARMREG_FP) | (1 << ARMREG_SP))
65 #define MONO_ARCH_NUM_LMF_REGS (10 + 2)
66 #define MONO_ARCH_FIRST_LMF_REG ARMREG_R19
67 #define MONO_ARCH_LMF_REG_FP 10
68 #define MONO_ARCH_LMF_REG_SP 11
70 struct MonoLMF {
71 /*
72 * If the second lowest bit is set to 1, then this is a MonoLMFExt structure, and
73 * the other fields are not valid.
75 gpointer previous_lmf;
76 gpointer lmf_addr;
77 mgreg_t pc;
78 mgreg_t gregs [MONO_ARCH_NUM_LMF_REGS];
81 /* Structure used by the sequence points in AOTed code */
82 typedef struct {
83 gpointer ss_trigger_page;
84 gpointer bp_trigger_page;
85 gpointer ss_tramp_addr;
86 guint8* bp_addrs [MONO_ZERO_LEN_ARRAY];
87 } SeqPointInfo;
89 #define PARAM_REGS 8
90 #define FP_PARAM_REGS 8
92 #define DYN_CALL_STACK_ARGS 6
94 typedef struct {
95 /* The +1 is for r8 */
96 mgreg_t regs [PARAM_REGS + 1 + DYN_CALL_STACK_ARGS];
97 mgreg_t res, res2;
98 guint8 *ret;
99 double fpregs [FP_PARAM_REGS];
100 int n_fpargs, n_fpret;
101 guint8 buffer [256];
102 } DynCallArgs;
104 typedef struct {
105 gpointer cinfo;
106 int saved_gregs_offset;
107 /* Points to arguments received on the stack */
108 int args_reg;
109 gboolean cond_branch_islands;
110 gpointer vret_addr_loc;
111 gpointer seq_point_info_var;
112 gpointer ss_tramp_var;
113 gpointer bp_tramp_var;
114 guint8 *thunks;
115 int thunks_size;
116 } MonoCompileArch;
118 #define MONO_ARCH_EMULATE_FREM 1
119 #define MONO_ARCH_NO_EMULATE_LONG_MUL_OPTS 1
120 #define MONO_ARCH_EMULATE_LONG_MUL_OVF_OPTS 1
121 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS 1
122 #define MONO_ARCH_NEED_DIV_CHECK 1
123 #define MONO_ARCH_EMULATE_MUL_OVF 1
124 #define MONO_ARCH_HAVE_IMT 1
125 #define MONO_ARCH_HAVE_OP_TAIL_CALL 1
126 #define MONO_ARCH_THIS_AS_FIRST_ARG 1
127 #define MONO_ARCH_RGCTX_REG ARMREG_R15
128 #define MONO_ARCH_IMT_REG MONO_ARCH_RGCTX_REG
129 #define MONO_ARCH_VTABLE_REG ARMREG_R0
130 #define MONO_ARCH_EXC_REG ARMREG_R0
131 #define MONO_ARCH_HAVE_XP_UNWIND 1
132 #define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE 1
133 #define MONO_ARCH_HAVE_GENERALIZED_IMT_TRAMPOLINE 1
134 #define MONO_ARCH_USE_SIGACTION 1
135 #define MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX 1
136 #define MONO_ARCH_HAVE_CONTEXT_SET_INT_REG 1
137 #define MONO_ARCH_GSHARED_SUPPORTED 1
138 #define MONO_ARCH_AOT_SUPPORTED 1
139 #define MONO_ARCH_LLVM_SUPPORTED 1
140 #define MONO_ARCH_HAVE_FULL_AOT_TRAMPOLINES 1
141 #define MONO_ARCH_HAVE_EXCEPTIONS_INIT 1
142 #define MONO_ARCH_HAVE_GET_TRAMPOLINES 1
143 #define MONO_ARCH_DYN_CALL_SUPPORTED 1
144 #define MONO_ARCH_DYN_CALL_PARAM_AREA (DYN_CALL_STACK_ARGS * 8)
145 #define MONO_ARCH_SOFT_DEBUG_SUPPORTED 1
146 #define MONO_ARCH_GSHAREDVT_SUPPORTED 1
147 #define MONO_ARCH_HAVE_SETUP_RESUME_FROM_SIGNAL_HANDLER_CTX 1
148 #define MONO_ARCH_HAVE_SETUP_ASYNC_CALLBACK 1
149 #define MONO_ARCH_HAVE_GENERAL_RGCTX_LAZY_FETCH_TRAMPOLINE 1
150 #ifndef MONO_CROSS_COMPILE
151 #define MONO_ARCH_ENABLE_MONO_LMF_VAR 1
152 #endif
153 #define MONO_ARCH_HAVE_OP_GET_EX_OBJ 1
154 #define MONO_ARCH_HAVE_OBJC_GET_SELECTOR 1
155 #define MONO_ARCH_HAVE_SDB_TRAMPOLINES 1
156 #define MONO_ARCH_HAVE_PATCH_CODE_NEW 1
157 #define MONO_ARCH_HAVE_OP_GENERIC_CLASS_INIT 1
158 #define MONO_ARCH_HAVE_OPCODE_NEEDS_EMULATION 1
159 #define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1
160 #define MONO_ARCH_HAVE_HANDLER_BLOCK_GUARD 1
162 #ifdef TARGET_IOS
164 #define MONO_ARCH_REDZONE_SIZE 128
166 #else
168 #define MONO_ARCH_REDZONE_SIZE 0
170 #endif
172 #if defined(TARGET_APPLETVOS) || defined(TARGET_IOS)
173 #define MONO_ARCH_HAVE_UNWIND_BACKTRACE 1
174 #endif
176 /* Relocations */
177 #define MONO_R_ARM64_B 1
178 #define MONO_R_ARM64_BCC 2
179 #define MONO_R_ARM64_IMM 3
180 #define MONO_R_ARM64_BL 4
181 #define MONO_R_ARM64_BL_SHORT 5
182 #define MONO_R_ARM64_CBZ 6
185 typedef enum {
186 ArgInIReg,
187 ArgInFReg,
188 ArgInFRegR4,
189 ArgOnStack,
190 ArgOnStackR8,
191 ArgOnStackR4,
193 * Vtype passed in consecutive int registers.
194 * ainfo->reg is the firs register,
195 * ainfo->nregs is the number of registers,
196 * ainfo->size is the size of the structure.
198 ArgVtypeInIRegs,
199 ArgVtypeByRef,
200 ArgVtypeByRefOnStack,
201 ArgVtypeOnStack,
202 ArgHFA,
203 ArgNone
204 } ArgStorage;
206 typedef struct {
207 ArgStorage storage;
208 int reg;
209 /* ArgOnStack */
210 int offset;
211 /* ArgVtypeInIRegs/ArgHFA */
212 int nregs, size;
213 /* ArgHFA */
214 int esize;
215 /* ArgHFA */
216 /* The offsets of the float values inside the arg */
217 guint16 foffsets [4];
218 /* ArgOnStack */
219 int slot_size;
220 /* hfa */
221 int nfregs_to_skip;
222 gboolean sign;
223 gboolean gsharedvt;
224 gboolean hfa;
225 } ArgInfo;
227 typedef struct {
228 int nargs;
229 int gr, fr, stack_usage;
230 gboolean pinvoke;
231 ArgInfo ret;
232 ArgInfo sig_cookie;
233 ArgInfo args [1];
234 } CallInfo;
237 guint8* mono_arm_emit_imm64 (guint8 *code, int dreg, gint64 imm);
239 guint8* mono_arm_emit_ldrx (guint8 *code, int rt, int rn, int imm);
241 guint8* mono_arm_emit_destroy_frame (guint8 *code, int stack_offset, guint64 temp_regs);
243 guint8* mono_arm_emit_store_regset (guint8 *code, guint64 regs, int basereg, int offset);
245 guint8* mono_arm_emit_store_regarray (guint8 *code, guint64 regs, int basereg, int offset);
247 guint8* mono_arm_emit_load_regarray (guint8 *code, guint64 regs, int basereg, int offset);
249 /* MonoJumpInfo **ji */
250 guint8* mono_arm_emit_aotconst (gpointer ji, guint8 *code, guint8 *code_start, int dreg, guint32 patch_type, gconstpointer data);
252 void mono_arm_patch (guint8 *code, guint8 *target, int relocation);
254 void mono_arm_throw_exception (gpointer arg, mgreg_t pc, mgreg_t *int_regs, gdouble *fp_regs, gboolean corlib, gboolean rethrow);
256 void mono_arm_gsharedvt_init (void);
258 GSList* mono_arm_get_exception_trampolines (gboolean aot);
260 void mono_arm_resume_unwind (gpointer arg, mgreg_t pc, mgreg_t *int_regs, gdouble *fp_regs, gboolean corlib, gboolean rethrow);
262 CallInfo* mono_arch_get_call_info (MonoMemPool *mp, MonoMethodSignature *sig);
264 #endif /* __MONO_MINI_ARM64_H__ */