Merge pull request #637 from LogosBible/enetdown
[mono.git] / mono / arch / s390x / s390x-codegen.h
1 /*
2    Copyright (C)  2001 Radek Doulik
3 */
4
5 #ifndef S390X_H
6 #define S390X_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        160     /* 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_lay (p, s390_r4, 0, STK_BASE, \
30                           local_start + (reg_param - this_flag) * sizeof(long)); \
31                 reg_param += (i); \
32         } else { \
33                 s390_lay (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_lay (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_lay (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_ly (p, s390_r4, 0, STK_BASE, \
59                         local_start + (reg_param - this_flag) * sizeof(long)); \
60                 reg_param++; \
61         } else { \
62                 s390_ly (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_lay (p, s390_r4, 0, STK_BASE, \
70                           local_start + (reg_param - this_flag) * sizeof(long)); \
71                 reg_param += (i); \
72         } else { \
73                 s390_ly (p, s390_r4, 0, STK_BASE, \
74                          sz.stack_size + MINV_POS + stack_param * sizeof(long)); \
75                 stack_param++; \
76         }
77
78 typedef enum {
79         s390_r0 = 0,
80         s390_r1,
81         s390_r2,
82         s390_r3,
83         s390_r4,
84         s390_r5,
85         s390_r6,
86         s390_r7,
87         s390_r8,
88         s390_r9,
89         s390_r10,
90         s390_r11,
91         s390_r12,
92         s390_r13,
93         s390_r14,
94         s390_r15,
95 } S390IntRegister;
96
97 typedef enum {
98         s390_f0 = 0,
99         s390_f1,
100         s390_f2,
101         s390_f3,
102         s390_f4,
103         s390_f5,
104         s390_f6,
105         s390_f7,
106         s390_f8,
107         s390_f9,
108         s390_f10,
109         s390_f11,
110         s390_f12,
111         s390_f13,
112         s390_f14,
113         s390_f15,
114 } S390FloatRegister;
115
116 typedef enum {
117         s390_a0 = 0,
118         s390_a1,
119         s390_a2,
120         s390_a3,
121         s390_a4,
122         s390_a5,
123         s390_a6,
124         s390_a7,
125         s390_a8,
126         s390_a9,
127         s390_a10,
128         s390_a11,
129         s390_a12,
130         s390_a13,
131         s390_a14,
132         s390_a15,
133 } S390AccRegister;
134
135 typedef enum {
136         s390_fpc = 256,
137 } S390SpecialRegister;
138
139 #define s390_is_imm16(val)              ((glong)val >= (glong)-(1<<15) && \
140                                          (glong)val <= (glong)((1<<15)-1))
141 #define s390_is_uimm16(val)             ((glong)val >= 0 && (glong)val <= 65535)
142 #define s390_is_uimm20(val)             ((glong)val >= 0 && (glong)val <= 1048575)
143 #define s390_is_imm20(val)              ((glong)val >= -524288 && (glong)val <= 524287)
144 #define s390_is_imm12(val)              ((glong)val >= (glong)-(1<<11) && \
145                                          (glong)val <= (glong)((1<<11)-1))
146 #define s390_is_uimm12(val)             ((glong)val >= 0 && (glong)val <= 4095)
147
148 #define STK_BASE                        s390_r15
149 #define S390_SP                         s390_r15
150 #define S390_FP                         s390_r11
151 #define S390_MINIMAL_STACK_SIZE         160
152 #define S390_REG_SAVE_OFFSET            48
153 #define S390_PARM_SAVE_OFFSET           16
154 #define S390_RET_ADDR_OFFSET            112
155 #define S390_FLOAT_SAVE_OFFSET          128
156
157 #define S390_CC_ZR                      8
158 #define S390_CC_NE                      7
159 #define S390_CC_NZ                      7
160 #define S390_CC_LT                      4
161 #define S390_CC_GT                      2
162 #define S390_CC_GE                      11
163 #define S390_CC_NM                      11
164 #define S390_CC_LE                      13
165 #define S390_CC_OV                      1
166 #define S390_CC_NO                      14
167 #define S390_CC_CY                      3
168 #define S390_CC_NC                      12
169 #define S390_CC_UN                      15
170
171 #define s390_word(addr, value) do               \
172 {                                               \
173         * (guint32 *) addr = (guint32) value;   \
174         addr += sizeof(guint32);                \
175 } while (0)
176
177 #define s390_float(addr, value) do              \
178 {                                               \
179         * (gfloat *) addr = (gfloat) value;     \
180         addr += sizeof(gfloat);                 \
181 } while (0)
182
183 #define s390_llong(addr, value) do              \
184 {                                               \
185         * (guint64 *) addr = (guint64) value;   \
186         addr += sizeof(guint64);                \
187 } while (0)
188
189 #define s390_double(addr, value) do             \
190 {                                               \
191         * (gdouble *) addr = (gdouble) value;   \
192         addr += sizeof(gdouble);                \
193 } while (0)
194
195 typedef struct {
196         short   op;
197 } E_Format;
198
199 typedef struct {
200         char    op;
201         int     im;
202 } I_Format;
203
204 typedef struct {
205         char    op;
206         char    r1 : 4;
207         char    r2 : 4;
208 } RR_Format;
209
210 typedef struct {
211         short   op;
212         char    xx;
213         char    r1 : 4;
214         char    r2 : 4;
215 } RRE_Format;
216
217 typedef struct {
218         short   op;
219         char    r1 : 4;
220         char    xx : 4;
221         char    r3 : 4;
222         char    r2 : 4;
223 } RRF_Format_1;
224
225 typedef struct {
226         short   op;
227         char    m3 : 4;
228         char    xx : 4;
229         char    r1 : 4;
230         char    r2 : 4;
231 } RRF_Format_2;
232
233 typedef struct {
234         short   op;
235         char    r3 : 4;
236         char    m4 : 4;
237         char    r1 : 4;
238         char    r2 : 4;
239 } RRF_Format_3;
240
241 typedef struct {
242         char    op;
243         char    r1 : 4;
244         char    x2 : 4;
245         char    b2 : 4;
246         short   d2 : 12;
247 } RX_Format;
248
249 typedef struct {
250         char    op1;
251         char    r1 : 4;
252         char    x2 : 4;
253         char    b2 : 4;
254         int     d2 : 12;
255         char    xx;
256         char    op2;
257 } RXE_Format;
258
259 typedef struct {
260         char    op1;
261         char    r3 : 4;
262         char    x2 : 4;
263         char    b2 : 4;
264         int     d2 : 12;
265         char    r1 : 4;
266         char    xx : 4;
267         char    op2;
268 } RXF_Format;
269
270 typedef struct {
271         char    op1;
272         char    r1 : 4;
273         char    x2 : 4;
274         char    b2 : 4;
275         int     d2 : 20;
276         char    op2;
277 } __attribute__ ((packed)) RXY_Format;
278
279 typedef struct {
280         char    op;
281         char    r1 : 4;
282         char    r3 : 4;
283         char    b2 : 4;
284         int     d2 : 12;
285 } RS_Format_1;
286
287 typedef struct {
288         char    op;
289         char    r1 : 4;
290         char    m3 : 4;
291         char    b2 : 4;
292         int     d2 : 12;
293 } RS_Format_2;
294
295 typedef struct {
296         char    op;
297         char    r1 : 4;
298         char    xx : 4;
299         char    b2 : 4;
300         int     d2 : 12;
301 } RS_Format_3;
302
303 typedef struct {
304         char    op1;
305         char    r1 : 4;
306         char    r3 : 4;
307         char    b2 : 4;
308         int     d2 : 20;
309         char    op2;
310 } __attribute__ ((packed)) RSY_Format_1;
311
312 typedef struct {
313         char    op1;
314         char    r1 : 4;
315         char    m3 : 4;
316         char    b2 : 4;
317         int     d2 : 20;
318         char    op2;
319 } __attribute__ ((packed)) RSY_Format_2;
320
321 typedef struct {
322         char    op1;
323         char    l1 : 4;
324         char    xx : 4;
325         char    b1 : 4;
326         int     d1 : 12;
327         char    yy;
328         char    op2;
329 } RSL_Format;
330
331 typedef struct {
332         char    op;
333         char    r1 : 4;
334         char    r3 : 4;
335         short   i2;
336 } RSI_Format;
337
338 typedef struct {
339         char    op1;
340         char    m1 : 4;
341         char    op2 : 4;
342         short   i2;
343 } RI_Format;
344
345 typedef struct {
346         char    op1;
347         char    r1 : 4;
348         char    r3 : 4;
349         short   i2;
350         char    xx;
351         char    op2;
352 } RIE_Format;
353
354 typedef struct {
355         char    op1;
356         char    r1 : 4;
357         char    op2 : 4;
358         int     i2;
359 } __attribute__ ((packed)) RIL_Format_1;
360
361 typedef struct {
362         char    op1;
363         char    m1 : 4;
364         char    op2 : 4;
365         int     i2;
366 } __attribute__ ((packed)) RIL_Format_2;
367
368 typedef struct {
369         char    op;
370         char    i2;
371         char    b1 : 4;
372         short   d1 : 12;
373 } SI_Format;
374
375 typedef struct {
376         char    op1;
377         char    i2;
378         char    b1 : 4;
379         int     d1 : 20;
380         char    op2;
381 } __attribute__ ((packed)) SIY_Format;
382
383 typedef struct {
384         short   op;
385         char    b2 : 4;
386         short   d2 : 12;
387 } S_Format;
388
389 typedef struct {
390         char    op;
391         char    ll;
392         char    b1 : 4;
393         short   d1 : 12;
394         char    b2 : 4;
395         short   d2 : 12;
396 } SS_Format_1;
397
398 typedef struct {
399         char    op;
400         char    l1 : 4;
401         char    l2 : 4;
402         char    b1 : 4; 
403         short   d1 : 12;
404         char    b2 : 4;
405         short   d2 : 12;
406 } SS_Format_2;
407
408 typedef struct {
409         char    op;
410         char    r1 : 4;
411         char    r3 : 4;
412         char    b1 : 4; 
413         short   d1 : 12;
414         char    b2 : 4;
415         short   d2 : 12;
416 } SS_Format_3;  
417
418 typedef struct {
419         char    op;
420         char    r1 : 4;
421         char    r3 : 4;
422         char    b2 : 4; 
423         short   d2 : 12;
424         char    b4 : 4;
425         short   d4 : 12;
426 } SS_Format_4;  
427
428 typedef struct {
429         short   op;
430         char    b1 : 4;
431         short   d1 : 12;
432         char    b2 : 4;
433         short   d2 : 12;
434 } __attribute__ ((packed)) SSE_Format;
435
436 #define s390_emit16(c, x) do                    \
437 {                                               \
438         *((guint16 *) c) = (guint16) x;         \
439         c += sizeof(guint16);                   \
440 } while(0)
441
442 #define s390_emit32(c, x) do                    \
443 {                                               \
444         *((guint32 *) c) = (guint32) x;         \
445         c += sizeof(guint32);                   \
446 } while(0)
447
448 #define S390_E(c,opc)                   s390_emit16(c,opc)
449
450 #define S390_I(c,opc,imm)               s390_emit16(c, (opc << 8 | imm))
451
452 #define S390_RR(c,opc,g1,g2)            s390_emit16(c, (opc << 8 | (g1) << 4 | g2))
453
454 #define S390_RRE(c,opc,g1,g2)           s390_emit32(c, (opc << 16 | (g1) << 4 | g2)) 
455
456 #define S390_RRF_1(c,opc,g1,g2,g3)      s390_emit32(c, (opc << 16 | (g1) << 12 | (g3) << 4 | g2))
457
458 #define S390_RRF_2(c,opc,g1,k3,g2)      s390_emit32(c, (opc << 16 | (k3) << 12 | (g1) << 4 | g2))
459
460 #define S390_RRF_3(c,opc,g1,g2,k4,g3)   s390_emit32(c, (opc << 16 | (g3) << 12 | (k4) << 8 | (g1) << 4 | g2))
461
462 #define S390_RX(c,opc,g1,n2,s2,p2)      s390_emit32(c, (opc << 24 | (g1) << 20 | (n2) << 16 | (s2) << 12 | ((p2) & 0xfff)))
463
464 #define S390_RXE(c,opc,g1,n2,s2,p2) do                          \
465 {                                                               \
466         s390_emit16(c, ((opc & 0xff00) | (g1) << 4 | n2));      \
467         s390_emit32(c, ((s2) << 28 | (((p2) & 0xfff) << 16) |   \
468                         (opc & 0xff)));                         \
469 } while (0)
470
471 #define S390_RXY(c,opc,g1,n2,s2,p2) do                          \
472 {                                                               \
473         s390_emit16(c, ((opc & 0xff00) | (g1) << 4 | n2));      \
474         s390_emit32(c, ((s2) << 28 | (((p2) & 0xfff) << 16) |   \
475                         ((((p2) & 0xff000) >> 12) << 8) |       \
476                         (opc & 0xff)));                         \
477 } while (0)
478
479 #define S390_RS_1(c,opc,g1,g3,s2,p2)    s390_emit32(c, (opc << 24 | (g1) << 20 | (g3) << 16 | (s2) << 12 | ((p2) & 0xfff))) 
480
481 #define S390_RS_2(c,opc,g1,k3,s2,p2)    s390_emit32(c, (opc << 24 | (g1) << 20 | (k3) << 16 | (s2) << 12 | ((p2) & 0xfff)))
482
483 #define S390_RS_3(c,opc,g1,s2,p2)       s390_emit32(c, (opc << 24 | (g1) << 20 | (s2) << 12 | ((p2) & 0xfff)))
484
485 #define S390_RSY_1(c,opc,g1,g3,s2,p2) do                        \
486 {                                                               \
487         s390_emit16(c, ((opc & 0xff00) | (g1) << 4 | g3));      \
488         s390_emit32(c, ((s2) << 28 | (((p2) & 0xfff) << 16) |   \
489                         ((((p2) & 0xff000) >> 12) << 8) |       \
490                         (opc & 0xff)));                         \
491 } while (0)
492
493 #define S390_RSY_2(c,opc,g1,k3,s2,p2) do                        \
494 {                                                               \
495         s390_emit16(c, ((opc & 0xff00) | (g1) << 4 | k3));      \
496         s390_emit32(c, ((s2) << 28 | (((p2) & 0xfff) << 16) |   \
497                         ((((p2) & 0xff000) >> 12) << 8) |       \
498                         (opc & 0xff)));                         \
499 } while (0)
500
501 #define S390_RSL(c,opc,ln,s1,p1) do                             \
502 {                                                               \
503         s390_emit16(c, ((opc & 0xff00) | (ln) << 4));           \
504         s390_emit32(c, ((s1) << 28 | ((s1 & 0xfff) << 16) |     \
505                         (opc & 0xff)));                         \
506 } while (0)
507
508 #define S390_RSI(c,opc,g1,g3,m2)        s390_emit32(c, (opc << 24 | (g1) << 20 | (g3) << 16 | (m2 & 0xffff)))
509
510 #define S390_RI(c,opc,g1,m2)            s390_emit32(c, ((opc >> 4) << 24 | (g1) << 20 | (opc & 0x0f) << 16 | (m2 & 0xffff)))
511
512 #define S390_RIE(c,opc,g1,g3,m2) do                             \
513 {                                                               \
514         s390_emit16(c, ((opc & 0xff00) | (g1) << 4 | g3));      \
515         s390_emit32(c, ((m2) << 16 | (opc & 0xff)));            \
516 } while (0)
517
518 #define S390_RIL_1(c,opc,g1,m2) do                                      \
519 {                                                                       \
520         s390_emit16(c, ((opc >> 4) << 8 | (g1) << 4 | (opc & 0xf)));    \
521         s390_emit32(c, m2);                                             \
522 } while (0)
523
524 #define S390_RIL_2(c,opc,k1,m2) do                                      \
525 {                                                                       \
526         s390_emit16(c, ((opc >> 4) << 8 | (k1) << 4 | (opc & 0xf)));    \
527         s390_emit32(c, m2);                                             \
528 } while (0)
529
530 #define S390_SI(c,opc,s1,p1,m2)         s390_emit32(c, (opc << 24 | (m2) << 16 | (s1) << 12 | ((p1) & 0xfff)));
531
532 #define S390_SIY(c,opc,s1,p1,m2) do                             \
533 {                                                               \
534         s390_emit16(c, ((opc & 0xff00) | m2));                  \
535         s390_emit32(c, ((s1) << 24 | (((p2) & 0xfffff) << 8) |  \
536                         (opc & 0xff)));                         \
537 } while (0)
538
539 #define S390_S(c,opc,s2,p2)     s390_emit32(c, (opc << 16 | (s2) << 12 | ((p2) & 0xfff)))
540
541 #define S390_SS_1(c,opc,ln,s1,p1,s2,p2) do                      \
542 {                                                               \
543         s390_emit32(c, (opc << 24 | ((ln-1) & 0xff) << 16 |     \
544                         (s1) << 12 | ((p1) & 0xfff)));          \
545         s390_emit16(c, ((s2) << 12 | ((p2) & 0xfff)));          \
546 } while (0)
547
548 #define S390_SS_2(c,opc,n1,n2,s1,p1,s2,p2) do                   \
549 {                                                               \
550         s390_emit32(c, (opc << 24 | (n1) << 16 | (n2) << 12 |   \
551                         (s1) << 12 | ((p1) & 0xfff)));          \
552         s390_emit16(c, ((s2) << 12 | ((p2) & 0xfff)));          \
553 } while (0)
554
555 #define S390_SS_3(c,opc,g1,g3,s1,p1,s2,p2) do                   \
556 {                                                               \
557         s390_emit32(c, (opc << 24 | (g1) << 16 | (g3) << 12 |   \
558                         (s1) << 12 | ((p1) & 0xfff)));          \
559         s390_emit16(c, ((s2) << 12 | ((p2) & 0xfff)));          \
560 } while (0)
561
562 #define S390_SS_4(c,opc,g1,g3,s2,p2,s4,p4) do                   \
563 {                                                               \
564         s390_emit32(c, (opc << 24 | (g1) << 16 | (g3) << 12 |   \
565                         (s2) << 12 | ((p2) & 0xfff)));          \
566         s390_emit16(c, ((s4) << 12 | ((p4) & 0xfff)));          \
567 } while (0)
568
569 #define S390_SSE(c,opc,s1,p1,s2,p2) do                  \
570 {                                                       \
571         s390_emit16(c, opc);                            \
572         s390_emit16(c, ((s1) << 12 | ((p1) & 0xfff)));  \
573         s390_emit16(c, ((s2) << 12 | ((p2) & 0xfff)));  \
574 } while (0)
575
576 #define s390_a(c, r, x, b, d)           S390_RX(c, 0x5a, r, x, b, d)
577 #define s390_adb(c, r, x, b, d)         S390_RXE(c, 0xed1a, r, x, b, d)
578 #define s390_adbr(c, r1, r2)            S390_RRE(c, 0xb31a, r1, r2)
579 #define s390_aebr(c, r1, r2)            S390_RRE(c, 0xb30a, r1, r2)
580 #define s390_ag(c, r, x, b, d)          S390_RXY(c, 0xe308, r, x, b, d)
581 #define s390_agf(c, r, x, b, d)         S390_RXY(c, 0xe318, r, x, b, d)
582 #define s390_aghi(c, r, v)              S390_RI(c, 0xa7b, r, v)
583 #define s390_agr(c, r1, r2)             S390_RRE(c, 0xb908, r1, r2)
584 #define s390_ahi(c, r, v)               S390_RI(c, 0xa7a, r, v)
585 #define s390_alcgr(c, r1, r2)           S390_RRE(c, 0xb988, r1, r2)
586 #define s390_alcr(c, r1, r2)            S390_RRE(c, 0xb998, r1, r2)
587 #define s390_al(c, r, x, b, d)          S390_RX(c, 0x5e, r, x, b, d)
588 #define s390_alg(c, r, x, b, d)         S390_RXY(c, 0xe30a, r, x, b, d)
589 #define s390_algf(c, r, x, b, d)        S390_RXY(c, 0xe31a, r, x, b, d)
590 #define s390_algr(c, r1, r2)            S390_RRE(c, 0xb90a, r1, r2)
591 #define s390_alr(c, r1, r2)             S390_RR(c, 0x1e, r1, r2)
592 #define s390_ar(c, r1, r2)              S390_RR(c, 0x1a, r1, r2)
593 #define s390_basr(c, r1, r2)            S390_RR(c, 0x0d, r1, r2)
594 #define s390_bctr(c, r1, r2)            S390_RR(c, 0x06, r1, r2)
595 #define s390_bctrg(c, r1, r2)           S390_RRE(c, 0xb946, r1, r2)
596 #define s390_bnzr(c, r)                 S390_RR(c, 0x07, 0x07, r)
597 #define s390_bras(c, r, o)              S390_RI(c, 0xa75, r, o)
598 #define s390_brasl(c, r, o)             S390_RIL_1(c, 0xc05, r, o)
599 #define s390_brc(c, m, d)               S390_RI(c, 0xa74, m, d)
600 #define s390_brcl(c, m, d)              S390_RIL_2(c, 0xc04, m, d)
601 #define s390_br(c, r)                   S390_RR(c, 0x07, 0xf, r)
602 #define s390_break(c)                   S390_RR(c, 0, 0, 0)
603 #define s390_bzr(c, r)                  S390_RR(c, 0x07, 0x08, r)
604 #define s390_c(c, r, x, b, d)           S390_RX(c, 0x59, r, x, b, d)
605 #define s390_cdb(c, r, x, b, d)         S390_RXE(c, 0xed19, r, x, b, d)
606 #define s390_cdbr(c, r1, r2)            S390_RRE(c, 0xb319, r1, r2)
607 #define s390_cdfbr(c, r1, r2)           S390_RRE(c, 0xb395, r1, r2)
608 #define s390_cdgbr(c, r1, r2)           S390_RRE(c, 0xb3a5, r1, r2)
609 #define s390_cds(c, r1, r2, b, d)       S390_RX(c, 0xbb, r1, r2, b, d)
610 #define s390_cdsg(c, r1, r2, b, d)      S390_RSY_1(c, 0xeb3e, r1, r2, b, d)
611 #define s390_cdsy(c, r1, r2, b, d)      S390_RSY_1(c, 0xeb31, r1, r2, b, d)
612 #define s390_cebr(c, r1, r2)            S390_RRE(c, 0xb309, r1, r2)
613 #define s390_cfdbr(c, r1, m, r2)        S390_RRF_2(c, 0xb399, r1, m, r2)
614 #define s390_cgdbr(c, r1, m, r2)        S390_RRF_2(c, 0xb3a9, r1, m, r2)
615 #define s390_cg(c, r, x, b, d)          S390_RXY(c, 0xe320, r, x, b, d)
616 #define s390_cghi(c, r, i)              S390_RI(c, 0xa7f, r, i)
617 #define s390_cgr(c, r1, r2)             S390_RRE(c, 0xb920, r1, r2)
618 #define s390_chi(c, r, i)               S390_RI(c, 0xa7e, r, i)
619 #define s390_cl(c, r, x, b, d)          S390_RX(c, 0x55, r, x, b, d)
620 #define s390_clg(c, r, x, b, d)         S390_RXY(c, 0xe321, r, x, b, d)
621 #define s390_clgr(c, r1, r2)            S390_RRE(c, 0xb921, r1, r2)
622 #define s390_clr(c, r1, r2)             S390_RR(c, 0x15, r1, r2)
623 #define s390_cr(c, r1, r2)              S390_RR(c, 0x19, r1, r2)
624 #define s390_cs(c, r1, r2, b, d)        S390_RX(c, 0xba, r1, r2, b, d)
625 #define s390_csg(c, r1, r2, b, d)       S390_RSY_1(c, 0xeb30, r1, r2, b, d)
626 #define s390_csy(c, r1, r2, b, d)       S390_RSY_1(c, 0xeb14, r1, r2, b, d)
627 #define s390_ddbr(c, r1, r2)            S390_RRE(c, 0xb31d, r1, r2)
628 #define s390_debr(c, r1, r2)            S390_RRE(c, 0xb30d, r1, r2)
629 #define s390_didbr(c, r1, r2, m, r3)    S390_RRF_3(c, 0xb35b, r1, r2, m, r3)
630 #define s390_dlgr(c, r1, r2)            S390_RRE(c, 0xb987, r1, r2)
631 #define s390_dlr(c, r1, r2)             S390_RRE(c, 0xb997, r1, r2)
632 #define s390_dr(c, r1, r2)              S390_RR(c, 0x1d, r1, r2)
633 #define s390_dsgfr(c, r1, r2)           S390_RRE(c, 0xb91d, r1, r2)
634 #define s390_dsgr(c, r1, r2)            S390_RRE(c, 0xb90d, r1, r2)
635 #define s390_ear(c, r1, r2)             S390_RRE(c, 0xb24f, r1, r2)
636 #define s390_ic(c, r, x, b, d)          S390_RX(c, 0x43, r, x, b, d)
637 #define s390_icm(c, r, m, b, d)         S390_RX(c, 0xbf, r, m, b, d)
638 #define s390_icmy(c, r, x, b, d)        S390_RXY(c, 0xeb81, r, x, b, d)
639 #define s390_icy(c, r, x, b, d)         S390_RXY(c, 0xe373, r, x, b, d)
640 #define s390_j(c,d)                     s390_brc(c, S390_CC_UN, d)
641 #define s390_jc(c, m, d)                s390_brc(c, m, d)
642 #define s390_jcl(c, m, d)               s390_brcl(c, m, d)
643 #define s390_jcy(c, d)                  s390_brc(c, S390_CC_CY, d)
644 #define s390_je(c, d)                   s390_brc(c, S390_CC_EQ, d)
645 #define s390_jeo(c, d)                  s390_brc(c, S390_CC_ZR|S390_CC_OV, d)
646 #define s390_jh(c, d)                   s390_brc(c, S390_CC_GT, d)
647 #define s390_jho(c, d)                  s390_brc(c, S390_CC_GT|S390_CC_OV, d)
648 #define s390_jl(c, d)                   s390_brc(c, S390_CC_LT, d)
649 #define s390_jlo(c, d)                  s390_brc(c, S390_CC_LT|S390_CC_OV, d)
650 #define s390_jm(c, d)                   s390_brc(c, S390_CC_LT, d)
651 #define s390_jnc(c, d)                  s390_brc(c, S390_CC_NC, d)
652 #define s390_jne(c, d)                  s390_brc(c, S390_CC_NZ, d)
653 #define s390_jnh(c, d)                  s390_brc(c, S390_CC_LE, d)
654 #define s390_jnl(c, d)                  s390_brc(c, S390_CC_GE, d)
655 #define s390_jnz(c, d)                  s390_brc(c, S390_CC_NZ, d)
656 #define s390_jo(c, d)                   s390_brc(c, S390_CC_OV, d)
657 #define s390_jno(c, d)                  s390_brc(c, S390_CC_NO, d)
658 #define s390_jp(c, d)                   s390_brc(c, S390_CC_GT, d)
659 #define s390_jz(c, d)                   s390_brc(c, S390_CC_ZR, d)
660 #define s390_jg(c,d)                    s390_brcl(c, S390_CC_UN, d)
661 #define s390_jgcy(c, d)                 s390_brcl(c, S390_CC_CY, d)
662 #define s390_jge(c, d)                  s390_brcl(c, S390_CC_EQ, d)
663 #define s390_jgeo(c, d)                 s390_brcl(c, S390_CC_ZR|S390_CC_OV, d)
664 #define s390_jgh(c, d)                  s390_brcl(c, S390_CC_GT, d)
665 #define s390_jgho(c, d)                 s390_brcl(c, S390_CC_GT|S390_CC_OV, d)
666 #define s390_jgl(c, d)                  s390_brcl(c, S390_CC_LT, d)
667 #define s390_jglo(c, d)                 s390_brcl(c, S390_CC_LT|S390_CC_OV, d)
668 #define s390_jgm(c, d)                  s390_brcl(c, S390_CC_LT, d)
669 #define s390_jgnc(c, d)                 s390_brcl(c, S390_CC_NC, d)
670 #define s390_jgne(c, d)                 s390_brcl(c, S390_CC_NZ, d)
671 #define s390_jgnh(c, d)                 s390_brcl(c, S390_CC_LE, d)
672 #define s390_jgnl(c, d)                 s390_brcl(c, S390_CC_GE, d)
673 #define s390_jgnz(c, d)                 s390_brcl(c, S390_CC_NZ, d)
674 #define s390_jgo(c, d)                  s390_brcl(c, S390_CC_OV, d)
675 #define s390_jgno(c, d)                 s390_brcl(c, S390_CC_NO, d)
676 #define s390_jgp(c, d)                  s390_brcl(c, S390_CC_GT, d)
677 #define s390_jgz(c, d)                  s390_brcl(c, S390_CC_ZR, d)
678 #define s390_l(c, r, x, b, d)           S390_RX(c, 0x58, r, x, b, d)
679 #define s390_ly(c, r, x, b, d)          S390_RXY(c, 0xe358, r, x, b, d)
680 #define s390_la(c, r, x, b, d)          S390_RX(c, 0x41, r, x, b, d)
681 #define s390_lay(c, r, x, b, d)         S390_RXY(c, 0xe371, r, x, b, d)
682 #define s390_lam(c, r1, r2, b, d)       S390_RS_1(c, 0x9a, r1, r2, b, d)
683 #define s390_larl(c, r, o)              S390_RIL_1(c, 0xc00, r, o)
684 #define s390_lb(c, r, x, b, d)          S390_RXY(c, 0xe376, r, x, b, d)
685 #define s390_lbr(c, r1, r2)             S390_RRE(c, 0xb926, r1, r2)
686 #define s390_lcdbr(c, r1, r2)           S390_RRE(c, 0xb313, r1, r2)
687 #define s390_lcgr(c, r1, r2)            S390_RRE(c, 0xb903, r1, r2)
688 #define s390_lcr(c, r1, r2)             S390_RR(c, 0x13, r1, r2)
689 #define s390_ld(c, f, x, b, d)          S390_RX(c, 0x68, f, x, b, d)
690 #define s390_ldy(c, r, x, b, d)         S390_RXY(c, 0xed65, r, x, b, d)
691 #define s390_ldeb(c, r, x, b, d)        S390_RXE(c, 0xed04, r, x, b, d)
692 #define s390_ldebr(c, r1, r2)           S390_RRE(c, 0xb304, r1, r2)
693 #define s390_ldr(c, r1, r2)             S390_RR(c, 0x28, r1, r2)
694 #define s390_le(c, f, x, b, d)          S390_RX(c, 0x78, f, x, b, d)
695 #define s390_ledbr(c, r1, r2)           S390_RRE(c, 0xb344, r1, r2)
696 #define s390_ler(c, r1, r2)             S390_RR(c, 0x38, r1, r2)
697 #define s390_ley(c, r, x, b, d)         S390_RXY(c, 0xed64, r, x, b, d)
698 #define s390_lgb(c, r, x, b, d)         S390_RXY(c, 0xe377, r, x, b, d)
699 #define s390_lgbr(c, r1, r2)            S390_RRE(c, 0xb906, r1, r2)
700 #define s390_lg(c, r, x, b, d)          S390_RXY(c, 0xe304, r, x, b, d)
701 #define s390_lgf(c, r, x, b, d)         S390_RXY(c, 0xe314, r, x, b, d)
702 #define s390_lgfr(c, r1, r2)            S390_RRE(c, 0xb914, r1, r2)
703 #define s390_lgh(c, r, x, b, d)         S390_RXY(c, 0xe315, r, x, b, d)
704 #define s390_lghi(c, r, v)              S390_RI(c, 0xa79, r, v)
705 #define s390_lgr(c, r1, r2)             S390_RRE(c, 0xb904, r1, r2)
706 #define s390_lh(c, r, x, b, d)          S390_RX(c, 0x48, r, x, b, d)
707 #define s390_lhr(c, r1, r2)             S390_RRE(c, 0xb927, r1, r2)
708 #define s390_lhg(c, r, x, b, d)         S390_RXY(c, 0xe315, r, x, b, d)
709 #define s390_lghr(c, r1, r2)            S390_RRE(c, 0xb907, r1, r2)
710 #define s390_lhi(c, r, v)               S390_RI(c, 0xa78, r, v)
711 #define s390_lhy(c, r, x, b, d)         S390_RXY(c, 0xe378, r, x, b, d)
712 #define s390_llcr(c, r1, r2)            S390_RRE(c, 0xb994, r1, r2)
713 #define s390_llgc(c, r, x, b, d)        S390_RXY(c, 0xe390, r, x, b, d)
714 #define s390_llgcr(c, r1, r2)           S390_RRE(c, 0xb984, r1, r2)
715 #define s390_llgf(c, r, x, b, d)        S390_RXY(c, 0xe316, r, x, b, d)
716 #define s390_llgfr(c, r1, r2)           S390_RRE(c, 0xb916, r1, r2)
717 #define s390_llgh(c, r, x, b, d)        S390_RXY(c, 0xe391, r, x, b, d)
718 #define s390_llghr(c, r1, r2)           S390_RRE(c, 0xb985, r1, r2)
719 #define s390_llhr(c, r1, r2)            S390_RRE(c, 0xb995, r1, r2)
720 #define s390_lm(c, r1, r2, b, d)        S390_RS_1(c, 0x98, r1, r2, b, d)
721 #define s390_lmg(c, r1, r2, b, d)       S390_RSY_1(c, 0xeb04, r1, r2, b, d)
722 #define s390_lndbr(c, r1, r2)           S390_RRE(c, 0xb311, r1, r2)
723 #define s390_lngr(c, r1, r2)            S390_RRE(c, 0xb901, r1, r2)
724 #define s390_lnr(c, r1, r2)             S390_RR(c, 0x11, r1, r2)
725 #define s390_lpdbr(c, r1, r2)           S390_RRE(c, 0xb310, r1, r2)
726 #define s390_lpgr(c, r1, r2)            S390_RRE(c, 0xb900, r1, r2)
727 #define s390_lpr(c, r1, r2)             S390_RR(c, 0x10, r1, r2)
728 #define s390_lr(c, r1, r2)              S390_RR(c, 0x18, r1, r2)
729 #define s390_ltgfr(c, r1, r2)           S390_RRE(c, 0xb912, r1, r2)
730 #define s390_ltgr(c, r1, r2)            S390_RRE(c, 0xb902, r1, r2)
731 #define s390_ltr(c, r1, r2)             S390_RR(c, 0x12, r1, r2)
732 #define s390_lzdr(c, r)                 S390_RRE(c, 0xb375, r, 0)
733 #define s390_lzer(c, r)                 S390_RRE(c, 0xb374, r, 0)
734 #define s390_m(c, r, x, b, d)           S390_RX(c, 0x5c, r, x, b, d)
735 #define s390_mdbr(c, r1, r2)            S390_RRE(c, 0xb31c, r1, r2)
736 #define s390_meebr(c, r1, r2)           S390_RRE(c, 0xb317, r1, r2)
737 #define s390_mlgr(c, r1, r2)            S390_RRE(c, 0xb986, r1, r2)
738 #define s390_mlr(c, r1, r2)             S390_RRE(c, 0xb996, r1, r2)
739 #define s390_mr(c, r1, r2)              S390_RR(c, 0x1c, r1, r2)
740 #define s390_ms(c, r, x, b, d)          S390_RX(c, 0x71, r, x, b, d)
741 #define s390_msgfr(c, r1, r2)           S390_RRE(c, 0xb91c, r1, r2)
742 #define s390_msgr(c, r1, r2)            S390_RRE(c, 0xb90c, r1, r2)
743 #define s390_msr(c, r1, r2)             S390_RRE(c, 0xb252, r1, r2)
744 #define s390_mvc(c, l, b1, d1, b2, d2)  S390_SS_1(c, 0xd2, l, b1, d1, b2, d2)
745 #define s390_mvcl(c, r1, r2)            S390_RR(c, 0x0e, r1, r2)
746 #define s390_mvcle(c, r1, r3, d2, b2)   S390_RS_1(c, 0xa8, r1, r3, d2, b2)
747 #define s390_n(c, r, x, b, d)           S390_RX(c, 0x54, r, x, b, d)
748 #define s390_ng(c, r, x, b, d)          S390_RXY(c, 0xe380, r, x, b, d)
749 #define s390_ngr(c, r1, r2)             S390_RRE(c, 0xb980, r1, r2)
750 #define s390_nilh(c, r, v)              S390_RI(c, 0xa56, r, v)
751 #define s390_nill(c, r, v)              S390_RI(c, 0xa57, r, v)
752 #define s390_nop(c)                     S390_RR(c, 0x07, 0x0, 0)
753 #define s390_nr(c, r1, r2)              S390_RR(c, 0x14, r1, r2)
754 #define s390_o(c, r, x, b, d)           S390_RX(c, 0x56, r, x, b, d)
755 #define s390_og(c, r, x, b, d)          S390_RXY(c, 0xe381, r, x, b, d)
756 #define s390_ogr(c, r1, r2)             S390_RRE(c, 0xb981, r1, r2)
757 #define s390_or(c, r1, r2)              S390_RR(c, 0x16, r1, r2)
758 #define s390_s(c, r, x, b, d)           S390_RX(c, 0x5b, r, x, b, d)
759 #define s390_sdb(c, r, x, b, d)         S390_RXE(c, 0xed1b, r, x, b, d)
760 #define s390_sdbr(c, r1, r2)            S390_RRE(c, 0xb31b, r1, r2)
761 #define s390_sebr(c, r1, r2)            S390_RRE(c, 0xb30b, r1, r2)
762 #define s390_sg(c, r, x, b, d)          S390_RXY(c, 0xe309, r, x, b, d)
763 #define s390_sgf(c, r, x, b, d)         S390_RXY(c, 0xe319, r, x, b, d)
764 #define s390_sgr(c, r1, r2)             S390_RRE(c, 0xb909, r1, r2)
765 #define s390_sla(c, r, b, d)            S390_RS_3(c, 0x8b, r, b, d) 
766 #define s390_slag(c, r1, r2, b, d)      S390_RSY_1(c, 0xeb0b, r1, r2, b, d) 
767 #define s390_slbg(c, r, x, b, d)        S390_RXY(c, 0xe389, r, x, b, d)
768 #define s390_slbgr(c, r1, r2)           S390_RRE(c, 0xb989, r1, r2)
769 #define s390_slbr(c, r1, r2)            S390_RRE(c, 0xb999, r1, r2)
770 #define s390_sl(c, r, x, b, d)          S390_RX(c, 0x5f, r, x, b, d)
771 #define s390_slda(c, r, b, d)           S390_RS_3(c, 0x8f, r, b, d) 
772 #define s390_sldl(c, r, b, d)           S390_RS_3(c, 0x8d, r, b, d) 
773 #define s390_slg(c, r, x, b, d)         S390_RXY(c, 0xe30b, r, x, b, d)
774 #define s390_slgf(c, r, x, b, d)        S390_RXY(c, 0xe31b, r, x, b, d)
775 #define s390_slgr(c, r1, r2)            S390_RRE(c, 0xb90b, r1, r2)
776 #define s390_sll(c, r, b, d)            S390_RS_3(c, 0x89, r, b, d) 
777 #define s390_sllg(c, r1, r2, b, d)      S390_RSY_1(c, 0xeb0d, r1, r2, b, d) 
778 #define s390_slr(c, r1, r2)             S390_RR(c, 0x1f, r1, r2)
779 #define s390_sqdbr(c, r1, r2)           S390_RRE(c, 0xb315, r1, r2)
780 #define s390_sqebr(c, r1, r2)           S390_RRE(c, 0xb314, r1, r2)
781 #define s390_sra(c, r, b, d)            S390_RS_3(c, 0x8a, r, b, d) 
782 #define s390_srag(c, r1, r2, b, d)      S390_RSY_1(c, 0xeb0a, r1, r2, b, d) 
783 #define s390_sr(c, r1, r2)              S390_RR(c, 0x1b, r1, r2)
784 #define s390_srda(c, r, b, d)           S390_RS_3(c, 0x8e, r, b, d) 
785 #define s390_srdl(c, r, b, d)           S390_RS_3(c, 0x8c, r, b, d) 
786 #define s390_srl(c, r, b, d)            S390_RS_3(c, 0x88, r, b, d) 
787 #define s390_srlg(c, r1, r2, b, d)      S390_RSY_1(c, 0xeb0c, r1, r2, b, d) 
788 #define s390_st(c, r, x, b, d)          S390_RX(c, 0x50, r, x, b, d)
789 #define s390_stam(c, r1, r2, b, d)      S390_RS_1(c, 0x9b, r1, r2, b, d)
790 #define s390_stc(c, r, x, b, d)         S390_RX(c, 0x42, r, x, b, d)
791 #define s390_stcm(c, r, m, b, d)        S390_RX(c, 0xbe, r, m, b, d)
792 #define s390_stcmy(c, r, x, b, d)       S390_RXY(c, 0xeb2d, r, x, b, d)
793 #define s390_stcy(c, r, x, b, d)        S390_RXY(c, 0xe372, r, x, b, d)
794 #define s390_std(c, f, x, b, d)         S390_RX(c, 0x60, f, x, b, d)
795 #define s390_stdy(c, r, x, b, d)        S390_RXY(c, 0xed67, r, x, b, d)
796 #define s390_ste(c, f, x, b, d)         S390_RX(c, 0x70, f, x, b, d)
797 #define s390_stey(c, r, x, b, d)        S390_RXY(c, 0xed66, r, x, b, d)
798 #define s390_stfpc(c, b, d)             S390_S(c, 0xb29c, b, d)
799 #define s390_stg(c, r, x, b, d)         S390_RXY(c, 0xe324, r, x, b, d)
800 #define s390_sth(c, r, x, b, d)         S390_RX(c, 0x40, r, x, b, d)
801 #define s390_sthy(c, r, x, b, d)        S390_RXY(c, 0xe370, r, x, b, d)
802 #define s390_stm(c, r1, r2, b, d)       S390_RS_1(c, 0x90, r1, r2, b, d)
803 #define s390_stmg(c, r1, r2, b, d)      S390_RSY_1(c, 0xeb24, r1, r2, b, d)
804 #define s390_sty(c, r, x, b, d)         S390_RXY(c, 0xe350, r, x, b, d)
805 #define s390_tcdb(c, r, x, b, d)        S390_RXE(c, 0xed11, r, x, b, d)
806 #define s390_tceb(c, r, x, b, d)        S390_RXE(c, 0xed10, r, x, b, d)
807 #define s390_x(c, r, x, b, d)           S390_RX(c, 0x57, r, x, b, d)
808 #define s390_xg(c, r, x, b, d)          S390_RXY(c, 0xe382, r, x, b, d)
809 #define s390_xgr(c, r1, r2)             S390_RRE(c, 0xb982, r1, r2)
810 #define s390_xr(c, r1, r2)              S390_RR(c, 0x17, r1, r2)
811 #endif