]> Git Repo - qemu.git/blob - target-s390x/translate.c
Remove exec-all.h include directives
[qemu.git] / target-s390x / translate.c
1 /*
2  *  S/390 translation
3  *
4  *  Copyright (c) 2009 Ulrich Hecht
5  *  Copyright (c) 2010 Alexander Graf
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
19  */
20 #include <stdarg.h>
21 #include <stdlib.h>
22 #include <stdio.h>
23 #include <string.h>
24 #include <inttypes.h>
25
26 /* #define DEBUG_ILLEGAL_INSTRUCTIONS */
27 /* #define DEBUG_INLINE_BRANCHES */
28 #define S390X_DEBUG_DISAS
29 /* #define S390X_DEBUG_DISAS_VERBOSE */
30
31 #ifdef S390X_DEBUG_DISAS_VERBOSE
32 #  define LOG_DISAS(...) qemu_log(__VA_ARGS__)
33 #else
34 #  define LOG_DISAS(...) do { } while (0)
35 #endif
36
37 #include "cpu.h"
38 #include "disas.h"
39 #include "tcg-op.h"
40 #include "qemu-log.h"
41
42 /* global register indexes */
43 static TCGv_ptr cpu_env;
44
45 #include "gen-icount.h"
46 #include "helpers.h"
47 #define GEN_HELPER 1
48 #include "helpers.h"
49
50 typedef struct DisasContext DisasContext;
51 struct DisasContext {
52     uint64_t pc;
53     int is_jmp;
54     enum cc_op cc_op;
55     struct TranslationBlock *tb;
56 };
57
58 #define DISAS_EXCP 4
59
60 static void gen_op_calc_cc(DisasContext *s);
61
62 #ifdef DEBUG_INLINE_BRANCHES
63 static uint64_t inline_branch_hit[CC_OP_MAX];
64 static uint64_t inline_branch_miss[CC_OP_MAX];
65 #endif
66
67 static inline void debug_insn(uint64_t insn)
68 {
69     LOG_DISAS("insn: 0x%" PRIx64 "\n", insn);
70 }
71
72 static inline uint64_t pc_to_link_info(DisasContext *s, uint64_t pc)
73 {
74     if (!(s->tb->flags & FLAG_MASK_64)) {
75         if (s->tb->flags & FLAG_MASK_32) {
76             return pc | 0x80000000;
77         }
78     }
79     return pc;
80 }
81
82 void cpu_dump_state(CPUState *env, FILE *f, fprintf_function cpu_fprintf,
83                     int flags)
84 {
85     int i;
86
87     for (i = 0; i < 16; i++) {
88         cpu_fprintf(f, "R%02d=%016" PRIx64, i, env->regs[i]);
89         if ((i % 4) == 3) {
90             cpu_fprintf(f, "\n");
91         } else {
92             cpu_fprintf(f, " ");
93         }
94     }
95
96     for (i = 0; i < 16; i++) {
97         cpu_fprintf(f, "F%02d=%016" PRIx64, i, *(uint64_t *)&env->fregs[i]);
98         if ((i % 4) == 3) {
99             cpu_fprintf(f, "\n");
100         } else {
101             cpu_fprintf(f, " ");
102         }
103     }
104
105     cpu_fprintf(f, "\n");
106
107 #ifndef CONFIG_USER_ONLY
108     for (i = 0; i < 16; i++) {
109         cpu_fprintf(f, "C%02d=%016" PRIx64, i, env->cregs[i]);
110         if ((i % 4) == 3) {
111             cpu_fprintf(f, "\n");
112         } else {
113             cpu_fprintf(f, " ");
114         }
115     }
116 #endif
117
118     cpu_fprintf(f, "\n");
119
120     if (env->cc_op > 3) {
121         cpu_fprintf(f, "PSW=mask %016" PRIx64 " addr %016" PRIx64 " cc %15s\n",
122                     env->psw.mask, env->psw.addr, cc_name(env->cc_op));
123     } else {
124         cpu_fprintf(f, "PSW=mask %016" PRIx64 " addr %016" PRIx64 " cc %02x\n",
125                     env->psw.mask, env->psw.addr, env->cc_op);
126     }
127
128 #ifdef DEBUG_INLINE_BRANCHES
129     for (i = 0; i < CC_OP_MAX; i++) {
130         cpu_fprintf(f, "  %15s = %10ld\t%10ld\n", cc_name(i),
131                     inline_branch_miss[i], inline_branch_hit[i]);
132     }
133 #endif
134 }
135
136 static TCGv_i64 psw_addr;
137 static TCGv_i64 psw_mask;
138
139 static TCGv_i32 cc_op;
140 static TCGv_i64 cc_src;
141 static TCGv_i64 cc_dst;
142 static TCGv_i64 cc_vr;
143
144 static char cpu_reg_names[10*3 + 6*4];
145 static TCGv_i64 regs[16];
146
147 static uint8_t gen_opc_cc_op[OPC_BUF_SIZE];
148
149 void s390x_translate_init(void)
150 {
151     int i;
152     size_t cpu_reg_names_size = sizeof(cpu_reg_names);
153     char *p;
154
155     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env");
156     psw_addr = tcg_global_mem_new_i64(TCG_AREG0, offsetof(CPUState, psw.addr),
157                                       "psw_addr");
158     psw_mask = tcg_global_mem_new_i64(TCG_AREG0, offsetof(CPUState, psw.mask),
159                                       "psw_mask");
160
161     cc_op = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUState, cc_op),
162                                    "cc_op");
163     cc_src = tcg_global_mem_new_i64(TCG_AREG0, offsetof(CPUState, cc_src),
164                                     "cc_src");
165     cc_dst = tcg_global_mem_new_i64(TCG_AREG0, offsetof(CPUState, cc_dst),
166                                     "cc_dst");
167     cc_vr = tcg_global_mem_new_i64(TCG_AREG0, offsetof(CPUState, cc_vr),
168                                    "cc_vr");
169
170     p = cpu_reg_names;
171     for (i = 0; i < 16; i++) {
172         snprintf(p, cpu_reg_names_size, "r%d", i);
173         regs[i] = tcg_global_mem_new(TCG_AREG0,
174                                      offsetof(CPUState, regs[i]), p);
175         p += (i < 10) ? 3 : 4;
176         cpu_reg_names_size -= (i < 10) ? 3 : 4;
177     }
178 }
179
180 static inline TCGv_i64 load_reg(int reg)
181 {
182     TCGv_i64 r = tcg_temp_new_i64();
183     tcg_gen_mov_i64(r, regs[reg]);
184     return r;
185 }
186
187 static inline TCGv_i64 load_freg(int reg)
188 {
189     TCGv_i64 r = tcg_temp_new_i64();
190     tcg_gen_ld_i64(r, cpu_env, offsetof(CPUState, fregs[reg].d));
191     return r;
192 }
193
194 static inline TCGv_i32 load_freg32(int reg)
195 {
196     TCGv_i32 r = tcg_temp_new_i32();
197     tcg_gen_ld_i32(r, cpu_env, offsetof(CPUState, fregs[reg].l.upper));
198     return r;
199 }
200
201 static inline TCGv_i32 load_reg32(int reg)
202 {
203     TCGv_i32 r = tcg_temp_new_i32();
204     tcg_gen_trunc_i64_i32(r, regs[reg]);
205     return r;
206 }
207
208 static inline TCGv_i64 load_reg32_i64(int reg)
209 {
210     TCGv_i64 r = tcg_temp_new_i64();
211     tcg_gen_ext32s_i64(r, regs[reg]);
212     return r;
213 }
214
215 static inline void store_reg(int reg, TCGv_i64 v)
216 {
217     tcg_gen_mov_i64(regs[reg], v);
218 }
219
220 static inline void store_freg(int reg, TCGv_i64 v)
221 {
222     tcg_gen_st_i64(v, cpu_env, offsetof(CPUState, fregs[reg].d));
223 }
224
225 static inline void store_reg32(int reg, TCGv_i32 v)
226 {
227 #if HOST_LONG_BITS == 32
228     tcg_gen_mov_i32(TCGV_LOW(regs[reg]), v);
229 #else
230     TCGv_i64 tmp = tcg_temp_new_i64();
231     tcg_gen_extu_i32_i64(tmp, v);
232     /* 32 bit register writes keep the upper half */
233     tcg_gen_deposit_i64(regs[reg], regs[reg], tmp, 0, 32);
234     tcg_temp_free_i64(tmp);
235 #endif
236 }
237
238 static inline void store_reg32_i64(int reg, TCGv_i64 v)
239 {
240     /* 32 bit register writes keep the upper half */
241 #if HOST_LONG_BITS == 32
242     tcg_gen_mov_i32(TCGV_LOW(regs[reg]), TCGV_LOW(v));
243 #else
244     tcg_gen_deposit_i64(regs[reg], regs[reg], v, 0, 32);
245 #endif
246 }
247
248 static inline void store_reg16(int reg, TCGv_i32 v)
249 {
250     TCGv_i64 tmp = tcg_temp_new_i64();
251     tcg_gen_extu_i32_i64(tmp, v);
252     /* 16 bit register writes keep the upper bytes */
253     tcg_gen_deposit_i64(regs[reg], regs[reg], tmp, 0, 16);
254     tcg_temp_free_i64(tmp);
255 }
256
257 static inline void store_reg8(int reg, TCGv_i64 v)
258 {
259     /* 8 bit register writes keep the upper bytes */
260     tcg_gen_deposit_i64(regs[reg], regs[reg], v, 0, 8);
261 }
262
263 static inline void store_freg32(int reg, TCGv_i32 v)
264 {
265     tcg_gen_st_i32(v, cpu_env, offsetof(CPUState, fregs[reg].l.upper));
266 }
267
268 static inline void update_psw_addr(DisasContext *s)
269 {
270     /* psw.addr */
271     tcg_gen_movi_i64(psw_addr, s->pc);
272 }
273
274 static inline void potential_page_fault(DisasContext *s)
275 {
276 #ifndef CONFIG_USER_ONLY
277     update_psw_addr(s);
278     gen_op_calc_cc(s);
279 #endif
280 }
281
282 static inline uint64_t ld_code2(uint64_t pc)
283 {
284     return (uint64_t)lduw_code(pc);
285 }
286
287 static inline uint64_t ld_code4(uint64_t pc)
288 {
289     return (uint64_t)ldl_code(pc);
290 }
291
292 static inline uint64_t ld_code6(uint64_t pc)
293 {
294     uint64_t opc;
295     opc = (uint64_t)lduw_code(pc) << 32;
296     opc |= (uint64_t)(uint32_t)ldl_code(pc+2);
297     return opc;
298 }
299
300 static inline int get_mem_index(DisasContext *s)
301 {
302     switch (s->tb->flags & FLAG_MASK_ASC) {
303     case PSW_ASC_PRIMARY >> 32:
304         return 0;
305     case PSW_ASC_SECONDARY >> 32:
306         return 1;
307     case PSW_ASC_HOME >> 32:
308         return 2;
309     default:
310         tcg_abort();
311         break;
312     }
313 }
314
315 static inline void gen_debug(DisasContext *s)
316 {
317     TCGv_i32 tmp = tcg_const_i32(EXCP_DEBUG);
318     update_psw_addr(s);
319     gen_op_calc_cc(s);
320     gen_helper_exception(tmp);
321     tcg_temp_free_i32(tmp);
322     s->is_jmp = DISAS_EXCP;
323 }
324
325 #ifdef CONFIG_USER_ONLY
326
327 static void gen_illegal_opcode(DisasContext *s, int ilc)
328 {
329     TCGv_i32 tmp = tcg_const_i32(EXCP_SPEC);
330     update_psw_addr(s);
331     gen_op_calc_cc(s);
332     gen_helper_exception(tmp);
333     tcg_temp_free_i32(tmp);
334     s->is_jmp = DISAS_EXCP;
335 }
336
337 #else /* CONFIG_USER_ONLY */
338
339 static void debug_print_inst(DisasContext *s, int ilc)
340 {
341 #ifdef DEBUG_ILLEGAL_INSTRUCTIONS
342     uint64_t inst = 0;
343
344     switch (ilc & 3) {
345     case 1:
346         inst = ld_code2(s->pc);
347         break;
348     case 2:
349         inst = ld_code4(s->pc);
350         break;
351     case 3:
352         inst = ld_code6(s->pc);
353         break;
354     }
355
356     fprintf(stderr, "Illegal instruction [%d at %016" PRIx64 "]: 0x%016"
357             PRIx64 "\n", ilc, s->pc, inst);
358 #endif
359 }
360
361 static void gen_program_exception(DisasContext *s, int ilc, int code)
362 {
363     TCGv_i32 tmp;
364
365     debug_print_inst(s, ilc);
366
367     /* remember what pgm exeption this was */
368     tmp = tcg_const_i32(code);
369     tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUState, int_pgm_code));
370     tcg_temp_free_i32(tmp);
371
372     tmp = tcg_const_i32(ilc);
373     tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUState, int_pgm_ilc));
374     tcg_temp_free_i32(tmp);
375
376     /* advance past instruction */
377     s->pc += (ilc * 2);
378     update_psw_addr(s);
379
380     /* save off cc */
381     gen_op_calc_cc(s);
382
383     /* trigger exception */
384     tmp = tcg_const_i32(EXCP_PGM);
385     gen_helper_exception(tmp);
386     tcg_temp_free_i32(tmp);
387
388     /* end TB here */
389     s->is_jmp = DISAS_EXCP;
390 }
391
392
393 static void gen_illegal_opcode(DisasContext *s, int ilc)
394 {
395     gen_program_exception(s, ilc, PGM_SPECIFICATION);
396 }
397
398 static void gen_privileged_exception(DisasContext *s, int ilc)
399 {
400     gen_program_exception(s, ilc, PGM_PRIVILEGED);
401 }
402
403 static void check_privileged(DisasContext *s, int ilc)
404 {
405     if (s->tb->flags & (PSW_MASK_PSTATE >> 32)) {
406         gen_privileged_exception(s, ilc);
407     }
408 }
409
410 #endif /* CONFIG_USER_ONLY */
411
412 static TCGv_i64 get_address(DisasContext *s, int x2, int b2, int d2)
413 {
414     TCGv_i64 tmp;
415
416     /* 31-bitify the immediate part; register contents are dealt with below */
417     if (!(s->tb->flags & FLAG_MASK_64)) {
418         d2 &= 0x7fffffffUL;
419     }
420
421     if (x2) {
422         if (d2) {
423             tmp = tcg_const_i64(d2);
424             tcg_gen_add_i64(tmp, tmp, regs[x2]);
425         } else {
426             tmp = load_reg(x2);
427         }
428         if (b2) {
429             tcg_gen_add_i64(tmp, tmp, regs[b2]);
430         }
431     } else if (b2) {
432         if (d2) {
433             tmp = tcg_const_i64(d2);
434             tcg_gen_add_i64(tmp, tmp, regs[b2]);
435         } else {
436             tmp = load_reg(b2);
437         }
438     } else {
439         tmp = tcg_const_i64(d2);
440     }
441
442     /* 31-bit mode mask if there are values loaded from registers */
443     if (!(s->tb->flags & FLAG_MASK_64) && (x2 || b2)) {
444         tcg_gen_andi_i64(tmp, tmp, 0x7fffffffUL);
445     }
446
447     return tmp;
448 }
449
450 static void gen_op_movi_cc(DisasContext *s, uint32_t val)
451 {
452     s->cc_op = CC_OP_CONST0 + val;
453 }
454
455 static void gen_op_update1_cc_i64(DisasContext *s, enum cc_op op, TCGv_i64 dst)
456 {
457     tcg_gen_discard_i64(cc_src);
458     tcg_gen_mov_i64(cc_dst, dst);
459     tcg_gen_discard_i64(cc_vr);
460     s->cc_op = op;
461 }
462
463 static void gen_op_update1_cc_i32(DisasContext *s, enum cc_op op, TCGv_i32 dst)
464 {
465     tcg_gen_discard_i64(cc_src);
466     tcg_gen_extu_i32_i64(cc_dst, dst);
467     tcg_gen_discard_i64(cc_vr);
468     s->cc_op = op;
469 }
470
471 static void gen_op_update2_cc_i64(DisasContext *s, enum cc_op op, TCGv_i64 src,
472                                   TCGv_i64 dst)
473 {
474     tcg_gen_mov_i64(cc_src, src);
475     tcg_gen_mov_i64(cc_dst, dst);
476     tcg_gen_discard_i64(cc_vr);
477     s->cc_op = op;
478 }
479
480 static void gen_op_update2_cc_i32(DisasContext *s, enum cc_op op, TCGv_i32 src,
481                                   TCGv_i32 dst)
482 {
483     tcg_gen_extu_i32_i64(cc_src, src);
484     tcg_gen_extu_i32_i64(cc_dst, dst);
485     tcg_gen_discard_i64(cc_vr);
486     s->cc_op = op;
487 }
488
489 static void gen_op_update3_cc_i64(DisasContext *s, enum cc_op op, TCGv_i64 src,
490                                   TCGv_i64 dst, TCGv_i64 vr)
491 {
492     tcg_gen_mov_i64(cc_src, src);
493     tcg_gen_mov_i64(cc_dst, dst);
494     tcg_gen_mov_i64(cc_vr, vr);
495     s->cc_op = op;
496 }
497
498 static void gen_op_update3_cc_i32(DisasContext *s, enum cc_op op, TCGv_i32 src,
499                                   TCGv_i32 dst, TCGv_i32 vr)
500 {
501     tcg_gen_extu_i32_i64(cc_src, src);
502     tcg_gen_extu_i32_i64(cc_dst, dst);
503     tcg_gen_extu_i32_i64(cc_vr, vr);
504     s->cc_op = op;
505 }
506
507 static inline void set_cc_nz_u32(DisasContext *s, TCGv_i32 val)
508 {
509     gen_op_update1_cc_i32(s, CC_OP_NZ, val);
510 }
511
512 static inline void set_cc_nz_u64(DisasContext *s, TCGv_i64 val)
513 {
514     gen_op_update1_cc_i64(s, CC_OP_NZ, val);
515 }
516
517 static inline void cmp_32(DisasContext *s, TCGv_i32 v1, TCGv_i32 v2,
518                           enum cc_op cond)
519 {
520     gen_op_update2_cc_i32(s, cond, v1, v2);
521 }
522
523 static inline void cmp_64(DisasContext *s, TCGv_i64 v1, TCGv_i64 v2,
524                           enum cc_op cond)
525 {
526     gen_op_update2_cc_i64(s, cond, v1, v2);
527 }
528
529 static inline void cmp_s32(DisasContext *s, TCGv_i32 v1, TCGv_i32 v2)
530 {
531     cmp_32(s, v1, v2, CC_OP_LTGT_32);
532 }
533
534 static inline void cmp_u32(DisasContext *s, TCGv_i32 v1, TCGv_i32 v2)
535 {
536     cmp_32(s, v1, v2, CC_OP_LTUGTU_32);
537 }
538
539 static inline void cmp_s32c(DisasContext *s, TCGv_i32 v1, int32_t v2)
540 {
541     /* XXX optimize for the constant? put it in s? */
542     TCGv_i32 tmp = tcg_const_i32(v2);
543     cmp_32(s, v1, tmp, CC_OP_LTGT_32);
544     tcg_temp_free_i32(tmp);
545 }
546
547 static inline void cmp_u32c(DisasContext *s, TCGv_i32 v1, uint32_t v2)
548 {
549     TCGv_i32 tmp = tcg_const_i32(v2);
550     cmp_32(s, v1, tmp, CC_OP_LTUGTU_32);
551     tcg_temp_free_i32(tmp);
552 }
553
554 static inline void cmp_s64(DisasContext *s, TCGv_i64 v1, TCGv_i64 v2)
555 {
556     cmp_64(s, v1, v2, CC_OP_LTGT_64);
557 }
558
559 static inline void cmp_u64(DisasContext *s, TCGv_i64 v1, TCGv_i64 v2)
560 {
561     cmp_64(s, v1, v2, CC_OP_LTUGTU_64);
562 }
563
564 static inline void cmp_s64c(DisasContext *s, TCGv_i64 v1, int64_t v2)
565 {
566     TCGv_i64 tmp = tcg_const_i64(v2);
567     cmp_s64(s, v1, tmp);
568     tcg_temp_free_i64(tmp);
569 }
570
571 static inline void cmp_u64c(DisasContext *s, TCGv_i64 v1, uint64_t v2)
572 {
573     TCGv_i64 tmp = tcg_const_i64(v2);
574     cmp_u64(s, v1, tmp);
575     tcg_temp_free_i64(tmp);
576 }
577
578 static inline void set_cc_s32(DisasContext *s, TCGv_i32 val)
579 {
580     gen_op_update1_cc_i32(s, CC_OP_LTGT0_32, val);
581 }
582
583 static inline void set_cc_s64(DisasContext *s, TCGv_i64 val)
584 {
585     gen_op_update1_cc_i64(s, CC_OP_LTGT0_64, val);
586 }
587
588 static void set_cc_add64(DisasContext *s, TCGv_i64 v1, TCGv_i64 v2, TCGv_i64 vr)
589 {
590     gen_op_update3_cc_i64(s, CC_OP_ADD_64, v1, v2, vr);
591 }
592
593 static void set_cc_addu64(DisasContext *s, TCGv_i64 v1, TCGv_i64 v2,
594                           TCGv_i64 vr)
595 {
596     gen_op_update3_cc_i64(s, CC_OP_ADDU_64, v1, v2, vr);
597 }
598
599 static void set_cc_sub64(DisasContext *s, TCGv_i64 v1, TCGv_i64 v2, TCGv_i64 vr)
600 {
601     gen_op_update3_cc_i64(s, CC_OP_SUB_64, v1, v2, vr);
602 }
603
604 static void set_cc_subu64(DisasContext *s, TCGv_i64 v1, TCGv_i64 v2,
605                           TCGv_i64 vr)
606 {
607     gen_op_update3_cc_i64(s, CC_OP_SUBU_64, v1, v2, vr);
608 }
609
610 static void set_cc_abs64(DisasContext *s, TCGv_i64 v1)
611 {
612     gen_op_update1_cc_i64(s, CC_OP_ABS_64, v1);
613 }
614
615 static void set_cc_nabs64(DisasContext *s, TCGv_i64 v1)
616 {
617     gen_op_update1_cc_i64(s, CC_OP_NABS_64, v1);
618 }
619
620 static void set_cc_add32(DisasContext *s, TCGv_i32 v1, TCGv_i32 v2, TCGv_i32 vr)
621 {
622     gen_op_update3_cc_i32(s, CC_OP_ADD_32, v1, v2, vr);
623 }
624
625 static void set_cc_addu32(DisasContext *s, TCGv_i32 v1, TCGv_i32 v2,
626                           TCGv_i32 vr)
627 {
628     gen_op_update3_cc_i32(s, CC_OP_ADDU_32, v1, v2, vr);
629 }
630
631 static void set_cc_sub32(DisasContext *s, TCGv_i32 v1, TCGv_i32 v2, TCGv_i32 vr)
632 {
633     gen_op_update3_cc_i32(s, CC_OP_SUB_32, v1, v2, vr);
634 }
635
636 static void set_cc_subu32(DisasContext *s, TCGv_i32 v1, TCGv_i32 v2,
637                           TCGv_i32 vr)
638 {
639     gen_op_update3_cc_i32(s, CC_OP_SUBU_32, v1, v2, vr);
640 }
641
642 static void set_cc_abs32(DisasContext *s, TCGv_i32 v1)
643 {
644     gen_op_update1_cc_i32(s, CC_OP_ABS_32, v1);
645 }
646
647 static void set_cc_nabs32(DisasContext *s, TCGv_i32 v1)
648 {
649     gen_op_update1_cc_i32(s, CC_OP_NABS_32, v1);
650 }
651
652 static void set_cc_comp32(DisasContext *s, TCGv_i32 v1)
653 {
654     gen_op_update1_cc_i32(s, CC_OP_COMP_32, v1);
655 }
656
657 static void set_cc_comp64(DisasContext *s, TCGv_i64 v1)
658 {
659     gen_op_update1_cc_i64(s, CC_OP_COMP_64, v1);
660 }
661
662 static void set_cc_icm(DisasContext *s, TCGv_i32 v1, TCGv_i32 v2)
663 {
664     gen_op_update2_cc_i32(s, CC_OP_ICM, v1, v2);
665 }
666
667 static void set_cc_cmp_f32_i64(DisasContext *s, TCGv_i32 v1, TCGv_i64 v2)
668 {
669     tcg_gen_extu_i32_i64(cc_src, v1);
670     tcg_gen_mov_i64(cc_dst, v2);
671     tcg_gen_discard_i64(cc_vr);
672     s->cc_op = CC_OP_LTGT_F32;
673 }
674
675 static void set_cc_nz_f32(DisasContext *s, TCGv_i32 v1)
676 {
677     gen_op_update1_cc_i32(s, CC_OP_NZ_F32, v1);
678 }
679
680 static inline void set_cc_nz_f64(DisasContext *s, TCGv_i64 v1)
681 {
682     gen_op_update1_cc_i64(s, CC_OP_NZ_F64, v1);
683 }
684
685 /* CC value is in env->cc_op */
686 static inline void set_cc_static(DisasContext *s)
687 {
688     tcg_gen_discard_i64(cc_src);
689     tcg_gen_discard_i64(cc_dst);
690     tcg_gen_discard_i64(cc_vr);
691     s->cc_op = CC_OP_STATIC;
692 }
693
694 static inline void gen_op_set_cc_op(DisasContext *s)
695 {
696     if (s->cc_op != CC_OP_DYNAMIC && s->cc_op != CC_OP_STATIC) {
697         tcg_gen_movi_i32(cc_op, s->cc_op);
698     }
699 }
700
701 static inline void gen_update_cc_op(DisasContext *s)
702 {
703     gen_op_set_cc_op(s);
704 }
705
706 /* calculates cc into cc_op */
707 static void gen_op_calc_cc(DisasContext *s)
708 {
709     TCGv_i32 local_cc_op = tcg_const_i32(s->cc_op);
710     TCGv_i64 dummy = tcg_const_i64(0);
711
712     switch (s->cc_op) {
713     case CC_OP_CONST0:
714     case CC_OP_CONST1:
715     case CC_OP_CONST2:
716     case CC_OP_CONST3:
717         /* s->cc_op is the cc value */
718         tcg_gen_movi_i32(cc_op, s->cc_op - CC_OP_CONST0);
719         break;
720     case CC_OP_STATIC:
721         /* env->cc_op already is the cc value */
722         break;
723     case CC_OP_NZ:
724     case CC_OP_ABS_64:
725     case CC_OP_NABS_64:
726     case CC_OP_ABS_32:
727     case CC_OP_NABS_32:
728     case CC_OP_LTGT0_32:
729     case CC_OP_LTGT0_64:
730     case CC_OP_COMP_32:
731     case CC_OP_COMP_64:
732     case CC_OP_NZ_F32:
733     case CC_OP_NZ_F64:
734         /* 1 argument */
735         gen_helper_calc_cc(cc_op, local_cc_op, dummy, cc_dst, dummy);
736         break;
737     case CC_OP_ICM:
738     case CC_OP_LTGT_32:
739     case CC_OP_LTGT_64:
740     case CC_OP_LTUGTU_32:
741     case CC_OP_LTUGTU_64:
742     case CC_OP_TM_32:
743     case CC_OP_TM_64:
744     case CC_OP_LTGT_F32:
745     case CC_OP_LTGT_F64:
746     case CC_OP_SLAG:
747         /* 2 arguments */
748         gen_helper_calc_cc(cc_op, local_cc_op, cc_src, cc_dst, dummy);
749         break;
750     case CC_OP_ADD_64:
751     case CC_OP_ADDU_64:
752     case CC_OP_SUB_64:
753     case CC_OP_SUBU_64:
754     case CC_OP_ADD_32:
755     case CC_OP_ADDU_32:
756     case CC_OP_SUB_32:
757     case CC_OP_SUBU_32:
758         /* 3 arguments */
759         gen_helper_calc_cc(cc_op, local_cc_op, cc_src, cc_dst, cc_vr);
760         break;
761     case CC_OP_DYNAMIC:
762         /* unknown operation - assume 3 arguments and cc_op in env */
763         gen_helper_calc_cc(cc_op, cc_op, cc_src, cc_dst, cc_vr);
764         break;
765     default:
766         tcg_abort();
767     }
768
769     tcg_temp_free_i32(local_cc_op);
770
771     /* We now have cc in cc_op as constant */
772     set_cc_static(s);
773 }
774
775 static inline void decode_rr(DisasContext *s, uint64_t insn, int *r1, int *r2)
776 {
777     debug_insn(insn);
778
779     *r1 = (insn >> 4) & 0xf;
780     *r2 = insn & 0xf;
781 }
782
783 static inline TCGv_i64 decode_rx(DisasContext *s, uint64_t insn, int *r1,
784                                  int *x2, int *b2, int *d2)
785 {
786     debug_insn(insn);
787
788     *r1 = (insn >> 20) & 0xf;
789     *x2 = (insn >> 16) & 0xf;
790     *b2 = (insn >> 12) & 0xf;
791     *d2 = insn & 0xfff;
792
793     return get_address(s, *x2, *b2, *d2);
794 }
795
796 static inline void decode_rs(DisasContext *s, uint64_t insn, int *r1, int *r3,
797                              int *b2, int *d2)
798 {
799     debug_insn(insn);
800
801     *r1 = (insn >> 20) & 0xf;
802     /* aka m3 */
803     *r3 = (insn >> 16) & 0xf;
804     *b2 = (insn >> 12) & 0xf;
805     *d2 = insn & 0xfff;
806 }
807
808 static inline TCGv_i64 decode_si(DisasContext *s, uint64_t insn, int *i2,
809                                  int *b1, int *d1)
810 {
811     debug_insn(insn);
812
813     *i2 = (insn >> 16) & 0xff;
814     *b1 = (insn >> 12) & 0xf;
815     *d1 = insn & 0xfff;
816
817     return get_address(s, 0, *b1, *d1);
818 }
819
820 static inline void gen_goto_tb(DisasContext *s, int tb_num, target_ulong pc)
821 {
822     TranslationBlock *tb;
823
824     gen_update_cc_op(s);
825
826     tb = s->tb;
827     /* NOTE: we handle the case where the TB spans two pages here */
828     if ((pc & TARGET_PAGE_MASK) == (tb->pc & TARGET_PAGE_MASK) ||
829         (pc & TARGET_PAGE_MASK) == ((s->pc - 1) & TARGET_PAGE_MASK))  {
830         /* jump to same page: we can use a direct jump */
831         tcg_gen_goto_tb(tb_num);
832         tcg_gen_movi_i64(psw_addr, pc);
833         tcg_gen_exit_tb((long)tb + tb_num);
834     } else {
835         /* jump to another page: currently not optimized */
836         tcg_gen_movi_i64(psw_addr, pc);
837         tcg_gen_exit_tb(0);
838     }
839 }
840
841 static inline void account_noninline_branch(DisasContext *s, int cc_op)
842 {
843 #ifdef DEBUG_INLINE_BRANCHES
844     inline_branch_miss[cc_op]++;
845 #endif
846 }
847
848 static inline void account_inline_branch(DisasContext *s)
849 {
850 #ifdef DEBUG_INLINE_BRANCHES
851     inline_branch_hit[s->cc_op]++;
852 #endif
853 }
854
855 static void gen_jcc(DisasContext *s, uint32_t mask, int skip)
856 {
857     TCGv_i32 tmp, tmp2, r;
858     TCGv_i64 tmp64;
859     int old_cc_op;
860
861     switch (s->cc_op) {
862     case CC_OP_LTGT0_32:
863         tmp = tcg_temp_new_i32();
864         tcg_gen_trunc_i64_i32(tmp, cc_dst);
865         switch (mask) {
866         case 0x8 | 0x4: /* dst <= 0 */
867             tcg_gen_brcondi_i32(TCG_COND_GT, tmp, 0, skip);
868             break;
869         case 0x8 | 0x2: /* dst >= 0 */
870             tcg_gen_brcondi_i32(TCG_COND_LT, tmp, 0, skip);
871             break;
872         case 0x8: /* dst == 0 */
873             tcg_gen_brcondi_i32(TCG_COND_NE, tmp, 0, skip);
874             break;
875         case 0x7: /* dst != 0 */
876         case 0x6: /* dst != 0 */
877             tcg_gen_brcondi_i32(TCG_COND_EQ, tmp, 0, skip);
878             break;
879         case 0x4: /* dst < 0 */
880             tcg_gen_brcondi_i32(TCG_COND_GE, tmp, 0, skip);
881             break;
882         case 0x2: /* dst > 0 */
883             tcg_gen_brcondi_i32(TCG_COND_LE, tmp, 0, skip);
884             break;
885         default:
886             tcg_temp_free_i32(tmp);
887             goto do_dynamic;
888         }
889         account_inline_branch(s);
890         tcg_temp_free_i32(tmp);
891         break;
892     case CC_OP_LTGT0_64:
893         switch (mask) {
894         case 0x8 | 0x4: /* dst <= 0 */
895             tcg_gen_brcondi_i64(TCG_COND_GT, cc_dst, 0, skip);
896             break;
897         case 0x8 | 0x2: /* dst >= 0 */
898             tcg_gen_brcondi_i64(TCG_COND_LT, cc_dst, 0, skip);
899             break;
900         case 0x8: /* dst == 0 */
901             tcg_gen_brcondi_i64(TCG_COND_NE, cc_dst, 0, skip);
902             break;
903         case 0x7: /* dst != 0 */
904         case 0x6: /* dst != 0 */
905             tcg_gen_brcondi_i64(TCG_COND_EQ, cc_dst, 0, skip);
906             break;
907         case 0x4: /* dst < 0 */
908             tcg_gen_brcondi_i64(TCG_COND_GE, cc_dst, 0, skip);
909             break;
910         case 0x2: /* dst > 0 */
911             tcg_gen_brcondi_i64(TCG_COND_LE, cc_dst, 0, skip);
912             break;
913         default:
914             goto do_dynamic;
915         }
916         account_inline_branch(s);
917         break;
918     case CC_OP_LTGT_32:
919         tmp = tcg_temp_new_i32();
920         tmp2 = tcg_temp_new_i32();
921         tcg_gen_trunc_i64_i32(tmp, cc_src);
922         tcg_gen_trunc_i64_i32(tmp2, cc_dst);
923         switch (mask) {
924         case 0x8 | 0x4: /* src <= dst */
925             tcg_gen_brcond_i32(TCG_COND_GT, tmp, tmp2, skip);
926             break;
927         case 0x8 | 0x2: /* src >= dst */
928             tcg_gen_brcond_i32(TCG_COND_LT, tmp, tmp2, skip);
929             break;
930         case 0x8: /* src == dst */
931             tcg_gen_brcond_i32(TCG_COND_NE, tmp, tmp2, skip);
932             break;
933         case 0x7: /* src != dst */
934         case 0x6: /* src != dst */
935             tcg_gen_brcond_i32(TCG_COND_EQ, tmp, tmp2, skip);
936             break;
937         case 0x4: /* src < dst */
938             tcg_gen_brcond_i32(TCG_COND_GE, tmp, tmp2, skip);
939             break;
940         case 0x2: /* src > dst */
941             tcg_gen_brcond_i32(TCG_COND_LE, tmp, tmp2, skip);
942             break;
943         default:
944             tcg_temp_free_i32(tmp);
945             tcg_temp_free_i32(tmp2);
946             goto do_dynamic;
947         }
948         account_inline_branch(s);
949         tcg_temp_free_i32(tmp);
950         tcg_temp_free_i32(tmp2);
951         break;
952     case CC_OP_LTGT_64:
953         switch (mask) {
954         case 0x8 | 0x4: /* src <= dst */
955             tcg_gen_brcond_i64(TCG_COND_GT, cc_src, cc_dst, skip);
956             break;
957         case 0x8 | 0x2: /* src >= dst */
958             tcg_gen_brcond_i64(TCG_COND_LT, cc_src, cc_dst, skip);
959             break;
960         case 0x8: /* src == dst */
961             tcg_gen_brcond_i64(TCG_COND_NE, cc_src, cc_dst, skip);
962             break;
963         case 0x7: /* src != dst */
964         case 0x6: /* src != dst */
965             tcg_gen_brcond_i64(TCG_COND_EQ, cc_src, cc_dst, skip);
966             break;
967         case 0x4: /* src < dst */
968             tcg_gen_brcond_i64(TCG_COND_GE, cc_src, cc_dst, skip);
969             break;
970         case 0x2: /* src > dst */
971             tcg_gen_brcond_i64(TCG_COND_LE, cc_src, cc_dst, skip);
972             break;
973         default:
974             goto do_dynamic;
975         }
976         account_inline_branch(s);
977         break;
978     case CC_OP_LTUGTU_32:
979         tmp = tcg_temp_new_i32();
980         tmp2 = tcg_temp_new_i32();
981         tcg_gen_trunc_i64_i32(tmp, cc_src);
982         tcg_gen_trunc_i64_i32(tmp2, cc_dst);
983         switch (mask) {
984         case 0x8 | 0x4: /* src <= dst */
985             tcg_gen_brcond_i32(TCG_COND_GTU, tmp, tmp2, skip);
986             break;
987         case 0x8 | 0x2: /* src >= dst */
988             tcg_gen_brcond_i32(TCG_COND_LTU, tmp, tmp2, skip);
989             break;
990         case 0x8: /* src == dst */
991             tcg_gen_brcond_i32(TCG_COND_NE, tmp, tmp2, skip);
992             break;
993         case 0x7: /* src != dst */
994         case 0x6: /* src != dst */
995             tcg_gen_brcond_i32(TCG_COND_EQ, tmp, tmp2, skip);
996             break;
997         case 0x4: /* src < dst */
998             tcg_gen_brcond_i32(TCG_COND_GEU, tmp, tmp2, skip);
999             break;
1000         case 0x2: /* src > dst */
1001             tcg_gen_brcond_i32(TCG_COND_LEU, tmp, tmp2, skip);
1002             break;
1003         default:
1004             tcg_temp_free_i32(tmp);
1005             tcg_temp_free_i32(tmp2);
1006             goto do_dynamic;
1007         }
1008         account_inline_branch(s);
1009         tcg_temp_free_i32(tmp);
1010         tcg_temp_free_i32(tmp2);
1011         break;
1012     case CC_OP_LTUGTU_64:
1013         switch (mask) {
1014         case 0x8 | 0x4: /* src <= dst */
1015             tcg_gen_brcond_i64(TCG_COND_GTU, cc_src, cc_dst, skip);
1016             break;
1017         case 0x8 | 0x2: /* src >= dst */
1018             tcg_gen_brcond_i64(TCG_COND_LTU, cc_src, cc_dst, skip);
1019             break;
1020         case 0x8: /* src == dst */
1021             tcg_gen_brcond_i64(TCG_COND_NE, cc_src, cc_dst, skip);
1022             break;
1023         case 0x7: /* src != dst */
1024         case 0x6: /* src != dst */
1025             tcg_gen_brcond_i64(TCG_COND_EQ, cc_src, cc_dst, skip);
1026             break;
1027         case 0x4: /* src < dst */
1028             tcg_gen_brcond_i64(TCG_COND_GEU, cc_src, cc_dst, skip);
1029             break;
1030         case 0x2: /* src > dst */
1031             tcg_gen_brcond_i64(TCG_COND_LEU, cc_src, cc_dst, skip);
1032             break;
1033         default:
1034             goto do_dynamic;
1035         }
1036         account_inline_branch(s);
1037         break;
1038     case CC_OP_NZ:
1039         switch (mask) {
1040         /* dst == 0 || dst != 0 */
1041         case 0x8 | 0x4:
1042         case 0x8 | 0x4 | 0x2:
1043         case 0x8 | 0x4 | 0x2 | 0x1:
1044         case 0x8 | 0x4 | 0x1:
1045             break;
1046         /* dst == 0 */
1047         case 0x8:
1048         case 0x8 | 0x2:
1049         case 0x8 | 0x2 | 0x1:
1050         case 0x8 | 0x1:
1051             tcg_gen_brcondi_i64(TCG_COND_NE, cc_dst, 0, skip);
1052             break;
1053         /* dst != 0 */
1054         case 0x4:
1055         case 0x4 | 0x2:
1056         case 0x4 | 0x2 | 0x1:
1057         case 0x4 | 0x1:
1058             tcg_gen_brcondi_i64(TCG_COND_EQ, cc_dst, 0, skip);
1059             break;
1060         default:
1061             goto do_dynamic;
1062         }
1063         account_inline_branch(s);
1064         break;
1065     case CC_OP_TM_32:
1066         tmp = tcg_temp_new_i32();
1067         tmp2 = tcg_temp_new_i32();
1068
1069         tcg_gen_trunc_i64_i32(tmp, cc_src);
1070         tcg_gen_trunc_i64_i32(tmp2, cc_dst);
1071         tcg_gen_and_i32(tmp, tmp, tmp2);
1072         switch (mask) {
1073         case 0x8: /* val & mask == 0 */
1074             tcg_gen_brcondi_i32(TCG_COND_NE, tmp, 0, skip);
1075             break;
1076         case 0x4 | 0x2 | 0x1: /* val & mask != 0 */
1077             tcg_gen_brcondi_i32(TCG_COND_EQ, tmp, 0, skip);
1078             break;
1079         default:
1080             tcg_temp_free_i32(tmp);
1081             tcg_temp_free_i32(tmp2);
1082             goto do_dynamic;
1083         }
1084         tcg_temp_free_i32(tmp);
1085         tcg_temp_free_i32(tmp2);
1086         account_inline_branch(s);
1087         break;
1088     case CC_OP_TM_64:
1089         tmp64 = tcg_temp_new_i64();
1090
1091         tcg_gen_and_i64(tmp64, cc_src, cc_dst);
1092         switch (mask) {
1093         case 0x8: /* val & mask == 0 */
1094             tcg_gen_brcondi_i64(TCG_COND_NE, tmp64, 0, skip);
1095             break;
1096         case 0x4 | 0x2 | 0x1: /* val & mask != 0 */
1097             tcg_gen_brcondi_i64(TCG_COND_EQ, tmp64, 0, skip);
1098             break;
1099         default:
1100             tcg_temp_free_i64(tmp64);
1101             goto do_dynamic;
1102         }
1103         tcg_temp_free_i64(tmp64);
1104         account_inline_branch(s);
1105         break;
1106     case CC_OP_ICM:
1107         switch (mask) {
1108         case 0x8: /* val == 0 */
1109             tcg_gen_brcondi_i64(TCG_COND_NE, cc_dst, 0, skip);
1110             break;
1111         case 0x4 | 0x2 | 0x1: /* val != 0 */
1112         case 0x4 | 0x2: /* val != 0 */
1113             tcg_gen_brcondi_i64(TCG_COND_EQ, cc_dst, 0, skip);
1114             break;
1115         default:
1116             goto do_dynamic;
1117         }
1118         account_inline_branch(s);
1119         break;
1120     case CC_OP_STATIC:
1121         old_cc_op = s->cc_op;
1122         goto do_dynamic_nocccalc;
1123     case CC_OP_DYNAMIC:
1124     default:
1125 do_dynamic:
1126         old_cc_op = s->cc_op;
1127         /* calculate cc value */
1128         gen_op_calc_cc(s);
1129
1130 do_dynamic_nocccalc:
1131         /* jump based on cc */
1132         account_noninline_branch(s, old_cc_op);
1133
1134         switch (mask) {
1135         case 0x8 | 0x4 | 0x2 | 0x1:
1136             /* always true */
1137             break;
1138         case 0x8 | 0x4 | 0x2: /* cc != 3 */
1139             tcg_gen_brcondi_i32(TCG_COND_EQ, cc_op, 3, skip);
1140             break;
1141         case 0x8 | 0x4 | 0x1: /* cc != 2 */
1142             tcg_gen_brcondi_i32(TCG_COND_EQ, cc_op, 2, skip);
1143             break;
1144         case 0x8 | 0x2 | 0x1: /* cc != 1 */
1145             tcg_gen_brcondi_i32(TCG_COND_EQ, cc_op, 1, skip);
1146             break;
1147         case 0x8 | 0x2: /* cc == 0 || cc == 2 */
1148             tmp = tcg_temp_new_i32();
1149             tcg_gen_andi_i32(tmp, cc_op, 1);
1150             tcg_gen_brcondi_i32(TCG_COND_NE, tmp, 0, skip);
1151             tcg_temp_free_i32(tmp);
1152             break;
1153         case 0x8 | 0x4: /* cc < 2 */
1154             tcg_gen_brcondi_i32(TCG_COND_GEU, cc_op, 2, skip);
1155             break;
1156         case 0x8: /* cc == 0 */
1157             tcg_gen_brcondi_i32(TCG_COND_NE, cc_op, 0, skip);
1158             break;
1159         case 0x4 | 0x2 | 0x1: /* cc != 0 */
1160             tcg_gen_brcondi_i32(TCG_COND_EQ, cc_op, 0, skip);
1161             break;
1162         case 0x4 | 0x1: /* cc == 1 || cc == 3 */
1163             tmp = tcg_temp_new_i32();
1164             tcg_gen_andi_i32(tmp, cc_op, 1);
1165             tcg_gen_brcondi_i32(TCG_COND_EQ, tmp, 0, skip);
1166             tcg_temp_free_i32(tmp);
1167             break;
1168         case 0x4: /* cc == 1 */
1169             tcg_gen_brcondi_i32(TCG_COND_NE, cc_op, 1, skip);
1170             break;
1171         case 0x2 | 0x1: /* cc > 1 */
1172             tcg_gen_brcondi_i32(TCG_COND_LEU, cc_op, 1, skip);
1173             break;
1174         case 0x2: /* cc == 2 */
1175             tcg_gen_brcondi_i32(TCG_COND_NE, cc_op, 2, skip);
1176             break;
1177         case 0x1: /* cc == 3 */
1178             tcg_gen_brcondi_i32(TCG_COND_NE, cc_op, 3, skip);
1179             break;
1180         default: /* cc is masked by something else */
1181             tmp = tcg_const_i32(3);
1182             /* 3 - cc */
1183             tcg_gen_sub_i32(tmp, tmp, cc_op);
1184             tmp2 = tcg_const_i32(1);
1185             /* 1 << (3 - cc) */
1186             tcg_gen_shl_i32(tmp2, tmp2, tmp);
1187             r = tcg_const_i32(mask);
1188             /* mask & (1 << (3 - cc)) */
1189             tcg_gen_and_i32(r, r, tmp2);
1190             tcg_temp_free_i32(tmp);
1191             tcg_temp_free_i32(tmp2);
1192
1193             tcg_gen_brcondi_i32(TCG_COND_EQ, r, 0, skip);
1194             tcg_temp_free_i32(r);
1195             break;
1196         }
1197         break;
1198     }
1199 }
1200
1201 static void gen_bcr(DisasContext *s, uint32_t mask, TCGv_i64 target,
1202                     uint64_t offset)
1203 {
1204     int skip;
1205
1206     if (mask == 0xf) {
1207         /* unconditional */
1208         tcg_gen_mov_i64(psw_addr, target);
1209         tcg_gen_exit_tb(0);
1210     } else if (mask == 0) {
1211         /* ignore cc and never match */
1212         gen_goto_tb(s, 0, offset + 2);
1213     } else {
1214         TCGv_i64 new_addr = tcg_temp_local_new_i64();
1215
1216         tcg_gen_mov_i64(new_addr, target);
1217         skip = gen_new_label();
1218         gen_jcc(s, mask, skip);
1219         tcg_gen_mov_i64(psw_addr, new_addr);
1220         tcg_temp_free_i64(new_addr);
1221         tcg_gen_exit_tb(0);
1222         gen_set_label(skip);
1223         tcg_temp_free_i64(new_addr);
1224         gen_goto_tb(s, 1, offset + 2);
1225     }
1226 }
1227
1228 static void gen_brc(uint32_t mask, DisasContext *s, int32_t offset)
1229 {
1230     int skip;
1231
1232     if (mask == 0xf) {
1233         /* unconditional */
1234         gen_goto_tb(s, 0, s->pc + offset);
1235     } else if (mask == 0) {
1236         /* ignore cc and never match */
1237         gen_goto_tb(s, 0, s->pc + 4);
1238     } else {
1239         skip = gen_new_label();
1240         gen_jcc(s, mask, skip);
1241         gen_goto_tb(s, 0, s->pc + offset);
1242         gen_set_label(skip);
1243         gen_goto_tb(s, 1, s->pc + 4);
1244     }
1245     s->is_jmp = DISAS_TB_JUMP;
1246 }
1247
1248 static void gen_op_mvc(DisasContext *s, int l, TCGv_i64 s1, TCGv_i64 s2)
1249 {
1250     TCGv_i64 tmp, tmp2;
1251     int i;
1252     int l_memset = gen_new_label();
1253     int l_out = gen_new_label();
1254     TCGv_i64 dest = tcg_temp_local_new_i64();
1255     TCGv_i64 src = tcg_temp_local_new_i64();
1256     TCGv_i32 vl;
1257
1258     /* Find out if we should use the inline version of mvc */
1259     switch (l) {
1260     case 0:
1261     case 1:
1262     case 2:
1263     case 3:
1264     case 4:
1265     case 5:
1266     case 6:
1267     case 7:
1268     case 11:
1269     case 15:
1270         /* use inline */
1271         break;
1272     default:
1273         /* Fall back to helper */
1274         vl = tcg_const_i32(l);
1275         potential_page_fault(s);
1276         gen_helper_mvc(vl, s1, s2);
1277         tcg_temp_free_i32(vl);
1278         return;
1279     }
1280
1281     tcg_gen_mov_i64(dest, s1);
1282     tcg_gen_mov_i64(src, s2);
1283
1284     if (!(s->tb->flags & FLAG_MASK_64)) {
1285         /* XXX what if we overflow while moving? */
1286         tcg_gen_andi_i64(dest, dest, 0x7fffffffUL);
1287         tcg_gen_andi_i64(src, src, 0x7fffffffUL);
1288     }
1289
1290     tmp = tcg_temp_new_i64();
1291     tcg_gen_addi_i64(tmp, src, 1);
1292     tcg_gen_brcond_i64(TCG_COND_EQ, dest, tmp, l_memset);
1293     tcg_temp_free_i64(tmp);
1294
1295     switch (l) {
1296     case 0:
1297         tmp = tcg_temp_new_i64();
1298
1299         tcg_gen_qemu_ld8u(tmp, src, get_mem_index(s));
1300         tcg_gen_qemu_st8(tmp, dest, get_mem_index(s));
1301
1302         tcg_temp_free_i64(tmp);
1303         break;
1304     case 1:
1305         tmp = tcg_temp_new_i64();
1306
1307         tcg_gen_qemu_ld16u(tmp, src, get_mem_index(s));
1308         tcg_gen_qemu_st16(tmp, dest, get_mem_index(s));
1309
1310         tcg_temp_free_i64(tmp);
1311         break;
1312     case 3:
1313         tmp = tcg_temp_new_i64();
1314
1315         tcg_gen_qemu_ld32u(tmp, src, get_mem_index(s));
1316         tcg_gen_qemu_st32(tmp, dest, get_mem_index(s));
1317
1318         tcg_temp_free_i64(tmp);
1319         break;
1320     case 4:
1321         tmp = tcg_temp_new_i64();
1322         tmp2 = tcg_temp_new_i64();
1323
1324         tcg_gen_qemu_ld32u(tmp, src, get_mem_index(s));
1325         tcg_gen_addi_i64(src, src, 4);
1326         tcg_gen_qemu_ld8u(tmp2, src, get_mem_index(s));
1327         tcg_gen_qemu_st32(tmp, dest, get_mem_index(s));
1328         tcg_gen_addi_i64(dest, dest, 4);
1329         tcg_gen_qemu_st8(tmp2, dest, get_mem_index(s));
1330
1331         tcg_temp_free_i64(tmp);
1332         tcg_temp_free_i64(tmp2);
1333         break;
1334     case 7:
1335         tmp = tcg_temp_new_i64();
1336
1337         tcg_gen_qemu_ld64(tmp, src, get_mem_index(s));
1338         tcg_gen_qemu_st64(tmp, dest, get_mem_index(s));
1339
1340         tcg_temp_free_i64(tmp);
1341         break;
1342     default:
1343         /* The inline version can become too big for too uneven numbers, only
1344            use it on known good lengths */
1345         tmp = tcg_temp_new_i64();
1346         tmp2 = tcg_const_i64(8);
1347         for (i = 0; (i + 7) <= l; i += 8) {
1348             tcg_gen_qemu_ld64(tmp, src, get_mem_index(s));
1349             tcg_gen_qemu_st64(tmp, dest, get_mem_index(s));
1350
1351             tcg_gen_add_i64(src, src, tmp2);
1352             tcg_gen_add_i64(dest, dest, tmp2);
1353         }
1354
1355         tcg_temp_free_i64(tmp2);
1356         tmp2 = tcg_const_i64(1);
1357
1358         for (; i <= l; i++) {
1359             tcg_gen_qemu_ld8u(tmp, src, get_mem_index(s));
1360             tcg_gen_qemu_st8(tmp, dest, get_mem_index(s));
1361
1362             tcg_gen_add_i64(src, src, tmp2);
1363             tcg_gen_add_i64(dest, dest, tmp2);
1364         }
1365
1366         tcg_temp_free_i64(tmp2);
1367         tcg_temp_free_i64(tmp);
1368         break;
1369     }
1370
1371     tcg_gen_br(l_out);
1372
1373     gen_set_label(l_memset);
1374     /* memset case (dest == (src + 1)) */
1375
1376     tmp = tcg_temp_new_i64();
1377     tmp2 = tcg_temp_new_i64();
1378     /* fill tmp with the byte */
1379     tcg_gen_qemu_ld8u(tmp, src, get_mem_index(s));
1380     tcg_gen_shli_i64(tmp2, tmp, 8);
1381     tcg_gen_or_i64(tmp, tmp, tmp2);
1382     tcg_gen_shli_i64(tmp2, tmp, 16);
1383     tcg_gen_or_i64(tmp, tmp, tmp2);
1384     tcg_gen_shli_i64(tmp2, tmp, 32);
1385     tcg_gen_or_i64(tmp, tmp, tmp2);
1386     tcg_temp_free_i64(tmp2);
1387
1388     tmp2 = tcg_const_i64(8);
1389
1390     for (i = 0; (i + 7) <= l; i += 8) {
1391         tcg_gen_qemu_st64(tmp, dest, get_mem_index(s));
1392         tcg_gen_addi_i64(dest, dest, 8);
1393     }
1394
1395     tcg_temp_free_i64(tmp2);
1396     tmp2 = tcg_const_i64(1);
1397
1398     for (; i <= l; i++) {
1399         tcg_gen_qemu_st8(tmp, dest, get_mem_index(s));
1400         tcg_gen_addi_i64(dest, dest, 1);
1401     }
1402
1403     tcg_temp_free_i64(tmp2);
1404     tcg_temp_free_i64(tmp);
1405
1406     gen_set_label(l_out);
1407
1408     tcg_temp_free(dest);
1409     tcg_temp_free(src);
1410 }
1411
1412 static void gen_op_clc(DisasContext *s, int l, TCGv_i64 s1, TCGv_i64 s2)
1413 {
1414     TCGv_i64 tmp;
1415     TCGv_i64 tmp2;
1416     TCGv_i32 vl;
1417
1418     /* check for simple 32bit or 64bit match */
1419     switch (l) {
1420     case 0:
1421         tmp = tcg_temp_new_i64();
1422         tmp2 = tcg_temp_new_i64();
1423
1424         tcg_gen_qemu_ld8u(tmp, s1, get_mem_index(s));
1425         tcg_gen_qemu_ld8u(tmp2, s2, get_mem_index(s));
1426         cmp_u64(s, tmp, tmp2);
1427
1428         tcg_temp_free_i64(tmp);
1429         tcg_temp_free_i64(tmp2);
1430         return;
1431     case 1:
1432         tmp = tcg_temp_new_i64();
1433         tmp2 = tcg_temp_new_i64();
1434
1435         tcg_gen_qemu_ld16u(tmp, s1, get_mem_index(s));
1436         tcg_gen_qemu_ld16u(tmp2, s2, get_mem_index(s));
1437         cmp_u64(s, tmp, tmp2);
1438
1439         tcg_temp_free_i64(tmp);
1440         tcg_temp_free_i64(tmp2);
1441         return;
1442     case 3:
1443         tmp = tcg_temp_new_i64();
1444         tmp2 = tcg_temp_new_i64();
1445
1446         tcg_gen_qemu_ld32u(tmp, s1, get_mem_index(s));
1447         tcg_gen_qemu_ld32u(tmp2, s2, get_mem_index(s));
1448         cmp_u64(s, tmp, tmp2);
1449
1450         tcg_temp_free_i64(tmp);
1451         tcg_temp_free_i64(tmp2);
1452         return;
1453     case 7:
1454         tmp = tcg_temp_new_i64();
1455         tmp2 = tcg_temp_new_i64();
1456
1457         tcg_gen_qemu_ld64(tmp, s1, get_mem_index(s));
1458         tcg_gen_qemu_ld64(tmp2, s2, get_mem_index(s));
1459         cmp_u64(s, tmp, tmp2);
1460
1461         tcg_temp_free_i64(tmp);
1462         tcg_temp_free_i64(tmp2);
1463         return;
1464     }
1465
1466     potential_page_fault(s);
1467     vl = tcg_const_i32(l);
1468     gen_helper_clc(cc_op, vl, s1, s2);
1469     tcg_temp_free_i32(vl);
1470     set_cc_static(s);
1471 }
1472
1473 static void disas_e3(DisasContext* s, int op, int r1, int x2, int b2, int d2)
1474 {
1475     TCGv_i64 addr, tmp, tmp2, tmp3, tmp4;
1476     TCGv_i32 tmp32_1, tmp32_2, tmp32_3;
1477
1478     LOG_DISAS("disas_e3: op 0x%x r1 %d x2 %d b2 %d d2 %d\n",
1479               op, r1, x2, b2, d2);
1480     addr = get_address(s, x2, b2, d2);
1481     switch (op) {
1482     case 0x2: /* LTG R1,D2(X2,B2) [RXY] */
1483     case 0x4: /* lg r1,d2(x2,b2) */
1484         tcg_gen_qemu_ld64(regs[r1], addr, get_mem_index(s));
1485         if (op == 0x2) {
1486             set_cc_s64(s, regs[r1]);
1487         }
1488         break;
1489     case 0x12: /* LT R1,D2(X2,B2) [RXY] */
1490         tmp2 = tcg_temp_new_i64();
1491         tmp32_1 = tcg_temp_new_i32();
1492         tcg_gen_qemu_ld32s(tmp2, addr, get_mem_index(s));
1493         tcg_gen_trunc_i64_i32(tmp32_1, tmp2);
1494         store_reg32(r1, tmp32_1);
1495         set_cc_s32(s, tmp32_1);
1496         tcg_temp_free_i64(tmp2);
1497         tcg_temp_free_i32(tmp32_1);
1498         break;
1499     case 0xc: /* MSG      R1,D2(X2,B2)     [RXY] */
1500     case 0x1c: /* MSGF     R1,D2(X2,B2)     [RXY] */
1501         tmp2 = tcg_temp_new_i64();
1502         if (op == 0xc) {
1503             tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s));
1504         } else {
1505             tcg_gen_qemu_ld32s(tmp2, addr, get_mem_index(s));
1506         }
1507         tcg_gen_mul_i64(regs[r1], regs[r1], tmp2);
1508         tcg_temp_free_i64(tmp2);
1509         break;
1510     case 0xd: /* DSG      R1,D2(X2,B2)     [RXY] */
1511     case 0x1d: /* DSGF      R1,D2(X2,B2)     [RXY] */
1512         tmp2 = tcg_temp_new_i64();
1513         if (op == 0x1d) {
1514             tcg_gen_qemu_ld32s(tmp2, addr, get_mem_index(s));
1515         } else {
1516             tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s));
1517         }
1518         tmp4 = load_reg(r1 + 1);
1519         tmp3 = tcg_temp_new_i64();
1520         tcg_gen_div_i64(tmp3, tmp4, tmp2);
1521         store_reg(r1 + 1, tmp3);
1522         tcg_gen_rem_i64(tmp3, tmp4, tmp2);
1523         store_reg(r1, tmp3);
1524         tcg_temp_free_i64(tmp2);
1525         tcg_temp_free_i64(tmp3);
1526         tcg_temp_free_i64(tmp4);
1527         break;
1528     case 0x8: /* AG      R1,D2(X2,B2)     [RXY] */
1529     case 0xa: /* ALG      R1,D2(X2,B2)     [RXY] */
1530     case 0x18: /* AGF       R1,D2(X2,B2)     [RXY] */
1531     case 0x1a: /* ALGF      R1,D2(X2,B2)     [RXY] */
1532         if (op == 0x1a) {
1533             tmp2 = tcg_temp_new_i64();
1534             tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s));
1535         } else if (op == 0x18) {
1536             tmp2 = tcg_temp_new_i64();
1537             tcg_gen_qemu_ld32s(tmp2, addr, get_mem_index(s));
1538         } else {
1539             tmp2 = tcg_temp_new_i64();
1540             tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s));
1541         }
1542         tmp4 = load_reg(r1);
1543         tmp3 = tcg_temp_new_i64();
1544         tcg_gen_add_i64(tmp3, tmp4, tmp2);
1545         store_reg(r1, tmp3);
1546         switch (op) {
1547         case 0x8:
1548         case 0x18:
1549             set_cc_add64(s, tmp4, tmp2, tmp3);
1550             break;
1551         case 0xa:
1552         case 0x1a:
1553             set_cc_addu64(s, tmp4, tmp2, tmp3);
1554             break;
1555         default:
1556             tcg_abort();
1557         }
1558         tcg_temp_free_i64(tmp2);
1559         tcg_temp_free_i64(tmp3);
1560         tcg_temp_free_i64(tmp4);
1561         break;
1562     case 0x9: /* SG      R1,D2(X2,B2)     [RXY] */
1563     case 0xb: /* SLG      R1,D2(X2,B2)     [RXY] */
1564     case 0x19: /* SGF      R1,D2(X2,B2)     [RXY] */
1565     case 0x1b: /* SLGF     R1,D2(X2,B2)     [RXY] */
1566         tmp2 = tcg_temp_new_i64();
1567         if (op == 0x19) {
1568             tcg_gen_qemu_ld32s(tmp2, addr, get_mem_index(s));
1569         } else if (op == 0x1b) {
1570             tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s));
1571         } else {
1572             tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s));
1573         }
1574         tmp4 = load_reg(r1);
1575         tmp3 = tcg_temp_new_i64();
1576         tcg_gen_sub_i64(tmp3, tmp4, tmp2);
1577         store_reg(r1, tmp3);
1578         switch (op) {
1579         case 0x9:
1580         case 0x19:
1581             set_cc_sub64(s, tmp4, tmp2, tmp3);
1582             break;
1583         case 0xb:
1584         case 0x1b:
1585             set_cc_subu64(s, tmp4, tmp2, tmp3);
1586             break;
1587         default:
1588             tcg_abort();
1589         }
1590         tcg_temp_free_i64(tmp2);
1591         tcg_temp_free_i64(tmp3);
1592         tcg_temp_free_i64(tmp4);
1593         break;
1594     case 0xf: /* LRVG     R1,D2(X2,B2)     [RXE] */
1595         tmp2 = tcg_temp_new_i64();
1596         tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s));
1597         tcg_gen_bswap64_i64(tmp2, tmp2);
1598         store_reg(r1, tmp2);
1599         tcg_temp_free_i64(tmp2);
1600         break;
1601     case 0x14: /* LGF      R1,D2(X2,B2)     [RXY] */
1602     case 0x16: /* LLGF      R1,D2(X2,B2)     [RXY] */
1603         tmp2 = tcg_temp_new_i64();
1604         tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s));
1605         if (op == 0x14) {
1606             tcg_gen_ext32s_i64(tmp2, tmp2);
1607         }
1608         store_reg(r1, tmp2);
1609         tcg_temp_free_i64(tmp2);
1610         break;
1611     case 0x15: /* LGH     R1,D2(X2,B2)     [RXY] */
1612         tmp2 = tcg_temp_new_i64();
1613         tcg_gen_qemu_ld16s(tmp2, addr, get_mem_index(s));
1614         store_reg(r1, tmp2);
1615         tcg_temp_free_i64(tmp2);
1616         break;
1617     case 0x17: /* LLGT      R1,D2(X2,B2)     [RXY] */
1618         tmp2 = tcg_temp_new_i64();
1619         tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s));
1620         tcg_gen_andi_i64(tmp2, tmp2, 0x7fffffffULL);
1621         store_reg(r1, tmp2);
1622         tcg_temp_free_i64(tmp2);
1623         break;
1624     case 0x1e: /* LRV R1,D2(X2,B2) [RXY] */
1625         tmp2 = tcg_temp_new_i64();
1626         tmp32_1 = tcg_temp_new_i32();
1627         tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s));
1628         tcg_gen_trunc_i64_i32(tmp32_1, tmp2);
1629         tcg_temp_free_i64(tmp2);
1630         tcg_gen_bswap32_i32(tmp32_1, tmp32_1);
1631         store_reg32(r1, tmp32_1);
1632         tcg_temp_free_i32(tmp32_1);
1633         break;
1634     case 0x1f: /* LRVH R1,D2(X2,B2) [RXY] */
1635         tmp2 = tcg_temp_new_i64();
1636         tmp32_1 = tcg_temp_new_i32();
1637         tcg_gen_qemu_ld16u(tmp2, addr, get_mem_index(s));
1638         tcg_gen_trunc_i64_i32(tmp32_1, tmp2);
1639         tcg_temp_free_i64(tmp2);
1640         tcg_gen_bswap16_i32(tmp32_1, tmp32_1);
1641         store_reg16(r1, tmp32_1);
1642         tcg_temp_free_i32(tmp32_1);
1643         break;
1644     case 0x20: /* CG      R1,D2(X2,B2)     [RXY] */
1645     case 0x21: /* CLG      R1,D2(X2,B2) */
1646     case 0x30: /* CGF       R1,D2(X2,B2)     [RXY] */
1647     case 0x31: /* CLGF      R1,D2(X2,B2)     [RXY] */
1648         tmp2 = tcg_temp_new_i64();
1649         switch (op) {
1650         case 0x20:
1651         case 0x21:
1652             tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s));
1653             break;
1654         case 0x30:
1655             tcg_gen_qemu_ld32s(tmp2, addr, get_mem_index(s));
1656             break;
1657         case 0x31:
1658             tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s));
1659             break;
1660         default:
1661             tcg_abort();
1662         }
1663         switch (op) {
1664         case 0x20:
1665         case 0x30:
1666             cmp_s64(s, regs[r1], tmp2);
1667             break;
1668         case 0x21:
1669         case 0x31:
1670             cmp_u64(s, regs[r1], tmp2);
1671             break;
1672         default:
1673             tcg_abort();
1674         }
1675         tcg_temp_free_i64(tmp2);
1676         break;
1677     case 0x24: /* stg r1, d2(x2,b2) */
1678         tcg_gen_qemu_st64(regs[r1], addr, get_mem_index(s));
1679         break;
1680     case 0x3e: /* STRV R1,D2(X2,B2) [RXY] */
1681         tmp32_1 = load_reg32(r1);
1682         tmp2 = tcg_temp_new_i64();
1683         tcg_gen_bswap32_i32(tmp32_1, tmp32_1);
1684         tcg_gen_extu_i32_i64(tmp2, tmp32_1);
1685         tcg_temp_free_i32(tmp32_1);
1686         tcg_gen_qemu_st32(tmp2, addr, get_mem_index(s));
1687         tcg_temp_free_i64(tmp2);
1688         break;
1689     case 0x50: /* STY  R1,D2(X2,B2) [RXY] */
1690         tmp32_1 = load_reg32(r1);
1691         tmp2 = tcg_temp_new_i64();
1692         tcg_gen_extu_i32_i64(tmp2, tmp32_1);
1693         tcg_temp_free_i32(tmp32_1);
1694         tcg_gen_qemu_st32(tmp2, addr, get_mem_index(s));
1695         tcg_temp_free_i64(tmp2);
1696         break;
1697     case 0x57: /* XY R1,D2(X2,B2) [RXY] */
1698         tmp32_1 = load_reg32(r1);
1699         tmp32_2 = tcg_temp_new_i32();
1700         tmp2 = tcg_temp_new_i64();
1701         tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s));
1702         tcg_gen_trunc_i64_i32(tmp32_2, tmp2);
1703         tcg_temp_free_i64(tmp2);
1704         tcg_gen_xor_i32(tmp32_2, tmp32_1, tmp32_2);
1705         store_reg32(r1, tmp32_2);
1706         set_cc_nz_u32(s, tmp32_2);
1707         tcg_temp_free_i32(tmp32_1);
1708         tcg_temp_free_i32(tmp32_2);
1709         break;
1710     case 0x58: /* LY R1,D2(X2,B2) [RXY] */
1711         tmp3 = tcg_temp_new_i64();
1712         tcg_gen_qemu_ld32u(tmp3, addr, get_mem_index(s));
1713         store_reg32_i64(r1, tmp3);
1714         tcg_temp_free_i64(tmp3);
1715         break;
1716     case 0x5a: /* AY R1,D2(X2,B2) [RXY] */
1717     case 0x5b: /* SY R1,D2(X2,B2) [RXY] */
1718         tmp32_1 = load_reg32(r1);
1719         tmp32_2 = tcg_temp_new_i32();
1720         tmp32_3 = tcg_temp_new_i32();
1721         tmp2 = tcg_temp_new_i64();
1722         tcg_gen_qemu_ld32s(tmp2, addr, get_mem_index(s));
1723         tcg_gen_trunc_i64_i32(tmp32_2, tmp2);
1724         tcg_temp_free_i64(tmp2);
1725         switch (op) {
1726         case 0x5a:
1727             tcg_gen_add_i32(tmp32_3, tmp32_1, tmp32_2);
1728             break;
1729         case 0x5b:
1730             tcg_gen_sub_i32(tmp32_3, tmp32_1, tmp32_2);
1731             break;
1732         default:
1733             tcg_abort();
1734         }
1735         store_reg32(r1, tmp32_3);
1736         switch (op) {
1737         case 0x5a:
1738             set_cc_add32(s, tmp32_1, tmp32_2, tmp32_3);
1739             break;
1740         case 0x5b:
1741             set_cc_sub32(s, tmp32_1, tmp32_2, tmp32_3);
1742             break;
1743         default:
1744             tcg_abort();
1745         }
1746         tcg_temp_free_i32(tmp32_1);
1747         tcg_temp_free_i32(tmp32_2);
1748         tcg_temp_free_i32(tmp32_3);
1749         break;
1750     case 0x71: /* LAY R1,D2(X2,B2) [RXY] */
1751         store_reg(r1, addr);
1752         break;
1753     case 0x72: /* STCY R1,D2(X2,B2) [RXY] */
1754         tmp32_1 = load_reg32(r1);
1755         tmp2 = tcg_temp_new_i64();
1756         tcg_gen_ext_i32_i64(tmp2, tmp32_1);
1757         tcg_gen_qemu_st8(tmp2, addr, get_mem_index(s));
1758         tcg_temp_free_i32(tmp32_1);
1759         tcg_temp_free_i64(tmp2);
1760         break;
1761     case 0x73: /* ICY R1,D2(X2,B2) [RXY] */
1762         tmp3 = tcg_temp_new_i64();
1763         tcg_gen_qemu_ld8u(tmp3, addr, get_mem_index(s));
1764         store_reg8(r1, tmp3);
1765         tcg_temp_free_i64(tmp3);
1766         break;
1767     case 0x76: /* LB R1,D2(X2,B2) [RXY] */
1768     case 0x77: /* LGB R1,D2(X2,B2) [RXY] */
1769         tmp2 = tcg_temp_new_i64();
1770         tcg_gen_qemu_ld8s(tmp2, addr, get_mem_index(s));
1771         switch (op) {
1772         case 0x76:
1773             tcg_gen_ext8s_i64(tmp2, tmp2);
1774             store_reg32_i64(r1, tmp2);
1775             break;
1776         case 0x77:
1777             tcg_gen_ext8s_i64(tmp2, tmp2);
1778             store_reg(r1, tmp2);
1779             break;
1780         default:
1781             tcg_abort();
1782         }
1783         tcg_temp_free_i64(tmp2);
1784         break;
1785     case 0x78: /* LHY R1,D2(X2,B2) [RXY] */
1786         tmp2 = tcg_temp_new_i64();
1787         tcg_gen_qemu_ld16s(tmp2, addr, get_mem_index(s));
1788         store_reg32_i64(r1, tmp2);
1789         tcg_temp_free_i64(tmp2);
1790         break;
1791     case 0x80: /* NG      R1,D2(X2,B2)     [RXY] */
1792     case 0x81: /* OG      R1,D2(X2,B2)     [RXY] */
1793     case 0x82: /* XG      R1,D2(X2,B2)     [RXY] */
1794         tmp3 = tcg_temp_new_i64();
1795         tcg_gen_qemu_ld64(tmp3, addr, get_mem_index(s));
1796         switch (op) {
1797         case 0x80:
1798             tcg_gen_and_i64(regs[r1], regs[r1], tmp3);
1799             break;
1800         case 0x81:
1801             tcg_gen_or_i64(regs[r1], regs[r1], tmp3);
1802             break;
1803         case 0x82:
1804             tcg_gen_xor_i64(regs[r1], regs[r1], tmp3);
1805             break;
1806         default:
1807             tcg_abort();
1808         }
1809         set_cc_nz_u64(s, regs[r1]);
1810         tcg_temp_free_i64(tmp3);
1811         break;
1812     case 0x86: /* MLG      R1,D2(X2,B2)     [RXY] */
1813         tmp2 = tcg_temp_new_i64();
1814         tmp32_1 = tcg_const_i32(r1);
1815         tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s));
1816         gen_helper_mlg(tmp32_1, tmp2);
1817         tcg_temp_free_i64(tmp2);
1818         tcg_temp_free_i32(tmp32_1);
1819         break;
1820     case 0x87: /* DLG      R1,D2(X2,B2)     [RXY] */
1821         tmp2 = tcg_temp_new_i64();
1822         tmp32_1 = tcg_const_i32(r1);
1823         tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s));
1824         gen_helper_dlg(tmp32_1, tmp2);
1825         tcg_temp_free_i64(tmp2);
1826         tcg_temp_free_i32(tmp32_1);
1827         break;
1828     case 0x88: /* ALCG      R1,D2(X2,B2)     [RXY] */
1829         tmp2 = tcg_temp_new_i64();
1830         tmp3 = tcg_temp_new_i64();
1831         tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s));
1832         /* XXX possible optimization point */
1833         gen_op_calc_cc(s);
1834         tcg_gen_extu_i32_i64(tmp3, cc_op);
1835         tcg_gen_shri_i64(tmp3, tmp3, 1);
1836         tcg_gen_andi_i64(tmp3, tmp3, 1);
1837         tcg_gen_add_i64(tmp3, tmp2, tmp3);
1838         tcg_gen_add_i64(tmp3, regs[r1], tmp3);
1839         store_reg(r1, tmp3);
1840         set_cc_addu64(s, regs[r1], tmp2, tmp3);
1841         tcg_temp_free_i64(tmp2);
1842         tcg_temp_free_i64(tmp3);
1843         break;
1844     case 0x89: /* SLBG      R1,D2(X2,B2)     [RXY] */
1845         tmp2 = tcg_temp_new_i64();
1846         tmp32_1 = tcg_const_i32(r1);
1847         tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s));
1848         /* XXX possible optimization point */
1849         gen_op_calc_cc(s);
1850         gen_helper_slbg(cc_op, cc_op, tmp32_1, regs[r1], tmp2);
1851         set_cc_static(s);
1852         tcg_temp_free_i64(tmp2);
1853         tcg_temp_free_i32(tmp32_1);
1854         break;
1855     case 0x90: /* LLGC      R1,D2(X2,B2)     [RXY] */
1856         tcg_gen_qemu_ld8u(regs[r1], addr, get_mem_index(s));
1857         break;
1858     case 0x91: /* LLGH      R1,D2(X2,B2)     [RXY] */
1859         tcg_gen_qemu_ld16u(regs[r1], addr, get_mem_index(s));
1860         break;
1861     case 0x94: /* LLC     R1,D2(X2,B2)     [RXY] */
1862         tmp2 = tcg_temp_new_i64();
1863         tcg_gen_qemu_ld8u(tmp2, addr, get_mem_index(s));
1864         store_reg32_i64(r1, tmp2);
1865         tcg_temp_free_i64(tmp2);
1866         break;
1867     case 0x95: /* LLH     R1,D2(X2,B2)     [RXY] */
1868         tmp2 = tcg_temp_new_i64();
1869         tcg_gen_qemu_ld16u(tmp2, addr, get_mem_index(s));
1870         store_reg32_i64(r1, tmp2);
1871         tcg_temp_free_i64(tmp2);
1872         break;
1873     case 0x96: /* ML      R1,D2(X2,B2)     [RXY] */
1874         tmp2 = tcg_temp_new_i64();
1875         tmp3 = load_reg((r1 + 1) & 15);
1876         tcg_gen_ext32u_i64(tmp3, tmp3);
1877         tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s));
1878         tcg_gen_mul_i64(tmp2, tmp2, tmp3);
1879         store_reg32_i64((r1 + 1) & 15, tmp2);
1880         tcg_gen_shri_i64(tmp2, tmp2, 32);
1881         store_reg32_i64(r1, tmp2);
1882         tcg_temp_free_i64(tmp2);
1883         tcg_temp_free_i64(tmp3);
1884         break;
1885     case 0x97: /* DL     R1,D2(X2,B2)     [RXY] */
1886         /* reg(r1) = reg(r1, r1+1) % ld32(addr) */
1887         /* reg(r1+1) = reg(r1, r1+1) / ld32(addr) */
1888         tmp = load_reg(r1);
1889         tmp2 = tcg_temp_new_i64();
1890         tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s));
1891         tmp3 = load_reg((r1 + 1) & 15);
1892         tcg_gen_ext32u_i64(tmp2, tmp2);
1893         tcg_gen_ext32u_i64(tmp3, tmp3);
1894         tcg_gen_shli_i64(tmp, tmp, 32);
1895         tcg_gen_or_i64(tmp, tmp, tmp3);
1896
1897         tcg_gen_rem_i64(tmp3, tmp, tmp2);
1898         tcg_gen_div_i64(tmp, tmp, tmp2);
1899         store_reg32_i64((r1 + 1) & 15, tmp);
1900         store_reg32_i64(r1, tmp3);
1901         tcg_temp_free_i64(tmp);
1902         tcg_temp_free_i64(tmp2);
1903         tcg_temp_free_i64(tmp3);
1904         break;
1905     case 0x98: /* ALC     R1,D2(X2,B2)     [RXY] */
1906         tmp2 = tcg_temp_new_i64();
1907         tmp32_1 = load_reg32(r1);
1908         tmp32_2 = tcg_temp_new_i32();
1909         tmp32_3 = tcg_temp_new_i32();
1910         tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s));
1911         tcg_gen_trunc_i64_i32(tmp32_2, tmp2);
1912         /* XXX possible optimization point */
1913         gen_op_calc_cc(s);
1914         gen_helper_addc_u32(tmp32_3, cc_op, tmp32_1, tmp32_2);
1915         set_cc_addu32(s, tmp32_1, tmp32_2, tmp32_3);
1916         store_reg32(r1, tmp32_3);
1917         tcg_temp_free_i64(tmp2);
1918         tcg_temp_free_i32(tmp32_1);
1919         tcg_temp_free_i32(tmp32_2);
1920         tcg_temp_free_i32(tmp32_3);
1921         break;
1922     case 0x99: /* SLB     R1,D2(X2,B2)     [RXY] */
1923         tmp2 = tcg_temp_new_i64();
1924         tmp32_1 = tcg_const_i32(r1);
1925         tmp32_2 = tcg_temp_new_i32();
1926         tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s));
1927         tcg_gen_trunc_i64_i32(tmp32_2, tmp2);
1928         /* XXX possible optimization point */
1929         gen_op_calc_cc(s);
1930         gen_helper_slb(cc_op, cc_op, tmp32_1, tmp32_2);
1931         set_cc_static(s);
1932         tcg_temp_free_i64(tmp2);
1933         tcg_temp_free_i32(tmp32_1);
1934         tcg_temp_free_i32(tmp32_2);
1935         break;
1936     default:
1937         LOG_DISAS("illegal e3 operation 0x%x\n", op);
1938         gen_illegal_opcode(s, 3);
1939         break;
1940     }
1941     tcg_temp_free_i64(addr);
1942 }
1943
1944 #ifndef CONFIG_USER_ONLY
1945 static void disas_e5(DisasContext* s, uint64_t insn)
1946 {
1947     TCGv_i64 tmp, tmp2;
1948     int op = (insn >> 32) & 0xff;
1949
1950     tmp = get_address(s, 0, (insn >> 28) & 0xf, (insn >> 16) & 0xfff);
1951     tmp2 = get_address(s, 0, (insn >> 12) & 0xf, insn & 0xfff);
1952
1953     LOG_DISAS("disas_e5: insn %" PRIx64 "\n", insn);
1954     switch (op) {
1955     case 0x01: /* TPROT    D1(B1),D2(B2)  [SSE] */
1956         /* Test Protection */
1957         potential_page_fault(s);
1958         gen_helper_tprot(cc_op, tmp, tmp2);
1959         set_cc_static(s);
1960         break;
1961     default:
1962         LOG_DISAS("illegal e5 operation 0x%x\n", op);
1963         gen_illegal_opcode(s, 3);
1964         break;
1965     }
1966
1967     tcg_temp_free_i64(tmp);
1968     tcg_temp_free_i64(tmp2);
1969 }
1970 #endif
1971
1972 static void disas_eb(DisasContext *s, int op, int r1, int r3, int b2, int d2)
1973 {
1974     TCGv_i64 tmp, tmp2, tmp3, tmp4;
1975     TCGv_i32 tmp32_1, tmp32_2;
1976     int i, stm_len;
1977     int ilc = 3;
1978
1979     LOG_DISAS("disas_eb: op 0x%x r1 %d r3 %d b2 %d d2 0x%x\n",
1980               op, r1, r3, b2, d2);
1981     switch (op) {
1982     case 0xc: /* SRLG     R1,R3,D2(B2)     [RSY] */
1983     case 0xd: /* SLLG     R1,R3,D2(B2)     [RSY] */
1984     case 0xa: /* SRAG     R1,R3,D2(B2)     [RSY] */
1985     case 0xb: /* SLAG     R1,R3,D2(B2)     [RSY] */
1986     case 0x1c: /* RLLG     R1,R3,D2(B2)     [RSY] */
1987         if (b2) {
1988             tmp = get_address(s, 0, b2, d2);
1989             tcg_gen_andi_i64(tmp, tmp, 0x3f);
1990         } else {
1991             tmp = tcg_const_i64(d2 & 0x3f);
1992         }
1993         switch (op) {
1994         case 0xc:
1995             tcg_gen_shr_i64(regs[r1], regs[r3], tmp);
1996             break;
1997         case 0xd:
1998             tcg_gen_shl_i64(regs[r1], regs[r3], tmp);
1999             break;
2000         case 0xa:
2001             tcg_gen_sar_i64(regs[r1], regs[r3], tmp);
2002             break;
2003         case 0xb:
2004             tmp2 = tcg_temp_new_i64();
2005             tmp3 = tcg_temp_new_i64();
2006             gen_op_update2_cc_i64(s, CC_OP_SLAG, regs[r3], tmp);
2007             tcg_gen_shl_i64(tmp2, regs[r3], tmp);
2008             /* override sign bit with source sign */
2009             tcg_gen_andi_i64(tmp2, tmp2, ~0x8000000000000000ULL);
2010             tcg_gen_andi_i64(tmp3, regs[r3], 0x8000000000000000ULL);
2011             tcg_gen_or_i64(regs[r1], tmp2, tmp3);
2012             tcg_temp_free_i64(tmp2);
2013             tcg_temp_free_i64(tmp3);
2014             break;
2015         case 0x1c:
2016             tcg_gen_rotl_i64(regs[r1], regs[r3], tmp);
2017             break;
2018         default:
2019             tcg_abort();
2020             break;
2021         }
2022         if (op == 0xa) {
2023             set_cc_s64(s, regs[r1]);
2024         }
2025         tcg_temp_free_i64(tmp);
2026         break;
2027     case 0x1d: /* RLL    R1,R3,D2(B2)        [RSY] */
2028         if (b2) {
2029             tmp = get_address(s, 0, b2, d2);
2030             tcg_gen_andi_i64(tmp, tmp, 0x3f);
2031         } else {
2032             tmp = tcg_const_i64(d2 & 0x3f);
2033         }
2034         tmp32_1 = tcg_temp_new_i32();
2035         tmp32_2 = load_reg32(r3);
2036         tcg_gen_trunc_i64_i32(tmp32_1, tmp);
2037         switch (op) {
2038         case 0x1d:
2039             tcg_gen_rotl_i32(tmp32_1, tmp32_2, tmp32_1);
2040             break;
2041         default:
2042             tcg_abort();
2043             break;
2044         }
2045         store_reg32(r1, tmp32_1);
2046         tcg_temp_free_i64(tmp);
2047         tcg_temp_free_i32(tmp32_1);
2048         tcg_temp_free_i32(tmp32_2);
2049         break;
2050     case 0x4:  /* LMG      R1,R3,D2(B2)     [RSE] */
2051     case 0x24: /* STMG     R1,R3,D2(B2)     [RSE] */
2052         stm_len = 8;
2053         goto do_mh;
2054     case 0x26: /* STMH     R1,R3,D2(B2)     [RSE] */
2055     case 0x96: /* LMH      R1,R3,D2(B2)     [RSE] */
2056         stm_len = 4;
2057 do_mh:
2058         /* Apparently, unrolling lmg/stmg of any size gains performance -
2059            even for very long ones... */
2060         tmp = get_address(s, 0, b2, d2);
2061         tmp3 = tcg_const_i64(stm_len);
2062         tmp4 = tcg_const_i64(op == 0x26 ? 32 : 4);
2063         for (i = r1;; i = (i + 1) % 16) {
2064             switch (op) {
2065             case 0x4:
2066                 tcg_gen_qemu_ld64(regs[i], tmp, get_mem_index(s));
2067                 break;
2068             case 0x96:
2069                 tmp2 = tcg_temp_new_i64();
2070 #if HOST_LONG_BITS == 32
2071                 tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s));
2072                 tcg_gen_trunc_i64_i32(TCGV_HIGH(regs[i]), tmp2);
2073 #else
2074                 tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s));
2075                 tcg_gen_shl_i64(tmp2, tmp2, tmp4);
2076                 tcg_gen_ext32u_i64(regs[i], regs[i]);
2077                 tcg_gen_or_i64(regs[i], regs[i], tmp2);
2078 #endif
2079                 tcg_temp_free_i64(tmp2);
2080                 break;
2081             case 0x24:
2082                 tcg_gen_qemu_st64(regs[i], tmp, get_mem_index(s));
2083                 break;
2084             case 0x26:
2085                 tmp2 = tcg_temp_new_i64();
2086                 tcg_gen_shr_i64(tmp2, regs[i], tmp4);
2087                 tcg_gen_qemu_st32(tmp2, tmp, get_mem_index(s));
2088                 tcg_temp_free_i64(tmp2);
2089                 break;
2090             default:
2091                 tcg_abort();
2092             }
2093             if (i == r3) {
2094                 break;
2095             }
2096             tcg_gen_add_i64(tmp, tmp, tmp3);
2097         }
2098         tcg_temp_free_i64(tmp);
2099         tcg_temp_free_i64(tmp3);
2100         tcg_temp_free_i64(tmp4);
2101         break;
2102     case 0x2c: /* STCMH R1,M3,D2(B2) [RSY] */
2103         tmp = get_address(s, 0, b2, d2);
2104         tmp32_1 = tcg_const_i32(r1);
2105         tmp32_2 = tcg_const_i32(r3);
2106         potential_page_fault(s);
2107         gen_helper_stcmh(tmp32_1, tmp, tmp32_2);
2108         tcg_temp_free_i64(tmp);
2109         tcg_temp_free_i32(tmp32_1);
2110         tcg_temp_free_i32(tmp32_2);
2111         break;
2112 #ifndef CONFIG_USER_ONLY
2113     case 0x2f: /* LCTLG     R1,R3,D2(B2)     [RSE] */
2114         /* Load Control */
2115         check_privileged(s, ilc);
2116         tmp = get_address(s, 0, b2, d2);
2117         tmp32_1 = tcg_const_i32(r1);
2118         tmp32_2 = tcg_const_i32(r3);
2119         potential_page_fault(s);
2120         gen_helper_lctlg(tmp32_1, tmp, tmp32_2);
2121         tcg_temp_free_i64(tmp);
2122         tcg_temp_free_i32(tmp32_1);
2123         tcg_temp_free_i32(tmp32_2);
2124         break;
2125     case 0x25: /* STCTG     R1,R3,D2(B2)     [RSE] */
2126         /* Store Control */
2127         check_privileged(s, ilc);
2128         tmp = get_address(s, 0, b2, d2);
2129         tmp32_1 = tcg_const_i32(r1);
2130         tmp32_2 = tcg_const_i32(r3);
2131         potential_page_fault(s);
2132         gen_helper_stctg(tmp32_1, tmp, tmp32_2);
2133         tcg_temp_free_i64(tmp);
2134         tcg_temp_free_i32(tmp32_1);
2135         tcg_temp_free_i32(tmp32_2);
2136         break;
2137 #endif
2138     case 0x30: /* CSG     R1,R3,D2(B2)     [RSY] */
2139         tmp = get_address(s, 0, b2, d2);
2140         tmp32_1 = tcg_const_i32(r1);
2141         tmp32_2 = tcg_const_i32(r3);
2142         potential_page_fault(s);
2143         /* XXX rewrite in tcg */
2144         gen_helper_csg(cc_op, tmp32_1, tmp, tmp32_2);
2145         set_cc_static(s);
2146         tcg_temp_free_i64(tmp);
2147         tcg_temp_free_i32(tmp32_1);
2148         tcg_temp_free_i32(tmp32_2);
2149         break;
2150     case 0x3e: /* CDSG R1,R3,D2(B2) [RSY] */
2151         tmp = get_address(s, 0, b2, d2);
2152         tmp32_1 = tcg_const_i32(r1);
2153         tmp32_2 = tcg_const_i32(r3);
2154         potential_page_fault(s);
2155         /* XXX rewrite in tcg */
2156         gen_helper_cdsg(cc_op, tmp32_1, tmp, tmp32_2);
2157         set_cc_static(s);
2158         tcg_temp_free_i64(tmp);
2159         tcg_temp_free_i32(tmp32_1);
2160         tcg_temp_free_i32(tmp32_2);
2161         break;
2162     case 0x51: /* TMY D1(B1),I2 [SIY] */
2163         tmp = get_address(s, 0, b2, d2); /* SIY -> this is the destination */
2164         tmp2 = tcg_const_i64((r1 << 4) | r3);
2165         tcg_gen_qemu_ld8u(tmp, tmp, get_mem_index(s));
2166         /* yes, this is a 32 bit operation with 64 bit tcg registers, because
2167            that incurs less conversions */
2168         cmp_64(s, tmp, tmp2, CC_OP_TM_32);
2169         tcg_temp_free_i64(tmp);
2170         tcg_temp_free_i64(tmp2);
2171         break;
2172     case 0x52: /* MVIY D1(B1),I2 [SIY] */
2173         tmp = get_address(s, 0, b2, d2); /* SIY -> this is the destination */
2174         tmp2 = tcg_const_i64((r1 << 4) | r3);
2175         tcg_gen_qemu_st8(tmp2, tmp, get_mem_index(s));
2176         tcg_temp_free_i64(tmp);
2177         tcg_temp_free_i64(tmp2);
2178         break;
2179     case 0x55: /* CLIY D1(B1),I2 [SIY] */
2180         tmp3 = get_address(s, 0, b2, d2); /* SIY -> this is the 1st operand */
2181         tmp = tcg_temp_new_i64();
2182         tmp32_1 = tcg_temp_new_i32();
2183         tcg_gen_qemu_ld8u(tmp, tmp3, get_mem_index(s));
2184         tcg_gen_trunc_i64_i32(tmp32_1, tmp);
2185         cmp_u32c(s, tmp32_1, (r1 << 4) | r3);
2186         tcg_temp_free_i64(tmp);
2187         tcg_temp_free_i64(tmp3);
2188         tcg_temp_free_i32(tmp32_1);
2189         break;
2190     case 0x80: /* ICMH      R1,M3,D2(B2)     [RSY] */
2191         tmp = get_address(s, 0, b2, d2);
2192         tmp32_1 = tcg_const_i32(r1);
2193         tmp32_2 = tcg_const_i32(r3);
2194         potential_page_fault(s);
2195         /* XXX split CC calculation out */
2196         gen_helper_icmh(cc_op, tmp32_1, tmp, tmp32_2);
2197         set_cc_static(s);
2198         tcg_temp_free_i64(tmp);
2199         tcg_temp_free_i32(tmp32_1);
2200         tcg_temp_free_i32(tmp32_2);
2201         break;
2202     default:
2203         LOG_DISAS("illegal eb operation 0x%x\n", op);
2204         gen_illegal_opcode(s, ilc);
2205         break;
2206     }
2207 }
2208
2209 static void disas_ed(DisasContext *s, int op, int r1, int x2, int b2, int d2,
2210                      int r1b)
2211 {
2212     TCGv_i32 tmp_r1, tmp32;
2213     TCGv_i64 addr, tmp;
2214     addr = get_address(s, x2, b2, d2);
2215     tmp_r1 = tcg_const_i32(r1);
2216     switch (op) {
2217     case 0x5: /* LXDB R1,D2(X2,B2) [RXE] */
2218         potential_page_fault(s);
2219         gen_helper_lxdb(tmp_r1, addr);
2220         break;
2221     case 0x9: /* CEB    R1,D2(X2,B2)       [RXE] */
2222         tmp = tcg_temp_new_i64();
2223         tmp32 = load_freg32(r1);
2224         tcg_gen_qemu_ld32u(tmp, addr, get_mem_index(s));
2225         set_cc_cmp_f32_i64(s, tmp32, tmp);
2226         tcg_temp_free_i64(tmp);
2227         tcg_temp_free_i32(tmp32);
2228         break;
2229     case 0xa: /* AEB    R1,D2(X2,B2)       [RXE] */
2230         tmp = tcg_temp_new_i64();
2231         tmp32 = tcg_temp_new_i32();
2232         tcg_gen_qemu_ld32u(tmp, addr, get_mem_index(s));
2233         tcg_gen_trunc_i64_i32(tmp32, tmp);
2234         gen_helper_aeb(tmp_r1, tmp32);
2235         tcg_temp_free_i64(tmp);
2236         tcg_temp_free_i32(tmp32);
2237
2238         tmp32 = load_freg32(r1);
2239         set_cc_nz_f32(s, tmp32);
2240         tcg_temp_free_i32(tmp32);
2241         break;
2242     case 0xb: /* SEB    R1,D2(X2,B2)       [RXE] */
2243         tmp = tcg_temp_new_i64();
2244         tmp32 = tcg_temp_new_i32();
2245         tcg_gen_qemu_ld32u(tmp, addr, get_mem_index(s));
2246         tcg_gen_trunc_i64_i32(tmp32, tmp);
2247         gen_helper_seb(tmp_r1, tmp32);
2248         tcg_temp_free_i64(tmp);
2249         tcg_temp_free_i32(tmp32);
2250
2251         tmp32 = load_freg32(r1);
2252         set_cc_nz_f32(s, tmp32);
2253         tcg_temp_free_i32(tmp32);
2254         break;
2255     case 0xd: /* DEB    R1,D2(X2,B2)       [RXE] */
2256         tmp = tcg_temp_new_i64();
2257         tmp32 = tcg_temp_new_i32();
2258         tcg_gen_qemu_ld32u(tmp, addr, get_mem_index(s));
2259         tcg_gen_trunc_i64_i32(tmp32, tmp);
2260         gen_helper_deb(tmp_r1, tmp32);
2261         tcg_temp_free_i64(tmp);
2262         tcg_temp_free_i32(tmp32);
2263         break;
2264     case 0x10: /* TCEB   R1,D2(X2,B2)       [RXE] */
2265         potential_page_fault(s);
2266         gen_helper_tceb(cc_op, tmp_r1, addr);
2267         set_cc_static(s);
2268         break;
2269     case 0x11: /* TCDB   R1,D2(X2,B2)       [RXE] */
2270         potential_page_fault(s);
2271         gen_helper_tcdb(cc_op, tmp_r1, addr);
2272         set_cc_static(s);
2273         break;
2274     case 0x12: /* TCXB   R1,D2(X2,B2)       [RXE] */
2275         potential_page_fault(s);
2276         gen_helper_tcxb(cc_op, tmp_r1, addr);
2277         set_cc_static(s);
2278         break;
2279     case 0x17: /* MEEB   R1,D2(X2,B2)       [RXE] */
2280         tmp = tcg_temp_new_i64();
2281         tmp32 = tcg_temp_new_i32();
2282         tcg_gen_qemu_ld32u(tmp, addr, get_mem_index(s));
2283         tcg_gen_trunc_i64_i32(tmp32, tmp);
2284         gen_helper_meeb(tmp_r1, tmp32);
2285         tcg_temp_free_i64(tmp);
2286         tcg_temp_free_i32(tmp32);
2287         break;
2288     case 0x19: /* CDB    R1,D2(X2,B2)       [RXE] */
2289         potential_page_fault(s);
2290         gen_helper_cdb(cc_op, tmp_r1, addr);
2291         set_cc_static(s);
2292         break;
2293     case 0x1a: /* ADB    R1,D2(X2,B2)       [RXE] */
2294         potential_page_fault(s);
2295         gen_helper_adb(cc_op, tmp_r1, addr);
2296         set_cc_static(s);
2297         break;
2298     case 0x1b: /* SDB    R1,D2(X2,B2)       [RXE] */
2299         potential_page_fault(s);
2300         gen_helper_sdb(cc_op, tmp_r1, addr);
2301         set_cc_static(s);
2302         break;
2303     case 0x1c: /* MDB    R1,D2(X2,B2)       [RXE] */
2304         potential_page_fault(s);
2305         gen_helper_mdb(tmp_r1, addr);
2306         break;
2307     case 0x1d: /* DDB    R1,D2(X2,B2)       [RXE] */
2308         potential_page_fault(s);
2309         gen_helper_ddb(tmp_r1, addr);
2310         break;
2311     case 0x1e: /* MADB  R1,R3,D2(X2,B2) [RXF] */
2312         /* for RXF insns, r1 is R3 and r1b is R1 */
2313         tmp32 = tcg_const_i32(r1b);
2314         potential_page_fault(s);
2315         gen_helper_madb(tmp32, addr, tmp_r1);
2316         tcg_temp_free_i32(tmp32);
2317         break;
2318     default:
2319         LOG_DISAS("illegal ed operation 0x%x\n", op);
2320         gen_illegal_opcode(s, 3);
2321         return;
2322     }
2323     tcg_temp_free_i32(tmp_r1);
2324     tcg_temp_free_i64(addr);
2325 }
2326
2327 static void disas_a5(DisasContext *s, int op, int r1, int i2)
2328 {
2329     TCGv_i64 tmp, tmp2;
2330     TCGv_i32 tmp32;
2331     LOG_DISAS("disas_a5: op 0x%x r1 %d i2 0x%x\n", op, r1, i2);
2332     switch (op) {
2333     case 0x0: /* IIHH     R1,I2     [RI] */
2334         tmp = tcg_const_i64(i2);
2335         tcg_gen_deposit_i64(regs[r1], regs[r1], tmp, 48, 16);
2336         tcg_temp_free_i64(tmp);
2337         break;
2338     case 0x1: /* IIHL     R1,I2     [RI] */
2339         tmp = tcg_const_i64(i2);
2340         tcg_gen_deposit_i64(regs[r1], regs[r1], tmp, 32, 16);
2341         tcg_temp_free_i64(tmp);
2342         break;
2343     case 0x2: /* IILH     R1,I2     [RI] */
2344         tmp = tcg_const_i64(i2);
2345         tcg_gen_deposit_i64(regs[r1], regs[r1], tmp, 16, 16);
2346         tcg_temp_free_i64(tmp);
2347         break;
2348     case 0x3: /* IILL     R1,I2     [RI] */
2349         tmp = tcg_const_i64(i2);
2350         tcg_gen_deposit_i64(regs[r1], regs[r1], tmp, 0, 16);
2351         tcg_temp_free_i64(tmp);
2352         break;
2353     case 0x4: /* NIHH     R1,I2     [RI] */
2354     case 0x8: /* OIHH     R1,I2     [RI] */
2355         tmp = load_reg(r1);
2356         tmp32 = tcg_temp_new_i32();
2357         switch (op) {
2358         case 0x4:
2359             tmp2 = tcg_const_i64((((uint64_t)i2) << 48)
2360                                | 0x0000ffffffffffffULL);
2361             tcg_gen_and_i64(tmp, tmp, tmp2);
2362             break;
2363         case 0x8:
2364             tmp2 = tcg_const_i64(((uint64_t)i2) << 48);
2365             tcg_gen_or_i64(tmp, tmp, tmp2);
2366             break;
2367         default:
2368             tcg_abort();
2369         }
2370         store_reg(r1, tmp);
2371         tcg_gen_shri_i64(tmp2, tmp, 48);
2372         tcg_gen_trunc_i64_i32(tmp32, tmp2);
2373         set_cc_nz_u32(s, tmp32);
2374         tcg_temp_free_i64(tmp2);
2375         tcg_temp_free_i32(tmp32);
2376         tcg_temp_free_i64(tmp);
2377         break;
2378     case 0x5: /* NIHL     R1,I2     [RI] */
2379     case 0x9: /* OIHL     R1,I2     [RI] */
2380         tmp = load_reg(r1);
2381         tmp32 = tcg_temp_new_i32();
2382         switch (op) {
2383         case 0x5:
2384             tmp2 = tcg_const_i64((((uint64_t)i2) << 32)
2385                                | 0xffff0000ffffffffULL);
2386             tcg_gen_and_i64(tmp, tmp, tmp2);
2387             break;
2388         case 0x9:
2389             tmp2 = tcg_const_i64(((uint64_t)i2) << 32);
2390             tcg_gen_or_i64(tmp, tmp, tmp2);
2391             break;
2392         default:
2393             tcg_abort();
2394         }
2395         store_reg(r1, tmp);
2396         tcg_gen_shri_i64(tmp2, tmp, 32);
2397         tcg_gen_trunc_i64_i32(tmp32, tmp2);
2398         tcg_gen_andi_i32(tmp32, tmp32, 0xffff);
2399         set_cc_nz_u32(s, tmp32);
2400         tcg_temp_free_i64(tmp2);
2401         tcg_temp_free_i32(tmp32);
2402         tcg_temp_free_i64(tmp);
2403         break;
2404     case 0x6: /* NILH     R1,I2     [RI] */
2405     case 0xa: /* OILH     R1,I2     [RI] */
2406         tmp = load_reg(r1);
2407         tmp32 = tcg_temp_new_i32();
2408         switch (op) {
2409         case 0x6:
2410             tmp2 = tcg_const_i64((((uint64_t)i2) << 16)
2411                                | 0xffffffff0000ffffULL);
2412             tcg_gen_and_i64(tmp, tmp, tmp2);
2413             break;
2414         case 0xa:
2415             tmp2 = tcg_const_i64(((uint64_t)i2) << 16);
2416             tcg_gen_or_i64(tmp, tmp, tmp2);
2417             break;
2418         default:
2419             tcg_abort();
2420         }
2421         store_reg(r1, tmp);
2422         tcg_gen_shri_i64(tmp, tmp, 16);
2423         tcg_gen_trunc_i64_i32(tmp32, tmp);
2424         tcg_gen_andi_i32(tmp32, tmp32, 0xffff);
2425         set_cc_nz_u32(s, tmp32);
2426         tcg_temp_free_i64(tmp2);
2427         tcg_temp_free_i32(tmp32);
2428         tcg_temp_free_i64(tmp);
2429         break;
2430     case 0x7: /* NILL     R1,I2     [RI] */
2431     case 0xb: /* OILL     R1,I2     [RI] */
2432         tmp = load_reg(r1);
2433         tmp32 = tcg_temp_new_i32();
2434         switch (op) {
2435         case 0x7:
2436             tmp2 = tcg_const_i64(i2 | 0xffffffffffff0000ULL);
2437             tcg_gen_and_i64(tmp, tmp, tmp2);
2438             break;
2439         case 0xb:
2440             tmp2 = tcg_const_i64(i2);
2441             tcg_gen_or_i64(tmp, tmp, tmp2);
2442             break;
2443         default:
2444             tcg_abort();
2445         }
2446         store_reg(r1, tmp);
2447         tcg_gen_trunc_i64_i32(tmp32, tmp);
2448         tcg_gen_andi_i32(tmp32, tmp32, 0xffff);
2449         set_cc_nz_u32(s, tmp32);        /* signedness should not matter here */
2450         tcg_temp_free_i64(tmp2);
2451         tcg_temp_free_i32(tmp32);
2452         tcg_temp_free_i64(tmp);
2453         break;
2454     case 0xc: /* LLIHH     R1,I2     [RI] */
2455         tmp = tcg_const_i64( ((uint64_t)i2) << 48 );
2456         store_reg(r1, tmp);
2457         tcg_temp_free_i64(tmp);
2458         break;
2459     case 0xd: /* LLIHL     R1,I2     [RI] */
2460         tmp = tcg_const_i64( ((uint64_t)i2) << 32 );
2461         store_reg(r1, tmp);
2462         tcg_temp_free_i64(tmp);
2463         break;
2464     case 0xe: /* LLILH     R1,I2     [RI] */
2465         tmp = tcg_const_i64( ((uint64_t)i2) << 16 );
2466         store_reg(r1, tmp);
2467         tcg_temp_free_i64(tmp);
2468         break;
2469     case 0xf: /* LLILL     R1,I2     [RI] */
2470         tmp = tcg_const_i64(i2);
2471         store_reg(r1, tmp);
2472         tcg_temp_free_i64(tmp);
2473         break;
2474     default:
2475         LOG_DISAS("illegal a5 operation 0x%x\n", op);
2476         gen_illegal_opcode(s, 2);
2477         return;
2478     }
2479 }
2480
2481 static void disas_a7(DisasContext *s, int op, int r1, int i2)
2482 {
2483     TCGv_i64 tmp, tmp2;
2484     TCGv_i32 tmp32_1, tmp32_2, tmp32_3;
2485     int l1;
2486
2487     LOG_DISAS("disas_a7: op 0x%x r1 %d i2 0x%x\n", op, r1, i2);
2488     switch (op) {
2489     case 0x0: /* TMLH or TMH     R1,I2     [RI] */
2490     case 0x1: /* TMLL or TML     R1,I2     [RI] */
2491     case 0x2: /* TMHH     R1,I2     [RI] */
2492     case 0x3: /* TMHL     R1,I2     [RI] */
2493         tmp = load_reg(r1);
2494         tmp2 = tcg_const_i64((uint16_t)i2);
2495         switch (op) {
2496         case 0x0:
2497             tcg_gen_shri_i64(tmp, tmp, 16);
2498             break;
2499         case 0x1:
2500             break;
2501         case 0x2:
2502             tcg_gen_shri_i64(tmp, tmp, 48);
2503             break;
2504         case 0x3:
2505             tcg_gen_shri_i64(tmp, tmp, 32);
2506             break;
2507         }
2508         tcg_gen_andi_i64(tmp, tmp, 0xffff);
2509         cmp_64(s, tmp, tmp2, CC_OP_TM_64);
2510         tcg_temp_free_i64(tmp);
2511         tcg_temp_free_i64(tmp2);
2512         break;
2513     case 0x4: /* brc m1, i2 */
2514         gen_brc(r1, s, i2 * 2LL);
2515         return;
2516     case 0x5: /* BRAS     R1,I2     [RI] */
2517         tmp = tcg_const_i64(pc_to_link_info(s, s->pc + 4));
2518         store_reg(r1, tmp);
2519         tcg_temp_free_i64(tmp);
2520         gen_goto_tb(s, 0, s->pc + i2 * 2LL);
2521         s->is_jmp = DISAS_TB_JUMP;
2522         break;
2523     case 0x6: /* BRCT     R1,I2     [RI] */
2524         tmp32_1 = load_reg32(r1);
2525         tcg_gen_subi_i32(tmp32_1, tmp32_1, 1);
2526         store_reg32(r1, tmp32_1);
2527         gen_update_cc_op(s);
2528         l1 = gen_new_label();
2529         tcg_gen_brcondi_i32(TCG_COND_EQ, tmp32_1, 0, l1);
2530         gen_goto_tb(s, 0, s->pc + (i2 * 2LL));
2531         gen_set_label(l1);
2532         gen_goto_tb(s, 1, s->pc + 4);
2533         s->is_jmp = DISAS_TB_JUMP;
2534         tcg_temp_free_i32(tmp32_1);
2535         break;
2536     case 0x7: /* BRCTG     R1,I2     [RI] */
2537         tmp = load_reg(r1);
2538         tcg_gen_subi_i64(tmp, tmp, 1);
2539         store_reg(r1, tmp);
2540         gen_update_cc_op(s);
2541         l1 = gen_new_label();
2542         tcg_gen_brcondi_i64(TCG_COND_EQ, tmp, 0, l1);
2543         gen_goto_tb(s, 0, s->pc + (i2 * 2LL));
2544         gen_set_label(l1);
2545         gen_goto_tb(s, 1, s->pc + 4);
2546         s->is_jmp = DISAS_TB_JUMP;
2547         tcg_temp_free_i64(tmp);
2548         break;
2549     case 0x8: /* lhi r1, i2 */
2550         tmp32_1 = tcg_const_i32(i2);
2551         store_reg32(r1, tmp32_1);
2552         tcg_temp_free_i32(tmp32_1);
2553         break;
2554     case 0x9: /* lghi r1, i2 */
2555         tmp = tcg_const_i64(i2);
2556         store_reg(r1, tmp);
2557         tcg_temp_free_i64(tmp);
2558         break;
2559     case 0xa: /* AHI     R1,I2     [RI] */
2560         tmp32_1 = load_reg32(r1);
2561         tmp32_2 = tcg_temp_new_i32();
2562         tmp32_3 = tcg_const_i32(i2);
2563
2564         if (i2 < 0) {
2565             tcg_gen_subi_i32(tmp32_2, tmp32_1, -i2);
2566         } else {
2567             tcg_gen_add_i32(tmp32_2, tmp32_1, tmp32_3);
2568         }
2569
2570         store_reg32(r1, tmp32_2);
2571         set_cc_add32(s, tmp32_1, tmp32_3, tmp32_2);
2572         tcg_temp_free_i32(tmp32_1);
2573         tcg_temp_free_i32(tmp32_2);
2574         tcg_temp_free_i32(tmp32_3);
2575         break;
2576     case 0xb: /* aghi r1, i2 */
2577         tmp = load_reg(r1);
2578         tmp2 = tcg_const_i64(i2);
2579
2580         if (i2 < 0) {
2581             tcg_gen_subi_i64(regs[r1], tmp, -i2);
2582         } else {
2583             tcg_gen_add_i64(regs[r1], tmp, tmp2);
2584         }
2585         set_cc_add64(s, tmp, tmp2, regs[r1]);
2586         tcg_temp_free_i64(tmp);
2587         tcg_temp_free_i64(tmp2);
2588         break;
2589     case 0xc: /* MHI     R1,I2     [RI] */
2590         tmp32_1 = load_reg32(r1);
2591         tcg_gen_muli_i32(tmp32_1, tmp32_1, i2);
2592         store_reg32(r1, tmp32_1);
2593         tcg_temp_free_i32(tmp32_1);
2594         break;
2595     case 0xd: /* MGHI     R1,I2     [RI] */
2596         tmp = load_reg(r1);
2597         tcg_gen_muli_i64(tmp, tmp, i2);
2598         store_reg(r1, tmp);
2599         tcg_temp_free_i64(tmp);
2600         break;
2601     case 0xe: /* CHI     R1,I2     [RI] */
2602         tmp32_1 = load_reg32(r1);
2603         cmp_s32c(s, tmp32_1, i2);
2604         tcg_temp_free_i32(tmp32_1);
2605         break;
2606     case 0xf: /* CGHI     R1,I2     [RI] */
2607         tmp = load_reg(r1);
2608         cmp_s64c(s, tmp, i2);
2609         tcg_temp_free_i64(tmp);
2610         break;
2611     default:
2612         LOG_DISAS("illegal a7 operation 0x%x\n", op);
2613         gen_illegal_opcode(s, 2);
2614         return;
2615     }
2616 }
2617
2618 static void disas_b2(DisasContext *s, int op, uint32_t insn)
2619 {
2620     TCGv_i64 tmp, tmp2, tmp3;
2621     TCGv_i32 tmp32_1, tmp32_2, tmp32_3;
2622     int r1, r2;
2623     int ilc = 2;
2624 #ifndef CONFIG_USER_ONLY
2625     int r3, d2, b2;
2626 #endif
2627
2628     r1 = (insn >> 4) & 0xf;
2629     r2 = insn & 0xf;
2630
2631     LOG_DISAS("disas_b2: op 0x%x r1 %d r2 %d\n", op, r1, r2);
2632
2633     switch (op) {
2634     case 0x22: /* IPM    R1               [RRE] */
2635         tmp32_1 = tcg_const_i32(r1);
2636         gen_op_calc_cc(s);
2637         gen_helper_ipm(cc_op, tmp32_1);
2638         tcg_temp_free_i32(tmp32_1);
2639         break;
2640     case 0x41: /* CKSM    R1,R2     [RRE] */
2641         tmp32_1 = tcg_const_i32(r1);
2642         tmp32_2 = tcg_const_i32(r2);
2643         potential_page_fault(s);
2644         gen_helper_cksm(tmp32_1, tmp32_2);
2645         tcg_temp_free_i32(tmp32_1);
2646         tcg_temp_free_i32(tmp32_2);
2647         gen_op_movi_cc(s, 0);
2648         break;
2649     case 0x4e: /* SAR     R1,R2     [RRE] */
2650         tmp32_1 = load_reg32(r2);
2651         tcg_gen_st_i32(tmp32_1, cpu_env, offsetof(CPUState, aregs[r1]));
2652         tcg_temp_free_i32(tmp32_1);
2653         break;
2654     case 0x4f: /* EAR     R1,R2     [RRE] */
2655         tmp32_1 = tcg_temp_new_i32();
2656         tcg_gen_ld_i32(tmp32_1, cpu_env, offsetof(CPUState, aregs[r2]));
2657         store_reg32(r1, tmp32_1);
2658         tcg_temp_free_i32(tmp32_1);
2659         break;
2660     case 0x52: /* MSR     R1,R2     [RRE] */
2661         tmp32_1 = load_reg32(r1);
2662         tmp32_2 = load_reg32(r2);
2663         tcg_gen_mul_i32(tmp32_1, tmp32_1, tmp32_2);
2664         store_reg32(r1, tmp32_1);
2665         tcg_temp_free_i32(tmp32_1);
2666         tcg_temp_free_i32(tmp32_2);
2667         break;
2668     case 0x54: /* MVPG     R1,R2     [RRE] */
2669         tmp = load_reg(0);
2670         tmp2 = load_reg(r1);
2671         tmp3 = load_reg(r2);
2672         potential_page_fault(s);
2673         gen_helper_mvpg(tmp, tmp2, tmp3);
2674         tcg_temp_free_i64(tmp);
2675         tcg_temp_free_i64(tmp2);
2676         tcg_temp_free_i64(tmp3);
2677         /* XXX check CCO bit and set CC accordingly */
2678         gen_op_movi_cc(s, 0);
2679         break;
2680     case 0x55: /* MVST     R1,R2     [RRE] */
2681         tmp32_1 = load_reg32(0);
2682         tmp32_2 = tcg_const_i32(r1);
2683         tmp32_3 = tcg_const_i32(r2);
2684         potential_page_fault(s);
2685         gen_helper_mvst(tmp32_1, tmp32_2, tmp32_3);
2686         tcg_temp_free_i32(tmp32_1);
2687         tcg_temp_free_i32(tmp32_2);
2688         tcg_temp_free_i32(tmp32_3);
2689         gen_op_movi_cc(s, 1);
2690         break;
2691     case 0x5d: /* CLST     R1,R2     [RRE] */
2692         tmp32_1 = load_reg32(0);
2693         tmp32_2 = tcg_const_i32(r1);
2694         tmp32_3 = tcg_const_i32(r2);
2695         potential_page_fault(s);
2696         gen_helper_clst(cc_op, tmp32_1, tmp32_2, tmp32_3);
2697         set_cc_static(s);
2698         tcg_temp_free_i32(tmp32_1);
2699         tcg_temp_free_i32(tmp32_2);
2700         tcg_temp_free_i32(tmp32_3);
2701         break;
2702     case 0x5e: /* SRST     R1,R2     [RRE] */
2703         tmp32_1 = load_reg32(0);
2704         tmp32_2 = tcg_const_i32(r1);
2705         tmp32_3 = tcg_const_i32(r2);
2706         potential_page_fault(s);
2707         gen_helper_srst(cc_op, tmp32_1, tmp32_2, tmp32_3);
2708         set_cc_static(s);
2709         tcg_temp_free_i32(tmp32_1);
2710         tcg_temp_free_i32(tmp32_2);
2711         tcg_temp_free_i32(tmp32_3);
2712         break;
2713
2714 #ifndef CONFIG_USER_ONLY
2715     case 0x02: /* STIDP     D2(B2)     [S] */
2716         /* Store CPU ID */
2717         check_privileged(s, ilc);
2718         decode_rs(s, insn, &r1, &r3, &b2, &d2);
2719         tmp = get_address(s, 0, b2, d2);
2720         potential_page_fault(s);
2721         gen_helper_stidp(tmp);
2722         tcg_temp_free_i64(tmp);
2723         break;
2724     case 0x04: /* SCK       D2(B2)     [S] */
2725         /* Set Clock */
2726         check_privileged(s, ilc);
2727         decode_rs(s, insn, &r1, &r3, &b2, &d2);
2728         tmp = get_address(s, 0, b2, d2);
2729         potential_page_fault(s);
2730         gen_helper_sck(cc_op, tmp);
2731         set_cc_static(s);
2732         tcg_temp_free_i64(tmp);
2733         break;
2734     case 0x05: /* STCK     D2(B2)     [S] */
2735         /* Store Clock */
2736         decode_rs(s, insn, &r1, &r3, &b2, &d2);
2737         tmp = get_address(s, 0, b2, d2);
2738         potential_page_fault(s);
2739         gen_helper_stck(cc_op, tmp);
2740         set_cc_static(s);
2741         tcg_temp_free_i64(tmp);
2742         break;
2743     case 0x06: /* SCKC     D2(B2)     [S] */
2744         /* Set Clock Comparator */
2745         check_privileged(s, ilc);
2746         decode_rs(s, insn, &r1, &r3, &b2, &d2);
2747         tmp = get_address(s, 0, b2, d2);
2748         potential_page_fault(s);
2749         gen_helper_sckc(tmp);
2750         tcg_temp_free_i64(tmp);
2751         break;
2752     case 0x07: /* STCKC    D2(B2)     [S] */
2753         /* Store Clock Comparator */
2754         check_privileged(s, ilc);
2755         decode_rs(s, insn, &r1, &r3, &b2, &d2);
2756         tmp = get_address(s, 0, b2, d2);
2757         potential_page_fault(s);
2758         gen_helper_stckc(tmp);
2759         tcg_temp_free_i64(tmp);
2760         break;
2761     case 0x08: /* SPT      D2(B2)     [S] */
2762         /* Set CPU Timer */
2763         check_privileged(s, ilc);
2764         decode_rs(s, insn, &r1, &r3, &b2, &d2);
2765         tmp = get_address(s, 0, b2, d2);
2766         potential_page_fault(s);
2767         gen_helper_spt(tmp);
2768         tcg_temp_free_i64(tmp);
2769         break;
2770     case 0x09: /* STPT     D2(B2)     [S] */
2771         /* Store CPU Timer */
2772         check_privileged(s, ilc);
2773         decode_rs(s, insn, &r1, &r3, &b2, &d2);
2774         tmp = get_address(s, 0, b2, d2);
2775         potential_page_fault(s);
2776         gen_helper_stpt(tmp);
2777         tcg_temp_free_i64(tmp);
2778         break;
2779     case 0x0a: /* SPKA     D2(B2)     [S] */
2780         /* Set PSW Key from Address */
2781         check_privileged(s, ilc);
2782         decode_rs(s, insn, &r1, &r3, &b2, &d2);
2783         tmp = get_address(s, 0, b2, d2);
2784         tmp2 = tcg_temp_new_i64();
2785         tcg_gen_andi_i64(tmp2, psw_mask, ~PSW_MASK_KEY);
2786         tcg_gen_shli_i64(tmp, tmp, PSW_SHIFT_KEY - 4);
2787         tcg_gen_or_i64(psw_mask, tmp2, tmp);
2788         tcg_temp_free_i64(tmp2);
2789         tcg_temp_free_i64(tmp);
2790         break;
2791     case 0x0d: /* PTLB                [S] */
2792         /* Purge TLB */
2793         check_privileged(s, ilc);
2794         gen_helper_ptlb();
2795         break;
2796     case 0x10: /* SPX      D2(B2)     [S] */
2797         /* Set Prefix Register */
2798         check_privileged(s, ilc);
2799         decode_rs(s, insn, &r1, &r3, &b2, &d2);
2800         tmp = get_address(s, 0, b2, d2);
2801         potential_page_fault(s);
2802         gen_helper_spx(tmp);
2803         tcg_temp_free_i64(tmp);
2804         break;
2805     case 0x11: /* STPX     D2(B2)     [S] */
2806         /* Store Prefix */
2807         check_privileged(s, ilc);
2808         decode_rs(s, insn, &r1, &r3, &b2, &d2);
2809         tmp = get_address(s, 0, b2, d2);
2810         tmp2 = tcg_temp_new_i64();
2811         tcg_gen_ld_i64(tmp2, cpu_env, offsetof(CPUState, psa));
2812         tcg_gen_qemu_st32(tmp2, tmp, get_mem_index(s));
2813         tcg_temp_free_i64(tmp);
2814         tcg_temp_free_i64(tmp2);
2815         break;
2816     case 0x12: /* STAP     D2(B2)     [S] */
2817         /* Store CPU Address */
2818         check_privileged(s, ilc);
2819         decode_rs(s, insn, &r1, &r3, &b2, &d2);
2820         tmp = get_address(s, 0, b2, d2);
2821         tmp2 = tcg_temp_new_i64();
2822         tmp32_1 = tcg_temp_new_i32();
2823         tcg_gen_ld_i32(tmp32_1, cpu_env, offsetof(CPUState, cpu_num));
2824         tcg_gen_extu_i32_i64(tmp2, tmp32_1);
2825         tcg_gen_qemu_st32(tmp2, tmp, get_mem_index(s));
2826         tcg_temp_free_i64(tmp);
2827         tcg_temp_free_i64(tmp2);
2828         tcg_temp_free_i32(tmp32_1);
2829         break;
2830     case 0x21: /* IPTE     R1,R2      [RRE] */
2831         /* Invalidate PTE */
2832         check_privileged(s, ilc);
2833         r1 = (insn >> 4) & 0xf;
2834         r2 = insn & 0xf;
2835         tmp = load_reg(r1);
2836         tmp2 = load_reg(r2);
2837         gen_helper_ipte(tmp, tmp2);
2838         tcg_temp_free_i64(tmp);
2839         tcg_temp_free_i64(tmp2);
2840         break;
2841     case 0x29: /* ISKE     R1,R2      [RRE] */
2842         /* Insert Storage Key Extended */
2843         check_privileged(s, ilc);
2844         r1 = (insn >> 4) & 0xf;
2845         r2 = insn & 0xf;
2846         tmp = load_reg(r2);
2847         tmp2 = tcg_temp_new_i64();
2848         gen_helper_iske(tmp2, tmp);
2849         store_reg(r1, tmp2);
2850         tcg_temp_free_i64(tmp);
2851         tcg_temp_free_i64(tmp2);
2852         break;
2853     case 0x2a: /* RRBE     R1,R2      [RRE] */
2854         /* Set Storage Key Extended */
2855         check_privileged(s, ilc);
2856         r1 = (insn >> 4) & 0xf;
2857         r2 = insn & 0xf;
2858         tmp32_1 = load_reg32(r1);
2859         tmp = load_reg(r2);
2860         gen_helper_rrbe(cc_op, tmp32_1, tmp);
2861         set_cc_static(s);
2862         tcg_temp_free_i32(tmp32_1);
2863         tcg_temp_free_i64(tmp);
2864         break;
2865     case 0x2b: /* SSKE     R1,R2      [RRE] */
2866         /* Set Storage Key Extended */
2867         check_privileged(s, ilc);
2868         r1 = (insn >> 4) & 0xf;
2869         r2 = insn & 0xf;
2870         tmp32_1 = load_reg32(r1);
2871         tmp = load_reg(r2);
2872         gen_helper_sske(tmp32_1, tmp);
2873         tcg_temp_free_i32(tmp32_1);
2874         tcg_temp_free_i64(tmp);
2875         break;
2876     case 0x34: /* STCH ? */
2877         /* Store Subchannel */
2878         check_privileged(s, ilc);
2879         gen_op_movi_cc(s, 3);
2880         break;
2881     case 0x46: /* STURA    R1,R2      [RRE] */
2882         /* Store Using Real Address */
2883         check_privileged(s, ilc);
2884         r1 = (insn >> 4) & 0xf;
2885         r2 = insn & 0xf;
2886         tmp32_1 = load_reg32(r1);
2887         tmp = load_reg(r2);
2888         potential_page_fault(s);
2889         gen_helper_stura(tmp, tmp32_1);
2890         tcg_temp_free_i32(tmp32_1);
2891         tcg_temp_free_i64(tmp);
2892         break;
2893     case 0x50: /* CSP      R1,R2      [RRE] */
2894         /* Compare And Swap And Purge */
2895         check_privileged(s, ilc);
2896         r1 = (insn >> 4) & 0xf;
2897         r2 = insn & 0xf;
2898         tmp32_1 = tcg_const_i32(r1);
2899         tmp32_2 = tcg_const_i32(r2);
2900         gen_helper_csp(cc_op, tmp32_1, tmp32_2);
2901         set_cc_static(s);
2902         tcg_temp_free_i32(tmp32_1);
2903         tcg_temp_free_i32(tmp32_2);
2904         break;
2905     case 0x5f: /* CHSC ? */
2906         /* Channel Subsystem Call */
2907         check_privileged(s, ilc);
2908         gen_op_movi_cc(s, 3);
2909         break;
2910     case 0x78: /* STCKE    D2(B2)     [S] */
2911         /* Store Clock Extended */
2912         decode_rs(s, insn, &r1, &r3, &b2, &d2);
2913         tmp = get_address(s, 0, b2, d2);
2914         potential_page_fault(s);
2915         gen_helper_stcke(cc_op, tmp);
2916         set_cc_static(s);
2917         tcg_temp_free_i64(tmp);
2918         break;
2919     case 0x79: /* SACF    D2(B2)     [S] */
2920         /* Store Clock Extended */
2921         check_privileged(s, ilc);
2922         decode_rs(s, insn, &r1, &r3, &b2, &d2);
2923         tmp = get_address(s, 0, b2, d2);
2924         potential_page_fault(s);
2925         gen_helper_sacf(tmp);
2926         tcg_temp_free_i64(tmp);
2927         /* addressing mode has changed, so end the block */
2928         s->pc += ilc * 2;
2929         update_psw_addr(s);
2930         s->is_jmp = DISAS_EXCP;
2931         break;
2932     case 0x7d: /* STSI     D2,(B2)     [S] */
2933         check_privileged(s, ilc);
2934         decode_rs(s, insn, &r1, &r3, &b2, &d2);
2935         tmp = get_address(s, 0, b2, d2);
2936         tmp32_1 = load_reg32(0);
2937         tmp32_2 = load_reg32(1);
2938         potential_page_fault(s);
2939         gen_helper_stsi(cc_op, tmp, tmp32_1, tmp32_2);
2940         set_cc_static(s);
2941         tcg_temp_free_i64(tmp);
2942         tcg_temp_free_i32(tmp32_1);
2943         tcg_temp_free_i32(tmp32_2);
2944         break;
2945     case 0x9d: /* LFPC      D2(B2)   [S] */
2946         decode_rs(s, insn, &r1, &r3, &b2, &d2);
2947         tmp = get_address(s, 0, b2, d2);
2948         tmp2 = tcg_temp_new_i64();
2949         tmp32_1 = tcg_temp_new_i32();
2950         tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s));
2951         tcg_gen_trunc_i64_i32(tmp32_1, tmp2);
2952         tcg_gen_st_i32(tmp32_1, cpu_env, offsetof(CPUState, fpc));
2953         tcg_temp_free_i64(tmp);
2954         tcg_temp_free_i64(tmp2);
2955         tcg_temp_free_i32(tmp32_1);
2956         break;
2957     case 0xb1: /* STFL     D2(B2)     [S] */
2958         /* Store Facility List (CPU features) at 200 */
2959         check_privileged(s, ilc);
2960         tmp2 = tcg_const_i64(0xc0000000);
2961         tmp = tcg_const_i64(200);
2962         tcg_gen_qemu_st32(tmp2, tmp, get_mem_index(s));
2963         tcg_temp_free_i64(tmp2);
2964         tcg_temp_free_i64(tmp);
2965         break;
2966     case 0xb2: /* LPSWE    D2(B2)     [S] */
2967         /* Load PSW Extended */
2968         check_privileged(s, ilc);
2969         decode_rs(s, insn, &r1, &r3, &b2, &d2);
2970         tmp = get_address(s, 0, b2, d2);
2971         tmp2 = tcg_temp_new_i64();
2972         tmp3 = tcg_temp_new_i64();
2973         tcg_gen_qemu_ld64(tmp2, tmp, get_mem_index(s));
2974         tcg_gen_addi_i64(tmp, tmp, 8);
2975         tcg_gen_qemu_ld64(tmp3, tmp, get_mem_index(s));
2976         gen_helper_load_psw(tmp2, tmp3);
2977         /* we need to keep cc_op intact */
2978         s->is_jmp = DISAS_JUMP;
2979         tcg_temp_free_i64(tmp);
2980         tcg_temp_free_i64(tmp2);
2981         tcg_temp_free_i64(tmp3);
2982         break;
2983     case 0x20: /* SERVC     R1,R2     [RRE] */
2984         /* SCLP Service call (PV hypercall) */
2985         check_privileged(s, ilc);
2986         potential_page_fault(s);
2987         tmp32_1 = load_reg32(r2);
2988         tmp = load_reg(r1);
2989         gen_helper_servc(cc_op, tmp32_1, tmp);
2990         set_cc_static(s);
2991         tcg_temp_free_i32(tmp32_1);
2992         tcg_temp_free_i64(tmp);
2993         break;
2994 #endif
2995     default:
2996         LOG_DISAS("illegal b2 operation 0x%x\n", op);
2997         gen_illegal_opcode(s, ilc);
2998         break;
2999     }
3000 }
3001
3002 static void disas_b3(DisasContext *s, int op, int m3, int r1, int r2)
3003 {
3004     TCGv_i64 tmp;
3005     TCGv_i32 tmp32_1, tmp32_2, tmp32_3;
3006     LOG_DISAS("disas_b3: op 0x%x m3 0x%x r1 %d r2 %d\n", op, m3, r1, r2);
3007 #define FP_HELPER(i) \
3008     tmp32_1 = tcg_const_i32(r1); \
3009     tmp32_2 = tcg_const_i32(r2); \
3010     gen_helper_ ## i (tmp32_1, tmp32_2); \
3011     tcg_temp_free_i32(tmp32_1); \
3012     tcg_temp_free_i32(tmp32_2);
3013
3014 #define FP_HELPER_CC(i) \
3015     tmp32_1 = tcg_const_i32(r1); \
3016     tmp32_2 = tcg_const_i32(r2); \
3017     gen_helper_ ## i (cc_op, tmp32_1, tmp32_2); \
3018     set_cc_static(s); \
3019     tcg_temp_free_i32(tmp32_1); \
3020     tcg_temp_free_i32(tmp32_2);
3021
3022     switch (op) {
3023     case 0x0: /* LPEBR       R1,R2             [RRE] */
3024         FP_HELPER_CC(lpebr);
3025         break;
3026     case 0x2: /* LTEBR       R1,R2             [RRE] */
3027         FP_HELPER_CC(ltebr);
3028         break;
3029     case 0x3: /* LCEBR       R1,R2             [RRE] */
3030         FP_HELPER_CC(lcebr);
3031         break;
3032     case 0x4: /* LDEBR       R1,R2             [RRE] */
3033         FP_HELPER(ldebr);
3034         break;
3035     case 0x5: /* LXDBR       R1,R2             [RRE] */
3036         FP_HELPER(lxdbr);
3037         break;
3038     case 0x9: /* CEBR        R1,R2             [RRE] */
3039         FP_HELPER_CC(cebr);
3040         break;
3041     case 0xa: /* AEBR        R1,R2             [RRE] */
3042         FP_HELPER_CC(aebr);
3043         break;
3044     case 0xb: /* SEBR        R1,R2             [RRE] */
3045         FP_HELPER_CC(sebr);
3046         break;
3047     case 0xd: /* DEBR        R1,R2             [RRE] */
3048         FP_HELPER(debr);
3049         break;
3050     case 0x10: /* LPDBR       R1,R2             [RRE] */
3051         FP_HELPER_CC(lpdbr);
3052         break;
3053     case 0x12: /* LTDBR       R1,R2             [RRE] */
3054         FP_HELPER_CC(ltdbr);
3055         break;
3056     case 0x13: /* LCDBR       R1,R2             [RRE] */
3057         FP_HELPER_CC(lcdbr);
3058         break;
3059     case 0x15: /* SQBDR       R1,R2             [RRE] */
3060         FP_HELPER(sqdbr);
3061         break;
3062     case 0x17: /* MEEBR       R1,R2             [RRE] */
3063         FP_HELPER(meebr);
3064         break;
3065     case 0x19: /* CDBR        R1,R2             [RRE] */
3066         FP_HELPER_CC(cdbr);
3067         break;
3068     case 0x1a: /* ADBR        R1,R2             [RRE] */
3069         FP_HELPER_CC(adbr);
3070         break;
3071     case 0x1b: /* SDBR        R1,R2             [RRE] */
3072         FP_HELPER_CC(sdbr);
3073         break;
3074     case 0x1c: /* MDBR        R1,R2             [RRE] */
3075         FP_HELPER(mdbr);
3076         break;
3077     case 0x1d: /* DDBR        R1,R2             [RRE] */
3078         FP_HELPER(ddbr);
3079         break;
3080     case 0xe: /* MAEBR  R1,R3,R2 [RRF] */
3081     case 0x1e: /* MADBR R1,R3,R2 [RRF] */
3082     case 0x1f: /* MSDBR R1,R3,R2 [RRF] */
3083         /* for RRF insns, m3 is R1, r1 is R3, and r2 is R2 */
3084         tmp32_1 = tcg_const_i32(m3);
3085         tmp32_2 = tcg_const_i32(r2);
3086         tmp32_3 = tcg_const_i32(r1);
3087         switch (op) {
3088         case 0xe:
3089             gen_helper_maebr(tmp32_1, tmp32_3, tmp32_2);
3090             break;
3091         case 0x1e:
3092             gen_helper_madbr(tmp32_1, tmp32_3, tmp32_2);
3093             break;
3094         case 0x1f:
3095             gen_helper_msdbr(tmp32_1, tmp32_3, tmp32_2);
3096             break;
3097         default:
3098             tcg_abort();
3099         }
3100         tcg_temp_free_i32(tmp32_1);
3101         tcg_temp_free_i32(tmp32_2);
3102         tcg_temp_free_i32(tmp32_3);
3103         break;
3104     case 0x40: /* LPXBR       R1,R2             [RRE] */
3105         FP_HELPER_CC(lpxbr);
3106         break;
3107     case 0x42: /* LTXBR       R1,R2             [RRE] */
3108         FP_HELPER_CC(ltxbr);
3109         break;
3110     case 0x43: /* LCXBR       R1,R2             [RRE] */
3111         FP_HELPER_CC(lcxbr);
3112         break;
3113     case 0x44: /* LEDBR       R1,R2             [RRE] */
3114         FP_HELPER(ledbr);
3115         break;
3116     case 0x45: /* LDXBR       R1,R2             [RRE] */
3117         FP_HELPER(ldxbr);
3118         break;
3119     case 0x46: /* LEXBR       R1,R2             [RRE] */
3120         FP_HELPER(lexbr);
3121         break;
3122     case 0x49: /* CXBR        R1,R2             [RRE] */
3123         FP_HELPER_CC(cxbr);
3124         break;
3125     case 0x4a: /* AXBR        R1,R2             [RRE] */
3126         FP_HELPER_CC(axbr);
3127         break;
3128     case 0x4b: /* SXBR        R1,R2             [RRE] */
3129         FP_HELPER_CC(sxbr);
3130         break;
3131     case 0x4c: /* MXBR        R1,R2             [RRE] */
3132         FP_HELPER(mxbr);
3133         break;
3134     case 0x4d: /* DXBR        R1,R2             [RRE] */
3135         FP_HELPER(dxbr);
3136         break;
3137     case 0x65: /* LXR         R1,R2             [RRE] */
3138         tmp = load_freg(r2);
3139         store_freg(r1, tmp);
3140         tcg_temp_free_i64(tmp);
3141         tmp = load_freg(r2 + 2);
3142         store_freg(r1 + 2, tmp);
3143         tcg_temp_free_i64(tmp);
3144         break;
3145     case 0x74: /* LZER        R1                [RRE] */
3146         tmp32_1 = tcg_const_i32(r1);
3147         gen_helper_lzer(tmp32_1);
3148         tcg_temp_free_i32(tmp32_1);
3149         break;
3150     case 0x75: /* LZDR        R1                [RRE] */
3151         tmp32_1 = tcg_const_i32(r1);
3152         gen_helper_lzdr(tmp32_1);
3153         tcg_temp_free_i32(tmp32_1);
3154         break;
3155     case 0x76: /* LZXR        R1                [RRE] */
3156         tmp32_1 = tcg_const_i32(r1);
3157         gen_helper_lzxr(tmp32_1);
3158         tcg_temp_free_i32(tmp32_1);
3159         break;
3160     case 0x84: /* SFPC        R1                [RRE] */
3161         tmp32_1 = load_reg32(r1);
3162         tcg_gen_st_i32(tmp32_1, cpu_env, offsetof(CPUState, fpc));
3163         tcg_temp_free_i32(tmp32_1);
3164         break;
3165     case 0x8c: /* EFPC        R1                [RRE] */
3166         tmp32_1 = tcg_temp_new_i32();
3167         tcg_gen_ld_i32(tmp32_1, cpu_env, offsetof(CPUState, fpc));
3168         store_reg32(r1, tmp32_1);
3169         tcg_temp_free_i32(tmp32_1);
3170         break;
3171     case 0x94: /* CEFBR       R1,R2             [RRE] */
3172     case 0x95: /* CDFBR       R1,R2             [RRE] */
3173     case 0x96: /* CXFBR       R1,R2             [RRE] */
3174         tmp32_1 = tcg_const_i32(r1);
3175         tmp32_2 = load_reg32(r2);
3176         switch (op) {
3177         case 0x94:
3178             gen_helper_cefbr(tmp32_1, tmp32_2);
3179             break;
3180         case 0x95:
3181             gen_helper_cdfbr(tmp32_1, tmp32_2);
3182             break;
3183         case 0x96:
3184             gen_helper_cxfbr(tmp32_1, tmp32_2);
3185             break;
3186         default:
3187             tcg_abort();
3188         }
3189         tcg_temp_free_i32(tmp32_1);
3190         tcg_temp_free_i32(tmp32_2);
3191         break;
3192     case 0x98: /* CFEBR       R1,R2             [RRE] */
3193     case 0x99: /* CFDBR              R1,R2             [RRE] */
3194     case 0x9a: /* CFXBR       R1,R2             [RRE] */
3195         tmp32_1 = tcg_const_i32(r1);
3196         tmp32_2 = tcg_const_i32(r2);
3197         tmp32_3 = tcg_const_i32(m3);
3198         switch (op) {
3199         case 0x98:
3200             gen_helper_cfebr(cc_op, tmp32_1, tmp32_2, tmp32_3);
3201             break;
3202         case 0x99:
3203             gen_helper_cfdbr(cc_op, tmp32_1, tmp32_2, tmp32_3);
3204             break;
3205         case 0x9a:
3206             gen_helper_cfxbr(cc_op, tmp32_1, tmp32_2, tmp32_3);
3207             break;
3208         default:
3209             tcg_abort();
3210         }
3211         set_cc_static(s);
3212         tcg_temp_free_i32(tmp32_1);
3213         tcg_temp_free_i32(tmp32_2);
3214         tcg_temp_free_i32(tmp32_3);
3215         break;
3216     case 0xa4: /* CEGBR       R1,R2             [RRE] */
3217     case 0xa5: /* CDGBR       R1,R2             [RRE] */
3218         tmp32_1 = tcg_const_i32(r1);
3219         tmp = load_reg(r2);
3220         switch (op) {
3221         case 0xa4:
3222             gen_helper_cegbr(tmp32_1, tmp);
3223             break;
3224         case 0xa5:
3225             gen_helper_cdgbr(tmp32_1, tmp);
3226             break;
3227         default:
3228             tcg_abort();
3229         }
3230         tcg_temp_free_i32(tmp32_1);
3231         tcg_temp_free_i64(tmp);
3232         break;
3233     case 0xa6: /* CXGBR       R1,R2             [RRE] */
3234         tmp32_1 = tcg_const_i32(r1);
3235         tmp = load_reg(r2);
3236         gen_helper_cxgbr(tmp32_1, tmp);
3237         tcg_temp_free_i32(tmp32_1);
3238         tcg_temp_free_i64(tmp);
3239         break;
3240     case 0xa8: /* CGEBR       R1,R2             [RRE] */
3241         tmp32_1 = tcg_const_i32(r1);
3242         tmp32_2 = tcg_const_i32(r2);
3243         tmp32_3 = tcg_const_i32(m3);
3244         gen_helper_cgebr(cc_op, tmp32_1, tmp32_2, tmp32_3);
3245         set_cc_static(s);
3246         tcg_temp_free_i32(tmp32_1);
3247         tcg_temp_free_i32(tmp32_2);
3248         tcg_temp_free_i32(tmp32_3);
3249         break;
3250     case 0xa9: /* CGDBR       R1,R2             [RRE] */
3251         tmp32_1 = tcg_const_i32(r1);
3252         tmp32_2 = tcg_const_i32(r2);
3253         tmp32_3 = tcg_const_i32(m3);
3254         gen_helper_cgdbr(cc_op, tmp32_1, tmp32_2, tmp32_3);
3255         set_cc_static(s);
3256         tcg_temp_free_i32(tmp32_1);
3257         tcg_temp_free_i32(tmp32_2);
3258         tcg_temp_free_i32(tmp32_3);
3259         break;
3260     case 0xaa: /* CGXBR       R1,R2             [RRE] */
3261         tmp32_1 = tcg_const_i32(r1);
3262         tmp32_2 = tcg_const_i32(r2);
3263         tmp32_3 = tcg_const_i32(m3);
3264         gen_helper_cgxbr(cc_op, tmp32_1, tmp32_2, tmp32_3);
3265         set_cc_static(s);
3266         tcg_temp_free_i32(tmp32_1);
3267         tcg_temp_free_i32(tmp32_2);
3268         tcg_temp_free_i32(tmp32_3);
3269         break;
3270     default:
3271         LOG_DISAS("illegal b3 operation 0x%x\n", op);
3272         gen_illegal_opcode(s, 2);
3273         break;
3274     }
3275
3276 #undef FP_HELPER_CC
3277 #undef FP_HELPER
3278 }
3279
3280 static void disas_b9(DisasContext *s, int op, int r1, int r2)
3281 {
3282     TCGv_i64 tmp, tmp2, tmp3;
3283     TCGv_i32 tmp32_1, tmp32_2, tmp32_3;
3284
3285     LOG_DISAS("disas_b9: op 0x%x r1 %d r2 %d\n", op, r1, r2);
3286     switch (op) {
3287     case 0x0: /* LPGR     R1,R2     [RRE] */
3288     case 0x1: /* LNGR     R1,R2     [RRE] */
3289     case 0x2: /* LTGR R1,R2 [RRE] */
3290     case 0x3: /* LCGR     R1,R2     [RRE] */
3291     case 0x10: /* LPGFR R1,R2 [RRE] */
3292     case 0x11: /* LNFGR     R1,R2     [RRE] */
3293     case 0x12: /* LTGFR R1,R2 [RRE] */
3294     case 0x13: /* LCGFR    R1,R2     [RRE] */
3295         if (op & 0x10) {
3296             tmp = load_reg32_i64(r2);
3297         } else {
3298             tmp = load_reg(r2);
3299         }
3300         switch (op & 0xf) {
3301         case 0x0: /* LP?GR */
3302             set_cc_abs64(s, tmp);
3303             gen_helper_abs_i64(tmp, tmp);
3304             store_reg(r1, tmp);
3305             break;
3306         case 0x1: /* LN?GR */
3307             set_cc_nabs64(s, tmp);
3308             gen_helper_nabs_i64(tmp, tmp);
3309             store_reg(r1, tmp);
3310             break;
3311         case 0x2: /* LT?GR */
3312             if (r1 != r2) {
3313                 store_reg(r1, tmp);
3314             }
3315             set_cc_s64(s, tmp);
3316             break;
3317         case 0x3: /* LC?GR */
3318             tcg_gen_neg_i64(regs[r1], tmp);
3319             set_cc_comp64(s, regs[r1]);
3320             break;
3321         }
3322         tcg_temp_free_i64(tmp);
3323         break;
3324     case 0x4: /* LGR R1,R2 [RRE] */
3325         store_reg(r1, regs[r2]);
3326         break;
3327     case 0x6: /* LGBR R1,R2 [RRE] */
3328         tmp2 = load_reg(r2);
3329         tcg_gen_ext8s_i64(tmp2, tmp2);
3330         store_reg(r1, tmp2);
3331         tcg_temp_free_i64(tmp2);
3332         break;
3333     case 0x8: /* AGR     R1,R2     [RRE] */
3334     case 0xa: /* ALGR     R1,R2     [RRE] */
3335         tmp = load_reg(r1);
3336         tmp2 = load_reg(r2);
3337         tmp3 = tcg_temp_new_i64();
3338         tcg_gen_add_i64(tmp3, tmp, tmp2);
3339         store_reg(r1, tmp3);
3340         switch (op) {
3341         case 0x8:
3342             set_cc_add64(s, tmp, tmp2, tmp3);
3343             break;
3344         case 0xa:
3345             set_cc_addu64(s, tmp, tmp2, tmp3);
3346             break;
3347         default:
3348             tcg_abort();
3349         }
3350         tcg_temp_free_i64(tmp);
3351         tcg_temp_free_i64(tmp2);
3352         tcg_temp_free_i64(tmp3);
3353         break;
3354     case 0x9: /* SGR     R1,R2     [RRE] */
3355     case 0xb: /* SLGR     R1,R2     [RRE] */
3356     case 0x1b: /* SLGFR     R1,R2     [RRE] */
3357     case 0x19: /* SGFR     R1,R2     [RRE] */
3358         tmp = load_reg(r1);
3359         switch (op) {
3360         case 0x1b:
3361             tmp32_1 = load_reg32(r2);
3362             tmp2 = tcg_temp_new_i64();
3363             tcg_gen_extu_i32_i64(tmp2, tmp32_1);
3364             tcg_temp_free_i32(tmp32_1);
3365             break;
3366         case 0x19:
3367             tmp32_1 = load_reg32(r2);
3368             tmp2 = tcg_temp_new_i64();
3369             tcg_gen_ext_i32_i64(tmp2, tmp32_1);
3370             tcg_temp_free_i32(tmp32_1);
3371             break;
3372         default:
3373             tmp2 = load_reg(r2);
3374             break;
3375         }
3376         tmp3 = tcg_temp_new_i64();
3377         tcg_gen_sub_i64(tmp3, tmp, tmp2);
3378         store_reg(r1, tmp3);
3379         switch (op) {
3380         case 0x9:
3381         case 0x19:
3382             set_cc_sub64(s, tmp, tmp2, tmp3);
3383             break;
3384         case 0xb:
3385         case 0x1b:
3386             set_cc_subu64(s, tmp, tmp2, tmp3);
3387             break;
3388         default:
3389             tcg_abort();
3390         }
3391         tcg_temp_free_i64(tmp);
3392         tcg_temp_free_i64(tmp2);
3393         tcg_temp_free_i64(tmp3);
3394         break;
3395     case 0xc: /* MSGR      R1,R2     [RRE] */
3396     case 0x1c: /* MSGFR      R1,R2     [RRE] */
3397         tmp = load_reg(r1);
3398         tmp2 = load_reg(r2);
3399         if (op == 0x1c) {
3400             tcg_gen_ext32s_i64(tmp2, tmp2);
3401         }
3402         tcg_gen_mul_i64(tmp, tmp, tmp2);
3403         store_reg(r1, tmp);
3404         tcg_temp_free_i64(tmp);
3405         tcg_temp_free_i64(tmp2);
3406         break;
3407     case 0xd: /* DSGR      R1,R2     [RRE] */
3408     case 0x1d: /* DSGFR      R1,R2     [RRE] */
3409         tmp = load_reg(r1 + 1);
3410         if (op == 0xd) {
3411             tmp2 = load_reg(r2);
3412         } else {
3413             tmp32_1 = load_reg32(r2);
3414             tmp2 = tcg_temp_new_i64();
3415             tcg_gen_ext_i32_i64(tmp2, tmp32_1);
3416             tcg_temp_free_i32(tmp32_1);
3417         }
3418         tmp3 = tcg_temp_new_i64();
3419         tcg_gen_div_i64(tmp3, tmp, tmp2);
3420         store_reg(r1 + 1, tmp3);
3421         tcg_gen_rem_i64(tmp3, tmp, tmp2);
3422         store_reg(r1, tmp3);
3423         tcg_temp_free_i64(tmp);
3424         tcg_temp_free_i64(tmp2);
3425         tcg_temp_free_i64(tmp3);
3426         break;
3427     case 0x14: /* LGFR     R1,R2     [RRE] */
3428         tmp32_1 = load_reg32(r2);
3429         tmp = tcg_temp_new_i64();
3430         tcg_gen_ext_i32_i64(tmp, tmp32_1);
3431         store_reg(r1, tmp);
3432         tcg_temp_free_i32(tmp32_1);
3433         tcg_temp_free_i64(tmp);
3434         break;
3435     case 0x16: /* LLGFR      R1,R2     [RRE] */
3436         tmp32_1 = load_reg32(r2);
3437         tmp = tcg_temp_new_i64();
3438         tcg_gen_extu_i32_i64(tmp, tmp32_1);
3439         store_reg(r1, tmp);
3440         tcg_temp_free_i32(tmp32_1);
3441         tcg_temp_free_i64(tmp);
3442         break;
3443     case 0x17: /* LLGTR      R1,R2     [RRE] */
3444         tmp32_1 = load_reg32(r2);
3445         tmp = tcg_temp_new_i64();
3446         tcg_gen_andi_i32(tmp32_1, tmp32_1, 0x7fffffffUL);
3447         tcg_gen_extu_i32_i64(tmp, tmp32_1);
3448         store_reg(r1, tmp);
3449         tcg_temp_free_i32(tmp32_1);
3450         tcg_temp_free_i64(tmp);
3451         break;
3452     case 0x18: /* AGFR     R1,R2     [RRE] */
3453     case 0x1a: /* ALGFR     R1,R2     [RRE] */
3454         tmp32_1 = load_reg32(r2);
3455         tmp2 = tcg_temp_new_i64();
3456         if (op == 0x18) {
3457             tcg_gen_ext_i32_i64(tmp2, tmp32_1);
3458         } else {
3459             tcg_gen_extu_i32_i64(tmp2, tmp32_1);
3460         }
3461         tcg_temp_free_i32(tmp32_1);
3462         tmp = load_reg(r1);
3463         tmp3 = tcg_temp_new_i64();
3464         tcg_gen_add_i64(tmp3, tmp, tmp2);
3465         store_reg(r1, tmp3);
3466         if (op == 0x18) {
3467             set_cc_add64(s, tmp, tmp2, tmp3);
3468         } else {
3469             set_cc_addu64(s, tmp, tmp2, tmp3);
3470         }
3471         tcg_temp_free_i64(tmp);
3472         tcg_temp_free_i64(tmp2);
3473         tcg_temp_free_i64(tmp3);
3474         break;
3475     case 0x0f: /* LRVGR    R1,R2     [RRE] */
3476         tcg_gen_bswap64_i64(regs[r1], regs[r2]);
3477         break;
3478     case 0x1f: /* LRVR     R1,R2     [RRE] */
3479         tmp32_1 = load_reg32(r2);
3480         tcg_gen_bswap32_i32(tmp32_1, tmp32_1);
3481         store_reg32(r1, tmp32_1);
3482         tcg_temp_free_i32(tmp32_1);
3483         break;
3484     case 0x20: /* CGR      R1,R2     [RRE] */
3485     case 0x30: /* CGFR     R1,R2     [RRE] */
3486         tmp2 = load_reg(r2);
3487         if (op == 0x30) {
3488             tcg_gen_ext32s_i64(tmp2, tmp2);
3489         }
3490         tmp = load_reg(r1);
3491         cmp_s64(s, tmp, tmp2);
3492         tcg_temp_free_i64(tmp);
3493         tcg_temp_free_i64(tmp2);
3494         break;
3495     case 0x21: /* CLGR     R1,R2     [RRE] */
3496     case 0x31: /* CLGFR    R1,R2     [RRE] */
3497         tmp2 = load_reg(r2);
3498         if (op == 0x31) {
3499             tcg_gen_ext32u_i64(tmp2, tmp2);
3500         }
3501         tmp = load_reg(r1);
3502         cmp_u64(s, tmp, tmp2);
3503         tcg_temp_free_i64(tmp);
3504         tcg_temp_free_i64(tmp2);
3505         break;
3506     case 0x26: /* LBR R1,R2 [RRE] */
3507         tmp32_1 = load_reg32(r2);
3508         tcg_gen_ext8s_i32(tmp32_1, tmp32_1);
3509         store_reg32(r1, tmp32_1);
3510         tcg_temp_free_i32(tmp32_1);
3511         break;
3512     case 0x27: /* LHR R1,R2 [RRE] */
3513         tmp32_1 = load_reg32(r2);
3514         tcg_gen_ext16s_i32(tmp32_1, tmp32_1);
3515         store_reg32(r1, tmp32_1);
3516         tcg_temp_free_i32(tmp32_1);
3517         break;
3518     case 0x80: /* NGR R1,R2 [RRE] */
3519     case 0x81: /* OGR R1,R2 [RRE] */
3520     case 0x82: /* XGR R1,R2 [RRE] */
3521         tmp = load_reg(r1);
3522         tmp2 = load_reg(r2);
3523         switch (op) {
3524         case 0x80:
3525             tcg_gen_and_i64(tmp, tmp, tmp2);
3526             break;
3527         case 0x81:
3528             tcg_gen_or_i64(tmp, tmp, tmp2);
3529             break;
3530         case 0x82:
3531             tcg_gen_xor_i64(tmp, tmp, tmp2);
3532             break;
3533         default:
3534             tcg_abort();
3535         }
3536         store_reg(r1, tmp);
3537         set_cc_nz_u64(s, tmp);
3538         tcg_temp_free_i64(tmp);
3539         tcg_temp_free_i64(tmp2);
3540         break;
3541     case 0x83: /* FLOGR R1,R2 [RRE] */
3542         tmp = load_reg(r2);
3543         tmp32_1 = tcg_const_i32(r1);
3544         gen_helper_flogr(cc_op, tmp32_1, tmp);
3545         set_cc_static(s);
3546         tcg_temp_free_i64(tmp);
3547         tcg_temp_free_i32(tmp32_1);
3548         break;
3549     case 0x84: /* LLGCR R1,R2 [RRE] */
3550         tmp = load_reg(r2);
3551         tcg_gen_andi_i64(tmp, tmp, 0xff);
3552         store_reg(r1, tmp);
3553         tcg_temp_free_i64(tmp);
3554         break;
3555     case 0x85: /* LLGHR R1,R2 [RRE] */
3556         tmp = load_reg(r2);
3557         tcg_gen_andi_i64(tmp, tmp, 0xffff);
3558         store_reg(r1, tmp);
3559         tcg_temp_free_i64(tmp);
3560         break;
3561     case 0x87: /* DLGR      R1,R2     [RRE] */
3562         tmp32_1 = tcg_const_i32(r1);
3563         tmp = load_reg(r2);
3564         gen_helper_dlg(tmp32_1, tmp);
3565         tcg_temp_free_i64(tmp);
3566         tcg_temp_free_i32(tmp32_1);
3567         break;
3568     case 0x88: /* ALCGR     R1,R2     [RRE] */
3569         tmp = load_reg(r1);
3570         tmp2 = load_reg(r2);
3571         tmp3 = tcg_temp_new_i64();
3572         gen_op_calc_cc(s);
3573         tcg_gen_extu_i32_i64(tmp3, cc_op);
3574         tcg_gen_shri_i64(tmp3, tmp3, 1);
3575         tcg_gen_andi_i64(tmp3, tmp3, 1);
3576         tcg_gen_add_i64(tmp3, tmp2, tmp3);
3577         tcg_gen_add_i64(tmp3, tmp, tmp3);
3578         store_reg(r1, tmp3);
3579         set_cc_addu64(s, tmp, tmp2, tmp3);
3580         tcg_temp_free_i64(tmp);
3581         tcg_temp_free_i64(tmp2);
3582         tcg_temp_free_i64(tmp3);
3583         break;
3584     case 0x89: /* SLBGR   R1,R2     [RRE] */
3585         tmp = load_reg(r1);
3586         tmp2 = load_reg(r2);
3587         tmp32_1 = tcg_const_i32(r1);
3588         gen_op_calc_cc(s);
3589         gen_helper_slbg(cc_op, cc_op, tmp32_1, tmp, tmp2);
3590         set_cc_static(s);
3591         tcg_temp_free_i64(tmp);
3592         tcg_temp_free_i64(tmp2);
3593         tcg_temp_free_i32(tmp32_1);
3594         break;
3595     case 0x94: /* LLCR R1,R2 [RRE] */
3596         tmp32_1 = load_reg32(r2);
3597         tcg_gen_andi_i32(tmp32_1, tmp32_1, 0xff);
3598         store_reg32(r1, tmp32_1);
3599         tcg_temp_free_i32(tmp32_1);
3600         break;
3601     case 0x95: /* LLHR R1,R2 [RRE] */
3602         tmp32_1 = load_reg32(r2);
3603         tcg_gen_andi_i32(tmp32_1, tmp32_1, 0xffff);
3604         store_reg32(r1, tmp32_1);
3605         tcg_temp_free_i32(tmp32_1);
3606         break;
3607     case 0x96: /* MLR     R1,R2     [RRE] */
3608         /* reg(r1, r1+1) = reg(r1+1) * reg(r2) */
3609         tmp2 = load_reg(r2);
3610         tmp3 = load_reg((r1 + 1) & 15);
3611         tcg_gen_ext32u_i64(tmp2, tmp2);
3612         tcg_gen_ext32u_i64(tmp3, tmp3);
3613         tcg_gen_mul_i64(tmp2, tmp2, tmp3);
3614         store_reg32_i64((r1 + 1) & 15, tmp2);
3615         tcg_gen_shri_i64(tmp2, tmp2, 32);
3616         store_reg32_i64(r1, tmp2);
3617         tcg_temp_free_i64(tmp2);
3618         tcg_temp_free_i64(tmp3);
3619         break;
3620     case 0x97: /* DLR     R1,R2     [RRE] */
3621         /* reg(r1) = reg(r1, r1+1) % reg(r2) */
3622         /* reg(r1+1) = reg(r1, r1+1) / reg(r2) */
3623         tmp = load_reg(r1);
3624         tmp2 = load_reg(r2);
3625         tmp3 = load_reg((r1 + 1) & 15);
3626         tcg_gen_ext32u_i64(tmp2, tmp2);
3627         tcg_gen_ext32u_i64(tmp3, tmp3);
3628         tcg_gen_shli_i64(tmp, tmp, 32);
3629         tcg_gen_or_i64(tmp, tmp, tmp3);
3630
3631         tcg_gen_rem_i64(tmp3, tmp, tmp2);
3632         tcg_gen_div_i64(tmp, tmp, tmp2);
3633         store_reg32_i64((r1 + 1) & 15, tmp);
3634         store_reg32_i64(r1, tmp3);
3635         tcg_temp_free_i64(tmp);
3636         tcg_temp_free_i64(tmp2);
3637         tcg_temp_free_i64(tmp3);
3638         break;
3639     case 0x98: /* ALCR    R1,R2     [RRE] */
3640         tmp32_1 = load_reg32(r1);
3641         tmp32_2 = load_reg32(r2);
3642         tmp32_3 = tcg_temp_new_i32();
3643         /* XXX possible optimization point */
3644         gen_op_calc_cc(s);
3645         gen_helper_addc_u32(tmp32_3, cc_op, tmp32_1, tmp32_2);
3646         set_cc_addu32(s, tmp32_1, tmp32_2, tmp32_3);
3647         store_reg32(r1, tmp32_3);
3648         tcg_temp_free_i32(tmp32_1);
3649         tcg_temp_free_i32(tmp32_2);
3650         tcg_temp_free_i32(tmp32_3);
3651         break;
3652     case 0x99: /* SLBR    R1,R2     [RRE] */
3653         tmp32_1 = load_reg32(r2);
3654         tmp32_2 = tcg_const_i32(r1);
3655         gen_op_calc_cc(s);
3656         gen_helper_slb(cc_op, cc_op, tmp32_2, tmp32_1);
3657         set_cc_static(s);
3658         tcg_temp_free_i32(tmp32_1);
3659         tcg_temp_free_i32(tmp32_2);
3660         break;
3661     default:
3662         LOG_DISAS("illegal b9 operation 0x%x\n", op);
3663         gen_illegal_opcode(s, 2);
3664         break;
3665     }
3666 }
3667
3668 static void disas_c0(DisasContext *s, int op, int r1, int i2)
3669 {
3670     TCGv_i64 tmp;
3671     TCGv_i32 tmp32_1, tmp32_2;
3672     uint64_t target = s->pc + i2 * 2LL;
3673     int l1;
3674
3675     LOG_DISAS("disas_c0: op 0x%x r1 %d i2 %d\n", op, r1, i2);
3676
3677     switch (op) {
3678     case 0: /* larl r1, i2 */
3679         tmp = tcg_const_i64(target);
3680         store_reg(r1, tmp);
3681         tcg_temp_free_i64(tmp);
3682         break;
3683     case 0x1: /* LGFI R1,I2 [RIL] */
3684         tmp = tcg_const_i64((int64_t)i2);
3685         store_reg(r1, tmp);
3686         tcg_temp_free_i64(tmp);
3687         break;
3688     case 0x4: /* BRCL     M1,I2     [RIL] */
3689         /* m1 & (1 << (3 - cc)) */
3690         tmp32_1 = tcg_const_i32(3);
3691         tmp32_2 = tcg_const_i32(1);
3692         gen_op_calc_cc(s);
3693         tcg_gen_sub_i32(tmp32_1, tmp32_1, cc_op);
3694         tcg_gen_shl_i32(tmp32_2, tmp32_2, tmp32_1);
3695         tcg_temp_free_i32(tmp32_1);
3696         tmp32_1 = tcg_const_i32(r1); /* m1 == r1 */
3697         tcg_gen_and_i32(tmp32_1, tmp32_1, tmp32_2);
3698         l1 = gen_new_label();
3699         tcg_gen_brcondi_i32(TCG_COND_EQ, tmp32_1, 0, l1);
3700         gen_goto_tb(s, 0, target);
3701         gen_set_label(l1);
3702         gen_goto_tb(s, 1, s->pc + 6);
3703         s->is_jmp = DISAS_TB_JUMP;
3704         tcg_temp_free_i32(tmp32_1);
3705         tcg_temp_free_i32(tmp32_2);
3706         break;
3707     case 0x5: /* brasl r1, i2 */
3708         tmp = tcg_const_i64(pc_to_link_info(s, s->pc + 6));
3709         store_reg(r1, tmp);
3710         tcg_temp_free_i64(tmp);
3711         gen_goto_tb(s, 0, target);
3712         s->is_jmp = DISAS_TB_JUMP;
3713         break;
3714     case 0x7: /* XILF R1,I2 [RIL] */
3715     case 0xb: /* NILF R1,I2 [RIL] */
3716     case 0xd: /* OILF R1,I2 [RIL] */
3717         tmp32_1 = load_reg32(r1);
3718         switch (op) {
3719         case 0x7:
3720             tcg_gen_xori_i32(tmp32_1, tmp32_1, (uint32_t)i2);
3721             break;
3722         case 0xb:
3723             tcg_gen_andi_i32(tmp32_1, tmp32_1, (uint32_t)i2);
3724             break;
3725         case 0xd:
3726             tcg_gen_ori_i32(tmp32_1, tmp32_1, (uint32_t)i2);
3727             break;
3728         default:
3729             tcg_abort();
3730         }
3731         store_reg32(r1, tmp32_1);
3732         set_cc_nz_u32(s, tmp32_1);
3733         tcg_temp_free_i32(tmp32_1);
3734         break;
3735     case 0x9: /* IILF R1,I2 [RIL] */
3736         tmp32_1 = tcg_const_i32((uint32_t)i2);
3737         store_reg32(r1, tmp32_1);
3738         tcg_temp_free_i32(tmp32_1);
3739         break;
3740     case 0xa: /* NIHF R1,I2 [RIL] */
3741         tmp = load_reg(r1);
3742         tmp32_1 = tcg_temp_new_i32();
3743         tcg_gen_andi_i64(tmp, tmp, (((uint64_t)((uint32_t)i2)) << 32)
3744                                    | 0xffffffffULL);
3745         store_reg(r1, tmp);
3746         tcg_gen_shri_i64(tmp, tmp, 32);
3747         tcg_gen_trunc_i64_i32(tmp32_1, tmp);
3748         set_cc_nz_u32(s, tmp32_1);
3749         tcg_temp_free_i64(tmp);
3750         tcg_temp_free_i32(tmp32_1);
3751         break;
3752     case 0xe: /* LLIHF R1,I2 [RIL] */
3753         tmp = tcg_const_i64(((uint64_t)(uint32_t)i2) << 32);
3754         store_reg(r1, tmp);
3755         tcg_temp_free_i64(tmp);
3756         break;
3757     case 0xf: /* LLILF R1,I2 [RIL] */
3758         tmp = tcg_const_i64((uint32_t)i2);
3759         store_reg(r1, tmp);
3760         tcg_temp_free_i64(tmp);
3761         break;
3762     default:
3763         LOG_DISAS("illegal c0 operation 0x%x\n", op);
3764         gen_illegal_opcode(s, 3);
3765         break;
3766     }
3767 }
3768
3769 static void disas_c2(DisasContext *s, int op, int r1, int i2)
3770 {
3771     TCGv_i64 tmp, tmp2, tmp3;
3772     TCGv_i32 tmp32_1, tmp32_2, tmp32_3;
3773
3774     switch (op) {
3775     case 0x4: /* SLGFI R1,I2 [RIL] */
3776     case 0xa: /* ALGFI R1,I2 [RIL] */
3777         tmp = load_reg(r1);
3778         tmp2 = tcg_const_i64((uint64_t)(uint32_t)i2);
3779         tmp3 = tcg_temp_new_i64();
3780         switch (op) {
3781         case 0x4:
3782             tcg_gen_sub_i64(tmp3, tmp, tmp2);
3783             set_cc_subu64(s, tmp, tmp2, tmp3);
3784             break;
3785         case 0xa:
3786             tcg_gen_add_i64(tmp3, tmp, tmp2);
3787             set_cc_addu64(s, tmp, tmp2, tmp3);
3788             break;
3789         default:
3790             tcg_abort();
3791         }
3792         store_reg(r1, tmp3);
3793         tcg_temp_free_i64(tmp);
3794         tcg_temp_free_i64(tmp2);
3795         tcg_temp_free_i64(tmp3);
3796         break;
3797     case 0x5: /* SLFI R1,I2 [RIL] */
3798     case 0xb: /* ALFI R1,I2 [RIL] */
3799         tmp32_1 = load_reg32(r1);
3800         tmp32_2 = tcg_const_i32(i2);
3801         tmp32_3 = tcg_temp_new_i32();
3802         switch (op) {
3803         case 0x5:
3804             tcg_gen_sub_i32(tmp32_3, tmp32_1, tmp32_2);
3805             set_cc_subu32(s, tmp32_1, tmp32_2, tmp32_3);
3806             break;
3807         case 0xb:
3808             tcg_gen_add_i32(tmp32_3, tmp32_1, tmp32_2);
3809             set_cc_addu32(s, tmp32_1, tmp32_2, tmp32_3);
3810             break;
3811         default:
3812             tcg_abort();
3813         }
3814         store_reg32(r1, tmp32_3);
3815         tcg_temp_free_i32(tmp32_1);
3816         tcg_temp_free_i32(tmp32_2);
3817         tcg_temp_free_i32(tmp32_3);
3818         break;
3819     case 0xc: /* CGFI R1,I2 [RIL] */
3820         tmp = load_reg(r1);
3821         cmp_s64c(s, tmp, (int64_t)i2);
3822         tcg_temp_free_i64(tmp);
3823         break;
3824     case 0xe: /* CLGFI R1,I2 [RIL] */
3825         tmp = load_reg(r1);
3826         cmp_u64c(s, tmp, (uint64_t)(uint32_t)i2);
3827         tcg_temp_free_i64(tmp);
3828         break;
3829     case 0xd: /* CFI R1,I2 [RIL] */
3830         tmp32_1 = load_reg32(r1);
3831         cmp_s32c(s, tmp32_1, i2);
3832         tcg_temp_free_i32(tmp32_1);
3833         break;
3834     case 0xf: /* CLFI R1,I2 [RIL] */
3835         tmp32_1 = load_reg32(r1);
3836         cmp_u32c(s, tmp32_1, i2);
3837         tcg_temp_free_i32(tmp32_1);
3838         break;
3839     default:
3840         LOG_DISAS("illegal c2 operation 0x%x\n", op);
3841         gen_illegal_opcode(s, 3);
3842         break;
3843     }
3844 }
3845
3846 static void gen_and_or_xor_i32(int opc, TCGv_i32 tmp, TCGv_i32 tmp2)
3847 {
3848     switch (opc & 0xf) {
3849     case 0x4:
3850         tcg_gen_and_i32(tmp, tmp, tmp2);
3851         break;
3852     case 0x6:
3853         tcg_gen_or_i32(tmp, tmp, tmp2);
3854         break;
3855     case 0x7:
3856         tcg_gen_xor_i32(tmp, tmp, tmp2);
3857         break;
3858     default:
3859         tcg_abort();
3860     }
3861 }
3862
3863 static void disas_s390_insn(DisasContext *s)
3864 {
3865     TCGv_i64 tmp, tmp2, tmp3, tmp4;
3866     TCGv_i32 tmp32_1, tmp32_2, tmp32_3, tmp32_4;
3867     unsigned char opc;
3868     uint64_t insn;
3869     int op, r1, r2, r3, d1, d2, x2, b1, b2, i, i2, r1b;
3870     TCGv_i32 vl;
3871     int ilc;
3872     int l1;
3873
3874     opc = ldub_code(s->pc);
3875     LOG_DISAS("opc 0x%x\n", opc);
3876
3877     ilc = get_ilc(opc);
3878
3879     switch (opc) {
3880 #ifndef CONFIG_USER_ONLY
3881     case 0x01: /* SAM */
3882         insn = ld_code2(s->pc);
3883         /* set addressing mode, but we only do 64bit anyways */
3884         break;
3885 #endif
3886     case 0x6: /* BCTR     R1,R2     [RR] */
3887         insn = ld_code2(s->pc);
3888         decode_rr(s, insn, &r1, &r2);
3889         tmp32_1 = load_reg32(r1);
3890         tcg_gen_subi_i32(tmp32_1, tmp32_1, 1);
3891         store_reg32(r1, tmp32_1);
3892
3893         if (r2) {
3894             gen_update_cc_op(s);
3895             l1 = gen_new_label();
3896             tcg_gen_brcondi_i32(TCG_COND_NE, tmp32_1, 0, l1);
3897
3898             /* not taking the branch, jump to after the instruction */
3899             gen_goto_tb(s, 0, s->pc + 2);
3900             gen_set_label(l1);
3901
3902             /* take the branch, move R2 into psw.addr */
3903             tmp32_1 = load_reg32(r2);
3904             tmp = tcg_temp_new_i64();
3905             tcg_gen_extu_i32_i64(tmp, tmp32_1);
3906             tcg_gen_mov_i64(psw_addr, tmp);
3907             s->is_jmp = DISAS_JUMP;
3908             tcg_temp_free_i32(tmp32_1);
3909             tcg_temp_free_i64(tmp);
3910         }
3911         break;
3912     case 0x7: /* BCR    M1,R2     [RR] */
3913         insn = ld_code2(s->pc);
3914         decode_rr(s, insn, &r1, &r2);
3915         if (r2) {
3916             tmp = load_reg(r2);
3917             gen_bcr(s, r1, tmp, s->pc);
3918             tcg_temp_free_i64(tmp);
3919             s->is_jmp = DISAS_TB_JUMP;
3920         } else {
3921             /* XXX: "serialization and checkpoint-synchronization function"? */
3922         }
3923         break;
3924     case 0xa: /* SVC    I         [RR] */
3925         insn = ld_code2(s->pc);
3926         debug_insn(insn);
3927         i = insn & 0xff;
3928         update_psw_addr(s);
3929         gen_op_calc_cc(s);
3930         tmp32_1 = tcg_const_i32(i);
3931         tmp32_2 = tcg_const_i32(ilc * 2);
3932         tmp32_3 = tcg_const_i32(EXCP_SVC);
3933         tcg_gen_st_i32(tmp32_1, cpu_env, offsetof(CPUState, int_svc_code));
3934         tcg_gen_st_i32(tmp32_2, cpu_env, offsetof(CPUState, int_svc_ilc));
3935         gen_helper_exception(tmp32_3);
3936         s->is_jmp = DISAS_EXCP;
3937         tcg_temp_free_i32(tmp32_1);
3938         tcg_temp_free_i32(tmp32_2);
3939         tcg_temp_free_i32(tmp32_3);
3940         break;
3941     case 0xd: /* BASR   R1,R2     [RR] */
3942         insn = ld_code2(s->pc);
3943         decode_rr(s, insn, &r1, &r2);
3944         tmp = tcg_const_i64(pc_to_link_info(s, s->pc + 2));
3945         store_reg(r1, tmp);
3946         if (r2) {
3947             tmp2 = load_reg(r2);
3948             tcg_gen_mov_i64(psw_addr, tmp2);
3949             tcg_temp_free_i64(tmp2);
3950             s->is_jmp = DISAS_JUMP;
3951         }
3952         tcg_temp_free_i64(tmp);
3953         break;
3954     case 0xe: /* MVCL   R1,R2     [RR] */
3955         insn = ld_code2(s->pc);
3956         decode_rr(s, insn, &r1, &r2);
3957         tmp32_1 = tcg_const_i32(r1);
3958         tmp32_2 = tcg_const_i32(r2);
3959         potential_page_fault(s);
3960         gen_helper_mvcl(cc_op, tmp32_1, tmp32_2);
3961         set_cc_static(s);
3962         tcg_temp_free_i32(tmp32_1);
3963         tcg_temp_free_i32(tmp32_2);
3964         break;
3965     case 0x10: /* LPR    R1,R2     [RR] */
3966         insn = ld_code2(s->pc);
3967         decode_rr(s, insn, &r1, &r2);
3968         tmp32_1 = load_reg32(r2);
3969         set_cc_abs32(s, tmp32_1);
3970         gen_helper_abs_i32(tmp32_1, tmp32_1);
3971         store_reg32(r1, tmp32_1);
3972         tcg_temp_free_i32(tmp32_1);
3973         break;
3974     case 0x11: /* LNR    R1,R2     [RR] */
3975         insn = ld_code2(s->pc);
3976         decode_rr(s, insn, &r1, &r2);
3977         tmp32_1 = load_reg32(r2);
3978         set_cc_nabs32(s, tmp32_1);
3979         gen_helper_nabs_i32(tmp32_1, tmp32_1);
3980         store_reg32(r1, tmp32_1);
3981         tcg_temp_free_i32(tmp32_1);
3982         break;
3983     case 0x12: /* LTR    R1,R2     [RR] */
3984         insn = ld_code2(s->pc);
3985         decode_rr(s, insn, &r1, &r2);
3986         tmp32_1 = load_reg32(r2);
3987         if (r1 != r2) {
3988             store_reg32(r1, tmp32_1);
3989         }
3990         set_cc_s32(s, tmp32_1);
3991         tcg_temp_free_i32(tmp32_1);
3992         break;
3993     case 0x13: /* LCR    R1,R2     [RR] */
3994         insn = ld_code2(s->pc);
3995         decode_rr(s, insn, &r1, &r2);
3996         tmp32_1 = load_reg32(r2);
3997         tcg_gen_neg_i32(tmp32_1, tmp32_1);
3998         store_reg32(r1, tmp32_1);
3999         set_cc_comp32(s, tmp32_1);
4000         tcg_temp_free_i32(tmp32_1);
4001         break;
4002     case 0x14: /* NR     R1,R2     [RR] */
4003     case 0x16: /* OR     R1,R2     [RR] */
4004     case 0x17: /* XR     R1,R2     [RR] */
4005         insn = ld_code2(s->pc);
4006         decode_rr(s, insn, &r1, &r2);
4007         tmp32_2 = load_reg32(r2);
4008         tmp32_1 = load_reg32(r1);
4009         gen_and_or_xor_i32(opc, tmp32_1, tmp32_2);
4010         store_reg32(r1, tmp32_1);
4011         set_cc_nz_u32(s, tmp32_1);
4012         tcg_temp_free_i32(tmp32_1);
4013         tcg_temp_free_i32(tmp32_2);
4014         break;
4015     case 0x18: /* LR     R1,R2     [RR] */
4016         insn = ld_code2(s->pc);
4017         decode_rr(s, insn, &r1, &r2);
4018         tmp32_1 = load_reg32(r2);
4019         store_reg32(r1, tmp32_1);
4020         tcg_temp_free_i32(tmp32_1);
4021         break;
4022     case 0x15: /* CLR    R1,R2     [RR] */
4023     case 0x19: /* CR     R1,R2     [RR] */
4024         insn = ld_code2(s->pc);
4025         decode_rr(s, insn, &r1, &r2);
4026         tmp32_1 = load_reg32(r1);
4027         tmp32_2 = load_reg32(r2);
4028         if (opc == 0x15) {
4029             cmp_u32(s, tmp32_1, tmp32_2);
4030         } else {
4031             cmp_s32(s, tmp32_1, tmp32_2);
4032         }
4033         tcg_temp_free_i32(tmp32_1);
4034         tcg_temp_free_i32(tmp32_2);
4035         break;
4036     case 0x1a: /* AR     R1,R2     [RR] */
4037     case 0x1e: /* ALR    R1,R2     [RR] */
4038         insn = ld_code2(s->pc);
4039         decode_rr(s, insn, &r1, &r2);
4040         tmp32_1 = load_reg32(r1);
4041         tmp32_2 = load_reg32(r2);
4042         tmp32_3 = tcg_temp_new_i32();
4043         tcg_gen_add_i32(tmp32_3, tmp32_1, tmp32_2);
4044         store_reg32(r1, tmp32_3);
4045         if (opc == 0x1a) {
4046             set_cc_add32(s, tmp32_1, tmp32_2, tmp32_3);
4047         } else {
4048             set_cc_addu32(s, tmp32_1, tmp32_2, tmp32_3);
4049         }
4050         tcg_temp_free_i32(tmp32_1);
4051         tcg_temp_free_i32(tmp32_2);
4052         tcg_temp_free_i32(tmp32_3);
4053         break;
4054     case 0x1b: /* SR     R1,R2     [RR] */
4055     case 0x1f: /* SLR    R1,R2     [RR] */
4056         insn = ld_code2(s->pc);
4057         decode_rr(s, insn, &r1, &r2);
4058         tmp32_1 = load_reg32(r1);
4059         tmp32_2 = load_reg32(r2);
4060         tmp32_3 = tcg_temp_new_i32();
4061         tcg_gen_sub_i32(tmp32_3, tmp32_1, tmp32_2);
4062         store_reg32(r1, tmp32_3);
4063         if (opc == 0x1b) {
4064             set_cc_sub32(s, tmp32_1, tmp32_2, tmp32_3);
4065         } else {
4066             set_cc_subu32(s, tmp32_1, tmp32_2, tmp32_3);
4067         }
4068         tcg_temp_free_i32(tmp32_1);
4069         tcg_temp_free_i32(tmp32_2);
4070         tcg_temp_free_i32(tmp32_3);
4071         break;
4072     case 0x1c: /* MR     R1,R2     [RR] */
4073         /* reg(r1, r1+1) = reg(r1+1) * reg(r2) */
4074         insn = ld_code2(s->pc);
4075         decode_rr(s, insn, &r1, &r2);
4076         tmp2 = load_reg(r2);
4077         tmp3 = load_reg((r1 + 1) & 15);
4078         tcg_gen_ext32s_i64(tmp2, tmp2);
4079         tcg_gen_ext32s_i64(tmp3, tmp3);
4080         tcg_gen_mul_i64(tmp2, tmp2, tmp3);
4081         store_reg32_i64((r1 + 1) & 15, tmp2);
4082         tcg_gen_shri_i64(tmp2, tmp2, 32);
4083         store_reg32_i64(r1, tmp2);
4084         tcg_temp_free_i64(tmp2);
4085         tcg_temp_free_i64(tmp3);
4086         break;
4087     case 0x1d: /* DR     R1,R2               [RR] */
4088         insn = ld_code2(s->pc);
4089         decode_rr(s, insn, &r1, &r2);
4090         tmp32_1 = load_reg32(r1);
4091         tmp32_2 = load_reg32(r1 + 1);
4092         tmp32_3 = load_reg32(r2);
4093
4094         tmp = tcg_temp_new_i64(); /* dividend */
4095         tmp2 = tcg_temp_new_i64(); /* divisor */
4096         tmp3 = tcg_temp_new_i64();
4097
4098         /* dividend is r(r1 << 32) | r(r1 + 1) */
4099         tcg_gen_extu_i32_i64(tmp, tmp32_1);
4100         tcg_gen_extu_i32_i64(tmp2, tmp32_2);
4101         tcg_gen_shli_i64(tmp, tmp, 32);
4102         tcg_gen_or_i64(tmp, tmp, tmp2);
4103
4104         /* divisor is r(r2) */
4105         tcg_gen_ext_i32_i64(tmp2, tmp32_3);
4106
4107         tcg_gen_div_i64(tmp3, tmp, tmp2);
4108         tcg_gen_rem_i64(tmp, tmp, tmp2);
4109
4110         tcg_gen_trunc_i64_i32(tmp32_1, tmp);
4111         tcg_gen_trunc_i64_i32(tmp32_2, tmp3);
4112
4113         store_reg32(r1, tmp32_1); /* remainder */
4114         store_reg32(r1 + 1, tmp32_2); /* quotient */
4115         tcg_temp_free_i32(tmp32_1);
4116         tcg_temp_free_i32(tmp32_2);
4117         tcg_temp_free_i32(tmp32_3);
4118         tcg_temp_free_i64(tmp);
4119         tcg_temp_free_i64(tmp2);
4120         tcg_temp_free_i64(tmp3);
4121         break;
4122     case 0x28: /* LDR    R1,R2               [RR] */
4123         insn = ld_code2(s->pc);
4124         decode_rr(s, insn, &r1, &r2);
4125         tmp = load_freg(r2);
4126         store_freg(r1, tmp);
4127         tcg_temp_free_i64(tmp);
4128         break;
4129     case 0x38: /* LER    R1,R2               [RR] */
4130         insn = ld_code2(s->pc);
4131         decode_rr(s, insn, &r1, &r2);
4132         tmp32_1 = load_freg32(r2);
4133         store_freg32(r1, tmp32_1);
4134         tcg_temp_free_i32(tmp32_1);
4135         break;
4136     case 0x40: /* STH    R1,D2(X2,B2)     [RX] */
4137         insn = ld_code4(s->pc);
4138         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4139         tmp2 = load_reg(r1);
4140         tcg_gen_qemu_st16(tmp2, tmp, get_mem_index(s));
4141         tcg_temp_free_i64(tmp);
4142         tcg_temp_free_i64(tmp2);
4143         break;
4144     case 0x41:        /* la */
4145         insn = ld_code4(s->pc);
4146         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4147         store_reg(r1, tmp); /* FIXME: 31/24-bit addressing */
4148         tcg_temp_free_i64(tmp);
4149         break;
4150     case 0x42: /* STC    R1,D2(X2,B2)     [RX] */
4151         insn = ld_code4(s->pc);
4152         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4153         tmp2 = load_reg(r1);
4154         tcg_gen_qemu_st8(tmp2, tmp, get_mem_index(s));
4155         tcg_temp_free_i64(tmp);
4156         tcg_temp_free_i64(tmp2);
4157         break;
4158     case 0x43: /* IC     R1,D2(X2,B2)     [RX] */
4159         insn = ld_code4(s->pc);
4160         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4161         tmp2 = tcg_temp_new_i64();
4162         tcg_gen_qemu_ld8u(tmp2, tmp, get_mem_index(s));
4163         store_reg8(r1, tmp2);
4164         tcg_temp_free_i64(tmp);
4165         tcg_temp_free_i64(tmp2);
4166         break;
4167     case 0x44: /* EX     R1,D2(X2,B2)     [RX] */
4168         insn = ld_code4(s->pc);
4169         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4170         tmp2 = load_reg(r1);
4171         tmp3 = tcg_const_i64(s->pc + 4);
4172         update_psw_addr(s);
4173         gen_op_calc_cc(s);
4174         gen_helper_ex(cc_op, cc_op, tmp2, tmp, tmp3);
4175         set_cc_static(s);
4176         tcg_temp_free_i64(tmp);
4177         tcg_temp_free_i64(tmp2);
4178         tcg_temp_free_i64(tmp3);
4179         break;
4180     case 0x46: /* BCT    R1,D2(X2,B2)     [RX] */
4181         insn = ld_code4(s->pc);
4182         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4183         tcg_temp_free_i64(tmp);
4184
4185         tmp32_1 = load_reg32(r1);
4186         tcg_gen_subi_i32(tmp32_1, tmp32_1, 1);
4187         store_reg32(r1, tmp32_1);
4188
4189         gen_update_cc_op(s);
4190         l1 = gen_new_label();
4191         tcg_gen_brcondi_i32(TCG_COND_NE, tmp32_1, 0, l1);
4192
4193         /* not taking the branch, jump to after the instruction */
4194         gen_goto_tb(s, 0, s->pc + 4);
4195         gen_set_label(l1);
4196
4197         /* take the branch, move R2 into psw.addr */
4198         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4199         tcg_gen_mov_i64(psw_addr, tmp);
4200         s->is_jmp = DISAS_JUMP;
4201         tcg_temp_free_i32(tmp32_1);
4202         tcg_temp_free_i64(tmp);
4203         break;
4204     case 0x47: /* BC     M1,D2(X2,B2)     [RX] */
4205         insn = ld_code4(s->pc);
4206         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4207         gen_bcr(s, r1, tmp, s->pc + 4);
4208         tcg_temp_free_i64(tmp);
4209         s->is_jmp = DISAS_TB_JUMP;
4210         break;
4211     case 0x48: /* LH     R1,D2(X2,B2)     [RX] */
4212         insn = ld_code4(s->pc);
4213         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4214         tmp2 = tcg_temp_new_i64();
4215         tcg_gen_qemu_ld16s(tmp2, tmp, get_mem_index(s));
4216         store_reg32_i64(r1, tmp2);
4217         tcg_temp_free_i64(tmp);
4218         tcg_temp_free_i64(tmp2);
4219         break;
4220     case 0x49: /* CH     R1,D2(X2,B2)     [RX] */
4221         insn = ld_code4(s->pc);
4222         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4223         tmp32_1 = load_reg32(r1);
4224         tmp32_2 = tcg_temp_new_i32();
4225         tmp2 = tcg_temp_new_i64();
4226         tcg_gen_qemu_ld16s(tmp2, tmp, get_mem_index(s));
4227         tcg_gen_trunc_i64_i32(tmp32_2, tmp2);
4228         cmp_s32(s, tmp32_1, tmp32_2);
4229         tcg_temp_free_i32(tmp32_1);
4230         tcg_temp_free_i32(tmp32_2);
4231         tcg_temp_free_i64(tmp);
4232         tcg_temp_free_i64(tmp2);
4233         break;
4234     case 0x4a: /* AH     R1,D2(X2,B2)     [RX] */
4235     case 0x4b: /* SH     R1,D2(X2,B2)     [RX] */
4236     case 0x4c: /* MH     R1,D2(X2,B2)     [RX] */
4237         insn = ld_code4(s->pc);
4238         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4239         tmp2 = tcg_temp_new_i64();
4240         tmp32_1 = load_reg32(r1);
4241         tmp32_2 = tcg_temp_new_i32();
4242         tmp32_3 = tcg_temp_new_i32();
4243
4244         tcg_gen_qemu_ld16s(tmp2, tmp, get_mem_index(s));
4245         tcg_gen_trunc_i64_i32(tmp32_2, tmp2);
4246         switch (opc) {
4247         case 0x4a:
4248             tcg_gen_add_i32(tmp32_3, tmp32_1, tmp32_2);
4249             set_cc_add32(s, tmp32_1, tmp32_2, tmp32_3);
4250             break;
4251         case 0x4b:
4252             tcg_gen_sub_i32(tmp32_3, tmp32_1, tmp32_2);
4253             set_cc_sub32(s, tmp32_1, tmp32_2, tmp32_3);
4254             break;
4255         case 0x4c:
4256             tcg_gen_mul_i32(tmp32_3, tmp32_1, tmp32_2);
4257             break;
4258         default:
4259             tcg_abort();
4260         }
4261         store_reg32(r1, tmp32_3);
4262
4263         tcg_temp_free_i32(tmp32_1);
4264         tcg_temp_free_i32(tmp32_2);
4265         tcg_temp_free_i32(tmp32_3);
4266         tcg_temp_free_i64(tmp);
4267         tcg_temp_free_i64(tmp2);
4268         break;
4269     case 0x4d: /* BAS    R1,D2(X2,B2)     [RX] */
4270         insn = ld_code4(s->pc);
4271         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4272         tmp2 = tcg_const_i64(pc_to_link_info(s, s->pc + 4));
4273         store_reg(r1, tmp2);
4274         tcg_gen_mov_i64(psw_addr, tmp);
4275         tcg_temp_free_i64(tmp);
4276         tcg_temp_free_i64(tmp2);
4277         s->is_jmp = DISAS_JUMP;
4278         break;
4279     case 0x4e: /* CVD    R1,D2(X2,B2)     [RX] */
4280         insn = ld_code4(s->pc);
4281         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4282         tmp2 = tcg_temp_new_i64();
4283         tmp32_1 = tcg_temp_new_i32();
4284         tcg_gen_trunc_i64_i32(tmp32_1, regs[r1]);
4285         gen_helper_cvd(tmp2, tmp32_1);
4286         tcg_gen_qemu_st64(tmp2, tmp, get_mem_index(s));
4287         tcg_temp_free_i64(tmp);
4288         tcg_temp_free_i64(tmp2);
4289         tcg_temp_free_i32(tmp32_1);
4290         break;
4291     case 0x50: /* st r1, d2(x2, b2) */
4292         insn = ld_code4(s->pc);
4293         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4294         tmp2 = load_reg(r1);
4295         tcg_gen_qemu_st32(tmp2, tmp, get_mem_index(s));
4296         tcg_temp_free_i64(tmp);
4297         tcg_temp_free_i64(tmp2);
4298         break;
4299     case 0x55: /* CL     R1,D2(X2,B2)     [RX] */
4300         insn = ld_code4(s->pc);
4301         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4302         tmp2 = tcg_temp_new_i64();
4303         tmp32_1 = tcg_temp_new_i32();
4304         tmp32_2 = load_reg32(r1);
4305         tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s));
4306         tcg_gen_trunc_i64_i32(tmp32_1, tmp2);
4307         cmp_u32(s, tmp32_2, tmp32_1);
4308         tcg_temp_free_i64(tmp);
4309         tcg_temp_free_i64(tmp2);
4310         tcg_temp_free_i32(tmp32_1);
4311         tcg_temp_free_i32(tmp32_2);
4312         break;
4313     case 0x54: /* N      R1,D2(X2,B2)     [RX] */
4314     case 0x56: /* O      R1,D2(X2,B2)     [RX] */
4315     case 0x57: /* X      R1,D2(X2,B2)     [RX] */
4316         insn = ld_code4(s->pc);
4317         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4318         tmp2 = tcg_temp_new_i64();
4319         tmp32_1 = load_reg32(r1);
4320         tmp32_2 = tcg_temp_new_i32();
4321         tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s));
4322         tcg_gen_trunc_i64_i32(tmp32_2, tmp2);
4323         gen_and_or_xor_i32(opc, tmp32_1, tmp32_2);
4324         store_reg32(r1, tmp32_1);
4325         set_cc_nz_u32(s, tmp32_1);
4326         tcg_temp_free_i64(tmp);
4327         tcg_temp_free_i64(tmp2);
4328         tcg_temp_free_i32(tmp32_1);
4329         tcg_temp_free_i32(tmp32_2);
4330         break;
4331     case 0x58: /* l r1, d2(x2, b2) */
4332         insn = ld_code4(s->pc);
4333         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4334         tmp2 = tcg_temp_new_i64();
4335         tmp32_1 = tcg_temp_new_i32();
4336         tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s));
4337         tcg_gen_trunc_i64_i32(tmp32_1, tmp2);
4338         store_reg32(r1, tmp32_1);
4339         tcg_temp_free_i64(tmp);
4340         tcg_temp_free_i64(tmp2);
4341         tcg_temp_free_i32(tmp32_1);
4342         break;
4343     case 0x59: /* C      R1,D2(X2,B2)     [RX] */
4344         insn = ld_code4(s->pc);
4345         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4346         tmp2 = tcg_temp_new_i64();
4347         tmp32_1 = tcg_temp_new_i32();
4348         tmp32_2 = load_reg32(r1);
4349         tcg_gen_qemu_ld32s(tmp2, tmp, get_mem_index(s));
4350         tcg_gen_trunc_i64_i32(tmp32_1, tmp2);
4351         cmp_s32(s, tmp32_2, tmp32_1);
4352         tcg_temp_free_i64(tmp);
4353         tcg_temp_free_i64(tmp2);
4354         tcg_temp_free_i32(tmp32_1);
4355         tcg_temp_free_i32(tmp32_2);
4356         break;
4357     case 0x5a: /* A      R1,D2(X2,B2)     [RX] */
4358     case 0x5b: /* S      R1,D2(X2,B2)     [RX] */
4359     case 0x5e: /* AL     R1,D2(X2,B2)     [RX] */
4360     case 0x5f: /* SL     R1,D2(X2,B2)     [RX] */
4361         insn = ld_code4(s->pc);
4362         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4363         tmp32_1 = load_reg32(r1);
4364         tmp32_2 = tcg_temp_new_i32();
4365         tmp32_3 = tcg_temp_new_i32();
4366         tcg_gen_qemu_ld32s(tmp, tmp, get_mem_index(s));
4367         tcg_gen_trunc_i64_i32(tmp32_2, tmp);
4368         switch (opc) {
4369         case 0x5a:
4370         case 0x5e:
4371             tcg_gen_add_i32(tmp32_3, tmp32_1, tmp32_2);
4372             break;
4373         case 0x5b:
4374         case 0x5f:
4375             tcg_gen_sub_i32(tmp32_3, tmp32_1, tmp32_2);
4376             break;
4377         default:
4378             tcg_abort();
4379         }
4380         store_reg32(r1, tmp32_3);
4381         switch (opc) {
4382         case 0x5a:
4383             set_cc_add32(s, tmp32_1, tmp32_2, tmp32_3);
4384             break;
4385         case 0x5e:
4386             set_cc_addu32(s, tmp32_1, tmp32_2, tmp32_3);
4387             break;
4388         case 0x5b:
4389             set_cc_sub32(s, tmp32_1, tmp32_2, tmp32_3);
4390             break;
4391         case 0x5f:
4392             set_cc_subu32(s, tmp32_1, tmp32_2, tmp32_3);
4393             break;
4394         default:
4395             tcg_abort();
4396         }
4397         tcg_temp_free_i64(tmp);
4398         tcg_temp_free_i32(tmp32_1);
4399         tcg_temp_free_i32(tmp32_2);
4400         tcg_temp_free_i32(tmp32_3);
4401         break;
4402     case 0x5c: /* M      R1,D2(X2,B2)        [RX] */
4403         /* reg(r1, r1+1) = reg(r1+1) * *(s32*)addr */
4404         insn = ld_code4(s->pc);
4405         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4406         tmp2 = tcg_temp_new_i64();
4407         tcg_gen_qemu_ld32s(tmp2, tmp, get_mem_index(s));
4408         tmp3 = load_reg((r1 + 1) & 15);
4409         tcg_gen_ext32s_i64(tmp2, tmp2);
4410         tcg_gen_ext32s_i64(tmp3, tmp3);
4411         tcg_gen_mul_i64(tmp2, tmp2, tmp3);
4412         store_reg32_i64((r1 + 1) & 15, tmp2);
4413         tcg_gen_shri_i64(tmp2, tmp2, 32);
4414         store_reg32_i64(r1, tmp2);
4415         tcg_temp_free_i64(tmp);
4416         tcg_temp_free_i64(tmp2);
4417         tcg_temp_free_i64(tmp3);
4418         break;
4419     case 0x5d: /* D      R1,D2(X2,B2)        [RX] */
4420         insn = ld_code4(s->pc);
4421         tmp3 = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4422         tmp32_1 = load_reg32(r1);
4423         tmp32_2 = load_reg32(r1 + 1);
4424
4425         tmp = tcg_temp_new_i64();
4426         tmp2 = tcg_temp_new_i64();
4427
4428         /* dividend is r(r1 << 32) | r(r1 + 1) */
4429         tcg_gen_extu_i32_i64(tmp, tmp32_1);
4430         tcg_gen_extu_i32_i64(tmp2, tmp32_2);
4431         tcg_gen_shli_i64(tmp, tmp, 32);
4432         tcg_gen_or_i64(tmp, tmp, tmp2);
4433
4434         /* divisor is in memory */
4435         tcg_gen_qemu_ld32s(tmp2, tmp3, get_mem_index(s));
4436
4437         /* XXX divisor == 0 -> FixP divide exception */
4438
4439         tcg_gen_div_i64(tmp3, tmp, tmp2);
4440         tcg_gen_rem_i64(tmp, tmp, tmp2);
4441
4442         tcg_gen_trunc_i64_i32(tmp32_1, tmp);
4443         tcg_gen_trunc_i64_i32(tmp32_2, tmp3);
4444
4445         store_reg32(r1, tmp32_1); /* remainder */
4446         store_reg32(r1 + 1, tmp32_2); /* quotient */
4447         tcg_temp_free_i32(tmp32_1);
4448         tcg_temp_free_i32(tmp32_2);
4449         tcg_temp_free_i64(tmp);
4450         tcg_temp_free_i64(tmp2);
4451         tcg_temp_free_i64(tmp3);
4452         break;
4453     case 0x60: /* STD    R1,D2(X2,B2)        [RX] */
4454         insn = ld_code4(s->pc);
4455         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4456         tmp2 = load_freg(r1);
4457         tcg_gen_qemu_st64(tmp2, tmp, get_mem_index(s));
4458         tcg_temp_free_i64(tmp);
4459         tcg_temp_free_i64(tmp2);
4460         break;
4461     case 0x68: /* LD    R1,D2(X2,B2)        [RX] */
4462         insn = ld_code4(s->pc);
4463         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4464         tmp2 = tcg_temp_new_i64();
4465         tcg_gen_qemu_ld64(tmp2, tmp, get_mem_index(s));
4466         store_freg(r1, tmp2);
4467         tcg_temp_free_i64(tmp);
4468         tcg_temp_free_i64(tmp2);
4469         break;
4470     case 0x70: /* STE R1,D2(X2,B2) [RX] */
4471         insn = ld_code4(s->pc);
4472         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4473         tmp2 = tcg_temp_new_i64();
4474         tmp32_1 = load_freg32(r1);
4475         tcg_gen_extu_i32_i64(tmp2, tmp32_1);
4476         tcg_gen_qemu_st32(tmp2, tmp, get_mem_index(s));
4477         tcg_temp_free_i64(tmp);
4478         tcg_temp_free_i64(tmp2);
4479         tcg_temp_free_i32(tmp32_1);
4480         break;
4481     case 0x71: /* MS      R1,D2(X2,B2)     [RX] */
4482         insn = ld_code4(s->pc);
4483         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4484         tmp2 = tcg_temp_new_i64();
4485         tmp32_1 = load_reg32(r1);
4486         tmp32_2 = tcg_temp_new_i32();
4487         tcg_gen_qemu_ld32s(tmp2, tmp, get_mem_index(s));
4488         tcg_gen_trunc_i64_i32(tmp32_2, tmp2);
4489         tcg_gen_mul_i32(tmp32_1, tmp32_1, tmp32_2);
4490         store_reg32(r1, tmp32_1);
4491         tcg_temp_free_i64(tmp);
4492         tcg_temp_free_i64(tmp2);
4493         tcg_temp_free_i32(tmp32_1);
4494         tcg_temp_free_i32(tmp32_2);
4495         break;
4496     case 0x78: /* LE     R1,D2(X2,B2)        [RX] */
4497         insn = ld_code4(s->pc);
4498         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4499         tmp2 = tcg_temp_new_i64();
4500         tmp32_1 = tcg_temp_new_i32();
4501         tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s));
4502         tcg_gen_trunc_i64_i32(tmp32_1, tmp2);
4503         store_freg32(r1, tmp32_1);
4504         tcg_temp_free_i64(tmp);
4505         tcg_temp_free_i64(tmp2);
4506         tcg_temp_free_i32(tmp32_1);
4507         break;
4508 #ifndef CONFIG_USER_ONLY
4509     case 0x80: /* SSM      D2(B2)       [S] */
4510         /* Set System Mask */
4511         check_privileged(s, ilc);
4512         insn = ld_code4(s->pc);
4513         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4514         tmp = get_address(s, 0, b2, d2);
4515         tmp2 = tcg_temp_new_i64();
4516         tmp3 = tcg_temp_new_i64();
4517         tcg_gen_andi_i64(tmp3, psw_mask, ~0xff00000000000000ULL);
4518         tcg_gen_qemu_ld8u(tmp2, tmp, get_mem_index(s));
4519         tcg_gen_shli_i64(tmp2, tmp2, 56);
4520         tcg_gen_or_i64(psw_mask, tmp3, tmp2);
4521         tcg_temp_free_i64(tmp);
4522         tcg_temp_free_i64(tmp2);
4523         tcg_temp_free_i64(tmp3);
4524         break;
4525     case 0x82: /* LPSW     D2(B2)       [S] */
4526         /* Load PSW */
4527         check_privileged(s, ilc);
4528         insn = ld_code4(s->pc);
4529         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4530         tmp = get_address(s, 0, b2, d2);
4531         tmp2 = tcg_temp_new_i64();
4532         tmp3 = tcg_temp_new_i64();
4533         tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s));
4534         tcg_gen_addi_i64(tmp, tmp, 4);
4535         tcg_gen_qemu_ld32u(tmp3, tmp, get_mem_index(s));
4536         gen_helper_load_psw(tmp2, tmp3);
4537         tcg_temp_free_i64(tmp);
4538         tcg_temp_free_i64(tmp2);
4539         tcg_temp_free_i64(tmp3);
4540         /* we need to keep cc_op intact */
4541         s->is_jmp = DISAS_JUMP;
4542         break;
4543     case 0x83: /* DIAG     R1,R3,D2     [RS] */
4544         /* Diagnose call (KVM hypercall) */
4545         check_privileged(s, ilc);
4546         potential_page_fault(s);
4547         insn = ld_code4(s->pc);
4548         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4549         tmp32_1 = tcg_const_i32(insn & 0xfff);
4550         tmp2 = load_reg(2);
4551         tmp3 = load_reg(1);
4552         gen_helper_diag(tmp2, tmp32_1, tmp2, tmp3);
4553         store_reg(2, tmp2);
4554         tcg_temp_free_i32(tmp32_1);
4555         tcg_temp_free_i64(tmp2);
4556         tcg_temp_free_i64(tmp3);
4557         break;
4558 #endif
4559     case 0x88: /* SRL    R1,D2(B2)        [RS] */
4560     case 0x89: /* SLL    R1,D2(B2)        [RS] */
4561     case 0x8a: /* SRA    R1,D2(B2)        [RS] */
4562         insn = ld_code4(s->pc);
4563         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4564         tmp = get_address(s, 0, b2, d2);
4565         tmp32_1 = load_reg32(r1);
4566         tmp32_2 = tcg_temp_new_i32();
4567         tcg_gen_trunc_i64_i32(tmp32_2, tmp);
4568         tcg_gen_andi_i32(tmp32_2, tmp32_2, 0x3f);
4569         switch (opc) {
4570         case 0x88:
4571             tcg_gen_shr_i32(tmp32_1, tmp32_1, tmp32_2);
4572             break;
4573         case 0x89:
4574             tcg_gen_shl_i32(tmp32_1, tmp32_1, tmp32_2);
4575             break;
4576         case 0x8a:
4577             tcg_gen_sar_i32(tmp32_1, tmp32_1, tmp32_2);
4578             set_cc_s32(s, tmp32_1);
4579             break;
4580         default:
4581             tcg_abort();
4582         }
4583         store_reg32(r1, tmp32_1);
4584         tcg_temp_free_i64(tmp);
4585         tcg_temp_free_i32(tmp32_1);
4586         tcg_temp_free_i32(tmp32_2);
4587         break;
4588     case 0x8c: /* SRDL   R1,D2(B2)        [RS] */
4589     case 0x8d: /* SLDL   R1,D2(B2)        [RS] */
4590     case 0x8e: /* SRDA   R1,D2(B2)        [RS] */
4591         insn = ld_code4(s->pc);
4592         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4593         tmp = get_address(s, 0, b2, d2); /* shift */
4594         tmp2 = tcg_temp_new_i64();
4595         tmp32_1 = load_reg32(r1);
4596         tmp32_2 = load_reg32(r1 + 1);
4597         tcg_gen_concat_i32_i64(tmp2, tmp32_2, tmp32_1); /* operand */
4598         switch (opc) {
4599         case 0x8c:
4600             tcg_gen_shr_i64(tmp2, tmp2, tmp);
4601             break;
4602         case 0x8d:
4603             tcg_gen_shl_i64(tmp2, tmp2, tmp);
4604             break;
4605         case 0x8e:
4606             tcg_gen_sar_i64(tmp2, tmp2, tmp);
4607             set_cc_s64(s, tmp2);
4608             break;
4609         }
4610         tcg_gen_shri_i64(tmp, tmp2, 32);
4611         tcg_gen_trunc_i64_i32(tmp32_1, tmp);
4612         store_reg32(r1, tmp32_1);
4613         tcg_gen_trunc_i64_i32(tmp32_2, tmp2);
4614         store_reg32(r1 + 1, tmp32_2);
4615         tcg_temp_free_i64(tmp);
4616         tcg_temp_free_i64(tmp2);
4617         break;
4618     case 0x98: /* LM     R1,R3,D2(B2)     [RS] */
4619     case 0x90: /* STM    R1,R3,D2(B2)     [RS] */
4620         insn = ld_code4(s->pc);
4621         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4622
4623         tmp = get_address(s, 0, b2, d2);
4624         tmp2 = tcg_temp_new_i64();
4625         tmp3 = tcg_const_i64(4);
4626         tmp4 = tcg_const_i64(0xffffffff00000000ULL);
4627         for (i = r1;; i = (i + 1) % 16) {
4628             if (opc == 0x98) {
4629                 tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s));
4630                 tcg_gen_and_i64(regs[i], regs[i], tmp4);
4631                 tcg_gen_or_i64(regs[i], regs[i], tmp2);
4632             } else {
4633                 tcg_gen_qemu_st32(regs[i], tmp, get_mem_index(s));
4634             }
4635             if (i == r3) {
4636                 break;
4637             }
4638             tcg_gen_add_i64(tmp, tmp, tmp3);
4639         }
4640         tcg_temp_free_i64(tmp);
4641         tcg_temp_free_i64(tmp2);
4642         tcg_temp_free_i64(tmp3);
4643         tcg_temp_free_i64(tmp4);
4644         break;
4645     case 0x91: /* TM     D1(B1),I2        [SI] */
4646         insn = ld_code4(s->pc);
4647         tmp = decode_si(s, insn, &i2, &b1, &d1);
4648         tmp2 = tcg_const_i64(i2);
4649         tcg_gen_qemu_ld8u(tmp, tmp, get_mem_index(s));
4650         cmp_64(s, tmp, tmp2, CC_OP_TM_32);
4651         tcg_temp_free_i64(tmp);
4652         tcg_temp_free_i64(tmp2);
4653         break;
4654     case 0x92: /* MVI    D1(B1),I2        [SI] */
4655         insn = ld_code4(s->pc);
4656         tmp = decode_si(s, insn, &i2, &b1, &d1);
4657         tmp2 = tcg_const_i64(i2);
4658         tcg_gen_qemu_st8(tmp2, tmp, get_mem_index(s));
4659         tcg_temp_free_i64(tmp);
4660         tcg_temp_free_i64(tmp2);
4661         break;
4662     case 0x94: /* NI     D1(B1),I2        [SI] */
4663     case 0x96: /* OI     D1(B1),I2        [SI] */
4664     case 0x97: /* XI     D1(B1),I2        [SI] */
4665         insn = ld_code4(s->pc);
4666         tmp = decode_si(s, insn, &i2, &b1, &d1);
4667         tmp2 = tcg_temp_new_i64();
4668         tcg_gen_qemu_ld8u(tmp2, tmp, get_mem_index(s));
4669         switch (opc) {
4670         case 0x94:
4671             tcg_gen_andi_i64(tmp2, tmp2, i2);
4672             break;
4673         case 0x96:
4674             tcg_gen_ori_i64(tmp2, tmp2, i2);
4675             break;
4676         case 0x97:
4677             tcg_gen_xori_i64(tmp2, tmp2, i2);
4678             break;
4679         default:
4680             tcg_abort();
4681         }
4682         tcg_gen_qemu_st8(tmp2, tmp, get_mem_index(s));
4683         set_cc_nz_u64(s, tmp2);
4684         tcg_temp_free_i64(tmp);
4685         tcg_temp_free_i64(tmp2);
4686         break;
4687     case 0x95: /* CLI    D1(B1),I2        [SI] */
4688         insn = ld_code4(s->pc);
4689         tmp = decode_si(s, insn, &i2, &b1, &d1);
4690         tmp2 = tcg_temp_new_i64();
4691         tcg_gen_qemu_ld8u(tmp2, tmp, get_mem_index(s));
4692         cmp_u64c(s, tmp2, i2);
4693         tcg_temp_free_i64(tmp);
4694         tcg_temp_free_i64(tmp2);
4695         break;
4696     case 0x9a: /* LAM      R1,R3,D2(B2)     [RS] */
4697         insn = ld_code4(s->pc);
4698         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4699         tmp = get_address(s, 0, b2, d2);
4700         tmp32_1 = tcg_const_i32(r1);
4701         tmp32_2 = tcg_const_i32(r3);
4702         potential_page_fault(s);
4703         gen_helper_lam(tmp32_1, tmp, tmp32_2);
4704         tcg_temp_free_i64(tmp);
4705         tcg_temp_free_i32(tmp32_1);
4706         tcg_temp_free_i32(tmp32_2);
4707         break;
4708     case 0x9b: /* STAM     R1,R3,D2(B2)     [RS] */
4709         insn = ld_code4(s->pc);
4710         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4711         tmp = get_address(s, 0, b2, d2);
4712         tmp32_1 = tcg_const_i32(r1);
4713         tmp32_2 = tcg_const_i32(r3);
4714         potential_page_fault(s);
4715         gen_helper_stam(tmp32_1, tmp, tmp32_2);
4716         tcg_temp_free_i64(tmp);
4717         tcg_temp_free_i32(tmp32_1);
4718         tcg_temp_free_i32(tmp32_2);
4719         break;
4720     case 0xa5:
4721         insn = ld_code4(s->pc);
4722         r1 = (insn >> 20) & 0xf;
4723         op = (insn >> 16) & 0xf;
4724         i2 = insn & 0xffff;
4725         disas_a5(s, op, r1, i2);
4726         break;
4727     case 0xa7:
4728         insn = ld_code4(s->pc);
4729         r1 = (insn >> 20) & 0xf;
4730         op = (insn >> 16) & 0xf;
4731         i2 = (short)insn;
4732         disas_a7(s, op, r1, i2);
4733         break;
4734     case 0xa8: /* MVCLE   R1,R3,D2(B2)     [RS] */
4735         insn = ld_code4(s->pc);
4736         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4737         tmp = get_address(s, 0, b2, d2);
4738         tmp32_1 = tcg_const_i32(r1);
4739         tmp32_2 = tcg_const_i32(r3);
4740         potential_page_fault(s);
4741         gen_helper_mvcle(cc_op, tmp32_1, tmp, tmp32_2);
4742         set_cc_static(s);
4743         tcg_temp_free_i64(tmp);
4744         tcg_temp_free_i32(tmp32_1);
4745         tcg_temp_free_i32(tmp32_2);
4746         break;
4747     case 0xa9: /* CLCLE   R1,R3,D2(B2)     [RS] */
4748         insn = ld_code4(s->pc);
4749         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4750         tmp = get_address(s, 0, b2, d2);
4751         tmp32_1 = tcg_const_i32(r1);
4752         tmp32_2 = tcg_const_i32(r3);
4753         potential_page_fault(s);
4754         gen_helper_clcle(cc_op, tmp32_1, tmp, tmp32_2);
4755         set_cc_static(s);
4756         tcg_temp_free_i64(tmp);
4757         tcg_temp_free_i32(tmp32_1);
4758         tcg_temp_free_i32(tmp32_2);
4759         break;
4760 #ifndef CONFIG_USER_ONLY
4761     case 0xac: /* STNSM   D1(B1),I2     [SI] */
4762     case 0xad: /* STOSM   D1(B1),I2     [SI] */
4763         check_privileged(s, ilc);
4764         insn = ld_code4(s->pc);
4765         tmp = decode_si(s, insn, &i2, &b1, &d1);
4766         tmp2 = tcg_temp_new_i64();
4767         tcg_gen_shri_i64(tmp2, psw_mask, 56);
4768         tcg_gen_qemu_st8(tmp2, tmp, get_mem_index(s));
4769         if (opc == 0xac) {
4770             tcg_gen_andi_i64(psw_mask, psw_mask,
4771                     ((uint64_t)i2 << 56) | 0x00ffffffffffffffULL);
4772         } else {
4773             tcg_gen_ori_i64(psw_mask, psw_mask, (uint64_t)i2 << 56);
4774         }
4775         tcg_temp_free_i64(tmp);
4776         tcg_temp_free_i64(tmp2);
4777         break;
4778     case 0xae: /* SIGP   R1,R3,D2(B2)     [RS] */
4779         check_privileged(s, ilc);
4780         insn = ld_code4(s->pc);
4781         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4782         tmp = get_address(s, 0, b2, d2);
4783         tmp2 = load_reg(r3);
4784         tmp32_1 = tcg_const_i32(r1);
4785         potential_page_fault(s);
4786         gen_helper_sigp(cc_op, tmp, tmp32_1, tmp2);
4787         set_cc_static(s);
4788         tcg_temp_free_i64(tmp);
4789         tcg_temp_free_i64(tmp2);
4790         tcg_temp_free_i32(tmp32_1);
4791         break;
4792     case 0xb1: /* LRA    R1,D2(X2, B2)     [RX] */
4793         check_privileged(s, ilc);
4794         insn = ld_code4(s->pc);
4795         tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
4796         tmp32_1 = tcg_const_i32(r1);
4797         potential_page_fault(s);
4798         gen_helper_lra(cc_op, tmp, tmp32_1);
4799         set_cc_static(s);
4800         tcg_temp_free_i64(tmp);
4801         tcg_temp_free_i32(tmp32_1);
4802         break;
4803 #endif
4804     case 0xb2:
4805         insn = ld_code4(s->pc);
4806         op = (insn >> 16) & 0xff;
4807         switch (op) {
4808         case 0x9c: /* STFPC    D2(B2) [S] */
4809             d2 = insn & 0xfff;
4810             b2 = (insn >> 12) & 0xf;
4811             tmp32_1 = tcg_temp_new_i32();
4812             tmp = tcg_temp_new_i64();
4813             tmp2 = get_address(s, 0, b2, d2);
4814             tcg_gen_ld_i32(tmp32_1, cpu_env, offsetof(CPUState, fpc));
4815             tcg_gen_extu_i32_i64(tmp, tmp32_1);
4816             tcg_gen_qemu_st32(tmp, tmp2, get_mem_index(s));
4817             tcg_temp_free_i32(tmp32_1);
4818             tcg_temp_free_i64(tmp);
4819             tcg_temp_free_i64(tmp2);
4820             break;
4821         default:
4822             disas_b2(s, op, insn);
4823             break;
4824         }
4825         break;
4826     case 0xb3:
4827         insn = ld_code4(s->pc);
4828         op = (insn >> 16) & 0xff;
4829         r3 = (insn >> 12) & 0xf; /* aka m3 */
4830         r1 = (insn >> 4) & 0xf;
4831         r2 = insn & 0xf;
4832         disas_b3(s, op, r3, r1, r2);
4833         break;
4834 #ifndef CONFIG_USER_ONLY
4835     case 0xb6: /* STCTL     R1,R3,D2(B2)     [RS] */
4836         /* Store Control */
4837         check_privileged(s, ilc);
4838         insn = ld_code4(s->pc);
4839         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4840         tmp = get_address(s, 0, b2, d2);
4841         tmp32_1 = tcg_const_i32(r1);
4842         tmp32_2 = tcg_const_i32(r3);
4843         potential_page_fault(s);
4844         gen_helper_stctl(tmp32_1, tmp, tmp32_2);
4845         tcg_temp_free_i64(tmp);
4846         tcg_temp_free_i32(tmp32_1);
4847         tcg_temp_free_i32(tmp32_2);
4848         break;
4849     case 0xb7: /* LCTL      R1,R3,D2(B2)     [RS] */
4850         /* Load Control */
4851         check_privileged(s, ilc);
4852         insn = ld_code4(s->pc);
4853         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4854         tmp = get_address(s, 0, b2, d2);
4855         tmp32_1 = tcg_const_i32(r1);
4856         tmp32_2 = tcg_const_i32(r3);
4857         potential_page_fault(s);
4858         gen_helper_lctl(tmp32_1, tmp, tmp32_2);
4859         tcg_temp_free_i64(tmp);
4860         tcg_temp_free_i32(tmp32_1);
4861         tcg_temp_free_i32(tmp32_2);
4862         break;
4863 #endif
4864     case 0xb9:
4865         insn = ld_code4(s->pc);
4866         r1 = (insn >> 4) & 0xf;
4867         r2 = insn & 0xf;
4868         op = (insn >> 16) & 0xff;
4869         disas_b9(s, op, r1, r2);
4870         break;
4871     case 0xba: /* CS     R1,R3,D2(B2)     [RS] */
4872         insn = ld_code4(s->pc);
4873         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4874         tmp = get_address(s, 0, b2, d2);
4875         tmp32_1 = tcg_const_i32(r1);
4876         tmp32_2 = tcg_const_i32(r3);
4877         potential_page_fault(s);
4878         gen_helper_cs(cc_op, tmp32_1, tmp, tmp32_2);
4879         set_cc_static(s);
4880         tcg_temp_free_i64(tmp);
4881         tcg_temp_free_i32(tmp32_1);
4882         tcg_temp_free_i32(tmp32_2);
4883         break;
4884     case 0xbd: /* CLM    R1,M3,D2(B2)     [RS] */
4885         insn = ld_code4(s->pc);
4886         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4887         tmp = get_address(s, 0, b2, d2);
4888         tmp32_1 = load_reg32(r1);
4889         tmp32_2 = tcg_const_i32(r3);
4890         potential_page_fault(s);
4891         gen_helper_clm(cc_op, tmp32_1, tmp32_2, tmp);
4892         set_cc_static(s);
4893         tcg_temp_free_i64(tmp);
4894         tcg_temp_free_i32(tmp32_1);
4895         tcg_temp_free_i32(tmp32_2);
4896         break;
4897     case 0xbe: /* STCM R1,M3,D2(B2) [RS] */
4898         insn = ld_code4(s->pc);
4899         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4900         tmp = get_address(s, 0, b2, d2);
4901         tmp32_1 = load_reg32(r1);
4902         tmp32_2 = tcg_const_i32(r3);
4903         potential_page_fault(s);
4904         gen_helper_stcm(tmp32_1, tmp32_2, tmp);
4905         tcg_temp_free_i64(tmp);
4906         tcg_temp_free_i32(tmp32_1);
4907         tcg_temp_free_i32(tmp32_2);
4908         break;
4909     case 0xbf: /* ICM    R1,M3,D2(B2)     [RS] */
4910         insn = ld_code4(s->pc);
4911         decode_rs(s, insn, &r1, &r3, &b2, &d2);
4912         if (r3 == 15) {
4913             /* effectively a 32-bit load */
4914             tmp = get_address(s, 0, b2, d2);
4915             tmp32_1 = tcg_temp_new_i32();
4916             tmp32_2 = tcg_const_i32(r3);
4917             tcg_gen_qemu_ld32u(tmp, tmp, get_mem_index(s));
4918             store_reg32_i64(r1, tmp);
4919             tcg_gen_trunc_i64_i32(tmp32_1, tmp);
4920             set_cc_icm(s, tmp32_2, tmp32_1);
4921             tcg_temp_free_i64(tmp);
4922             tcg_temp_free_i32(tmp32_1);
4923             tcg_temp_free_i32(tmp32_2);
4924         } else if (r3) {
4925             uint32_t mask = 0x00ffffffUL;
4926             uint32_t shift = 24;
4927             int m3 = r3;
4928             tmp = get_address(s, 0, b2, d2);
4929             tmp2 = tcg_temp_new_i64();
4930             tmp32_1 = load_reg32(r1);
4931             tmp32_2 = tcg_temp_new_i32();
4932             tmp32_3 = tcg_const_i32(r3);
4933             tmp32_4 = tcg_const_i32(0);
4934             while (m3) {
4935                 if (m3 & 8) {
4936                     tcg_gen_qemu_ld8u(tmp2, tmp, get_mem_index(s));
4937                     tcg_gen_trunc_i64_i32(tmp32_2, tmp2);
4938                     if (shift) {
4939                         tcg_gen_shli_i32(tmp32_2, tmp32_2, shift);
4940                     }
4941                     tcg_gen_andi_i32(tmp32_1, tmp32_1, mask);
4942                     tcg_gen_or_i32(tmp32_1, tmp32_1, tmp32_2);
4943                     tcg_gen_or_i32(tmp32_4, tmp32_4, tmp32_2);
4944                     tcg_gen_addi_i64(tmp, tmp, 1);
4945                 }
4946                 m3 = (m3 << 1) & 0xf;
4947                 mask = (mask >> 8) | 0xff000000UL;
4948                 shift -= 8;
4949             }
4950             store_reg32(r1, tmp32_1);
4951             set_cc_icm(s, tmp32_3, tmp32_4);
4952             tcg_temp_free_i64(tmp);
4953             tcg_temp_free_i64(tmp2);
4954             tcg_temp_free_i32(tmp32_1);
4955             tcg_temp_free_i32(tmp32_2);
4956             tcg_temp_free_i32(tmp32_3);
4957             tcg_temp_free_i32(tmp32_4);
4958         } else {
4959             /* i.e. env->cc = 0 */
4960             gen_op_movi_cc(s, 0);
4961         }
4962         break;
4963     case 0xc0:
4964     case 0xc2:
4965         insn = ld_code6(s->pc);
4966         r1 = (insn >> 36) & 0xf;
4967         op = (insn >> 32) & 0xf;
4968         i2 = (int)insn;
4969         switch (opc) {
4970         case 0xc0:
4971             disas_c0(s, op, r1, i2);
4972             break;
4973         case 0xc2:
4974             disas_c2(s, op, r1, i2);
4975             break;
4976         default:
4977             tcg_abort();
4978         }
4979         break;
4980     case 0xd2: /* MVC    D1(L,B1),D2(B2)         [SS] */
4981     case 0xd4: /* NC     D1(L,B1),D2(B2)         [SS] */
4982     case 0xd5: /* CLC    D1(L,B1),D2(B2)         [SS] */
4983     case 0xd6: /* OC     D1(L,B1),D2(B2)         [SS] */
4984     case 0xd7: /* XC     D1(L,B1),D2(B2)         [SS] */
4985     case 0xdc: /* TR     D1(L,B1),D2(B2)         [SS] */
4986     case 0xf3: /* UNPK   D1(L1,B1),D2(L2,B2)     [SS] */
4987         insn = ld_code6(s->pc);
4988         vl = tcg_const_i32((insn >> 32) & 0xff);
4989         b1 = (insn >> 28) & 0xf;
4990         b2 = (insn >> 12) & 0xf;
4991         d1 = (insn >> 16) & 0xfff;
4992         d2 = insn & 0xfff;
4993         tmp = get_address(s, 0, b1, d1);
4994         tmp2 = get_address(s, 0, b2, d2);
4995         switch (opc) {
4996         case 0xd2:
4997             gen_op_mvc(s, (insn >> 32) & 0xff, tmp, tmp2);
4998             break;
4999         case 0xd4:
5000             potential_page_fault(s);
5001             gen_helper_nc(cc_op, vl, tmp, tmp2);
5002             set_cc_static(s);
5003             break;
5004         case 0xd5:
5005             gen_op_clc(s, (insn >> 32) & 0xff, tmp, tmp2);
5006             break;
5007         case 0xd6:
5008             potential_page_fault(s);
5009             gen_helper_oc(cc_op, vl, tmp, tmp2);
5010             set_cc_static(s);
5011             break;
5012         case 0xd7:
5013             potential_page_fault(s);
5014             gen_helper_xc(cc_op, vl, tmp, tmp2);
5015             set_cc_static(s);
5016             break;
5017         case 0xdc:
5018             potential_page_fault(s);
5019             gen_helper_tr(vl, tmp, tmp2);
5020             set_cc_static(s);
5021             break;
5022         case 0xf3:
5023             potential_page_fault(s);
5024             gen_helper_unpk(vl, tmp, tmp2);
5025             break;
5026         default:
5027             tcg_abort();
5028         }
5029         tcg_temp_free_i64(tmp);
5030         tcg_temp_free_i64(tmp2);
5031         break;
5032 #ifndef CONFIG_USER_ONLY
5033     case 0xda: /* MVCP     D1(R1,B1),D2(B2),R3   [SS] */
5034     case 0xdb: /* MVCS     D1(R1,B1),D2(B2),R3   [SS] */
5035         check_privileged(s, ilc);
5036         potential_page_fault(s);
5037         insn = ld_code6(s->pc);
5038         r1 = (insn >> 36) & 0xf;
5039         r3 = (insn >> 32) & 0xf;
5040         b1 = (insn >> 28) & 0xf;
5041         d1 = (insn >> 16) & 0xfff;
5042         b2 = (insn >> 12) & 0xf;
5043         d2 = insn & 0xfff;
5044         tmp = load_reg(r1);
5045         /* XXX key in r3 */
5046         tmp2 = get_address(s, 0, b1, d1);
5047         tmp3 = get_address(s, 0, b2, d2);
5048         if (opc == 0xda) {
5049             gen_helper_mvcp(cc_op, tmp, tmp2, tmp3);
5050         } else {
5051             gen_helper_mvcs(cc_op, tmp, tmp2, tmp3);
5052         }
5053         set_cc_static(s);
5054         tcg_temp_free_i64(tmp);
5055         tcg_temp_free_i64(tmp2);
5056         tcg_temp_free_i64(tmp3);
5057         break;
5058 #endif
5059     case 0xe3:
5060         insn = ld_code6(s->pc);
5061         debug_insn(insn);
5062         op = insn & 0xff;
5063         r1 = (insn >> 36) & 0xf;
5064         x2 = (insn >> 32) & 0xf;
5065         b2 = (insn >> 28) & 0xf;
5066         d2 = ((int)((((insn >> 16) & 0xfff)
5067            | ((insn << 4) & 0xff000)) << 12)) >> 12;
5068         disas_e3(s, op,  r1, x2, b2, d2 );
5069         break;
5070 #ifndef CONFIG_USER_ONLY
5071     case 0xe5:
5072         /* Test Protection */
5073         check_privileged(s, ilc);
5074         insn = ld_code6(s->pc);
5075         debug_insn(insn);
5076         disas_e5(s, insn);
5077         break;
5078 #endif
5079     case 0xeb:
5080         insn = ld_code6(s->pc);
5081         debug_insn(insn);
5082         op = insn & 0xff;
5083         r1 = (insn >> 36) & 0xf;
5084         r3 = (insn >> 32) & 0xf;
5085         b2 = (insn >> 28) & 0xf;
5086         d2 = ((int)((((insn >> 16) & 0xfff)
5087            | ((insn << 4) & 0xff000)) << 12)) >> 12;
5088         disas_eb(s, op, r1, r3, b2, d2);
5089         break;
5090     case 0xed:
5091         insn = ld_code6(s->pc);
5092         debug_insn(insn);
5093         op = insn & 0xff;
5094         r1 = (insn >> 36) & 0xf;
5095         x2 = (insn >> 32) & 0xf;
5096         b2 = (insn >> 28) & 0xf;
5097         d2 = (short)((insn >> 16) & 0xfff);
5098         r1b = (insn >> 12) & 0xf;
5099         disas_ed(s, op, r1, x2, b2, d2, r1b);
5100         break;
5101     default:
5102         LOG_DISAS("unimplemented opcode 0x%x\n", opc);
5103         gen_illegal_opcode(s, ilc);
5104         break;
5105     }
5106
5107     /* Instruction length is encoded in the opcode */
5108     s->pc += (ilc * 2);
5109 }
5110
5111 static inline void gen_intermediate_code_internal(CPUState *env,
5112                                                   TranslationBlock *tb,
5113                                                   int search_pc)
5114 {
5115     DisasContext dc;
5116     target_ulong pc_start;
5117     uint64_t next_page_start;
5118     uint16_t *gen_opc_end;
5119     int j, lj = -1;
5120     int num_insns, max_insns;
5121     CPUBreakpoint *bp;
5122
5123     pc_start = tb->pc;
5124
5125     /* 31-bit mode */
5126     if (!(tb->flags & FLAG_MASK_64)) {
5127         pc_start &= 0x7fffffff;
5128     }
5129
5130     dc.pc = pc_start;
5131     dc.is_jmp = DISAS_NEXT;
5132     dc.tb = tb;
5133     dc.cc_op = CC_OP_DYNAMIC;
5134
5135     gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
5136
5137     next_page_start = (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE;
5138
5139     num_insns = 0;
5140     max_insns = tb->cflags & CF_COUNT_MASK;
5141     if (max_insns == 0) {
5142         max_insns = CF_COUNT_MASK;
5143     }
5144
5145     gen_icount_start();
5146
5147     do {
5148         if (unlikely(!QTAILQ_EMPTY(&env->breakpoints))) {
5149             QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
5150                 if (bp->pc == dc.pc) {
5151                     gen_debug(&dc);
5152                     break;
5153                 }
5154             }
5155         }
5156         if (search_pc) {
5157             j = gen_opc_ptr - gen_opc_buf;
5158             if (lj < j) {
5159                 lj++;
5160                 while (lj < j) {
5161                     gen_opc_instr_start[lj++] = 0;
5162                 }
5163             }
5164             gen_opc_pc[lj] = dc.pc;
5165             gen_opc_cc_op[lj] = dc.cc_op;
5166             gen_opc_instr_start[lj] = 1;
5167             gen_opc_icount[lj] = num_insns;
5168         }
5169         if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) {
5170             gen_io_start();
5171         }
5172 #if defined(S390X_DEBUG_DISAS_VERBOSE)
5173         LOG_DISAS("pc " TARGET_FMT_lx "\n",
5174                   dc.pc);
5175 #endif
5176         disas_s390_insn(&dc);
5177
5178         num_insns++;
5179         if (env->singlestep_enabled) {
5180             gen_debug(&dc);
5181         }
5182     } while (!dc.is_jmp && gen_opc_ptr < gen_opc_end && dc.pc < next_page_start
5183              && num_insns < max_insns && !env->singlestep_enabled
5184              && !singlestep);
5185
5186     if (!dc.is_jmp) {
5187         update_psw_addr(&dc);
5188     }
5189
5190     if (singlestep && dc.cc_op != CC_OP_DYNAMIC) {
5191         gen_op_calc_cc(&dc);
5192     } else {
5193         /* next TB starts off with CC_OP_DYNAMIC, so make sure the cc op type
5194            is in env */
5195         gen_op_set_cc_op(&dc);
5196     }
5197
5198     if (tb->cflags & CF_LAST_IO) {
5199         gen_io_end();
5200     }
5201     /* Generate the return instruction */
5202     if (dc.is_jmp != DISAS_TB_JUMP) {
5203         tcg_gen_exit_tb(0);
5204     }
5205     gen_icount_end(tb, num_insns);
5206     *gen_opc_ptr = INDEX_op_end;
5207     if (search_pc) {
5208         j = gen_opc_ptr - gen_opc_buf;
5209         lj++;
5210         while (lj <= j) {
5211             gen_opc_instr_start[lj++] = 0;
5212         }
5213     } else {
5214         tb->size = dc.pc - pc_start;
5215         tb->icount = num_insns;
5216     }
5217 #if defined(S390X_DEBUG_DISAS)
5218     log_cpu_state_mask(CPU_LOG_TB_CPU, env, 0);
5219     if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
5220         qemu_log("IN: %s\n", lookup_symbol(pc_start));
5221         log_target_disas(pc_start, dc.pc - pc_start, 1);
5222         qemu_log("\n");
5223     }
5224 #endif
5225 }
5226
5227 void gen_intermediate_code (CPUState *env, struct TranslationBlock *tb)
5228 {
5229     gen_intermediate_code_internal(env, tb, 0);
5230 }
5231
5232 void gen_intermediate_code_pc (CPUState *env, struct TranslationBlock *tb)
5233 {
5234     gen_intermediate_code_internal(env, tb, 1);
5235 }
5236
5237 void restore_state_to_opc(CPUState *env, TranslationBlock *tb, int pc_pos)
5238 {
5239     int cc_op;
5240     env->psw.addr = gen_opc_pc[pc_pos];
5241     cc_op = gen_opc_cc_op[pc_pos];
5242     if ((cc_op != CC_OP_DYNAMIC) && (cc_op != CC_OP_STATIC)) {
5243         env->cc_op = cc_op;
5244     }
5245 }
This page took 0.318391 seconds and 4 git commands to generate.