Architectural level set to z10 instruction set
[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 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);       \
27                 } else {                                                \
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);             \
32                 }                                                       \
33                 s390_##op (loc, r, 0, s390_r13, 0);                     \
34         }
35
36 #define S390_SET_MASK(loc, dr, v)                               \
37         do {                                                    \
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);                 \
42                 } else {                                        \
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);                 \
48                 }                                               \
49         } while (0)
50
51 #define S390_CALL_TEMPLATE(loc, r)                              \
52         do {                                                    \
53                 s390_iihf (loc, r, 0);                          \
54                 s390_iilf (loc, r, 0);                          \
55                 s390_basr (loc, s390_r14, r);                   \
56         } while (0)
57
58 #define S390_BR_TEMPLATE(loc, r)                                \
59         do {                                                    \
60                 s390_iihf (loc, r, 0);                          \
61                 s390_iilf (loc, r, 0);                          \
62                 s390_br   (loc, r);                             \
63         } while (0)
64
65 #define S390_LOAD_TEMPLATE(loc, r)                              \
66         do {                                                    \
67                 s390_iihf (loc, r, 0);                          \
68                 s390_iilf (loc, r, 0);                          \
69         } while (0)
70
71 #define S390_EMIT_CALL(loc, t)                                  \
72         do {                                                    \
73                 gint64 val = (gint64) t;                        \
74                 guint32 hi = (val) >> 32;                       \
75                 guint32 lo = (val) & 0xffffffff;                \
76                 uintptr_t p = (uintptr_t) loc;                  \
77                 p += 2;                                         \
78                 *(guint32 *) p = hi;                            \
79                 p += 6;                                         \
80                 *(guint32 *) p = lo;                            \
81         } while (0)
82
83 #define S390_EMIT_LOAD(loc, v)                                  \
84         do {                                                    \
85                 gint64 val = (gint64) v;                        \
86                 guint32 hi = (val) >> 32;                       \
87                 guint32 lo = (val) & 0xffffffff;                \
88                 uintptr_t p = (uintptr_t) loc;                  \
89                 p += 2;                                         \
90                 *(guint32 *) p = hi;                            \
91                 p += 6;                                         \
92                 *(guint32 *) p = lo;                            \
93         } while (0)
94
95 #endif  /* __MONO_SUPPORT_S390X_H__ */