Fix s390x soft debug
[mono.git] / mono / mini / support-s390x.h
1 #ifndef __MONO_SUPPORT_S390X_H__
2 #define __MONO_SUPPORT_S390X_H__
3
4 #define S390_SET(loc, dr, v)                                    \
5         do {                                                    \
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);               \
11                 } else {                                        \
12                         guint32 hi = (val) >> 32;               \
13                         guint32 lo = (val) & 0xffffffff;        \
14                         s390_iihf(loc, dr, hi);                 \
15                         s390_iilf(loc, dr, lo);                 \
16                 }                                               \
17         } while (0)
18
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);                       \
22         } else {                                                        \
23                 if (ix == 0) {                                          \
24                         S390_SET(loc, s390_r13, off);                   \
25                         s390_la (loc, s390_r13, s390_r13, br, 0);       \
26                 } else {                                                \
27                         s390_la   (loc, s390_r13, ix, br, 0);           \
28                         S390_SET  (loc, s390_r0, off);                  \
29                         s390_agr  (loc, s390_r13, s390_r0);             \
30                 }                                                       \
31                 s390_##op (loc, r, 0, s390_r13, 0);                     \
32         }
33
34 #define S390_SET_MASK(loc, dr, v)                               \
35         do {                                                    \
36                 if (s390_is_imm16 (v)) {                        \
37                         s390_lghi (loc, dr, v);                 \
38                 } else if (s390_is_imm32 (v)) {                 \
39                         s390_lgfi (loc, dr, v);                 \
40                 } else {                                        \
41                         gint64 val = (gint64) v;                \
42                         guint32 hi = (val) >> 32;               \
43                         guint32 lo = (val) & 0xffffffff;        \
44                         s390_iilf(loc, dr, lo);                 \
45                         s390_iihf(loc, dr, hi);                 \
46                 }                                               \
47         } while (0)
48
49 #define S390_CALL_TEMPLATE(loc, r)                              \
50         do {                                                    \
51                 s390_iihf (loc, r, 0);                          \
52                 s390_iilf (loc, r, 0);                          \
53                 s390_basr (loc, s390_r14, r);                   \
54         } while (0)
55
56 #define S390_BR_TEMPLATE(loc, r)                                \
57         do {                                                    \
58                 s390_iihf (loc, r, 0);                          \
59                 s390_iilf (loc, r, 0);                          \
60                 s390_br   (loc, r);                             \
61         } while (0)
62
63 #define S390_LOAD_TEMPLATE(loc, r)                              \
64         do {                                                    \
65                 s390_iihf (loc, r, 0);                          \
66                 s390_iilf (loc, r, 0);                          \
67         } while (0)
68
69 #define S390_EMIT_CALL(loc, t)                                  \
70         do {                                                    \
71                 gint64 val = (gint64) t;                        \
72                 guint32 hi = (val) >> 32;                       \
73                 guint32 lo = (val) & 0xffffffff;                \
74                 uintptr_t p = (uintptr_t) loc;                  \
75                 p += 2;                                         \
76                 *(guint32 *) p = hi;                            \
77                 p += 6;                                         \
78                 *(guint32 *) p = lo;                            \
79         } while (0)
80
81 #define S390_EMIT_LOAD(loc, v)                                  \
82         do {                                                    \
83                 gint64 val = (gint64) v;                        \
84                 guint32 hi = (val) >> 32;                       \
85                 guint32 lo = (val) & 0xffffffff;                \
86                 uintptr_t p = (uintptr_t) loc;                  \
87                 p += 2;                                         \
88                 *(guint32 *) p = hi;                            \
89                 p += 6;                                         \
90                 *(guint32 *) p = lo;                            \
91         } while (0)
92
93 #endif  /* __MONO_SUPPORT_S390X_H__ */