1 #ifndef __MONO_SUPPORT_S390X_H__
2 #define __MONO_SUPPORT_S390X_H__
4 #define S390_SET(loc, dr, v) \
6 guint64 val = (guint64) v; \
7 if (s390_is_uimm16(val)) { \
8 s390_llill(loc, dr, val); \
9 } else if (s390_is_uimm32(val)) { \
10 s390_llilf(loc, dr, val); \
12 guint32 hi = (val) >> 32; \
13 guint32 lo = (val) & 0xffffffff; \
14 s390_iihf(loc, dr, hi); \
15 s390_iilf(loc, dr, lo); \
19 #define S390_LONG(loc, opy, op, r, ix, br, off) \
20 if (s390_is_imm20(off)) { \
21 s390_##opy (loc, r, ix, br, off); \
24 fprintf(stderr,"\nS390_LONG - no index - r: %d br: %d off: %d\n",r,br,off); \
25 S390_SET(loc, s390_r13, off); \
26 s390_la (loc, s390_r13, s390_r13, br, 0); \
28 fprintf(stderr,"\nS390_LONG - index - r: %d br: %d ix: %d off: %d\n",r,br,ix,off); \
29 s390_la (loc, s390_r13, ix, br, 0); \
30 S390_SET (loc, s390_r0, off); \
31 s390_agr (loc, s390_r13, s390_r0); \
33 s390_##op (loc, r, 0, s390_r13, 0); \
36 #define S390_SET_MASK(loc, dr, v) \
38 if (s390_is_imm16 (v)) { \
39 s390_lghi (loc, dr, v); \
40 } else if (s390_is_imm32 (v)) { \
41 s390_lgfi (loc, dr, v); \
43 gint64 val = (gint64) v; \
44 guint32 hi = (val) >> 32; \
45 guint32 lo = (val) & 0xffffffff; \
46 s390_iilf(loc, dr, lo); \
47 s390_iihf(loc, dr, hi); \
51 #define S390_CALL_TEMPLATE(loc, r) \
53 s390_iihf (loc, r, 0); \
54 s390_iilf (loc, r, 0); \
55 s390_basr (loc, s390_r14, r); \
58 #define S390_BR_TEMPLATE(loc, r) \
60 s390_iihf (loc, r, 0); \
61 s390_iilf (loc, r, 0); \
65 #define S390_LOAD_TEMPLATE(loc, r) \
67 s390_iihf (loc, r, 0); \
68 s390_iilf (loc, r, 0); \
71 #define S390_EMIT_CALL(loc, t) \
73 gint64 val = (gint64) t; \
74 guint32 hi = (val) >> 32; \
75 guint32 lo = (val) & 0xffffffff; \
76 uintptr_t p = (uintptr_t) loc; \
78 *(guint32 *) p = hi; \
80 *(guint32 *) p = lo; \
83 #define S390_EMIT_LOAD(loc, v) \
85 gint64 val = (gint64) v; \
86 guint32 hi = (val) >> 32; \
87 guint32 lo = (val) & 0xffffffff; \
88 uintptr_t p = (uintptr_t) loc; \
90 *(guint32 *) p = hi; \
92 *(guint32 *) p = lo; \
95 #endif /* __MONO_SUPPORT_S390X_H__ */