Add instructions to support enhanced memory-to-memory operations.
[mono.git] / mono / arch / s390 / s390-codegen.h
1 /*
2    Copyright (C)  2001 Radek Doulik
3 */
4
5 #ifndef S390_H
6 #define S390_H
7 #include <glib.h>
8 #include <assert.h>
9
10 #define FLOAT_REGS      2       /* No. float registers for parms    */
11 #define GENERAL_REGS    5       /* No. general registers for parms  */
12
13 #define ARG_BASE s390_r10       /* Register for addressing arguments*/
14 #define STKARG \
15         (i*(sizeof(stackval)))  /* Displacement of ith argument     */
16
17 #define MINV_POS        96      /* MonoInvocation stack offset      */
18 #define STACK_POS       (MINV_POS - sizeof (stackval) * sig->param_count)
19 #define OBJ_POS         8
20 #define TYPE_OFFSET     (G_STRUCT_OFFSET (stackval, type))
21
22 #define MIN_CACHE_LINE 256
23
24 /*------------------------------------------------------------------*/
25 /* Sequence to add an int/long long to parameters to stack_from_data*/
26 /*------------------------------------------------------------------*/
27 #define ADD_ISTACK_PARM(r, i) \
28         if (reg_param < GENERAL_REGS-(r)) { \
29                 s390_la (p, s390_r4, 0, STK_BASE, \
30                          local_start + (reg_param - this_flag) * sizeof(long)); \
31                 reg_param += (i); \
32         } else { \
33                 s390_la (p, s390_r4, 0, STK_BASE, \
34                          sz.stack_size + MINV_POS + stack_param * sizeof(long)); \
35                 stack_param += (i); \
36         }
37
38 /*------------------------------------------------------------------*/
39 /* Sequence to add a float/double to parameters to stack_from_data  */
40 /*------------------------------------------------------------------*/
41 #define ADD_RSTACK_PARM(i) \
42         if (fpr_param < FLOAT_REGS) { \
43                 s390_la (p, s390_r4, 0, STK_BASE, \
44                          float_pos + (fpr_param * sizeof(float) * (i))); \
45                 fpr_param++; \
46         } else { \
47                 stack_param += (stack_param % (i)); \
48                 s390_la (p, s390_r4, 0, STK_BASE, \
49                          sz.stack_size + MINV_POS + stack_param * sizeof(float) * (i)); \
50                 stack_param += (i); \
51         }
52
53 /*------------------------------------------------------------------*/
54 /* Sequence to add a structure ptr to parameters to stack_from_data */
55 /*------------------------------------------------------------------*/
56 #define ADD_TSTACK_PARM \
57         if (reg_param < GENERAL_REGS) { \
58                 s390_l (p, s390_r4, 0, STK_BASE, \
59                         local_start + (reg_param - this_flag) * sizeof(long)); \
60                 reg_param++; \
61         } else { \
62                 s390_l (p, s390_r4, 0, STK_BASE, \
63                         sz.stack_size + MINV_POS + stack_param * sizeof(long)); \
64                 stack_param++; \
65         }
66
67 #define ADD_PSTACK_PARM(r, i) \
68         if (reg_param < GENERAL_REGS-(r)) { \
69                 s390_la (p, s390_r4, 0, STK_BASE, \
70                          local_start + (reg_param - this_flag) * sizeof(long)); \
71                 reg_param += (i); \
72         } else { \
73                 s390_l (p, s390_r4, 0, STK_BASE, \
74                         sz.stack_size + MINV_POS + stack_param * sizeof(long)); \
75                 stack_param++; \
76         }
77 typedef enum {
78         s390_r0 = 0,
79         s390_r1,
80         s390_r2,
81         s390_r3,
82         s390_r4,
83         s390_r5,
84         s390_r6,
85         s390_r7,
86         s390_r8,
87         s390_r9,
88         s390_r10,
89         s390_r11,
90         s390_r12,
91         s390_r13,
92         s390_r14,
93         s390_r15,
94 } S390IntRegister;
95
96 typedef enum {
97         s390_f0 = 0,
98         s390_f1,
99         s390_f2,
100         s390_f3,
101         s390_f4,
102         s390_f5,
103         s390_f6,
104         s390_f7,
105         s390_f8,
106         s390_f9,
107         s390_f10,
108         s390_f11,
109         s390_f12,
110         s390_f13,
111         s390_f14,
112         s390_f15,
113 } S390FloatRegister;
114
115 typedef enum {
116         s390_a0 = 0,
117         s390_a1,
118         s390_a2,
119         s390_a3,
120         s390_a4,
121         s390_a5,
122         s390_a6,
123         s390_a7,
124         s390_a8,
125         s390_a9,
126         s390_a10,
127         s390_a11,
128         s390_a12,
129         s390_a13,
130         s390_a14,
131         s390_a15,
132 } S390AccRegister;
133
134 typedef enum {
135         s390_fpc = 256,
136 } S390SpecialRegister;
137
138 #define s390_is_imm16(val)              ((gint)val >= (gint)-(1<<15) && \
139                                          (gint)val <= (gint)((1<<15)-1))
140 #define s390_is_uimm16(val)             ((gint)val >= 0 && (gint)val <= 65535)
141 #define s390_is_imm12(val)              ((gint)val >= (gint)-(1<<11) && \
142                                          (gint)val <= (gint)((1<<15)-1))
143 #define s390_is_uimm12(val)             ((gint)val >= 0 && (gint)val <= 4095)
144
145 #define STK_BASE                        s390_r15
146 #define S390_MINIMAL_STACK_SIZE         96
147 #define S390_REG_SAVE_OFFSET            24
148 #define S390_RET_ADDR_OFFSET            56
149
150 #define S390_CC_ZR                      8
151 #define S390_CC_NE                      7
152 #define S390_CC_NZ                      7
153 #define S390_CC_LT                      4
154 #define S390_CC_GT                      2
155 #define S390_CC_GE                      11
156 #define S390_CC_LE                      13
157 #define S390_CC_OV                      1
158 #define S390_CC_NO                      14
159 #define S390_CC_CY                      3
160 #define S390_CC_NC                      12
161 #define S390_CC_UN                      15
162
163 #define s390_word(addr, value)          do {*((guint32 *) addr) = (guint32) (value); \
164                                             ((guint32 *) addr)++;} while (0)
165 #define s390_float(addr, value)         do {*((guint32 *) addr) = (guint32) (value); \
166                                             ((guint32 *) addr)++;} while (0)
167 #define s390_llong(addr, value)         do {*((guint64 *) addr) = (guint64) (value); \
168                                             ((guint64 *) addr)++;} while (0)
169 #define s390_double(addr, value)        do {*((guint64 *) addr) = (guint64) (value); \
170                                             ((guint64 *) addr)++;} while (0)
171 #define s390_emit16(c, x)               do {*((guint16 *) c) = x; ((guint16 *) c)++;} while(0)
172 #define s390_emit32(c, x)               do {*((guint32 *) c) = x; ((guint32 *) c)++;} while(0)
173 #define s390_basr(code, r1, r2)         s390_emit16 (code, (13 << 8 | (r1) << 4 | (r2)))
174 #define s390_bras(code, r, o)           s390_emit32 (code, (167 << 24 | (r) << 20 | 5 << 16 | (o)))
175 #define s390_brasl(code, r, o)          do {s390_emit16 (code, (192 << 8 | (r) << 4 | 5)); \
176                                             s390_emit32 (code, (o));} while(0)
177 #define s390_ahi(code, r, v)            s390_emit32 (code, (167 << 24 | (r) << 20 | 10 << 16 | ((v) & 0xffff)))
178 #define s390_alcr(code, r1, r2)         s390_emit32 (code, (185 << 24 | 152 << 16 | (r1) << 4 | (r2)))
179 #define s390_ar(code, r1, r2)           s390_emit16 (code, (26 << 8 | (r1) << 4 | (r2)))
180 #define s390_alr(code, r1, r2)          s390_emit16 (code, (30 << 8 | (r1) << 4 | (r2)))
181 #define s390_a(code, r, x, b, d)        s390_emit32 (code, (90 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
182 #define s390_al(code, r, x, b, d)       s390_emit32 (code, (94 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
183 #define s390_slbr(code, r1, r2)         s390_emit32 (code, (185 << 24 | 153 << 16 | (r1) << 4 | (r2)))
184 #define s390_sr(code, r1, r2)           s390_emit16 (code, (27 << 8 | (r1) << 4 | (r2)))
185 #define s390_slr(code, r1, r2)          s390_emit16 (code, (31 << 8 | (r1) << 4 | (r2)))
186 #define s390_s(code, r, x, b, d)        s390_emit32 (code, (91 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
187 #define s390_sl(code, r, x, b, d)       s390_emit32 (code, (95 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
188 #define s390_mr(code, r1, r2)           s390_emit16 (code, (28 << 8 | (r1) << 4 | (r2)))
189 #define s390_m(code, r, x, b, d)        s390_emit32 (code, (92 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
190 #define s390_msr(code, r1, r2)          s390_emit32 (code, (178 << 24 | 82 << 16 | (r1) << 4| (r2)))
191 #define s390_ms(code, r, x, b, d)       s390_emit32 (code, (113 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
192 #define s390_mlr(code, r1, r2)          s390_emit32 (code, (185 << 24 | 150 << 16 | (r1) << 4| (r2)))
193 #define s390_dr(code, r1, r2)           s390_emit16 (code, (29 << 8 | (r1) << 4 | (r2)))
194 #define s390_d(code, r, x, b, d)        s390_emit32 (code, (93 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
195 #define s390_dlr(code, r1, r2)          s390_emit32 (code, (185 << 24 | 151 << 16 | (r1) << 4| (r2)))
196 #define s390_br(code, r)                s390_emit16 (code, (7 << 8 | 15 << 4 | (r)))
197 #define s390_nr(code, r1, r2)           s390_emit16 (code, (20 << 8 | (r1) << 4 | (r2)))
198 #define s390_n(code, r, x, b, d)        s390_emit32 (code, (84 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
199 #define s390_or(code, r1, r2)           s390_emit16 (code, (22 << 8 | (r1) << 4 | (r2)))
200 #define s390_o(code, r, x, b, d)        s390_emit32 (code, (86 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
201 #define s390_xr(code, r1, r2)           s390_emit16 (code, (23 << 8 | (r1) << 4 | (r2)))
202 #define s390_x(code, r, x, b, d)        s390_emit32 (code, (87 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
203 #define s390_lr(code, r1, r2)           s390_emit16 (code, (24 << 8 | (r1) << 4 | (r2)))
204 #define s390_ltr(code, r1, r2)          s390_emit16 (code, (18 << 8 | (r1) << 4 | (r2)))
205 #define s390_l(code, r, x, b, d)        s390_emit32 (code, (88 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
206 #define s390_lcr(code, r1, r2)          s390_emit16 (code, (19 << 8 | (r1) << 4 | (r2)))
207 #define s390_lnr(code, r1, r2)          s390_emit16 (code, (17 << 8 | (r1) << 4 | (r2)))
208 #define s390_lpr(code, r1, r2)          s390_emit16 (code, (16 << 8 | (r1) << 4 | (r2)))
209 #define s390_lm(code, r1, r2, b, d)     s390_emit32 (code, (152 << 24 | (r1) << 20 | (r2) << 16 \
210                                                     | (b) << 12 | ((d) & 0xfff)))
211 #define s390_lh(code, r, x, b, d)       s390_emit32 (code, (72 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
212 #define s390_lhi(code, r, v)            s390_emit32 (code, (167 << 24 | (r) << 20 | 8 << 16 | ((v) & 0xffff)))
213 #define s390_ic(code, r, x, b, d)       s390_emit32 (code, (67 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
214 #define s390_icm(code, r, m, b, d)      s390_emit32 (code, (191 << 24 | (r) << 20 | (m) << 16 | (b) << 12 | ((d) & 0xfff)))
215 #define s390_st(code, r, x, b, d)       s390_emit32 (code, (80 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
216 #define s390_stm(code, r1, r2, b, d)    s390_emit32 (code, (144 << 24 | (r1) << 20 | (r2) << 16 \
217                                                     | (b) << 12 | ((d) & 0xfff)))
218 #define s390_stam(c, r1, r2, b, d)      s390_emit32 (code, (155 << 24 | (r1) << 20 | (r2) << 16 \
219                                                     | (b) << 12 | ((d) & 0xfff)))
220 #define s390_lam(c, r1, r2, b, d)       s390_emit32 (code, (154 << 24 | (r1) << 20 | (r2) << 16 \
221                                                     | (b) << 12 | ((d) & 0xfff)))
222 #define s390_sth(code, r, x, b, d)      s390_emit32 (code, (64 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
223 #define s390_stc(code, r, x, b, d)      s390_emit32 (code, (66 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
224 #define s390_stcm(code, r, m, b, d)     s390_emit32 (code, (190 << 24 | (r) << 20 | (m) << 16 | (b) << 12 | ((d) & 0xfff)))
225 #define s390_la(code, r, x, b, d)       s390_emit32 (code, (65 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
226 #define s390_larl(code, r, o)           do {                                            \
227                                             s390_emit16 (code, (192 << 8 | (r) << 4));  \
228                                             s390_emit32 (code, (o));                    \
229                                         } while (0)
230 #define s390_ld(code, f, x, b, d)       s390_emit32 (code, (104 << 24 | (f) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
231 #define s390_le(code, f, x, b, d)       s390_emit32 (code, (120 << 24 | (f) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
232 #define s390_std(code, f, x, b, d)      s390_emit32 (code, (96 << 24 | (f) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
233 #define s390_ste(code, f, x, b, d)      s390_emit32 (code, (112 << 24 | (f) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
234 #define s390_mvc(c, l, b1, d1, b2, d2)  do {s390_emit32 (c, (210 << 24 | ((((l)-1)  << 16) & 0x00ff0000) | \
235                                                         (b1) << 12 | ((d1) & 0xfff)));            \
236                                             s390_emit16 (c, ((b2) << 12 | ((d2) & 0xfff)));} while (0)
237 #define s390_mvcle(c, r1, r3, d2, b2)   s390_emit32 (c, (168 << 24 | (r1) << 20 |       \
238                                                      (r3) << 16 | (b2) << 12 |          \
239                                                      ((d2) & 0xfff)))
240 #define s390_break(c)                   s390_emit16 (c, 0)
241 #define s390_nill(c, r1, v)             s390_emit32 (c, (165 << 24 | (r1) << 20 | 7 << 16 | ((v) & 0xffff)))
242 #define s390_nilh(c, r1, v)             s390_emit32 (c, (165 << 24 | (r1) << 20 | 6 << 16 | ((v) & 0xffff)))
243 #define s390_brc(c, m, d)               s390_emit32 (c, (167 << 24 | ((m) & 0xff) << 20 | 4 << 16 | ((d) & 0xffff)))
244 #define s390_cr(c, r1, r2)              s390_emit16 (c, (25 << 8 | (r1) << 4 | (r2)))
245 #define s390_clr(c, r1, r2)             s390_emit16 (c, (21 << 8 | (r1) << 4 | (r2)))
246 #define s390_c(c, r, x, b, d)           s390_emit32 (c, (89 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
247 #define s390_cl(c, r, x, b, d)          s390_emit32 (c, (85 << 24 | (r) << 20 | (x) << 16 | (b) << 12 | ((d) & 0xfff)))
248 #define s390_chi(c, r, i)               s390_emit32 (c, (167 << 24 | (r) << 20 | 15 << 16 | ((i) & 0xffff)))
249 #define s390_j(c,d)                     s390_brc(c, S390_CC_UN, d)
250 #define s390_je(c, d)                   s390_brc(c, S390_CC_EQ, d)
251 #define s390_jeo(c, d)                  s390_brc(c, S390_CC_ZR|S390_CC_OV, d)
252 #define s390_jz(c, d)                   s390_brc(c, S390_CC_ZR, d)
253 #define s390_jnz(c, d)                  s390_brc(c, S390_CC_NZ, d)
254 #define s390_jne(c, d)                  s390_brc(c, S390_CC_NZ, d)
255 #define s390_jp(c, d)                   s390_brc(c, S390_CC_GT, d)
256 #define s390_jm(c, d)                   s390_brc(c, S390_CC_LT, d)
257 #define s390_jh(c, d)                   s390_brc(c, S390_CC_GT, d)
258 #define s390_jl(c, d)                   s390_brc(c, S390_CC_LT, d)
259 #define s390_jnh(c, d)                  s390_brc(c, S390_CC_LE, d)
260 #define s390_jo(c, d)                   s390_brc(c, S390_CC_OV, d)
261 #define s390_jnl(c, d)                  s390_brc(c, S390_CC_GE, d)                      
262 #define s390_jlo(c, d)                  s390_brc(c, S390_CC_LT|S390_CC_OV, d)
263 #define s390_jho(c, d)                  s390_brc(c, S390_CC_GT|S390_CC_OV, d)           
264 #define s390_jc(c, m, d)                s390_brc(c, m, d)
265 #define s390_jcl(c, m, d)               do {s390_emit16 (c, (192 << 8 | (m) << 4 | 4)); \
266                                             s390_emit32 (c, (d));} while(0)
267 #define s390_slda(c, r, b, d)           s390_emit32 (c, (143 << 24 | (r) << 20 | (b) << 12 | ((d) & 0xfff)))
268 #define s390_sldl(c, r, b, d)           s390_emit32 (c, (141 << 24 | (r) << 20 | (b) << 12 | ((d) & 0xfff)))
269 #define s390_srda(c, r, b, d)           s390_emit32 (c, (142 << 24 | (r) << 20 | (b) << 12 | ((d) & 0xfff)))
270 #define s390_srdl(c, r, b, d)           s390_emit32 (c, (140 << 24 | (r) << 20 | (b) << 12 | ((d) & 0xfff)))
271 #define s390_sla(c, r, b, d)            s390_emit32 (c, (139 << 24 | (r) << 20 | (b) << 12 | ((d) & 0xfff)))
272 #define s390_sll(c, r, b, d)            s390_emit32 (c, (137 << 24 | (r) << 20 | (b) << 12 | ((d) & 0xfff)))
273 #define s390_sra(c, r, b, d)            s390_emit32 (c, (138 << 24 | (r) << 20 | (b) << 12 | ((d) & 0xfff)))
274 #define s390_srl(c, r, b, d)            s390_emit32 (c, (136 << 24 | (r) << 20 | (b) << 12 | ((d) & 0xfff)))
275 #define s390_sqdbr(c, r1, r2)           s390_emit32 (c, (179 << 24 | 21 << 16 | ((r1) << 4) | (r2)))
276 #define s390_sqebr(c, r1, r2)           s390_emit32 (c, (179 << 24 | 20 << 16 | ((r1) << 4) | (r2)))
277 #define s390_adbr(c, r1, r2)            s390_emit32 (c, (179 << 24 | 26 << 16 | ((r1) << 4) | (r2)))
278 #define s390_aebr(c, r1, r2)            s390_emit32 (c, (179 << 24 | 10 << 16 | ((r1) << 4) | (r2)))
279 #define s390_adb(c, r, x, b, d)         do {s390_emit32 (c, (237 << 24 | (r) << 20 |    \
280                                              (x) << 16 | (b) << 12 | ((d) & 0xfff)));   \
281                                             s390_emit16 (c, (26));                      \
282                                         } while (0)
283 #define s390_sdbr(c, r1, r2)            s390_emit32 (c, (179 << 24 | 27 << 16 | ((r1) << 4) | (r2)))
284 #define s390_sdb(c, r, x, b, d)         do {s390_emit32 (c, (237 << 24 | (r) << 20 |    \
285                                              (x) << 16 | (b) << 12 | ((d) & 0xfff)));   \
286                                             s390_emit16 (c, (27));                      \
287                                         } while (0)
288 #define s390_sebr(c, r1, r2)            s390_emit32 (c, (179 << 24 | 11 << 16 | ((r1) << 4) | (r2)))
289 #define s390_mdbr(c, r1, r2)            s390_emit32 (c, (179 << 24 | 28 << 16 | ((r1) << 4) | (r2)))
290 #define s390_meebr(c, r1, r2)           s390_emit32 (c, (179 << 24 | 23 << 16 | ((r1) << 4) | (r2)))
291 #define s390_ldr(c, r1, r2)             s390_emit16 (c, (40 << 8 | (r1) << 4 | (r2)))
292 #define s390_ler(c, r1, r2)             s390_emit16 (c, (56 << 8 | (r1) << 4 | (r2)))
293 #define s390_lzdr(c, r1)                s390_emit32 (c, (179 << 24 | 117 << 16 | (r1) << 4))
294 #define s390_lzer(c, r1)                s390_emit32 (c, (179 << 24 | 116 << 16 | (r1) << 4))
295 #define s390_ddbr(c, r1, r2)            s390_emit32 (c, (179 << 24 | 29 << 16 | ((r1) << 4) | (r2)))
296 #define s390_debr(c, r1, r2)            s390_emit32 (c, (179 << 24 | 13 << 16 | ((r1) << 4) | (r2)))
297 #define s390_didbr(c, r1, r2, m, r3)    s390_emit32 (c, (179 << 24 | 91 << 16 | ((r3) << 12) | ((m) << 8) | ((r1) << 4) | (r2)))
298 #define s390_lcdbr(c, r1, r2)           s390_emit32 (c, (179 << 24 | 19 << 16 | ((r1) << 4) | (r2)))
299 #define s390_lndbr(c, r1, r2)           s390_emit32 (c, (179 << 24 | 17 << 16 | ((r1) << 4) | (r2)))
300 #define s390_ldebr(c, r1, r2)           s390_emit32 (c, (179 << 24 | 4 << 16 | ((r1) << 4) | (r2)))
301 #define s390_lnebr(c, r1, r2)           s390_emit32 (c, (179 << 24 | 1 << 16 | ((r1) << 4) | (r2)))
302 #define s390_ledbr(c, r1, r2)           s390_emit32 (c, (179 << 24 | 68 << 16 | ((r1) << 4) | (r2)))
303 #define s390_ldeb(c, r, x, b, d)        do {s390_emit32 (c, (237 << 24 | (r) << 20 |    \
304                                              (x) << 16 | (b) << 12 | ((d) & 0xfff)));   \
305                                             s390_emit16 (c, (4));                       \
306                                         } while (0)
307 #define s390_cfdbr(c, r1, m, f2)        s390_emit32 (c, (179 << 24 | 153 << 16 | (m) << 12 | (r1) << 4 | (f2)))
308 #define s390_cdfbr(c, r1, r2)           s390_emit32 (c, (179 << 24 | 149 << 16 | (r1) << 4 | (r2)))
309 #define s390_cefbr(c, r1, r2)           s390_emit32 (c, (179 << 24 | 148 << 16 | (r1) << 4 | (r2)))
310 #define s390_cdbr(c, r1, r2)            s390_emit32 (c, (179 << 24 | 25 << 16 | (r1) << 4 | (r2)))
311 #define s390_cebr(c, r1, r2)            s390_emit32 (c, (179 << 24 | 9 << 16 | (r1) << 4 | (r2)))
312 #define s390_cdb(c, r, x, b, d)         do {s390_emit32 (c, (237 << 24 | (r) << 20 |    \
313                                              (x) << 16 | (b) << 12 | ((d) & 0xfff)));   \
314                                             s390_emit16 (c, (25));                      \
315                                         } while (0)
316 #define s390_tcdb(c, r, x, b, d)        do {s390_emit32 (c, (237 << 24 | (r) << 20 |    \
317                                              (x) << 16 | (b) << 12 | ((d) & 0xfff)));   \
318                                             s390_emit16 (c, (17));                      \
319                                         } while (0)
320 #define s390_tedb(c, r, x, b, d)        do {s390_emit32 (c, (237 << 24 | (r) << 20 |    \
321                                              (x) << 16 | (b) << 12 | ((d) & 0xfff)));   \
322                                             s390_emit16 (c, (16));                      \
323                                         } while (0)
324 #define s390_stfpc(c, b, d)             s390_emit32 (c, (178 << 24 | 156 << 16 | \
325                                                     (b) << 12 | ((d) & 0xfff)))
326
327 #endif