xref: /openbmc/qemu/target/ppc/translate.c (revision ced29396)
1 /*
2  *  PowerPC emulation for qemu: main translation routines.
3  *
4  *  Copyright (c) 2003-2007 Jocelyn Mayer
5  *  Copyright (C) 2011 Freescale Semiconductor, Inc.
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.1 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 
21 #include "qemu/osdep.h"
22 #include "cpu.h"
23 #include "internal.h"
24 #include "disas/disas.h"
25 #include "exec/exec-all.h"
26 #include "tcg/tcg-op.h"
27 #include "tcg/tcg-op-gvec.h"
28 #include "qemu/host-utils.h"
29 #include "qemu/main-loop.h"
30 #include "exec/cpu_ldst.h"
31 
32 #include "exec/helper-proto.h"
33 #include "exec/helper-gen.h"
34 
35 #include "exec/translator.h"
36 #include "exec/log.h"
37 #include "qemu/atomic128.h"
38 #include "spr_common.h"
39 #include "power8-pmu.h"
40 
41 #include "qemu/qemu-print.h"
42 #include "qapi/error.h"
43 
44 #define CPU_SINGLE_STEP 0x1
45 #define CPU_BRANCH_STEP 0x2
46 
47 /* Include definitions for instructions classes and implementations flags */
48 /* #define PPC_DEBUG_DISAS */
49 
50 #ifdef PPC_DEBUG_DISAS
51 #  define LOG_DISAS(...) qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__)
52 #else
53 #  define LOG_DISAS(...) do { } while (0)
54 #endif
55 /*****************************************************************************/
56 /* Code translation helpers                                                  */
57 
58 /* global register indexes */
59 static char cpu_reg_names[10 * 3 + 22 * 4   /* GPR */
60                           + 10 * 4 + 22 * 5 /* SPE GPRh */
61                           + 8 * 5           /* CRF */];
62 static TCGv cpu_gpr[32];
63 static TCGv cpu_gprh[32];
64 static TCGv_i32 cpu_crf[8];
65 static TCGv cpu_nip;
66 static TCGv cpu_msr;
67 static TCGv cpu_ctr;
68 static TCGv cpu_lr;
69 #if defined(TARGET_PPC64)
70 static TCGv cpu_cfar;
71 #endif
72 static TCGv cpu_xer, cpu_so, cpu_ov, cpu_ca, cpu_ov32, cpu_ca32;
73 static TCGv cpu_reserve;
74 static TCGv cpu_reserve_val;
75 static TCGv cpu_fpscr;
76 static TCGv_i32 cpu_access_type;
77 
78 #include "exec/gen-icount.h"
79 
80 void ppc_translate_init(void)
81 {
82     int i;
83     char *p;
84     size_t cpu_reg_names_size;
85 
86     p = cpu_reg_names;
87     cpu_reg_names_size = sizeof(cpu_reg_names);
88 
89     for (i = 0; i < 8; i++) {
90         snprintf(p, cpu_reg_names_size, "crf%d", i);
91         cpu_crf[i] = tcg_global_mem_new_i32(cpu_env,
92                                             offsetof(CPUPPCState, crf[i]), p);
93         p += 5;
94         cpu_reg_names_size -= 5;
95     }
96 
97     for (i = 0; i < 32; i++) {
98         snprintf(p, cpu_reg_names_size, "r%d", i);
99         cpu_gpr[i] = tcg_global_mem_new(cpu_env,
100                                         offsetof(CPUPPCState, gpr[i]), p);
101         p += (i < 10) ? 3 : 4;
102         cpu_reg_names_size -= (i < 10) ? 3 : 4;
103         snprintf(p, cpu_reg_names_size, "r%dH", i);
104         cpu_gprh[i] = tcg_global_mem_new(cpu_env,
105                                          offsetof(CPUPPCState, gprh[i]), p);
106         p += (i < 10) ? 4 : 5;
107         cpu_reg_names_size -= (i < 10) ? 4 : 5;
108     }
109 
110     cpu_nip = tcg_global_mem_new(cpu_env,
111                                  offsetof(CPUPPCState, nip), "nip");
112 
113     cpu_msr = tcg_global_mem_new(cpu_env,
114                                  offsetof(CPUPPCState, msr), "msr");
115 
116     cpu_ctr = tcg_global_mem_new(cpu_env,
117                                  offsetof(CPUPPCState, ctr), "ctr");
118 
119     cpu_lr = tcg_global_mem_new(cpu_env,
120                                 offsetof(CPUPPCState, lr), "lr");
121 
122 #if defined(TARGET_PPC64)
123     cpu_cfar = tcg_global_mem_new(cpu_env,
124                                   offsetof(CPUPPCState, cfar), "cfar");
125 #endif
126 
127     cpu_xer = tcg_global_mem_new(cpu_env,
128                                  offsetof(CPUPPCState, xer), "xer");
129     cpu_so = tcg_global_mem_new(cpu_env,
130                                 offsetof(CPUPPCState, so), "SO");
131     cpu_ov = tcg_global_mem_new(cpu_env,
132                                 offsetof(CPUPPCState, ov), "OV");
133     cpu_ca = tcg_global_mem_new(cpu_env,
134                                 offsetof(CPUPPCState, ca), "CA");
135     cpu_ov32 = tcg_global_mem_new(cpu_env,
136                                   offsetof(CPUPPCState, ov32), "OV32");
137     cpu_ca32 = tcg_global_mem_new(cpu_env,
138                                   offsetof(CPUPPCState, ca32), "CA32");
139 
140     cpu_reserve = tcg_global_mem_new(cpu_env,
141                                      offsetof(CPUPPCState, reserve_addr),
142                                      "reserve_addr");
143     cpu_reserve_val = tcg_global_mem_new(cpu_env,
144                                      offsetof(CPUPPCState, reserve_val),
145                                      "reserve_val");
146 
147     cpu_fpscr = tcg_global_mem_new(cpu_env,
148                                    offsetof(CPUPPCState, fpscr), "fpscr");
149 
150     cpu_access_type = tcg_global_mem_new_i32(cpu_env,
151                                              offsetof(CPUPPCState, access_type),
152                                              "access_type");
153 }
154 
155 /* internal defines */
156 struct DisasContext {
157     DisasContextBase base;
158     target_ulong cia;  /* current instruction address */
159     uint32_t opcode;
160     /* Routine used to access memory */
161     bool pr, hv, dr, le_mode;
162     bool lazy_tlb_flush;
163     bool need_access_type;
164     int mem_idx;
165     int access_type;
166     /* Translation flags */
167     MemOp default_tcg_memop_mask;
168 #if defined(TARGET_PPC64)
169     bool sf_mode;
170     bool has_cfar;
171 #endif
172     bool fpu_enabled;
173     bool altivec_enabled;
174     bool vsx_enabled;
175     bool spe_enabled;
176     bool tm_enabled;
177     bool gtse;
178     bool hr;
179     bool mmcr0_pmcc0;
180     bool mmcr0_pmcc1;
181     bool mmcr0_pmcjce;
182     bool pmc_other;
183     bool pmu_insn_cnt;
184     ppc_spr_t *spr_cb; /* Needed to check rights for mfspr/mtspr */
185     int singlestep_enabled;
186     uint32_t flags;
187     uint64_t insns_flags;
188     uint64_t insns_flags2;
189 };
190 
191 #define DISAS_EXIT         DISAS_TARGET_0  /* exit to main loop, pc updated */
192 #define DISAS_EXIT_UPDATE  DISAS_TARGET_1  /* exit to main loop, pc stale */
193 #define DISAS_CHAIN        DISAS_TARGET_2  /* lookup next tb, pc updated */
194 #define DISAS_CHAIN_UPDATE DISAS_TARGET_3  /* lookup next tb, pc stale */
195 
196 /* Return true iff byteswap is needed in a scalar memop */
197 static inline bool need_byteswap(const DisasContext *ctx)
198 {
199 #if TARGET_BIG_ENDIAN
200      return ctx->le_mode;
201 #else
202      return !ctx->le_mode;
203 #endif
204 }
205 
206 /* True when active word size < size of target_long.  */
207 #ifdef TARGET_PPC64
208 # define NARROW_MODE(C)  (!(C)->sf_mode)
209 #else
210 # define NARROW_MODE(C)  0
211 #endif
212 
213 struct opc_handler_t {
214     /* invalid bits for instruction 1 (Rc(opcode) == 0) */
215     uint32_t inval1;
216     /* invalid bits for instruction 2 (Rc(opcode) == 1) */
217     uint32_t inval2;
218     /* instruction type */
219     uint64_t type;
220     /* extended instruction type */
221     uint64_t type2;
222     /* handler */
223     void (*handler)(DisasContext *ctx);
224 };
225 
226 /* SPR load/store helpers */
227 static inline void gen_load_spr(TCGv t, int reg)
228 {
229     tcg_gen_ld_tl(t, cpu_env, offsetof(CPUPPCState, spr[reg]));
230 }
231 
232 static inline void gen_store_spr(int reg, TCGv t)
233 {
234     tcg_gen_st_tl(t, cpu_env, offsetof(CPUPPCState, spr[reg]));
235 }
236 
237 static inline void gen_set_access_type(DisasContext *ctx, int access_type)
238 {
239     if (ctx->need_access_type && ctx->access_type != access_type) {
240         tcg_gen_movi_i32(cpu_access_type, access_type);
241         ctx->access_type = access_type;
242     }
243 }
244 
245 static inline void gen_update_nip(DisasContext *ctx, target_ulong nip)
246 {
247     if (NARROW_MODE(ctx)) {
248         nip = (uint32_t)nip;
249     }
250     tcg_gen_movi_tl(cpu_nip, nip);
251 }
252 
253 static void gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t error)
254 {
255     TCGv_i32 t0, t1;
256 
257     /*
258      * These are all synchronous exceptions, we set the PC back to the
259      * faulting instruction
260      */
261     gen_update_nip(ctx, ctx->cia);
262     t0 = tcg_const_i32(excp);
263     t1 = tcg_const_i32(error);
264     gen_helper_raise_exception_err(cpu_env, t0, t1);
265     tcg_temp_free_i32(t0);
266     tcg_temp_free_i32(t1);
267     ctx->base.is_jmp = DISAS_NORETURN;
268 }
269 
270 static void gen_exception(DisasContext *ctx, uint32_t excp)
271 {
272     TCGv_i32 t0;
273 
274     /*
275      * These are all synchronous exceptions, we set the PC back to the
276      * faulting instruction
277      */
278     gen_update_nip(ctx, ctx->cia);
279     t0 = tcg_const_i32(excp);
280     gen_helper_raise_exception(cpu_env, t0);
281     tcg_temp_free_i32(t0);
282     ctx->base.is_jmp = DISAS_NORETURN;
283 }
284 
285 static void gen_exception_nip(DisasContext *ctx, uint32_t excp,
286                               target_ulong nip)
287 {
288     TCGv_i32 t0;
289 
290     gen_update_nip(ctx, nip);
291     t0 = tcg_const_i32(excp);
292     gen_helper_raise_exception(cpu_env, t0);
293     tcg_temp_free_i32(t0);
294     ctx->base.is_jmp = DISAS_NORETURN;
295 }
296 
297 static void gen_icount_io_start(DisasContext *ctx)
298 {
299     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
300         gen_io_start();
301         /*
302          * An I/O instruction must be last in the TB.
303          * Chain to the next TB, and let the code from gen_tb_start
304          * decide if we need to return to the main loop.
305          * Doing this first also allows this value to be overridden.
306          */
307         ctx->base.is_jmp = DISAS_TOO_MANY;
308     }
309 }
310 
311 #if !defined(CONFIG_USER_ONLY)
312 static void gen_ppc_maybe_interrupt(DisasContext *ctx)
313 {
314     gen_icount_io_start(ctx);
315     gen_helper_ppc_maybe_interrupt(cpu_env);
316 }
317 #endif
318 
319 /*
320  * Tells the caller what is the appropriate exception to generate and prepares
321  * SPR registers for this exception.
322  *
323  * The exception can be either POWERPC_EXCP_TRACE (on most PowerPCs) or
324  * POWERPC_EXCP_DEBUG (on BookE).
325  */
326 static uint32_t gen_prep_dbgex(DisasContext *ctx)
327 {
328     if (ctx->flags & POWERPC_FLAG_DE) {
329         target_ulong dbsr = 0;
330         if (ctx->singlestep_enabled & CPU_SINGLE_STEP) {
331             dbsr = DBCR0_ICMP;
332         } else {
333             /* Must have been branch */
334             dbsr = DBCR0_BRT;
335         }
336         TCGv t0 = tcg_temp_new();
337         gen_load_spr(t0, SPR_BOOKE_DBSR);
338         tcg_gen_ori_tl(t0, t0, dbsr);
339         gen_store_spr(SPR_BOOKE_DBSR, t0);
340         tcg_temp_free(t0);
341         return POWERPC_EXCP_DEBUG;
342     } else {
343         return POWERPC_EXCP_TRACE;
344     }
345 }
346 
347 static void gen_debug_exception(DisasContext *ctx)
348 {
349     gen_helper_raise_exception(cpu_env, tcg_constant_i32(gen_prep_dbgex(ctx)));
350     ctx->base.is_jmp = DISAS_NORETURN;
351 }
352 
353 static inline void gen_inval_exception(DisasContext *ctx, uint32_t error)
354 {
355     /* Will be converted to program check if needed */
356     gen_exception_err(ctx, POWERPC_EXCP_HV_EMU, POWERPC_EXCP_INVAL | error);
357 }
358 
359 static inline void gen_priv_exception(DisasContext *ctx, uint32_t error)
360 {
361     gen_exception_err(ctx, POWERPC_EXCP_PROGRAM, POWERPC_EXCP_PRIV | error);
362 }
363 
364 static inline void gen_hvpriv_exception(DisasContext *ctx, uint32_t error)
365 {
366     /* Will be converted to program check if needed */
367     gen_exception_err(ctx, POWERPC_EXCP_HV_EMU, POWERPC_EXCP_PRIV | error);
368 }
369 
370 /*****************************************************************************/
371 /* SPR READ/WRITE CALLBACKS */
372 
373 void spr_noaccess(DisasContext *ctx, int gprn, int sprn)
374 {
375 #if 0
376     sprn = ((sprn >> 5) & 0x1F) | ((sprn & 0x1F) << 5);
377     printf("ERROR: try to access SPR %d !\n", sprn);
378 #endif
379 }
380 
381 /* #define PPC_DUMP_SPR_ACCESSES */
382 
383 /*
384  * Generic callbacks:
385  * do nothing but store/retrieve spr value
386  */
387 static void spr_load_dump_spr(int sprn)
388 {
389 #ifdef PPC_DUMP_SPR_ACCESSES
390     TCGv_i32 t0 = tcg_const_i32(sprn);
391     gen_helper_load_dump_spr(cpu_env, t0);
392     tcg_temp_free_i32(t0);
393 #endif
394 }
395 
396 void spr_read_generic(DisasContext *ctx, int gprn, int sprn)
397 {
398     gen_load_spr(cpu_gpr[gprn], sprn);
399     spr_load_dump_spr(sprn);
400 }
401 
402 static void spr_store_dump_spr(int sprn)
403 {
404 #ifdef PPC_DUMP_SPR_ACCESSES
405     TCGv_i32 t0 = tcg_const_i32(sprn);
406     gen_helper_store_dump_spr(cpu_env, t0);
407     tcg_temp_free_i32(t0);
408 #endif
409 }
410 
411 void spr_write_generic(DisasContext *ctx, int sprn, int gprn)
412 {
413     gen_store_spr(sprn, cpu_gpr[gprn]);
414     spr_store_dump_spr(sprn);
415 }
416 
417 void spr_write_CTRL(DisasContext *ctx, int sprn, int gprn)
418 {
419     spr_write_generic(ctx, sprn, gprn);
420 
421     /*
422      * SPR_CTRL writes must force a new translation block,
423      * allowing the PMU to calculate the run latch events with
424      * more accuracy.
425      */
426     ctx->base.is_jmp = DISAS_EXIT_UPDATE;
427 }
428 
429 #if !defined(CONFIG_USER_ONLY)
430 void spr_write_generic32(DisasContext *ctx, int sprn, int gprn)
431 {
432 #ifdef TARGET_PPC64
433     TCGv t0 = tcg_temp_new();
434     tcg_gen_ext32u_tl(t0, cpu_gpr[gprn]);
435     gen_store_spr(sprn, t0);
436     tcg_temp_free(t0);
437     spr_store_dump_spr(sprn);
438 #else
439     spr_write_generic(ctx, sprn, gprn);
440 #endif
441 }
442 
443 void spr_write_clear(DisasContext *ctx, int sprn, int gprn)
444 {
445     TCGv t0 = tcg_temp_new();
446     TCGv t1 = tcg_temp_new();
447     gen_load_spr(t0, sprn);
448     tcg_gen_neg_tl(t1, cpu_gpr[gprn]);
449     tcg_gen_and_tl(t0, t0, t1);
450     gen_store_spr(sprn, t0);
451     tcg_temp_free(t0);
452     tcg_temp_free(t1);
453 }
454 
455 void spr_access_nop(DisasContext *ctx, int sprn, int gprn)
456 {
457 }
458 
459 #endif
460 
461 /* SPR common to all PowerPC */
462 /* XER */
463 void spr_read_xer(DisasContext *ctx, int gprn, int sprn)
464 {
465     TCGv dst = cpu_gpr[gprn];
466     TCGv t0 = tcg_temp_new();
467     TCGv t1 = tcg_temp_new();
468     TCGv t2 = tcg_temp_new();
469     tcg_gen_mov_tl(dst, cpu_xer);
470     tcg_gen_shli_tl(t0, cpu_so, XER_SO);
471     tcg_gen_shli_tl(t1, cpu_ov, XER_OV);
472     tcg_gen_shli_tl(t2, cpu_ca, XER_CA);
473     tcg_gen_or_tl(t0, t0, t1);
474     tcg_gen_or_tl(dst, dst, t2);
475     tcg_gen_or_tl(dst, dst, t0);
476     if (is_isa300(ctx)) {
477         tcg_gen_shli_tl(t0, cpu_ov32, XER_OV32);
478         tcg_gen_or_tl(dst, dst, t0);
479         tcg_gen_shli_tl(t0, cpu_ca32, XER_CA32);
480         tcg_gen_or_tl(dst, dst, t0);
481     }
482     tcg_temp_free(t0);
483     tcg_temp_free(t1);
484     tcg_temp_free(t2);
485 }
486 
487 void spr_write_xer(DisasContext *ctx, int sprn, int gprn)
488 {
489     TCGv src = cpu_gpr[gprn];
490     /* Write all flags, while reading back check for isa300 */
491     tcg_gen_andi_tl(cpu_xer, src,
492                     ~((1u << XER_SO) |
493                       (1u << XER_OV) | (1u << XER_OV32) |
494                       (1u << XER_CA) | (1u << XER_CA32)));
495     tcg_gen_extract_tl(cpu_ov32, src, XER_OV32, 1);
496     tcg_gen_extract_tl(cpu_ca32, src, XER_CA32, 1);
497     tcg_gen_extract_tl(cpu_so, src, XER_SO, 1);
498     tcg_gen_extract_tl(cpu_ov, src, XER_OV, 1);
499     tcg_gen_extract_tl(cpu_ca, src, XER_CA, 1);
500 }
501 
502 /* LR */
503 void spr_read_lr(DisasContext *ctx, int gprn, int sprn)
504 {
505     tcg_gen_mov_tl(cpu_gpr[gprn], cpu_lr);
506 }
507 
508 void spr_write_lr(DisasContext *ctx, int sprn, int gprn)
509 {
510     tcg_gen_mov_tl(cpu_lr, cpu_gpr[gprn]);
511 }
512 
513 /* CFAR */
514 #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
515 void spr_read_cfar(DisasContext *ctx, int gprn, int sprn)
516 {
517     tcg_gen_mov_tl(cpu_gpr[gprn], cpu_cfar);
518 }
519 
520 void spr_write_cfar(DisasContext *ctx, int sprn, int gprn)
521 {
522     tcg_gen_mov_tl(cpu_cfar, cpu_gpr[gprn]);
523 }
524 #endif /* defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY) */
525 
526 /* CTR */
527 void spr_read_ctr(DisasContext *ctx, int gprn, int sprn)
528 {
529     tcg_gen_mov_tl(cpu_gpr[gprn], cpu_ctr);
530 }
531 
532 void spr_write_ctr(DisasContext *ctx, int sprn, int gprn)
533 {
534     tcg_gen_mov_tl(cpu_ctr, cpu_gpr[gprn]);
535 }
536 
537 /* User read access to SPR */
538 /* USPRx */
539 /* UMMCRx */
540 /* UPMCx */
541 /* USIA */
542 /* UDECR */
543 void spr_read_ureg(DisasContext *ctx, int gprn, int sprn)
544 {
545     gen_load_spr(cpu_gpr[gprn], sprn + 0x10);
546 }
547 
548 #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
549 void spr_write_ureg(DisasContext *ctx, int sprn, int gprn)
550 {
551     gen_store_spr(sprn + 0x10, cpu_gpr[gprn]);
552 }
553 #endif
554 
555 /* SPR common to all non-embedded PowerPC */
556 /* DECR */
557 #if !defined(CONFIG_USER_ONLY)
558 void spr_read_decr(DisasContext *ctx, int gprn, int sprn)
559 {
560     gen_icount_io_start(ctx);
561     gen_helper_load_decr(cpu_gpr[gprn], cpu_env);
562 }
563 
564 void spr_write_decr(DisasContext *ctx, int sprn, int gprn)
565 {
566     gen_icount_io_start(ctx);
567     gen_helper_store_decr(cpu_env, cpu_gpr[gprn]);
568 }
569 #endif
570 
571 /* SPR common to all non-embedded PowerPC, except 601 */
572 /* Time base */
573 void spr_read_tbl(DisasContext *ctx, int gprn, int sprn)
574 {
575     gen_icount_io_start(ctx);
576     gen_helper_load_tbl(cpu_gpr[gprn], cpu_env);
577 }
578 
579 void spr_read_tbu(DisasContext *ctx, int gprn, int sprn)
580 {
581     gen_icount_io_start(ctx);
582     gen_helper_load_tbu(cpu_gpr[gprn], cpu_env);
583 }
584 
585 void spr_read_atbl(DisasContext *ctx, int gprn, int sprn)
586 {
587     gen_helper_load_atbl(cpu_gpr[gprn], cpu_env);
588 }
589 
590 void spr_read_atbu(DisasContext *ctx, int gprn, int sprn)
591 {
592     gen_helper_load_atbu(cpu_gpr[gprn], cpu_env);
593 }
594 
595 #if !defined(CONFIG_USER_ONLY)
596 void spr_write_tbl(DisasContext *ctx, int sprn, int gprn)
597 {
598     gen_icount_io_start(ctx);
599     gen_helper_store_tbl(cpu_env, cpu_gpr[gprn]);
600 }
601 
602 void spr_write_tbu(DisasContext *ctx, int sprn, int gprn)
603 {
604     gen_icount_io_start(ctx);
605     gen_helper_store_tbu(cpu_env, cpu_gpr[gprn]);
606 }
607 
608 void spr_write_atbl(DisasContext *ctx, int sprn, int gprn)
609 {
610     gen_helper_store_atbl(cpu_env, cpu_gpr[gprn]);
611 }
612 
613 void spr_write_atbu(DisasContext *ctx, int sprn, int gprn)
614 {
615     gen_helper_store_atbu(cpu_env, cpu_gpr[gprn]);
616 }
617 
618 #if defined(TARGET_PPC64)
619 void spr_read_purr(DisasContext *ctx, int gprn, int sprn)
620 {
621     gen_icount_io_start(ctx);
622     gen_helper_load_purr(cpu_gpr[gprn], cpu_env);
623 }
624 
625 void spr_write_purr(DisasContext *ctx, int sprn, int gprn)
626 {
627     gen_icount_io_start(ctx);
628     gen_helper_store_purr(cpu_env, cpu_gpr[gprn]);
629 }
630 
631 /* HDECR */
632 void spr_read_hdecr(DisasContext *ctx, int gprn, int sprn)
633 {
634     gen_icount_io_start(ctx);
635     gen_helper_load_hdecr(cpu_gpr[gprn], cpu_env);
636 }
637 
638 void spr_write_hdecr(DisasContext *ctx, int sprn, int gprn)
639 {
640     gen_icount_io_start(ctx);
641     gen_helper_store_hdecr(cpu_env, cpu_gpr[gprn]);
642 }
643 
644 void spr_read_vtb(DisasContext *ctx, int gprn, int sprn)
645 {
646     gen_icount_io_start(ctx);
647     gen_helper_load_vtb(cpu_gpr[gprn], cpu_env);
648 }
649 
650 void spr_write_vtb(DisasContext *ctx, int sprn, int gprn)
651 {
652     gen_icount_io_start(ctx);
653     gen_helper_store_vtb(cpu_env, cpu_gpr[gprn]);
654 }
655 
656 void spr_write_tbu40(DisasContext *ctx, int sprn, int gprn)
657 {
658     gen_icount_io_start(ctx);
659     gen_helper_store_tbu40(cpu_env, cpu_gpr[gprn]);
660 }
661 
662 #endif
663 #endif
664 
665 #if !defined(CONFIG_USER_ONLY)
666 /* IBAT0U...IBAT0U */
667 /* IBAT0L...IBAT7L */
668 void spr_read_ibat(DisasContext *ctx, int gprn, int sprn)
669 {
670     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env,
671                   offsetof(CPUPPCState,
672                            IBAT[sprn & 1][(sprn - SPR_IBAT0U) / 2]));
673 }
674 
675 void spr_read_ibat_h(DisasContext *ctx, int gprn, int sprn)
676 {
677     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env,
678                   offsetof(CPUPPCState,
679                            IBAT[sprn & 1][((sprn - SPR_IBAT4U) / 2) + 4]));
680 }
681 
682 void spr_write_ibatu(DisasContext *ctx, int sprn, int gprn)
683 {
684     TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
685     gen_helper_store_ibatu(cpu_env, t0, cpu_gpr[gprn]);
686     tcg_temp_free_i32(t0);
687 }
688 
689 void spr_write_ibatu_h(DisasContext *ctx, int sprn, int gprn)
690 {
691     TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_IBAT4U) / 2) + 4);
692     gen_helper_store_ibatu(cpu_env, t0, cpu_gpr[gprn]);
693     tcg_temp_free_i32(t0);
694 }
695 
696 void spr_write_ibatl(DisasContext *ctx, int sprn, int gprn)
697 {
698     TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0L) / 2);
699     gen_helper_store_ibatl(cpu_env, t0, cpu_gpr[gprn]);
700     tcg_temp_free_i32(t0);
701 }
702 
703 void spr_write_ibatl_h(DisasContext *ctx, int sprn, int gprn)
704 {
705     TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_IBAT4L) / 2) + 4);
706     gen_helper_store_ibatl(cpu_env, t0, cpu_gpr[gprn]);
707     tcg_temp_free_i32(t0);
708 }
709 
710 /* DBAT0U...DBAT7U */
711 /* DBAT0L...DBAT7L */
712 void spr_read_dbat(DisasContext *ctx, int gprn, int sprn)
713 {
714     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env,
715                   offsetof(CPUPPCState,
716                            DBAT[sprn & 1][(sprn - SPR_DBAT0U) / 2]));
717 }
718 
719 void spr_read_dbat_h(DisasContext *ctx, int gprn, int sprn)
720 {
721     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env,
722                   offsetof(CPUPPCState,
723                            DBAT[sprn & 1][((sprn - SPR_DBAT4U) / 2) + 4]));
724 }
725 
726 void spr_write_dbatu(DisasContext *ctx, int sprn, int gprn)
727 {
728     TCGv_i32 t0 = tcg_const_i32((sprn - SPR_DBAT0U) / 2);
729     gen_helper_store_dbatu(cpu_env, t0, cpu_gpr[gprn]);
730     tcg_temp_free_i32(t0);
731 }
732 
733 void spr_write_dbatu_h(DisasContext *ctx, int sprn, int gprn)
734 {
735     TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_DBAT4U) / 2) + 4);
736     gen_helper_store_dbatu(cpu_env, t0, cpu_gpr[gprn]);
737     tcg_temp_free_i32(t0);
738 }
739 
740 void spr_write_dbatl(DisasContext *ctx, int sprn, int gprn)
741 {
742     TCGv_i32 t0 = tcg_const_i32((sprn - SPR_DBAT0L) / 2);
743     gen_helper_store_dbatl(cpu_env, t0, cpu_gpr[gprn]);
744     tcg_temp_free_i32(t0);
745 }
746 
747 void spr_write_dbatl_h(DisasContext *ctx, int sprn, int gprn)
748 {
749     TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_DBAT4L) / 2) + 4);
750     gen_helper_store_dbatl(cpu_env, t0, cpu_gpr[gprn]);
751     tcg_temp_free_i32(t0);
752 }
753 
754 /* SDR1 */
755 void spr_write_sdr1(DisasContext *ctx, int sprn, int gprn)
756 {
757     gen_helper_store_sdr1(cpu_env, cpu_gpr[gprn]);
758 }
759 
760 #if defined(TARGET_PPC64)
761 /* 64 bits PowerPC specific SPRs */
762 /* PIDR */
763 void spr_write_pidr(DisasContext *ctx, int sprn, int gprn)
764 {
765     gen_helper_store_pidr(cpu_env, cpu_gpr[gprn]);
766 }
767 
768 void spr_write_lpidr(DisasContext *ctx, int sprn, int gprn)
769 {
770     gen_helper_store_lpidr(cpu_env, cpu_gpr[gprn]);
771 }
772 
773 void spr_read_hior(DisasContext *ctx, int gprn, int sprn)
774 {
775     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, excp_prefix));
776 }
777 
778 void spr_write_hior(DisasContext *ctx, int sprn, int gprn)
779 {
780     TCGv t0 = tcg_temp_new();
781     tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0x3FFFFF00000ULL);
782     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_prefix));
783     tcg_temp_free(t0);
784 }
785 void spr_write_ptcr(DisasContext *ctx, int sprn, int gprn)
786 {
787     gen_helper_store_ptcr(cpu_env, cpu_gpr[gprn]);
788 }
789 
790 void spr_write_pcr(DisasContext *ctx, int sprn, int gprn)
791 {
792     gen_helper_store_pcr(cpu_env, cpu_gpr[gprn]);
793 }
794 
795 /* DPDES */
796 void spr_read_dpdes(DisasContext *ctx, int gprn, int sprn)
797 {
798     gen_helper_load_dpdes(cpu_gpr[gprn], cpu_env);
799 }
800 
801 void spr_write_dpdes(DisasContext *ctx, int sprn, int gprn)
802 {
803     gen_helper_store_dpdes(cpu_env, cpu_gpr[gprn]);
804 }
805 #endif
806 #endif
807 
808 /* PowerPC 40x specific registers */
809 #if !defined(CONFIG_USER_ONLY)
810 void spr_read_40x_pit(DisasContext *ctx, int gprn, int sprn)
811 {
812     gen_icount_io_start(ctx);
813     gen_helper_load_40x_pit(cpu_gpr[gprn], cpu_env);
814 }
815 
816 void spr_write_40x_pit(DisasContext *ctx, int sprn, int gprn)
817 {
818     gen_icount_io_start(ctx);
819     gen_helper_store_40x_pit(cpu_env, cpu_gpr[gprn]);
820 }
821 
822 void spr_write_40x_dbcr0(DisasContext *ctx, int sprn, int gprn)
823 {
824     gen_icount_io_start(ctx);
825     gen_store_spr(sprn, cpu_gpr[gprn]);
826     gen_helper_store_40x_dbcr0(cpu_env, cpu_gpr[gprn]);
827     /* We must stop translation as we may have rebooted */
828     ctx->base.is_jmp = DISAS_EXIT_UPDATE;
829 }
830 
831 void spr_write_40x_sler(DisasContext *ctx, int sprn, int gprn)
832 {
833     gen_icount_io_start(ctx);
834     gen_helper_store_40x_sler(cpu_env, cpu_gpr[gprn]);
835 }
836 
837 void spr_write_40x_tcr(DisasContext *ctx, int sprn, int gprn)
838 {
839     gen_icount_io_start(ctx);
840     gen_helper_store_40x_tcr(cpu_env, cpu_gpr[gprn]);
841 }
842 
843 void spr_write_40x_tsr(DisasContext *ctx, int sprn, int gprn)
844 {
845     gen_icount_io_start(ctx);
846     gen_helper_store_40x_tsr(cpu_env, cpu_gpr[gprn]);
847 }
848 
849 void spr_write_40x_pid(DisasContext *ctx, int sprn, int gprn)
850 {
851     TCGv t0 = tcg_temp_new();
852     tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0xFF);
853     gen_helper_store_40x_pid(cpu_env, t0);
854     tcg_temp_free(t0);
855 }
856 
857 void spr_write_booke_tcr(DisasContext *ctx, int sprn, int gprn)
858 {
859     gen_icount_io_start(ctx);
860     gen_helper_store_booke_tcr(cpu_env, cpu_gpr[gprn]);
861 }
862 
863 void spr_write_booke_tsr(DisasContext *ctx, int sprn, int gprn)
864 {
865     gen_icount_io_start(ctx);
866     gen_helper_store_booke_tsr(cpu_env, cpu_gpr[gprn]);
867 }
868 #endif
869 
870 /* PIR */
871 #if !defined(CONFIG_USER_ONLY)
872 void spr_write_pir(DisasContext *ctx, int sprn, int gprn)
873 {
874     TCGv t0 = tcg_temp_new();
875     tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0xF);
876     gen_store_spr(SPR_PIR, t0);
877     tcg_temp_free(t0);
878 }
879 #endif
880 
881 /* SPE specific registers */
882 void spr_read_spefscr(DisasContext *ctx, int gprn, int sprn)
883 {
884     TCGv_i32 t0 = tcg_temp_new_i32();
885     tcg_gen_ld_i32(t0, cpu_env, offsetof(CPUPPCState, spe_fscr));
886     tcg_gen_extu_i32_tl(cpu_gpr[gprn], t0);
887     tcg_temp_free_i32(t0);
888 }
889 
890 void spr_write_spefscr(DisasContext *ctx, int sprn, int gprn)
891 {
892     TCGv_i32 t0 = tcg_temp_new_i32();
893     tcg_gen_trunc_tl_i32(t0, cpu_gpr[gprn]);
894     tcg_gen_st_i32(t0, cpu_env, offsetof(CPUPPCState, spe_fscr));
895     tcg_temp_free_i32(t0);
896 }
897 
898 #if !defined(CONFIG_USER_ONLY)
899 /* Callback used to write the exception vector base */
900 void spr_write_excp_prefix(DisasContext *ctx, int sprn, int gprn)
901 {
902     TCGv t0 = tcg_temp_new();
903     tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUPPCState, ivpr_mask));
904     tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]);
905     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_prefix));
906     gen_store_spr(sprn, t0);
907     tcg_temp_free(t0);
908 }
909 
910 void spr_write_excp_vector(DisasContext *ctx, int sprn, int gprn)
911 {
912     int sprn_offs;
913 
914     if (sprn >= SPR_BOOKE_IVOR0 && sprn <= SPR_BOOKE_IVOR15) {
915         sprn_offs = sprn - SPR_BOOKE_IVOR0;
916     } else if (sprn >= SPR_BOOKE_IVOR32 && sprn <= SPR_BOOKE_IVOR37) {
917         sprn_offs = sprn - SPR_BOOKE_IVOR32 + 32;
918     } else if (sprn >= SPR_BOOKE_IVOR38 && sprn <= SPR_BOOKE_IVOR42) {
919         sprn_offs = sprn - SPR_BOOKE_IVOR38 + 38;
920     } else {
921         qemu_log_mask(LOG_GUEST_ERROR, "Trying to write an unknown exception"
922                       " vector 0x%03x\n", sprn);
923         gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
924         return;
925     }
926 
927     TCGv t0 = tcg_temp_new();
928     tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUPPCState, ivor_mask));
929     tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]);
930     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_vectors[sprn_offs]));
931     gen_store_spr(sprn, t0);
932     tcg_temp_free(t0);
933 }
934 #endif
935 
936 #ifdef TARGET_PPC64
937 #ifndef CONFIG_USER_ONLY
938 void spr_write_amr(DisasContext *ctx, int sprn, int gprn)
939 {
940     TCGv t0 = tcg_temp_new();
941     TCGv t1 = tcg_temp_new();
942     TCGv t2 = tcg_temp_new();
943 
944     /*
945      * Note, the HV=1 PR=0 case is handled earlier by simply using
946      * spr_write_generic for HV mode in the SPR table
947      */
948 
949     /* Build insertion mask into t1 based on context */
950     if (ctx->pr) {
951         gen_load_spr(t1, SPR_UAMOR);
952     } else {
953         gen_load_spr(t1, SPR_AMOR);
954     }
955 
956     /* Mask new bits into t2 */
957     tcg_gen_and_tl(t2, t1, cpu_gpr[gprn]);
958 
959     /* Load AMR and clear new bits in t0 */
960     gen_load_spr(t0, SPR_AMR);
961     tcg_gen_andc_tl(t0, t0, t1);
962 
963     /* Or'in new bits and write it out */
964     tcg_gen_or_tl(t0, t0, t2);
965     gen_store_spr(SPR_AMR, t0);
966     spr_store_dump_spr(SPR_AMR);
967 
968     tcg_temp_free(t0);
969     tcg_temp_free(t1);
970     tcg_temp_free(t2);
971 }
972 
973 void spr_write_uamor(DisasContext *ctx, int sprn, int gprn)
974 {
975     TCGv t0 = tcg_temp_new();
976     TCGv t1 = tcg_temp_new();
977     TCGv t2 = tcg_temp_new();
978 
979     /*
980      * Note, the HV=1 case is handled earlier by simply using
981      * spr_write_generic for HV mode in the SPR table
982      */
983 
984     /* Build insertion mask into t1 based on context */
985     gen_load_spr(t1, SPR_AMOR);
986 
987     /* Mask new bits into t2 */
988     tcg_gen_and_tl(t2, t1, cpu_gpr[gprn]);
989 
990     /* Load AMR and clear new bits in t0 */
991     gen_load_spr(t0, SPR_UAMOR);
992     tcg_gen_andc_tl(t0, t0, t1);
993 
994     /* Or'in new bits and write it out */
995     tcg_gen_or_tl(t0, t0, t2);
996     gen_store_spr(SPR_UAMOR, t0);
997     spr_store_dump_spr(SPR_UAMOR);
998 
999     tcg_temp_free(t0);
1000     tcg_temp_free(t1);
1001     tcg_temp_free(t2);
1002 }
1003 
1004 void spr_write_iamr(DisasContext *ctx, int sprn, int gprn)
1005 {
1006     TCGv t0 = tcg_temp_new();
1007     TCGv t1 = tcg_temp_new();
1008     TCGv t2 = tcg_temp_new();
1009 
1010     /*
1011      * Note, the HV=1 case is handled earlier by simply using
1012      * spr_write_generic for HV mode in the SPR table
1013      */
1014 
1015     /* Build insertion mask into t1 based on context */
1016     gen_load_spr(t1, SPR_AMOR);
1017 
1018     /* Mask new bits into t2 */
1019     tcg_gen_and_tl(t2, t1, cpu_gpr[gprn]);
1020 
1021     /* Load AMR and clear new bits in t0 */
1022     gen_load_spr(t0, SPR_IAMR);
1023     tcg_gen_andc_tl(t0, t0, t1);
1024 
1025     /* Or'in new bits and write it out */
1026     tcg_gen_or_tl(t0, t0, t2);
1027     gen_store_spr(SPR_IAMR, t0);
1028     spr_store_dump_spr(SPR_IAMR);
1029 
1030     tcg_temp_free(t0);
1031     tcg_temp_free(t1);
1032     tcg_temp_free(t2);
1033 }
1034 #endif
1035 #endif
1036 
1037 #ifndef CONFIG_USER_ONLY
1038 void spr_read_thrm(DisasContext *ctx, int gprn, int sprn)
1039 {
1040     gen_helper_fixup_thrm(cpu_env);
1041     gen_load_spr(cpu_gpr[gprn], sprn);
1042     spr_load_dump_spr(sprn);
1043 }
1044 #endif /* !CONFIG_USER_ONLY */
1045 
1046 #if !defined(CONFIG_USER_ONLY)
1047 void spr_write_e500_l1csr0(DisasContext *ctx, int sprn, int gprn)
1048 {
1049     TCGv t0 = tcg_temp_new();
1050 
1051     tcg_gen_andi_tl(t0, cpu_gpr[gprn], L1CSR0_DCE | L1CSR0_CPE);
1052     gen_store_spr(sprn, t0);
1053     tcg_temp_free(t0);
1054 }
1055 
1056 void spr_write_e500_l1csr1(DisasContext *ctx, int sprn, int gprn)
1057 {
1058     TCGv t0 = tcg_temp_new();
1059 
1060     tcg_gen_andi_tl(t0, cpu_gpr[gprn], L1CSR1_ICE | L1CSR1_CPE);
1061     gen_store_spr(sprn, t0);
1062     tcg_temp_free(t0);
1063 }
1064 
1065 void spr_write_e500_l2csr0(DisasContext *ctx, int sprn, int gprn)
1066 {
1067     TCGv t0 = tcg_temp_new();
1068 
1069     tcg_gen_andi_tl(t0, cpu_gpr[gprn],
1070                     ~(E500_L2CSR0_L2FI | E500_L2CSR0_L2FL | E500_L2CSR0_L2LFC));
1071     gen_store_spr(sprn, t0);
1072     tcg_temp_free(t0);
1073 }
1074 
1075 void spr_write_booke206_mmucsr0(DisasContext *ctx, int sprn, int gprn)
1076 {
1077     gen_helper_booke206_tlbflush(cpu_env, cpu_gpr[gprn]);
1078 }
1079 
1080 void spr_write_booke_pid(DisasContext *ctx, int sprn, int gprn)
1081 {
1082     TCGv_i32 t0 = tcg_const_i32(sprn);
1083     gen_helper_booke_setpid(cpu_env, t0, cpu_gpr[gprn]);
1084     tcg_temp_free_i32(t0);
1085 }
1086 void spr_write_eplc(DisasContext *ctx, int sprn, int gprn)
1087 {
1088     gen_helper_booke_set_eplc(cpu_env, cpu_gpr[gprn]);
1089 }
1090 void spr_write_epsc(DisasContext *ctx, int sprn, int gprn)
1091 {
1092     gen_helper_booke_set_epsc(cpu_env, cpu_gpr[gprn]);
1093 }
1094 
1095 #endif
1096 
1097 #if !defined(CONFIG_USER_ONLY)
1098 void spr_write_mas73(DisasContext *ctx, int sprn, int gprn)
1099 {
1100     TCGv val = tcg_temp_new();
1101     tcg_gen_ext32u_tl(val, cpu_gpr[gprn]);
1102     gen_store_spr(SPR_BOOKE_MAS3, val);
1103     tcg_gen_shri_tl(val, cpu_gpr[gprn], 32);
1104     gen_store_spr(SPR_BOOKE_MAS7, val);
1105     tcg_temp_free(val);
1106 }
1107 
1108 void spr_read_mas73(DisasContext *ctx, int gprn, int sprn)
1109 {
1110     TCGv mas7 = tcg_temp_new();
1111     TCGv mas3 = tcg_temp_new();
1112     gen_load_spr(mas7, SPR_BOOKE_MAS7);
1113     tcg_gen_shli_tl(mas7, mas7, 32);
1114     gen_load_spr(mas3, SPR_BOOKE_MAS3);
1115     tcg_gen_or_tl(cpu_gpr[gprn], mas3, mas7);
1116     tcg_temp_free(mas3);
1117     tcg_temp_free(mas7);
1118 }
1119 
1120 #endif
1121 
1122 #ifdef TARGET_PPC64
1123 static void gen_fscr_facility_check(DisasContext *ctx, int facility_sprn,
1124                                     int bit, int sprn, int cause)
1125 {
1126     TCGv_i32 t1 = tcg_const_i32(bit);
1127     TCGv_i32 t2 = tcg_const_i32(sprn);
1128     TCGv_i32 t3 = tcg_const_i32(cause);
1129 
1130     gen_helper_fscr_facility_check(cpu_env, t1, t2, t3);
1131 
1132     tcg_temp_free_i32(t3);
1133     tcg_temp_free_i32(t2);
1134     tcg_temp_free_i32(t1);
1135 }
1136 
1137 static void gen_msr_facility_check(DisasContext *ctx, int facility_sprn,
1138                                    int bit, int sprn, int cause)
1139 {
1140     TCGv_i32 t1 = tcg_const_i32(bit);
1141     TCGv_i32 t2 = tcg_const_i32(sprn);
1142     TCGv_i32 t3 = tcg_const_i32(cause);
1143 
1144     gen_helper_msr_facility_check(cpu_env, t1, t2, t3);
1145 
1146     tcg_temp_free_i32(t3);
1147     tcg_temp_free_i32(t2);
1148     tcg_temp_free_i32(t1);
1149 }
1150 
1151 void spr_read_prev_upper32(DisasContext *ctx, int gprn, int sprn)
1152 {
1153     TCGv spr_up = tcg_temp_new();
1154     TCGv spr = tcg_temp_new();
1155 
1156     gen_load_spr(spr, sprn - 1);
1157     tcg_gen_shri_tl(spr_up, spr, 32);
1158     tcg_gen_ext32u_tl(cpu_gpr[gprn], spr_up);
1159 
1160     tcg_temp_free(spr);
1161     tcg_temp_free(spr_up);
1162 }
1163 
1164 void spr_write_prev_upper32(DisasContext *ctx, int sprn, int gprn)
1165 {
1166     TCGv spr = tcg_temp_new();
1167 
1168     gen_load_spr(spr, sprn - 1);
1169     tcg_gen_deposit_tl(spr, spr, cpu_gpr[gprn], 32, 32);
1170     gen_store_spr(sprn - 1, spr);
1171 
1172     tcg_temp_free(spr);
1173 }
1174 
1175 #if !defined(CONFIG_USER_ONLY)
1176 void spr_write_hmer(DisasContext *ctx, int sprn, int gprn)
1177 {
1178     TCGv hmer = tcg_temp_new();
1179 
1180     gen_load_spr(hmer, sprn);
1181     tcg_gen_and_tl(hmer, cpu_gpr[gprn], hmer);
1182     gen_store_spr(sprn, hmer);
1183     spr_store_dump_spr(sprn);
1184     tcg_temp_free(hmer);
1185 }
1186 
1187 void spr_write_lpcr(DisasContext *ctx, int sprn, int gprn)
1188 {
1189     gen_helper_store_lpcr(cpu_env, cpu_gpr[gprn]);
1190 }
1191 #endif /* !defined(CONFIG_USER_ONLY) */
1192 
1193 void spr_read_tar(DisasContext *ctx, int gprn, int sprn)
1194 {
1195     gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_TAR, sprn, FSCR_IC_TAR);
1196     spr_read_generic(ctx, gprn, sprn);
1197 }
1198 
1199 void spr_write_tar(DisasContext *ctx, int sprn, int gprn)
1200 {
1201     gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_TAR, sprn, FSCR_IC_TAR);
1202     spr_write_generic(ctx, sprn, gprn);
1203 }
1204 
1205 void spr_read_tm(DisasContext *ctx, int gprn, int sprn)
1206 {
1207     gen_msr_facility_check(ctx, SPR_FSCR, MSR_TM, sprn, FSCR_IC_TM);
1208     spr_read_generic(ctx, gprn, sprn);
1209 }
1210 
1211 void spr_write_tm(DisasContext *ctx, int sprn, int gprn)
1212 {
1213     gen_msr_facility_check(ctx, SPR_FSCR, MSR_TM, sprn, FSCR_IC_TM);
1214     spr_write_generic(ctx, sprn, gprn);
1215 }
1216 
1217 void spr_read_tm_upper32(DisasContext *ctx, int gprn, int sprn)
1218 {
1219     gen_msr_facility_check(ctx, SPR_FSCR, MSR_TM, sprn, FSCR_IC_TM);
1220     spr_read_prev_upper32(ctx, gprn, sprn);
1221 }
1222 
1223 void spr_write_tm_upper32(DisasContext *ctx, int sprn, int gprn)
1224 {
1225     gen_msr_facility_check(ctx, SPR_FSCR, MSR_TM, sprn, FSCR_IC_TM);
1226     spr_write_prev_upper32(ctx, sprn, gprn);
1227 }
1228 
1229 void spr_read_ebb(DisasContext *ctx, int gprn, int sprn)
1230 {
1231     gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_EBB, sprn, FSCR_IC_EBB);
1232     spr_read_generic(ctx, gprn, sprn);
1233 }
1234 
1235 void spr_write_ebb(DisasContext *ctx, int sprn, int gprn)
1236 {
1237     gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_EBB, sprn, FSCR_IC_EBB);
1238     spr_write_generic(ctx, sprn, gprn);
1239 }
1240 
1241 void spr_read_ebb_upper32(DisasContext *ctx, int gprn, int sprn)
1242 {
1243     gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_EBB, sprn, FSCR_IC_EBB);
1244     spr_read_prev_upper32(ctx, gprn, sprn);
1245 }
1246 
1247 void spr_write_ebb_upper32(DisasContext *ctx, int sprn, int gprn)
1248 {
1249     gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_EBB, sprn, FSCR_IC_EBB);
1250     spr_write_prev_upper32(ctx, sprn, gprn);
1251 }
1252 #endif
1253 
1254 #define GEN_HANDLER(name, opc1, opc2, opc3, inval, type)                      \
1255 GEN_OPCODE(name, opc1, opc2, opc3, inval, type, PPC_NONE)
1256 
1257 #define GEN_HANDLER_E(name, opc1, opc2, opc3, inval, type, type2)             \
1258 GEN_OPCODE(name, opc1, opc2, opc3, inval, type, type2)
1259 
1260 #define GEN_HANDLER2(name, onam, opc1, opc2, opc3, inval, type)               \
1261 GEN_OPCODE2(name, onam, opc1, opc2, opc3, inval, type, PPC_NONE)
1262 
1263 #define GEN_HANDLER2_E(name, onam, opc1, opc2, opc3, inval, type, type2)      \
1264 GEN_OPCODE2(name, onam, opc1, opc2, opc3, inval, type, type2)
1265 
1266 #define GEN_HANDLER_E_2(name, opc1, opc2, opc3, opc4, inval, type, type2)     \
1267 GEN_OPCODE3(name, opc1, opc2, opc3, opc4, inval, type, type2)
1268 
1269 #define GEN_HANDLER2_E_2(name, onam, opc1, opc2, opc3, opc4, inval, typ, typ2) \
1270 GEN_OPCODE4(name, onam, opc1, opc2, opc3, opc4, inval, typ, typ2)
1271 
1272 typedef struct opcode_t {
1273     unsigned char opc1, opc2, opc3, opc4;
1274 #if HOST_LONG_BITS == 64 /* Explicitly align to 64 bits */
1275     unsigned char pad[4];
1276 #endif
1277     opc_handler_t handler;
1278     const char *oname;
1279 } opcode_t;
1280 
1281 static void gen_priv_opc(DisasContext *ctx)
1282 {
1283     gen_priv_exception(ctx, POWERPC_EXCP_PRIV_OPC);
1284 }
1285 
1286 /* Helpers for priv. check */
1287 #define GEN_PRIV(CTX)              \
1288     do {                           \
1289         gen_priv_opc(CTX); return; \
1290     } while (0)
1291 
1292 #if defined(CONFIG_USER_ONLY)
1293 #define CHK_HV(CTX) GEN_PRIV(CTX)
1294 #define CHK_SV(CTX) GEN_PRIV(CTX)
1295 #define CHK_HVRM(CTX) GEN_PRIV(CTX)
1296 #else
1297 #define CHK_HV(CTX)                         \
1298     do {                                    \
1299         if (unlikely(ctx->pr || !ctx->hv)) {\
1300             GEN_PRIV(CTX);                  \
1301         }                                   \
1302     } while (0)
1303 #define CHK_SV(CTX)              \
1304     do {                         \
1305         if (unlikely(ctx->pr)) { \
1306             GEN_PRIV(CTX);       \
1307         }                        \
1308     } while (0)
1309 #define CHK_HVRM(CTX)                                   \
1310     do {                                                \
1311         if (unlikely(ctx->pr || !ctx->hv || ctx->dr)) { \
1312             GEN_PRIV(CTX);                              \
1313         }                                               \
1314     } while (0)
1315 #endif
1316 
1317 #define CHK_NONE(CTX)
1318 
1319 /*****************************************************************************/
1320 /* PowerPC instructions table                                                */
1321 
1322 #define GEN_OPCODE(name, op1, op2, op3, invl, _typ, _typ2)                    \
1323 {                                                                             \
1324     .opc1 = op1,                                                              \
1325     .opc2 = op2,                                                              \
1326     .opc3 = op3,                                                              \
1327     .opc4 = 0xff,                                                             \
1328     .handler = {                                                              \
1329         .inval1  = invl,                                                      \
1330         .type = _typ,                                                         \
1331         .type2 = _typ2,                                                       \
1332         .handler = &gen_##name,                                               \
1333     },                                                                        \
1334     .oname = stringify(name),                                                 \
1335 }
1336 #define GEN_OPCODE_DUAL(name, op1, op2, op3, invl1, invl2, _typ, _typ2)       \
1337 {                                                                             \
1338     .opc1 = op1,                                                              \
1339     .opc2 = op2,                                                              \
1340     .opc3 = op3,                                                              \
1341     .opc4 = 0xff,                                                             \
1342     .handler = {                                                              \
1343         .inval1  = invl1,                                                     \
1344         .inval2  = invl2,                                                     \
1345         .type = _typ,                                                         \
1346         .type2 = _typ2,                                                       \
1347         .handler = &gen_##name,                                               \
1348     },                                                                        \
1349     .oname = stringify(name),                                                 \
1350 }
1351 #define GEN_OPCODE2(name, onam, op1, op2, op3, invl, _typ, _typ2)             \
1352 {                                                                             \
1353     .opc1 = op1,                                                              \
1354     .opc2 = op2,                                                              \
1355     .opc3 = op3,                                                              \
1356     .opc4 = 0xff,                                                             \
1357     .handler = {                                                              \
1358         .inval1  = invl,                                                      \
1359         .type = _typ,                                                         \
1360         .type2 = _typ2,                                                       \
1361         .handler = &gen_##name,                                               \
1362     },                                                                        \
1363     .oname = onam,                                                            \
1364 }
1365 #define GEN_OPCODE3(name, op1, op2, op3, op4, invl, _typ, _typ2)              \
1366 {                                                                             \
1367     .opc1 = op1,                                                              \
1368     .opc2 = op2,                                                              \
1369     .opc3 = op3,                                                              \
1370     .opc4 = op4,                                                              \
1371     .handler = {                                                              \
1372         .inval1  = invl,                                                      \
1373         .type = _typ,                                                         \
1374         .type2 = _typ2,                                                       \
1375         .handler = &gen_##name,                                               \
1376     },                                                                        \
1377     .oname = stringify(name),                                                 \
1378 }
1379 #define GEN_OPCODE4(name, onam, op1, op2, op3, op4, invl, _typ, _typ2)        \
1380 {                                                                             \
1381     .opc1 = op1,                                                              \
1382     .opc2 = op2,                                                              \
1383     .opc3 = op3,                                                              \
1384     .opc4 = op4,                                                              \
1385     .handler = {                                                              \
1386         .inval1  = invl,                                                      \
1387         .type = _typ,                                                         \
1388         .type2 = _typ2,                                                       \
1389         .handler = &gen_##name,                                               \
1390     },                                                                        \
1391     .oname = onam,                                                            \
1392 }
1393 
1394 /* Invalid instruction */
1395 static void gen_invalid(DisasContext *ctx)
1396 {
1397     gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
1398 }
1399 
1400 static opc_handler_t invalid_handler = {
1401     .inval1  = 0xFFFFFFFF,
1402     .inval2  = 0xFFFFFFFF,
1403     .type    = PPC_NONE,
1404     .type2   = PPC_NONE,
1405     .handler = gen_invalid,
1406 };
1407 
1408 /***                           Integer comparison                          ***/
1409 
1410 static inline void gen_op_cmp(TCGv arg0, TCGv arg1, int s, int crf)
1411 {
1412     TCGv t0 = tcg_temp_new();
1413     TCGv t1 = tcg_temp_new();
1414     TCGv_i32 t = tcg_temp_new_i32();
1415 
1416     tcg_gen_movi_tl(t0, CRF_EQ);
1417     tcg_gen_movi_tl(t1, CRF_LT);
1418     tcg_gen_movcond_tl((s ? TCG_COND_LT : TCG_COND_LTU),
1419                        t0, arg0, arg1, t1, t0);
1420     tcg_gen_movi_tl(t1, CRF_GT);
1421     tcg_gen_movcond_tl((s ? TCG_COND_GT : TCG_COND_GTU),
1422                        t0, arg0, arg1, t1, t0);
1423 
1424     tcg_gen_trunc_tl_i32(t, t0);
1425     tcg_gen_trunc_tl_i32(cpu_crf[crf], cpu_so);
1426     tcg_gen_or_i32(cpu_crf[crf], cpu_crf[crf], t);
1427 
1428     tcg_temp_free(t0);
1429     tcg_temp_free(t1);
1430     tcg_temp_free_i32(t);
1431 }
1432 
1433 static inline void gen_op_cmpi(TCGv arg0, target_ulong arg1, int s, int crf)
1434 {
1435     TCGv t0 = tcg_const_tl(arg1);
1436     gen_op_cmp(arg0, t0, s, crf);
1437     tcg_temp_free(t0);
1438 }
1439 
1440 static inline void gen_op_cmp32(TCGv arg0, TCGv arg1, int s, int crf)
1441 {
1442     TCGv t0, t1;
1443     t0 = tcg_temp_new();
1444     t1 = tcg_temp_new();
1445     if (s) {
1446         tcg_gen_ext32s_tl(t0, arg0);
1447         tcg_gen_ext32s_tl(t1, arg1);
1448     } else {
1449         tcg_gen_ext32u_tl(t0, arg0);
1450         tcg_gen_ext32u_tl(t1, arg1);
1451     }
1452     gen_op_cmp(t0, t1, s, crf);
1453     tcg_temp_free(t1);
1454     tcg_temp_free(t0);
1455 }
1456 
1457 static inline void gen_op_cmpi32(TCGv arg0, target_ulong arg1, int s, int crf)
1458 {
1459     TCGv t0 = tcg_const_tl(arg1);
1460     gen_op_cmp32(arg0, t0, s, crf);
1461     tcg_temp_free(t0);
1462 }
1463 
1464 static inline void gen_set_Rc0(DisasContext *ctx, TCGv reg)
1465 {
1466     if (NARROW_MODE(ctx)) {
1467         gen_op_cmpi32(reg, 0, 1, 0);
1468     } else {
1469         gen_op_cmpi(reg, 0, 1, 0);
1470     }
1471 }
1472 
1473 /* cmprb - range comparison: isupper, isaplha, islower*/
1474 static void gen_cmprb(DisasContext *ctx)
1475 {
1476     TCGv_i32 src1 = tcg_temp_new_i32();
1477     TCGv_i32 src2 = tcg_temp_new_i32();
1478     TCGv_i32 src2lo = tcg_temp_new_i32();
1479     TCGv_i32 src2hi = tcg_temp_new_i32();
1480     TCGv_i32 crf = cpu_crf[crfD(ctx->opcode)];
1481 
1482     tcg_gen_trunc_tl_i32(src1, cpu_gpr[rA(ctx->opcode)]);
1483     tcg_gen_trunc_tl_i32(src2, cpu_gpr[rB(ctx->opcode)]);
1484 
1485     tcg_gen_andi_i32(src1, src1, 0xFF);
1486     tcg_gen_ext8u_i32(src2lo, src2);
1487     tcg_gen_shri_i32(src2, src2, 8);
1488     tcg_gen_ext8u_i32(src2hi, src2);
1489 
1490     tcg_gen_setcond_i32(TCG_COND_LEU, src2lo, src2lo, src1);
1491     tcg_gen_setcond_i32(TCG_COND_LEU, src2hi, src1, src2hi);
1492     tcg_gen_and_i32(crf, src2lo, src2hi);
1493 
1494     if (ctx->opcode & 0x00200000) {
1495         tcg_gen_shri_i32(src2, src2, 8);
1496         tcg_gen_ext8u_i32(src2lo, src2);
1497         tcg_gen_shri_i32(src2, src2, 8);
1498         tcg_gen_ext8u_i32(src2hi, src2);
1499         tcg_gen_setcond_i32(TCG_COND_LEU, src2lo, src2lo, src1);
1500         tcg_gen_setcond_i32(TCG_COND_LEU, src2hi, src1, src2hi);
1501         tcg_gen_and_i32(src2lo, src2lo, src2hi);
1502         tcg_gen_or_i32(crf, crf, src2lo);
1503     }
1504     tcg_gen_shli_i32(crf, crf, CRF_GT_BIT);
1505     tcg_temp_free_i32(src1);
1506     tcg_temp_free_i32(src2);
1507     tcg_temp_free_i32(src2lo);
1508     tcg_temp_free_i32(src2hi);
1509 }
1510 
1511 #if defined(TARGET_PPC64)
1512 /* cmpeqb */
1513 static void gen_cmpeqb(DisasContext *ctx)
1514 {
1515     gen_helper_cmpeqb(cpu_crf[crfD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)],
1516                       cpu_gpr[rB(ctx->opcode)]);
1517 }
1518 #endif
1519 
1520 /* isel (PowerPC 2.03 specification) */
1521 static void gen_isel(DisasContext *ctx)
1522 {
1523     uint32_t bi = rC(ctx->opcode);
1524     uint32_t mask = 0x08 >> (bi & 0x03);
1525     TCGv t0 = tcg_temp_new();
1526     TCGv zr;
1527 
1528     tcg_gen_extu_i32_tl(t0, cpu_crf[bi >> 2]);
1529     tcg_gen_andi_tl(t0, t0, mask);
1530 
1531     zr = tcg_const_tl(0);
1532     tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rD(ctx->opcode)], t0, zr,
1533                        rA(ctx->opcode) ? cpu_gpr[rA(ctx->opcode)] : zr,
1534                        cpu_gpr[rB(ctx->opcode)]);
1535     tcg_temp_free(zr);
1536     tcg_temp_free(t0);
1537 }
1538 
1539 /* cmpb: PowerPC 2.05 specification */
1540 static void gen_cmpb(DisasContext *ctx)
1541 {
1542     gen_helper_cmpb(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)],
1543                     cpu_gpr[rB(ctx->opcode)]);
1544 }
1545 
1546 /***                           Integer arithmetic                          ***/
1547 
1548 static inline void gen_op_arith_compute_ov(DisasContext *ctx, TCGv arg0,
1549                                            TCGv arg1, TCGv arg2, int sub)
1550 {
1551     TCGv t0 = tcg_temp_new();
1552 
1553     tcg_gen_xor_tl(cpu_ov, arg0, arg2);
1554     tcg_gen_xor_tl(t0, arg1, arg2);
1555     if (sub) {
1556         tcg_gen_and_tl(cpu_ov, cpu_ov, t0);
1557     } else {
1558         tcg_gen_andc_tl(cpu_ov, cpu_ov, t0);
1559     }
1560     tcg_temp_free(t0);
1561     if (NARROW_MODE(ctx)) {
1562         tcg_gen_extract_tl(cpu_ov, cpu_ov, 31, 1);
1563         if (is_isa300(ctx)) {
1564             tcg_gen_mov_tl(cpu_ov32, cpu_ov);
1565         }
1566     } else {
1567         if (is_isa300(ctx)) {
1568             tcg_gen_extract_tl(cpu_ov32, cpu_ov, 31, 1);
1569         }
1570         tcg_gen_extract_tl(cpu_ov, cpu_ov, TARGET_LONG_BITS - 1, 1);
1571     }
1572     tcg_gen_or_tl(cpu_so, cpu_so, cpu_ov);
1573 }
1574 
1575 static inline void gen_op_arith_compute_ca32(DisasContext *ctx,
1576                                              TCGv res, TCGv arg0, TCGv arg1,
1577                                              TCGv ca32, int sub)
1578 {
1579     TCGv t0;
1580 
1581     if (!is_isa300(ctx)) {
1582         return;
1583     }
1584 
1585     t0 = tcg_temp_new();
1586     if (sub) {
1587         tcg_gen_eqv_tl(t0, arg0, arg1);
1588     } else {
1589         tcg_gen_xor_tl(t0, arg0, arg1);
1590     }
1591     tcg_gen_xor_tl(t0, t0, res);
1592     tcg_gen_extract_tl(ca32, t0, 32, 1);
1593     tcg_temp_free(t0);
1594 }
1595 
1596 /* Common add function */
1597 static inline void gen_op_arith_add(DisasContext *ctx, TCGv ret, TCGv arg1,
1598                                     TCGv arg2, TCGv ca, TCGv ca32,
1599                                     bool add_ca, bool compute_ca,
1600                                     bool compute_ov, bool compute_rc0)
1601 {
1602     TCGv t0 = ret;
1603 
1604     if (compute_ca || compute_ov) {
1605         t0 = tcg_temp_new();
1606     }
1607 
1608     if (compute_ca) {
1609         if (NARROW_MODE(ctx)) {
1610             /*
1611              * Caution: a non-obvious corner case of the spec is that
1612              * we must produce the *entire* 64-bit addition, but
1613              * produce the carry into bit 32.
1614              */
1615             TCGv t1 = tcg_temp_new();
1616             tcg_gen_xor_tl(t1, arg1, arg2);        /* add without carry */
1617             tcg_gen_add_tl(t0, arg1, arg2);
1618             if (add_ca) {
1619                 tcg_gen_add_tl(t0, t0, ca);
1620             }
1621             tcg_gen_xor_tl(ca, t0, t1);        /* bits changed w/ carry */
1622             tcg_temp_free(t1);
1623             tcg_gen_extract_tl(ca, ca, 32, 1);
1624             if (is_isa300(ctx)) {
1625                 tcg_gen_mov_tl(ca32, ca);
1626             }
1627         } else {
1628             TCGv zero = tcg_const_tl(0);
1629             if (add_ca) {
1630                 tcg_gen_add2_tl(t0, ca, arg1, zero, ca, zero);
1631                 tcg_gen_add2_tl(t0, ca, t0, ca, arg2, zero);
1632             } else {
1633                 tcg_gen_add2_tl(t0, ca, arg1, zero, arg2, zero);
1634             }
1635             gen_op_arith_compute_ca32(ctx, t0, arg1, arg2, ca32, 0);
1636             tcg_temp_free(zero);
1637         }
1638     } else {
1639         tcg_gen_add_tl(t0, arg1, arg2);
1640         if (add_ca) {
1641             tcg_gen_add_tl(t0, t0, ca);
1642         }
1643     }
1644 
1645     if (compute_ov) {
1646         gen_op_arith_compute_ov(ctx, t0, arg1, arg2, 0);
1647     }
1648     if (unlikely(compute_rc0)) {
1649         gen_set_Rc0(ctx, t0);
1650     }
1651 
1652     if (t0 != ret) {
1653         tcg_gen_mov_tl(ret, t0);
1654         tcg_temp_free(t0);
1655     }
1656 }
1657 /* Add functions with two operands */
1658 #define GEN_INT_ARITH_ADD(name, opc3, ca, add_ca, compute_ca, compute_ov)     \
1659 static void glue(gen_, name)(DisasContext *ctx)                               \
1660 {                                                                             \
1661     gen_op_arith_add(ctx, cpu_gpr[rD(ctx->opcode)],                           \
1662                      cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)],      \
1663                      ca, glue(ca, 32),                                        \
1664                      add_ca, compute_ca, compute_ov, Rc(ctx->opcode));        \
1665 }
1666 /* Add functions with one operand and one immediate */
1667 #define GEN_INT_ARITH_ADD_CONST(name, opc3, const_val, ca,                    \
1668                                 add_ca, compute_ca, compute_ov)               \
1669 static void glue(gen_, name)(DisasContext *ctx)                               \
1670 {                                                                             \
1671     TCGv t0 = tcg_const_tl(const_val);                                        \
1672     gen_op_arith_add(ctx, cpu_gpr[rD(ctx->opcode)],                           \
1673                      cpu_gpr[rA(ctx->opcode)], t0,                            \
1674                      ca, glue(ca, 32),                                        \
1675                      add_ca, compute_ca, compute_ov, Rc(ctx->opcode));        \
1676     tcg_temp_free(t0);                                                        \
1677 }
1678 
1679 /* add  add.  addo  addo. */
1680 GEN_INT_ARITH_ADD(add, 0x08, cpu_ca, 0, 0, 0)
1681 GEN_INT_ARITH_ADD(addo, 0x18, cpu_ca, 0, 0, 1)
1682 /* addc  addc.  addco  addco. */
1683 GEN_INT_ARITH_ADD(addc, 0x00, cpu_ca, 0, 1, 0)
1684 GEN_INT_ARITH_ADD(addco, 0x10, cpu_ca, 0, 1, 1)
1685 /* adde  adde.  addeo  addeo. */
1686 GEN_INT_ARITH_ADD(adde, 0x04, cpu_ca, 1, 1, 0)
1687 GEN_INT_ARITH_ADD(addeo, 0x14, cpu_ca, 1, 1, 1)
1688 /* addme  addme.  addmeo  addmeo.  */
1689 GEN_INT_ARITH_ADD_CONST(addme, 0x07, -1LL, cpu_ca, 1, 1, 0)
1690 GEN_INT_ARITH_ADD_CONST(addmeo, 0x17, -1LL, cpu_ca, 1, 1, 1)
1691 /* addex */
1692 GEN_INT_ARITH_ADD(addex, 0x05, cpu_ov, 1, 1, 0);
1693 /* addze  addze.  addzeo  addzeo.*/
1694 GEN_INT_ARITH_ADD_CONST(addze, 0x06, 0, cpu_ca, 1, 1, 0)
1695 GEN_INT_ARITH_ADD_CONST(addzeo, 0x16, 0, cpu_ca, 1, 1, 1)
1696 /* addic  addic.*/
1697 static inline void gen_op_addic(DisasContext *ctx, bool compute_rc0)
1698 {
1699     TCGv c = tcg_const_tl(SIMM(ctx->opcode));
1700     gen_op_arith_add(ctx, cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)],
1701                      c, cpu_ca, cpu_ca32, 0, 1, 0, compute_rc0);
1702     tcg_temp_free(c);
1703 }
1704 
1705 static void gen_addic(DisasContext *ctx)
1706 {
1707     gen_op_addic(ctx, 0);
1708 }
1709 
1710 static void gen_addic_(DisasContext *ctx)
1711 {
1712     gen_op_addic(ctx, 1);
1713 }
1714 
1715 static inline void gen_op_arith_divw(DisasContext *ctx, TCGv ret, TCGv arg1,
1716                                      TCGv arg2, int sign, int compute_ov)
1717 {
1718     TCGv_i32 t0 = tcg_temp_new_i32();
1719     TCGv_i32 t1 = tcg_temp_new_i32();
1720     TCGv_i32 t2 = tcg_temp_new_i32();
1721     TCGv_i32 t3 = tcg_temp_new_i32();
1722 
1723     tcg_gen_trunc_tl_i32(t0, arg1);
1724     tcg_gen_trunc_tl_i32(t1, arg2);
1725     if (sign) {
1726         tcg_gen_setcondi_i32(TCG_COND_EQ, t2, t0, INT_MIN);
1727         tcg_gen_setcondi_i32(TCG_COND_EQ, t3, t1, -1);
1728         tcg_gen_and_i32(t2, t2, t3);
1729         tcg_gen_setcondi_i32(TCG_COND_EQ, t3, t1, 0);
1730         tcg_gen_or_i32(t2, t2, t3);
1731         tcg_gen_movi_i32(t3, 0);
1732         tcg_gen_movcond_i32(TCG_COND_NE, t1, t2, t3, t2, t1);
1733         tcg_gen_div_i32(t3, t0, t1);
1734         tcg_gen_extu_i32_tl(ret, t3);
1735     } else {
1736         tcg_gen_setcondi_i32(TCG_COND_EQ, t2, t1, 0);
1737         tcg_gen_movi_i32(t3, 0);
1738         tcg_gen_movcond_i32(TCG_COND_NE, t1, t2, t3, t2, t1);
1739         tcg_gen_divu_i32(t3, t0, t1);
1740         tcg_gen_extu_i32_tl(ret, t3);
1741     }
1742     if (compute_ov) {
1743         tcg_gen_extu_i32_tl(cpu_ov, t2);
1744         if (is_isa300(ctx)) {
1745             tcg_gen_extu_i32_tl(cpu_ov32, t2);
1746         }
1747         tcg_gen_or_tl(cpu_so, cpu_so, cpu_ov);
1748     }
1749     tcg_temp_free_i32(t0);
1750     tcg_temp_free_i32(t1);
1751     tcg_temp_free_i32(t2);
1752     tcg_temp_free_i32(t3);
1753 
1754     if (unlikely(Rc(ctx->opcode) != 0)) {
1755         gen_set_Rc0(ctx, ret);
1756     }
1757 }
1758 /* Div functions */
1759 #define GEN_INT_ARITH_DIVW(name, opc3, sign, compute_ov)                      \
1760 static void glue(gen_, name)(DisasContext *ctx)                               \
1761 {                                                                             \
1762     gen_op_arith_divw(ctx, cpu_gpr[rD(ctx->opcode)],                          \
1763                      cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)],      \
1764                      sign, compute_ov);                                       \
1765 }
1766 /* divwu  divwu.  divwuo  divwuo.   */
1767 GEN_INT_ARITH_DIVW(divwu, 0x0E, 0, 0);
1768 GEN_INT_ARITH_DIVW(divwuo, 0x1E, 0, 1);
1769 /* divw  divw.  divwo  divwo.   */
1770 GEN_INT_ARITH_DIVW(divw, 0x0F, 1, 0);
1771 GEN_INT_ARITH_DIVW(divwo, 0x1F, 1, 1);
1772 
1773 /* div[wd]eu[o][.] */
1774 #define GEN_DIVE(name, hlpr, compute_ov)                                      \
1775 static void gen_##name(DisasContext *ctx)                                     \
1776 {                                                                             \
1777     TCGv_i32 t0 = tcg_const_i32(compute_ov);                                  \
1778     gen_helper_##hlpr(cpu_gpr[rD(ctx->opcode)], cpu_env,                      \
1779                      cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)], t0); \
1780     tcg_temp_free_i32(t0);                                                    \
1781     if (unlikely(Rc(ctx->opcode) != 0)) {                                     \
1782         gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]);                           \
1783     }                                                                         \
1784 }
1785 
1786 GEN_DIVE(divweu, divweu, 0);
1787 GEN_DIVE(divweuo, divweu, 1);
1788 GEN_DIVE(divwe, divwe, 0);
1789 GEN_DIVE(divweo, divwe, 1);
1790 
1791 #if defined(TARGET_PPC64)
1792 static inline void gen_op_arith_divd(DisasContext *ctx, TCGv ret, TCGv arg1,
1793                                      TCGv arg2, int sign, int compute_ov)
1794 {
1795     TCGv_i64 t0 = tcg_temp_new_i64();
1796     TCGv_i64 t1 = tcg_temp_new_i64();
1797     TCGv_i64 t2 = tcg_temp_new_i64();
1798     TCGv_i64 t3 = tcg_temp_new_i64();
1799 
1800     tcg_gen_mov_i64(t0, arg1);
1801     tcg_gen_mov_i64(t1, arg2);
1802     if (sign) {
1803         tcg_gen_setcondi_i64(TCG_COND_EQ, t2, t0, INT64_MIN);
1804         tcg_gen_setcondi_i64(TCG_COND_EQ, t3, t1, -1);
1805         tcg_gen_and_i64(t2, t2, t3);
1806         tcg_gen_setcondi_i64(TCG_COND_EQ, t3, t1, 0);
1807         tcg_gen_or_i64(t2, t2, t3);
1808         tcg_gen_movi_i64(t3, 0);
1809         tcg_gen_movcond_i64(TCG_COND_NE, t1, t2, t3, t2, t1);
1810         tcg_gen_div_i64(ret, t0, t1);
1811     } else {
1812         tcg_gen_setcondi_i64(TCG_COND_EQ, t2, t1, 0);
1813         tcg_gen_movi_i64(t3, 0);
1814         tcg_gen_movcond_i64(TCG_COND_NE, t1, t2, t3, t2, t1);
1815         tcg_gen_divu_i64(ret, t0, t1);
1816     }
1817     if (compute_ov) {
1818         tcg_gen_mov_tl(cpu_ov, t2);
1819         if (is_isa300(ctx)) {
1820             tcg_gen_mov_tl(cpu_ov32, t2);
1821         }
1822         tcg_gen_or_tl(cpu_so, cpu_so, cpu_ov);
1823     }
1824     tcg_temp_free_i64(t0);
1825     tcg_temp_free_i64(t1);
1826     tcg_temp_free_i64(t2);
1827     tcg_temp_free_i64(t3);
1828 
1829     if (unlikely(Rc(ctx->opcode) != 0)) {
1830         gen_set_Rc0(ctx, ret);
1831     }
1832 }
1833 
1834 #define GEN_INT_ARITH_DIVD(name, opc3, sign, compute_ov)                      \
1835 static void glue(gen_, name)(DisasContext *ctx)                               \
1836 {                                                                             \
1837     gen_op_arith_divd(ctx, cpu_gpr[rD(ctx->opcode)],                          \
1838                       cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)],     \
1839                       sign, compute_ov);                                      \
1840 }
1841 /* divdu  divdu.  divduo  divduo.   */
1842 GEN_INT_ARITH_DIVD(divdu, 0x0E, 0, 0);
1843 GEN_INT_ARITH_DIVD(divduo, 0x1E, 0, 1);
1844 /* divd  divd.  divdo  divdo.   */
1845 GEN_INT_ARITH_DIVD(divd, 0x0F, 1, 0);
1846 GEN_INT_ARITH_DIVD(divdo, 0x1F, 1, 1);
1847 
1848 GEN_DIVE(divdeu, divdeu, 0);
1849 GEN_DIVE(divdeuo, divdeu, 1);
1850 GEN_DIVE(divde, divde, 0);
1851 GEN_DIVE(divdeo, divde, 1);
1852 #endif
1853 
1854 static inline void gen_op_arith_modw(DisasContext *ctx, TCGv ret, TCGv arg1,
1855                                      TCGv arg2, int sign)
1856 {
1857     TCGv_i32 t0 = tcg_temp_new_i32();
1858     TCGv_i32 t1 = tcg_temp_new_i32();
1859 
1860     tcg_gen_trunc_tl_i32(t0, arg1);
1861     tcg_gen_trunc_tl_i32(t1, arg2);
1862     if (sign) {
1863         TCGv_i32 t2 = tcg_temp_new_i32();
1864         TCGv_i32 t3 = tcg_temp_new_i32();
1865         tcg_gen_setcondi_i32(TCG_COND_EQ, t2, t0, INT_MIN);
1866         tcg_gen_setcondi_i32(TCG_COND_EQ, t3, t1, -1);
1867         tcg_gen_and_i32(t2, t2, t3);
1868         tcg_gen_setcondi_i32(TCG_COND_EQ, t3, t1, 0);
1869         tcg_gen_or_i32(t2, t2, t3);
1870         tcg_gen_movi_i32(t3, 0);
1871         tcg_gen_movcond_i32(TCG_COND_NE, t1, t2, t3, t2, t1);
1872         tcg_gen_rem_i32(t3, t0, t1);
1873         tcg_gen_ext_i32_tl(ret, t3);
1874         tcg_temp_free_i32(t2);
1875         tcg_temp_free_i32(t3);
1876     } else {
1877         TCGv_i32 t2 = tcg_const_i32(1);
1878         TCGv_i32 t3 = tcg_const_i32(0);
1879         tcg_gen_movcond_i32(TCG_COND_EQ, t1, t1, t3, t2, t1);
1880         tcg_gen_remu_i32(t3, t0, t1);
1881         tcg_gen_extu_i32_tl(ret, t3);
1882         tcg_temp_free_i32(t2);
1883         tcg_temp_free_i32(t3);
1884     }
1885     tcg_temp_free_i32(t0);
1886     tcg_temp_free_i32(t1);
1887 }
1888 
1889 #define GEN_INT_ARITH_MODW(name, opc3, sign)                                \
1890 static void glue(gen_, name)(DisasContext *ctx)                             \
1891 {                                                                           \
1892     gen_op_arith_modw(ctx, cpu_gpr[rD(ctx->opcode)],                        \
1893                       cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)],   \
1894                       sign);                                                \
1895 }
1896 
1897 GEN_INT_ARITH_MODW(moduw, 0x08, 0);
1898 GEN_INT_ARITH_MODW(modsw, 0x18, 1);
1899 
1900 #if defined(TARGET_PPC64)
1901 static inline void gen_op_arith_modd(DisasContext *ctx, TCGv ret, TCGv arg1,
1902                                      TCGv arg2, int sign)
1903 {
1904     TCGv_i64 t0 = tcg_temp_new_i64();
1905     TCGv_i64 t1 = tcg_temp_new_i64();
1906 
1907     tcg_gen_mov_i64(t0, arg1);
1908     tcg_gen_mov_i64(t1, arg2);
1909     if (sign) {
1910         TCGv_i64 t2 = tcg_temp_new_i64();
1911         TCGv_i64 t3 = tcg_temp_new_i64();
1912         tcg_gen_setcondi_i64(TCG_COND_EQ, t2, t0, INT64_MIN);
1913         tcg_gen_setcondi_i64(TCG_COND_EQ, t3, t1, -1);
1914         tcg_gen_and_i64(t2, t2, t3);
1915         tcg_gen_setcondi_i64(TCG_COND_EQ, t3, t1, 0);
1916         tcg_gen_or_i64(t2, t2, t3);
1917         tcg_gen_movi_i64(t3, 0);
1918         tcg_gen_movcond_i64(TCG_COND_NE, t1, t2, t3, t2, t1);
1919         tcg_gen_rem_i64(ret, t0, t1);
1920         tcg_temp_free_i64(t2);
1921         tcg_temp_free_i64(t3);
1922     } else {
1923         TCGv_i64 t2 = tcg_const_i64(1);
1924         TCGv_i64 t3 = tcg_const_i64(0);
1925         tcg_gen_movcond_i64(TCG_COND_EQ, t1, t1, t3, t2, t1);
1926         tcg_gen_remu_i64(ret, t0, t1);
1927         tcg_temp_free_i64(t2);
1928         tcg_temp_free_i64(t3);
1929     }
1930     tcg_temp_free_i64(t0);
1931     tcg_temp_free_i64(t1);
1932 }
1933 
1934 #define GEN_INT_ARITH_MODD(name, opc3, sign)                            \
1935 static void glue(gen_, name)(DisasContext *ctx)                           \
1936 {                                                                         \
1937   gen_op_arith_modd(ctx, cpu_gpr[rD(ctx->opcode)],                        \
1938                     cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)],   \
1939                     sign);                                                \
1940 }
1941 
1942 GEN_INT_ARITH_MODD(modud, 0x08, 0);
1943 GEN_INT_ARITH_MODD(modsd, 0x18, 1);
1944 #endif
1945 
1946 /* mulhw  mulhw. */
1947 static void gen_mulhw(DisasContext *ctx)
1948 {
1949     TCGv_i32 t0 = tcg_temp_new_i32();
1950     TCGv_i32 t1 = tcg_temp_new_i32();
1951 
1952     tcg_gen_trunc_tl_i32(t0, cpu_gpr[rA(ctx->opcode)]);
1953     tcg_gen_trunc_tl_i32(t1, cpu_gpr[rB(ctx->opcode)]);
1954     tcg_gen_muls2_i32(t0, t1, t0, t1);
1955     tcg_gen_extu_i32_tl(cpu_gpr[rD(ctx->opcode)], t1);
1956     tcg_temp_free_i32(t0);
1957     tcg_temp_free_i32(t1);
1958     if (unlikely(Rc(ctx->opcode) != 0)) {
1959         gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]);
1960     }
1961 }
1962 
1963 /* mulhwu  mulhwu.  */
1964 static void gen_mulhwu(DisasContext *ctx)
1965 {
1966     TCGv_i32 t0 = tcg_temp_new_i32();
1967     TCGv_i32 t1 = tcg_temp_new_i32();
1968 
1969     tcg_gen_trunc_tl_i32(t0, cpu_gpr[rA(ctx->opcode)]);
1970     tcg_gen_trunc_tl_i32(t1, cpu_gpr[rB(ctx->opcode)]);
1971     tcg_gen_mulu2_i32(t0, t1, t0, t1);
1972     tcg_gen_extu_i32_tl(cpu_gpr[rD(ctx->opcode)], t1);
1973     tcg_temp_free_i32(t0);
1974     tcg_temp_free_i32(t1);
1975     if (unlikely(Rc(ctx->opcode) != 0)) {
1976         gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]);
1977     }
1978 }
1979 
1980 /* mullw  mullw. */
1981 static void gen_mullw(DisasContext *ctx)
1982 {
1983 #if defined(TARGET_PPC64)
1984     TCGv_i64 t0, t1;
1985     t0 = tcg_temp_new_i64();
1986     t1 = tcg_temp_new_i64();
1987     tcg_gen_ext32s_tl(t0, cpu_gpr[rA(ctx->opcode)]);
1988     tcg_gen_ext32s_tl(t1, cpu_gpr[rB(ctx->opcode)]);
1989     tcg_gen_mul_i64(cpu_gpr[rD(ctx->opcode)], t0, t1);
1990     tcg_temp_free(t0);
1991     tcg_temp_free(t1);
1992 #else
1993     tcg_gen_mul_i32(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)],
1994                     cpu_gpr[rB(ctx->opcode)]);
1995 #endif
1996     if (unlikely(Rc(ctx->opcode) != 0)) {
1997         gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]);
1998     }
1999 }
2000 
2001 /* mullwo  mullwo. */
2002 static void gen_mullwo(DisasContext *ctx)
2003 {
2004     TCGv_i32 t0 = tcg_temp_new_i32();
2005     TCGv_i32 t1 = tcg_temp_new_i32();
2006 
2007     tcg_gen_trunc_tl_i32(t0, cpu_gpr[rA(ctx->opcode)]);
2008     tcg_gen_trunc_tl_i32(t1, cpu_gpr[rB(ctx->opcode)]);
2009     tcg_gen_muls2_i32(t0, t1, t0, t1);
2010 #if defined(TARGET_PPC64)
2011     tcg_gen_concat_i32_i64(cpu_gpr[rD(ctx->opcode)], t0, t1);
2012 #else
2013     tcg_gen_mov_i32(cpu_gpr[rD(ctx->opcode)], t0);
2014 #endif
2015 
2016     tcg_gen_sari_i32(t0, t0, 31);
2017     tcg_gen_setcond_i32(TCG_COND_NE, t0, t0, t1);
2018     tcg_gen_extu_i32_tl(cpu_ov, t0);
2019     if (is_isa300(ctx)) {
2020         tcg_gen_mov_tl(cpu_ov32, cpu_ov);
2021     }
2022     tcg_gen_or_tl(cpu_so, cpu_so, cpu_ov);
2023 
2024     tcg_temp_free_i32(t0);
2025     tcg_temp_free_i32(t1);
2026     if (unlikely(Rc(ctx->opcode) != 0)) {
2027         gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]);
2028     }
2029 }
2030 
2031 /* mulli */
2032 static void gen_mulli(DisasContext *ctx)
2033 {
2034     tcg_gen_muli_tl(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)],
2035                     SIMM(ctx->opcode));
2036 }
2037 
2038 #if defined(TARGET_PPC64)
2039 /* mulhd  mulhd. */
2040 static void gen_mulhd(DisasContext *ctx)
2041 {
2042     TCGv lo = tcg_temp_new();
2043     tcg_gen_muls2_tl(lo, cpu_gpr[rD(ctx->opcode)],
2044                      cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]);
2045     tcg_temp_free(lo);
2046     if (unlikely(Rc(ctx->opcode) != 0)) {
2047         gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]);
2048     }
2049 }
2050 
2051 /* mulhdu  mulhdu. */
2052 static void gen_mulhdu(DisasContext *ctx)
2053 {
2054     TCGv lo = tcg_temp_new();
2055     tcg_gen_mulu2_tl(lo, cpu_gpr[rD(ctx->opcode)],
2056                      cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]);
2057     tcg_temp_free(lo);
2058     if (unlikely(Rc(ctx->opcode) != 0)) {
2059         gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]);
2060     }
2061 }
2062 
2063 /* mulld  mulld. */
2064 static void gen_mulld(DisasContext *ctx)
2065 {
2066     tcg_gen_mul_tl(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)],
2067                    cpu_gpr[rB(ctx->opcode)]);
2068     if (unlikely(Rc(ctx->opcode) != 0)) {
2069         gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]);
2070     }
2071 }
2072 
2073 /* mulldo  mulldo. */
2074 static void gen_mulldo(DisasContext *ctx)
2075 {
2076     TCGv_i64 t0 = tcg_temp_new_i64();
2077     TCGv_i64 t1 = tcg_temp_new_i64();
2078 
2079     tcg_gen_muls2_i64(t0, t1, cpu_gpr[rA(ctx->opcode)],
2080                       cpu_gpr[rB(ctx->opcode)]);
2081     tcg_gen_mov_i64(cpu_gpr[rD(ctx->opcode)], t0);
2082 
2083     tcg_gen_sari_i64(t0, t0, 63);
2084     tcg_gen_setcond_i64(TCG_COND_NE, cpu_ov, t0, t1);
2085     if (is_isa300(ctx)) {
2086         tcg_gen_mov_tl(cpu_ov32, cpu_ov);
2087     }
2088     tcg_gen_or_tl(cpu_so, cpu_so, cpu_ov);
2089 
2090     tcg_temp_free_i64(t0);
2091     tcg_temp_free_i64(t1);
2092 
2093     if (unlikely(Rc(ctx->opcode) != 0)) {
2094         gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]);
2095     }
2096 }
2097 #endif
2098 
2099 /* Common subf function */
2100 static inline void gen_op_arith_subf(DisasContext *ctx, TCGv ret, TCGv arg1,
2101                                      TCGv arg2, bool add_ca, bool compute_ca,
2102                                      bool compute_ov, bool compute_rc0)
2103 {
2104     TCGv t0 = ret;
2105 
2106     if (compute_ca || compute_ov) {
2107         t0 = tcg_temp_new();
2108     }
2109 
2110     if (compute_ca) {
2111         /* dest = ~arg1 + arg2 [+ ca].  */
2112         if (NARROW_MODE(ctx)) {
2113             /*
2114              * Caution: a non-obvious corner case of the spec is that
2115              * we must produce the *entire* 64-bit addition, but
2116              * produce the carry into bit 32.
2117              */
2118             TCGv inv1 = tcg_temp_new();
2119             TCGv t1 = tcg_temp_new();
2120             tcg_gen_not_tl(inv1, arg1);
2121             if (add_ca) {
2122                 tcg_gen_add_tl(t0, arg2, cpu_ca);
2123             } else {
2124                 tcg_gen_addi_tl(t0, arg2, 1);
2125             }
2126             tcg_gen_xor_tl(t1, arg2, inv1);         /* add without carry */
2127             tcg_gen_add_tl(t0, t0, inv1);
2128             tcg_temp_free(inv1);
2129             tcg_gen_xor_tl(cpu_ca, t0, t1);         /* bits changes w/ carry */
2130             tcg_temp_free(t1);
2131             tcg_gen_extract_tl(cpu_ca, cpu_ca, 32, 1);
2132             if (is_isa300(ctx)) {
2133                 tcg_gen_mov_tl(cpu_ca32, cpu_ca);
2134             }
2135         } else if (add_ca) {
2136             TCGv zero, inv1 = tcg_temp_new();
2137             tcg_gen_not_tl(inv1, arg1);
2138             zero = tcg_const_tl(0);
2139             tcg_gen_add2_tl(t0, cpu_ca, arg2, zero, cpu_ca, zero);
2140             tcg_gen_add2_tl(t0, cpu_ca, t0, cpu_ca, inv1, zero);
2141             gen_op_arith_compute_ca32(ctx, t0, inv1, arg2, cpu_ca32, 0);
2142             tcg_temp_free(zero);
2143             tcg_temp_free(inv1);
2144         } else {
2145             tcg_gen_setcond_tl(TCG_COND_GEU, cpu_ca, arg2, arg1);
2146             tcg_gen_sub_tl(t0, arg2, arg1);
2147             gen_op_arith_compute_ca32(ctx, t0, arg1, arg2, cpu_ca32, 1);
2148         }
2149     } else if (add_ca) {
2150         /*
2151          * Since we're ignoring carry-out, we can simplify the
2152          * standard ~arg1 + arg2 + ca to arg2 - arg1 + ca - 1.
2153          */
2154         tcg_gen_sub_tl(t0, arg2, arg1);
2155         tcg_gen_add_tl(t0, t0, cpu_ca);
2156         tcg_gen_subi_tl(t0, t0, 1);
2157     } else {
2158         tcg_gen_sub_tl(t0, arg2, arg1);
2159     }
2160 
2161     if (compute_ov) {
2162         gen_op_arith_compute_ov(ctx, t0, arg1, arg2, 1);
2163     }
2164     if (unlikely(compute_rc0)) {
2165         gen_set_Rc0(ctx, t0);
2166     }
2167 
2168     if (t0 != ret) {
2169         tcg_gen_mov_tl(ret, t0);
2170         tcg_temp_free(t0);
2171     }
2172 }
2173 /* Sub functions with Two operands functions */
2174 #define GEN_INT_ARITH_SUBF(name, opc3, add_ca, compute_ca, compute_ov)        \
2175 static void glue(gen_, name)(DisasContext *ctx)                               \
2176 {                                                                             \
2177     gen_op_arith_subf(ctx, cpu_gpr[rD(ctx->opcode)],                          \
2178                       cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)],     \
2179                       add_ca, compute_ca, compute_ov, Rc(ctx->opcode));       \
2180 }
2181 /* Sub functions with one operand and one immediate */
2182 #define GEN_INT_ARITH_SUBF_CONST(name, opc3, const_val,                       \
2183                                 add_ca, compute_ca, compute_ov)               \
2184 static void glue(gen_, name)(DisasContext *ctx)                               \
2185 {                                                                             \
2186     TCGv t0 = tcg_const_tl(const_val);                                        \
2187     gen_op_arith_subf(ctx, cpu_gpr[rD(ctx->opcode)],                          \
2188                       cpu_gpr[rA(ctx->opcode)], t0,                           \
2189                       add_ca, compute_ca, compute_ov, Rc(ctx->opcode));       \
2190     tcg_temp_free(t0);                                                        \
2191 }
2192 /* subf  subf.  subfo  subfo. */
2193 GEN_INT_ARITH_SUBF(subf, 0x01, 0, 0, 0)
2194 GEN_INT_ARITH_SUBF(subfo, 0x11, 0, 0, 1)
2195 /* subfc  subfc.  subfco  subfco. */
2196 GEN_INT_ARITH_SUBF(subfc, 0x00, 0, 1, 0)
2197 GEN_INT_ARITH_SUBF(subfco, 0x10, 0, 1, 1)
2198 /* subfe  subfe.  subfeo  subfo. */
2199 GEN_INT_ARITH_SUBF(subfe, 0x04, 1, 1, 0)
2200 GEN_INT_ARITH_SUBF(subfeo, 0x14, 1, 1, 1)
2201 /* subfme  subfme.  subfmeo  subfmeo.  */
2202 GEN_INT_ARITH_SUBF_CONST(subfme, 0x07, -1LL, 1, 1, 0)
2203 GEN_INT_ARITH_SUBF_CONST(subfmeo, 0x17, -1LL, 1, 1, 1)
2204 /* subfze  subfze.  subfzeo  subfzeo.*/
2205 GEN_INT_ARITH_SUBF_CONST(subfze, 0x06, 0, 1, 1, 0)
2206 GEN_INT_ARITH_SUBF_CONST(subfzeo, 0x16, 0, 1, 1, 1)
2207 
2208 /* subfic */
2209 static void gen_subfic(DisasContext *ctx)
2210 {
2211     TCGv c = tcg_const_tl(SIMM(ctx->opcode));
2212     gen_op_arith_subf(ctx, cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)],
2213                       c, 0, 1, 0, 0);
2214     tcg_temp_free(c);
2215 }
2216 
2217 /* neg neg. nego nego. */
2218 static inline void gen_op_arith_neg(DisasContext *ctx, bool compute_ov)
2219 {
2220     TCGv zero = tcg_const_tl(0);
2221     gen_op_arith_subf(ctx, cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)],
2222                       zero, 0, 0, compute_ov, Rc(ctx->opcode));
2223     tcg_temp_free(zero);
2224 }
2225 
2226 static void gen_neg(DisasContext *ctx)
2227 {
2228     tcg_gen_neg_tl(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)]);
2229     if (unlikely(Rc(ctx->opcode))) {
2230         gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]);
2231     }
2232 }
2233 
2234 static void gen_nego(DisasContext *ctx)
2235 {
2236     gen_op_arith_neg(ctx, 1);
2237 }
2238 
2239 /***                            Integer logical                            ***/
2240 #define GEN_LOGICAL2(name, tcg_op, opc, type)                                 \
2241 static void glue(gen_, name)(DisasContext *ctx)                               \
2242 {                                                                             \
2243     tcg_op(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)],                \
2244        cpu_gpr[rB(ctx->opcode)]);                                             \
2245     if (unlikely(Rc(ctx->opcode) != 0))                                       \
2246         gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);                           \
2247 }
2248 
2249 #define GEN_LOGICAL1(name, tcg_op, opc, type)                                 \
2250 static void glue(gen_, name)(DisasContext *ctx)                               \
2251 {                                                                             \
2252     tcg_op(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]);               \
2253     if (unlikely(Rc(ctx->opcode) != 0))                                       \
2254         gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);                           \
2255 }
2256 
2257 /* and & and. */
2258 GEN_LOGICAL2(and, tcg_gen_and_tl, 0x00, PPC_INTEGER);
2259 /* andc & andc. */
2260 GEN_LOGICAL2(andc, tcg_gen_andc_tl, 0x01, PPC_INTEGER);
2261 
2262 /* andi. */
2263 static void gen_andi_(DisasContext *ctx)
2264 {
2265     tcg_gen_andi_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)],
2266                     UIMM(ctx->opcode));
2267     gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
2268 }
2269 
2270 /* andis. */
2271 static void gen_andis_(DisasContext *ctx)
2272 {
2273     tcg_gen_andi_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)],
2274                     UIMM(ctx->opcode) << 16);
2275     gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
2276 }
2277 
2278 /* cntlzw */
2279 static void gen_cntlzw(DisasContext *ctx)
2280 {
2281     TCGv_i32 t = tcg_temp_new_i32();
2282 
2283     tcg_gen_trunc_tl_i32(t, cpu_gpr[rS(ctx->opcode)]);
2284     tcg_gen_clzi_i32(t, t, 32);
2285     tcg_gen_extu_i32_tl(cpu_gpr[rA(ctx->opcode)], t);
2286     tcg_temp_free_i32(t);
2287 
2288     if (unlikely(Rc(ctx->opcode) != 0)) {
2289         gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
2290     }
2291 }
2292 
2293 /* cnttzw */
2294 static void gen_cnttzw(DisasContext *ctx)
2295 {
2296     TCGv_i32 t = tcg_temp_new_i32();
2297 
2298     tcg_gen_trunc_tl_i32(t, cpu_gpr[rS(ctx->opcode)]);
2299     tcg_gen_ctzi_i32(t, t, 32);
2300     tcg_gen_extu_i32_tl(cpu_gpr[rA(ctx->opcode)], t);
2301     tcg_temp_free_i32(t);
2302 
2303     if (unlikely(Rc(ctx->opcode) != 0)) {
2304         gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
2305     }
2306 }
2307 
2308 /* eqv & eqv. */
2309 GEN_LOGICAL2(eqv, tcg_gen_eqv_tl, 0x08, PPC_INTEGER);
2310 /* extsb & extsb. */
2311 GEN_LOGICAL1(extsb, tcg_gen_ext8s_tl, 0x1D, PPC_INTEGER);
2312 /* extsh & extsh. */
2313 GEN_LOGICAL1(extsh, tcg_gen_ext16s_tl, 0x1C, PPC_INTEGER);
2314 /* nand & nand. */
2315 GEN_LOGICAL2(nand, tcg_gen_nand_tl, 0x0E, PPC_INTEGER);
2316 /* nor & nor. */
2317 GEN_LOGICAL2(nor, tcg_gen_nor_tl, 0x03, PPC_INTEGER);
2318 
2319 #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
2320 static void gen_pause(DisasContext *ctx)
2321 {
2322     TCGv_i32 t0 = tcg_const_i32(0);
2323     tcg_gen_st_i32(t0, cpu_env,
2324                    -offsetof(PowerPCCPU, env) + offsetof(CPUState, halted));
2325     tcg_temp_free_i32(t0);
2326 
2327     /* Stop translation, this gives other CPUs a chance to run */
2328     gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next);
2329 }
2330 #endif /* defined(TARGET_PPC64) */
2331 
2332 /* or & or. */
2333 static void gen_or(DisasContext *ctx)
2334 {
2335     int rs, ra, rb;
2336 
2337     rs = rS(ctx->opcode);
2338     ra = rA(ctx->opcode);
2339     rb = rB(ctx->opcode);
2340     /* Optimisation for mr. ri case */
2341     if (rs != ra || rs != rb) {
2342         if (rs != rb) {
2343             tcg_gen_or_tl(cpu_gpr[ra], cpu_gpr[rs], cpu_gpr[rb]);
2344         } else {
2345             tcg_gen_mov_tl(cpu_gpr[ra], cpu_gpr[rs]);
2346         }
2347         if (unlikely(Rc(ctx->opcode) != 0)) {
2348             gen_set_Rc0(ctx, cpu_gpr[ra]);
2349         }
2350     } else if (unlikely(Rc(ctx->opcode) != 0)) {
2351         gen_set_Rc0(ctx, cpu_gpr[rs]);
2352 #if defined(TARGET_PPC64)
2353     } else if (rs != 0) { /* 0 is nop */
2354         int prio = 0;
2355 
2356         switch (rs) {
2357         case 1:
2358             /* Set process priority to low */
2359             prio = 2;
2360             break;
2361         case 6:
2362             /* Set process priority to medium-low */
2363             prio = 3;
2364             break;
2365         case 2:
2366             /* Set process priority to normal */
2367             prio = 4;
2368             break;
2369 #if !defined(CONFIG_USER_ONLY)
2370         case 31:
2371             if (!ctx->pr) {
2372                 /* Set process priority to very low */
2373                 prio = 1;
2374             }
2375             break;
2376         case 5:
2377             if (!ctx->pr) {
2378                 /* Set process priority to medium-hight */
2379                 prio = 5;
2380             }
2381             break;
2382         case 3:
2383             if (!ctx->pr) {
2384                 /* Set process priority to high */
2385                 prio = 6;
2386             }
2387             break;
2388         case 7:
2389             if (ctx->hv && !ctx->pr) {
2390                 /* Set process priority to very high */
2391                 prio = 7;
2392             }
2393             break;
2394 #endif
2395         default:
2396             break;
2397         }
2398         if (prio) {
2399             TCGv t0 = tcg_temp_new();
2400             gen_load_spr(t0, SPR_PPR);
2401             tcg_gen_andi_tl(t0, t0, ~0x001C000000000000ULL);
2402             tcg_gen_ori_tl(t0, t0, ((uint64_t)prio) << 50);
2403             gen_store_spr(SPR_PPR, t0);
2404             tcg_temp_free(t0);
2405         }
2406 #if !defined(CONFIG_USER_ONLY)
2407         /*
2408          * Pause out of TCG otherwise spin loops with smt_low eat too
2409          * much CPU and the kernel hangs.  This applies to all
2410          * encodings other than no-op, e.g., miso(rs=26), yield(27),
2411          * mdoio(29), mdoom(30), and all currently undefined.
2412          */
2413         gen_pause(ctx);
2414 #endif
2415 #endif
2416     }
2417 }
2418 /* orc & orc. */
2419 GEN_LOGICAL2(orc, tcg_gen_orc_tl, 0x0C, PPC_INTEGER);
2420 
2421 /* xor & xor. */
2422 static void gen_xor(DisasContext *ctx)
2423 {
2424     /* Optimisation for "set to zero" case */
2425     if (rS(ctx->opcode) != rB(ctx->opcode)) {
2426         tcg_gen_xor_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)],
2427                        cpu_gpr[rB(ctx->opcode)]);
2428     } else {
2429         tcg_gen_movi_tl(cpu_gpr[rA(ctx->opcode)], 0);
2430     }
2431     if (unlikely(Rc(ctx->opcode) != 0)) {
2432         gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
2433     }
2434 }
2435 
2436 /* ori */
2437 static void gen_ori(DisasContext *ctx)
2438 {
2439     target_ulong uimm = UIMM(ctx->opcode);
2440 
2441     if (rS(ctx->opcode) == rA(ctx->opcode) && uimm == 0) {
2442         return;
2443     }
2444     tcg_gen_ori_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)], uimm);
2445 }
2446 
2447 /* oris */
2448 static void gen_oris(DisasContext *ctx)
2449 {
2450     target_ulong uimm = UIMM(ctx->opcode);
2451 
2452     if (rS(ctx->opcode) == rA(ctx->opcode) && uimm == 0) {
2453         /* NOP */
2454         return;
2455     }
2456     tcg_gen_ori_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)],
2457                    uimm << 16);
2458 }
2459 
2460 /* xori */
2461 static void gen_xori(DisasContext *ctx)
2462 {
2463     target_ulong uimm = UIMM(ctx->opcode);
2464 
2465     if (rS(ctx->opcode) == rA(ctx->opcode) && uimm == 0) {
2466         /* NOP */
2467         return;
2468     }
2469     tcg_gen_xori_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)], uimm);
2470 }
2471 
2472 /* xoris */
2473 static void gen_xoris(DisasContext *ctx)
2474 {
2475     target_ulong uimm = UIMM(ctx->opcode);
2476 
2477     if (rS(ctx->opcode) == rA(ctx->opcode) && uimm == 0) {
2478         /* NOP */
2479         return;
2480     }
2481     tcg_gen_xori_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)],
2482                     uimm << 16);
2483 }
2484 
2485 /* popcntb : PowerPC 2.03 specification */
2486 static void gen_popcntb(DisasContext *ctx)
2487 {
2488     gen_helper_popcntb(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]);
2489 }
2490 
2491 static void gen_popcntw(DisasContext *ctx)
2492 {
2493 #if defined(TARGET_PPC64)
2494     gen_helper_popcntw(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]);
2495 #else
2496     tcg_gen_ctpop_i32(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]);
2497 #endif
2498 }
2499 
2500 #if defined(TARGET_PPC64)
2501 /* popcntd: PowerPC 2.06 specification */
2502 static void gen_popcntd(DisasContext *ctx)
2503 {
2504     tcg_gen_ctpop_i64(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]);
2505 }
2506 #endif
2507 
2508 /* prtyw: PowerPC 2.05 specification */
2509 static void gen_prtyw(DisasContext *ctx)
2510 {
2511     TCGv ra = cpu_gpr[rA(ctx->opcode)];
2512     TCGv rs = cpu_gpr[rS(ctx->opcode)];
2513     TCGv t0 = tcg_temp_new();
2514     tcg_gen_shri_tl(t0, rs, 16);
2515     tcg_gen_xor_tl(ra, rs, t0);
2516     tcg_gen_shri_tl(t0, ra, 8);
2517     tcg_gen_xor_tl(ra, ra, t0);
2518     tcg_gen_andi_tl(ra, ra, (target_ulong)0x100000001ULL);
2519     tcg_temp_free(t0);
2520 }
2521 
2522 #if defined(TARGET_PPC64)
2523 /* prtyd: PowerPC 2.05 specification */
2524 static void gen_prtyd(DisasContext *ctx)
2525 {
2526     TCGv ra = cpu_gpr[rA(ctx->opcode)];
2527     TCGv rs = cpu_gpr[rS(ctx->opcode)];
2528     TCGv t0 = tcg_temp_new();
2529     tcg_gen_shri_tl(t0, rs, 32);
2530     tcg_gen_xor_tl(ra, rs, t0);
2531     tcg_gen_shri_tl(t0, ra, 16);
2532     tcg_gen_xor_tl(ra, ra, t0);
2533     tcg_gen_shri_tl(t0, ra, 8);
2534     tcg_gen_xor_tl(ra, ra, t0);
2535     tcg_gen_andi_tl(ra, ra, 1);
2536     tcg_temp_free(t0);
2537 }
2538 #endif
2539 
2540 #if defined(TARGET_PPC64)
2541 /* bpermd */
2542 static void gen_bpermd(DisasContext *ctx)
2543 {
2544     gen_helper_bpermd(cpu_gpr[rA(ctx->opcode)],
2545                       cpu_gpr[rS(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]);
2546 }
2547 #endif
2548 
2549 #if defined(TARGET_PPC64)
2550 /* extsw & extsw. */
2551 GEN_LOGICAL1(extsw, tcg_gen_ext32s_tl, 0x1E, PPC_64B);
2552 
2553 /* cntlzd */
2554 static void gen_cntlzd(DisasContext *ctx)
2555 {
2556     tcg_gen_clzi_i64(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)], 64);
2557     if (unlikely(Rc(ctx->opcode) != 0)) {
2558         gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
2559     }
2560 }
2561 
2562 /* cnttzd */
2563 static void gen_cnttzd(DisasContext *ctx)
2564 {
2565     tcg_gen_ctzi_i64(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)], 64);
2566     if (unlikely(Rc(ctx->opcode) != 0)) {
2567         gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
2568     }
2569 }
2570 
2571 /* darn */
2572 static void gen_darn(DisasContext *ctx)
2573 {
2574     int l = L(ctx->opcode);
2575 
2576     if (l > 2) {
2577         tcg_gen_movi_i64(cpu_gpr[rD(ctx->opcode)], -1);
2578     } else {
2579         gen_icount_io_start(ctx);
2580         if (l == 0) {
2581             gen_helper_darn32(cpu_gpr[rD(ctx->opcode)]);
2582         } else {
2583             /* Return 64-bit random for both CRN and RRN */
2584             gen_helper_darn64(cpu_gpr[rD(ctx->opcode)]);
2585         }
2586     }
2587 }
2588 #endif
2589 
2590 /***                             Integer rotate                            ***/
2591 
2592 /* rlwimi & rlwimi. */
2593 static void gen_rlwimi(DisasContext *ctx)
2594 {
2595     TCGv t_ra = cpu_gpr[rA(ctx->opcode)];
2596     TCGv t_rs = cpu_gpr[rS(ctx->opcode)];
2597     uint32_t sh = SH(ctx->opcode);
2598     uint32_t mb = MB(ctx->opcode);
2599     uint32_t me = ME(ctx->opcode);
2600 
2601     if (sh == (31 - me) && mb <= me) {
2602         tcg_gen_deposit_tl(t_ra, t_ra, t_rs, sh, me - mb + 1);
2603     } else {
2604         target_ulong mask;
2605         bool mask_in_32b = true;
2606         TCGv t1;
2607 
2608 #if defined(TARGET_PPC64)
2609         mb += 32;
2610         me += 32;
2611 #endif
2612         mask = MASK(mb, me);
2613 
2614 #if defined(TARGET_PPC64)
2615         if (mask > 0xffffffffu) {
2616             mask_in_32b = false;
2617         }
2618 #endif
2619         t1 = tcg_temp_new();
2620         if (mask_in_32b) {
2621             TCGv_i32 t0 = tcg_temp_new_i32();
2622             tcg_gen_trunc_tl_i32(t0, t_rs);
2623             tcg_gen_rotli_i32(t0, t0, sh);
2624             tcg_gen_extu_i32_tl(t1, t0);
2625             tcg_temp_free_i32(t0);
2626         } else {
2627 #if defined(TARGET_PPC64)
2628             tcg_gen_deposit_i64(t1, t_rs, t_rs, 32, 32);
2629             tcg_gen_rotli_i64(t1, t1, sh);
2630 #else
2631             g_assert_not_reached();
2632 #endif
2633         }
2634 
2635         tcg_gen_andi_tl(t1, t1, mask);
2636         tcg_gen_andi_tl(t_ra, t_ra, ~mask);
2637         tcg_gen_or_tl(t_ra, t_ra, t1);
2638         tcg_temp_free(t1);
2639     }
2640     if (unlikely(Rc(ctx->opcode) != 0)) {
2641         gen_set_Rc0(ctx, t_ra);
2642     }
2643 }
2644 
2645 /* rlwinm & rlwinm. */
2646 static void gen_rlwinm(DisasContext *ctx)
2647 {
2648     TCGv t_ra = cpu_gpr[rA(ctx->opcode)];
2649     TCGv t_rs = cpu_gpr[rS(ctx->opcode)];
2650     int sh = SH(ctx->opcode);
2651     int mb = MB(ctx->opcode);
2652     int me = ME(ctx->opcode);
2653     int len = me - mb + 1;
2654     int rsh = (32 - sh) & 31;
2655 
2656     if (sh != 0 && len > 0 && me == (31 - sh)) {
2657         tcg_gen_deposit_z_tl(t_ra, t_rs, sh, len);
2658     } else if (me == 31 && rsh + len <= 32) {
2659         tcg_gen_extract_tl(t_ra, t_rs, rsh, len);
2660     } else {
2661         target_ulong mask;
2662         bool mask_in_32b = true;
2663 #if defined(TARGET_PPC64)
2664         mb += 32;
2665         me += 32;
2666 #endif
2667         mask = MASK(mb, me);
2668 #if defined(TARGET_PPC64)
2669         if (mask > 0xffffffffu) {
2670             mask_in_32b = false;
2671         }
2672 #endif
2673         if (mask_in_32b) {
2674             if (sh == 0) {
2675                 tcg_gen_andi_tl(t_ra, t_rs, mask);
2676             } else {
2677                 TCGv_i32 t0 = tcg_temp_new_i32();
2678                 tcg_gen_trunc_tl_i32(t0, t_rs);
2679                 tcg_gen_rotli_i32(t0, t0, sh);
2680                 tcg_gen_andi_i32(t0, t0, mask);
2681                 tcg_gen_extu_i32_tl(t_ra, t0);
2682                 tcg_temp_free_i32(t0);
2683             }
2684         } else {
2685 #if defined(TARGET_PPC64)
2686             tcg_gen_deposit_i64(t_ra, t_rs, t_rs, 32, 32);
2687             tcg_gen_rotli_i64(t_ra, t_ra, sh);
2688             tcg_gen_andi_i64(t_ra, t_ra, mask);
2689 #else
2690             g_assert_not_reached();
2691 #endif
2692         }
2693     }
2694     if (unlikely(Rc(ctx->opcode) != 0)) {
2695         gen_set_Rc0(ctx, t_ra);
2696     }
2697 }
2698 
2699 /* rlwnm & rlwnm. */
2700 static void gen_rlwnm(DisasContext *ctx)
2701 {
2702     TCGv t_ra = cpu_gpr[rA(ctx->opcode)];
2703     TCGv t_rs = cpu_gpr[rS(ctx->opcode)];
2704     TCGv t_rb = cpu_gpr[rB(ctx->opcode)];
2705     uint32_t mb = MB(ctx->opcode);
2706     uint32_t me = ME(ctx->opcode);
2707     target_ulong mask;
2708     bool mask_in_32b = true;
2709 
2710 #if defined(TARGET_PPC64)
2711     mb += 32;
2712     me += 32;
2713 #endif
2714     mask = MASK(mb, me);
2715 
2716 #if defined(TARGET_PPC64)
2717     if (mask > 0xffffffffu) {
2718         mask_in_32b = false;
2719     }
2720 #endif
2721     if (mask_in_32b) {
2722         TCGv_i32 t0 = tcg_temp_new_i32();
2723         TCGv_i32 t1 = tcg_temp_new_i32();
2724         tcg_gen_trunc_tl_i32(t0, t_rb);
2725         tcg_gen_trunc_tl_i32(t1, t_rs);
2726         tcg_gen_andi_i32(t0, t0, 0x1f);
2727         tcg_gen_rotl_i32(t1, t1, t0);
2728         tcg_gen_extu_i32_tl(t_ra, t1);
2729         tcg_temp_free_i32(t0);
2730         tcg_temp_free_i32(t1);
2731     } else {
2732 #if defined(TARGET_PPC64)
2733         TCGv_i64 t0 = tcg_temp_new_i64();
2734         tcg_gen_andi_i64(t0, t_rb, 0x1f);
2735         tcg_gen_deposit_i64(t_ra, t_rs, t_rs, 32, 32);
2736         tcg_gen_rotl_i64(t_ra, t_ra, t0);
2737         tcg_temp_free_i64(t0);
2738 #else
2739         g_assert_not_reached();
2740 #endif
2741     }
2742 
2743     tcg_gen_andi_tl(t_ra, t_ra, mask);
2744 
2745     if (unlikely(Rc(ctx->opcode) != 0)) {
2746         gen_set_Rc0(ctx, t_ra);
2747     }
2748 }
2749 
2750 #if defined(TARGET_PPC64)
2751 #define GEN_PPC64_R2(name, opc1, opc2)                                        \
2752 static void glue(gen_, name##0)(DisasContext *ctx)                            \
2753 {                                                                             \
2754     gen_##name(ctx, 0);                                                       \
2755 }                                                                             \
2756                                                                               \
2757 static void glue(gen_, name##1)(DisasContext *ctx)                            \
2758 {                                                                             \
2759     gen_##name(ctx, 1);                                                       \
2760 }
2761 #define GEN_PPC64_R4(name, opc1, opc2)                                        \
2762 static void glue(gen_, name##0)(DisasContext *ctx)                            \
2763 {                                                                             \
2764     gen_##name(ctx, 0, 0);                                                    \
2765 }                                                                             \
2766                                                                               \
2767 static void glue(gen_, name##1)(DisasContext *ctx)                            \
2768 {                                                                             \
2769     gen_##name(ctx, 0, 1);                                                    \
2770 }                                                                             \
2771                                                                               \
2772 static void glue(gen_, name##2)(DisasContext *ctx)                            \
2773 {                                                                             \
2774     gen_##name(ctx, 1, 0);                                                    \
2775 }                                                                             \
2776                                                                               \
2777 static void glue(gen_, name##3)(DisasContext *ctx)                            \
2778 {                                                                             \
2779     gen_##name(ctx, 1, 1);                                                    \
2780 }
2781 
2782 static void gen_rldinm(DisasContext *ctx, int mb, int me, int sh)
2783 {
2784     TCGv t_ra = cpu_gpr[rA(ctx->opcode)];
2785     TCGv t_rs = cpu_gpr[rS(ctx->opcode)];
2786     int len = me - mb + 1;
2787     int rsh = (64 - sh) & 63;
2788 
2789     if (sh != 0 && len > 0 && me == (63 - sh)) {
2790         tcg_gen_deposit_z_tl(t_ra, t_rs, sh, len);
2791     } else if (me == 63 && rsh + len <= 64) {
2792         tcg_gen_extract_tl(t_ra, t_rs, rsh, len);
2793     } else {
2794         tcg_gen_rotli_tl(t_ra, t_rs, sh);
2795         tcg_gen_andi_tl(t_ra, t_ra, MASK(mb, me));
2796     }
2797     if (unlikely(Rc(ctx->opcode) != 0)) {
2798         gen_set_Rc0(ctx, t_ra);
2799     }
2800 }
2801 
2802 /* rldicl - rldicl. */
2803 static inline void gen_rldicl(DisasContext *ctx, int mbn, int shn)
2804 {
2805     uint32_t sh, mb;
2806 
2807     sh = SH(ctx->opcode) | (shn << 5);
2808     mb = MB(ctx->opcode) | (mbn << 5);
2809     gen_rldinm(ctx, mb, 63, sh);
2810 }
2811 GEN_PPC64_R4(rldicl, 0x1E, 0x00);
2812 
2813 /* rldicr - rldicr. */
2814 static inline void gen_rldicr(DisasContext *ctx, int men, int shn)
2815 {
2816     uint32_t sh, me;
2817 
2818     sh = SH(ctx->opcode) | (shn << 5);
2819     me = MB(ctx->opcode) | (men << 5);
2820     gen_rldinm(ctx, 0, me, sh);
2821 }
2822 GEN_PPC64_R4(rldicr, 0x1E, 0x02);
2823 
2824 /* rldic - rldic. */
2825 static inline void gen_rldic(DisasContext *ctx, int mbn, int shn)
2826 {
2827     uint32_t sh, mb;
2828 
2829     sh = SH(ctx->opcode) | (shn << 5);
2830     mb = MB(ctx->opcode) | (mbn << 5);
2831     gen_rldinm(ctx, mb, 63 - sh, sh);
2832 }
2833 GEN_PPC64_R4(rldic, 0x1E, 0x04);
2834 
2835 static void gen_rldnm(DisasContext *ctx, int mb, int me)
2836 {
2837     TCGv t_ra = cpu_gpr[rA(ctx->opcode)];
2838     TCGv t_rs = cpu_gpr[rS(ctx->opcode)];
2839     TCGv t_rb = cpu_gpr[rB(ctx->opcode)];
2840     TCGv t0;
2841 
2842     t0 = tcg_temp_new();
2843     tcg_gen_andi_tl(t0, t_rb, 0x3f);
2844     tcg_gen_rotl_tl(t_ra, t_rs, t0);
2845     tcg_temp_free(t0);
2846 
2847     tcg_gen_andi_tl(t_ra, t_ra, MASK(mb, me));
2848     if (unlikely(Rc(ctx->opcode) != 0)) {
2849         gen_set_Rc0(ctx, t_ra);
2850     }
2851 }
2852 
2853 /* rldcl - rldcl. */
2854 static inline void gen_rldcl(DisasContext *ctx, int mbn)
2855 {
2856     uint32_t mb;
2857 
2858     mb = MB(ctx->opcode) | (mbn << 5);
2859     gen_rldnm(ctx, mb, 63);
2860 }
2861 GEN_PPC64_R2(rldcl, 0x1E, 0x08);
2862 
2863 /* rldcr - rldcr. */
2864 static inline void gen_rldcr(DisasContext *ctx, int men)
2865 {
2866     uint32_t me;
2867 
2868     me = MB(ctx->opcode) | (men << 5);
2869     gen_rldnm(ctx, 0, me);
2870 }
2871 GEN_PPC64_R2(rldcr, 0x1E, 0x09);
2872 
2873 /* rldimi - rldimi. */
2874 static void gen_rldimi(DisasContext *ctx, int mbn, int shn)
2875 {
2876     TCGv t_ra = cpu_gpr[rA(ctx->opcode)];
2877     TCGv t_rs = cpu_gpr[rS(ctx->opcode)];
2878     uint32_t sh = SH(ctx->opcode) | (shn << 5);
2879     uint32_t mb = MB(ctx->opcode) | (mbn << 5);
2880     uint32_t me = 63 - sh;
2881 
2882     if (mb <= me) {
2883         tcg_gen_deposit_tl(t_ra, t_ra, t_rs, sh, me - mb + 1);
2884     } else {
2885         target_ulong mask = MASK(mb, me);
2886         TCGv t1 = tcg_temp_new();
2887 
2888         tcg_gen_rotli_tl(t1, t_rs, sh);
2889         tcg_gen_andi_tl(t1, t1, mask);
2890         tcg_gen_andi_tl(t_ra, t_ra, ~mask);
2891         tcg_gen_or_tl(t_ra, t_ra, t1);
2892         tcg_temp_free(t1);
2893     }
2894     if (unlikely(Rc(ctx->opcode) != 0)) {
2895         gen_set_Rc0(ctx, t_ra);
2896     }
2897 }
2898 GEN_PPC64_R4(rldimi, 0x1E, 0x06);
2899 #endif
2900 
2901 /***                             Integer shift                             ***/
2902 
2903 /* slw & slw. */
2904 static void gen_slw(DisasContext *ctx)
2905 {
2906     TCGv t0, t1;
2907 
2908     t0 = tcg_temp_new();
2909     /* AND rS with a mask that is 0 when rB >= 0x20 */
2910 #if defined(TARGET_PPC64)
2911     tcg_gen_shli_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x3a);
2912     tcg_gen_sari_tl(t0, t0, 0x3f);
2913 #else
2914     tcg_gen_shli_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x1a);
2915     tcg_gen_sari_tl(t0, t0, 0x1f);
2916 #endif
2917     tcg_gen_andc_tl(t0, cpu_gpr[rS(ctx->opcode)], t0);
2918     t1 = tcg_temp_new();
2919     tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x1f);
2920     tcg_gen_shl_tl(cpu_gpr[rA(ctx->opcode)], t0, t1);
2921     tcg_temp_free(t1);
2922     tcg_temp_free(t0);
2923     tcg_gen_ext32u_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rA(ctx->opcode)]);
2924     if (unlikely(Rc(ctx->opcode) != 0)) {
2925         gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
2926     }
2927 }
2928 
2929 /* sraw & sraw. */
2930 static void gen_sraw(DisasContext *ctx)
2931 {
2932     gen_helper_sraw(cpu_gpr[rA(ctx->opcode)], cpu_env,
2933                     cpu_gpr[rS(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]);
2934     if (unlikely(Rc(ctx->opcode) != 0)) {
2935         gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
2936     }
2937 }
2938 
2939 /* srawi & srawi. */
2940 static void gen_srawi(DisasContext *ctx)
2941 {
2942     int sh = SH(ctx->opcode);
2943     TCGv dst = cpu_gpr[rA(ctx->opcode)];
2944     TCGv src = cpu_gpr[rS(ctx->opcode)];
2945     if (sh == 0) {
2946         tcg_gen_ext32s_tl(dst, src);
2947         tcg_gen_movi_tl(cpu_ca, 0);
2948         if (is_isa300(ctx)) {
2949             tcg_gen_movi_tl(cpu_ca32, 0);
2950         }
2951     } else {
2952         TCGv t0;
2953         tcg_gen_ext32s_tl(dst, src);
2954         tcg_gen_andi_tl(cpu_ca, dst, (1ULL << sh) - 1);
2955         t0 = tcg_temp_new();
2956         tcg_gen_sari_tl(t0, dst, TARGET_LONG_BITS - 1);
2957         tcg_gen_and_tl(cpu_ca, cpu_ca, t0);
2958         tcg_temp_free(t0);
2959         tcg_gen_setcondi_tl(TCG_COND_NE, cpu_ca, cpu_ca, 0);
2960         if (is_isa300(ctx)) {
2961             tcg_gen_mov_tl(cpu_ca32, cpu_ca);
2962         }
2963         tcg_gen_sari_tl(dst, dst, sh);
2964     }
2965     if (unlikely(Rc(ctx->opcode) != 0)) {
2966         gen_set_Rc0(ctx, dst);
2967     }
2968 }
2969 
2970 /* srw & srw. */
2971 static void gen_srw(DisasContext *ctx)
2972 {
2973     TCGv t0, t1;
2974 
2975     t0 = tcg_temp_new();
2976     /* AND rS with a mask that is 0 when rB >= 0x20 */
2977 #if defined(TARGET_PPC64)
2978     tcg_gen_shli_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x3a);
2979     tcg_gen_sari_tl(t0, t0, 0x3f);
2980 #else
2981     tcg_gen_shli_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x1a);
2982     tcg_gen_sari_tl(t0, t0, 0x1f);
2983 #endif
2984     tcg_gen_andc_tl(t0, cpu_gpr[rS(ctx->opcode)], t0);
2985     tcg_gen_ext32u_tl(t0, t0);
2986     t1 = tcg_temp_new();
2987     tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x1f);
2988     tcg_gen_shr_tl(cpu_gpr[rA(ctx->opcode)], t0, t1);
2989     tcg_temp_free(t1);
2990     tcg_temp_free(t0);
2991     if (unlikely(Rc(ctx->opcode) != 0)) {
2992         gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
2993     }
2994 }
2995 
2996 #if defined(TARGET_PPC64)
2997 /* sld & sld. */
2998 static void gen_sld(DisasContext *ctx)
2999 {
3000     TCGv t0, t1;
3001 
3002     t0 = tcg_temp_new();
3003     /* AND rS with a mask that is 0 when rB >= 0x40 */
3004     tcg_gen_shli_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x39);
3005     tcg_gen_sari_tl(t0, t0, 0x3f);
3006     tcg_gen_andc_tl(t0, cpu_gpr[rS(ctx->opcode)], t0);
3007     t1 = tcg_temp_new();
3008     tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x3f);
3009     tcg_gen_shl_tl(cpu_gpr[rA(ctx->opcode)], t0, t1);
3010     tcg_temp_free(t1);
3011     tcg_temp_free(t0);
3012     if (unlikely(Rc(ctx->opcode) != 0)) {
3013         gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
3014     }
3015 }
3016 
3017 /* srad & srad. */
3018 static void gen_srad(DisasContext *ctx)
3019 {
3020     gen_helper_srad(cpu_gpr[rA(ctx->opcode)], cpu_env,
3021                     cpu_gpr[rS(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]);
3022     if (unlikely(Rc(ctx->opcode) != 0)) {
3023         gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
3024     }
3025 }
3026 /* sradi & sradi. */
3027 static inline void gen_sradi(DisasContext *ctx, int n)
3028 {
3029     int sh = SH(ctx->opcode) + (n << 5);
3030     TCGv dst = cpu_gpr[rA(ctx->opcode)];
3031     TCGv src = cpu_gpr[rS(ctx->opcode)];
3032     if (sh == 0) {
3033         tcg_gen_mov_tl(dst, src);
3034         tcg_gen_movi_tl(cpu_ca, 0);
3035         if (is_isa300(ctx)) {
3036             tcg_gen_movi_tl(cpu_ca32, 0);
3037         }
3038     } else {
3039         TCGv t0;
3040         tcg_gen_andi_tl(cpu_ca, src, (1ULL << sh) - 1);
3041         t0 = tcg_temp_new();
3042         tcg_gen_sari_tl(t0, src, TARGET_LONG_BITS - 1);
3043         tcg_gen_and_tl(cpu_ca, cpu_ca, t0);
3044         tcg_temp_free(t0);
3045         tcg_gen_setcondi_tl(TCG_COND_NE, cpu_ca, cpu_ca, 0);
3046         if (is_isa300(ctx)) {
3047             tcg_gen_mov_tl(cpu_ca32, cpu_ca);
3048         }
3049         tcg_gen_sari_tl(dst, src, sh);
3050     }
3051     if (unlikely(Rc(ctx->opcode) != 0)) {
3052         gen_set_Rc0(ctx, dst);
3053     }
3054 }
3055 
3056 static void gen_sradi0(DisasContext *ctx)
3057 {
3058     gen_sradi(ctx, 0);
3059 }
3060 
3061 static void gen_sradi1(DisasContext *ctx)
3062 {
3063     gen_sradi(ctx, 1);
3064 }
3065 
3066 /* extswsli & extswsli. */
3067 static inline void gen_extswsli(DisasContext *ctx, int n)
3068 {
3069     int sh = SH(ctx->opcode) + (n << 5);
3070     TCGv dst = cpu_gpr[rA(ctx->opcode)];
3071     TCGv src = cpu_gpr[rS(ctx->opcode)];
3072 
3073     tcg_gen_ext32s_tl(dst, src);
3074     tcg_gen_shli_tl(dst, dst, sh);
3075     if (unlikely(Rc(ctx->opcode) != 0)) {
3076         gen_set_Rc0(ctx, dst);
3077     }
3078 }
3079 
3080 static void gen_extswsli0(DisasContext *ctx)
3081 {
3082     gen_extswsli(ctx, 0);
3083 }
3084 
3085 static void gen_extswsli1(DisasContext *ctx)
3086 {
3087     gen_extswsli(ctx, 1);
3088 }
3089 
3090 /* srd & srd. */
3091 static void gen_srd(DisasContext *ctx)
3092 {
3093     TCGv t0, t1;
3094 
3095     t0 = tcg_temp_new();
3096     /* AND rS with a mask that is 0 when rB >= 0x40 */
3097     tcg_gen_shli_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x39);
3098     tcg_gen_sari_tl(t0, t0, 0x3f);
3099     tcg_gen_andc_tl(t0, cpu_gpr[rS(ctx->opcode)], t0);
3100     t1 = tcg_temp_new();
3101     tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x3f);
3102     tcg_gen_shr_tl(cpu_gpr[rA(ctx->opcode)], t0, t1);
3103     tcg_temp_free(t1);
3104     tcg_temp_free(t0);
3105     if (unlikely(Rc(ctx->opcode) != 0)) {
3106         gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
3107     }
3108 }
3109 #endif
3110 
3111 /***                           Addressing modes                            ***/
3112 /* Register indirect with immediate index : EA = (rA|0) + SIMM */
3113 static inline void gen_addr_imm_index(DisasContext *ctx, TCGv EA,
3114                                       target_long maskl)
3115 {
3116     target_long simm = SIMM(ctx->opcode);
3117 
3118     simm &= ~maskl;
3119     if (rA(ctx->opcode) == 0) {
3120         if (NARROW_MODE(ctx)) {
3121             simm = (uint32_t)simm;
3122         }
3123         tcg_gen_movi_tl(EA, simm);
3124     } else if (likely(simm != 0)) {
3125         tcg_gen_addi_tl(EA, cpu_gpr[rA(ctx->opcode)], simm);
3126         if (NARROW_MODE(ctx)) {
3127             tcg_gen_ext32u_tl(EA, EA);
3128         }
3129     } else {
3130         if (NARROW_MODE(ctx)) {
3131             tcg_gen_ext32u_tl(EA, cpu_gpr[rA(ctx->opcode)]);
3132         } else {
3133             tcg_gen_mov_tl(EA, cpu_gpr[rA(ctx->opcode)]);
3134         }
3135     }
3136 }
3137 
3138 static inline void gen_addr_reg_index(DisasContext *ctx, TCGv EA)
3139 {
3140     if (rA(ctx->opcode) == 0) {
3141         if (NARROW_MODE(ctx)) {
3142             tcg_gen_ext32u_tl(EA, cpu_gpr[rB(ctx->opcode)]);
3143         } else {
3144             tcg_gen_mov_tl(EA, cpu_gpr[rB(ctx->opcode)]);
3145         }
3146     } else {
3147         tcg_gen_add_tl(EA, cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]);
3148         if (NARROW_MODE(ctx)) {
3149             tcg_gen_ext32u_tl(EA, EA);
3150         }
3151     }
3152 }
3153 
3154 static inline void gen_addr_register(DisasContext *ctx, TCGv EA)
3155 {
3156     if (rA(ctx->opcode) == 0) {
3157         tcg_gen_movi_tl(EA, 0);
3158     } else if (NARROW_MODE(ctx)) {
3159         tcg_gen_ext32u_tl(EA, cpu_gpr[rA(ctx->opcode)]);
3160     } else {
3161         tcg_gen_mov_tl(EA, cpu_gpr[rA(ctx->opcode)]);
3162     }
3163 }
3164 
3165 static inline void gen_addr_add(DisasContext *ctx, TCGv ret, TCGv arg1,
3166                                 target_long val)
3167 {
3168     tcg_gen_addi_tl(ret, arg1, val);
3169     if (NARROW_MODE(ctx)) {
3170         tcg_gen_ext32u_tl(ret, ret);
3171     }
3172 }
3173 
3174 static inline void gen_align_no_le(DisasContext *ctx)
3175 {
3176     gen_exception_err(ctx, POWERPC_EXCP_ALIGN,
3177                       (ctx->opcode & 0x03FF0000) | POWERPC_EXCP_ALIGN_LE);
3178 }
3179 
3180 static TCGv do_ea_calc(DisasContext *ctx, int ra, TCGv displ)
3181 {
3182     TCGv ea = tcg_temp_new();
3183     if (ra) {
3184         tcg_gen_add_tl(ea, cpu_gpr[ra], displ);
3185     } else {
3186         tcg_gen_mov_tl(ea, displ);
3187     }
3188     if (NARROW_MODE(ctx)) {
3189         tcg_gen_ext32u_tl(ea, ea);
3190     }
3191     return ea;
3192 }
3193 
3194 /***                             Integer load                              ***/
3195 #define DEF_MEMOP(op) ((op) | ctx->default_tcg_memop_mask)
3196 #define BSWAP_MEMOP(op) ((op) | (ctx->default_tcg_memop_mask ^ MO_BSWAP))
3197 
3198 #define GEN_QEMU_LOAD_TL(ldop, op)                                      \
3199 static void glue(gen_qemu_, ldop)(DisasContext *ctx,                    \
3200                                   TCGv val,                             \
3201                                   TCGv addr)                            \
3202 {                                                                       \
3203     tcg_gen_qemu_ld_tl(val, addr, ctx->mem_idx, op);                    \
3204 }
3205 
3206 GEN_QEMU_LOAD_TL(ld8u,  DEF_MEMOP(MO_UB))
3207 GEN_QEMU_LOAD_TL(ld16u, DEF_MEMOP(MO_UW))
3208 GEN_QEMU_LOAD_TL(ld16s, DEF_MEMOP(MO_SW))
3209 GEN_QEMU_LOAD_TL(ld32u, DEF_MEMOP(MO_UL))
3210 GEN_QEMU_LOAD_TL(ld32s, DEF_MEMOP(MO_SL))
3211 
3212 GEN_QEMU_LOAD_TL(ld16ur, BSWAP_MEMOP(MO_UW))
3213 GEN_QEMU_LOAD_TL(ld32ur, BSWAP_MEMOP(MO_UL))
3214 
3215 #define GEN_QEMU_LOAD_64(ldop, op)                                  \
3216 static void glue(gen_qemu_, glue(ldop, _i64))(DisasContext *ctx,    \
3217                                              TCGv_i64 val,          \
3218                                              TCGv addr)             \
3219 {                                                                   \
3220     tcg_gen_qemu_ld_i64(val, addr, ctx->mem_idx, op);               \
3221 }
3222 
3223 GEN_QEMU_LOAD_64(ld8u,  DEF_MEMOP(MO_UB))
3224 GEN_QEMU_LOAD_64(ld16u, DEF_MEMOP(MO_UW))
3225 GEN_QEMU_LOAD_64(ld32u, DEF_MEMOP(MO_UL))
3226 GEN_QEMU_LOAD_64(ld32s, DEF_MEMOP(MO_SL))
3227 GEN_QEMU_LOAD_64(ld64,  DEF_MEMOP(MO_UQ))
3228 
3229 #if defined(TARGET_PPC64)
3230 GEN_QEMU_LOAD_64(ld64ur, BSWAP_MEMOP(MO_UQ))
3231 #endif
3232 
3233 #define GEN_QEMU_STORE_TL(stop, op)                                     \
3234 static void glue(gen_qemu_, stop)(DisasContext *ctx,                    \
3235                                   TCGv val,                             \
3236                                   TCGv addr)                            \
3237 {                                                                       \
3238     tcg_gen_qemu_st_tl(val, addr, ctx->mem_idx, op);                    \
3239 }
3240 
3241 #if defined(TARGET_PPC64) || !defined(CONFIG_USER_ONLY)
3242 GEN_QEMU_STORE_TL(st8,  DEF_MEMOP(MO_UB))
3243 #endif
3244 GEN_QEMU_STORE_TL(st16, DEF_MEMOP(MO_UW))
3245 GEN_QEMU_STORE_TL(st32, DEF_MEMOP(MO_UL))
3246 
3247 GEN_QEMU_STORE_TL(st16r, BSWAP_MEMOP(MO_UW))
3248 GEN_QEMU_STORE_TL(st32r, BSWAP_MEMOP(MO_UL))
3249 
3250 #define GEN_QEMU_STORE_64(stop, op)                               \
3251 static void glue(gen_qemu_, glue(stop, _i64))(DisasContext *ctx,  \
3252                                               TCGv_i64 val,       \
3253                                               TCGv addr)          \
3254 {                                                                 \
3255     tcg_gen_qemu_st_i64(val, addr, ctx->mem_idx, op);             \
3256 }
3257 
3258 GEN_QEMU_STORE_64(st8,  DEF_MEMOP(MO_UB))
3259 GEN_QEMU_STORE_64(st16, DEF_MEMOP(MO_UW))
3260 GEN_QEMU_STORE_64(st32, DEF_MEMOP(MO_UL))
3261 GEN_QEMU_STORE_64(st64, DEF_MEMOP(MO_UQ))
3262 
3263 #if defined(TARGET_PPC64)
3264 GEN_QEMU_STORE_64(st64r, BSWAP_MEMOP(MO_UQ))
3265 #endif
3266 
3267 #define GEN_LDX_E(name, ldop, opc2, opc3, type, type2, chk)                   \
3268 static void glue(gen_, name##x)(DisasContext *ctx)                            \
3269 {                                                                             \
3270     TCGv EA;                                                                  \
3271     chk(ctx);                                                                 \
3272     gen_set_access_type(ctx, ACCESS_INT);                                     \
3273     EA = tcg_temp_new();                                                      \
3274     gen_addr_reg_index(ctx, EA);                                              \
3275     gen_qemu_##ldop(ctx, cpu_gpr[rD(ctx->opcode)], EA);                       \
3276     tcg_temp_free(EA);                                                        \
3277 }
3278 
3279 #define GEN_LDX(name, ldop, opc2, opc3, type)                                 \
3280     GEN_LDX_E(name, ldop, opc2, opc3, type, PPC_NONE, CHK_NONE)
3281 
3282 #define GEN_LDX_HVRM(name, ldop, opc2, opc3, type)                            \
3283     GEN_LDX_E(name, ldop, opc2, opc3, type, PPC_NONE, CHK_HVRM)
3284 
3285 #define GEN_LDEPX(name, ldop, opc2, opc3)                                     \
3286 static void glue(gen_, name##epx)(DisasContext *ctx)                          \
3287 {                                                                             \
3288     TCGv EA;                                                                  \
3289     CHK_SV(ctx);                                                              \
3290     gen_set_access_type(ctx, ACCESS_INT);                                     \
3291     EA = tcg_temp_new();                                                      \
3292     gen_addr_reg_index(ctx, EA);                                              \
3293     tcg_gen_qemu_ld_tl(cpu_gpr[rD(ctx->opcode)], EA, PPC_TLB_EPID_LOAD, ldop);\
3294     tcg_temp_free(EA);                                                        \
3295 }
3296 
3297 GEN_LDEPX(lb, DEF_MEMOP(MO_UB), 0x1F, 0x02)
3298 GEN_LDEPX(lh, DEF_MEMOP(MO_UW), 0x1F, 0x08)
3299 GEN_LDEPX(lw, DEF_MEMOP(MO_UL), 0x1F, 0x00)
3300 #if defined(TARGET_PPC64)
3301 GEN_LDEPX(ld, DEF_MEMOP(MO_UQ), 0x1D, 0x00)
3302 #endif
3303 
3304 #if defined(TARGET_PPC64)
3305 /* CI load/store variants */
3306 GEN_LDX_HVRM(ldcix, ld64_i64, 0x15, 0x1b, PPC_CILDST)
3307 GEN_LDX_HVRM(lwzcix, ld32u, 0x15, 0x15, PPC_CILDST)
3308 GEN_LDX_HVRM(lhzcix, ld16u, 0x15, 0x19, PPC_CILDST)
3309 GEN_LDX_HVRM(lbzcix, ld8u, 0x15, 0x1a, PPC_CILDST)
3310 #endif
3311 
3312 /***                              Integer store                            ***/
3313 #define GEN_STX_E(name, stop, opc2, opc3, type, type2, chk)                   \
3314 static void glue(gen_, name##x)(DisasContext *ctx)                            \
3315 {                                                                             \
3316     TCGv EA;                                                                  \
3317     chk(ctx);                                                                 \
3318     gen_set_access_type(ctx, ACCESS_INT);                                     \
3319     EA = tcg_temp_new();                                                      \
3320     gen_addr_reg_index(ctx, EA);                                              \
3321     gen_qemu_##stop(ctx, cpu_gpr[rS(ctx->opcode)], EA);                       \
3322     tcg_temp_free(EA);                                                        \
3323 }
3324 #define GEN_STX(name, stop, opc2, opc3, type)                                 \
3325     GEN_STX_E(name, stop, opc2, opc3, type, PPC_NONE, CHK_NONE)
3326 
3327 #define GEN_STX_HVRM(name, stop, opc2, opc3, type)                            \
3328     GEN_STX_E(name, stop, opc2, opc3, type, PPC_NONE, CHK_HVRM)
3329 
3330 #define GEN_STEPX(name, stop, opc2, opc3)                                     \
3331 static void glue(gen_, name##epx)(DisasContext *ctx)                          \
3332 {                                                                             \
3333     TCGv EA;                                                                  \
3334     CHK_SV(ctx);                                                              \
3335     gen_set_access_type(ctx, ACCESS_INT);                                     \
3336     EA = tcg_temp_new();                                                      \
3337     gen_addr_reg_index(ctx, EA);                                              \
3338     tcg_gen_qemu_st_tl(                                                       \
3339         cpu_gpr[rD(ctx->opcode)], EA, PPC_TLB_EPID_STORE, stop);              \
3340     tcg_temp_free(EA);                                                        \
3341 }
3342 
3343 GEN_STEPX(stb, DEF_MEMOP(MO_UB), 0x1F, 0x06)
3344 GEN_STEPX(sth, DEF_MEMOP(MO_UW), 0x1F, 0x0C)
3345 GEN_STEPX(stw, DEF_MEMOP(MO_UL), 0x1F, 0x04)
3346 #if defined(TARGET_PPC64)
3347 GEN_STEPX(std, DEF_MEMOP(MO_UQ), 0x1d, 0x04)
3348 #endif
3349 
3350 #if defined(TARGET_PPC64)
3351 GEN_STX_HVRM(stdcix, st64_i64, 0x15, 0x1f, PPC_CILDST)
3352 GEN_STX_HVRM(stwcix, st32, 0x15, 0x1c, PPC_CILDST)
3353 GEN_STX_HVRM(sthcix, st16, 0x15, 0x1d, PPC_CILDST)
3354 GEN_STX_HVRM(stbcix, st8, 0x15, 0x1e, PPC_CILDST)
3355 #endif
3356 /***                Integer load and store with byte reverse               ***/
3357 
3358 /* lhbrx */
3359 GEN_LDX(lhbr, ld16ur, 0x16, 0x18, PPC_INTEGER);
3360 
3361 /* lwbrx */
3362 GEN_LDX(lwbr, ld32ur, 0x16, 0x10, PPC_INTEGER);
3363 
3364 #if defined(TARGET_PPC64)
3365 /* ldbrx */
3366 GEN_LDX_E(ldbr, ld64ur_i64, 0x14, 0x10, PPC_NONE, PPC2_DBRX, CHK_NONE);
3367 /* stdbrx */
3368 GEN_STX_E(stdbr, st64r_i64, 0x14, 0x14, PPC_NONE, PPC2_DBRX, CHK_NONE);
3369 #endif  /* TARGET_PPC64 */
3370 
3371 /* sthbrx */
3372 GEN_STX(sthbr, st16r, 0x16, 0x1C, PPC_INTEGER);
3373 /* stwbrx */
3374 GEN_STX(stwbr, st32r, 0x16, 0x14, PPC_INTEGER);
3375 
3376 /***                    Integer load and store multiple                    ***/
3377 
3378 /* lmw */
3379 static void gen_lmw(DisasContext *ctx)
3380 {
3381     TCGv t0;
3382     TCGv_i32 t1;
3383 
3384     if (ctx->le_mode) {
3385         gen_align_no_le(ctx);
3386         return;
3387     }
3388     gen_set_access_type(ctx, ACCESS_INT);
3389     t0 = tcg_temp_new();
3390     t1 = tcg_const_i32(rD(ctx->opcode));
3391     gen_addr_imm_index(ctx, t0, 0);
3392     gen_helper_lmw(cpu_env, t0, t1);
3393     tcg_temp_free(t0);
3394     tcg_temp_free_i32(t1);
3395 }
3396 
3397 /* stmw */
3398 static void gen_stmw(DisasContext *ctx)
3399 {
3400     TCGv t0;
3401     TCGv_i32 t1;
3402 
3403     if (ctx->le_mode) {
3404         gen_align_no_le(ctx);
3405         return;
3406     }
3407     gen_set_access_type(ctx, ACCESS_INT);
3408     t0 = tcg_temp_new();
3409     t1 = tcg_const_i32(rS(ctx->opcode));
3410     gen_addr_imm_index(ctx, t0, 0);
3411     gen_helper_stmw(cpu_env, t0, t1);
3412     tcg_temp_free(t0);
3413     tcg_temp_free_i32(t1);
3414 }
3415 
3416 /***                    Integer load and store strings                     ***/
3417 
3418 /* lswi */
3419 /*
3420  * PowerPC32 specification says we must generate an exception if rA is
3421  * in the range of registers to be loaded.  In an other hand, IBM says
3422  * this is valid, but rA won't be loaded.  For now, I'll follow the
3423  * spec...
3424  */
3425 static void gen_lswi(DisasContext *ctx)
3426 {
3427     TCGv t0;
3428     TCGv_i32 t1, t2;
3429     int nb = NB(ctx->opcode);
3430     int start = rD(ctx->opcode);
3431     int ra = rA(ctx->opcode);
3432     int nr;
3433 
3434     if (ctx->le_mode) {
3435         gen_align_no_le(ctx);
3436         return;
3437     }
3438     if (nb == 0) {
3439         nb = 32;
3440     }
3441     nr = DIV_ROUND_UP(nb, 4);
3442     if (unlikely(lsw_reg_in_range(start, nr, ra))) {
3443         gen_inval_exception(ctx, POWERPC_EXCP_INVAL_LSWX);
3444         return;
3445     }
3446     gen_set_access_type(ctx, ACCESS_INT);
3447     t0 = tcg_temp_new();
3448     gen_addr_register(ctx, t0);
3449     t1 = tcg_const_i32(nb);
3450     t2 = tcg_const_i32(start);
3451     gen_helper_lsw(cpu_env, t0, t1, t2);
3452     tcg_temp_free(t0);
3453     tcg_temp_free_i32(t1);
3454     tcg_temp_free_i32(t2);
3455 }
3456 
3457 /* lswx */
3458 static void gen_lswx(DisasContext *ctx)
3459 {
3460     TCGv t0;
3461     TCGv_i32 t1, t2, t3;
3462 
3463     if (ctx->le_mode) {
3464         gen_align_no_le(ctx);
3465         return;
3466     }
3467     gen_set_access_type(ctx, ACCESS_INT);
3468     t0 = tcg_temp_new();
3469     gen_addr_reg_index(ctx, t0);
3470     t1 = tcg_const_i32(rD(ctx->opcode));
3471     t2 = tcg_const_i32(rA(ctx->opcode));
3472     t3 = tcg_const_i32(rB(ctx->opcode));
3473     gen_helper_lswx(cpu_env, t0, t1, t2, t3);
3474     tcg_temp_free(t0);
3475     tcg_temp_free_i32(t1);
3476     tcg_temp_free_i32(t2);
3477     tcg_temp_free_i32(t3);
3478 }
3479 
3480 /* stswi */
3481 static void gen_stswi(DisasContext *ctx)
3482 {
3483     TCGv t0;
3484     TCGv_i32 t1, t2;
3485     int nb = NB(ctx->opcode);
3486 
3487     if (ctx->le_mode) {
3488         gen_align_no_le(ctx);
3489         return;
3490     }
3491     gen_set_access_type(ctx, ACCESS_INT);
3492     t0 = tcg_temp_new();
3493     gen_addr_register(ctx, t0);
3494     if (nb == 0) {
3495         nb = 32;
3496     }
3497     t1 = tcg_const_i32(nb);
3498     t2 = tcg_const_i32(rS(ctx->opcode));
3499     gen_helper_stsw(cpu_env, t0, t1, t2);
3500     tcg_temp_free(t0);
3501     tcg_temp_free_i32(t1);
3502     tcg_temp_free_i32(t2);
3503 }
3504 
3505 /* stswx */
3506 static void gen_stswx(DisasContext *ctx)
3507 {
3508     TCGv t0;
3509     TCGv_i32 t1, t2;
3510 
3511     if (ctx->le_mode) {
3512         gen_align_no_le(ctx);
3513         return;
3514     }
3515     gen_set_access_type(ctx, ACCESS_INT);
3516     t0 = tcg_temp_new();
3517     gen_addr_reg_index(ctx, t0);
3518     t1 = tcg_temp_new_i32();
3519     tcg_gen_trunc_tl_i32(t1, cpu_xer);
3520     tcg_gen_andi_i32(t1, t1, 0x7F);
3521     t2 = tcg_const_i32(rS(ctx->opcode));
3522     gen_helper_stsw(cpu_env, t0, t1, t2);
3523     tcg_temp_free(t0);
3524     tcg_temp_free_i32(t1);
3525     tcg_temp_free_i32(t2);
3526 }
3527 
3528 /***                        Memory synchronisation                         ***/
3529 /* eieio */
3530 static void gen_eieio(DisasContext *ctx)
3531 {
3532     TCGBar bar = TCG_MO_ALL;
3533 
3534     /*
3535      * eieio has complex semanitcs. It provides memory ordering between
3536      * operations in the set:
3537      * - loads from CI memory.
3538      * - stores to CI memory.
3539      * - stores to WT memory.
3540      *
3541      * It separately also orders memory for operations in the set:
3542      * - stores to cacheble memory.
3543      *
3544      * It also serializes instructions:
3545      * - dcbt and dcbst.
3546      *
3547      * It separately serializes:
3548      * - tlbie and tlbsync.
3549      *
3550      * And separately serializes:
3551      * - slbieg, slbiag, and slbsync.
3552      *
3553      * The end result is that CI memory ordering requires TCG_MO_ALL
3554      * and it is not possible to special-case more relaxed ordering for
3555      * cacheable accesses. TCG_BAR_SC is required to provide this
3556      * serialization.
3557      */
3558 
3559     /*
3560      * POWER9 has a eieio instruction variant using bit 6 as a hint to
3561      * tell the CPU it is a store-forwarding barrier.
3562      */
3563     if (ctx->opcode & 0x2000000) {
3564         /*
3565          * ISA says that "Reserved fields in instructions are ignored
3566          * by the processor". So ignore the bit 6 on non-POWER9 CPU but
3567          * as this is not an instruction software should be using,
3568          * complain to the user.
3569          */
3570         if (!(ctx->insns_flags2 & PPC2_ISA300)) {
3571             qemu_log_mask(LOG_GUEST_ERROR, "invalid eieio using bit 6 at @"
3572                           TARGET_FMT_lx "\n", ctx->cia);
3573         } else {
3574             bar = TCG_MO_ST_LD;
3575         }
3576     }
3577 
3578     tcg_gen_mb(bar | TCG_BAR_SC);
3579 }
3580 
3581 #if !defined(CONFIG_USER_ONLY)
3582 static inline void gen_check_tlb_flush(DisasContext *ctx, bool global)
3583 {
3584     TCGv_i32 t;
3585     TCGLabel *l;
3586 
3587     if (!ctx->lazy_tlb_flush) {
3588         return;
3589     }
3590     l = gen_new_label();
3591     t = tcg_temp_new_i32();
3592     tcg_gen_ld_i32(t, cpu_env, offsetof(CPUPPCState, tlb_need_flush));
3593     tcg_gen_brcondi_i32(TCG_COND_EQ, t, 0, l);
3594     if (global) {
3595         gen_helper_check_tlb_flush_global(cpu_env);
3596     } else {
3597         gen_helper_check_tlb_flush_local(cpu_env);
3598     }
3599     gen_set_label(l);
3600     tcg_temp_free_i32(t);
3601 }
3602 #else
3603 static inline void gen_check_tlb_flush(DisasContext *ctx, bool global) { }
3604 #endif
3605 
3606 /* isync */
3607 static void gen_isync(DisasContext *ctx)
3608 {
3609     /*
3610      * We need to check for a pending TLB flush. This can only happen in
3611      * kernel mode however so check MSR_PR
3612      */
3613     if (!ctx->pr) {
3614         gen_check_tlb_flush(ctx, false);
3615     }
3616     tcg_gen_mb(TCG_MO_ALL | TCG_BAR_SC);
3617     ctx->base.is_jmp = DISAS_EXIT_UPDATE;
3618 }
3619 
3620 #define MEMOP_GET_SIZE(x)  (1 << ((x) & MO_SIZE))
3621 
3622 static void gen_load_locked(DisasContext *ctx, MemOp memop)
3623 {
3624     TCGv gpr = cpu_gpr[rD(ctx->opcode)];
3625     TCGv t0 = tcg_temp_new();
3626 
3627     gen_set_access_type(ctx, ACCESS_RES);
3628     gen_addr_reg_index(ctx, t0);
3629     tcg_gen_qemu_ld_tl(gpr, t0, ctx->mem_idx, memop | MO_ALIGN);
3630     tcg_gen_mov_tl(cpu_reserve, t0);
3631     tcg_gen_mov_tl(cpu_reserve_val, gpr);
3632     tcg_gen_mb(TCG_MO_ALL | TCG_BAR_LDAQ);
3633     tcg_temp_free(t0);
3634 }
3635 
3636 #define LARX(name, memop)                  \
3637 static void gen_##name(DisasContext *ctx)  \
3638 {                                          \
3639     gen_load_locked(ctx, memop);           \
3640 }
3641 
3642 /* lwarx */
3643 LARX(lbarx, DEF_MEMOP(MO_UB))
3644 LARX(lharx, DEF_MEMOP(MO_UW))
3645 LARX(lwarx, DEF_MEMOP(MO_UL))
3646 
3647 static void gen_fetch_inc_conditional(DisasContext *ctx, MemOp memop,
3648                                       TCGv EA, TCGCond cond, int addend)
3649 {
3650     TCGv t = tcg_temp_new();
3651     TCGv t2 = tcg_temp_new();
3652     TCGv u = tcg_temp_new();
3653 
3654     tcg_gen_qemu_ld_tl(t, EA, ctx->mem_idx, memop);
3655     tcg_gen_addi_tl(t2, EA, MEMOP_GET_SIZE(memop));
3656     tcg_gen_qemu_ld_tl(t2, t2, ctx->mem_idx, memop);
3657     tcg_gen_addi_tl(u, t, addend);
3658 
3659     /* E.g. for fetch and increment bounded... */
3660     /* mem(EA,s) = (t != t2 ? u = t + 1 : t) */
3661     tcg_gen_movcond_tl(cond, u, t, t2, u, t);
3662     tcg_gen_qemu_st_tl(u, EA, ctx->mem_idx, memop);
3663 
3664     /* RT = (t != t2 ? t : u = 1<<(s*8-1)) */
3665     tcg_gen_movi_tl(u, 1 << (MEMOP_GET_SIZE(memop) * 8 - 1));
3666     tcg_gen_movcond_tl(cond, cpu_gpr[rD(ctx->opcode)], t, t2, t, u);
3667 
3668     tcg_temp_free(t);
3669     tcg_temp_free(t2);
3670     tcg_temp_free(u);
3671 }
3672 
3673 static void gen_ld_atomic(DisasContext *ctx, MemOp memop)
3674 {
3675     uint32_t gpr_FC = FC(ctx->opcode);
3676     TCGv EA = tcg_temp_new();
3677     int rt = rD(ctx->opcode);
3678     bool need_serial;
3679     TCGv src, dst;
3680 
3681     gen_addr_register(ctx, EA);
3682     dst = cpu_gpr[rt];
3683     src = cpu_gpr[(rt + 1) & 31];
3684 
3685     need_serial = false;
3686     memop |= MO_ALIGN;
3687     switch (gpr_FC) {
3688     case 0: /* Fetch and add */
3689         tcg_gen_atomic_fetch_add_tl(dst, EA, src, ctx->mem_idx, memop);
3690         break;
3691     case 1: /* Fetch and xor */
3692         tcg_gen_atomic_fetch_xor_tl(dst, EA, src, ctx->mem_idx, memop);
3693         break;
3694     case 2: /* Fetch and or */
3695         tcg_gen_atomic_fetch_or_tl(dst, EA, src, ctx->mem_idx, memop);
3696         break;
3697     case 3: /* Fetch and 'and' */
3698         tcg_gen_atomic_fetch_and_tl(dst, EA, src, ctx->mem_idx, memop);
3699         break;
3700     case 4:  /* Fetch and max unsigned */
3701         tcg_gen_atomic_fetch_umax_tl(dst, EA, src, ctx->mem_idx, memop);
3702         break;
3703     case 5:  /* Fetch and max signed */
3704         tcg_gen_atomic_fetch_smax_tl(dst, EA, src, ctx->mem_idx, memop);
3705         break;
3706     case 6:  /* Fetch and min unsigned */
3707         tcg_gen_atomic_fetch_umin_tl(dst, EA, src, ctx->mem_idx, memop);
3708         break;
3709     case 7:  /* Fetch and min signed */
3710         tcg_gen_atomic_fetch_smin_tl(dst, EA, src, ctx->mem_idx, memop);
3711         break;
3712     case 8: /* Swap */
3713         tcg_gen_atomic_xchg_tl(dst, EA, src, ctx->mem_idx, memop);
3714         break;
3715 
3716     case 16: /* Compare and swap not equal */
3717         if (tb_cflags(ctx->base.tb) & CF_PARALLEL) {
3718             need_serial = true;
3719         } else {
3720             TCGv t0 = tcg_temp_new();
3721             TCGv t1 = tcg_temp_new();
3722 
3723             tcg_gen_qemu_ld_tl(t0, EA, ctx->mem_idx, memop);
3724             if ((memop & MO_SIZE) == MO_64 || TARGET_LONG_BITS == 32) {
3725                 tcg_gen_mov_tl(t1, src);
3726             } else {
3727                 tcg_gen_ext32u_tl(t1, src);
3728             }
3729             tcg_gen_movcond_tl(TCG_COND_NE, t1, t0, t1,
3730                                cpu_gpr[(rt + 2) & 31], t0);
3731             tcg_gen_qemu_st_tl(t1, EA, ctx->mem_idx, memop);
3732             tcg_gen_mov_tl(dst, t0);
3733 
3734             tcg_temp_free(t0);
3735             tcg_temp_free(t1);
3736         }
3737         break;
3738 
3739     case 24: /* Fetch and increment bounded */
3740         if (tb_cflags(ctx->base.tb) & CF_PARALLEL) {
3741             need_serial = true;
3742         } else {
3743             gen_fetch_inc_conditional(ctx, memop, EA, TCG_COND_NE, 1);
3744         }
3745         break;
3746     case 25: /* Fetch and increment equal */
3747         if (tb_cflags(ctx->base.tb) & CF_PARALLEL) {
3748             need_serial = true;
3749         } else {
3750             gen_fetch_inc_conditional(ctx, memop, EA, TCG_COND_EQ, 1);
3751         }
3752         break;
3753     case 28: /* Fetch and decrement bounded */
3754         if (tb_cflags(ctx->base.tb) & CF_PARALLEL) {
3755             need_serial = true;
3756         } else {
3757             gen_fetch_inc_conditional(ctx, memop, EA, TCG_COND_NE, -1);
3758         }
3759         break;
3760 
3761     default:
3762         /* invoke data storage error handler */
3763         gen_exception_err(ctx, POWERPC_EXCP_DSI, POWERPC_EXCP_INVAL);
3764     }
3765     tcg_temp_free(EA);
3766 
3767     if (need_serial) {
3768         /* Restart with exclusive lock.  */
3769         gen_helper_exit_atomic(cpu_env);
3770         ctx->base.is_jmp = DISAS_NORETURN;
3771     }
3772 }
3773 
3774 static void gen_lwat(DisasContext *ctx)
3775 {
3776     gen_ld_atomic(ctx, DEF_MEMOP(MO_UL));
3777 }
3778 
3779 #ifdef TARGET_PPC64
3780 static void gen_ldat(DisasContext *ctx)
3781 {
3782     gen_ld_atomic(ctx, DEF_MEMOP(MO_UQ));
3783 }
3784 #endif
3785 
3786 static void gen_st_atomic(DisasContext *ctx, MemOp memop)
3787 {
3788     uint32_t gpr_FC = FC(ctx->opcode);
3789     TCGv EA = tcg_temp_new();
3790     TCGv src, discard;
3791 
3792     gen_addr_register(ctx, EA);
3793     src = cpu_gpr[rD(ctx->opcode)];
3794     discard = tcg_temp_new();
3795 
3796     memop |= MO_ALIGN;
3797     switch (gpr_FC) {
3798     case 0: /* add and Store */
3799         tcg_gen_atomic_add_fetch_tl(discard, EA, src, ctx->mem_idx, memop);
3800         break;
3801     case 1: /* xor and Store */
3802         tcg_gen_atomic_xor_fetch_tl(discard, EA, src, ctx->mem_idx, memop);
3803         break;
3804     case 2: /* Or and Store */
3805         tcg_gen_atomic_or_fetch_tl(discard, EA, src, ctx->mem_idx, memop);
3806         break;
3807     case 3: /* 'and' and Store */
3808         tcg_gen_atomic_and_fetch_tl(discard, EA, src, ctx->mem_idx, memop);
3809         break;
3810     case 4:  /* Store max unsigned */
3811         tcg_gen_atomic_umax_fetch_tl(discard, EA, src, ctx->mem_idx, memop);
3812         break;
3813     case 5:  /* Store max signed */
3814         tcg_gen_atomic_smax_fetch_tl(discard, EA, src, ctx->mem_idx, memop);
3815         break;
3816     case 6:  /* Store min unsigned */
3817         tcg_gen_atomic_umin_fetch_tl(discard, EA, src, ctx->mem_idx, memop);
3818         break;
3819     case 7:  /* Store min signed */
3820         tcg_gen_atomic_smin_fetch_tl(discard, EA, src, ctx->mem_idx, memop);
3821         break;
3822     case 24: /* Store twin  */
3823         if (tb_cflags(ctx->base.tb) & CF_PARALLEL) {
3824             /* Restart with exclusive lock.  */
3825             gen_helper_exit_atomic(cpu_env);
3826             ctx->base.is_jmp = DISAS_NORETURN;
3827         } else {
3828             TCGv t = tcg_temp_new();
3829             TCGv t2 = tcg_temp_new();
3830             TCGv s = tcg_temp_new();
3831             TCGv s2 = tcg_temp_new();
3832             TCGv ea_plus_s = tcg_temp_new();
3833 
3834             tcg_gen_qemu_ld_tl(t, EA, ctx->mem_idx, memop);
3835             tcg_gen_addi_tl(ea_plus_s, EA, MEMOP_GET_SIZE(memop));
3836             tcg_gen_qemu_ld_tl(t2, ea_plus_s, ctx->mem_idx, memop);
3837             tcg_gen_movcond_tl(TCG_COND_EQ, s, t, t2, src, t);
3838             tcg_gen_movcond_tl(TCG_COND_EQ, s2, t, t2, src, t2);
3839             tcg_gen_qemu_st_tl(s, EA, ctx->mem_idx, memop);
3840             tcg_gen_qemu_st_tl(s2, ea_plus_s, ctx->mem_idx, memop);
3841 
3842             tcg_temp_free(ea_plus_s);
3843             tcg_temp_free(s2);
3844             tcg_temp_free(s);
3845             tcg_temp_free(t2);
3846             tcg_temp_free(t);
3847         }
3848         break;
3849     default:
3850         /* invoke data storage error handler */
3851         gen_exception_err(ctx, POWERPC_EXCP_DSI, POWERPC_EXCP_INVAL);
3852     }
3853     tcg_temp_free(discard);
3854     tcg_temp_free(EA);
3855 }
3856 
3857 static void gen_stwat(DisasContext *ctx)
3858 {
3859     gen_st_atomic(ctx, DEF_MEMOP(MO_UL));
3860 }
3861 
3862 #ifdef TARGET_PPC64
3863 static void gen_stdat(DisasContext *ctx)
3864 {
3865     gen_st_atomic(ctx, DEF_MEMOP(MO_UQ));
3866 }
3867 #endif
3868 
3869 static void gen_conditional_store(DisasContext *ctx, MemOp memop)
3870 {
3871     TCGLabel *l1 = gen_new_label();
3872     TCGLabel *l2 = gen_new_label();
3873     TCGv t0 = tcg_temp_new();
3874     int reg = rS(ctx->opcode);
3875 
3876     gen_set_access_type(ctx, ACCESS_RES);
3877     gen_addr_reg_index(ctx, t0);
3878     tcg_gen_brcond_tl(TCG_COND_NE, t0, cpu_reserve, l1);
3879     tcg_temp_free(t0);
3880 
3881     t0 = tcg_temp_new();
3882     tcg_gen_atomic_cmpxchg_tl(t0, cpu_reserve, cpu_reserve_val,
3883                               cpu_gpr[reg], ctx->mem_idx,
3884                               DEF_MEMOP(memop) | MO_ALIGN);
3885     tcg_gen_setcond_tl(TCG_COND_EQ, t0, t0, cpu_reserve_val);
3886     tcg_gen_shli_tl(t0, t0, CRF_EQ_BIT);
3887     tcg_gen_or_tl(t0, t0, cpu_so);
3888     tcg_gen_trunc_tl_i32(cpu_crf[0], t0);
3889     tcg_temp_free(t0);
3890     tcg_gen_br(l2);
3891 
3892     gen_set_label(l1);
3893 
3894     /*
3895      * Address mismatch implies failure.  But we still need to provide
3896      * the memory barrier semantics of the instruction.
3897      */
3898     tcg_gen_mb(TCG_MO_ALL | TCG_BAR_STRL);
3899     tcg_gen_trunc_tl_i32(cpu_crf[0], cpu_so);
3900 
3901     gen_set_label(l2);
3902     tcg_gen_movi_tl(cpu_reserve, -1);
3903 }
3904 
3905 #define STCX(name, memop)                  \
3906 static void gen_##name(DisasContext *ctx)  \
3907 {                                          \
3908     gen_conditional_store(ctx, memop);     \
3909 }
3910 
3911 STCX(stbcx_, DEF_MEMOP(MO_UB))
3912 STCX(sthcx_, DEF_MEMOP(MO_UW))
3913 STCX(stwcx_, DEF_MEMOP(MO_UL))
3914 
3915 #if defined(TARGET_PPC64)
3916 /* ldarx */
3917 LARX(ldarx, DEF_MEMOP(MO_UQ))
3918 /* stdcx. */
3919 STCX(stdcx_, DEF_MEMOP(MO_UQ))
3920 
3921 /* lqarx */
3922 static void gen_lqarx(DisasContext *ctx)
3923 {
3924     int rd = rD(ctx->opcode);
3925     TCGv EA, hi, lo;
3926 
3927     if (unlikely((rd & 1) || (rd == rA(ctx->opcode)) ||
3928                  (rd == rB(ctx->opcode)))) {
3929         gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
3930         return;
3931     }
3932 
3933     gen_set_access_type(ctx, ACCESS_RES);
3934     EA = tcg_temp_new();
3935     gen_addr_reg_index(ctx, EA);
3936 
3937     /* Note that the low part is always in RD+1, even in LE mode.  */
3938     lo = cpu_gpr[rd + 1];
3939     hi = cpu_gpr[rd];
3940 
3941     if (tb_cflags(ctx->base.tb) & CF_PARALLEL) {
3942         if (HAVE_ATOMIC128) {
3943             TCGv_i32 oi = tcg_temp_new_i32();
3944             if (ctx->le_mode) {
3945                 tcg_gen_movi_i32(oi, make_memop_idx(MO_LE | MO_128 | MO_ALIGN,
3946                                                     ctx->mem_idx));
3947                 gen_helper_lq_le_parallel(lo, cpu_env, EA, oi);
3948             } else {
3949                 tcg_gen_movi_i32(oi, make_memop_idx(MO_BE | MO_128 | MO_ALIGN,
3950                                                     ctx->mem_idx));
3951                 gen_helper_lq_be_parallel(lo, cpu_env, EA, oi);
3952             }
3953             tcg_temp_free_i32(oi);
3954             tcg_gen_ld_i64(hi, cpu_env, offsetof(CPUPPCState, retxh));
3955         } else {
3956             /* Restart with exclusive lock.  */
3957             gen_helper_exit_atomic(cpu_env);
3958             ctx->base.is_jmp = DISAS_NORETURN;
3959             tcg_temp_free(EA);
3960             return;
3961         }
3962     } else if (ctx->le_mode) {
3963         tcg_gen_qemu_ld_i64(lo, EA, ctx->mem_idx, MO_LEUQ | MO_ALIGN_16);
3964         tcg_gen_mov_tl(cpu_reserve, EA);
3965         gen_addr_add(ctx, EA, EA, 8);
3966         tcg_gen_qemu_ld_i64(hi, EA, ctx->mem_idx, MO_LEUQ);
3967     } else {
3968         tcg_gen_qemu_ld_i64(hi, EA, ctx->mem_idx, MO_BEUQ | MO_ALIGN_16);
3969         tcg_gen_mov_tl(cpu_reserve, EA);
3970         gen_addr_add(ctx, EA, EA, 8);
3971         tcg_gen_qemu_ld_i64(lo, EA, ctx->mem_idx, MO_BEUQ);
3972     }
3973     tcg_temp_free(EA);
3974 
3975     tcg_gen_st_tl(hi, cpu_env, offsetof(CPUPPCState, reserve_val));
3976     tcg_gen_st_tl(lo, cpu_env, offsetof(CPUPPCState, reserve_val2));
3977 }
3978 
3979 /* stqcx. */
3980 static void gen_stqcx_(DisasContext *ctx)
3981 {
3982     int rs = rS(ctx->opcode);
3983     TCGv EA, hi, lo;
3984 
3985     if (unlikely(rs & 1)) {
3986         gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
3987         return;
3988     }
3989 
3990     gen_set_access_type(ctx, ACCESS_RES);
3991     EA = tcg_temp_new();
3992     gen_addr_reg_index(ctx, EA);
3993 
3994     /* Note that the low part is always in RS+1, even in LE mode.  */
3995     lo = cpu_gpr[rs + 1];
3996     hi = cpu_gpr[rs];
3997 
3998     if (tb_cflags(ctx->base.tb) & CF_PARALLEL) {
3999         if (HAVE_CMPXCHG128) {
4000             TCGv_i32 oi = tcg_const_i32(DEF_MEMOP(MO_128) | MO_ALIGN);
4001             if (ctx->le_mode) {
4002                 gen_helper_stqcx_le_parallel(cpu_crf[0], cpu_env,
4003                                              EA, lo, hi, oi);
4004             } else {
4005                 gen_helper_stqcx_be_parallel(cpu_crf[0], cpu_env,
4006                                              EA, lo, hi, oi);
4007             }
4008             tcg_temp_free_i32(oi);
4009         } else {
4010             /* Restart with exclusive lock.  */
4011             gen_helper_exit_atomic(cpu_env);
4012             ctx->base.is_jmp = DISAS_NORETURN;
4013         }
4014         tcg_temp_free(EA);
4015     } else {
4016         TCGLabel *lab_fail = gen_new_label();
4017         TCGLabel *lab_over = gen_new_label();
4018         TCGv_i64 t0 = tcg_temp_new_i64();
4019         TCGv_i64 t1 = tcg_temp_new_i64();
4020 
4021         tcg_gen_brcond_tl(TCG_COND_NE, EA, cpu_reserve, lab_fail);
4022         tcg_temp_free(EA);
4023 
4024         gen_qemu_ld64_i64(ctx, t0, cpu_reserve);
4025         tcg_gen_ld_i64(t1, cpu_env, (ctx->le_mode
4026                                      ? offsetof(CPUPPCState, reserve_val2)
4027                                      : offsetof(CPUPPCState, reserve_val)));
4028         tcg_gen_brcond_i64(TCG_COND_NE, t0, t1, lab_fail);
4029 
4030         tcg_gen_addi_i64(t0, cpu_reserve, 8);
4031         gen_qemu_ld64_i64(ctx, t0, t0);
4032         tcg_gen_ld_i64(t1, cpu_env, (ctx->le_mode
4033                                      ? offsetof(CPUPPCState, reserve_val)
4034                                      : offsetof(CPUPPCState, reserve_val2)));
4035         tcg_gen_brcond_i64(TCG_COND_NE, t0, t1, lab_fail);
4036 
4037         /* Success */
4038         gen_qemu_st64_i64(ctx, ctx->le_mode ? lo : hi, cpu_reserve);
4039         tcg_gen_addi_i64(t0, cpu_reserve, 8);
4040         gen_qemu_st64_i64(ctx, ctx->le_mode ? hi : lo, t0);
4041 
4042         tcg_gen_trunc_tl_i32(cpu_crf[0], cpu_so);
4043         tcg_gen_ori_i32(cpu_crf[0], cpu_crf[0], CRF_EQ);
4044         tcg_gen_br(lab_over);
4045 
4046         gen_set_label(lab_fail);
4047         tcg_gen_trunc_tl_i32(cpu_crf[0], cpu_so);
4048 
4049         gen_set_label(lab_over);
4050         tcg_gen_movi_tl(cpu_reserve, -1);
4051         tcg_temp_free_i64(t0);
4052         tcg_temp_free_i64(t1);
4053     }
4054 }
4055 #endif /* defined(TARGET_PPC64) */
4056 
4057 /* sync */
4058 static void gen_sync(DisasContext *ctx)
4059 {
4060     TCGBar bar = TCG_MO_ALL;
4061     uint32_t l = (ctx->opcode >> 21) & 3;
4062 
4063     if ((l == 1) && (ctx->insns_flags2 & PPC2_MEM_LWSYNC)) {
4064         bar = TCG_MO_LD_LD | TCG_MO_LD_ST | TCG_MO_ST_ST;
4065     }
4066 
4067     /*
4068      * We may need to check for a pending TLB flush.
4069      *
4070      * We do this on ptesync (l == 2) on ppc64 and any sync pn ppc32.
4071      *
4072      * Additionally, this can only happen in kernel mode however so
4073      * check MSR_PR as well.
4074      */
4075     if (((l == 2) || !(ctx->insns_flags & PPC_64B)) && !ctx->pr) {
4076         gen_check_tlb_flush(ctx, true);
4077     }
4078 
4079     tcg_gen_mb(bar | TCG_BAR_SC);
4080 }
4081 
4082 /* wait */
4083 static void gen_wait(DisasContext *ctx)
4084 {
4085     uint32_t wc;
4086 
4087     if (ctx->insns_flags & PPC_WAIT) {
4088         /* v2.03-v2.07 define an older incompatible 'wait' encoding. */
4089 
4090         if (ctx->insns_flags2 & PPC2_PM_ISA206) {
4091             /* v2.06 introduced the WC field. WC > 0 may be treated as no-op. */
4092             wc = WC(ctx->opcode);
4093         } else {
4094             wc = 0;
4095         }
4096 
4097     } else if (ctx->insns_flags2 & PPC2_ISA300) {
4098         /* v3.0 defines a new 'wait' encoding. */
4099         wc = WC(ctx->opcode);
4100         if (ctx->insns_flags2 & PPC2_ISA310) {
4101             uint32_t pl = PL(ctx->opcode);
4102 
4103             /* WC 1,2 may be treated as no-op. WC 3 is reserved. */
4104             if (wc == 3) {
4105                 gen_invalid(ctx);
4106                 return;
4107             }
4108 
4109             /* PL 1-3 are reserved. If WC=2 then the insn is treated as noop. */
4110             if (pl > 0 && wc != 2) {
4111                 gen_invalid(ctx);
4112                 return;
4113             }
4114 
4115         } else { /* ISA300 */
4116             /* WC 1-3 are reserved */
4117             if (wc > 0) {
4118                 gen_invalid(ctx);
4119                 return;
4120             }
4121         }
4122 
4123     } else {
4124         warn_report("wait instruction decoded with wrong ISA flags.");
4125         gen_invalid(ctx);
4126         return;
4127     }
4128 
4129     /*
4130      * wait without WC field or with WC=0 waits for an exception / interrupt
4131      * to occur.
4132      */
4133     if (wc == 0) {
4134         TCGv_i32 t0 = tcg_const_i32(1);
4135         tcg_gen_st_i32(t0, cpu_env,
4136                        -offsetof(PowerPCCPU, env) + offsetof(CPUState, halted));
4137         tcg_temp_free_i32(t0);
4138         /* Stop translation, as the CPU is supposed to sleep from now */
4139         gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next);
4140     }
4141 
4142     /*
4143      * Other wait types must not just wait until an exception occurs because
4144      * ignoring their other wake-up conditions could cause a hang.
4145      *
4146      * For v2.06 and 2.07, wc=1,2,3 are architected but may be implemented as
4147      * no-ops.
4148      *
4149      * wc=1 and wc=3 explicitly allow the instruction to be treated as a no-op.
4150      *
4151      * wc=2 waits for an implementation-specific condition, such could be
4152      * always true, so it can be implemented as a no-op.
4153      *
4154      * For v3.1, wc=1,2 are architected but may be implemented as no-ops.
4155      *
4156      * wc=1 (waitrsv) waits for an exception or a reservation to be lost.
4157      * Reservation-loss may have implementation-specific conditions, so it
4158      * can be implemented as a no-op.
4159      *
4160      * wc=2 waits for an exception or an amount of time to pass. This
4161      * amount is implementation-specific so it can be implemented as a
4162      * no-op.
4163      *
4164      * ISA v3.1 allows for execution to resume "in the rare case of
4165      * an implementation-dependent event", so in any case software must
4166      * not depend on the architected resumption condition to become
4167      * true, so no-op implementations should be architecturally correct
4168      * (if suboptimal).
4169      */
4170 }
4171 
4172 #if defined(TARGET_PPC64)
4173 static void gen_doze(DisasContext *ctx)
4174 {
4175 #if defined(CONFIG_USER_ONLY)
4176     GEN_PRIV(ctx);
4177 #else
4178     TCGv_i32 t;
4179 
4180     CHK_HV(ctx);
4181     t = tcg_const_i32(PPC_PM_DOZE);
4182     gen_helper_pminsn(cpu_env, t);
4183     tcg_temp_free_i32(t);
4184     /* Stop translation, as the CPU is supposed to sleep from now */
4185     gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next);
4186 #endif /* defined(CONFIG_USER_ONLY) */
4187 }
4188 
4189 static void gen_nap(DisasContext *ctx)
4190 {
4191 #if defined(CONFIG_USER_ONLY)
4192     GEN_PRIV(ctx);
4193 #else
4194     TCGv_i32 t;
4195 
4196     CHK_HV(ctx);
4197     t = tcg_const_i32(PPC_PM_NAP);
4198     gen_helper_pminsn(cpu_env, t);
4199     tcg_temp_free_i32(t);
4200     /* Stop translation, as the CPU is supposed to sleep from now */
4201     gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next);
4202 #endif /* defined(CONFIG_USER_ONLY) */
4203 }
4204 
4205 static void gen_stop(DisasContext *ctx)
4206 {
4207 #if defined(CONFIG_USER_ONLY)
4208     GEN_PRIV(ctx);
4209 #else
4210     TCGv_i32 t;
4211 
4212     CHK_HV(ctx);
4213     t = tcg_const_i32(PPC_PM_STOP);
4214     gen_helper_pminsn(cpu_env, t);
4215     tcg_temp_free_i32(t);
4216     /* Stop translation, as the CPU is supposed to sleep from now */
4217     gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next);
4218 #endif /* defined(CONFIG_USER_ONLY) */
4219 }
4220 
4221 static void gen_sleep(DisasContext *ctx)
4222 {
4223 #if defined(CONFIG_USER_ONLY)
4224     GEN_PRIV(ctx);
4225 #else
4226     TCGv_i32 t;
4227 
4228     CHK_HV(ctx);
4229     t = tcg_const_i32(PPC_PM_SLEEP);
4230     gen_helper_pminsn(cpu_env, t);
4231     tcg_temp_free_i32(t);
4232     /* Stop translation, as the CPU is supposed to sleep from now */
4233     gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next);
4234 #endif /* defined(CONFIG_USER_ONLY) */
4235 }
4236 
4237 static void gen_rvwinkle(DisasContext *ctx)
4238 {
4239 #if defined(CONFIG_USER_ONLY)
4240     GEN_PRIV(ctx);
4241 #else
4242     TCGv_i32 t;
4243 
4244     CHK_HV(ctx);
4245     t = tcg_const_i32(PPC_PM_RVWINKLE);
4246     gen_helper_pminsn(cpu_env, t);
4247     tcg_temp_free_i32(t);
4248     /* Stop translation, as the CPU is supposed to sleep from now */
4249     gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next);
4250 #endif /* defined(CONFIG_USER_ONLY) */
4251 }
4252 #endif /* #if defined(TARGET_PPC64) */
4253 
4254 static inline void gen_update_cfar(DisasContext *ctx, target_ulong nip)
4255 {
4256 #if defined(TARGET_PPC64)
4257     if (ctx->has_cfar) {
4258         tcg_gen_movi_tl(cpu_cfar, nip);
4259     }
4260 #endif
4261 }
4262 
4263 #if defined(TARGET_PPC64)
4264 static void pmu_count_insns(DisasContext *ctx)
4265 {
4266     /*
4267      * Do not bother calling the helper if the PMU isn't counting
4268      * instructions.
4269      */
4270     if (!ctx->pmu_insn_cnt) {
4271         return;
4272     }
4273 
4274  #if !defined(CONFIG_USER_ONLY)
4275     TCGLabel *l;
4276     TCGv t0;
4277 
4278     /*
4279      * The PMU insns_inc() helper stops the internal PMU timer if a
4280      * counter overflows happens. In that case, if the guest is
4281      * running with icount and we do not handle it beforehand,
4282      * the helper can trigger a 'bad icount read'.
4283      */
4284     gen_icount_io_start(ctx);
4285 
4286     /* Avoid helper calls when only PMC5-6 are enabled. */
4287     if (!ctx->pmc_other) {
4288         l = gen_new_label();
4289         t0 = tcg_temp_new();
4290 
4291         gen_load_spr(t0, SPR_POWER_PMC5);
4292         tcg_gen_addi_tl(t0, t0, ctx->base.num_insns);
4293         gen_store_spr(SPR_POWER_PMC5, t0);
4294         /* Check for overflow, if it's enabled */
4295         if (ctx->mmcr0_pmcjce) {
4296             tcg_gen_brcondi_tl(TCG_COND_LT, t0, PMC_COUNTER_NEGATIVE_VAL, l);
4297             gen_helper_handle_pmc5_overflow(cpu_env);
4298         }
4299 
4300         gen_set_label(l);
4301         tcg_temp_free(t0);
4302     } else {
4303         gen_helper_insns_inc(cpu_env, tcg_constant_i32(ctx->base.num_insns));
4304     }
4305   #else
4306     /*
4307      * User mode can read (but not write) PMC5 and start/stop
4308      * the PMU via MMCR0_FC. In this case just increment
4309      * PMC5 with base.num_insns.
4310      */
4311     TCGv t0 = tcg_temp_new();
4312 
4313     gen_load_spr(t0, SPR_POWER_PMC5);
4314     tcg_gen_addi_tl(t0, t0, ctx->base.num_insns);
4315     gen_store_spr(SPR_POWER_PMC5, t0);
4316 
4317     tcg_temp_free(t0);
4318   #endif /* #if !defined(CONFIG_USER_ONLY) */
4319 }
4320 #else
4321 static void pmu_count_insns(DisasContext *ctx)
4322 {
4323     return;
4324 }
4325 #endif /* #if defined(TARGET_PPC64) */
4326 
4327 static inline bool use_goto_tb(DisasContext *ctx, target_ulong dest)
4328 {
4329     return translator_use_goto_tb(&ctx->base, dest);
4330 }
4331 
4332 static void gen_lookup_and_goto_ptr(DisasContext *ctx)
4333 {
4334     if (unlikely(ctx->singlestep_enabled)) {
4335         gen_debug_exception(ctx);
4336     } else {
4337         /*
4338          * tcg_gen_lookup_and_goto_ptr will exit the TB if
4339          * CF_NO_GOTO_PTR is set. Count insns now.
4340          */
4341         if (ctx->base.tb->flags & CF_NO_GOTO_PTR) {
4342             pmu_count_insns(ctx);
4343         }
4344 
4345         tcg_gen_lookup_and_goto_ptr();
4346     }
4347 }
4348 
4349 /***                                Branch                                 ***/
4350 static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
4351 {
4352     if (NARROW_MODE(ctx)) {
4353         dest = (uint32_t) dest;
4354     }
4355     if (use_goto_tb(ctx, dest)) {
4356         pmu_count_insns(ctx);
4357         tcg_gen_goto_tb(n);
4358         tcg_gen_movi_tl(cpu_nip, dest & ~3);
4359         tcg_gen_exit_tb(ctx->base.tb, n);
4360     } else {
4361         tcg_gen_movi_tl(cpu_nip, dest & ~3);
4362         gen_lookup_and_goto_ptr(ctx);
4363     }
4364 }
4365 
4366 static inline void gen_setlr(DisasContext *ctx, target_ulong nip)
4367 {
4368     if (NARROW_MODE(ctx)) {
4369         nip = (uint32_t)nip;
4370     }
4371     tcg_gen_movi_tl(cpu_lr, nip);
4372 }
4373 
4374 /* b ba bl bla */
4375 static void gen_b(DisasContext *ctx)
4376 {
4377     target_ulong li, target;
4378 
4379     /* sign extend LI */
4380     li = LI(ctx->opcode);
4381     li = (li ^ 0x02000000) - 0x02000000;
4382     if (likely(AA(ctx->opcode) == 0)) {
4383         target = ctx->cia + li;
4384     } else {
4385         target = li;
4386     }
4387     if (LK(ctx->opcode)) {
4388         gen_setlr(ctx, ctx->base.pc_next);
4389     }
4390     gen_update_cfar(ctx, ctx->cia);
4391     gen_goto_tb(ctx, 0, target);
4392     ctx->base.is_jmp = DISAS_NORETURN;
4393 }
4394 
4395 #define BCOND_IM  0
4396 #define BCOND_LR  1
4397 #define BCOND_CTR 2
4398 #define BCOND_TAR 3
4399 
4400 static void gen_bcond(DisasContext *ctx, int type)
4401 {
4402     uint32_t bo = BO(ctx->opcode);
4403     TCGLabel *l1;
4404     TCGv target;
4405 
4406     if (type == BCOND_LR || type == BCOND_CTR || type == BCOND_TAR) {
4407         target = tcg_temp_local_new();
4408         if (type == BCOND_CTR) {
4409             tcg_gen_mov_tl(target, cpu_ctr);
4410         } else if (type == BCOND_TAR) {
4411             gen_load_spr(target, SPR_TAR);
4412         } else {
4413             tcg_gen_mov_tl(target, cpu_lr);
4414         }
4415     } else {
4416         target = NULL;
4417     }
4418     if (LK(ctx->opcode)) {
4419         gen_setlr(ctx, ctx->base.pc_next);
4420     }
4421     l1 = gen_new_label();
4422     if ((bo & 0x4) == 0) {
4423         /* Decrement and test CTR */
4424         TCGv temp = tcg_temp_new();
4425 
4426         if (type == BCOND_CTR) {
4427             /*
4428              * All ISAs up to v3 describe this form of bcctr as invalid but
4429              * some processors, ie. 64-bit server processors compliant with
4430              * arch 2.x, do implement a "test and decrement" logic instead,
4431              * as described in their respective UMs. This logic involves CTR
4432              * to act as both the branch target and a counter, which makes
4433              * it basically useless and thus never used in real code.
4434              *
4435              * This form was hence chosen to trigger extra micro-architectural
4436              * side-effect on real HW needed for the Spectre v2 workaround.
4437              * It is up to guests that implement such workaround, ie. linux, to
4438              * use this form in a way it just triggers the side-effect without
4439              * doing anything else harmful.
4440              */
4441             if (unlikely(!is_book3s_arch2x(ctx))) {
4442                 gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
4443                 tcg_temp_free(temp);
4444                 tcg_temp_free(target);
4445                 return;
4446             }
4447 
4448             if (NARROW_MODE(ctx)) {
4449                 tcg_gen_ext32u_tl(temp, cpu_ctr);
4450             } else {
4451                 tcg_gen_mov_tl(temp, cpu_ctr);
4452             }
4453             if (bo & 0x2) {
4454                 tcg_gen_brcondi_tl(TCG_COND_NE, temp, 0, l1);
4455             } else {
4456                 tcg_gen_brcondi_tl(TCG_COND_EQ, temp, 0, l1);
4457             }
4458             tcg_gen_subi_tl(cpu_ctr, cpu_ctr, 1);
4459         } else {
4460             tcg_gen_subi_tl(cpu_ctr, cpu_ctr, 1);
4461             if (NARROW_MODE(ctx)) {
4462                 tcg_gen_ext32u_tl(temp, cpu_ctr);
4463             } else {
4464                 tcg_gen_mov_tl(temp, cpu_ctr);
4465             }
4466             if (bo & 0x2) {
4467                 tcg_gen_brcondi_tl(TCG_COND_NE, temp, 0, l1);
4468             } else {
4469                 tcg_gen_brcondi_tl(TCG_COND_EQ, temp, 0, l1);
4470             }
4471         }
4472         tcg_temp_free(temp);
4473     }
4474     if ((bo & 0x10) == 0) {
4475         /* Test CR */
4476         uint32_t bi = BI(ctx->opcode);
4477         uint32_t mask = 0x08 >> (bi & 0x03);
4478         TCGv_i32 temp = tcg_temp_new_i32();
4479 
4480         if (bo & 0x8) {
4481             tcg_gen_andi_i32(temp, cpu_crf[bi >> 2], mask);
4482             tcg_gen_brcondi_i32(TCG_COND_EQ, temp, 0, l1);
4483         } else {
4484             tcg_gen_andi_i32(temp, cpu_crf[bi >> 2], mask);
4485             tcg_gen_brcondi_i32(TCG_COND_NE, temp, 0, l1);
4486         }
4487         tcg_temp_free_i32(temp);
4488     }
4489     gen_update_cfar(ctx, ctx->cia);
4490     if (type == BCOND_IM) {
4491         target_ulong li = (target_long)((int16_t)(BD(ctx->opcode)));
4492         if (likely(AA(ctx->opcode) == 0)) {
4493             gen_goto_tb(ctx, 0, ctx->cia + li);
4494         } else {
4495             gen_goto_tb(ctx, 0, li);
4496         }
4497     } else {
4498         if (NARROW_MODE(ctx)) {
4499             tcg_gen_andi_tl(cpu_nip, target, (uint32_t)~3);
4500         } else {
4501             tcg_gen_andi_tl(cpu_nip, target, ~3);
4502         }
4503         gen_lookup_and_goto_ptr(ctx);
4504         tcg_temp_free(target);
4505     }
4506     if ((bo & 0x14) != 0x14) {
4507         /* fallthrough case */
4508         gen_set_label(l1);
4509         gen_goto_tb(ctx, 1, ctx->base.pc_next);
4510     }
4511     ctx->base.is_jmp = DISAS_NORETURN;
4512 }
4513 
4514 static void gen_bc(DisasContext *ctx)
4515 {
4516     gen_bcond(ctx, BCOND_IM);
4517 }
4518 
4519 static void gen_bcctr(DisasContext *ctx)
4520 {
4521     gen_bcond(ctx, BCOND_CTR);
4522 }
4523 
4524 static void gen_bclr(DisasContext *ctx)
4525 {
4526     gen_bcond(ctx, BCOND_LR);
4527 }
4528 
4529 static void gen_bctar(DisasContext *ctx)
4530 {
4531     gen_bcond(ctx, BCOND_TAR);
4532 }
4533 
4534 /***                      Condition register logical                       ***/
4535 #define GEN_CRLOGIC(name, tcg_op, opc)                                        \
4536 static void glue(gen_, name)(DisasContext *ctx)                               \
4537 {                                                                             \
4538     uint8_t bitmask;                                                          \
4539     int sh;                                                                   \
4540     TCGv_i32 t0, t1;                                                          \
4541     sh = (crbD(ctx->opcode) & 0x03) - (crbA(ctx->opcode) & 0x03);             \
4542     t0 = tcg_temp_new_i32();                                                  \
4543     if (sh > 0)                                                               \
4544         tcg_gen_shri_i32(t0, cpu_crf[crbA(ctx->opcode) >> 2], sh);            \
4545     else if (sh < 0)                                                          \
4546         tcg_gen_shli_i32(t0, cpu_crf[crbA(ctx->opcode) >> 2], -sh);           \
4547     else                                                                      \
4548         tcg_gen_mov_i32(t0, cpu_crf[crbA(ctx->opcode) >> 2]);                 \
4549     t1 = tcg_temp_new_i32();                                                  \
4550     sh = (crbD(ctx->opcode) & 0x03) - (crbB(ctx->opcode) & 0x03);             \
4551     if (sh > 0)                                                               \
4552         tcg_gen_shri_i32(t1, cpu_crf[crbB(ctx->opcode) >> 2], sh);            \
4553     else if (sh < 0)                                                          \
4554         tcg_gen_shli_i32(t1, cpu_crf[crbB(ctx->opcode) >> 2], -sh);           \
4555     else                                                                      \
4556         tcg_gen_mov_i32(t1, cpu_crf[crbB(ctx->opcode) >> 2]);                 \
4557     tcg_op(t0, t0, t1);                                                       \
4558     bitmask = 0x08 >> (crbD(ctx->opcode) & 0x03);                             \
4559     tcg_gen_andi_i32(t0, t0, bitmask);                                        \
4560     tcg_gen_andi_i32(t1, cpu_crf[crbD(ctx->opcode) >> 2], ~bitmask);          \
4561     tcg_gen_or_i32(cpu_crf[crbD(ctx->opcode) >> 2], t0, t1);                  \
4562     tcg_temp_free_i32(t0);                                                    \
4563     tcg_temp_free_i32(t1);                                                    \
4564 }
4565 
4566 /* crand */
4567 GEN_CRLOGIC(crand, tcg_gen_and_i32, 0x08);
4568 /* crandc */
4569 GEN_CRLOGIC(crandc, tcg_gen_andc_i32, 0x04);
4570 /* creqv */
4571 GEN_CRLOGIC(creqv, tcg_gen_eqv_i32, 0x09);
4572 /* crnand */
4573 GEN_CRLOGIC(crnand, tcg_gen_nand_i32, 0x07);
4574 /* crnor */
4575 GEN_CRLOGIC(crnor, tcg_gen_nor_i32, 0x01);
4576 /* cror */
4577 GEN_CRLOGIC(cror, tcg_gen_or_i32, 0x0E);
4578 /* crorc */
4579 GEN_CRLOGIC(crorc, tcg_gen_orc_i32, 0x0D);
4580 /* crxor */
4581 GEN_CRLOGIC(crxor, tcg_gen_xor_i32, 0x06);
4582 
4583 /* mcrf */
4584 static void gen_mcrf(DisasContext *ctx)
4585 {
4586     tcg_gen_mov_i32(cpu_crf[crfD(ctx->opcode)], cpu_crf[crfS(ctx->opcode)]);
4587 }
4588 
4589 /***                           System linkage                              ***/
4590 
4591 /* rfi (supervisor only) */
4592 static void gen_rfi(DisasContext *ctx)
4593 {
4594 #if defined(CONFIG_USER_ONLY)
4595     GEN_PRIV(ctx);
4596 #else
4597     /*
4598      * This instruction doesn't exist anymore on 64-bit server
4599      * processors compliant with arch 2.x
4600      */
4601     if (is_book3s_arch2x(ctx)) {
4602         gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
4603         return;
4604     }
4605     /* Restore CPU state */
4606     CHK_SV(ctx);
4607     gen_icount_io_start(ctx);
4608     gen_update_cfar(ctx, ctx->cia);
4609     gen_helper_rfi(cpu_env);
4610     ctx->base.is_jmp = DISAS_EXIT;
4611 #endif
4612 }
4613 
4614 #if defined(TARGET_PPC64)
4615 static void gen_rfid(DisasContext *ctx)
4616 {
4617 #if defined(CONFIG_USER_ONLY)
4618     GEN_PRIV(ctx);
4619 #else
4620     /* Restore CPU state */
4621     CHK_SV(ctx);
4622     gen_icount_io_start(ctx);
4623     gen_update_cfar(ctx, ctx->cia);
4624     gen_helper_rfid(cpu_env);
4625     ctx->base.is_jmp = DISAS_EXIT;
4626 #endif
4627 }
4628 
4629 #if !defined(CONFIG_USER_ONLY)
4630 static void gen_rfscv(DisasContext *ctx)
4631 {
4632 #if defined(CONFIG_USER_ONLY)
4633     GEN_PRIV(ctx);
4634 #else
4635     /* Restore CPU state */
4636     CHK_SV(ctx);
4637     gen_icount_io_start(ctx);
4638     gen_update_cfar(ctx, ctx->cia);
4639     gen_helper_rfscv(cpu_env);
4640     ctx->base.is_jmp = DISAS_EXIT;
4641 #endif
4642 }
4643 #endif
4644 
4645 static void gen_hrfid(DisasContext *ctx)
4646 {
4647 #if defined(CONFIG_USER_ONLY)
4648     GEN_PRIV(ctx);
4649 #else
4650     /* Restore CPU state */
4651     CHK_HV(ctx);
4652     gen_helper_hrfid(cpu_env);
4653     ctx->base.is_jmp = DISAS_EXIT;
4654 #endif
4655 }
4656 #endif
4657 
4658 /* sc */
4659 #if defined(CONFIG_USER_ONLY)
4660 #define POWERPC_SYSCALL POWERPC_EXCP_SYSCALL_USER
4661 #else
4662 #define POWERPC_SYSCALL POWERPC_EXCP_SYSCALL
4663 #define POWERPC_SYSCALL_VECTORED POWERPC_EXCP_SYSCALL_VECTORED
4664 #endif
4665 static void gen_sc(DisasContext *ctx)
4666 {
4667     uint32_t lev;
4668 
4669     lev = (ctx->opcode >> 5) & 0x7F;
4670     gen_exception_err(ctx, POWERPC_SYSCALL, lev);
4671 }
4672 
4673 #if defined(TARGET_PPC64)
4674 #if !defined(CONFIG_USER_ONLY)
4675 static void gen_scv(DisasContext *ctx)
4676 {
4677     uint32_t lev = (ctx->opcode >> 5) & 0x7F;
4678 
4679     /* Set the PC back to the faulting instruction. */
4680     gen_update_nip(ctx, ctx->cia);
4681     gen_helper_scv(cpu_env, tcg_constant_i32(lev));
4682 
4683     ctx->base.is_jmp = DISAS_NORETURN;
4684 }
4685 #endif
4686 #endif
4687 
4688 /***                                Trap                                   ***/
4689 
4690 /* Check for unconditional traps (always or never) */
4691 static bool check_unconditional_trap(DisasContext *ctx)
4692 {
4693     /* Trap never */
4694     if (TO(ctx->opcode) == 0) {
4695         return true;
4696     }
4697     /* Trap always */
4698     if (TO(ctx->opcode) == 31) {
4699         gen_exception_err(ctx, POWERPC_EXCP_PROGRAM, POWERPC_EXCP_TRAP);
4700         return true;
4701     }
4702     return false;
4703 }
4704 
4705 /* tw */
4706 static void gen_tw(DisasContext *ctx)
4707 {
4708     TCGv_i32 t0;
4709 
4710     if (check_unconditional_trap(ctx)) {
4711         return;
4712     }
4713     t0 = tcg_const_i32(TO(ctx->opcode));
4714     gen_helper_tw(cpu_env, cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)],
4715                   t0);
4716     tcg_temp_free_i32(t0);
4717 }
4718 
4719 /* twi */
4720 static void gen_twi(DisasContext *ctx)
4721 {
4722     TCGv t0;
4723     TCGv_i32 t1;
4724 
4725     if (check_unconditional_trap(ctx)) {
4726         return;
4727     }
4728     t0 = tcg_const_tl(SIMM(ctx->opcode));
4729     t1 = tcg_const_i32(TO(ctx->opcode));
4730     gen_helper_tw(cpu_env, cpu_gpr[rA(ctx->opcode)], t0, t1);
4731     tcg_temp_free(t0);
4732     tcg_temp_free_i32(t1);
4733 }
4734 
4735 #if defined(TARGET_PPC64)
4736 /* td */
4737 static void gen_td(DisasContext *ctx)
4738 {
4739     TCGv_i32 t0;
4740 
4741     if (check_unconditional_trap(ctx)) {
4742         return;
4743     }
4744     t0 = tcg_const_i32(TO(ctx->opcode));
4745     gen_helper_td(cpu_env, cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)],
4746                   t0);
4747     tcg_temp_free_i32(t0);
4748 }
4749 
4750 /* tdi */
4751 static void gen_tdi(DisasContext *ctx)
4752 {
4753     TCGv t0;
4754     TCGv_i32 t1;
4755 
4756     if (check_unconditional_trap(ctx)) {
4757         return;
4758     }
4759     t0 = tcg_const_tl(SIMM(ctx->opcode));
4760     t1 = tcg_const_i32(TO(ctx->opcode));
4761     gen_helper_td(cpu_env, cpu_gpr[rA(ctx->opcode)], t0, t1);
4762     tcg_temp_free(t0);
4763     tcg_temp_free_i32(t1);
4764 }
4765 #endif
4766 
4767 /***                          Processor control                            ***/
4768 
4769 /* mcrxr */
4770 static void gen_mcrxr(DisasContext *ctx)
4771 {
4772     TCGv_i32 t0 = tcg_temp_new_i32();
4773     TCGv_i32 t1 = tcg_temp_new_i32();
4774     TCGv_i32 dst = cpu_crf[crfD(ctx->opcode)];
4775 
4776     tcg_gen_trunc_tl_i32(t0, cpu_so);
4777     tcg_gen_trunc_tl_i32(t1, cpu_ov);
4778     tcg_gen_trunc_tl_i32(dst, cpu_ca);
4779     tcg_gen_shli_i32(t0, t0, 3);
4780     tcg_gen_shli_i32(t1, t1, 2);
4781     tcg_gen_shli_i32(dst, dst, 1);
4782     tcg_gen_or_i32(dst, dst, t0);
4783     tcg_gen_or_i32(dst, dst, t1);
4784     tcg_temp_free_i32(t0);
4785     tcg_temp_free_i32(t1);
4786 
4787     tcg_gen_movi_tl(cpu_so, 0);
4788     tcg_gen_movi_tl(cpu_ov, 0);
4789     tcg_gen_movi_tl(cpu_ca, 0);
4790 }
4791 
4792 #ifdef TARGET_PPC64
4793 /* mcrxrx */
4794 static void gen_mcrxrx(DisasContext *ctx)
4795 {
4796     TCGv t0 = tcg_temp_new();
4797     TCGv t1 = tcg_temp_new();
4798     TCGv_i32 dst = cpu_crf[crfD(ctx->opcode)];
4799 
4800     /* copy OV and OV32 */
4801     tcg_gen_shli_tl(t0, cpu_ov, 1);
4802     tcg_gen_or_tl(t0, t0, cpu_ov32);
4803     tcg_gen_shli_tl(t0, t0, 2);
4804     /* copy CA and CA32 */
4805     tcg_gen_shli_tl(t1, cpu_ca, 1);
4806     tcg_gen_or_tl(t1, t1, cpu_ca32);
4807     tcg_gen_or_tl(t0, t0, t1);
4808     tcg_gen_trunc_tl_i32(dst, t0);
4809     tcg_temp_free(t0);
4810     tcg_temp_free(t1);
4811 }
4812 #endif
4813 
4814 /* mfcr mfocrf */
4815 static void gen_mfcr(DisasContext *ctx)
4816 {
4817     uint32_t crm, crn;
4818 
4819     if (likely(ctx->opcode & 0x00100000)) {
4820         crm = CRM(ctx->opcode);
4821         if (likely(crm && ((crm & (crm - 1)) == 0))) {
4822             crn = ctz32(crm);
4823             tcg_gen_extu_i32_tl(cpu_gpr[rD(ctx->opcode)], cpu_crf[7 - crn]);
4824             tcg_gen_shli_tl(cpu_gpr[rD(ctx->opcode)],
4825                             cpu_gpr[rD(ctx->opcode)], crn * 4);
4826         }
4827     } else {
4828         TCGv_i32 t0 = tcg_temp_new_i32();
4829         tcg_gen_mov_i32(t0, cpu_crf[0]);
4830         tcg_gen_shli_i32(t0, t0, 4);
4831         tcg_gen_or_i32(t0, t0, cpu_crf[1]);
4832         tcg_gen_shli_i32(t0, t0, 4);
4833         tcg_gen_or_i32(t0, t0, cpu_crf[2]);
4834         tcg_gen_shli_i32(t0, t0, 4);
4835         tcg_gen_or_i32(t0, t0, cpu_crf[3]);
4836         tcg_gen_shli_i32(t0, t0, 4);
4837         tcg_gen_or_i32(t0, t0, cpu_crf[4]);
4838         tcg_gen_shli_i32(t0, t0, 4);
4839         tcg_gen_or_i32(t0, t0, cpu_crf[5]);
4840         tcg_gen_shli_i32(t0, t0, 4);
4841         tcg_gen_or_i32(t0, t0, cpu_crf[6]);
4842         tcg_gen_shli_i32(t0, t0, 4);
4843         tcg_gen_or_i32(t0, t0, cpu_crf[7]);
4844         tcg_gen_extu_i32_tl(cpu_gpr[rD(ctx->opcode)], t0);
4845         tcg_temp_free_i32(t0);
4846     }
4847 }
4848 
4849 /* mfmsr */
4850 static void gen_mfmsr(DisasContext *ctx)
4851 {
4852     CHK_SV(ctx);
4853     tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_msr);
4854 }
4855 
4856 /* mfspr */
4857 static inline void gen_op_mfspr(DisasContext *ctx)
4858 {
4859     void (*read_cb)(DisasContext *ctx, int gprn, int sprn);
4860     uint32_t sprn = SPR(ctx->opcode);
4861 
4862 #if defined(CONFIG_USER_ONLY)
4863     read_cb = ctx->spr_cb[sprn].uea_read;
4864 #else
4865     if (ctx->pr) {
4866         read_cb = ctx->spr_cb[sprn].uea_read;
4867     } else if (ctx->hv) {
4868         read_cb = ctx->spr_cb[sprn].hea_read;
4869     } else {
4870         read_cb = ctx->spr_cb[sprn].oea_read;
4871     }
4872 #endif
4873     if (likely(read_cb != NULL)) {
4874         if (likely(read_cb != SPR_NOACCESS)) {
4875             (*read_cb)(ctx, rD(ctx->opcode), sprn);
4876         } else {
4877             /* Privilege exception */
4878             /*
4879              * This is a hack to avoid warnings when running Linux:
4880              * this OS breaks the PowerPC virtualisation model,
4881              * allowing userland application to read the PVR
4882              */
4883             if (sprn != SPR_PVR) {
4884                 qemu_log_mask(LOG_GUEST_ERROR, "Trying to read privileged spr "
4885                               "%d (0x%03x) at " TARGET_FMT_lx "\n", sprn, sprn,
4886                               ctx->cia);
4887             }
4888             gen_priv_exception(ctx, POWERPC_EXCP_PRIV_REG);
4889         }
4890     } else {
4891         /* ISA 2.07 defines these as no-ops */
4892         if ((ctx->insns_flags2 & PPC2_ISA207S) &&
4893             (sprn >= 808 && sprn <= 811)) {
4894             /* This is a nop */
4895             return;
4896         }
4897         /* Not defined */
4898         qemu_log_mask(LOG_GUEST_ERROR,
4899                       "Trying to read invalid spr %d (0x%03x) at "
4900                       TARGET_FMT_lx "\n", sprn, sprn, ctx->cia);
4901 
4902         /*
4903          * The behaviour depends on MSR:PR and SPR# bit 0x10, it can
4904          * generate a priv, a hv emu or a no-op
4905          */
4906         if (sprn & 0x10) {
4907             if (ctx->pr) {
4908                 gen_priv_exception(ctx, POWERPC_EXCP_PRIV_REG);
4909             }
4910         } else {
4911             if (ctx->pr || sprn == 0 || sprn == 4 || sprn == 5 || sprn == 6) {
4912                 gen_hvpriv_exception(ctx, POWERPC_EXCP_PRIV_REG);
4913             }
4914         }
4915     }
4916 }
4917 
4918 static void gen_mfspr(DisasContext *ctx)
4919 {
4920     gen_op_mfspr(ctx);
4921 }
4922 
4923 /* mftb */
4924 static void gen_mftb(DisasContext *ctx)
4925 {
4926     gen_op_mfspr(ctx);
4927 }
4928 
4929 /* mtcrf mtocrf*/
4930 static void gen_mtcrf(DisasContext *ctx)
4931 {
4932     uint32_t crm, crn;
4933 
4934     crm = CRM(ctx->opcode);
4935     if (likely((ctx->opcode & 0x00100000))) {
4936         if (crm && ((crm & (crm - 1)) == 0)) {
4937             TCGv_i32 temp = tcg_temp_new_i32();
4938             crn = ctz32(crm);
4939             tcg_gen_trunc_tl_i32(temp, cpu_gpr[rS(ctx->opcode)]);
4940             tcg_gen_shri_i32(temp, temp, crn * 4);
4941             tcg_gen_andi_i32(cpu_crf[7 - crn], temp, 0xf);
4942             tcg_temp_free_i32(temp);
4943         }
4944     } else {
4945         TCGv_i32 temp = tcg_temp_new_i32();
4946         tcg_gen_trunc_tl_i32(temp, cpu_gpr[rS(ctx->opcode)]);
4947         for (crn = 0 ; crn < 8 ; crn++) {
4948             if (crm & (1 << crn)) {
4949                     tcg_gen_shri_i32(cpu_crf[7 - crn], temp, crn * 4);
4950                     tcg_gen_andi_i32(cpu_crf[7 - crn], cpu_crf[7 - crn], 0xf);
4951             }
4952         }
4953         tcg_temp_free_i32(temp);
4954     }
4955 }
4956 
4957 /* mtmsr */
4958 #if defined(TARGET_PPC64)
4959 static void gen_mtmsrd(DisasContext *ctx)
4960 {
4961     if (unlikely(!is_book3s_arch2x(ctx))) {
4962         gen_invalid(ctx);
4963         return;
4964     }
4965 
4966     CHK_SV(ctx);
4967 
4968 #if !defined(CONFIG_USER_ONLY)
4969     TCGv t0, t1;
4970     target_ulong mask;
4971 
4972     t0 = tcg_temp_new();
4973     t1 = tcg_temp_new();
4974 
4975     gen_icount_io_start(ctx);
4976 
4977     if (ctx->opcode & 0x00010000) {
4978         /* L=1 form only updates EE and RI */
4979         mask = (1ULL << MSR_RI) | (1ULL << MSR_EE);
4980     } else {
4981         /* mtmsrd does not alter HV, S, ME, or LE */
4982         mask = ~((1ULL << MSR_LE) | (1ULL << MSR_ME) | (1ULL << MSR_S) |
4983                  (1ULL << MSR_HV));
4984         /*
4985          * XXX: we need to update nip before the store if we enter
4986          *      power saving mode, we will exit the loop directly from
4987          *      ppc_store_msr
4988          */
4989         gen_update_nip(ctx, ctx->base.pc_next);
4990     }
4991 
4992     tcg_gen_andi_tl(t0, cpu_gpr[rS(ctx->opcode)], mask);
4993     tcg_gen_andi_tl(t1, cpu_msr, ~mask);
4994     tcg_gen_or_tl(t0, t0, t1);
4995 
4996     gen_helper_store_msr(cpu_env, t0);
4997 
4998     /* Must stop the translation as machine state (may have) changed */
4999     ctx->base.is_jmp = DISAS_EXIT_UPDATE;
5000 
5001     tcg_temp_free(t0);
5002     tcg_temp_free(t1);
5003 #endif /* !defined(CONFIG_USER_ONLY) */
5004 }
5005 #endif /* defined(TARGET_PPC64) */
5006 
5007 static void gen_mtmsr(DisasContext *ctx)
5008 {
5009     CHK_SV(ctx);
5010 
5011 #if !defined(CONFIG_USER_ONLY)
5012     TCGv t0, t1;
5013     target_ulong mask = 0xFFFFFFFF;
5014 
5015     t0 = tcg_temp_new();
5016     t1 = tcg_temp_new();
5017 
5018     gen_icount_io_start(ctx);
5019     if (ctx->opcode & 0x00010000) {
5020         /* L=1 form only updates EE and RI */
5021         mask &= (1ULL << MSR_RI) | (1ULL << MSR_EE);
5022     } else {
5023         /* mtmsr does not alter S, ME, or LE */
5024         mask &= ~((1ULL << MSR_LE) | (1ULL << MSR_ME) | (1ULL << MSR_S));
5025 
5026         /*
5027          * XXX: we need to update nip before the store if we enter
5028          *      power saving mode, we will exit the loop directly from
5029          *      ppc_store_msr
5030          */
5031         gen_update_nip(ctx, ctx->base.pc_next);
5032     }
5033 
5034     tcg_gen_andi_tl(t0, cpu_gpr[rS(ctx->opcode)], mask);
5035     tcg_gen_andi_tl(t1, cpu_msr, ~mask);
5036     tcg_gen_or_tl(t0, t0, t1);
5037 
5038     gen_helper_store_msr(cpu_env, t0);
5039 
5040     /* Must stop the translation as machine state (may have) changed */
5041     ctx->base.is_jmp = DISAS_EXIT_UPDATE;
5042 
5043     tcg_temp_free(t0);
5044     tcg_temp_free(t1);
5045 #endif
5046 }
5047 
5048 /* mtspr */
5049 static void gen_mtspr(DisasContext *ctx)
5050 {
5051     void (*write_cb)(DisasContext *ctx, int sprn, int gprn);
5052     uint32_t sprn = SPR(ctx->opcode);
5053 
5054 #if defined(CONFIG_USER_ONLY)
5055     write_cb = ctx->spr_cb[sprn].uea_write;
5056 #else
5057     if (ctx->pr) {
5058         write_cb = ctx->spr_cb[sprn].uea_write;
5059     } else if (ctx->hv) {
5060         write_cb = ctx->spr_cb[sprn].hea_write;
5061     } else {
5062         write_cb = ctx->spr_cb[sprn].oea_write;
5063     }
5064 #endif
5065     if (likely(write_cb != NULL)) {
5066         if (likely(write_cb != SPR_NOACCESS)) {
5067             (*write_cb)(ctx, sprn, rS(ctx->opcode));
5068         } else {
5069             /* Privilege exception */
5070             qemu_log_mask(LOG_GUEST_ERROR, "Trying to write privileged spr "
5071                           "%d (0x%03x) at " TARGET_FMT_lx "\n", sprn, sprn,
5072                           ctx->cia);
5073             gen_priv_exception(ctx, POWERPC_EXCP_PRIV_REG);
5074         }
5075     } else {
5076         /* ISA 2.07 defines these as no-ops */
5077         if ((ctx->insns_flags2 & PPC2_ISA207S) &&
5078             (sprn >= 808 && sprn <= 811)) {
5079             /* This is a nop */
5080             return;
5081         }
5082 
5083         /* Not defined */
5084         qemu_log_mask(LOG_GUEST_ERROR,
5085                       "Trying to write invalid spr %d (0x%03x) at "
5086                       TARGET_FMT_lx "\n", sprn, sprn, ctx->cia);
5087 
5088 
5089         /*
5090          * The behaviour depends on MSR:PR and SPR# bit 0x10, it can
5091          * generate a priv, a hv emu or a no-op
5092          */
5093         if (sprn & 0x10) {
5094             if (ctx->pr) {
5095                 gen_priv_exception(ctx, POWERPC_EXCP_PRIV_REG);
5096             }
5097         } else {
5098             if (ctx->pr || sprn == 0) {
5099                 gen_hvpriv_exception(ctx, POWERPC_EXCP_PRIV_REG);
5100             }
5101         }
5102     }
5103 }
5104 
5105 #if defined(TARGET_PPC64)
5106 /* setb */
5107 static void gen_setb(DisasContext *ctx)
5108 {
5109     TCGv_i32 t0 = tcg_temp_new_i32();
5110     TCGv_i32 t8 = tcg_constant_i32(8);
5111     TCGv_i32 tm1 = tcg_constant_i32(-1);
5112     int crf = crfS(ctx->opcode);
5113 
5114     tcg_gen_setcondi_i32(TCG_COND_GEU, t0, cpu_crf[crf], 4);
5115     tcg_gen_movcond_i32(TCG_COND_GEU, t0, cpu_crf[crf], t8, tm1, t0);
5116     tcg_gen_ext_i32_tl(cpu_gpr[rD(ctx->opcode)], t0);
5117 
5118     tcg_temp_free_i32(t0);
5119 }
5120 #endif
5121 
5122 /***                         Cache management                              ***/
5123 
5124 /* dcbf */
5125 static void gen_dcbf(DisasContext *ctx)
5126 {
5127     /* XXX: specification says this is treated as a load by the MMU */
5128     TCGv t0;
5129     gen_set_access_type(ctx, ACCESS_CACHE);
5130     t0 = tcg_temp_new();
5131     gen_addr_reg_index(ctx, t0);
5132     gen_qemu_ld8u(ctx, t0, t0);
5133     tcg_temp_free(t0);
5134 }
5135 
5136 /* dcbfep (external PID dcbf) */
5137 static void gen_dcbfep(DisasContext *ctx)
5138 {
5139     /* XXX: specification says this is treated as a load by the MMU */
5140     TCGv t0;
5141     CHK_SV(ctx);
5142     gen_set_access_type(ctx, ACCESS_CACHE);
5143     t0 = tcg_temp_new();
5144     gen_addr_reg_index(ctx, t0);
5145     tcg_gen_qemu_ld_tl(t0, t0, PPC_TLB_EPID_LOAD, DEF_MEMOP(MO_UB));
5146     tcg_temp_free(t0);
5147 }
5148 
5149 /* dcbi (Supervisor only) */
5150 static void gen_dcbi(DisasContext *ctx)
5151 {
5152 #if defined(CONFIG_USER_ONLY)
5153     GEN_PRIV(ctx);
5154 #else
5155     TCGv EA, val;
5156 
5157     CHK_SV(ctx);
5158     EA = tcg_temp_new();
5159     gen_set_access_type(ctx, ACCESS_CACHE);
5160     gen_addr_reg_index(ctx, EA);
5161     val = tcg_temp_new();
5162     /* XXX: specification says this should be treated as a store by the MMU */
5163     gen_qemu_ld8u(ctx, val, EA);
5164     gen_qemu_st8(ctx, val, EA);
5165     tcg_temp_free(val);
5166     tcg_temp_free(EA);
5167 #endif /* defined(CONFIG_USER_ONLY) */
5168 }
5169 
5170 /* dcdst */
5171 static void gen_dcbst(DisasContext *ctx)
5172 {
5173     /* XXX: specification say this is treated as a load by the MMU */
5174     TCGv t0;
5175     gen_set_access_type(ctx, ACCESS_CACHE);
5176     t0 = tcg_temp_new();
5177     gen_addr_reg_index(ctx, t0);
5178     gen_qemu_ld8u(ctx, t0, t0);
5179     tcg_temp_free(t0);
5180 }
5181 
5182 /* dcbstep (dcbstep External PID version) */
5183 static void gen_dcbstep(DisasContext *ctx)
5184 {
5185     /* XXX: specification say this is treated as a load by the MMU */
5186     TCGv t0;
5187     gen_set_access_type(ctx, ACCESS_CACHE);
5188     t0 = tcg_temp_new();
5189     gen_addr_reg_index(ctx, t0);
5190     tcg_gen_qemu_ld_tl(t0, t0, PPC_TLB_EPID_LOAD, DEF_MEMOP(MO_UB));
5191     tcg_temp_free(t0);
5192 }
5193 
5194 /* dcbt */
5195 static void gen_dcbt(DisasContext *ctx)
5196 {
5197     /*
5198      * interpreted as no-op
5199      * XXX: specification say this is treated as a load by the MMU but
5200      *      does not generate any exception
5201      */
5202 }
5203 
5204 /* dcbtep */
5205 static void gen_dcbtep(DisasContext *ctx)
5206 {
5207     /*
5208      * interpreted as no-op
5209      * XXX: specification say this is treated as a load by the MMU but
5210      *      does not generate any exception
5211      */
5212 }
5213 
5214 /* dcbtst */
5215 static void gen_dcbtst(DisasContext *ctx)
5216 {
5217     /*
5218      * interpreted as no-op
5219      * XXX: specification say this is treated as a load by the MMU but
5220      *      does not generate any exception
5221      */
5222 }
5223 
5224 /* dcbtstep */
5225 static void gen_dcbtstep(DisasContext *ctx)
5226 {
5227     /*
5228      * interpreted as no-op
5229      * XXX: specification say this is treated as a load by the MMU but
5230      *      does not generate any exception
5231      */
5232 }
5233 
5234 /* dcbtls */
5235 static void gen_dcbtls(DisasContext *ctx)
5236 {
5237     /* Always fails locking the cache */
5238     TCGv t0 = tcg_temp_new();
5239     gen_load_spr(t0, SPR_Exxx_L1CSR0);
5240     tcg_gen_ori_tl(t0, t0, L1CSR0_CUL);
5241     gen_store_spr(SPR_Exxx_L1CSR0, t0);
5242     tcg_temp_free(t0);
5243 }
5244 
5245 /* dcbz */
5246 static void gen_dcbz(DisasContext *ctx)
5247 {
5248     TCGv tcgv_addr;
5249     TCGv_i32 tcgv_op;
5250 
5251     gen_set_access_type(ctx, ACCESS_CACHE);
5252     tcgv_addr = tcg_temp_new();
5253     tcgv_op = tcg_const_i32(ctx->opcode & 0x03FF000);
5254     gen_addr_reg_index(ctx, tcgv_addr);
5255     gen_helper_dcbz(cpu_env, tcgv_addr, tcgv_op);
5256     tcg_temp_free(tcgv_addr);
5257     tcg_temp_free_i32(tcgv_op);
5258 }
5259 
5260 /* dcbzep */
5261 static void gen_dcbzep(DisasContext *ctx)
5262 {
5263     TCGv tcgv_addr;
5264     TCGv_i32 tcgv_op;
5265 
5266     gen_set_access_type(ctx, ACCESS_CACHE);
5267     tcgv_addr = tcg_temp_new();
5268     tcgv_op = tcg_const_i32(ctx->opcode & 0x03FF000);
5269     gen_addr_reg_index(ctx, tcgv_addr);
5270     gen_helper_dcbzep(cpu_env, tcgv_addr, tcgv_op);
5271     tcg_temp_free(tcgv_addr);
5272     tcg_temp_free_i32(tcgv_op);
5273 }
5274 
5275 /* dst / dstt */
5276 static void gen_dst(DisasContext *ctx)
5277 {
5278     if (rA(ctx->opcode) == 0) {
5279         gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
5280     } else {
5281         /* interpreted as no-op */
5282     }
5283 }
5284 
5285 /* dstst /dststt */
5286 static void gen_dstst(DisasContext *ctx)
5287 {
5288     if (rA(ctx->opcode) == 0) {
5289         gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
5290     } else {
5291         /* interpreted as no-op */
5292     }
5293 
5294 }
5295 
5296 /* dss / dssall */
5297 static void gen_dss(DisasContext *ctx)
5298 {
5299     /* interpreted as no-op */
5300 }
5301 
5302 /* icbi */
5303 static void gen_icbi(DisasContext *ctx)
5304 {
5305     TCGv t0;
5306     gen_set_access_type(ctx, ACCESS_CACHE);
5307     t0 = tcg_temp_new();
5308     gen_addr_reg_index(ctx, t0);
5309     gen_helper_icbi(cpu_env, t0);
5310     tcg_temp_free(t0);
5311 }
5312 
5313 /* icbiep */
5314 static void gen_icbiep(DisasContext *ctx)
5315 {
5316     TCGv t0;
5317     gen_set_access_type(ctx, ACCESS_CACHE);
5318     t0 = tcg_temp_new();
5319     gen_addr_reg_index(ctx, t0);
5320     gen_helper_icbiep(cpu_env, t0);
5321     tcg_temp_free(t0);
5322 }
5323 
5324 /* Optional: */
5325 /* dcba */
5326 static void gen_dcba(DisasContext *ctx)
5327 {
5328     /*
5329      * interpreted as no-op
5330      * XXX: specification say this is treated as a store by the MMU
5331      *      but does not generate any exception
5332      */
5333 }
5334 
5335 /***                    Segment register manipulation                      ***/
5336 /* Supervisor only: */
5337 
5338 /* mfsr */
5339 static void gen_mfsr(DisasContext *ctx)
5340 {
5341 #if defined(CONFIG_USER_ONLY)
5342     GEN_PRIV(ctx);
5343 #else
5344     TCGv t0;
5345 
5346     CHK_SV(ctx);
5347     t0 = tcg_const_tl(SR(ctx->opcode));
5348     gen_helper_load_sr(cpu_gpr[rD(ctx->opcode)], cpu_env, t0);
5349     tcg_temp_free(t0);
5350 #endif /* defined(CONFIG_USER_ONLY) */
5351 }
5352 
5353 /* mfsrin */
5354 static void gen_mfsrin(DisasContext *ctx)
5355 {
5356 #if defined(CONFIG_USER_ONLY)
5357     GEN_PRIV(ctx);
5358 #else
5359     TCGv t0;
5360 
5361     CHK_SV(ctx);
5362     t0 = tcg_temp_new();
5363     tcg_gen_extract_tl(t0, cpu_gpr[rB(ctx->opcode)], 28, 4);
5364     gen_helper_load_sr(cpu_gpr[rD(ctx->opcode)], cpu_env, t0);
5365     tcg_temp_free(t0);
5366 #endif /* defined(CONFIG_USER_ONLY) */
5367 }
5368 
5369 /* mtsr */
5370 static void gen_mtsr(DisasContext *ctx)
5371 {
5372 #if defined(CONFIG_USER_ONLY)
5373     GEN_PRIV(ctx);
5374 #else
5375     TCGv t0;
5376 
5377     CHK_SV(ctx);
5378     t0 = tcg_const_tl(SR(ctx->opcode));
5379     gen_helper_store_sr(cpu_env, t0, cpu_gpr[rS(ctx->opcode)]);
5380     tcg_temp_free(t0);
5381 #endif /* defined(CONFIG_USER_ONLY) */
5382 }
5383 
5384 /* mtsrin */
5385 static void gen_mtsrin(DisasContext *ctx)
5386 {
5387 #if defined(CONFIG_USER_ONLY)
5388     GEN_PRIV(ctx);
5389 #else
5390     TCGv t0;
5391     CHK_SV(ctx);
5392 
5393     t0 = tcg_temp_new();
5394     tcg_gen_extract_tl(t0, cpu_gpr[rB(ctx->opcode)], 28, 4);
5395     gen_helper_store_sr(cpu_env, t0, cpu_gpr[rD(ctx->opcode)]);
5396     tcg_temp_free(t0);
5397 #endif /* defined(CONFIG_USER_ONLY) */
5398 }
5399 
5400 #if defined(TARGET_PPC64)
5401 /* Specific implementation for PowerPC 64 "bridge" emulation using SLB */
5402 
5403 /* mfsr */
5404 static void gen_mfsr_64b(DisasContext *ctx)
5405 {
5406 #if defined(CONFIG_USER_ONLY)
5407     GEN_PRIV(ctx);
5408 #else
5409     TCGv t0;
5410 
5411     CHK_SV(ctx);
5412     t0 = tcg_const_tl(SR(ctx->opcode));
5413     gen_helper_load_sr(cpu_gpr[rD(ctx->opcode)], cpu_env, t0);
5414     tcg_temp_free(t0);
5415 #endif /* defined(CONFIG_USER_ONLY) */
5416 }
5417 
5418 /* mfsrin */
5419 static void gen_mfsrin_64b(DisasContext *ctx)
5420 {
5421 #if defined(CONFIG_USER_ONLY)
5422     GEN_PRIV(ctx);
5423 #else
5424     TCGv t0;
5425 
5426     CHK_SV(ctx);
5427     t0 = tcg_temp_new();
5428     tcg_gen_extract_tl(t0, cpu_gpr[rB(ctx->opcode)], 28, 4);
5429     gen_helper_load_sr(cpu_gpr[rD(ctx->opcode)], cpu_env, t0);
5430     tcg_temp_free(t0);
5431 #endif /* defined(CONFIG_USER_ONLY) */
5432 }
5433 
5434 /* mtsr */
5435 static void gen_mtsr_64b(DisasContext *ctx)
5436 {
5437 #if defined(CONFIG_USER_ONLY)
5438     GEN_PRIV(ctx);
5439 #else
5440     TCGv t0;
5441 
5442     CHK_SV(ctx);
5443     t0 = tcg_const_tl(SR(ctx->opcode));
5444     gen_helper_store_sr(cpu_env, t0, cpu_gpr[rS(ctx->opcode)]);
5445     tcg_temp_free(t0);
5446 #endif /* defined(CONFIG_USER_ONLY) */
5447 }
5448 
5449 /* mtsrin */
5450 static void gen_mtsrin_64b(DisasContext *ctx)
5451 {
5452 #if defined(CONFIG_USER_ONLY)
5453     GEN_PRIV(ctx);
5454 #else
5455     TCGv t0;
5456 
5457     CHK_SV(ctx);
5458     t0 = tcg_temp_new();
5459     tcg_gen_extract_tl(t0, cpu_gpr[rB(ctx->opcode)], 28, 4);
5460     gen_helper_store_sr(cpu_env, t0, cpu_gpr[rS(ctx->opcode)]);
5461     tcg_temp_free(t0);
5462 #endif /* defined(CONFIG_USER_ONLY) */
5463 }
5464 
5465 #endif /* defined(TARGET_PPC64) */
5466 
5467 /***                      Lookaside buffer management                      ***/
5468 /* Optional & supervisor only: */
5469 
5470 /* tlbia */
5471 static void gen_tlbia(DisasContext *ctx)
5472 {
5473 #if defined(CONFIG_USER_ONLY)
5474     GEN_PRIV(ctx);
5475 #else
5476     CHK_HV(ctx);
5477 
5478     gen_helper_tlbia(cpu_env);
5479 #endif  /* defined(CONFIG_USER_ONLY) */
5480 }
5481 
5482 /* tlbsync */
5483 static void gen_tlbsync(DisasContext *ctx)
5484 {
5485 #if defined(CONFIG_USER_ONLY)
5486     GEN_PRIV(ctx);
5487 #else
5488 
5489     if (ctx->gtse) {
5490         CHK_SV(ctx); /* If gtse is set then tlbsync is supervisor privileged */
5491     } else {
5492         CHK_HV(ctx); /* Else hypervisor privileged */
5493     }
5494 
5495     /* BookS does both ptesync and tlbsync make tlbsync a nop for server */
5496     if (ctx->insns_flags & PPC_BOOKE) {
5497         gen_check_tlb_flush(ctx, true);
5498     }
5499 #endif /* defined(CONFIG_USER_ONLY) */
5500 }
5501 
5502 /***                              External control                         ***/
5503 /* Optional: */
5504 
5505 /* eciwx */
5506 static void gen_eciwx(DisasContext *ctx)
5507 {
5508     TCGv t0;
5509     /* Should check EAR[E] ! */
5510     gen_set_access_type(ctx, ACCESS_EXT);
5511     t0 = tcg_temp_new();
5512     gen_addr_reg_index(ctx, t0);
5513     tcg_gen_qemu_ld_tl(cpu_gpr[rD(ctx->opcode)], t0, ctx->mem_idx,
5514                        DEF_MEMOP(MO_UL | MO_ALIGN));
5515     tcg_temp_free(t0);
5516 }
5517 
5518 /* ecowx */
5519 static void gen_ecowx(DisasContext *ctx)
5520 {
5521     TCGv t0;
5522     /* Should check EAR[E] ! */
5523     gen_set_access_type(ctx, ACCESS_EXT);
5524     t0 = tcg_temp_new();
5525     gen_addr_reg_index(ctx, t0);
5526     tcg_gen_qemu_st_tl(cpu_gpr[rD(ctx->opcode)], t0, ctx->mem_idx,
5527                        DEF_MEMOP(MO_UL | MO_ALIGN));
5528     tcg_temp_free(t0);
5529 }
5530 
5531 /* 602 - 603 - G2 TLB management */
5532 
5533 /* tlbld */
5534 static void gen_tlbld_6xx(DisasContext *ctx)
5535 {
5536 #if defined(CONFIG_USER_ONLY)
5537     GEN_PRIV(ctx);
5538 #else
5539     CHK_SV(ctx);
5540     gen_helper_6xx_tlbd(cpu_env, cpu_gpr[rB(ctx->opcode)]);
5541 #endif /* defined(CONFIG_USER_ONLY) */
5542 }
5543 
5544 /* tlbli */
5545 static void gen_tlbli_6xx(DisasContext *ctx)
5546 {
5547 #if defined(CONFIG_USER_ONLY)
5548     GEN_PRIV(ctx);
5549 #else
5550     CHK_SV(ctx);
5551     gen_helper_6xx_tlbi(cpu_env, cpu_gpr[rB(ctx->opcode)]);
5552 #endif /* defined(CONFIG_USER_ONLY) */
5553 }
5554 
5555 /* BookE specific instructions */
5556 
5557 /* XXX: not implemented on 440 ? */
5558 static void gen_mfapidi(DisasContext *ctx)
5559 {
5560     /* XXX: TODO */
5561     gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
5562 }
5563 
5564 /* XXX: not implemented on 440 ? */
5565 static void gen_tlbiva(DisasContext *ctx)
5566 {
5567 #if defined(CONFIG_USER_ONLY)
5568     GEN_PRIV(ctx);
5569 #else
5570     TCGv t0;
5571 
5572     CHK_SV(ctx);
5573     t0 = tcg_temp_new();
5574     gen_addr_reg_index(ctx, t0);
5575     gen_helper_tlbiva(cpu_env, cpu_gpr[rB(ctx->opcode)]);
5576     tcg_temp_free(t0);
5577 #endif /* defined(CONFIG_USER_ONLY) */
5578 }
5579 
5580 /* All 405 MAC instructions are translated here */
5581 static inline void gen_405_mulladd_insn(DisasContext *ctx, int opc2, int opc3,
5582                                         int ra, int rb, int rt, int Rc)
5583 {
5584     TCGv t0, t1;
5585 
5586     t0 = tcg_temp_local_new();
5587     t1 = tcg_temp_local_new();
5588 
5589     switch (opc3 & 0x0D) {
5590     case 0x05:
5591         /* macchw    - macchw.    - macchwo   - macchwo.   */
5592         /* macchws   - macchws.   - macchwso  - macchwso.  */
5593         /* nmacchw   - nmacchw.   - nmacchwo  - nmacchwo.  */
5594         /* nmacchws  - nmacchws.  - nmacchwso - nmacchwso. */
5595         /* mulchw - mulchw. */
5596         tcg_gen_ext16s_tl(t0, cpu_gpr[ra]);
5597         tcg_gen_sari_tl(t1, cpu_gpr[rb], 16);
5598         tcg_gen_ext16s_tl(t1, t1);
5599         break;
5600     case 0x04:
5601         /* macchwu   - macchwu.   - macchwuo  - macchwuo.  */
5602         /* macchwsu  - macchwsu.  - macchwsuo - macchwsuo. */
5603         /* mulchwu - mulchwu. */
5604         tcg_gen_ext16u_tl(t0, cpu_gpr[ra]);
5605         tcg_gen_shri_tl(t1, cpu_gpr[rb], 16);
5606         tcg_gen_ext16u_tl(t1, t1);
5607         break;
5608     case 0x01:
5609         /* machhw    - machhw.    - machhwo   - machhwo.   */
5610         /* machhws   - machhws.   - machhwso  - machhwso.  */
5611         /* nmachhw   - nmachhw.   - nmachhwo  - nmachhwo.  */
5612         /* nmachhws  - nmachhws.  - nmachhwso - nmachhwso. */
5613         /* mulhhw - mulhhw. */
5614         tcg_gen_sari_tl(t0, cpu_gpr[ra], 16);
5615         tcg_gen_ext16s_tl(t0, t0);
5616         tcg_gen_sari_tl(t1, cpu_gpr[rb], 16);
5617         tcg_gen_ext16s_tl(t1, t1);
5618         break;
5619     case 0x00:
5620         /* machhwu   - machhwu.   - machhwuo  - machhwuo.  */
5621         /* machhwsu  - machhwsu.  - machhwsuo - machhwsuo. */
5622         /* mulhhwu - mulhhwu. */
5623         tcg_gen_shri_tl(t0, cpu_gpr[ra], 16);
5624         tcg_gen_ext16u_tl(t0, t0);
5625         tcg_gen_shri_tl(t1, cpu_gpr[rb], 16);
5626         tcg_gen_ext16u_tl(t1, t1);
5627         break;
5628     case 0x0D:
5629         /* maclhw    - maclhw.    - maclhwo   - maclhwo.   */
5630         /* maclhws   - maclhws.   - maclhwso  - maclhwso.  */
5631         /* nmaclhw   - nmaclhw.   - nmaclhwo  - nmaclhwo.  */
5632         /* nmaclhws  - nmaclhws.  - nmaclhwso - nmaclhwso. */
5633         /* mullhw - mullhw. */
5634         tcg_gen_ext16s_tl(t0, cpu_gpr[ra]);
5635         tcg_gen_ext16s_tl(t1, cpu_gpr[rb]);
5636         break;
5637     case 0x0C:
5638         /* maclhwu   - maclhwu.   - maclhwuo  - maclhwuo.  */
5639         /* maclhwsu  - maclhwsu.  - maclhwsuo - maclhwsuo. */
5640         /* mullhwu - mullhwu. */
5641         tcg_gen_ext16u_tl(t0, cpu_gpr[ra]);
5642         tcg_gen_ext16u_tl(t1, cpu_gpr[rb]);
5643         break;
5644     }
5645     if (opc2 & 0x04) {
5646         /* (n)multiply-and-accumulate (0x0C / 0x0E) */
5647         tcg_gen_mul_tl(t1, t0, t1);
5648         if (opc2 & 0x02) {
5649             /* nmultiply-and-accumulate (0x0E) */
5650             tcg_gen_sub_tl(t0, cpu_gpr[rt], t1);
5651         } else {
5652             /* multiply-and-accumulate (0x0C) */
5653             tcg_gen_add_tl(t0, cpu_gpr[rt], t1);
5654         }
5655 
5656         if (opc3 & 0x12) {
5657             /* Check overflow and/or saturate */
5658             TCGLabel *l1 = gen_new_label();
5659 
5660             if (opc3 & 0x10) {
5661                 /* Start with XER OV disabled, the most likely case */
5662                 tcg_gen_movi_tl(cpu_ov, 0);
5663             }
5664             if (opc3 & 0x01) {
5665                 /* Signed */
5666                 tcg_gen_xor_tl(t1, cpu_gpr[rt], t1);
5667                 tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
5668                 tcg_gen_xor_tl(t1, cpu_gpr[rt], t0);
5669                 tcg_gen_brcondi_tl(TCG_COND_LT, t1, 0, l1);
5670                 if (opc3 & 0x02) {
5671                     /* Saturate */
5672                     tcg_gen_sari_tl(t0, cpu_gpr[rt], 31);
5673                     tcg_gen_xori_tl(t0, t0, 0x7fffffff);
5674                 }
5675             } else {
5676                 /* Unsigned */
5677                 tcg_gen_brcond_tl(TCG_COND_GEU, t0, t1, l1);
5678                 if (opc3 & 0x02) {
5679                     /* Saturate */
5680                     tcg_gen_movi_tl(t0, UINT32_MAX);
5681                 }
5682             }
5683             if (opc3 & 0x10) {
5684                 /* Check overflow */
5685                 tcg_gen_movi_tl(cpu_ov, 1);
5686                 tcg_gen_movi_tl(cpu_so, 1);
5687             }
5688             gen_set_label(l1);
5689             tcg_gen_mov_tl(cpu_gpr[rt], t0);
5690         }
5691     } else {
5692         tcg_gen_mul_tl(cpu_gpr[rt], t0, t1);
5693     }
5694     tcg_temp_free(t0);
5695     tcg_temp_free(t1);
5696     if (unlikely(Rc) != 0) {
5697         /* Update Rc0 */
5698         gen_set_Rc0(ctx, cpu_gpr[rt]);
5699     }
5700 }
5701 
5702 #define GEN_MAC_HANDLER(name, opc2, opc3)                                     \
5703 static void glue(gen_, name)(DisasContext *ctx)                               \
5704 {                                                                             \
5705     gen_405_mulladd_insn(ctx, opc2, opc3, rA(ctx->opcode), rB(ctx->opcode),   \
5706                          rD(ctx->opcode), Rc(ctx->opcode));                   \
5707 }
5708 
5709 /* macchw    - macchw.    */
5710 GEN_MAC_HANDLER(macchw, 0x0C, 0x05);
5711 /* macchwo   - macchwo.   */
5712 GEN_MAC_HANDLER(macchwo, 0x0C, 0x15);
5713 /* macchws   - macchws.   */
5714 GEN_MAC_HANDLER(macchws, 0x0C, 0x07);
5715 /* macchwso  - macchwso.  */
5716 GEN_MAC_HANDLER(macchwso, 0x0C, 0x17);
5717 /* macchwsu  - macchwsu.  */
5718 GEN_MAC_HANDLER(macchwsu, 0x0C, 0x06);
5719 /* macchwsuo - macchwsuo. */
5720 GEN_MAC_HANDLER(macchwsuo, 0x0C, 0x16);
5721 /* macchwu   - macchwu.   */
5722 GEN_MAC_HANDLER(macchwu, 0x0C, 0x04);
5723 /* macchwuo  - macchwuo.  */
5724 GEN_MAC_HANDLER(macchwuo, 0x0C, 0x14);
5725 /* machhw    - machhw.    */
5726 GEN_MAC_HANDLER(machhw, 0x0C, 0x01);
5727 /* machhwo   - machhwo.   */
5728 GEN_MAC_HANDLER(machhwo, 0x0C, 0x11);
5729 /* machhws   - machhws.   */
5730 GEN_MAC_HANDLER(machhws, 0x0C, 0x03);
5731 /* machhwso  - machhwso.  */
5732 GEN_MAC_HANDLER(machhwso, 0x0C, 0x13);
5733 /* machhwsu  - machhwsu.  */
5734 GEN_MAC_HANDLER(machhwsu, 0x0C, 0x02);
5735 /* machhwsuo - machhwsuo. */
5736 GEN_MAC_HANDLER(machhwsuo, 0x0C, 0x12);
5737 /* machhwu   - machhwu.   */
5738 GEN_MAC_HANDLER(machhwu, 0x0C, 0x00);
5739 /* machhwuo  - machhwuo.  */
5740 GEN_MAC_HANDLER(machhwuo, 0x0C, 0x10);
5741 /* maclhw    - maclhw.    */
5742 GEN_MAC_HANDLER(maclhw, 0x0C, 0x0D);
5743 /* maclhwo   - maclhwo.   */
5744 GEN_MAC_HANDLER(maclhwo, 0x0C, 0x1D);
5745 /* maclhws   - maclhws.   */
5746 GEN_MAC_HANDLER(maclhws, 0x0C, 0x0F);
5747 /* maclhwso  - maclhwso.  */
5748 GEN_MAC_HANDLER(maclhwso, 0x0C, 0x1F);
5749 /* maclhwu   - maclhwu.   */
5750 GEN_MAC_HANDLER(maclhwu, 0x0C, 0x0C);
5751 /* maclhwuo  - maclhwuo.  */
5752 GEN_MAC_HANDLER(maclhwuo, 0x0C, 0x1C);
5753 /* maclhwsu  - maclhwsu.  */
5754 GEN_MAC_HANDLER(maclhwsu, 0x0C, 0x0E);
5755 /* maclhwsuo - maclhwsuo. */
5756 GEN_MAC_HANDLER(maclhwsuo, 0x0C, 0x1E);
5757 /* nmacchw   - nmacchw.   */
5758 GEN_MAC_HANDLER(nmacchw, 0x0E, 0x05);
5759 /* nmacchwo  - nmacchwo.  */
5760 GEN_MAC_HANDLER(nmacchwo, 0x0E, 0x15);
5761 /* nmacchws  - nmacchws.  */
5762 GEN_MAC_HANDLER(nmacchws, 0x0E, 0x07);
5763 /* nmacchwso - nmacchwso. */
5764 GEN_MAC_HANDLER(nmacchwso, 0x0E, 0x17);
5765 /* nmachhw   - nmachhw.   */
5766 GEN_MAC_HANDLER(nmachhw, 0x0E, 0x01);
5767 /* nmachhwo  - nmachhwo.  */
5768 GEN_MAC_HANDLER(nmachhwo, 0x0E, 0x11);
5769 /* nmachhws  - nmachhws.  */
5770 GEN_MAC_HANDLER(nmachhws, 0x0E, 0x03);
5771 /* nmachhwso - nmachhwso. */
5772 GEN_MAC_HANDLER(nmachhwso, 0x0E, 0x13);
5773 /* nmaclhw   - nmaclhw.   */
5774 GEN_MAC_HANDLER(nmaclhw, 0x0E, 0x0D);
5775 /* nmaclhwo  - nmaclhwo.  */
5776 GEN_MAC_HANDLER(nmaclhwo, 0x0E, 0x1D);
5777 /* nmaclhws  - nmaclhws.  */
5778 GEN_MAC_HANDLER(nmaclhws, 0x0E, 0x0F);
5779 /* nmaclhwso - nmaclhwso. */
5780 GEN_MAC_HANDLER(nmaclhwso, 0x0E, 0x1F);
5781 
5782 /* mulchw  - mulchw.  */
5783 GEN_MAC_HANDLER(mulchw, 0x08, 0x05);
5784 /* mulchwu - mulchwu. */
5785 GEN_MAC_HANDLER(mulchwu, 0x08, 0x04);
5786 /* mulhhw  - mulhhw.  */
5787 GEN_MAC_HANDLER(mulhhw, 0x08, 0x01);
5788 /* mulhhwu - mulhhwu. */
5789 GEN_MAC_HANDLER(mulhhwu, 0x08, 0x00);
5790 /* mullhw  - mullhw.  */
5791 GEN_MAC_HANDLER(mullhw, 0x08, 0x0D);
5792 /* mullhwu - mullhwu. */
5793 GEN_MAC_HANDLER(mullhwu, 0x08, 0x0C);
5794 
5795 /* mfdcr */
5796 static void gen_mfdcr(DisasContext *ctx)
5797 {
5798 #if defined(CONFIG_USER_ONLY)
5799     GEN_PRIV(ctx);
5800 #else
5801     TCGv dcrn;
5802 
5803     CHK_SV(ctx);
5804     dcrn = tcg_const_tl(SPR(ctx->opcode));
5805     gen_helper_load_dcr(cpu_gpr[rD(ctx->opcode)], cpu_env, dcrn);
5806     tcg_temp_free(dcrn);
5807 #endif /* defined(CONFIG_USER_ONLY) */
5808 }
5809 
5810 /* mtdcr */
5811 static void gen_mtdcr(DisasContext *ctx)
5812 {
5813 #if defined(CONFIG_USER_ONLY)
5814     GEN_PRIV(ctx);
5815 #else
5816     TCGv dcrn;
5817 
5818     CHK_SV(ctx);
5819     dcrn = tcg_const_tl(SPR(ctx->opcode));
5820     gen_helper_store_dcr(cpu_env, dcrn, cpu_gpr[rS(ctx->opcode)]);
5821     tcg_temp_free(dcrn);
5822 #endif /* defined(CONFIG_USER_ONLY) */
5823 }
5824 
5825 /* mfdcrx */
5826 /* XXX: not implemented on 440 ? */
5827 static void gen_mfdcrx(DisasContext *ctx)
5828 {
5829 #if defined(CONFIG_USER_ONLY)
5830     GEN_PRIV(ctx);
5831 #else
5832     CHK_SV(ctx);
5833     gen_helper_load_dcr(cpu_gpr[rD(ctx->opcode)], cpu_env,
5834                         cpu_gpr[rA(ctx->opcode)]);
5835     /* Note: Rc update flag set leads to undefined state of Rc0 */
5836 #endif /* defined(CONFIG_USER_ONLY) */
5837 }
5838 
5839 /* mtdcrx */
5840 /* XXX: not implemented on 440 ? */
5841 static void gen_mtdcrx(DisasContext *ctx)
5842 {
5843 #if defined(CONFIG_USER_ONLY)
5844     GEN_PRIV(ctx);
5845 #else
5846     CHK_SV(ctx);
5847     gen_helper_store_dcr(cpu_env, cpu_gpr[rA(ctx->opcode)],
5848                          cpu_gpr[rS(ctx->opcode)]);
5849     /* Note: Rc update flag set leads to undefined state of Rc0 */
5850 #endif /* defined(CONFIG_USER_ONLY) */
5851 }
5852 
5853 /* dccci */
5854 static void gen_dccci(DisasContext *ctx)
5855 {
5856     CHK_SV(ctx);
5857     /* interpreted as no-op */
5858 }
5859 
5860 /* dcread */
5861 static void gen_dcread(DisasContext *ctx)
5862 {
5863 #if defined(CONFIG_USER_ONLY)
5864     GEN_PRIV(ctx);
5865 #else
5866     TCGv EA, val;
5867 
5868     CHK_SV(ctx);
5869     gen_set_access_type(ctx, ACCESS_CACHE);
5870     EA = tcg_temp_new();
5871     gen_addr_reg_index(ctx, EA);
5872     val = tcg_temp_new();
5873     gen_qemu_ld32u(ctx, val, EA);
5874     tcg_temp_free(val);
5875     tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], EA);
5876     tcg_temp_free(EA);
5877 #endif /* defined(CONFIG_USER_ONLY) */
5878 }
5879 
5880 /* icbt */
5881 static void gen_icbt_40x(DisasContext *ctx)
5882 {
5883     /*
5884      * interpreted as no-op
5885      * XXX: specification say this is treated as a load by the MMU but
5886      *      does not generate any exception
5887      */
5888 }
5889 
5890 /* iccci */
5891 static void gen_iccci(DisasContext *ctx)
5892 {
5893     CHK_SV(ctx);
5894     /* interpreted as no-op */
5895 }
5896 
5897 /* icread */
5898 static void gen_icread(DisasContext *ctx)
5899 {
5900     CHK_SV(ctx);
5901     /* interpreted as no-op */
5902 }
5903 
5904 /* rfci (supervisor only) */
5905 static void gen_rfci_40x(DisasContext *ctx)
5906 {
5907 #if defined(CONFIG_USER_ONLY)
5908     GEN_PRIV(ctx);
5909 #else
5910     CHK_SV(ctx);
5911     /* Restore CPU state */
5912     gen_helper_40x_rfci(cpu_env);
5913     ctx->base.is_jmp = DISAS_EXIT;
5914 #endif /* defined(CONFIG_USER_ONLY) */
5915 }
5916 
5917 static void gen_rfci(DisasContext *ctx)
5918 {
5919 #if defined(CONFIG_USER_ONLY)
5920     GEN_PRIV(ctx);
5921 #else
5922     CHK_SV(ctx);
5923     /* Restore CPU state */
5924     gen_helper_rfci(cpu_env);
5925     ctx->base.is_jmp = DISAS_EXIT;
5926 #endif /* defined(CONFIG_USER_ONLY) */
5927 }
5928 
5929 /* BookE specific */
5930 
5931 /* XXX: not implemented on 440 ? */
5932 static void gen_rfdi(DisasContext *ctx)
5933 {
5934 #if defined(CONFIG_USER_ONLY)
5935     GEN_PRIV(ctx);
5936 #else
5937     CHK_SV(ctx);
5938     /* Restore CPU state */
5939     gen_helper_rfdi(cpu_env);
5940     ctx->base.is_jmp = DISAS_EXIT;
5941 #endif /* defined(CONFIG_USER_ONLY) */
5942 }
5943 
5944 /* XXX: not implemented on 440 ? */
5945 static void gen_rfmci(DisasContext *ctx)
5946 {
5947 #if defined(CONFIG_USER_ONLY)
5948     GEN_PRIV(ctx);
5949 #else
5950     CHK_SV(ctx);
5951     /* Restore CPU state */
5952     gen_helper_rfmci(cpu_env);
5953     ctx->base.is_jmp = DISAS_EXIT;
5954 #endif /* defined(CONFIG_USER_ONLY) */
5955 }
5956 
5957 /* TLB management - PowerPC 405 implementation */
5958 
5959 /* tlbre */
5960 static void gen_tlbre_40x(DisasContext *ctx)
5961 {
5962 #if defined(CONFIG_USER_ONLY)
5963     GEN_PRIV(ctx);
5964 #else
5965     CHK_SV(ctx);
5966     switch (rB(ctx->opcode)) {
5967     case 0:
5968         gen_helper_4xx_tlbre_hi(cpu_gpr[rD(ctx->opcode)], cpu_env,
5969                                 cpu_gpr[rA(ctx->opcode)]);
5970         break;
5971     case 1:
5972         gen_helper_4xx_tlbre_lo(cpu_gpr[rD(ctx->opcode)], cpu_env,
5973                                 cpu_gpr[rA(ctx->opcode)]);
5974         break;
5975     default:
5976         gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
5977         break;
5978     }
5979 #endif /* defined(CONFIG_USER_ONLY) */
5980 }
5981 
5982 /* tlbsx - tlbsx. */
5983 static void gen_tlbsx_40x(DisasContext *ctx)
5984 {
5985 #if defined(CONFIG_USER_ONLY)
5986     GEN_PRIV(ctx);
5987 #else
5988     TCGv t0;
5989 
5990     CHK_SV(ctx);
5991     t0 = tcg_temp_new();
5992     gen_addr_reg_index(ctx, t0);
5993     gen_helper_4xx_tlbsx(cpu_gpr[rD(ctx->opcode)], cpu_env, t0);
5994     tcg_temp_free(t0);
5995     if (Rc(ctx->opcode)) {
5996         TCGLabel *l1 = gen_new_label();
5997         tcg_gen_trunc_tl_i32(cpu_crf[0], cpu_so);
5998         tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[rD(ctx->opcode)], -1, l1);
5999         tcg_gen_ori_i32(cpu_crf[0], cpu_crf[0], 0x02);
6000         gen_set_label(l1);
6001     }
6002 #endif /* defined(CONFIG_USER_ONLY) */
6003 }
6004 
6005 /* tlbwe */
6006 static void gen_tlbwe_40x(DisasContext *ctx)
6007 {
6008 #if defined(CONFIG_USER_ONLY)
6009     GEN_PRIV(ctx);
6010 #else
6011     CHK_SV(ctx);
6012 
6013     switch (rB(ctx->opcode)) {
6014     case 0:
6015         gen_helper_4xx_tlbwe_hi(cpu_env, cpu_gpr[rA(ctx->opcode)],
6016                                 cpu_gpr[rS(ctx->opcode)]);
6017         break;
6018     case 1:
6019         gen_helper_4xx_tlbwe_lo(cpu_env, cpu_gpr[rA(ctx->opcode)],
6020                                 cpu_gpr[rS(ctx->opcode)]);
6021         break;
6022     default:
6023         gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
6024         break;
6025     }
6026 #endif /* defined(CONFIG_USER_ONLY) */
6027 }
6028 
6029 /* TLB management - PowerPC 440 implementation */
6030 
6031 /* tlbre */
6032 static void gen_tlbre_440(DisasContext *ctx)
6033 {
6034 #if defined(CONFIG_USER_ONLY)
6035     GEN_PRIV(ctx);
6036 #else
6037     CHK_SV(ctx);
6038 
6039     switch (rB(ctx->opcode)) {
6040     case 0:
6041     case 1:
6042     case 2:
6043         {
6044             TCGv_i32 t0 = tcg_const_i32(rB(ctx->opcode));
6045             gen_helper_440_tlbre(cpu_gpr[rD(ctx->opcode)], cpu_env,
6046                                  t0, cpu_gpr[rA(ctx->opcode)]);
6047             tcg_temp_free_i32(t0);
6048         }
6049         break;
6050     default:
6051         gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
6052         break;
6053     }
6054 #endif /* defined(CONFIG_USER_ONLY) */
6055 }
6056 
6057 /* tlbsx - tlbsx. */
6058 static void gen_tlbsx_440(DisasContext *ctx)
6059 {
6060 #if defined(CONFIG_USER_ONLY)
6061     GEN_PRIV(ctx);
6062 #else
6063     TCGv t0;
6064 
6065     CHK_SV(ctx);
6066     t0 = tcg_temp_new();
6067     gen_addr_reg_index(ctx, t0);
6068     gen_helper_440_tlbsx(cpu_gpr[rD(ctx->opcode)], cpu_env, t0);
6069     tcg_temp_free(t0);
6070     if (Rc(ctx->opcode)) {
6071         TCGLabel *l1 = gen_new_label();
6072         tcg_gen_trunc_tl_i32(cpu_crf[0], cpu_so);
6073         tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[rD(ctx->opcode)], -1, l1);
6074         tcg_gen_ori_i32(cpu_crf[0], cpu_crf[0], 0x02);
6075         gen_set_label(l1);
6076     }
6077 #endif /* defined(CONFIG_USER_ONLY) */
6078 }
6079 
6080 /* tlbwe */
6081 static void gen_tlbwe_440(DisasContext *ctx)
6082 {
6083 #if defined(CONFIG_USER_ONLY)
6084     GEN_PRIV(ctx);
6085 #else
6086     CHK_SV(ctx);
6087     switch (rB(ctx->opcode)) {
6088     case 0:
6089     case 1:
6090     case 2:
6091         {
6092             TCGv_i32 t0 = tcg_const_i32(rB(ctx->opcode));
6093             gen_helper_440_tlbwe(cpu_env, t0, cpu_gpr[rA(ctx->opcode)],
6094                                  cpu_gpr[rS(ctx->opcode)]);
6095             tcg_temp_free_i32(t0);
6096         }
6097         break;
6098     default:
6099         gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
6100         break;
6101     }
6102 #endif /* defined(CONFIG_USER_ONLY) */
6103 }
6104 
6105 /* TLB management - PowerPC BookE 2.06 implementation */
6106 
6107 /* tlbre */
6108 static void gen_tlbre_booke206(DisasContext *ctx)
6109 {
6110  #if defined(CONFIG_USER_ONLY)
6111     GEN_PRIV(ctx);
6112 #else
6113    CHK_SV(ctx);
6114     gen_helper_booke206_tlbre(cpu_env);
6115 #endif /* defined(CONFIG_USER_ONLY) */
6116 }
6117 
6118 /* tlbsx - tlbsx. */
6119 static void gen_tlbsx_booke206(DisasContext *ctx)
6120 {
6121 #if defined(CONFIG_USER_ONLY)
6122     GEN_PRIV(ctx);
6123 #else
6124     TCGv t0;
6125 
6126     CHK_SV(ctx);
6127     if (rA(ctx->opcode)) {
6128         t0 = tcg_temp_new();
6129         tcg_gen_mov_tl(t0, cpu_gpr[rD(ctx->opcode)]);
6130     } else {
6131         t0 = tcg_const_tl(0);
6132     }
6133 
6134     tcg_gen_add_tl(t0, t0, cpu_gpr[rB(ctx->opcode)]);
6135     gen_helper_booke206_tlbsx(cpu_env, t0);
6136     tcg_temp_free(t0);
6137 #endif /* defined(CONFIG_USER_ONLY) */
6138 }
6139 
6140 /* tlbwe */
6141 static void gen_tlbwe_booke206(DisasContext *ctx)
6142 {
6143 #if defined(CONFIG_USER_ONLY)
6144     GEN_PRIV(ctx);
6145 #else
6146     CHK_SV(ctx);
6147     gen_helper_booke206_tlbwe(cpu_env);
6148 #endif /* defined(CONFIG_USER_ONLY) */
6149 }
6150 
6151 static void gen_tlbivax_booke206(DisasContext *ctx)
6152 {
6153 #if defined(CONFIG_USER_ONLY)
6154     GEN_PRIV(ctx);
6155 #else
6156     TCGv t0;
6157 
6158     CHK_SV(ctx);
6159     t0 = tcg_temp_new();
6160     gen_addr_reg_index(ctx, t0);
6161     gen_helper_booke206_tlbivax(cpu_env, t0);
6162     tcg_temp_free(t0);
6163 #endif /* defined(CONFIG_USER_ONLY) */
6164 }
6165 
6166 static void gen_tlbilx_booke206(DisasContext *ctx)
6167 {
6168 #if defined(CONFIG_USER_ONLY)
6169     GEN_PRIV(ctx);
6170 #else
6171     TCGv t0;
6172 
6173     CHK_SV(ctx);
6174     t0 = tcg_temp_new();
6175     gen_addr_reg_index(ctx, t0);
6176 
6177     switch ((ctx->opcode >> 21) & 0x3) {
6178     case 0:
6179         gen_helper_booke206_tlbilx0(cpu_env, t0);
6180         break;
6181     case 1:
6182         gen_helper_booke206_tlbilx1(cpu_env, t0);
6183         break;
6184     case 3:
6185         gen_helper_booke206_tlbilx3(cpu_env, t0);
6186         break;
6187     default:
6188         gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
6189         break;
6190     }
6191 
6192     tcg_temp_free(t0);
6193 #endif /* defined(CONFIG_USER_ONLY) */
6194 }
6195 
6196 /* wrtee */
6197 static void gen_wrtee(DisasContext *ctx)
6198 {
6199 #if defined(CONFIG_USER_ONLY)
6200     GEN_PRIV(ctx);
6201 #else
6202     TCGv t0;
6203 
6204     CHK_SV(ctx);
6205     t0 = tcg_temp_new();
6206     tcg_gen_andi_tl(t0, cpu_gpr[rD(ctx->opcode)], (1 << MSR_EE));
6207     tcg_gen_andi_tl(cpu_msr, cpu_msr, ~(1 << MSR_EE));
6208     tcg_gen_or_tl(cpu_msr, cpu_msr, t0);
6209     gen_ppc_maybe_interrupt(ctx);
6210     tcg_temp_free(t0);
6211     /*
6212      * Stop translation to have a chance to raise an exception if we
6213      * just set msr_ee to 1
6214      */
6215     ctx->base.is_jmp = DISAS_EXIT_UPDATE;
6216 #endif /* defined(CONFIG_USER_ONLY) */
6217 }
6218 
6219 /* wrteei */
6220 static void gen_wrteei(DisasContext *ctx)
6221 {
6222 #if defined(CONFIG_USER_ONLY)
6223     GEN_PRIV(ctx);
6224 #else
6225     CHK_SV(ctx);
6226     if (ctx->opcode & 0x00008000) {
6227         tcg_gen_ori_tl(cpu_msr, cpu_msr, (1 << MSR_EE));
6228         gen_ppc_maybe_interrupt(ctx);
6229         /* Stop translation to have a chance to raise an exception */
6230         ctx->base.is_jmp = DISAS_EXIT_UPDATE;
6231     } else {
6232         tcg_gen_andi_tl(cpu_msr, cpu_msr, ~(1 << MSR_EE));
6233     }
6234 #endif /* defined(CONFIG_USER_ONLY) */
6235 }
6236 
6237 /* PowerPC 440 specific instructions */
6238 
6239 /* dlmzb */
6240 static void gen_dlmzb(DisasContext *ctx)
6241 {
6242     TCGv_i32 t0 = tcg_const_i32(Rc(ctx->opcode));
6243     gen_helper_dlmzb(cpu_gpr[rA(ctx->opcode)], cpu_env,
6244                      cpu_gpr[rS(ctx->opcode)], cpu_gpr[rB(ctx->opcode)], t0);
6245     tcg_temp_free_i32(t0);
6246 }
6247 
6248 /* mbar replaces eieio on 440 */
6249 static void gen_mbar(DisasContext *ctx)
6250 {
6251     /* interpreted as no-op */
6252 }
6253 
6254 /* msync replaces sync on 440 */
6255 static void gen_msync_4xx(DisasContext *ctx)
6256 {
6257     /* Only e500 seems to treat reserved bits as invalid */
6258     if ((ctx->insns_flags2 & PPC2_BOOKE206) &&
6259         (ctx->opcode & 0x03FFF801)) {
6260         gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
6261     }
6262     /* otherwise interpreted as no-op */
6263 }
6264 
6265 /* icbt */
6266 static void gen_icbt_440(DisasContext *ctx)
6267 {
6268     /*
6269      * interpreted as no-op
6270      * XXX: specification say this is treated as a load by the MMU but
6271      *      does not generate any exception
6272      */
6273 }
6274 
6275 #if defined(TARGET_PPC64)
6276 static void gen_maddld(DisasContext *ctx)
6277 {
6278     TCGv_i64 t1 = tcg_temp_new_i64();
6279 
6280     tcg_gen_mul_i64(t1, cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]);
6281     tcg_gen_add_i64(cpu_gpr[rD(ctx->opcode)], t1, cpu_gpr[rC(ctx->opcode)]);
6282     tcg_temp_free_i64(t1);
6283 }
6284 
6285 /* maddhd maddhdu */
6286 static void gen_maddhd_maddhdu(DisasContext *ctx)
6287 {
6288     TCGv_i64 lo = tcg_temp_new_i64();
6289     TCGv_i64 hi = tcg_temp_new_i64();
6290     TCGv_i64 t1 = tcg_temp_new_i64();
6291 
6292     if (Rc(ctx->opcode)) {
6293         tcg_gen_mulu2_i64(lo, hi, cpu_gpr[rA(ctx->opcode)],
6294                           cpu_gpr[rB(ctx->opcode)]);
6295         tcg_gen_movi_i64(t1, 0);
6296     } else {
6297         tcg_gen_muls2_i64(lo, hi, cpu_gpr[rA(ctx->opcode)],
6298                           cpu_gpr[rB(ctx->opcode)]);
6299         tcg_gen_sari_i64(t1, cpu_gpr[rC(ctx->opcode)], 63);
6300     }
6301     tcg_gen_add2_i64(t1, cpu_gpr[rD(ctx->opcode)], lo, hi,
6302                      cpu_gpr[rC(ctx->opcode)], t1);
6303     tcg_temp_free_i64(lo);
6304     tcg_temp_free_i64(hi);
6305     tcg_temp_free_i64(t1);
6306 }
6307 #endif /* defined(TARGET_PPC64) */
6308 
6309 static void gen_tbegin(DisasContext *ctx)
6310 {
6311     if (unlikely(!ctx->tm_enabled)) {
6312         gen_exception_err(ctx, POWERPC_EXCP_FU, FSCR_IC_TM);
6313         return;
6314     }
6315     gen_helper_tbegin(cpu_env);
6316 }
6317 
6318 #define GEN_TM_NOOP(name)                                      \
6319 static inline void gen_##name(DisasContext *ctx)               \
6320 {                                                              \
6321     if (unlikely(!ctx->tm_enabled)) {                          \
6322         gen_exception_err(ctx, POWERPC_EXCP_FU, FSCR_IC_TM);   \
6323         return;                                                \
6324     }                                                          \
6325     /*                                                         \
6326      * Because tbegin always fails in QEMU, these user         \
6327      * space instructions all have a simple implementation:    \
6328      *                                                         \
6329      *     CR[0] = 0b0 || MSR[TS] || 0b0                       \
6330      *           = 0b0 || 0b00    || 0b0                       \
6331      */                                                        \
6332     tcg_gen_movi_i32(cpu_crf[0], 0);                           \
6333 }
6334 
6335 GEN_TM_NOOP(tend);
6336 GEN_TM_NOOP(tabort);
6337 GEN_TM_NOOP(tabortwc);
6338 GEN_TM_NOOP(tabortwci);
6339 GEN_TM_NOOP(tabortdc);
6340 GEN_TM_NOOP(tabortdci);
6341 GEN_TM_NOOP(tsr);
6342 
6343 static inline void gen_cp_abort(DisasContext *ctx)
6344 {
6345     /* Do Nothing */
6346 }
6347 
6348 #define GEN_CP_PASTE_NOOP(name)                           \
6349 static inline void gen_##name(DisasContext *ctx)          \
6350 {                                                         \
6351     /*                                                    \
6352      * Generate invalid exception until we have an        \
6353      * implementation of the copy paste facility          \
6354      */                                                   \
6355     gen_invalid(ctx);                                     \
6356 }
6357 
6358 GEN_CP_PASTE_NOOP(copy)
6359 GEN_CP_PASTE_NOOP(paste)
6360 
6361 static void gen_tcheck(DisasContext *ctx)
6362 {
6363     if (unlikely(!ctx->tm_enabled)) {
6364         gen_exception_err(ctx, POWERPC_EXCP_FU, FSCR_IC_TM);
6365         return;
6366     }
6367     /*
6368      * Because tbegin always fails, the tcheck implementation is
6369      * simple:
6370      *
6371      * CR[CRF] = TDOOMED || MSR[TS] || 0b0
6372      *         = 0b1 || 0b00 || 0b0
6373      */
6374     tcg_gen_movi_i32(cpu_crf[crfD(ctx->opcode)], 0x8);
6375 }
6376 
6377 #if defined(CONFIG_USER_ONLY)
6378 #define GEN_TM_PRIV_NOOP(name)                                 \
6379 static inline void gen_##name(DisasContext *ctx)               \
6380 {                                                              \
6381     gen_priv_opc(ctx);                                         \
6382 }
6383 
6384 #else
6385 
6386 #define GEN_TM_PRIV_NOOP(name)                                 \
6387 static inline void gen_##name(DisasContext *ctx)               \
6388 {                                                              \
6389     CHK_SV(ctx);                                               \
6390     if (unlikely(!ctx->tm_enabled)) {                          \
6391         gen_exception_err(ctx, POWERPC_EXCP_FU, FSCR_IC_TM);   \
6392         return;                                                \
6393     }                                                          \
6394     /*                                                         \
6395      * Because tbegin always fails, the implementation is      \
6396      * simple:                                                 \
6397      *                                                         \
6398      *   CR[0] = 0b0 || MSR[TS] || 0b0                         \
6399      *         = 0b0 || 0b00 | 0b0                             \
6400      */                                                        \
6401     tcg_gen_movi_i32(cpu_crf[0], 0);                           \
6402 }
6403 
6404 #endif
6405 
6406 GEN_TM_PRIV_NOOP(treclaim);
6407 GEN_TM_PRIV_NOOP(trechkpt);
6408 
6409 static inline void get_fpr(TCGv_i64 dst, int regno)
6410 {
6411     tcg_gen_ld_i64(dst, cpu_env, fpr_offset(regno));
6412 }
6413 
6414 static inline void set_fpr(int regno, TCGv_i64 src)
6415 {
6416     tcg_gen_st_i64(src, cpu_env, fpr_offset(regno));
6417     /*
6418      * Before PowerISA v3.1 the result of doubleword 1 of the VSR
6419      * corresponding to the target FPR was undefined. However,
6420      * most (if not all) real hardware were setting the result to 0.
6421      * Starting at ISA v3.1, the result for doubleword 1 is now defined
6422      * to be 0.
6423      */
6424     tcg_gen_st_i64(tcg_constant_i64(0), cpu_env, vsr64_offset(regno, false));
6425 }
6426 
6427 static inline void get_avr64(TCGv_i64 dst, int regno, bool high)
6428 {
6429     tcg_gen_ld_i64(dst, cpu_env, avr64_offset(regno, high));
6430 }
6431 
6432 static inline void set_avr64(int regno, TCGv_i64 src, bool high)
6433 {
6434     tcg_gen_st_i64(src, cpu_env, avr64_offset(regno, high));
6435 }
6436 
6437 /*
6438  * Helpers for decodetree used by !function for decoding arguments.
6439  */
6440 static int times_2(DisasContext *ctx, int x)
6441 {
6442     return x * 2;
6443 }
6444 
6445 static int times_4(DisasContext *ctx, int x)
6446 {
6447     return x * 4;
6448 }
6449 
6450 static int times_16(DisasContext *ctx, int x)
6451 {
6452     return x * 16;
6453 }
6454 
6455 static int64_t dw_compose_ea(DisasContext *ctx, int x)
6456 {
6457     return deposit64(0xfffffffffffffe00, 3, 6, x);
6458 }
6459 
6460 /*
6461  * Helpers for trans_* functions to check for specific insns flags.
6462  * Use token pasting to ensure that we use the proper flag with the
6463  * proper variable.
6464  */
6465 #define REQUIRE_INSNS_FLAGS(CTX, NAME) \
6466     do {                                                \
6467         if (((CTX)->insns_flags & PPC_##NAME) == 0) {   \
6468             return false;                               \
6469         }                                               \
6470     } while (0)
6471 
6472 #define REQUIRE_INSNS_FLAGS2(CTX, NAME) \
6473     do {                                                \
6474         if (((CTX)->insns_flags2 & PPC2_##NAME) == 0) { \
6475             return false;                               \
6476         }                                               \
6477     } while (0)
6478 
6479 /* Then special-case the check for 64-bit so that we elide code for ppc32. */
6480 #if TARGET_LONG_BITS == 32
6481 # define REQUIRE_64BIT(CTX)  return false
6482 #else
6483 # define REQUIRE_64BIT(CTX)  REQUIRE_INSNS_FLAGS(CTX, 64B)
6484 #endif
6485 
6486 #define REQUIRE_VECTOR(CTX)                             \
6487     do {                                                \
6488         if (unlikely(!(CTX)->altivec_enabled)) {        \
6489             gen_exception((CTX), POWERPC_EXCP_VPU);     \
6490             return true;                                \
6491         }                                               \
6492     } while (0)
6493 
6494 #define REQUIRE_VSX(CTX)                                \
6495     do {                                                \
6496         if (unlikely(!(CTX)->vsx_enabled)) {            \
6497             gen_exception((CTX), POWERPC_EXCP_VSXU);    \
6498             return true;                                \
6499         }                                               \
6500     } while (0)
6501 
6502 #define REQUIRE_FPU(ctx)                                \
6503     do {                                                \
6504         if (unlikely(!(ctx)->fpu_enabled)) {            \
6505             gen_exception((ctx), POWERPC_EXCP_FPU);     \
6506             return true;                                \
6507         }                                               \
6508     } while (0)
6509 
6510 #if !defined(CONFIG_USER_ONLY)
6511 #define REQUIRE_SV(CTX)             \
6512     do {                            \
6513         if (unlikely((CTX)->pr)) {  \
6514             gen_priv_opc(CTX);      \
6515             return true;            \
6516         }                           \
6517     } while (0)
6518 
6519 #define REQUIRE_HV(CTX)                             \
6520     do {                                            \
6521         if (unlikely((CTX)->pr || !(CTX)->hv)) {    \
6522             gen_priv_opc(CTX);                      \
6523             return true;                            \
6524         }                                           \
6525     } while (0)
6526 #else
6527 #define REQUIRE_SV(CTX) do { gen_priv_opc(CTX); return true; } while (0)
6528 #define REQUIRE_HV(CTX) do { gen_priv_opc(CTX); return true; } while (0)
6529 #endif
6530 
6531 /*
6532  * Helpers for implementing sets of trans_* functions.
6533  * Defer the implementation of NAME to FUNC, with optional extra arguments.
6534  */
6535 #define TRANS(NAME, FUNC, ...) \
6536     static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
6537     { return FUNC(ctx, a, __VA_ARGS__); }
6538 #define TRANS_FLAGS(FLAGS, NAME, FUNC, ...) \
6539     static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
6540     {                                                          \
6541         REQUIRE_INSNS_FLAGS(ctx, FLAGS);                       \
6542         return FUNC(ctx, a, __VA_ARGS__);                      \
6543     }
6544 #define TRANS_FLAGS2(FLAGS2, NAME, FUNC, ...) \
6545     static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
6546     {                                                          \
6547         REQUIRE_INSNS_FLAGS2(ctx, FLAGS2);                     \
6548         return FUNC(ctx, a, __VA_ARGS__);                      \
6549     }
6550 
6551 #define TRANS64(NAME, FUNC, ...) \
6552     static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
6553     { REQUIRE_64BIT(ctx); return FUNC(ctx, a, __VA_ARGS__); }
6554 #define TRANS64_FLAGS2(FLAGS2, NAME, FUNC, ...) \
6555     static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
6556     {                                                          \
6557         REQUIRE_64BIT(ctx);                                    \
6558         REQUIRE_INSNS_FLAGS2(ctx, FLAGS2);                     \
6559         return FUNC(ctx, a, __VA_ARGS__);                      \
6560     }
6561 
6562 /* TODO: More TRANS* helpers for extra insn_flags checks. */
6563 
6564 
6565 #include "decode-insn32.c.inc"
6566 #include "decode-insn64.c.inc"
6567 #include "power8-pmu-regs.c.inc"
6568 
6569 /*
6570  * Incorporate CIA into the constant when R=1.
6571  * Validate that when R=1, RA=0.
6572  */
6573 static bool resolve_PLS_D(DisasContext *ctx, arg_D *d, arg_PLS_D *a)
6574 {
6575     d->rt = a->rt;
6576     d->ra = a->ra;
6577     d->si = a->si;
6578     if (a->r) {
6579         if (unlikely(a->ra != 0)) {
6580             gen_invalid(ctx);
6581             return false;
6582         }
6583         d->si += ctx->cia;
6584     }
6585     return true;
6586 }
6587 
6588 #include "translate/fixedpoint-impl.c.inc"
6589 
6590 #include "translate/fp-impl.c.inc"
6591 
6592 #include "translate/vmx-impl.c.inc"
6593 
6594 #include "translate/vsx-impl.c.inc"
6595 
6596 #include "translate/dfp-impl.c.inc"
6597 
6598 #include "translate/spe-impl.c.inc"
6599 
6600 #include "translate/branch-impl.c.inc"
6601 
6602 #include "translate/processor-ctrl-impl.c.inc"
6603 
6604 #include "translate/storage-ctrl-impl.c.inc"
6605 
6606 /* Handles lfdp */
6607 static void gen_dform39(DisasContext *ctx)
6608 {
6609     if ((ctx->opcode & 0x3) == 0) {
6610         if (ctx->insns_flags2 & PPC2_ISA205) {
6611             return gen_lfdp(ctx);
6612         }
6613     }
6614     return gen_invalid(ctx);
6615 }
6616 
6617 /* Handles stfdp */
6618 static void gen_dform3D(DisasContext *ctx)
6619 {
6620     if ((ctx->opcode & 3) == 0) { /* DS-FORM */
6621         /* stfdp */
6622         if (ctx->insns_flags2 & PPC2_ISA205) {
6623             return gen_stfdp(ctx);
6624         }
6625     }
6626     return gen_invalid(ctx);
6627 }
6628 
6629 #if defined(TARGET_PPC64)
6630 /* brd */
6631 static void gen_brd(DisasContext *ctx)
6632 {
6633     tcg_gen_bswap64_i64(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]);
6634 }
6635 
6636 /* brw */
6637 static void gen_brw(DisasContext *ctx)
6638 {
6639     tcg_gen_bswap64_i64(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]);
6640     tcg_gen_rotli_i64(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], 32);
6641 
6642 }
6643 
6644 /* brh */
6645 static void gen_brh(DisasContext *ctx)
6646 {
6647     TCGv_i64 mask = tcg_constant_i64(0x00ff00ff00ff00ffull);
6648     TCGv_i64 t1 = tcg_temp_new_i64();
6649     TCGv_i64 t2 = tcg_temp_new_i64();
6650 
6651     tcg_gen_shri_i64(t1, cpu_gpr[rS(ctx->opcode)], 8);
6652     tcg_gen_and_i64(t2, t1, mask);
6653     tcg_gen_and_i64(t1, cpu_gpr[rS(ctx->opcode)], mask);
6654     tcg_gen_shli_i64(t1, t1, 8);
6655     tcg_gen_or_i64(cpu_gpr[rA(ctx->opcode)], t1, t2);
6656 
6657     tcg_temp_free_i64(t1);
6658     tcg_temp_free_i64(t2);
6659 }
6660 #endif
6661 
6662 static opcode_t opcodes[] = {
6663 #if defined(TARGET_PPC64)
6664 GEN_HANDLER_E(brd, 0x1F, 0x1B, 0x05, 0x0000F801, PPC_NONE, PPC2_ISA310),
6665 GEN_HANDLER_E(brw, 0x1F, 0x1B, 0x04, 0x0000F801, PPC_NONE, PPC2_ISA310),
6666 GEN_HANDLER_E(brh, 0x1F, 0x1B, 0x06, 0x0000F801, PPC_NONE, PPC2_ISA310),
6667 #endif
6668 GEN_HANDLER(invalid, 0x00, 0x00, 0x00, 0xFFFFFFFF, PPC_NONE),
6669 #if defined(TARGET_PPC64)
6670 GEN_HANDLER_E(cmpeqb, 0x1F, 0x00, 0x07, 0x00600000, PPC_NONE, PPC2_ISA300),
6671 #endif
6672 GEN_HANDLER_E(cmpb, 0x1F, 0x1C, 0x0F, 0x00000001, PPC_NONE, PPC2_ISA205),
6673 GEN_HANDLER_E(cmprb, 0x1F, 0x00, 0x06, 0x00400001, PPC_NONE, PPC2_ISA300),
6674 GEN_HANDLER(isel, 0x1F, 0x0F, 0xFF, 0x00000001, PPC_ISEL),
6675 GEN_HANDLER(addic, 0x0C, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
6676 GEN_HANDLER2(addic_, "addic.", 0x0D, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
6677 GEN_HANDLER(mulhw, 0x1F, 0x0B, 0x02, 0x00000400, PPC_INTEGER),
6678 GEN_HANDLER(mulhwu, 0x1F, 0x0B, 0x00, 0x00000400, PPC_INTEGER),
6679 GEN_HANDLER(mullw, 0x1F, 0x0B, 0x07, 0x00000000, PPC_INTEGER),
6680 GEN_HANDLER(mullwo, 0x1F, 0x0B, 0x17, 0x00000000, PPC_INTEGER),
6681 GEN_HANDLER(mulli, 0x07, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
6682 #if defined(TARGET_PPC64)
6683 GEN_HANDLER(mulld, 0x1F, 0x09, 0x07, 0x00000000, PPC_64B),
6684 #endif
6685 GEN_HANDLER(neg, 0x1F, 0x08, 0x03, 0x0000F800, PPC_INTEGER),
6686 GEN_HANDLER(nego, 0x1F, 0x08, 0x13, 0x0000F800, PPC_INTEGER),
6687 GEN_HANDLER(subfic, 0x08, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
6688 GEN_HANDLER2(andi_, "andi.", 0x1C, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
6689 GEN_HANDLER2(andis_, "andis.", 0x1D, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
6690 GEN_HANDLER(cntlzw, 0x1F, 0x1A, 0x00, 0x00000000, PPC_INTEGER),
6691 GEN_HANDLER_E(cnttzw, 0x1F, 0x1A, 0x10, 0x00000000, PPC_NONE, PPC2_ISA300),
6692 GEN_HANDLER_E(copy, 0x1F, 0x06, 0x18, 0x03C00001, PPC_NONE, PPC2_ISA300),
6693 GEN_HANDLER_E(cp_abort, 0x1F, 0x06, 0x1A, 0x03FFF801, PPC_NONE, PPC2_ISA300),
6694 GEN_HANDLER_E(paste, 0x1F, 0x06, 0x1C, 0x03C00000, PPC_NONE, PPC2_ISA300),
6695 GEN_HANDLER(or, 0x1F, 0x1C, 0x0D, 0x00000000, PPC_INTEGER),
6696 GEN_HANDLER(xor, 0x1F, 0x1C, 0x09, 0x00000000, PPC_INTEGER),
6697 GEN_HANDLER(ori, 0x18, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
6698 GEN_HANDLER(oris, 0x19, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
6699 GEN_HANDLER(xori, 0x1A, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
6700 GEN_HANDLER(xoris, 0x1B, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
6701 GEN_HANDLER(popcntb, 0x1F, 0x1A, 0x03, 0x0000F801, PPC_POPCNTB),
6702 GEN_HANDLER(popcntw, 0x1F, 0x1A, 0x0b, 0x0000F801, PPC_POPCNTWD),
6703 GEN_HANDLER_E(prtyw, 0x1F, 0x1A, 0x04, 0x0000F801, PPC_NONE, PPC2_ISA205),
6704 #if defined(TARGET_PPC64)
6705 GEN_HANDLER(popcntd, 0x1F, 0x1A, 0x0F, 0x0000F801, PPC_POPCNTWD),
6706 GEN_HANDLER(cntlzd, 0x1F, 0x1A, 0x01, 0x00000000, PPC_64B),
6707 GEN_HANDLER_E(cnttzd, 0x1F, 0x1A, 0x11, 0x00000000, PPC_NONE, PPC2_ISA300),
6708 GEN_HANDLER_E(darn, 0x1F, 0x13, 0x17, 0x001CF801, PPC_NONE, PPC2_ISA300),
6709 GEN_HANDLER_E(prtyd, 0x1F, 0x1A, 0x05, 0x0000F801, PPC_NONE, PPC2_ISA205),
6710 GEN_HANDLER_E(bpermd, 0x1F, 0x1C, 0x07, 0x00000001, PPC_NONE, PPC2_PERM_ISA206),
6711 #endif
6712 GEN_HANDLER(rlwimi, 0x14, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
6713 GEN_HANDLER(rlwinm, 0x15, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
6714 GEN_HANDLER(rlwnm, 0x17, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
6715 GEN_HANDLER(slw, 0x1F, 0x18, 0x00, 0x00000000, PPC_INTEGER),
6716 GEN_HANDLER(sraw, 0x1F, 0x18, 0x18, 0x00000000, PPC_INTEGER),
6717 GEN_HANDLER(srawi, 0x1F, 0x18, 0x19, 0x00000000, PPC_INTEGER),
6718 GEN_HANDLER(srw, 0x1F, 0x18, 0x10, 0x00000000, PPC_INTEGER),
6719 #if defined(TARGET_PPC64)
6720 GEN_HANDLER(sld, 0x1F, 0x1B, 0x00, 0x00000000, PPC_64B),
6721 GEN_HANDLER(srad, 0x1F, 0x1A, 0x18, 0x00000000, PPC_64B),
6722 GEN_HANDLER2(sradi0, "sradi", 0x1F, 0x1A, 0x19, 0x00000000, PPC_64B),
6723 GEN_HANDLER2(sradi1, "sradi", 0x1F, 0x1B, 0x19, 0x00000000, PPC_64B),
6724 GEN_HANDLER(srd, 0x1F, 0x1B, 0x10, 0x00000000, PPC_64B),
6725 GEN_HANDLER2_E(extswsli0, "extswsli", 0x1F, 0x1A, 0x1B, 0x00000000,
6726                PPC_NONE, PPC2_ISA300),
6727 GEN_HANDLER2_E(extswsli1, "extswsli", 0x1F, 0x1B, 0x1B, 0x00000000,
6728                PPC_NONE, PPC2_ISA300),
6729 #endif
6730 /* handles lfdp, lxsd, lxssp */
6731 GEN_HANDLER_E(dform39, 0x39, 0xFF, 0xFF, 0x00000000, PPC_NONE, PPC2_ISA205),
6732 /* handles stfdp, stxsd, stxssp */
6733 GEN_HANDLER_E(dform3D, 0x3D, 0xFF, 0xFF, 0x00000000, PPC_NONE, PPC2_ISA205),
6734 GEN_HANDLER(lmw, 0x2E, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
6735 GEN_HANDLER(stmw, 0x2F, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
6736 GEN_HANDLER(lswi, 0x1F, 0x15, 0x12, 0x00000001, PPC_STRING),
6737 GEN_HANDLER(lswx, 0x1F, 0x15, 0x10, 0x00000001, PPC_STRING),
6738 GEN_HANDLER(stswi, 0x1F, 0x15, 0x16, 0x00000001, PPC_STRING),
6739 GEN_HANDLER(stswx, 0x1F, 0x15, 0x14, 0x00000001, PPC_STRING),
6740 GEN_HANDLER(eieio, 0x1F, 0x16, 0x1A, 0x01FFF801, PPC_MEM_EIEIO),
6741 GEN_HANDLER(isync, 0x13, 0x16, 0x04, 0x03FFF801, PPC_MEM),
6742 GEN_HANDLER_E(lbarx, 0x1F, 0x14, 0x01, 0, PPC_NONE, PPC2_ATOMIC_ISA206),
6743 GEN_HANDLER_E(lharx, 0x1F, 0x14, 0x03, 0, PPC_NONE, PPC2_ATOMIC_ISA206),
6744 GEN_HANDLER(lwarx, 0x1F, 0x14, 0x00, 0x00000000, PPC_RES),
6745 GEN_HANDLER_E(lwat, 0x1F, 0x06, 0x12, 0x00000001, PPC_NONE, PPC2_ISA300),
6746 GEN_HANDLER_E(stwat, 0x1F, 0x06, 0x16, 0x00000001, PPC_NONE, PPC2_ISA300),
6747 GEN_HANDLER_E(stbcx_, 0x1F, 0x16, 0x15, 0, PPC_NONE, PPC2_ATOMIC_ISA206),
6748 GEN_HANDLER_E(sthcx_, 0x1F, 0x16, 0x16, 0, PPC_NONE, PPC2_ATOMIC_ISA206),
6749 GEN_HANDLER2(stwcx_, "stwcx.", 0x1F, 0x16, 0x04, 0x00000000, PPC_RES),
6750 #if defined(TARGET_PPC64)
6751 GEN_HANDLER_E(ldat, 0x1F, 0x06, 0x13, 0x00000001, PPC_NONE, PPC2_ISA300),
6752 GEN_HANDLER_E(stdat, 0x1F, 0x06, 0x17, 0x00000001, PPC_NONE, PPC2_ISA300),
6753 GEN_HANDLER(ldarx, 0x1F, 0x14, 0x02, 0x00000000, PPC_64B),
6754 GEN_HANDLER_E(lqarx, 0x1F, 0x14, 0x08, 0, PPC_NONE, PPC2_LSQ_ISA207),
6755 GEN_HANDLER2(stdcx_, "stdcx.", 0x1F, 0x16, 0x06, 0x00000000, PPC_64B),
6756 GEN_HANDLER_E(stqcx_, 0x1F, 0x16, 0x05, 0, PPC_NONE, PPC2_LSQ_ISA207),
6757 #endif
6758 GEN_HANDLER(sync, 0x1F, 0x16, 0x12, 0x039FF801, PPC_MEM_SYNC),
6759 /* ISA v3.0 changed the extended opcode from 62 to 30 */
6760 GEN_HANDLER(wait, 0x1F, 0x1E, 0x01, 0x039FF801, PPC_WAIT),
6761 GEN_HANDLER_E(wait, 0x1F, 0x1E, 0x00, 0x039CF801, PPC_NONE, PPC2_ISA300),
6762 GEN_HANDLER(b, 0x12, 0xFF, 0xFF, 0x00000000, PPC_FLOW),
6763 GEN_HANDLER(bc, 0x10, 0xFF, 0xFF, 0x00000000, PPC_FLOW),
6764 GEN_HANDLER(bcctr, 0x13, 0x10, 0x10, 0x00000000, PPC_FLOW),
6765 GEN_HANDLER(bclr, 0x13, 0x10, 0x00, 0x00000000, PPC_FLOW),
6766 GEN_HANDLER_E(bctar, 0x13, 0x10, 0x11, 0x0000E000, PPC_NONE, PPC2_BCTAR_ISA207),
6767 GEN_HANDLER(mcrf, 0x13, 0x00, 0xFF, 0x00000001, PPC_INTEGER),
6768 GEN_HANDLER(rfi, 0x13, 0x12, 0x01, 0x03FF8001, PPC_FLOW),
6769 #if defined(TARGET_PPC64)
6770 GEN_HANDLER(rfid, 0x13, 0x12, 0x00, 0x03FF8001, PPC_64B),
6771 #if !defined(CONFIG_USER_ONLY)
6772 /* Top bit of opc2 corresponds with low bit of LEV, so use two handlers */
6773 GEN_HANDLER_E(scv, 0x11, 0x10, 0xFF, 0x03FFF01E, PPC_NONE, PPC2_ISA300),
6774 GEN_HANDLER_E(scv, 0x11, 0x00, 0xFF, 0x03FFF01E, PPC_NONE, PPC2_ISA300),
6775 GEN_HANDLER_E(rfscv, 0x13, 0x12, 0x02, 0x03FF8001, PPC_NONE, PPC2_ISA300),
6776 #endif
6777 GEN_HANDLER_E(stop, 0x13, 0x12, 0x0b, 0x03FFF801, PPC_NONE, PPC2_ISA300),
6778 GEN_HANDLER_E(doze, 0x13, 0x12, 0x0c, 0x03FFF801, PPC_NONE, PPC2_PM_ISA206),
6779 GEN_HANDLER_E(nap, 0x13, 0x12, 0x0d, 0x03FFF801, PPC_NONE, PPC2_PM_ISA206),
6780 GEN_HANDLER_E(sleep, 0x13, 0x12, 0x0e, 0x03FFF801, PPC_NONE, PPC2_PM_ISA206),
6781 GEN_HANDLER_E(rvwinkle, 0x13, 0x12, 0x0f, 0x03FFF801, PPC_NONE, PPC2_PM_ISA206),
6782 GEN_HANDLER(hrfid, 0x13, 0x12, 0x08, 0x03FF8001, PPC_64H),
6783 #endif
6784 /* Top bit of opc2 corresponds with low bit of LEV, so use two handlers */
6785 GEN_HANDLER(sc, 0x11, 0x11, 0xFF, 0x03FFF01D, PPC_FLOW),
6786 GEN_HANDLER(sc, 0x11, 0x01, 0xFF, 0x03FFF01D, PPC_FLOW),
6787 GEN_HANDLER(tw, 0x1F, 0x04, 0x00, 0x00000001, PPC_FLOW),
6788 GEN_HANDLER(twi, 0x03, 0xFF, 0xFF, 0x00000000, PPC_FLOW),
6789 #if defined(TARGET_PPC64)
6790 GEN_HANDLER(td, 0x1F, 0x04, 0x02, 0x00000001, PPC_64B),
6791 GEN_HANDLER(tdi, 0x02, 0xFF, 0xFF, 0x00000000, PPC_64B),
6792 #endif
6793 GEN_HANDLER(mcrxr, 0x1F, 0x00, 0x10, 0x007FF801, PPC_MISC),
6794 GEN_HANDLER(mfcr, 0x1F, 0x13, 0x00, 0x00000801, PPC_MISC),
6795 GEN_HANDLER(mfmsr, 0x1F, 0x13, 0x02, 0x001FF801, PPC_MISC),
6796 GEN_HANDLER(mfspr, 0x1F, 0x13, 0x0A, 0x00000001, PPC_MISC),
6797 GEN_HANDLER(mftb, 0x1F, 0x13, 0x0B, 0x00000001, PPC_MFTB),
6798 GEN_HANDLER(mtcrf, 0x1F, 0x10, 0x04, 0x00000801, PPC_MISC),
6799 #if defined(TARGET_PPC64)
6800 GEN_HANDLER(mtmsrd, 0x1F, 0x12, 0x05, 0x001EF801, PPC_64B),
6801 GEN_HANDLER_E(setb, 0x1F, 0x00, 0x04, 0x0003F801, PPC_NONE, PPC2_ISA300),
6802 GEN_HANDLER_E(mcrxrx, 0x1F, 0x00, 0x12, 0x007FF801, PPC_NONE, PPC2_ISA300),
6803 #endif
6804 GEN_HANDLER(mtmsr, 0x1F, 0x12, 0x04, 0x001EF801, PPC_MISC),
6805 GEN_HANDLER(mtspr, 0x1F, 0x13, 0x0E, 0x00000000, PPC_MISC),
6806 GEN_HANDLER(dcbf, 0x1F, 0x16, 0x02, 0x03C00001, PPC_CACHE),
6807 GEN_HANDLER_E(dcbfep, 0x1F, 0x1F, 0x03, 0x03C00001, PPC_NONE, PPC2_BOOKE206),
6808 GEN_HANDLER(dcbi, 0x1F, 0x16, 0x0E, 0x03E00001, PPC_CACHE),
6809 GEN_HANDLER(dcbst, 0x1F, 0x16, 0x01, 0x03E00001, PPC_CACHE),
6810 GEN_HANDLER_E(dcbstep, 0x1F, 0x1F, 0x01, 0x03E00001, PPC_NONE, PPC2_BOOKE206),
6811 GEN_HANDLER(dcbt, 0x1F, 0x16, 0x08, 0x00000001, PPC_CACHE),
6812 GEN_HANDLER_E(dcbtep, 0x1F, 0x1F, 0x09, 0x00000001, PPC_NONE, PPC2_BOOKE206),
6813 GEN_HANDLER(dcbtst, 0x1F, 0x16, 0x07, 0x00000001, PPC_CACHE),
6814 GEN_HANDLER_E(dcbtstep, 0x1F, 0x1F, 0x07, 0x00000001, PPC_NONE, PPC2_BOOKE206),
6815 GEN_HANDLER_E(dcbtls, 0x1F, 0x06, 0x05, 0x02000001, PPC_BOOKE, PPC2_BOOKE206),
6816 GEN_HANDLER(dcbz, 0x1F, 0x16, 0x1F, 0x03C00001, PPC_CACHE_DCBZ),
6817 GEN_HANDLER_E(dcbzep, 0x1F, 0x1F, 0x1F, 0x03C00001, PPC_NONE, PPC2_BOOKE206),
6818 GEN_HANDLER(dst, 0x1F, 0x16, 0x0A, 0x01800001, PPC_ALTIVEC),
6819 GEN_HANDLER(dstst, 0x1F, 0x16, 0x0B, 0x01800001, PPC_ALTIVEC),
6820 GEN_HANDLER(dss, 0x1F, 0x16, 0x19, 0x019FF801, PPC_ALTIVEC),
6821 GEN_HANDLER(icbi, 0x1F, 0x16, 0x1E, 0x03E00001, PPC_CACHE_ICBI),
6822 GEN_HANDLER_E(icbiep, 0x1F, 0x1F, 0x1E, 0x03E00001, PPC_NONE, PPC2_BOOKE206),
6823 GEN_HANDLER(dcba, 0x1F, 0x16, 0x17, 0x03E00001, PPC_CACHE_DCBA),
6824 GEN_HANDLER(mfsr, 0x1F, 0x13, 0x12, 0x0010F801, PPC_SEGMENT),
6825 GEN_HANDLER(mfsrin, 0x1F, 0x13, 0x14, 0x001F0001, PPC_SEGMENT),
6826 GEN_HANDLER(mtsr, 0x1F, 0x12, 0x06, 0x0010F801, PPC_SEGMENT),
6827 GEN_HANDLER(mtsrin, 0x1F, 0x12, 0x07, 0x001F0001, PPC_SEGMENT),
6828 #if defined(TARGET_PPC64)
6829 GEN_HANDLER2(mfsr_64b, "mfsr", 0x1F, 0x13, 0x12, 0x0010F801, PPC_SEGMENT_64B),
6830 GEN_HANDLER2(mfsrin_64b, "mfsrin", 0x1F, 0x13, 0x14, 0x001F0001,
6831              PPC_SEGMENT_64B),
6832 GEN_HANDLER2(mtsr_64b, "mtsr", 0x1F, 0x12, 0x06, 0x0010F801, PPC_SEGMENT_64B),
6833 GEN_HANDLER2(mtsrin_64b, "mtsrin", 0x1F, 0x12, 0x07, 0x001F0001,
6834              PPC_SEGMENT_64B),
6835 #endif
6836 GEN_HANDLER(tlbia, 0x1F, 0x12, 0x0B, 0x03FFFC01, PPC_MEM_TLBIA),
6837 /*
6838  * XXX Those instructions will need to be handled differently for
6839  * different ISA versions
6840  */
6841 GEN_HANDLER(tlbsync, 0x1F, 0x16, 0x11, 0x03FFF801, PPC_MEM_TLBSYNC),
6842 GEN_HANDLER(eciwx, 0x1F, 0x16, 0x0D, 0x00000001, PPC_EXTERN),
6843 GEN_HANDLER(ecowx, 0x1F, 0x16, 0x09, 0x00000001, PPC_EXTERN),
6844 GEN_HANDLER2(tlbld_6xx, "tlbld", 0x1F, 0x12, 0x1E, 0x03FF0001, PPC_6xx_TLB),
6845 GEN_HANDLER2(tlbli_6xx, "tlbli", 0x1F, 0x12, 0x1F, 0x03FF0001, PPC_6xx_TLB),
6846 GEN_HANDLER(mfapidi, 0x1F, 0x13, 0x08, 0x0000F801, PPC_MFAPIDI),
6847 GEN_HANDLER(tlbiva, 0x1F, 0x12, 0x18, 0x03FFF801, PPC_TLBIVA),
6848 GEN_HANDLER(mfdcr, 0x1F, 0x03, 0x0A, 0x00000001, PPC_DCR),
6849 GEN_HANDLER(mtdcr, 0x1F, 0x03, 0x0E, 0x00000001, PPC_DCR),
6850 GEN_HANDLER(mfdcrx, 0x1F, 0x03, 0x08, 0x00000000, PPC_DCRX),
6851 GEN_HANDLER(mtdcrx, 0x1F, 0x03, 0x0C, 0x00000000, PPC_DCRX),
6852 GEN_HANDLER(dccci, 0x1F, 0x06, 0x0E, 0x03E00001, PPC_4xx_COMMON),
6853 GEN_HANDLER(dcread, 0x1F, 0x06, 0x0F, 0x00000001, PPC_4xx_COMMON),
6854 GEN_HANDLER2(icbt_40x, "icbt", 0x1F, 0x06, 0x08, 0x03E00001, PPC_40x_ICBT),
6855 GEN_HANDLER(iccci, 0x1F, 0x06, 0x1E, 0x00000001, PPC_4xx_COMMON),
6856 GEN_HANDLER(icread, 0x1F, 0x06, 0x1F, 0x03E00001, PPC_4xx_COMMON),
6857 GEN_HANDLER2(rfci_40x, "rfci", 0x13, 0x13, 0x01, 0x03FF8001, PPC_40x_EXCP),
6858 GEN_HANDLER_E(rfci, 0x13, 0x13, 0x01, 0x03FF8001, PPC_BOOKE, PPC2_BOOKE206),
6859 GEN_HANDLER(rfdi, 0x13, 0x07, 0x01, 0x03FF8001, PPC_RFDI),
6860 GEN_HANDLER(rfmci, 0x13, 0x06, 0x01, 0x03FF8001, PPC_RFMCI),
6861 GEN_HANDLER2(tlbre_40x, "tlbre", 0x1F, 0x12, 0x1D, 0x00000001, PPC_40x_TLB),
6862 GEN_HANDLER2(tlbsx_40x, "tlbsx", 0x1F, 0x12, 0x1C, 0x00000000, PPC_40x_TLB),
6863 GEN_HANDLER2(tlbwe_40x, "tlbwe", 0x1F, 0x12, 0x1E, 0x00000001, PPC_40x_TLB),
6864 GEN_HANDLER2(tlbre_440, "tlbre", 0x1F, 0x12, 0x1D, 0x00000001, PPC_BOOKE),
6865 GEN_HANDLER2(tlbsx_440, "tlbsx", 0x1F, 0x12, 0x1C, 0x00000000, PPC_BOOKE),
6866 GEN_HANDLER2(tlbwe_440, "tlbwe", 0x1F, 0x12, 0x1E, 0x00000001, PPC_BOOKE),
6867 GEN_HANDLER2_E(tlbre_booke206, "tlbre", 0x1F, 0x12, 0x1D, 0x00000001,
6868                PPC_NONE, PPC2_BOOKE206),
6869 GEN_HANDLER2_E(tlbsx_booke206, "tlbsx", 0x1F, 0x12, 0x1C, 0x00000000,
6870                PPC_NONE, PPC2_BOOKE206),
6871 GEN_HANDLER2_E(tlbwe_booke206, "tlbwe", 0x1F, 0x12, 0x1E, 0x00000001,
6872                PPC_NONE, PPC2_BOOKE206),
6873 GEN_HANDLER2_E(tlbivax_booke206, "tlbivax", 0x1F, 0x12, 0x18, 0x00000001,
6874                PPC_NONE, PPC2_BOOKE206),
6875 GEN_HANDLER2_E(tlbilx_booke206, "tlbilx", 0x1F, 0x12, 0x00, 0x03800001,
6876                PPC_NONE, PPC2_BOOKE206),
6877 GEN_HANDLER(wrtee, 0x1F, 0x03, 0x04, 0x000FFC01, PPC_WRTEE),
6878 GEN_HANDLER(wrteei, 0x1F, 0x03, 0x05, 0x000E7C01, PPC_WRTEE),
6879 GEN_HANDLER(dlmzb, 0x1F, 0x0E, 0x02, 0x00000000, PPC_440_SPEC),
6880 GEN_HANDLER_E(mbar, 0x1F, 0x16, 0x1a, 0x001FF801,
6881               PPC_BOOKE, PPC2_BOOKE206),
6882 GEN_HANDLER(msync_4xx, 0x1F, 0x16, 0x12, 0x039FF801, PPC_BOOKE),
6883 GEN_HANDLER2_E(icbt_440, "icbt", 0x1F, 0x16, 0x00, 0x03E00001,
6884                PPC_BOOKE, PPC2_BOOKE206),
6885 GEN_HANDLER2(icbt_440, "icbt", 0x1F, 0x06, 0x08, 0x03E00001,
6886              PPC_440_SPEC),
6887 GEN_HANDLER(lvsl, 0x1f, 0x06, 0x00, 0x00000001, PPC_ALTIVEC),
6888 GEN_HANDLER(lvsr, 0x1f, 0x06, 0x01, 0x00000001, PPC_ALTIVEC),
6889 GEN_HANDLER(mfvscr, 0x04, 0x2, 0x18, 0x001ff800, PPC_ALTIVEC),
6890 GEN_HANDLER(mtvscr, 0x04, 0x2, 0x19, 0x03ff0000, PPC_ALTIVEC),
6891 #if defined(TARGET_PPC64)
6892 GEN_HANDLER_E(maddhd_maddhdu, 0x04, 0x18, 0xFF, 0x00000000, PPC_NONE,
6893               PPC2_ISA300),
6894 GEN_HANDLER_E(maddld, 0x04, 0x19, 0xFF, 0x00000000, PPC_NONE, PPC2_ISA300),
6895 #endif
6896 
6897 #undef GEN_INT_ARITH_ADD
6898 #undef GEN_INT_ARITH_ADD_CONST
6899 #define GEN_INT_ARITH_ADD(name, opc3, add_ca, compute_ca, compute_ov)         \
6900 GEN_HANDLER(name, 0x1F, 0x0A, opc3, 0x00000000, PPC_INTEGER),
6901 #define GEN_INT_ARITH_ADD_CONST(name, opc3, const_val,                        \
6902                                 add_ca, compute_ca, compute_ov)               \
6903 GEN_HANDLER(name, 0x1F, 0x0A, opc3, 0x0000F800, PPC_INTEGER),
6904 GEN_INT_ARITH_ADD(add, 0x08, 0, 0, 0)
6905 GEN_INT_ARITH_ADD(addo, 0x18, 0, 0, 1)
6906 GEN_INT_ARITH_ADD(addc, 0x00, 0, 1, 0)
6907 GEN_INT_ARITH_ADD(addco, 0x10, 0, 1, 1)
6908 GEN_INT_ARITH_ADD(adde, 0x04, 1, 1, 0)
6909 GEN_INT_ARITH_ADD(addeo, 0x14, 1, 1, 1)
6910 GEN_INT_ARITH_ADD_CONST(addme, 0x07, -1LL, 1, 1, 0)
6911 GEN_INT_ARITH_ADD_CONST(addmeo, 0x17, -1LL, 1, 1, 1)
6912 GEN_HANDLER_E(addex, 0x1F, 0x0A, 0x05, 0x00000000, PPC_NONE, PPC2_ISA300),
6913 GEN_INT_ARITH_ADD_CONST(addze, 0x06, 0, 1, 1, 0)
6914 GEN_INT_ARITH_ADD_CONST(addzeo, 0x16, 0, 1, 1, 1)
6915 
6916 #undef GEN_INT_ARITH_DIVW
6917 #define GEN_INT_ARITH_DIVW(name, opc3, sign, compute_ov)                      \
6918 GEN_HANDLER(name, 0x1F, 0x0B, opc3, 0x00000000, PPC_INTEGER)
6919 GEN_INT_ARITH_DIVW(divwu, 0x0E, 0, 0),
6920 GEN_INT_ARITH_DIVW(divwuo, 0x1E, 0, 1),
6921 GEN_INT_ARITH_DIVW(divw, 0x0F, 1, 0),
6922 GEN_INT_ARITH_DIVW(divwo, 0x1F, 1, 1),
6923 GEN_HANDLER_E(divwe, 0x1F, 0x0B, 0x0D, 0, PPC_NONE, PPC2_DIVE_ISA206),
6924 GEN_HANDLER_E(divweo, 0x1F, 0x0B, 0x1D, 0, PPC_NONE, PPC2_DIVE_ISA206),
6925 GEN_HANDLER_E(divweu, 0x1F, 0x0B, 0x0C, 0, PPC_NONE, PPC2_DIVE_ISA206),
6926 GEN_HANDLER_E(divweuo, 0x1F, 0x0B, 0x1C, 0, PPC_NONE, PPC2_DIVE_ISA206),
6927 GEN_HANDLER_E(modsw, 0x1F, 0x0B, 0x18, 0x00000001, PPC_NONE, PPC2_ISA300),
6928 GEN_HANDLER_E(moduw, 0x1F, 0x0B, 0x08, 0x00000001, PPC_NONE, PPC2_ISA300),
6929 
6930 #if defined(TARGET_PPC64)
6931 #undef GEN_INT_ARITH_DIVD
6932 #define GEN_INT_ARITH_DIVD(name, opc3, sign, compute_ov)                      \
6933 GEN_HANDLER(name, 0x1F, 0x09, opc3, 0x00000000, PPC_64B)
6934 GEN_INT_ARITH_DIVD(divdu, 0x0E, 0, 0),
6935 GEN_INT_ARITH_DIVD(divduo, 0x1E, 0, 1),
6936 GEN_INT_ARITH_DIVD(divd, 0x0F, 1, 0),
6937 GEN_INT_ARITH_DIVD(divdo, 0x1F, 1, 1),
6938 
6939 GEN_HANDLER_E(divdeu, 0x1F, 0x09, 0x0C, 0, PPC_NONE, PPC2_DIVE_ISA206),
6940 GEN_HANDLER_E(divdeuo, 0x1F, 0x09, 0x1C, 0, PPC_NONE, PPC2_DIVE_ISA206),
6941 GEN_HANDLER_E(divde, 0x1F, 0x09, 0x0D, 0, PPC_NONE, PPC2_DIVE_ISA206),
6942 GEN_HANDLER_E(divdeo, 0x1F, 0x09, 0x1D, 0, PPC_NONE, PPC2_DIVE_ISA206),
6943 GEN_HANDLER_E(modsd, 0x1F, 0x09, 0x18, 0x00000001, PPC_NONE, PPC2_ISA300),
6944 GEN_HANDLER_E(modud, 0x1F, 0x09, 0x08, 0x00000001, PPC_NONE, PPC2_ISA300),
6945 
6946 #undef GEN_INT_ARITH_MUL_HELPER
6947 #define GEN_INT_ARITH_MUL_HELPER(name, opc3)                                  \
6948 GEN_HANDLER(name, 0x1F, 0x09, opc3, 0x00000000, PPC_64B)
6949 GEN_INT_ARITH_MUL_HELPER(mulhdu, 0x00),
6950 GEN_INT_ARITH_MUL_HELPER(mulhd, 0x02),
6951 GEN_INT_ARITH_MUL_HELPER(mulldo, 0x17),
6952 #endif
6953 
6954 #undef GEN_INT_ARITH_SUBF
6955 #undef GEN_INT_ARITH_SUBF_CONST
6956 #define GEN_INT_ARITH_SUBF(name, opc3, add_ca, compute_ca, compute_ov)        \
6957 GEN_HANDLER(name, 0x1F, 0x08, opc3, 0x00000000, PPC_INTEGER),
6958 #define GEN_INT_ARITH_SUBF_CONST(name, opc3, const_val,                       \
6959                                 add_ca, compute_ca, compute_ov)               \
6960 GEN_HANDLER(name, 0x1F, 0x08, opc3, 0x0000F800, PPC_INTEGER),
6961 GEN_INT_ARITH_SUBF(subf, 0x01, 0, 0, 0)
6962 GEN_INT_ARITH_SUBF(subfo, 0x11, 0, 0, 1)
6963 GEN_INT_ARITH_SUBF(subfc, 0x00, 0, 1, 0)
6964 GEN_INT_ARITH_SUBF(subfco, 0x10, 0, 1, 1)
6965 GEN_INT_ARITH_SUBF(subfe, 0x04, 1, 1, 0)
6966 GEN_INT_ARITH_SUBF(subfeo, 0x14, 1, 1, 1)
6967 GEN_INT_ARITH_SUBF_CONST(subfme, 0x07, -1LL, 1, 1, 0)
6968 GEN_INT_ARITH_SUBF_CONST(subfmeo, 0x17, -1LL, 1, 1, 1)
6969 GEN_INT_ARITH_SUBF_CONST(subfze, 0x06, 0, 1, 1, 0)
6970 GEN_INT_ARITH_SUBF_CONST(subfzeo, 0x16, 0, 1, 1, 1)
6971 
6972 #undef GEN_LOGICAL1
6973 #undef GEN_LOGICAL2
6974 #define GEN_LOGICAL2(name, tcg_op, opc, type)                                 \
6975 GEN_HANDLER(name, 0x1F, 0x1C, opc, 0x00000000, type)
6976 #define GEN_LOGICAL1(name, tcg_op, opc, type)                                 \
6977 GEN_HANDLER(name, 0x1F, 0x1A, opc, 0x00000000, type)
6978 GEN_LOGICAL2(and, tcg_gen_and_tl, 0x00, PPC_INTEGER),
6979 GEN_LOGICAL2(andc, tcg_gen_andc_tl, 0x01, PPC_INTEGER),
6980 GEN_LOGICAL2(eqv, tcg_gen_eqv_tl, 0x08, PPC_INTEGER),
6981 GEN_LOGICAL1(extsb, tcg_gen_ext8s_tl, 0x1D, PPC_INTEGER),
6982 GEN_LOGICAL1(extsh, tcg_gen_ext16s_tl, 0x1C, PPC_INTEGER),
6983 GEN_LOGICAL2(nand, tcg_gen_nand_tl, 0x0E, PPC_INTEGER),
6984 GEN_LOGICAL2(nor, tcg_gen_nor_tl, 0x03, PPC_INTEGER),
6985 GEN_LOGICAL2(orc, tcg_gen_orc_tl, 0x0C, PPC_INTEGER),
6986 #if defined(TARGET_PPC64)
6987 GEN_LOGICAL1(extsw, tcg_gen_ext32s_tl, 0x1E, PPC_64B),
6988 #endif
6989 
6990 #if defined(TARGET_PPC64)
6991 #undef GEN_PPC64_R2
6992 #undef GEN_PPC64_R4
6993 #define GEN_PPC64_R2(name, opc1, opc2)                                        \
6994 GEN_HANDLER2(name##0, stringify(name), opc1, opc2, 0xFF, 0x00000000, PPC_64B),\
6995 GEN_HANDLER2(name##1, stringify(name), opc1, opc2 | 0x10, 0xFF, 0x00000000,   \
6996              PPC_64B)
6997 #define GEN_PPC64_R4(name, opc1, opc2)                                        \
6998 GEN_HANDLER2(name##0, stringify(name), opc1, opc2, 0xFF, 0x00000000, PPC_64B),\
6999 GEN_HANDLER2(name##1, stringify(name), opc1, opc2 | 0x01, 0xFF, 0x00000000,   \
7000              PPC_64B),                                                        \
7001 GEN_HANDLER2(name##2, stringify(name), opc1, opc2 | 0x10, 0xFF, 0x00000000,   \
7002              PPC_64B),                                                        \
7003 GEN_HANDLER2(name##3, stringify(name), opc1, opc2 | 0x11, 0xFF, 0x00000000,   \
7004              PPC_64B)
7005 GEN_PPC64_R4(rldicl, 0x1E, 0x00),
7006 GEN_PPC64_R4(rldicr, 0x1E, 0x02),
7007 GEN_PPC64_R4(rldic, 0x1E, 0x04),
7008 GEN_PPC64_R2(rldcl, 0x1E, 0x08),
7009 GEN_PPC64_R2(rldcr, 0x1E, 0x09),
7010 GEN_PPC64_R4(rldimi, 0x1E, 0x06),
7011 #endif
7012 
7013 #undef GEN_LDX_E
7014 #define GEN_LDX_E(name, ldop, opc2, opc3, type, type2, chk)                   \
7015 GEN_HANDLER_E(name##x, 0x1F, opc2, opc3, 0x00000001, type, type2),
7016 
7017 #if defined(TARGET_PPC64)
7018 GEN_LDX_E(ldbr, ld64ur_i64, 0x14, 0x10, PPC_NONE, PPC2_DBRX, CHK_NONE)
7019 
7020 /* HV/P7 and later only */
7021 GEN_LDX_HVRM(ldcix, ld64_i64, 0x15, 0x1b, PPC_CILDST)
7022 GEN_LDX_HVRM(lwzcix, ld32u, 0x15, 0x18, PPC_CILDST)
7023 GEN_LDX_HVRM(lhzcix, ld16u, 0x15, 0x19, PPC_CILDST)
7024 GEN_LDX_HVRM(lbzcix, ld8u, 0x15, 0x1a, PPC_CILDST)
7025 #endif
7026 GEN_LDX(lhbr, ld16ur, 0x16, 0x18, PPC_INTEGER)
7027 GEN_LDX(lwbr, ld32ur, 0x16, 0x10, PPC_INTEGER)
7028 
7029 /* External PID based load */
7030 #undef GEN_LDEPX
7031 #define GEN_LDEPX(name, ldop, opc2, opc3)                                     \
7032 GEN_HANDLER_E(name##epx, 0x1F, opc2, opc3,                                    \
7033               0x00000001, PPC_NONE, PPC2_BOOKE206),
7034 
7035 GEN_LDEPX(lb, DEF_MEMOP(MO_UB), 0x1F, 0x02)
7036 GEN_LDEPX(lh, DEF_MEMOP(MO_UW), 0x1F, 0x08)
7037 GEN_LDEPX(lw, DEF_MEMOP(MO_UL), 0x1F, 0x00)
7038 #if defined(TARGET_PPC64)
7039 GEN_LDEPX(ld, DEF_MEMOP(MO_UQ), 0x1D, 0x00)
7040 #endif
7041 
7042 #undef GEN_STX_E
7043 #define GEN_STX_E(name, stop, opc2, opc3, type, type2, chk)                   \
7044 GEN_HANDLER_E(name##x, 0x1F, opc2, opc3, 0x00000000, type, type2),
7045 
7046 #if defined(TARGET_PPC64)
7047 GEN_STX_E(stdbr, st64r_i64, 0x14, 0x14, PPC_NONE, PPC2_DBRX, CHK_NONE)
7048 GEN_STX_HVRM(stdcix, st64_i64, 0x15, 0x1f, PPC_CILDST)
7049 GEN_STX_HVRM(stwcix, st32, 0x15, 0x1c, PPC_CILDST)
7050 GEN_STX_HVRM(sthcix, st16, 0x15, 0x1d, PPC_CILDST)
7051 GEN_STX_HVRM(stbcix, st8, 0x15, 0x1e, PPC_CILDST)
7052 #endif
7053 GEN_STX(sthbr, st16r, 0x16, 0x1C, PPC_INTEGER)
7054 GEN_STX(stwbr, st32r, 0x16, 0x14, PPC_INTEGER)
7055 
7056 #undef GEN_STEPX
7057 #define GEN_STEPX(name, ldop, opc2, opc3)                                     \
7058 GEN_HANDLER_E(name##epx, 0x1F, opc2, opc3,                                    \
7059               0x00000001, PPC_NONE, PPC2_BOOKE206),
7060 
7061 GEN_STEPX(stb, DEF_MEMOP(MO_UB), 0x1F, 0x06)
7062 GEN_STEPX(sth, DEF_MEMOP(MO_UW), 0x1F, 0x0C)
7063 GEN_STEPX(stw, DEF_MEMOP(MO_UL), 0x1F, 0x04)
7064 #if defined(TARGET_PPC64)
7065 GEN_STEPX(std, DEF_MEMOP(MO_UQ), 0x1D, 0x04)
7066 #endif
7067 
7068 #undef GEN_CRLOGIC
7069 #define GEN_CRLOGIC(name, tcg_op, opc)                                        \
7070 GEN_HANDLER(name, 0x13, 0x01, opc, 0x00000001, PPC_INTEGER)
7071 GEN_CRLOGIC(crand, tcg_gen_and_i32, 0x08),
7072 GEN_CRLOGIC(crandc, tcg_gen_andc_i32, 0x04),
7073 GEN_CRLOGIC(creqv, tcg_gen_eqv_i32, 0x09),
7074 GEN_CRLOGIC(crnand, tcg_gen_nand_i32, 0x07),
7075 GEN_CRLOGIC(crnor, tcg_gen_nor_i32, 0x01),
7076 GEN_CRLOGIC(cror, tcg_gen_or_i32, 0x0E),
7077 GEN_CRLOGIC(crorc, tcg_gen_orc_i32, 0x0D),
7078 GEN_CRLOGIC(crxor, tcg_gen_xor_i32, 0x06),
7079 
7080 #undef GEN_MAC_HANDLER
7081 #define GEN_MAC_HANDLER(name, opc2, opc3)                                     \
7082 GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_405_MAC)
7083 GEN_MAC_HANDLER(macchw, 0x0C, 0x05),
7084 GEN_MAC_HANDLER(macchwo, 0x0C, 0x15),
7085 GEN_MAC_HANDLER(macchws, 0x0C, 0x07),
7086 GEN_MAC_HANDLER(macchwso, 0x0C, 0x17),
7087 GEN_MAC_HANDLER(macchwsu, 0x0C, 0x06),
7088 GEN_MAC_HANDLER(macchwsuo, 0x0C, 0x16),
7089 GEN_MAC_HANDLER(macchwu, 0x0C, 0x04),
7090 GEN_MAC_HANDLER(macchwuo, 0x0C, 0x14),
7091 GEN_MAC_HANDLER(machhw, 0x0C, 0x01),
7092 GEN_MAC_HANDLER(machhwo, 0x0C, 0x11),
7093 GEN_MAC_HANDLER(machhws, 0x0C, 0x03),
7094 GEN_MAC_HANDLER(machhwso, 0x0C, 0x13),
7095 GEN_MAC_HANDLER(machhwsu, 0x0C, 0x02),
7096 GEN_MAC_HANDLER(machhwsuo, 0x0C, 0x12),
7097 GEN_MAC_HANDLER(machhwu, 0x0C, 0x00),
7098 GEN_MAC_HANDLER(machhwuo, 0x0C, 0x10),
7099 GEN_MAC_HANDLER(maclhw, 0x0C, 0x0D),
7100 GEN_MAC_HANDLER(maclhwo, 0x0C, 0x1D),
7101 GEN_MAC_HANDLER(maclhws, 0x0C, 0x0F),
7102 GEN_MAC_HANDLER(maclhwso, 0x0C, 0x1F),
7103 GEN_MAC_HANDLER(maclhwu, 0x0C, 0x0C),
7104 GEN_MAC_HANDLER(maclhwuo, 0x0C, 0x1C),
7105 GEN_MAC_HANDLER(maclhwsu, 0x0C, 0x0E),
7106 GEN_MAC_HANDLER(maclhwsuo, 0x0C, 0x1E),
7107 GEN_MAC_HANDLER(nmacchw, 0x0E, 0x05),
7108 GEN_MAC_HANDLER(nmacchwo, 0x0E, 0x15),
7109 GEN_MAC_HANDLER(nmacchws, 0x0E, 0x07),
7110 GEN_MAC_HANDLER(nmacchwso, 0x0E, 0x17),
7111 GEN_MAC_HANDLER(nmachhw, 0x0E, 0x01),
7112 GEN_MAC_HANDLER(nmachhwo, 0x0E, 0x11),
7113 GEN_MAC_HANDLER(nmachhws, 0x0E, 0x03),
7114 GEN_MAC_HANDLER(nmachhwso, 0x0E, 0x13),
7115 GEN_MAC_HANDLER(nmaclhw, 0x0E, 0x0D),
7116 GEN_MAC_HANDLER(nmaclhwo, 0x0E, 0x1D),
7117 GEN_MAC_HANDLER(nmaclhws, 0x0E, 0x0F),
7118 GEN_MAC_HANDLER(nmaclhwso, 0x0E, 0x1F),
7119 GEN_MAC_HANDLER(mulchw, 0x08, 0x05),
7120 GEN_MAC_HANDLER(mulchwu, 0x08, 0x04),
7121 GEN_MAC_HANDLER(mulhhw, 0x08, 0x01),
7122 GEN_MAC_HANDLER(mulhhwu, 0x08, 0x00),
7123 GEN_MAC_HANDLER(mullhw, 0x08, 0x0D),
7124 GEN_MAC_HANDLER(mullhwu, 0x08, 0x0C),
7125 
7126 GEN_HANDLER2_E(tbegin, "tbegin", 0x1F, 0x0E, 0x14, 0x01DFF800, \
7127                PPC_NONE, PPC2_TM),
7128 GEN_HANDLER2_E(tend,   "tend",   0x1F, 0x0E, 0x15, 0x01FFF800, \
7129                PPC_NONE, PPC2_TM),
7130 GEN_HANDLER2_E(tabort, "tabort", 0x1F, 0x0E, 0x1C, 0x03E0F800, \
7131                PPC_NONE, PPC2_TM),
7132 GEN_HANDLER2_E(tabortwc, "tabortwc", 0x1F, 0x0E, 0x18, 0x00000000, \
7133                PPC_NONE, PPC2_TM),
7134 GEN_HANDLER2_E(tabortwci, "tabortwci", 0x1F, 0x0E, 0x1A, 0x00000000, \
7135                PPC_NONE, PPC2_TM),
7136 GEN_HANDLER2_E(tabortdc, "tabortdc", 0x1F, 0x0E, 0x19, 0x00000000, \
7137                PPC_NONE, PPC2_TM),
7138 GEN_HANDLER2_E(tabortdci, "tabortdci", 0x1F, 0x0E, 0x1B, 0x00000000, \
7139                PPC_NONE, PPC2_TM),
7140 GEN_HANDLER2_E(tsr, "tsr", 0x1F, 0x0E, 0x17, 0x03DFF800, \
7141                PPC_NONE, PPC2_TM),
7142 GEN_HANDLER2_E(tcheck, "tcheck", 0x1F, 0x0E, 0x16, 0x007FF800, \
7143                PPC_NONE, PPC2_TM),
7144 GEN_HANDLER2_E(treclaim, "treclaim", 0x1F, 0x0E, 0x1D, 0x03E0F800, \
7145                PPC_NONE, PPC2_TM),
7146 GEN_HANDLER2_E(trechkpt, "trechkpt", 0x1F, 0x0E, 0x1F, 0x03FFF800, \
7147                PPC_NONE, PPC2_TM),
7148 
7149 #include "translate/fp-ops.c.inc"
7150 
7151 #include "translate/vmx-ops.c.inc"
7152 
7153 #include "translate/vsx-ops.c.inc"
7154 
7155 #include "translate/spe-ops.c.inc"
7156 };
7157 
7158 /*****************************************************************************/
7159 /* Opcode types */
7160 enum {
7161     PPC_DIRECT   = 0, /* Opcode routine        */
7162     PPC_INDIRECT = 1, /* Indirect opcode table */
7163 };
7164 
7165 #define PPC_OPCODE_MASK 0x3
7166 
7167 static inline int is_indirect_opcode(void *handler)
7168 {
7169     return ((uintptr_t)handler & PPC_OPCODE_MASK) == PPC_INDIRECT;
7170 }
7171 
7172 static inline opc_handler_t **ind_table(void *handler)
7173 {
7174     return (opc_handler_t **)((uintptr_t)handler & ~PPC_OPCODE_MASK);
7175 }
7176 
7177 /* Instruction table creation */
7178 /* Opcodes tables creation */
7179 static void fill_new_table(opc_handler_t **table, int len)
7180 {
7181     int i;
7182 
7183     for (i = 0; i < len; i++) {
7184         table[i] = &invalid_handler;
7185     }
7186 }
7187 
7188 static int create_new_table(opc_handler_t **table, unsigned char idx)
7189 {
7190     opc_handler_t **tmp;
7191 
7192     tmp = g_new(opc_handler_t *, PPC_CPU_INDIRECT_OPCODES_LEN);
7193     fill_new_table(tmp, PPC_CPU_INDIRECT_OPCODES_LEN);
7194     table[idx] = (opc_handler_t *)((uintptr_t)tmp | PPC_INDIRECT);
7195 
7196     return 0;
7197 }
7198 
7199 static int insert_in_table(opc_handler_t **table, unsigned char idx,
7200                             opc_handler_t *handler)
7201 {
7202     if (table[idx] != &invalid_handler) {
7203         return -1;
7204     }
7205     table[idx] = handler;
7206 
7207     return 0;
7208 }
7209 
7210 static int register_direct_insn(opc_handler_t **ppc_opcodes,
7211                                 unsigned char idx, opc_handler_t *handler)
7212 {
7213     if (insert_in_table(ppc_opcodes, idx, handler) < 0) {
7214         printf("*** ERROR: opcode %02x already assigned in main "
7215                "opcode table\n", idx);
7216         return -1;
7217     }
7218 
7219     return 0;
7220 }
7221 
7222 static int register_ind_in_table(opc_handler_t **table,
7223                                  unsigned char idx1, unsigned char idx2,
7224                                  opc_handler_t *handler)
7225 {
7226     if (table[idx1] == &invalid_handler) {
7227         if (create_new_table(table, idx1) < 0) {
7228             printf("*** ERROR: unable to create indirect table "
7229                    "idx=%02x\n", idx1);
7230             return -1;
7231         }
7232     } else {
7233         if (!is_indirect_opcode(table[idx1])) {
7234             printf("*** ERROR: idx %02x already assigned to a direct "
7235                    "opcode\n", idx1);
7236             return -1;
7237         }
7238     }
7239     if (handler != NULL &&
7240         insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) {
7241         printf("*** ERROR: opcode %02x already assigned in "
7242                "opcode table %02x\n", idx2, idx1);
7243         return -1;
7244     }
7245 
7246     return 0;
7247 }
7248 
7249 static int register_ind_insn(opc_handler_t **ppc_opcodes,
7250                              unsigned char idx1, unsigned char idx2,
7251                              opc_handler_t *handler)
7252 {
7253     return register_ind_in_table(ppc_opcodes, idx1, idx2, handler);
7254 }
7255 
7256 static int register_dblind_insn(opc_handler_t **ppc_opcodes,
7257                                 unsigned char idx1, unsigned char idx2,
7258                                 unsigned char idx3, opc_handler_t *handler)
7259 {
7260     if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
7261         printf("*** ERROR: unable to join indirect table idx "
7262                "[%02x-%02x]\n", idx1, idx2);
7263         return -1;
7264     }
7265     if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3,
7266                               handler) < 0) {
7267         printf("*** ERROR: unable to insert opcode "
7268                "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
7269         return -1;
7270     }
7271 
7272     return 0;
7273 }
7274 
7275 static int register_trplind_insn(opc_handler_t **ppc_opcodes,
7276                                  unsigned char idx1, unsigned char idx2,
7277                                  unsigned char idx3, unsigned char idx4,
7278                                  opc_handler_t *handler)
7279 {
7280     opc_handler_t **table;
7281 
7282     if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
7283         printf("*** ERROR: unable to join indirect table idx "
7284                "[%02x-%02x]\n", idx1, idx2);
7285         return -1;
7286     }
7287     table = ind_table(ppc_opcodes[idx1]);
7288     if (register_ind_in_table(table, idx2, idx3, NULL) < 0) {
7289         printf("*** ERROR: unable to join 2nd-level indirect table idx "
7290                "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
7291         return -1;
7292     }
7293     table = ind_table(table[idx2]);
7294     if (register_ind_in_table(table, idx3, idx4, handler) < 0) {
7295         printf("*** ERROR: unable to insert opcode "
7296                "[%02x-%02x-%02x-%02x]\n", idx1, idx2, idx3, idx4);
7297         return -1;
7298     }
7299     return 0;
7300 }
7301 static int register_insn(opc_handler_t **ppc_opcodes, opcode_t *insn)
7302 {
7303     if (insn->opc2 != 0xFF) {
7304         if (insn->opc3 != 0xFF) {
7305             if (insn->opc4 != 0xFF) {
7306                 if (register_trplind_insn(ppc_opcodes, insn->opc1, insn->opc2,
7307                                           insn->opc3, insn->opc4,
7308                                           &insn->handler) < 0) {
7309                     return -1;
7310                 }
7311             } else {
7312                 if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2,
7313                                          insn->opc3, &insn->handler) < 0) {
7314                     return -1;
7315                 }
7316             }
7317         } else {
7318             if (register_ind_insn(ppc_opcodes, insn->opc1,
7319                                   insn->opc2, &insn->handler) < 0) {
7320                 return -1;
7321             }
7322         }
7323     } else {
7324         if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0) {
7325             return -1;
7326         }
7327     }
7328 
7329     return 0;
7330 }
7331 
7332 static int test_opcode_table(opc_handler_t **table, int len)
7333 {
7334     int i, count, tmp;
7335 
7336     for (i = 0, count = 0; i < len; i++) {
7337         /* Consistency fixup */
7338         if (table[i] == NULL) {
7339             table[i] = &invalid_handler;
7340         }
7341         if (table[i] != &invalid_handler) {
7342             if (is_indirect_opcode(table[i])) {
7343                 tmp = test_opcode_table(ind_table(table[i]),
7344                     PPC_CPU_INDIRECT_OPCODES_LEN);
7345                 if (tmp == 0) {
7346                     free(table[i]);
7347                     table[i] = &invalid_handler;
7348                 } else {
7349                     count++;
7350                 }
7351             } else {
7352                 count++;
7353             }
7354         }
7355     }
7356 
7357     return count;
7358 }
7359 
7360 static void fix_opcode_tables(opc_handler_t **ppc_opcodes)
7361 {
7362     if (test_opcode_table(ppc_opcodes, PPC_CPU_OPCODES_LEN) == 0) {
7363         printf("*** WARNING: no opcode defined !\n");
7364     }
7365 }
7366 
7367 /*****************************************************************************/
7368 void create_ppc_opcodes(PowerPCCPU *cpu, Error **errp)
7369 {
7370     PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
7371     opcode_t *opc;
7372 
7373     fill_new_table(cpu->opcodes, PPC_CPU_OPCODES_LEN);
7374     for (opc = opcodes; opc < &opcodes[ARRAY_SIZE(opcodes)]; opc++) {
7375         if (((opc->handler.type & pcc->insns_flags) != 0) ||
7376             ((opc->handler.type2 & pcc->insns_flags2) != 0)) {
7377             if (register_insn(cpu->opcodes, opc) < 0) {
7378                 error_setg(errp, "ERROR initializing PowerPC instruction "
7379                            "0x%02x 0x%02x 0x%02x", opc->opc1, opc->opc2,
7380                            opc->opc3);
7381                 return;
7382             }
7383         }
7384     }
7385     fix_opcode_tables(cpu->opcodes);
7386     fflush(stdout);
7387     fflush(stderr);
7388 }
7389 
7390 void destroy_ppc_opcodes(PowerPCCPU *cpu)
7391 {
7392     opc_handler_t **table, **table_2;
7393     int i, j, k;
7394 
7395     for (i = 0; i < PPC_CPU_OPCODES_LEN; i++) {
7396         if (cpu->opcodes[i] == &invalid_handler) {
7397             continue;
7398         }
7399         if (is_indirect_opcode(cpu->opcodes[i])) {
7400             table = ind_table(cpu->opcodes[i]);
7401             for (j = 0; j < PPC_CPU_INDIRECT_OPCODES_LEN; j++) {
7402                 if (table[j] == &invalid_handler) {
7403                     continue;
7404                 }
7405                 if (is_indirect_opcode(table[j])) {
7406                     table_2 = ind_table(table[j]);
7407                     for (k = 0; k < PPC_CPU_INDIRECT_OPCODES_LEN; k++) {
7408                         if (table_2[k] != &invalid_handler &&
7409                             is_indirect_opcode(table_2[k])) {
7410                             g_free((opc_handler_t *)((uintptr_t)table_2[k] &
7411                                                      ~PPC_INDIRECT));
7412                         }
7413                     }
7414                     g_free((opc_handler_t *)((uintptr_t)table[j] &
7415                                              ~PPC_INDIRECT));
7416                 }
7417             }
7418             g_free((opc_handler_t *)((uintptr_t)cpu->opcodes[i] &
7419                 ~PPC_INDIRECT));
7420         }
7421     }
7422 }
7423 
7424 int ppc_fixup_cpu(PowerPCCPU *cpu)
7425 {
7426     CPUPPCState *env = &cpu->env;
7427 
7428     /*
7429      * TCG doesn't (yet) emulate some groups of instructions that are
7430      * implemented on some otherwise supported CPUs (e.g. VSX and
7431      * decimal floating point instructions on POWER7).  We remove
7432      * unsupported instruction groups from the cpu state's instruction
7433      * masks and hope the guest can cope.  For at least the pseries
7434      * machine, the unavailability of these instructions can be
7435      * advertised to the guest via the device tree.
7436      */
7437     if ((env->insns_flags & ~PPC_TCG_INSNS)
7438         || (env->insns_flags2 & ~PPC_TCG_INSNS2)) {
7439         warn_report("Disabling some instructions which are not "
7440                     "emulated by TCG (0x%" PRIx64 ", 0x%" PRIx64 ")",
7441                     env->insns_flags & ~PPC_TCG_INSNS,
7442                     env->insns_flags2 & ~PPC_TCG_INSNS2);
7443     }
7444     env->insns_flags &= PPC_TCG_INSNS;
7445     env->insns_flags2 &= PPC_TCG_INSNS2;
7446     return 0;
7447 }
7448 
7449 static bool decode_legacy(PowerPCCPU *cpu, DisasContext *ctx, uint32_t insn)
7450 {
7451     opc_handler_t **table, *handler;
7452     uint32_t inval;
7453 
7454     ctx->opcode = insn;
7455 
7456     LOG_DISAS("translate opcode %08x (%02x %02x %02x %02x) (%s)\n",
7457               insn, opc1(insn), opc2(insn), opc3(insn), opc4(insn),
7458               ctx->le_mode ? "little" : "big");
7459 
7460     table = cpu->opcodes;
7461     handler = table[opc1(insn)];
7462     if (is_indirect_opcode(handler)) {
7463         table = ind_table(handler);
7464         handler = table[opc2(insn)];
7465         if (is_indirect_opcode(handler)) {
7466             table = ind_table(handler);
7467             handler = table[opc3(insn)];
7468             if (is_indirect_opcode(handler)) {
7469                 table = ind_table(handler);
7470                 handler = table[opc4(insn)];
7471             }
7472         }
7473     }
7474 
7475     /* Is opcode *REALLY* valid ? */
7476     if (unlikely(handler->handler == &gen_invalid)) {
7477         qemu_log_mask(LOG_GUEST_ERROR, "invalid/unsupported opcode: "
7478                       "%02x - %02x - %02x - %02x (%08x) "
7479                       TARGET_FMT_lx "\n",
7480                       opc1(insn), opc2(insn), opc3(insn), opc4(insn),
7481                       insn, ctx->cia);
7482         return false;
7483     }
7484 
7485     if (unlikely(handler->type & (PPC_SPE | PPC_SPE_SINGLE | PPC_SPE_DOUBLE)
7486                  && Rc(insn))) {
7487         inval = handler->inval2;
7488     } else {
7489         inval = handler->inval1;
7490     }
7491 
7492     if (unlikely((insn & inval) != 0)) {
7493         qemu_log_mask(LOG_GUEST_ERROR, "invalid bits: %08x for opcode: "
7494                       "%02x - %02x - %02x - %02x (%08x) "
7495                       TARGET_FMT_lx "\n", insn & inval,
7496                       opc1(insn), opc2(insn), opc3(insn), opc4(insn),
7497                       insn, ctx->cia);
7498         return false;
7499     }
7500 
7501     handler->handler(ctx);
7502     return true;
7503 }
7504 
7505 static void ppc_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
7506 {
7507     DisasContext *ctx = container_of(dcbase, DisasContext, base);
7508     CPUPPCState *env = cs->env_ptr;
7509     uint32_t hflags = ctx->base.tb->flags;
7510 
7511     ctx->spr_cb = env->spr_cb;
7512     ctx->pr = (hflags >> HFLAGS_PR) & 1;
7513     ctx->mem_idx = (hflags >> HFLAGS_DMMU_IDX) & 7;
7514     ctx->dr = (hflags >> HFLAGS_DR) & 1;
7515     ctx->hv = (hflags >> HFLAGS_HV) & 1;
7516     ctx->insns_flags = env->insns_flags;
7517     ctx->insns_flags2 = env->insns_flags2;
7518     ctx->access_type = -1;
7519     ctx->need_access_type = !mmu_is_64bit(env->mmu_model);
7520     ctx->le_mode = (hflags >> HFLAGS_LE) & 1;
7521     ctx->default_tcg_memop_mask = ctx->le_mode ? MO_LE : MO_BE;
7522     ctx->flags = env->flags;
7523 #if defined(TARGET_PPC64)
7524     ctx->sf_mode = (hflags >> HFLAGS_64) & 1;
7525     ctx->has_cfar = !!(env->flags & POWERPC_FLAG_CFAR);
7526 #endif
7527     ctx->lazy_tlb_flush = env->mmu_model == POWERPC_MMU_32B
7528         || env->mmu_model & POWERPC_MMU_64;
7529 
7530     ctx->fpu_enabled = (hflags >> HFLAGS_FP) & 1;
7531     ctx->spe_enabled = (hflags >> HFLAGS_SPE) & 1;
7532     ctx->altivec_enabled = (hflags >> HFLAGS_VR) & 1;
7533     ctx->vsx_enabled = (hflags >> HFLAGS_VSX) & 1;
7534     ctx->tm_enabled = (hflags >> HFLAGS_TM) & 1;
7535     ctx->gtse = (hflags >> HFLAGS_GTSE) & 1;
7536     ctx->hr = (hflags >> HFLAGS_HR) & 1;
7537     ctx->mmcr0_pmcc0 = (hflags >> HFLAGS_PMCC0) & 1;
7538     ctx->mmcr0_pmcc1 = (hflags >> HFLAGS_PMCC1) & 1;
7539     ctx->mmcr0_pmcjce = (hflags >> HFLAGS_PMCJCE) & 1;
7540     ctx->pmc_other = (hflags >> HFLAGS_PMC_OTHER) & 1;
7541     ctx->pmu_insn_cnt = (hflags >> HFLAGS_INSN_CNT) & 1;
7542 
7543     ctx->singlestep_enabled = 0;
7544     if ((hflags >> HFLAGS_SE) & 1) {
7545         ctx->singlestep_enabled |= CPU_SINGLE_STEP;
7546         ctx->base.max_insns = 1;
7547     }
7548     if ((hflags >> HFLAGS_BE) & 1) {
7549         ctx->singlestep_enabled |= CPU_BRANCH_STEP;
7550     }
7551 }
7552 
7553 static void ppc_tr_tb_start(DisasContextBase *db, CPUState *cs)
7554 {
7555 }
7556 
7557 static void ppc_tr_insn_start(DisasContextBase *dcbase, CPUState *cs)
7558 {
7559     tcg_gen_insn_start(dcbase->pc_next);
7560 }
7561 
7562 static bool is_prefix_insn(DisasContext *ctx, uint32_t insn)
7563 {
7564     REQUIRE_INSNS_FLAGS2(ctx, ISA310);
7565     return opc1(insn) == 1;
7566 }
7567 
7568 static void ppc_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
7569 {
7570     DisasContext *ctx = container_of(dcbase, DisasContext, base);
7571     PowerPCCPU *cpu = POWERPC_CPU(cs);
7572     CPUPPCState *env = cs->env_ptr;
7573     target_ulong pc;
7574     uint32_t insn;
7575     bool ok;
7576 
7577     LOG_DISAS("----------------\n");
7578     LOG_DISAS("nip=" TARGET_FMT_lx " super=%d ir=%d\n",
7579               ctx->base.pc_next, ctx->mem_idx, (int)msr_ir);
7580 
7581     ctx->cia = pc = ctx->base.pc_next;
7582     insn = translator_ldl_swap(env, dcbase, pc, need_byteswap(ctx));
7583     ctx->base.pc_next = pc += 4;
7584 
7585     if (!is_prefix_insn(ctx, insn)) {
7586         ok = (decode_insn32(ctx, insn) ||
7587               decode_legacy(cpu, ctx, insn));
7588     } else if ((pc & 63) == 0) {
7589         /*
7590          * Power v3.1, section 1.9 Exceptions:
7591          * attempt to execute a prefixed instruction that crosses a
7592          * 64-byte address boundary (system alignment error).
7593          */
7594         gen_exception_err(ctx, POWERPC_EXCP_ALIGN, POWERPC_EXCP_ALIGN_INSN);
7595         ok = true;
7596     } else {
7597         uint32_t insn2 = translator_ldl_swap(env, dcbase, pc,
7598                                              need_byteswap(ctx));
7599         ctx->base.pc_next = pc += 4;
7600         ok = decode_insn64(ctx, deposit64(insn2, 32, 32, insn));
7601     }
7602     if (!ok) {
7603         gen_invalid(ctx);
7604     }
7605 
7606     /* End the TB when crossing a page boundary. */
7607     if (ctx->base.is_jmp == DISAS_NEXT && !(pc & ~TARGET_PAGE_MASK)) {
7608         ctx->base.is_jmp = DISAS_TOO_MANY;
7609     }
7610 
7611     translator_loop_temp_check(&ctx->base);
7612 }
7613 
7614 static void ppc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
7615 {
7616     DisasContext *ctx = container_of(dcbase, DisasContext, base);
7617     DisasJumpType is_jmp = ctx->base.is_jmp;
7618     target_ulong nip = ctx->base.pc_next;
7619 
7620     if (is_jmp == DISAS_NORETURN) {
7621         /* We have already exited the TB. */
7622         return;
7623     }
7624 
7625     /* Honor single stepping. */
7626     if (unlikely(ctx->singlestep_enabled & CPU_SINGLE_STEP)
7627         && (nip <= 0x100 || nip > 0xf00)) {
7628         switch (is_jmp) {
7629         case DISAS_TOO_MANY:
7630         case DISAS_EXIT_UPDATE:
7631         case DISAS_CHAIN_UPDATE:
7632             gen_update_nip(ctx, nip);
7633             break;
7634         case DISAS_EXIT:
7635         case DISAS_CHAIN:
7636             break;
7637         default:
7638             g_assert_not_reached();
7639         }
7640 
7641         gen_debug_exception(ctx);
7642         return;
7643     }
7644 
7645     switch (is_jmp) {
7646     case DISAS_TOO_MANY:
7647         if (use_goto_tb(ctx, nip)) {
7648             pmu_count_insns(ctx);
7649             tcg_gen_goto_tb(0);
7650             gen_update_nip(ctx, nip);
7651             tcg_gen_exit_tb(ctx->base.tb, 0);
7652             break;
7653         }
7654         /* fall through */
7655     case DISAS_CHAIN_UPDATE:
7656         gen_update_nip(ctx, nip);
7657         /* fall through */
7658     case DISAS_CHAIN:
7659         /*
7660          * tcg_gen_lookup_and_goto_ptr will exit the TB if
7661          * CF_NO_GOTO_PTR is set. Count insns now.
7662          */
7663         if (ctx->base.tb->flags & CF_NO_GOTO_PTR) {
7664             pmu_count_insns(ctx);
7665         }
7666 
7667         tcg_gen_lookup_and_goto_ptr();
7668         break;
7669 
7670     case DISAS_EXIT_UPDATE:
7671         gen_update_nip(ctx, nip);
7672         /* fall through */
7673     case DISAS_EXIT:
7674         pmu_count_insns(ctx);
7675         tcg_gen_exit_tb(NULL, 0);
7676         break;
7677 
7678     default:
7679         g_assert_not_reached();
7680     }
7681 }
7682 
7683 static void ppc_tr_disas_log(const DisasContextBase *dcbase,
7684                              CPUState *cs, FILE *logfile)
7685 {
7686     fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
7687     target_disas(logfile, cs, dcbase->pc_first, dcbase->tb->size);
7688 }
7689 
7690 static const TranslatorOps ppc_tr_ops = {
7691     .init_disas_context = ppc_tr_init_disas_context,
7692     .tb_start           = ppc_tr_tb_start,
7693     .insn_start         = ppc_tr_insn_start,
7694     .translate_insn     = ppc_tr_translate_insn,
7695     .tb_stop            = ppc_tr_tb_stop,
7696     .disas_log          = ppc_tr_disas_log,
7697 };
7698 
7699 void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns,
7700                            target_ulong pc, void *host_pc)
7701 {
7702     DisasContext ctx;
7703 
7704     translator_loop(cs, tb, max_insns, pc, host_pc, &ppc_tr_ops, &ctx.base);
7705 }
7706