Merge pull request #1631 from alexanderkyte/stringbuilder-referencesource
[mono.git] / mono / mini / support-s390x.h
1 #ifndef __MONO_SUPPORT_S390X_H__
2 #define __MONO_SUPPORT_S390X_H__
3
4 typedef struct __FACLIST__ {
5         uint8_t n3:1;           // 000 - N3 instructions
6         uint8_t zi:1;           // 001 - z/Arch installed
7         uint8_t za:1;           // 002 - z/Arch active
8         uint8_t date:1;         // 003 - DAT-enhancement
9         uint8_t idtes:1;        // 004 - IDTE-segment tables
10         uint8_t idter:1;        // 005 - IDTE-region tables
11         uint8_t asnlx:1;        // 006 - ASN-LX reuse
12         uint8_t stfle:1;        // 007 - STFLE
13         uint8_t edat1:1;        // 008 - EDAT 1
14         uint8_t srs:1;          // 009 - Sense-Running-Status
15         uint8_t csske:1;        // 010 - Conditional SSKE
16         uint8_t ctf:1;          // 011 - Configuration-topology
17         uint8_t ibm01:1;        // 012 - Assigned to IBM
18         uint8_t ipter:1;        // 013 - IPTE-range
19         uint8_t nqks:1;         // 014 - Nonquiescing key-setting
20         uint8_t ibm02:1;        // 015 - Assigned to IBM
21         uint8_t etf2:1;         // 016 - Extended translation 2
22         uint8_t msa:1;          // 017 - Message security assist 1
23         uint8_t ld:1;           // 018 - Long displacement
24         uint8_t ldh:1;          // 019 - Long displacement high perf
25         uint8_t mas:1;          // 020 - HFP multiply-add-subtract
26         uint8_t eif:1;          // 021 - Extended immediate
27         uint8_t etf3:1;         // 022 - Extended translation 3
28         uint8_t hux:1;          // 023 - HFP unnormalized extension
29         uint8_t etf2e:1;        // 024 - Extended translation enhanced 2
30         uint8_t stckf:1;        // 025 - Store clock fast
31         uint8_t pe:1;           // 026 - Parsing enhancement
32         uint8_t mvcos:1;        // 027 - Move with optional specs
33         uint8_t tods:1;         // 028 - TOD steering
34         uint8_t x000:1;         // 029 - Undefined
35         uint8_t etf3e:1;        // 030 - ETF3 enhancement
36         uint8_t ecput:1;        // 031 - Extract CPU time
37         uint8_t csst:1;         // 032 - Compare swap and store
38         uint8_t csst2:1;        // 033 - Compare swap and store 2
39         uint8_t gie:1;          // 034 - General instructions extension
40         uint8_t ee:1;           // 035 - Execute extensions
41         uint8_t em:1;           // 036 - Enhanced monitor
42         uint8_t fpe:1;          // 037 - Floating point extension
43         uint8_t x001:1;         // 038 - Undefined
44         uint8_t ibm03:1;        // 039 - Assigned to IBM
45         uint8_t spp:1;          // 040 - Set program parameters
46         uint8_t fpse:1;         // 041 - FP support enhancement
47         uint8_t dfp:1;          // 042 - DFP
48         uint8_t dfph:1;         // 043 - DFP high performance
49         uint8_t pfpo:1;         // 044 - PFPO instruction
50         uint8_t multi:1;        // 045 - Multiple inc load/store on CC 1
51         uint8_t ibm04:1;        // 046 - Assigned to IBM
52         uint8_t cmpsce:1;       // 047 - CMPSC enhancement
53         uint8_t dfpzc:1;        // 048 - DFP zoned conversion
54         uint8_t misc:1;         // 049 - Multiple inc load and trap
55         uint8_t ctx:1;          // 050 - Constrained transactional-execution
56         uint8_t ltlb:1;         // 051 - Local TLB clearing
57         uint8_t ia:1;           // 052 - Interlocked access
58         uint8_t lsoc2:1;        // 053 - Load/store on CC 2
59         uint8_t x002:1;         // 054 - Undefined
60         uint8_t ibm05:1;        // 055 - Assigned to IBM
61         uint8_t x003:1;         // 056 - Undefined
62         uint8_t msa5:1;         // 057 - Message security assist 5
63         uint8_t x004:1;         // 058 - Undefined
64         uint8_t x005:1;         // 059 - Undefined
65         uint8_t x006:1;         // 060 - Undefined
66         uint8_t x007:1;         // 061 - Undefined
67         uint8_t ibm06:1;        // 062 - Assigned to IBM
68         uint8_t x008:1;         // 063 - Undefined
69         uint8_t x009:1;         // 064 - Undefined
70         uint8_t ibm07:1;        // 065 - Assigned to IBM
71         uint8_t rrbm:1;         // 066 - Reset reference bits multiple
72         uint8_t cmc:1;          // 067 - CPU measurement counter
73         uint8_t cms:1;          // 068 - CPU Measurement sampling
74         uint8_t ibm08:1;        // 069 - Assigned to IBM
75         uint8_t ibm09:1;        // 070 - Assigned to IBM
76         uint8_t ibm10:1;        // 071 - Assigned to IBM
77         uint8_t ibm11:1;        // 072 - Assigned to IBM
78         uint8_t txe:1;          // 073 - Transactional execution
79         uint8_t sthy:1;         // 074 - Store hypervisor information
80         uint8_t aefsi:1;        // 075 - Access exception fetch/store indication
81         uint8_t msa3:1;         // 076 - Message security assist 3
82         uint8_t msa4:1;         // 077 - Message security assist 4
83         uint8_t edat2:1;        // 078 - Enhanced DAT 2
84         uint8_t x010:1;         // 079 - Undefined
85         uint8_t dfppc:1;        // 080 - DFP packed conversion
86         uint8_t x011:7;         // 081-87 - Undefined
87         uint8_t x012[5];        // 088-127 - Undefined
88         uint8_t ibm12:1;        // 128 - Assigned to IBM
89         uint8_t vec:1;          // 129 - Vector facility
90         uint8_t x013:6;         // 130-135 - Undefined
91         uint8_t x014:6;         // 136-141 - Undefined
92         uint8_t sccm:1;         // 142 - Store CPU counter multiple
93         uint8_t ibm13:1;        // 143 - Assigned to IBM
94         uint8_t x015[14];       // 144-256 Undefined
95 } __attribute__ ((packed)) __attribute__ ((aligned(8))) facilities_t;
96
97 #define S390_SET(loc, dr, v)                                    \
98         do {                                                    \
99                 guint64 val = (guint64) v;                      \
100                 if (s390_is_imm16(val)) {                       \
101                         s390_lghi(loc, dr, val);                \
102                 } else if (s390_is_uimm16(val)) {               \
103                         s390_llill(loc, dr, val);               \
104                 } else if (s390_is_imm32(val)) {                \
105                         s390_lgfi(loc, dr, val);                \
106                 } else if (s390_is_uimm32(val)) {               \
107                         s390_llilf(loc, dr, val);               \
108                 } else {                                        \
109                         guint32 hi = (val) >> 32;               \
110                         guint32 lo = (val) & 0xffffffff;        \
111                         s390_iihf(loc, dr, hi);                 \
112                         s390_iilf(loc, dr, lo);                 \
113                 }                                               \
114         } while (0)
115
116 #define S390_LONG(loc, opy, op, r, ix, br, off)                         \
117         if (s390_is_imm20(off)) {                                       \
118                 s390_##opy (loc, r, ix, br, off);                       \
119         } else {                                                        \
120                 if (ix == 0) {                                          \
121                         S390_SET(loc, s390_r13, off);                   \
122                         s390_la (loc, s390_r13, s390_r13, br, 0);       \
123                 } else {                                                \
124                         s390_la   (loc, s390_r13, ix, br, 0);           \
125                         S390_SET  (loc, s390_r0, off);                  \
126                         s390_agr  (loc, s390_r13, s390_r0);             \
127                 }                                                       \
128                 s390_##op (loc, r, 0, s390_r13, 0);                     \
129         }
130
131 #define S390_SET_MASK(loc, dr, v)                               \
132         do {                                                    \
133                 if (s390_is_imm16 (v)) {                        \
134                         s390_lghi (loc, dr, v);                 \
135                 } else if (s390_is_imm32 (v)) {                 \
136                         s390_lgfi (loc, dr, v);                 \
137                 } else {                                        \
138                         gint64 val = (gint64) v;                \
139                         guint32 hi = (val) >> 32;               \
140                         guint32 lo = (val) & 0xffffffff;        \
141                         s390_iilf(loc, dr, lo);                 \
142                         s390_iihf(loc, dr, hi);                 \
143                 }                                               \
144         } while (0)
145
146 #define S390_CALL_TEMPLATE(loc, r)                              \
147         do {                                                    \
148                 s390_iihf (loc, r, 0);                          \
149                 s390_iilf (loc, r, 0);                          \
150                 s390_basr (loc, s390_r14, r);                   \
151         } while (0)
152
153 #define S390_BR_TEMPLATE(loc, r)                                \
154         do {                                                    \
155                 s390_iihf (loc, r, 0);                          \
156                 s390_iilf (loc, r, 0);                          \
157                 s390_br   (loc, r);                             \
158         } while (0)
159
160 #define S390_LOAD_TEMPLATE(loc, r)                              \
161         do {                                                    \
162                 s390_iihf (loc, r, 0);                          \
163                 s390_iilf (loc, r, 0);                          \
164         } while (0)
165
166 #define S390_EMIT_CALL(loc, t)                                  \
167         do {                                                    \
168                 gint64 val = (gint64) t;                        \
169                 guint32 hi = (val) >> 32;                       \
170                 guint32 lo = (val) & 0xffffffff;                \
171                 uintptr_t p = (uintptr_t) loc;                  \
172                 p += 2;                                         \
173                 *(guint32 *) p = hi;                            \
174                 p += 6;                                         \
175                 *(guint32 *) p = lo;                            \
176         } while (0)
177
178 #define S390_EMIT_LOAD(loc, v)                                  \
179         do {                                                    \
180                 gint64 val = (gint64) v;                        \
181                 guint32 hi = (val) >> 32;                       \
182                 guint32 lo = (val) & 0xffffffff;                \
183                 uintptr_t p = (uintptr_t) loc;                  \
184                 p += 2;                                         \
185                 *(guint32 *) p = hi;                            \
186                 p += 6;                                         \
187                 *(guint32 *) p = lo;                            \
188         } while (0)
189
190 #endif  /* __MONO_SUPPORT_S390X_H__ */