1 #ifndef __MONO_MINI_S390X_H__
2 #define __MONO_MINI_S390X_H__
4 #include <mono/arch/s390x/s390x-codegen.h>
7 #define MONO_MAX_IREGS 16
8 #define MONO_MAX_FREGS 16
10 #define MONO_ARCH_FRAME_ALIGNMENT 8
12 #define MONO_EMIT_NEW_MOVE(cfg,dest,offset,src,imm,size) do { \
17 inst = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoInst)); \
19 tmpr = mono_regstate_next_int (cfg->rs); \
20 MONO_EMIT_NEW_ICONST(cfg,tmpr,size); \
22 inst->inst_offset = offset; \
24 inst->inst_imm = imm; \
27 if (s390_is_uimm12(offset)) { \
29 inst->inst_offset = offset; \
31 dReg = mono_regstate_next_int (cfg->rs); \
32 MONO_EMIT_NEW_BIALU_IMM(cfg, OP_ADD_IMM, \
33 dReg, dest, offset); \
35 inst->inst_offset = 0; \
37 if (s390_is_uimm12(imm)) { \
39 inst->inst_imm = imm; \
41 sReg = mono_regstate_next_int (cfg->rs); \
42 MONO_EMIT_NEW_BIALU_IMM(cfg, OP_ADD_IMM, \
48 inst->opcode = OP_S390_MOVE; \
49 inst->unused = size; \
50 mono_bblock_add_inst (cfg->cbb, inst); \
53 #define MONO_OUTPUT_VTR(cfg, size, dr, sr, so) do { \
56 MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOADU1_MEMBASE, \
60 MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOADU2_MEMBASE, \
64 MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOADU4_MEMBASE, \
68 MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOAD_MEMBASE, \
74 #define MONO_OUTPUT_VTS(cfg, size, dr, dx, sr, so) do { \
78 tmpr = mono_regstate_next_int (cfg->rs); \
79 MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOADU1_MEMBASE, \
81 MONO_EMIT_NEW_STORE_MEMBASE(cfg, OP_STORE_MEMBASE_REG, \
85 tmpr = mono_regstate_next_int (cfg->rs); \
86 MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOADU2_MEMBASE, \
88 MONO_EMIT_NEW_STORE_MEMBASE(cfg, OP_STORE_MEMBASE_REG, \
93 MONO_EMIT_NEW_MOVE (cfg, dr, dx, sr, so, size); \
98 /* fixme: align to 16byte instead of 32byte (we align to 32byte to get
99 * reproduceable results for benchmarks */
100 #define MONO_ARCH_CODE_ALIGNMENT 32
103 gpointer previous_lmf;
112 typedef struct ucontext MonoContext;
114 typedef struct MonoCompileArch {
117 #define MONO_ARCH_EMULATE_FCONV_TO_I8 1
118 #define MONO_ARCH_EMULATE_LCONV_TO_R8 1
119 #define MONO_ARCH_EMULATE_LCONV_TO_R4 1
120 #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1
121 #define MONO_ARCH_EMULATE_LMUL 1
122 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS 1
124 #define MONO_ARCH_USE_SIGACTION 1
126 #define S390_STACK_ALIGNMENT 8
127 #define S390_FIRST_ARG_REG s390_r2
128 #define S390_LAST_ARG_REG s390_r6
129 #define S390_FIRST_FPARG_REG s390_f0
130 #define S390_LAST_FPARG_REG s390_f2
131 #define S390_PASS_STRUCTS_BY_VALUE 1
132 #define S390_SMALL_RET_STRUCT_IN_REG 1
134 #define S390_NUM_REG_ARGS (S390_LAST_ARG_REG-S390_FIRST_ARG_REG+1)
135 #define S390_NUM_REG_FPARGS (S390_LAST_FPARG_REG-S390_FIRST_FPARG_REG)
137 #define S390_OFFSET(b, t) (gint32) ((gint64) (b) - (gint64) (t))
138 #define S390_RELATIVE(b, t) (gint32) ((((gint64) (b) - (gint64) (t))) / 2)
140 #define CODEPTR(c, o) (o) = (short *) ((gint64) c - 2)
141 #define PTRSLOT(c, o) *(o) = (short) ((gint64) c - (gint64) (o) + 2)/2
144 #define S390_ALIGN(v, a) (((a) > 0 ? (((v) + ((a) - 1)) & ~((a) - 1)) : (v)))
147 s390_patch (guchar *code, gint32 target)
149 gint32 *offset = (gint32 *) code;
156 #endif /* __MONO_MINI_S390_H__ */