]> Git Repo - qemu.git/blob - target/arm/translate.c
target/arm: Simplify UMAAL
[qemu.git] / target / arm / translate.c
1 /*
2  *  ARM translation
3  *
4  *  Copyright (c) 2003 Fabrice Bellard
5  *  Copyright (c) 2005-2007 CodeSourcery
6  *  Copyright (c) 2007 OpenedHand, Ltd.
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
20  */
21 #include "qemu/osdep.h"
22
23 #include "cpu.h"
24 #include "internals.h"
25 #include "disas/disas.h"
26 #include "exec/exec-all.h"
27 #include "tcg-op.h"
28 #include "tcg-op-gvec.h"
29 #include "qemu/log.h"
30 #include "qemu/bitops.h"
31 #include "arm_ldst.h"
32 #include "hw/semihosting/semihost.h"
33
34 #include "exec/helper-proto.h"
35 #include "exec/helper-gen.h"
36
37 #include "trace-tcg.h"
38 #include "exec/log.h"
39
40
41 #define ENABLE_ARCH_4T    arm_dc_feature(s, ARM_FEATURE_V4T)
42 #define ENABLE_ARCH_5     arm_dc_feature(s, ARM_FEATURE_V5)
43 /* currently all emulated v5 cores are also v5TE, so don't bother */
44 #define ENABLE_ARCH_5TE   arm_dc_feature(s, ARM_FEATURE_V5)
45 #define ENABLE_ARCH_5J    dc_isar_feature(jazelle, s)
46 #define ENABLE_ARCH_6     arm_dc_feature(s, ARM_FEATURE_V6)
47 #define ENABLE_ARCH_6K    arm_dc_feature(s, ARM_FEATURE_V6K)
48 #define ENABLE_ARCH_6T2   arm_dc_feature(s, ARM_FEATURE_THUMB2)
49 #define ENABLE_ARCH_7     arm_dc_feature(s, ARM_FEATURE_V7)
50 #define ENABLE_ARCH_8     arm_dc_feature(s, ARM_FEATURE_V8)
51
52 #define ARCH(x) do { if (!ENABLE_ARCH_##x) goto illegal_op; } while(0)
53
54 #include "translate.h"
55
56 #if defined(CONFIG_USER_ONLY)
57 #define IS_USER(s) 1
58 #else
59 #define IS_USER(s) (s->user)
60 #endif
61
62 /* We reuse the same 64-bit temporaries for efficiency.  */
63 static TCGv_i64 cpu_V0, cpu_V1, cpu_M0;
64 static TCGv_i32 cpu_R[16];
65 TCGv_i32 cpu_CF, cpu_NF, cpu_VF, cpu_ZF;
66 TCGv_i64 cpu_exclusive_addr;
67 TCGv_i64 cpu_exclusive_val;
68
69 #include "exec/gen-icount.h"
70
71 static const char * const regnames[] =
72     { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
73       "r8", "r9", "r10", "r11", "r12", "r13", "r14", "pc" };
74
75 /* Function prototypes for gen_ functions calling Neon helpers.  */
76 typedef void NeonGenThreeOpEnvFn(TCGv_i32, TCGv_env, TCGv_i32,
77                                  TCGv_i32, TCGv_i32);
78 /* Function prototypes for gen_ functions for fix point conversions */
79 typedef void VFPGenFixPointFn(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_ptr);
80
81 /* initialize TCG globals.  */
82 void arm_translate_init(void)
83 {
84     int i;
85
86     for (i = 0; i < 16; i++) {
87         cpu_R[i] = tcg_global_mem_new_i32(cpu_env,
88                                           offsetof(CPUARMState, regs[i]),
89                                           regnames[i]);
90     }
91     cpu_CF = tcg_global_mem_new_i32(cpu_env, offsetof(CPUARMState, CF), "CF");
92     cpu_NF = tcg_global_mem_new_i32(cpu_env, offsetof(CPUARMState, NF), "NF");
93     cpu_VF = tcg_global_mem_new_i32(cpu_env, offsetof(CPUARMState, VF), "VF");
94     cpu_ZF = tcg_global_mem_new_i32(cpu_env, offsetof(CPUARMState, ZF), "ZF");
95
96     cpu_exclusive_addr = tcg_global_mem_new_i64(cpu_env,
97         offsetof(CPUARMState, exclusive_addr), "exclusive_addr");
98     cpu_exclusive_val = tcg_global_mem_new_i64(cpu_env,
99         offsetof(CPUARMState, exclusive_val), "exclusive_val");
100
101     a64_translate_init();
102 }
103
104 /* Flags for the disas_set_da_iss info argument:
105  * lower bits hold the Rt register number, higher bits are flags.
106  */
107 typedef enum ISSInfo {
108     ISSNone = 0,
109     ISSRegMask = 0x1f,
110     ISSInvalid = (1 << 5),
111     ISSIsAcqRel = (1 << 6),
112     ISSIsWrite = (1 << 7),
113     ISSIs16Bit = (1 << 8),
114 } ISSInfo;
115
116 /* Save the syndrome information for a Data Abort */
117 static void disas_set_da_iss(DisasContext *s, MemOp memop, ISSInfo issinfo)
118 {
119     uint32_t syn;
120     int sas = memop & MO_SIZE;
121     bool sse = memop & MO_SIGN;
122     bool is_acqrel = issinfo & ISSIsAcqRel;
123     bool is_write = issinfo & ISSIsWrite;
124     bool is_16bit = issinfo & ISSIs16Bit;
125     int srt = issinfo & ISSRegMask;
126
127     if (issinfo & ISSInvalid) {
128         /* Some callsites want to conditionally provide ISS info,
129          * eg "only if this was not a writeback"
130          */
131         return;
132     }
133
134     if (srt == 15) {
135         /* For AArch32, insns where the src/dest is R15 never generate
136          * ISS information. Catching that here saves checking at all
137          * the call sites.
138          */
139         return;
140     }
141
142     syn = syn_data_abort_with_iss(0, sas, sse, srt, 0, is_acqrel,
143                                   0, 0, 0, is_write, 0, is_16bit);
144     disas_set_insn_syndrome(s, syn);
145 }
146
147 static inline int get_a32_user_mem_index(DisasContext *s)
148 {
149     /* Return the core mmu_idx to use for A32/T32 "unprivileged load/store"
150      * insns:
151      *  if PL2, UNPREDICTABLE (we choose to implement as if PL0)
152      *  otherwise, access as if at PL0.
153      */
154     switch (s->mmu_idx) {
155     case ARMMMUIdx_S1E2:        /* this one is UNPREDICTABLE */
156     case ARMMMUIdx_S12NSE0:
157     case ARMMMUIdx_S12NSE1:
158         return arm_to_core_mmu_idx(ARMMMUIdx_S12NSE0);
159     case ARMMMUIdx_S1E3:
160     case ARMMMUIdx_S1SE0:
161     case ARMMMUIdx_S1SE1:
162         return arm_to_core_mmu_idx(ARMMMUIdx_S1SE0);
163     case ARMMMUIdx_MUser:
164     case ARMMMUIdx_MPriv:
165         return arm_to_core_mmu_idx(ARMMMUIdx_MUser);
166     case ARMMMUIdx_MUserNegPri:
167     case ARMMMUIdx_MPrivNegPri:
168         return arm_to_core_mmu_idx(ARMMMUIdx_MUserNegPri);
169     case ARMMMUIdx_MSUser:
170     case ARMMMUIdx_MSPriv:
171         return arm_to_core_mmu_idx(ARMMMUIdx_MSUser);
172     case ARMMMUIdx_MSUserNegPri:
173     case ARMMMUIdx_MSPrivNegPri:
174         return arm_to_core_mmu_idx(ARMMMUIdx_MSUserNegPri);
175     case ARMMMUIdx_S2NS:
176     default:
177         g_assert_not_reached();
178     }
179 }
180
181 static inline TCGv_i32 load_cpu_offset(int offset)
182 {
183     TCGv_i32 tmp = tcg_temp_new_i32();
184     tcg_gen_ld_i32(tmp, cpu_env, offset);
185     return tmp;
186 }
187
188 #define load_cpu_field(name) load_cpu_offset(offsetof(CPUARMState, name))
189
190 static inline void store_cpu_offset(TCGv_i32 var, int offset)
191 {
192     tcg_gen_st_i32(var, cpu_env, offset);
193     tcg_temp_free_i32(var);
194 }
195
196 #define store_cpu_field(var, name) \
197     store_cpu_offset(var, offsetof(CPUARMState, name))
198
199 /* The architectural value of PC.  */
200 static uint32_t read_pc(DisasContext *s)
201 {
202     return s->pc_curr + (s->thumb ? 4 : 8);
203 }
204
205 /* Set a variable to the value of a CPU register.  */
206 static void load_reg_var(DisasContext *s, TCGv_i32 var, int reg)
207 {
208     if (reg == 15) {
209         tcg_gen_movi_i32(var, read_pc(s));
210     } else {
211         tcg_gen_mov_i32(var, cpu_R[reg]);
212     }
213 }
214
215 /* Create a new temporary and set it to the value of a CPU register.  */
216 static inline TCGv_i32 load_reg(DisasContext *s, int reg)
217 {
218     TCGv_i32 tmp = tcg_temp_new_i32();
219     load_reg_var(s, tmp, reg);
220     return tmp;
221 }
222
223 /*
224  * Create a new temp, REG + OFS, except PC is ALIGN(PC, 4).
225  * This is used for load/store for which use of PC implies (literal),
226  * or ADD that implies ADR.
227  */
228 static TCGv_i32 add_reg_for_lit(DisasContext *s, int reg, int ofs)
229 {
230     TCGv_i32 tmp = tcg_temp_new_i32();
231
232     if (reg == 15) {
233         tcg_gen_movi_i32(tmp, (read_pc(s) & ~3) + ofs);
234     } else {
235         tcg_gen_addi_i32(tmp, cpu_R[reg], ofs);
236     }
237     return tmp;
238 }
239
240 /* Set a CPU register.  The source must be a temporary and will be
241    marked as dead.  */
242 static void store_reg(DisasContext *s, int reg, TCGv_i32 var)
243 {
244     if (reg == 15) {
245         /* In Thumb mode, we must ignore bit 0.
246          * In ARM mode, for ARMv4 and ARMv5, it is UNPREDICTABLE if bits [1:0]
247          * are not 0b00, but for ARMv6 and above, we must ignore bits [1:0].
248          * We choose to ignore [1:0] in ARM mode for all architecture versions.
249          */
250         tcg_gen_andi_i32(var, var, s->thumb ? ~1 : ~3);
251         s->base.is_jmp = DISAS_JUMP;
252     }
253     tcg_gen_mov_i32(cpu_R[reg], var);
254     tcg_temp_free_i32(var);
255 }
256
257 /*
258  * Variant of store_reg which applies v8M stack-limit checks before updating
259  * SP. If the check fails this will result in an exception being taken.
260  * We disable the stack checks for CONFIG_USER_ONLY because we have
261  * no idea what the stack limits should be in that case.
262  * If stack checking is not being done this just acts like store_reg().
263  */
264 static void store_sp_checked(DisasContext *s, TCGv_i32 var)
265 {
266 #ifndef CONFIG_USER_ONLY
267     if (s->v8m_stackcheck) {
268         gen_helper_v8m_stackcheck(cpu_env, var);
269     }
270 #endif
271     store_reg(s, 13, var);
272 }
273
274 /* Value extensions.  */
275 #define gen_uxtb(var) tcg_gen_ext8u_i32(var, var)
276 #define gen_uxth(var) tcg_gen_ext16u_i32(var, var)
277 #define gen_sxtb(var) tcg_gen_ext8s_i32(var, var)
278 #define gen_sxth(var) tcg_gen_ext16s_i32(var, var)
279
280 #define gen_sxtb16(var) gen_helper_sxtb16(var, var)
281 #define gen_uxtb16(var) gen_helper_uxtb16(var, var)
282
283
284 static inline void gen_set_cpsr(TCGv_i32 var, uint32_t mask)
285 {
286     TCGv_i32 tmp_mask = tcg_const_i32(mask);
287     gen_helper_cpsr_write(cpu_env, var, tmp_mask);
288     tcg_temp_free_i32(tmp_mask);
289 }
290 /* Set NZCV flags from the high 4 bits of var.  */
291 #define gen_set_nzcv(var) gen_set_cpsr(var, CPSR_NZCV)
292
293 static void gen_exception_internal(int excp)
294 {
295     TCGv_i32 tcg_excp = tcg_const_i32(excp);
296
297     assert(excp_is_internal(excp));
298     gen_helper_exception_internal(cpu_env, tcg_excp);
299     tcg_temp_free_i32(tcg_excp);
300 }
301
302 static void gen_step_complete_exception(DisasContext *s)
303 {
304     /* We just completed step of an insn. Move from Active-not-pending
305      * to Active-pending, and then also take the swstep exception.
306      * This corresponds to making the (IMPDEF) choice to prioritize
307      * swstep exceptions over asynchronous exceptions taken to an exception
308      * level where debug is disabled. This choice has the advantage that
309      * we do not need to maintain internal state corresponding to the
310      * ISV/EX syndrome bits between completion of the step and generation
311      * of the exception, and our syndrome information is always correct.
312      */
313     gen_ss_advance(s);
314     gen_swstep_exception(s, 1, s->is_ldex);
315     s->base.is_jmp = DISAS_NORETURN;
316 }
317
318 static void gen_singlestep_exception(DisasContext *s)
319 {
320     /* Generate the right kind of exception for singlestep, which is
321      * either the architectural singlestep or EXCP_DEBUG for QEMU's
322      * gdb singlestepping.
323      */
324     if (s->ss_active) {
325         gen_step_complete_exception(s);
326     } else {
327         gen_exception_internal(EXCP_DEBUG);
328     }
329 }
330
331 static inline bool is_singlestepping(DisasContext *s)
332 {
333     /* Return true if we are singlestepping either because of
334      * architectural singlestep or QEMU gdbstub singlestep. This does
335      * not include the command line '-singlestep' mode which is rather
336      * misnamed as it only means "one instruction per TB" and doesn't
337      * affect the code we generate.
338      */
339     return s->base.singlestep_enabled || s->ss_active;
340 }
341
342 static void gen_smul_dual(TCGv_i32 a, TCGv_i32 b)
343 {
344     TCGv_i32 tmp1 = tcg_temp_new_i32();
345     TCGv_i32 tmp2 = tcg_temp_new_i32();
346     tcg_gen_ext16s_i32(tmp1, a);
347     tcg_gen_ext16s_i32(tmp2, b);
348     tcg_gen_mul_i32(tmp1, tmp1, tmp2);
349     tcg_temp_free_i32(tmp2);
350     tcg_gen_sari_i32(a, a, 16);
351     tcg_gen_sari_i32(b, b, 16);
352     tcg_gen_mul_i32(b, b, a);
353     tcg_gen_mov_i32(a, tmp1);
354     tcg_temp_free_i32(tmp1);
355 }
356
357 /* Byteswap each halfword.  */
358 static void gen_rev16(TCGv_i32 var)
359 {
360     TCGv_i32 tmp = tcg_temp_new_i32();
361     TCGv_i32 mask = tcg_const_i32(0x00ff00ff);
362     tcg_gen_shri_i32(tmp, var, 8);
363     tcg_gen_and_i32(tmp, tmp, mask);
364     tcg_gen_and_i32(var, var, mask);
365     tcg_gen_shli_i32(var, var, 8);
366     tcg_gen_or_i32(var, var, tmp);
367     tcg_temp_free_i32(mask);
368     tcg_temp_free_i32(tmp);
369 }
370
371 /* Byteswap low halfword and sign extend.  */
372 static void gen_revsh(TCGv_i32 var)
373 {
374     tcg_gen_ext16u_i32(var, var);
375     tcg_gen_bswap16_i32(var, var);
376     tcg_gen_ext16s_i32(var, var);
377 }
378
379 /* 32x32->64 multiply.  Marks inputs as dead.  */
380 static TCGv_i64 gen_mulu_i64_i32(TCGv_i32 a, TCGv_i32 b)
381 {
382     TCGv_i32 lo = tcg_temp_new_i32();
383     TCGv_i32 hi = tcg_temp_new_i32();
384     TCGv_i64 ret;
385
386     tcg_gen_mulu2_i32(lo, hi, a, b);
387     tcg_temp_free_i32(a);
388     tcg_temp_free_i32(b);
389
390     ret = tcg_temp_new_i64();
391     tcg_gen_concat_i32_i64(ret, lo, hi);
392     tcg_temp_free_i32(lo);
393     tcg_temp_free_i32(hi);
394
395     return ret;
396 }
397
398 static TCGv_i64 gen_muls_i64_i32(TCGv_i32 a, TCGv_i32 b)
399 {
400     TCGv_i32 lo = tcg_temp_new_i32();
401     TCGv_i32 hi = tcg_temp_new_i32();
402     TCGv_i64 ret;
403
404     tcg_gen_muls2_i32(lo, hi, a, b);
405     tcg_temp_free_i32(a);
406     tcg_temp_free_i32(b);
407
408     ret = tcg_temp_new_i64();
409     tcg_gen_concat_i32_i64(ret, lo, hi);
410     tcg_temp_free_i32(lo);
411     tcg_temp_free_i32(hi);
412
413     return ret;
414 }
415
416 /* Swap low and high halfwords.  */
417 static void gen_swap_half(TCGv_i32 var)
418 {
419     tcg_gen_rotri_i32(var, var, 16);
420 }
421
422 /* Dual 16-bit add.  Result placed in t0 and t1 is marked as dead.
423     tmp = (t0 ^ t1) & 0x8000;
424     t0 &= ~0x8000;
425     t1 &= ~0x8000;
426     t0 = (t0 + t1) ^ tmp;
427  */
428
429 static void gen_add16(TCGv_i32 t0, TCGv_i32 t1)
430 {
431     TCGv_i32 tmp = tcg_temp_new_i32();
432     tcg_gen_xor_i32(tmp, t0, t1);
433     tcg_gen_andi_i32(tmp, tmp, 0x8000);
434     tcg_gen_andi_i32(t0, t0, ~0x8000);
435     tcg_gen_andi_i32(t1, t1, ~0x8000);
436     tcg_gen_add_i32(t0, t0, t1);
437     tcg_gen_xor_i32(t0, t0, tmp);
438     tcg_temp_free_i32(tmp);
439     tcg_temp_free_i32(t1);
440 }
441
442 /* Set N and Z flags from var.  */
443 static inline void gen_logic_CC(TCGv_i32 var)
444 {
445     tcg_gen_mov_i32(cpu_NF, var);
446     tcg_gen_mov_i32(cpu_ZF, var);
447 }
448
449 /* T0 += T1 + CF.  */
450 static void gen_adc(TCGv_i32 t0, TCGv_i32 t1)
451 {
452     tcg_gen_add_i32(t0, t0, t1);
453     tcg_gen_add_i32(t0, t0, cpu_CF);
454 }
455
456 /* dest = T0 + T1 + CF. */
457 static void gen_add_carry(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1)
458 {
459     tcg_gen_add_i32(dest, t0, t1);
460     tcg_gen_add_i32(dest, dest, cpu_CF);
461 }
462
463 /* dest = T0 - T1 + CF - 1.  */
464 static void gen_sub_carry(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1)
465 {
466     tcg_gen_sub_i32(dest, t0, t1);
467     tcg_gen_add_i32(dest, dest, cpu_CF);
468     tcg_gen_subi_i32(dest, dest, 1);
469 }
470
471 /* dest = T0 + T1. Compute C, N, V and Z flags */
472 static void gen_add_CC(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1)
473 {
474     TCGv_i32 tmp = tcg_temp_new_i32();
475     tcg_gen_movi_i32(tmp, 0);
476     tcg_gen_add2_i32(cpu_NF, cpu_CF, t0, tmp, t1, tmp);
477     tcg_gen_mov_i32(cpu_ZF, cpu_NF);
478     tcg_gen_xor_i32(cpu_VF, cpu_NF, t0);
479     tcg_gen_xor_i32(tmp, t0, t1);
480     tcg_gen_andc_i32(cpu_VF, cpu_VF, tmp);
481     tcg_temp_free_i32(tmp);
482     tcg_gen_mov_i32(dest, cpu_NF);
483 }
484
485 /* dest = T0 + T1 + CF.  Compute C, N, V and Z flags */
486 static void gen_adc_CC(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1)
487 {
488     TCGv_i32 tmp = tcg_temp_new_i32();
489     if (TCG_TARGET_HAS_add2_i32) {
490         tcg_gen_movi_i32(tmp, 0);
491         tcg_gen_add2_i32(cpu_NF, cpu_CF, t0, tmp, cpu_CF, tmp);
492         tcg_gen_add2_i32(cpu_NF, cpu_CF, cpu_NF, cpu_CF, t1, tmp);
493     } else {
494         TCGv_i64 q0 = tcg_temp_new_i64();
495         TCGv_i64 q1 = tcg_temp_new_i64();
496         tcg_gen_extu_i32_i64(q0, t0);
497         tcg_gen_extu_i32_i64(q1, t1);
498         tcg_gen_add_i64(q0, q0, q1);
499         tcg_gen_extu_i32_i64(q1, cpu_CF);
500         tcg_gen_add_i64(q0, q0, q1);
501         tcg_gen_extr_i64_i32(cpu_NF, cpu_CF, q0);
502         tcg_temp_free_i64(q0);
503         tcg_temp_free_i64(q1);
504     }
505     tcg_gen_mov_i32(cpu_ZF, cpu_NF);
506     tcg_gen_xor_i32(cpu_VF, cpu_NF, t0);
507     tcg_gen_xor_i32(tmp, t0, t1);
508     tcg_gen_andc_i32(cpu_VF, cpu_VF, tmp);
509     tcg_temp_free_i32(tmp);
510     tcg_gen_mov_i32(dest, cpu_NF);
511 }
512
513 /* dest = T0 - T1. Compute C, N, V and Z flags */
514 static void gen_sub_CC(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1)
515 {
516     TCGv_i32 tmp;
517     tcg_gen_sub_i32(cpu_NF, t0, t1);
518     tcg_gen_mov_i32(cpu_ZF, cpu_NF);
519     tcg_gen_setcond_i32(TCG_COND_GEU, cpu_CF, t0, t1);
520     tcg_gen_xor_i32(cpu_VF, cpu_NF, t0);
521     tmp = tcg_temp_new_i32();
522     tcg_gen_xor_i32(tmp, t0, t1);
523     tcg_gen_and_i32(cpu_VF, cpu_VF, tmp);
524     tcg_temp_free_i32(tmp);
525     tcg_gen_mov_i32(dest, cpu_NF);
526 }
527
528 /* dest = T0 + ~T1 + CF.  Compute C, N, V and Z flags */
529 static void gen_sbc_CC(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1)
530 {
531     TCGv_i32 tmp = tcg_temp_new_i32();
532     tcg_gen_not_i32(tmp, t1);
533     gen_adc_CC(dest, t0, tmp);
534     tcg_temp_free_i32(tmp);
535 }
536
537 #define GEN_SHIFT(name)                                               \
538 static void gen_##name(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1)       \
539 {                                                                     \
540     TCGv_i32 tmp1, tmp2, tmp3;                                        \
541     tmp1 = tcg_temp_new_i32();                                        \
542     tcg_gen_andi_i32(tmp1, t1, 0xff);                                 \
543     tmp2 = tcg_const_i32(0);                                          \
544     tmp3 = tcg_const_i32(0x1f);                                       \
545     tcg_gen_movcond_i32(TCG_COND_GTU, tmp2, tmp1, tmp3, tmp2, t0);    \
546     tcg_temp_free_i32(tmp3);                                          \
547     tcg_gen_andi_i32(tmp1, tmp1, 0x1f);                               \
548     tcg_gen_##name##_i32(dest, tmp2, tmp1);                           \
549     tcg_temp_free_i32(tmp2);                                          \
550     tcg_temp_free_i32(tmp1);                                          \
551 }
552 GEN_SHIFT(shl)
553 GEN_SHIFT(shr)
554 #undef GEN_SHIFT
555
556 static void gen_sar(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1)
557 {
558     TCGv_i32 tmp1, tmp2;
559     tmp1 = tcg_temp_new_i32();
560     tcg_gen_andi_i32(tmp1, t1, 0xff);
561     tmp2 = tcg_const_i32(0x1f);
562     tcg_gen_movcond_i32(TCG_COND_GTU, tmp1, tmp1, tmp2, tmp2, tmp1);
563     tcg_temp_free_i32(tmp2);
564     tcg_gen_sar_i32(dest, t0, tmp1);
565     tcg_temp_free_i32(tmp1);
566 }
567
568 static void shifter_out_im(TCGv_i32 var, int shift)
569 {
570     tcg_gen_extract_i32(cpu_CF, var, shift, 1);
571 }
572
573 /* Shift by immediate.  Includes special handling for shift == 0.  */
574 static inline void gen_arm_shift_im(TCGv_i32 var, int shiftop,
575                                     int shift, int flags)
576 {
577     switch (shiftop) {
578     case 0: /* LSL */
579         if (shift != 0) {
580             if (flags)
581                 shifter_out_im(var, 32 - shift);
582             tcg_gen_shli_i32(var, var, shift);
583         }
584         break;
585     case 1: /* LSR */
586         if (shift == 0) {
587             if (flags) {
588                 tcg_gen_shri_i32(cpu_CF, var, 31);
589             }
590             tcg_gen_movi_i32(var, 0);
591         } else {
592             if (flags)
593                 shifter_out_im(var, shift - 1);
594             tcg_gen_shri_i32(var, var, shift);
595         }
596         break;
597     case 2: /* ASR */
598         if (shift == 0)
599             shift = 32;
600         if (flags)
601             shifter_out_im(var, shift - 1);
602         if (shift == 32)
603           shift = 31;
604         tcg_gen_sari_i32(var, var, shift);
605         break;
606     case 3: /* ROR/RRX */
607         if (shift != 0) {
608             if (flags)
609                 shifter_out_im(var, shift - 1);
610             tcg_gen_rotri_i32(var, var, shift); break;
611         } else {
612             TCGv_i32 tmp = tcg_temp_new_i32();
613             tcg_gen_shli_i32(tmp, cpu_CF, 31);
614             if (flags)
615                 shifter_out_im(var, 0);
616             tcg_gen_shri_i32(var, var, 1);
617             tcg_gen_or_i32(var, var, tmp);
618             tcg_temp_free_i32(tmp);
619         }
620     }
621 };
622
623 static inline void gen_arm_shift_reg(TCGv_i32 var, int shiftop,
624                                      TCGv_i32 shift, int flags)
625 {
626     if (flags) {
627         switch (shiftop) {
628         case 0: gen_helper_shl_cc(var, cpu_env, var, shift); break;
629         case 1: gen_helper_shr_cc(var, cpu_env, var, shift); break;
630         case 2: gen_helper_sar_cc(var, cpu_env, var, shift); break;
631         case 3: gen_helper_ror_cc(var, cpu_env, var, shift); break;
632         }
633     } else {
634         switch (shiftop) {
635         case 0:
636             gen_shl(var, var, shift);
637             break;
638         case 1:
639             gen_shr(var, var, shift);
640             break;
641         case 2:
642             gen_sar(var, var, shift);
643             break;
644         case 3: tcg_gen_andi_i32(shift, shift, 0x1f);
645                 tcg_gen_rotr_i32(var, var, shift); break;
646         }
647     }
648     tcg_temp_free_i32(shift);
649 }
650
651 #define PAS_OP(pfx) \
652     switch (op2) {  \
653     case 0: gen_pas_helper(glue(pfx,add16)); break; \
654     case 1: gen_pas_helper(glue(pfx,addsubx)); break; \
655     case 2: gen_pas_helper(glue(pfx,subaddx)); break; \
656     case 3: gen_pas_helper(glue(pfx,sub16)); break; \
657     case 4: gen_pas_helper(glue(pfx,add8)); break; \
658     case 7: gen_pas_helper(glue(pfx,sub8)); break; \
659     }
660 static void gen_arm_parallel_addsub(int op1, int op2, TCGv_i32 a, TCGv_i32 b)
661 {
662     TCGv_ptr tmp;
663
664     switch (op1) {
665 #define gen_pas_helper(name) glue(gen_helper_,name)(a, a, b, tmp)
666     case 1:
667         tmp = tcg_temp_new_ptr();
668         tcg_gen_addi_ptr(tmp, cpu_env, offsetof(CPUARMState, GE));
669         PAS_OP(s)
670         tcg_temp_free_ptr(tmp);
671         break;
672     case 5:
673         tmp = tcg_temp_new_ptr();
674         tcg_gen_addi_ptr(tmp, cpu_env, offsetof(CPUARMState, GE));
675         PAS_OP(u)
676         tcg_temp_free_ptr(tmp);
677         break;
678 #undef gen_pas_helper
679 #define gen_pas_helper(name) glue(gen_helper_,name)(a, a, b)
680     case 2:
681         PAS_OP(q);
682         break;
683     case 3:
684         PAS_OP(sh);
685         break;
686     case 6:
687         PAS_OP(uq);
688         break;
689     case 7:
690         PAS_OP(uh);
691         break;
692 #undef gen_pas_helper
693     }
694 }
695 #undef PAS_OP
696
697 /* For unknown reasons Arm and Thumb-2 use arbitrarily different encodings.  */
698 #define PAS_OP(pfx) \
699     switch (op1) {  \
700     case 0: gen_pas_helper(glue(pfx,add8)); break; \
701     case 1: gen_pas_helper(glue(pfx,add16)); break; \
702     case 2: gen_pas_helper(glue(pfx,addsubx)); break; \
703     case 4: gen_pas_helper(glue(pfx,sub8)); break; \
704     case 5: gen_pas_helper(glue(pfx,sub16)); break; \
705     case 6: gen_pas_helper(glue(pfx,subaddx)); break; \
706     }
707 static void gen_thumb2_parallel_addsub(int op1, int op2, TCGv_i32 a, TCGv_i32 b)
708 {
709     TCGv_ptr tmp;
710
711     switch (op2) {
712 #define gen_pas_helper(name) glue(gen_helper_,name)(a, a, b, tmp)
713     case 0:
714         tmp = tcg_temp_new_ptr();
715         tcg_gen_addi_ptr(tmp, cpu_env, offsetof(CPUARMState, GE));
716         PAS_OP(s)
717         tcg_temp_free_ptr(tmp);
718         break;
719     case 4:
720         tmp = tcg_temp_new_ptr();
721         tcg_gen_addi_ptr(tmp, cpu_env, offsetof(CPUARMState, GE));
722         PAS_OP(u)
723         tcg_temp_free_ptr(tmp);
724         break;
725 #undef gen_pas_helper
726 #define gen_pas_helper(name) glue(gen_helper_,name)(a, a, b)
727     case 1:
728         PAS_OP(q);
729         break;
730     case 2:
731         PAS_OP(sh);
732         break;
733     case 5:
734         PAS_OP(uq);
735         break;
736     case 6:
737         PAS_OP(uh);
738         break;
739 #undef gen_pas_helper
740     }
741 }
742 #undef PAS_OP
743
744 /*
745  * Generate a conditional based on ARM condition code cc.
746  * This is common between ARM and Aarch64 targets.
747  */
748 void arm_test_cc(DisasCompare *cmp, int cc)
749 {
750     TCGv_i32 value;
751     TCGCond cond;
752     bool global = true;
753
754     switch (cc) {
755     case 0: /* eq: Z */
756     case 1: /* ne: !Z */
757         cond = TCG_COND_EQ;
758         value = cpu_ZF;
759         break;
760
761     case 2: /* cs: C */
762     case 3: /* cc: !C */
763         cond = TCG_COND_NE;
764         value = cpu_CF;
765         break;
766
767     case 4: /* mi: N */
768     case 5: /* pl: !N */
769         cond = TCG_COND_LT;
770         value = cpu_NF;
771         break;
772
773     case 6: /* vs: V */
774     case 7: /* vc: !V */
775         cond = TCG_COND_LT;
776         value = cpu_VF;
777         break;
778
779     case 8: /* hi: C && !Z */
780     case 9: /* ls: !C || Z -> !(C && !Z) */
781         cond = TCG_COND_NE;
782         value = tcg_temp_new_i32();
783         global = false;
784         /* CF is 1 for C, so -CF is an all-bits-set mask for C;
785            ZF is non-zero for !Z; so AND the two subexpressions.  */
786         tcg_gen_neg_i32(value, cpu_CF);
787         tcg_gen_and_i32(value, value, cpu_ZF);
788         break;
789
790     case 10: /* ge: N == V -> N ^ V == 0 */
791     case 11: /* lt: N != V -> N ^ V != 0 */
792         /* Since we're only interested in the sign bit, == 0 is >= 0.  */
793         cond = TCG_COND_GE;
794         value = tcg_temp_new_i32();
795         global = false;
796         tcg_gen_xor_i32(value, cpu_VF, cpu_NF);
797         break;
798
799     case 12: /* gt: !Z && N == V */
800     case 13: /* le: Z || N != V */
801         cond = TCG_COND_NE;
802         value = tcg_temp_new_i32();
803         global = false;
804         /* (N == V) is equal to the sign bit of ~(NF ^ VF).  Propagate
805          * the sign bit then AND with ZF to yield the result.  */
806         tcg_gen_xor_i32(value, cpu_VF, cpu_NF);
807         tcg_gen_sari_i32(value, value, 31);
808         tcg_gen_andc_i32(value, cpu_ZF, value);
809         break;
810
811     case 14: /* always */
812     case 15: /* always */
813         /* Use the ALWAYS condition, which will fold early.
814          * It doesn't matter what we use for the value.  */
815         cond = TCG_COND_ALWAYS;
816         value = cpu_ZF;
817         goto no_invert;
818
819     default:
820         fprintf(stderr, "Bad condition code 0x%x\n", cc);
821         abort();
822     }
823
824     if (cc & 1) {
825         cond = tcg_invert_cond(cond);
826     }
827
828  no_invert:
829     cmp->cond = cond;
830     cmp->value = value;
831     cmp->value_global = global;
832 }
833
834 void arm_free_cc(DisasCompare *cmp)
835 {
836     if (!cmp->value_global) {
837         tcg_temp_free_i32(cmp->value);
838     }
839 }
840
841 void arm_jump_cc(DisasCompare *cmp, TCGLabel *label)
842 {
843     tcg_gen_brcondi_i32(cmp->cond, cmp->value, 0, label);
844 }
845
846 void arm_gen_test_cc(int cc, TCGLabel *label)
847 {
848     DisasCompare cmp;
849     arm_test_cc(&cmp, cc);
850     arm_jump_cc(&cmp, label);
851     arm_free_cc(&cmp);
852 }
853
854 static inline void gen_set_condexec(DisasContext *s)
855 {
856     if (s->condexec_mask) {
857         uint32_t val = (s->condexec_cond << 4) | (s->condexec_mask >> 1);
858         TCGv_i32 tmp = tcg_temp_new_i32();
859         tcg_gen_movi_i32(tmp, val);
860         store_cpu_field(tmp, condexec_bits);
861     }
862 }
863
864 static inline void gen_set_pc_im(DisasContext *s, target_ulong val)
865 {
866     tcg_gen_movi_i32(cpu_R[15], val);
867 }
868
869 /* Set PC and Thumb state from an immediate address.  */
870 static inline void gen_bx_im(DisasContext *s, uint32_t addr)
871 {
872     TCGv_i32 tmp;
873
874     s->base.is_jmp = DISAS_JUMP;
875     if (s->thumb != (addr & 1)) {
876         tmp = tcg_temp_new_i32();
877         tcg_gen_movi_i32(tmp, addr & 1);
878         tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUARMState, thumb));
879         tcg_temp_free_i32(tmp);
880     }
881     tcg_gen_movi_i32(cpu_R[15], addr & ~1);
882 }
883
884 /* Set PC and Thumb state from var.  var is marked as dead.  */
885 static inline void gen_bx(DisasContext *s, TCGv_i32 var)
886 {
887     s->base.is_jmp = DISAS_JUMP;
888     tcg_gen_andi_i32(cpu_R[15], var, ~1);
889     tcg_gen_andi_i32(var, var, 1);
890     store_cpu_field(var, thumb);
891 }
892
893 /*
894  * Set PC and Thumb state from var. var is marked as dead.
895  * For M-profile CPUs, include logic to detect exception-return
896  * branches and handle them. This is needed for Thumb POP/LDM to PC, LDR to PC,
897  * and BX reg, and no others, and happens only for code in Handler mode.
898  * The Security Extension also requires us to check for the FNC_RETURN
899  * which signals a function return from non-secure state; this can happen
900  * in both Handler and Thread mode.
901  * To avoid having to do multiple comparisons in inline generated code,
902  * we make the check we do here loose, so it will match for EXC_RETURN
903  * in Thread mode. For system emulation do_v7m_exception_exit() checks
904  * for these spurious cases and returns without doing anything (giving
905  * the same behaviour as for a branch to a non-magic address).
906  *
907  * In linux-user mode it is unclear what the right behaviour for an
908  * attempted FNC_RETURN should be, because in real hardware this will go
909  * directly to Secure code (ie not the Linux kernel) which will then treat
910  * the error in any way it chooses. For QEMU we opt to make the FNC_RETURN
911  * attempt behave the way it would on a CPU without the security extension,
912  * which is to say "like a normal branch". That means we can simply treat
913  * all branches as normal with no magic address behaviour.
914  */
915 static inline void gen_bx_excret(DisasContext *s, TCGv_i32 var)
916 {
917     /* Generate the same code here as for a simple bx, but flag via
918      * s->base.is_jmp that we need to do the rest of the work later.
919      */
920     gen_bx(s, var);
921 #ifndef CONFIG_USER_ONLY
922     if (arm_dc_feature(s, ARM_FEATURE_M_SECURITY) ||
923         (s->v7m_handler_mode && arm_dc_feature(s, ARM_FEATURE_M))) {
924         s->base.is_jmp = DISAS_BX_EXCRET;
925     }
926 #endif
927 }
928
929 static inline void gen_bx_excret_final_code(DisasContext *s)
930 {
931     /* Generate the code to finish possible exception return and end the TB */
932     TCGLabel *excret_label = gen_new_label();
933     uint32_t min_magic;
934
935     if (arm_dc_feature(s, ARM_FEATURE_M_SECURITY)) {
936         /* Covers FNC_RETURN and EXC_RETURN magic */
937         min_magic = FNC_RETURN_MIN_MAGIC;
938     } else {
939         /* EXC_RETURN magic only */
940         min_magic = EXC_RETURN_MIN_MAGIC;
941     }
942
943     /* Is the new PC value in the magic range indicating exception return? */
944     tcg_gen_brcondi_i32(TCG_COND_GEU, cpu_R[15], min_magic, excret_label);
945     /* No: end the TB as we would for a DISAS_JMP */
946     if (is_singlestepping(s)) {
947         gen_singlestep_exception(s);
948     } else {
949         tcg_gen_exit_tb(NULL, 0);
950     }
951     gen_set_label(excret_label);
952     /* Yes: this is an exception return.
953      * At this point in runtime env->regs[15] and env->thumb will hold
954      * the exception-return magic number, which do_v7m_exception_exit()
955      * will read. Nothing else will be able to see those values because
956      * the cpu-exec main loop guarantees that we will always go straight
957      * from raising the exception to the exception-handling code.
958      *
959      * gen_ss_advance(s) does nothing on M profile currently but
960      * calling it is conceptually the right thing as we have executed
961      * this instruction (compare SWI, HVC, SMC handling).
962      */
963     gen_ss_advance(s);
964     gen_exception_internal(EXCP_EXCEPTION_EXIT);
965 }
966
967 static inline void gen_bxns(DisasContext *s, int rm)
968 {
969     TCGv_i32 var = load_reg(s, rm);
970
971     /* The bxns helper may raise an EXCEPTION_EXIT exception, so in theory
972      * we need to sync state before calling it, but:
973      *  - we don't need to do gen_set_pc_im() because the bxns helper will
974      *    always set the PC itself
975      *  - we don't need to do gen_set_condexec() because BXNS is UNPREDICTABLE
976      *    unless it's outside an IT block or the last insn in an IT block,
977      *    so we know that condexec == 0 (already set at the top of the TB)
978      *    is correct in the non-UNPREDICTABLE cases, and we can choose
979      *    "zeroes the IT bits" as our UNPREDICTABLE behaviour otherwise.
980      */
981     gen_helper_v7m_bxns(cpu_env, var);
982     tcg_temp_free_i32(var);
983     s->base.is_jmp = DISAS_EXIT;
984 }
985
986 static inline void gen_blxns(DisasContext *s, int rm)
987 {
988     TCGv_i32 var = load_reg(s, rm);
989
990     /* We don't need to sync condexec state, for the same reason as bxns.
991      * We do however need to set the PC, because the blxns helper reads it.
992      * The blxns helper may throw an exception.
993      */
994     gen_set_pc_im(s, s->base.pc_next);
995     gen_helper_v7m_blxns(cpu_env, var);
996     tcg_temp_free_i32(var);
997     s->base.is_jmp = DISAS_EXIT;
998 }
999
1000 /* Variant of store_reg which uses branch&exchange logic when storing
1001    to r15 in ARM architecture v7 and above. The source must be a temporary
1002    and will be marked as dead. */
1003 static inline void store_reg_bx(DisasContext *s, int reg, TCGv_i32 var)
1004 {
1005     if (reg == 15 && ENABLE_ARCH_7) {
1006         gen_bx(s, var);
1007     } else {
1008         store_reg(s, reg, var);
1009     }
1010 }
1011
1012 /* Variant of store_reg which uses branch&exchange logic when storing
1013  * to r15 in ARM architecture v5T and above. This is used for storing
1014  * the results of a LDR/LDM/POP into r15, and corresponds to the cases
1015  * in the ARM ARM which use the LoadWritePC() pseudocode function. */
1016 static inline void store_reg_from_load(DisasContext *s, int reg, TCGv_i32 var)
1017 {
1018     if (reg == 15 && ENABLE_ARCH_5) {
1019         gen_bx_excret(s, var);
1020     } else {
1021         store_reg(s, reg, var);
1022     }
1023 }
1024
1025 #ifdef CONFIG_USER_ONLY
1026 #define IS_USER_ONLY 1
1027 #else
1028 #define IS_USER_ONLY 0
1029 #endif
1030
1031 /* Abstractions of "generate code to do a guest load/store for
1032  * AArch32", where a vaddr is always 32 bits (and is zero
1033  * extended if we're a 64 bit core) and  data is also
1034  * 32 bits unless specifically doing a 64 bit access.
1035  * These functions work like tcg_gen_qemu_{ld,st}* except
1036  * that the address argument is TCGv_i32 rather than TCGv.
1037  */
1038
1039 static inline TCGv gen_aa32_addr(DisasContext *s, TCGv_i32 a32, MemOp op)
1040 {
1041     TCGv addr = tcg_temp_new();
1042     tcg_gen_extu_i32_tl(addr, a32);
1043
1044     /* Not needed for user-mode BE32, where we use MO_BE instead.  */
1045     if (!IS_USER_ONLY && s->sctlr_b && (op & MO_SIZE) < MO_32) {
1046         tcg_gen_xori_tl(addr, addr, 4 - (1 << (op & MO_SIZE)));
1047     }
1048     return addr;
1049 }
1050
1051 static void gen_aa32_ld_i32(DisasContext *s, TCGv_i32 val, TCGv_i32 a32,
1052                             int index, MemOp opc)
1053 {
1054     TCGv addr;
1055
1056     if (arm_dc_feature(s, ARM_FEATURE_M) &&
1057         !arm_dc_feature(s, ARM_FEATURE_M_MAIN)) {
1058         opc |= MO_ALIGN;
1059     }
1060
1061     addr = gen_aa32_addr(s, a32, opc);
1062     tcg_gen_qemu_ld_i32(val, addr, index, opc);
1063     tcg_temp_free(addr);
1064 }
1065
1066 static void gen_aa32_st_i32(DisasContext *s, TCGv_i32 val, TCGv_i32 a32,
1067                             int index, MemOp opc)
1068 {
1069     TCGv addr;
1070
1071     if (arm_dc_feature(s, ARM_FEATURE_M) &&
1072         !arm_dc_feature(s, ARM_FEATURE_M_MAIN)) {
1073         opc |= MO_ALIGN;
1074     }
1075
1076     addr = gen_aa32_addr(s, a32, opc);
1077     tcg_gen_qemu_st_i32(val, addr, index, opc);
1078     tcg_temp_free(addr);
1079 }
1080
1081 #define DO_GEN_LD(SUFF, OPC)                                             \
1082 static inline void gen_aa32_ld##SUFF(DisasContext *s, TCGv_i32 val,      \
1083                                      TCGv_i32 a32, int index)            \
1084 {                                                                        \
1085     gen_aa32_ld_i32(s, val, a32, index, OPC | s->be_data);               \
1086 }                                                                        \
1087 static inline void gen_aa32_ld##SUFF##_iss(DisasContext *s,              \
1088                                            TCGv_i32 val,                 \
1089                                            TCGv_i32 a32, int index,      \
1090                                            ISSInfo issinfo)              \
1091 {                                                                        \
1092     gen_aa32_ld##SUFF(s, val, a32, index);                               \
1093     disas_set_da_iss(s, OPC, issinfo);                                   \
1094 }
1095
1096 #define DO_GEN_ST(SUFF, OPC)                                             \
1097 static inline void gen_aa32_st##SUFF(DisasContext *s, TCGv_i32 val,      \
1098                                      TCGv_i32 a32, int index)            \
1099 {                                                                        \
1100     gen_aa32_st_i32(s, val, a32, index, OPC | s->be_data);               \
1101 }                                                                        \
1102 static inline void gen_aa32_st##SUFF##_iss(DisasContext *s,              \
1103                                            TCGv_i32 val,                 \
1104                                            TCGv_i32 a32, int index,      \
1105                                            ISSInfo issinfo)              \
1106 {                                                                        \
1107     gen_aa32_st##SUFF(s, val, a32, index);                               \
1108     disas_set_da_iss(s, OPC, issinfo | ISSIsWrite);                      \
1109 }
1110
1111 static inline void gen_aa32_frob64(DisasContext *s, TCGv_i64 val)
1112 {
1113     /* Not needed for user-mode BE32, where we use MO_BE instead.  */
1114     if (!IS_USER_ONLY && s->sctlr_b) {
1115         tcg_gen_rotri_i64(val, val, 32);
1116     }
1117 }
1118
1119 static void gen_aa32_ld_i64(DisasContext *s, TCGv_i64 val, TCGv_i32 a32,
1120                             int index, MemOp opc)
1121 {
1122     TCGv addr = gen_aa32_addr(s, a32, opc);
1123     tcg_gen_qemu_ld_i64(val, addr, index, opc);
1124     gen_aa32_frob64(s, val);
1125     tcg_temp_free(addr);
1126 }
1127
1128 static inline void gen_aa32_ld64(DisasContext *s, TCGv_i64 val,
1129                                  TCGv_i32 a32, int index)
1130 {
1131     gen_aa32_ld_i64(s, val, a32, index, MO_Q | s->be_data);
1132 }
1133
1134 static void gen_aa32_st_i64(DisasContext *s, TCGv_i64 val, TCGv_i32 a32,
1135                             int index, MemOp opc)
1136 {
1137     TCGv addr = gen_aa32_addr(s, a32, opc);
1138
1139     /* Not needed for user-mode BE32, where we use MO_BE instead.  */
1140     if (!IS_USER_ONLY && s->sctlr_b) {
1141         TCGv_i64 tmp = tcg_temp_new_i64();
1142         tcg_gen_rotri_i64(tmp, val, 32);
1143         tcg_gen_qemu_st_i64(tmp, addr, index, opc);
1144         tcg_temp_free_i64(tmp);
1145     } else {
1146         tcg_gen_qemu_st_i64(val, addr, index, opc);
1147     }
1148     tcg_temp_free(addr);
1149 }
1150
1151 static inline void gen_aa32_st64(DisasContext *s, TCGv_i64 val,
1152                                  TCGv_i32 a32, int index)
1153 {
1154     gen_aa32_st_i64(s, val, a32, index, MO_Q | s->be_data);
1155 }
1156
1157 DO_GEN_LD(8s, MO_SB)
1158 DO_GEN_LD(8u, MO_UB)
1159 DO_GEN_LD(16s, MO_SW)
1160 DO_GEN_LD(16u, MO_UW)
1161 DO_GEN_LD(32u, MO_UL)
1162 DO_GEN_ST(8, MO_UB)
1163 DO_GEN_ST(16, MO_UW)
1164 DO_GEN_ST(32, MO_UL)
1165
1166 static inline void gen_hvc(DisasContext *s, int imm16)
1167 {
1168     /* The pre HVC helper handles cases when HVC gets trapped
1169      * as an undefined insn by runtime configuration (ie before
1170      * the insn really executes).
1171      */
1172     gen_set_pc_im(s, s->pc_curr);
1173     gen_helper_pre_hvc(cpu_env);
1174     /* Otherwise we will treat this as a real exception which
1175      * happens after execution of the insn. (The distinction matters
1176      * for the PC value reported to the exception handler and also
1177      * for single stepping.)
1178      */
1179     s->svc_imm = imm16;
1180     gen_set_pc_im(s, s->base.pc_next);
1181     s->base.is_jmp = DISAS_HVC;
1182 }
1183
1184 static inline void gen_smc(DisasContext *s)
1185 {
1186     /* As with HVC, we may take an exception either before or after
1187      * the insn executes.
1188      */
1189     TCGv_i32 tmp;
1190
1191     gen_set_pc_im(s, s->pc_curr);
1192     tmp = tcg_const_i32(syn_aa32_smc());
1193     gen_helper_pre_smc(cpu_env, tmp);
1194     tcg_temp_free_i32(tmp);
1195     gen_set_pc_im(s, s->base.pc_next);
1196     s->base.is_jmp = DISAS_SMC;
1197 }
1198
1199 static void gen_exception_internal_insn(DisasContext *s, uint32_t pc, int excp)
1200 {
1201     gen_set_condexec(s);
1202     gen_set_pc_im(s, pc);
1203     gen_exception_internal(excp);
1204     s->base.is_jmp = DISAS_NORETURN;
1205 }
1206
1207 static void gen_exception_insn(DisasContext *s, uint32_t pc, int excp,
1208                                int syn, uint32_t target_el)
1209 {
1210     gen_set_condexec(s);
1211     gen_set_pc_im(s, pc);
1212     gen_exception(excp, syn, target_el);
1213     s->base.is_jmp = DISAS_NORETURN;
1214 }
1215
1216 static void gen_exception_bkpt_insn(DisasContext *s, uint32_t syn)
1217 {
1218     TCGv_i32 tcg_syn;
1219
1220     gen_set_condexec(s);
1221     gen_set_pc_im(s, s->pc_curr);
1222     tcg_syn = tcg_const_i32(syn);
1223     gen_helper_exception_bkpt_insn(cpu_env, tcg_syn);
1224     tcg_temp_free_i32(tcg_syn);
1225     s->base.is_jmp = DISAS_NORETURN;
1226 }
1227
1228 static void unallocated_encoding(DisasContext *s)
1229 {
1230     /* Unallocated and reserved encodings are uncategorized */
1231     gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
1232                        default_exception_el(s));
1233 }
1234
1235 /* Force a TB lookup after an instruction that changes the CPU state.  */
1236 static inline void gen_lookup_tb(DisasContext *s)
1237 {
1238     tcg_gen_movi_i32(cpu_R[15], s->base.pc_next);
1239     s->base.is_jmp = DISAS_EXIT;
1240 }
1241
1242 static inline void gen_hlt(DisasContext *s, int imm)
1243 {
1244     /* HLT. This has two purposes.
1245      * Architecturally, it is an external halting debug instruction.
1246      * Since QEMU doesn't implement external debug, we treat this as
1247      * it is required for halting debug disabled: it will UNDEF.
1248      * Secondly, "HLT 0x3C" is a T32 semihosting trap instruction,
1249      * and "HLT 0xF000" is an A32 semihosting syscall. These traps
1250      * must trigger semihosting even for ARMv7 and earlier, where
1251      * HLT was an undefined encoding.
1252      * In system mode, we don't allow userspace access to
1253      * semihosting, to provide some semblance of security
1254      * (and for consistency with our 32-bit semihosting).
1255      */
1256     if (semihosting_enabled() &&
1257 #ifndef CONFIG_USER_ONLY
1258         s->current_el != 0 &&
1259 #endif
1260         (imm == (s->thumb ? 0x3c : 0xf000))) {
1261         gen_exception_internal_insn(s, s->base.pc_next, EXCP_SEMIHOST);
1262         return;
1263     }
1264
1265     unallocated_encoding(s);
1266 }
1267
1268 static inline void gen_add_data_offset(DisasContext *s, unsigned int insn,
1269                                        TCGv_i32 var)
1270 {
1271     int val, rm, shift, shiftop;
1272     TCGv_i32 offset;
1273
1274     if (!(insn & (1 << 25))) {
1275         /* immediate */
1276         val = insn & 0xfff;
1277         if (!(insn & (1 << 23)))
1278             val = -val;
1279         if (val != 0)
1280             tcg_gen_addi_i32(var, var, val);
1281     } else {
1282         /* shift/register */
1283         rm = (insn) & 0xf;
1284         shift = (insn >> 7) & 0x1f;
1285         shiftop = (insn >> 5) & 3;
1286         offset = load_reg(s, rm);
1287         gen_arm_shift_im(offset, shiftop, shift, 0);
1288         if (!(insn & (1 << 23)))
1289             tcg_gen_sub_i32(var, var, offset);
1290         else
1291             tcg_gen_add_i32(var, var, offset);
1292         tcg_temp_free_i32(offset);
1293     }
1294 }
1295
1296 static inline void gen_add_datah_offset(DisasContext *s, unsigned int insn,
1297                                         int extra, TCGv_i32 var)
1298 {
1299     int val, rm;
1300     TCGv_i32 offset;
1301
1302     if (insn & (1 << 22)) {
1303         /* immediate */
1304         val = (insn & 0xf) | ((insn >> 4) & 0xf0);
1305         if (!(insn & (1 << 23)))
1306             val = -val;
1307         val += extra;
1308         if (val != 0)
1309             tcg_gen_addi_i32(var, var, val);
1310     } else {
1311         /* register */
1312         if (extra)
1313             tcg_gen_addi_i32(var, var, extra);
1314         rm = (insn) & 0xf;
1315         offset = load_reg(s, rm);
1316         if (!(insn & (1 << 23)))
1317             tcg_gen_sub_i32(var, var, offset);
1318         else
1319             tcg_gen_add_i32(var, var, offset);
1320         tcg_temp_free_i32(offset);
1321     }
1322 }
1323
1324 static TCGv_ptr get_fpstatus_ptr(int neon)
1325 {
1326     TCGv_ptr statusptr = tcg_temp_new_ptr();
1327     int offset;
1328     if (neon) {
1329         offset = offsetof(CPUARMState, vfp.standard_fp_status);
1330     } else {
1331         offset = offsetof(CPUARMState, vfp.fp_status);
1332     }
1333     tcg_gen_addi_ptr(statusptr, cpu_env, offset);
1334     return statusptr;
1335 }
1336
1337 static inline long vfp_reg_offset(bool dp, unsigned reg)
1338 {
1339     if (dp) {
1340         return offsetof(CPUARMState, vfp.zregs[reg >> 1].d[reg & 1]);
1341     } else {
1342         long ofs = offsetof(CPUARMState, vfp.zregs[reg >> 2].d[(reg >> 1) & 1]);
1343         if (reg & 1) {
1344             ofs += offsetof(CPU_DoubleU, l.upper);
1345         } else {
1346             ofs += offsetof(CPU_DoubleU, l.lower);
1347         }
1348         return ofs;
1349     }
1350 }
1351
1352 /* Return the offset of a 32-bit piece of a NEON register.
1353    zero is the least significant end of the register.  */
1354 static inline long
1355 neon_reg_offset (int reg, int n)
1356 {
1357     int sreg;
1358     sreg = reg * 2 + n;
1359     return vfp_reg_offset(0, sreg);
1360 }
1361
1362 /* Return the offset of a 2**SIZE piece of a NEON register, at index ELE,
1363  * where 0 is the least significant end of the register.
1364  */
1365 static inline long
1366 neon_element_offset(int reg, int element, MemOp size)
1367 {
1368     int element_size = 1 << size;
1369     int ofs = element * element_size;
1370 #ifdef HOST_WORDS_BIGENDIAN
1371     /* Calculate the offset assuming fully little-endian,
1372      * then XOR to account for the order of the 8-byte units.
1373      */
1374     if (element_size < 8) {
1375         ofs ^= 8 - element_size;
1376     }
1377 #endif
1378     return neon_reg_offset(reg, 0) + ofs;
1379 }
1380
1381 static TCGv_i32 neon_load_reg(int reg, int pass)
1382 {
1383     TCGv_i32 tmp = tcg_temp_new_i32();
1384     tcg_gen_ld_i32(tmp, cpu_env, neon_reg_offset(reg, pass));
1385     return tmp;
1386 }
1387
1388 static void neon_load_element(TCGv_i32 var, int reg, int ele, MemOp mop)
1389 {
1390     long offset = neon_element_offset(reg, ele, mop & MO_SIZE);
1391
1392     switch (mop) {
1393     case MO_UB:
1394         tcg_gen_ld8u_i32(var, cpu_env, offset);
1395         break;
1396     case MO_UW:
1397         tcg_gen_ld16u_i32(var, cpu_env, offset);
1398         break;
1399     case MO_UL:
1400         tcg_gen_ld_i32(var, cpu_env, offset);
1401         break;
1402     default:
1403         g_assert_not_reached();
1404     }
1405 }
1406
1407 static void neon_load_element64(TCGv_i64 var, int reg, int ele, MemOp mop)
1408 {
1409     long offset = neon_element_offset(reg, ele, mop & MO_SIZE);
1410
1411     switch (mop) {
1412     case MO_UB:
1413         tcg_gen_ld8u_i64(var, cpu_env, offset);
1414         break;
1415     case MO_UW:
1416         tcg_gen_ld16u_i64(var, cpu_env, offset);
1417         break;
1418     case MO_UL:
1419         tcg_gen_ld32u_i64(var, cpu_env, offset);
1420         break;
1421     case MO_Q:
1422         tcg_gen_ld_i64(var, cpu_env, offset);
1423         break;
1424     default:
1425         g_assert_not_reached();
1426     }
1427 }
1428
1429 static void neon_store_reg(int reg, int pass, TCGv_i32 var)
1430 {
1431     tcg_gen_st_i32(var, cpu_env, neon_reg_offset(reg, pass));
1432     tcg_temp_free_i32(var);
1433 }
1434
1435 static void neon_store_element(int reg, int ele, MemOp size, TCGv_i32 var)
1436 {
1437     long offset = neon_element_offset(reg, ele, size);
1438
1439     switch (size) {
1440     case MO_8:
1441         tcg_gen_st8_i32(var, cpu_env, offset);
1442         break;
1443     case MO_16:
1444         tcg_gen_st16_i32(var, cpu_env, offset);
1445         break;
1446     case MO_32:
1447         tcg_gen_st_i32(var, cpu_env, offset);
1448         break;
1449     default:
1450         g_assert_not_reached();
1451     }
1452 }
1453
1454 static void neon_store_element64(int reg, int ele, MemOp size, TCGv_i64 var)
1455 {
1456     long offset = neon_element_offset(reg, ele, size);
1457
1458     switch (size) {
1459     case MO_8:
1460         tcg_gen_st8_i64(var, cpu_env, offset);
1461         break;
1462     case MO_16:
1463         tcg_gen_st16_i64(var, cpu_env, offset);
1464         break;
1465     case MO_32:
1466         tcg_gen_st32_i64(var, cpu_env, offset);
1467         break;
1468     case MO_64:
1469         tcg_gen_st_i64(var, cpu_env, offset);
1470         break;
1471     default:
1472         g_assert_not_reached();
1473     }
1474 }
1475
1476 static inline void neon_load_reg64(TCGv_i64 var, int reg)
1477 {
1478     tcg_gen_ld_i64(var, cpu_env, vfp_reg_offset(1, reg));
1479 }
1480
1481 static inline void neon_store_reg64(TCGv_i64 var, int reg)
1482 {
1483     tcg_gen_st_i64(var, cpu_env, vfp_reg_offset(1, reg));
1484 }
1485
1486 static inline void neon_load_reg32(TCGv_i32 var, int reg)
1487 {
1488     tcg_gen_ld_i32(var, cpu_env, vfp_reg_offset(false, reg));
1489 }
1490
1491 static inline void neon_store_reg32(TCGv_i32 var, int reg)
1492 {
1493     tcg_gen_st_i32(var, cpu_env, vfp_reg_offset(false, reg));
1494 }
1495
1496 static TCGv_ptr vfp_reg_ptr(bool dp, int reg)
1497 {
1498     TCGv_ptr ret = tcg_temp_new_ptr();
1499     tcg_gen_addi_ptr(ret, cpu_env, vfp_reg_offset(dp, reg));
1500     return ret;
1501 }
1502
1503 #define ARM_CP_RW_BIT   (1 << 20)
1504
1505 /* Include the VFP decoder */
1506 #include "translate-vfp.inc.c"
1507
1508 static inline void iwmmxt_load_reg(TCGv_i64 var, int reg)
1509 {
1510     tcg_gen_ld_i64(var, cpu_env, offsetof(CPUARMState, iwmmxt.regs[reg]));
1511 }
1512
1513 static inline void iwmmxt_store_reg(TCGv_i64 var, int reg)
1514 {
1515     tcg_gen_st_i64(var, cpu_env, offsetof(CPUARMState, iwmmxt.regs[reg]));
1516 }
1517
1518 static inline TCGv_i32 iwmmxt_load_creg(int reg)
1519 {
1520     TCGv_i32 var = tcg_temp_new_i32();
1521     tcg_gen_ld_i32(var, cpu_env, offsetof(CPUARMState, iwmmxt.cregs[reg]));
1522     return var;
1523 }
1524
1525 static inline void iwmmxt_store_creg(int reg, TCGv_i32 var)
1526 {
1527     tcg_gen_st_i32(var, cpu_env, offsetof(CPUARMState, iwmmxt.cregs[reg]));
1528     tcg_temp_free_i32(var);
1529 }
1530
1531 static inline void gen_op_iwmmxt_movq_wRn_M0(int rn)
1532 {
1533     iwmmxt_store_reg(cpu_M0, rn);
1534 }
1535
1536 static inline void gen_op_iwmmxt_movq_M0_wRn(int rn)
1537 {
1538     iwmmxt_load_reg(cpu_M0, rn);
1539 }
1540
1541 static inline void gen_op_iwmmxt_orq_M0_wRn(int rn)
1542 {
1543     iwmmxt_load_reg(cpu_V1, rn);
1544     tcg_gen_or_i64(cpu_M0, cpu_M0, cpu_V1);
1545 }
1546
1547 static inline void gen_op_iwmmxt_andq_M0_wRn(int rn)
1548 {
1549     iwmmxt_load_reg(cpu_V1, rn);
1550     tcg_gen_and_i64(cpu_M0, cpu_M0, cpu_V1);
1551 }
1552
1553 static inline void gen_op_iwmmxt_xorq_M0_wRn(int rn)
1554 {
1555     iwmmxt_load_reg(cpu_V1, rn);
1556     tcg_gen_xor_i64(cpu_M0, cpu_M0, cpu_V1);
1557 }
1558
1559 #define IWMMXT_OP(name) \
1560 static inline void gen_op_iwmmxt_##name##_M0_wRn(int rn) \
1561 { \
1562     iwmmxt_load_reg(cpu_V1, rn); \
1563     gen_helper_iwmmxt_##name(cpu_M0, cpu_M0, cpu_V1); \
1564 }
1565
1566 #define IWMMXT_OP_ENV(name) \
1567 static inline void gen_op_iwmmxt_##name##_M0_wRn(int rn) \
1568 { \
1569     iwmmxt_load_reg(cpu_V1, rn); \
1570     gen_helper_iwmmxt_##name(cpu_M0, cpu_env, cpu_M0, cpu_V1); \
1571 }
1572
1573 #define IWMMXT_OP_ENV_SIZE(name) \
1574 IWMMXT_OP_ENV(name##b) \
1575 IWMMXT_OP_ENV(name##w) \
1576 IWMMXT_OP_ENV(name##l)
1577
1578 #define IWMMXT_OP_ENV1(name) \
1579 static inline void gen_op_iwmmxt_##name##_M0(void) \
1580 { \
1581     gen_helper_iwmmxt_##name(cpu_M0, cpu_env, cpu_M0); \
1582 }
1583
1584 IWMMXT_OP(maddsq)
1585 IWMMXT_OP(madduq)
1586 IWMMXT_OP(sadb)
1587 IWMMXT_OP(sadw)
1588 IWMMXT_OP(mulslw)
1589 IWMMXT_OP(mulshw)
1590 IWMMXT_OP(mululw)
1591 IWMMXT_OP(muluhw)
1592 IWMMXT_OP(macsw)
1593 IWMMXT_OP(macuw)
1594
1595 IWMMXT_OP_ENV_SIZE(unpackl)
1596 IWMMXT_OP_ENV_SIZE(unpackh)
1597
1598 IWMMXT_OP_ENV1(unpacklub)
1599 IWMMXT_OP_ENV1(unpackluw)
1600 IWMMXT_OP_ENV1(unpacklul)
1601 IWMMXT_OP_ENV1(unpackhub)
1602 IWMMXT_OP_ENV1(unpackhuw)
1603 IWMMXT_OP_ENV1(unpackhul)
1604 IWMMXT_OP_ENV1(unpacklsb)
1605 IWMMXT_OP_ENV1(unpacklsw)
1606 IWMMXT_OP_ENV1(unpacklsl)
1607 IWMMXT_OP_ENV1(unpackhsb)
1608 IWMMXT_OP_ENV1(unpackhsw)
1609 IWMMXT_OP_ENV1(unpackhsl)
1610
1611 IWMMXT_OP_ENV_SIZE(cmpeq)
1612 IWMMXT_OP_ENV_SIZE(cmpgtu)
1613 IWMMXT_OP_ENV_SIZE(cmpgts)
1614
1615 IWMMXT_OP_ENV_SIZE(mins)
1616 IWMMXT_OP_ENV_SIZE(minu)
1617 IWMMXT_OP_ENV_SIZE(maxs)
1618 IWMMXT_OP_ENV_SIZE(maxu)
1619
1620 IWMMXT_OP_ENV_SIZE(subn)
1621 IWMMXT_OP_ENV_SIZE(addn)
1622 IWMMXT_OP_ENV_SIZE(subu)
1623 IWMMXT_OP_ENV_SIZE(addu)
1624 IWMMXT_OP_ENV_SIZE(subs)
1625 IWMMXT_OP_ENV_SIZE(adds)
1626
1627 IWMMXT_OP_ENV(avgb0)
1628 IWMMXT_OP_ENV(avgb1)
1629 IWMMXT_OP_ENV(avgw0)
1630 IWMMXT_OP_ENV(avgw1)
1631
1632 IWMMXT_OP_ENV(packuw)
1633 IWMMXT_OP_ENV(packul)
1634 IWMMXT_OP_ENV(packuq)
1635 IWMMXT_OP_ENV(packsw)
1636 IWMMXT_OP_ENV(packsl)
1637 IWMMXT_OP_ENV(packsq)
1638
1639 static void gen_op_iwmmxt_set_mup(void)
1640 {
1641     TCGv_i32 tmp;
1642     tmp = load_cpu_field(iwmmxt.cregs[ARM_IWMMXT_wCon]);
1643     tcg_gen_ori_i32(tmp, tmp, 2);
1644     store_cpu_field(tmp, iwmmxt.cregs[ARM_IWMMXT_wCon]);
1645 }
1646
1647 static void gen_op_iwmmxt_set_cup(void)
1648 {
1649     TCGv_i32 tmp;
1650     tmp = load_cpu_field(iwmmxt.cregs[ARM_IWMMXT_wCon]);
1651     tcg_gen_ori_i32(tmp, tmp, 1);
1652     store_cpu_field(tmp, iwmmxt.cregs[ARM_IWMMXT_wCon]);
1653 }
1654
1655 static void gen_op_iwmmxt_setpsr_nz(void)
1656 {
1657     TCGv_i32 tmp = tcg_temp_new_i32();
1658     gen_helper_iwmmxt_setpsr_nz(tmp, cpu_M0);
1659     store_cpu_field(tmp, iwmmxt.cregs[ARM_IWMMXT_wCASF]);
1660 }
1661
1662 static inline void gen_op_iwmmxt_addl_M0_wRn(int rn)
1663 {
1664     iwmmxt_load_reg(cpu_V1, rn);
1665     tcg_gen_ext32u_i64(cpu_V1, cpu_V1);
1666     tcg_gen_add_i64(cpu_M0, cpu_M0, cpu_V1);
1667 }
1668
1669 static inline int gen_iwmmxt_address(DisasContext *s, uint32_t insn,
1670                                      TCGv_i32 dest)
1671 {
1672     int rd;
1673     uint32_t offset;
1674     TCGv_i32 tmp;
1675
1676     rd = (insn >> 16) & 0xf;
1677     tmp = load_reg(s, rd);
1678
1679     offset = (insn & 0xff) << ((insn >> 7) & 2);
1680     if (insn & (1 << 24)) {
1681         /* Pre indexed */
1682         if (insn & (1 << 23))
1683             tcg_gen_addi_i32(tmp, tmp, offset);
1684         else
1685             tcg_gen_addi_i32(tmp, tmp, -offset);
1686         tcg_gen_mov_i32(dest, tmp);
1687         if (insn & (1 << 21))
1688             store_reg(s, rd, tmp);
1689         else
1690             tcg_temp_free_i32(tmp);
1691     } else if (insn & (1 << 21)) {
1692         /* Post indexed */
1693         tcg_gen_mov_i32(dest, tmp);
1694         if (insn & (1 << 23))
1695             tcg_gen_addi_i32(tmp, tmp, offset);
1696         else
1697             tcg_gen_addi_i32(tmp, tmp, -offset);
1698         store_reg(s, rd, tmp);
1699     } else if (!(insn & (1 << 23)))
1700         return 1;
1701     return 0;
1702 }
1703
1704 static inline int gen_iwmmxt_shift(uint32_t insn, uint32_t mask, TCGv_i32 dest)
1705 {
1706     int rd = (insn >> 0) & 0xf;
1707     TCGv_i32 tmp;
1708
1709     if (insn & (1 << 8)) {
1710         if (rd < ARM_IWMMXT_wCGR0 || rd > ARM_IWMMXT_wCGR3) {
1711             return 1;
1712         } else {
1713             tmp = iwmmxt_load_creg(rd);
1714         }
1715     } else {
1716         tmp = tcg_temp_new_i32();
1717         iwmmxt_load_reg(cpu_V0, rd);
1718         tcg_gen_extrl_i64_i32(tmp, cpu_V0);
1719     }
1720     tcg_gen_andi_i32(tmp, tmp, mask);
1721     tcg_gen_mov_i32(dest, tmp);
1722     tcg_temp_free_i32(tmp);
1723     return 0;
1724 }
1725
1726 /* Disassemble an iwMMXt instruction.  Returns nonzero if an error occurred
1727    (ie. an undefined instruction).  */
1728 static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn)
1729 {
1730     int rd, wrd;
1731     int rdhi, rdlo, rd0, rd1, i;
1732     TCGv_i32 addr;
1733     TCGv_i32 tmp, tmp2, tmp3;
1734
1735     if ((insn & 0x0e000e00) == 0x0c000000) {
1736         if ((insn & 0x0fe00ff0) == 0x0c400000) {
1737             wrd = insn & 0xf;
1738             rdlo = (insn >> 12) & 0xf;
1739             rdhi = (insn >> 16) & 0xf;
1740             if (insn & ARM_CP_RW_BIT) {                         /* TMRRC */
1741                 iwmmxt_load_reg(cpu_V0, wrd);
1742                 tcg_gen_extrl_i64_i32(cpu_R[rdlo], cpu_V0);
1743                 tcg_gen_extrh_i64_i32(cpu_R[rdhi], cpu_V0);
1744             } else {                                    /* TMCRR */
1745                 tcg_gen_concat_i32_i64(cpu_V0, cpu_R[rdlo], cpu_R[rdhi]);
1746                 iwmmxt_store_reg(cpu_V0, wrd);
1747                 gen_op_iwmmxt_set_mup();
1748             }
1749             return 0;
1750         }
1751
1752         wrd = (insn >> 12) & 0xf;
1753         addr = tcg_temp_new_i32();
1754         if (gen_iwmmxt_address(s, insn, addr)) {
1755             tcg_temp_free_i32(addr);
1756             return 1;
1757         }
1758         if (insn & ARM_CP_RW_BIT) {
1759             if ((insn >> 28) == 0xf) {                  /* WLDRW wCx */
1760                 tmp = tcg_temp_new_i32();
1761                 gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
1762                 iwmmxt_store_creg(wrd, tmp);
1763             } else {
1764                 i = 1;
1765                 if (insn & (1 << 8)) {
1766                     if (insn & (1 << 22)) {             /* WLDRD */
1767                         gen_aa32_ld64(s, cpu_M0, addr, get_mem_index(s));
1768                         i = 0;
1769                     } else {                            /* WLDRW wRd */
1770                         tmp = tcg_temp_new_i32();
1771                         gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
1772                     }
1773                 } else {
1774                     tmp = tcg_temp_new_i32();
1775                     if (insn & (1 << 22)) {             /* WLDRH */
1776                         gen_aa32_ld16u(s, tmp, addr, get_mem_index(s));
1777                     } else {                            /* WLDRB */
1778                         gen_aa32_ld8u(s, tmp, addr, get_mem_index(s));
1779                     }
1780                 }
1781                 if (i) {
1782                     tcg_gen_extu_i32_i64(cpu_M0, tmp);
1783                     tcg_temp_free_i32(tmp);
1784                 }
1785                 gen_op_iwmmxt_movq_wRn_M0(wrd);
1786             }
1787         } else {
1788             if ((insn >> 28) == 0xf) {                  /* WSTRW wCx */
1789                 tmp = iwmmxt_load_creg(wrd);
1790                 gen_aa32_st32(s, tmp, addr, get_mem_index(s));
1791             } else {
1792                 gen_op_iwmmxt_movq_M0_wRn(wrd);
1793                 tmp = tcg_temp_new_i32();
1794                 if (insn & (1 << 8)) {
1795                     if (insn & (1 << 22)) {             /* WSTRD */
1796                         gen_aa32_st64(s, cpu_M0, addr, get_mem_index(s));
1797                     } else {                            /* WSTRW wRd */
1798                         tcg_gen_extrl_i64_i32(tmp, cpu_M0);
1799                         gen_aa32_st32(s, tmp, addr, get_mem_index(s));
1800                     }
1801                 } else {
1802                     if (insn & (1 << 22)) {             /* WSTRH */
1803                         tcg_gen_extrl_i64_i32(tmp, cpu_M0);
1804                         gen_aa32_st16(s, tmp, addr, get_mem_index(s));
1805                     } else {                            /* WSTRB */
1806                         tcg_gen_extrl_i64_i32(tmp, cpu_M0);
1807                         gen_aa32_st8(s, tmp, addr, get_mem_index(s));
1808                     }
1809                 }
1810             }
1811             tcg_temp_free_i32(tmp);
1812         }
1813         tcg_temp_free_i32(addr);
1814         return 0;
1815     }
1816
1817     if ((insn & 0x0f000000) != 0x0e000000)
1818         return 1;
1819
1820     switch (((insn >> 12) & 0xf00) | ((insn >> 4) & 0xff)) {
1821     case 0x000:                                                 /* WOR */
1822         wrd = (insn >> 12) & 0xf;
1823         rd0 = (insn >> 0) & 0xf;
1824         rd1 = (insn >> 16) & 0xf;
1825         gen_op_iwmmxt_movq_M0_wRn(rd0);
1826         gen_op_iwmmxt_orq_M0_wRn(rd1);
1827         gen_op_iwmmxt_setpsr_nz();
1828         gen_op_iwmmxt_movq_wRn_M0(wrd);
1829         gen_op_iwmmxt_set_mup();
1830         gen_op_iwmmxt_set_cup();
1831         break;
1832     case 0x011:                                                 /* TMCR */
1833         if (insn & 0xf)
1834             return 1;
1835         rd = (insn >> 12) & 0xf;
1836         wrd = (insn >> 16) & 0xf;
1837         switch (wrd) {
1838         case ARM_IWMMXT_wCID:
1839         case ARM_IWMMXT_wCASF:
1840             break;
1841         case ARM_IWMMXT_wCon:
1842             gen_op_iwmmxt_set_cup();
1843             /* Fall through.  */
1844         case ARM_IWMMXT_wCSSF:
1845             tmp = iwmmxt_load_creg(wrd);
1846             tmp2 = load_reg(s, rd);
1847             tcg_gen_andc_i32(tmp, tmp, tmp2);
1848             tcg_temp_free_i32(tmp2);
1849             iwmmxt_store_creg(wrd, tmp);
1850             break;
1851         case ARM_IWMMXT_wCGR0:
1852         case ARM_IWMMXT_wCGR1:
1853         case ARM_IWMMXT_wCGR2:
1854         case ARM_IWMMXT_wCGR3:
1855             gen_op_iwmmxt_set_cup();
1856             tmp = load_reg(s, rd);
1857             iwmmxt_store_creg(wrd, tmp);
1858             break;
1859         default:
1860             return 1;
1861         }
1862         break;
1863     case 0x100:                                                 /* WXOR */
1864         wrd = (insn >> 12) & 0xf;
1865         rd0 = (insn >> 0) & 0xf;
1866         rd1 = (insn >> 16) & 0xf;
1867         gen_op_iwmmxt_movq_M0_wRn(rd0);
1868         gen_op_iwmmxt_xorq_M0_wRn(rd1);
1869         gen_op_iwmmxt_setpsr_nz();
1870         gen_op_iwmmxt_movq_wRn_M0(wrd);
1871         gen_op_iwmmxt_set_mup();
1872         gen_op_iwmmxt_set_cup();
1873         break;
1874     case 0x111:                                                 /* TMRC */
1875         if (insn & 0xf)
1876             return 1;
1877         rd = (insn >> 12) & 0xf;
1878         wrd = (insn >> 16) & 0xf;
1879         tmp = iwmmxt_load_creg(wrd);
1880         store_reg(s, rd, tmp);
1881         break;
1882     case 0x300:                                                 /* WANDN */
1883         wrd = (insn >> 12) & 0xf;
1884         rd0 = (insn >> 0) & 0xf;
1885         rd1 = (insn >> 16) & 0xf;
1886         gen_op_iwmmxt_movq_M0_wRn(rd0);
1887         tcg_gen_neg_i64(cpu_M0, cpu_M0);
1888         gen_op_iwmmxt_andq_M0_wRn(rd1);
1889         gen_op_iwmmxt_setpsr_nz();
1890         gen_op_iwmmxt_movq_wRn_M0(wrd);
1891         gen_op_iwmmxt_set_mup();
1892         gen_op_iwmmxt_set_cup();
1893         break;
1894     case 0x200:                                                 /* WAND */
1895         wrd = (insn >> 12) & 0xf;
1896         rd0 = (insn >> 0) & 0xf;
1897         rd1 = (insn >> 16) & 0xf;
1898         gen_op_iwmmxt_movq_M0_wRn(rd0);
1899         gen_op_iwmmxt_andq_M0_wRn(rd1);
1900         gen_op_iwmmxt_setpsr_nz();
1901         gen_op_iwmmxt_movq_wRn_M0(wrd);
1902         gen_op_iwmmxt_set_mup();
1903         gen_op_iwmmxt_set_cup();
1904         break;
1905     case 0x810: case 0xa10:                             /* WMADD */
1906         wrd = (insn >> 12) & 0xf;
1907         rd0 = (insn >> 0) & 0xf;
1908         rd1 = (insn >> 16) & 0xf;
1909         gen_op_iwmmxt_movq_M0_wRn(rd0);
1910         if (insn & (1 << 21))
1911             gen_op_iwmmxt_maddsq_M0_wRn(rd1);
1912         else
1913             gen_op_iwmmxt_madduq_M0_wRn(rd1);
1914         gen_op_iwmmxt_movq_wRn_M0(wrd);
1915         gen_op_iwmmxt_set_mup();
1916         break;
1917     case 0x10e: case 0x50e: case 0x90e: case 0xd0e:     /* WUNPCKIL */
1918         wrd = (insn >> 12) & 0xf;
1919         rd0 = (insn >> 16) & 0xf;
1920         rd1 = (insn >> 0) & 0xf;
1921         gen_op_iwmmxt_movq_M0_wRn(rd0);
1922         switch ((insn >> 22) & 3) {
1923         case 0:
1924             gen_op_iwmmxt_unpacklb_M0_wRn(rd1);
1925             break;
1926         case 1:
1927             gen_op_iwmmxt_unpacklw_M0_wRn(rd1);
1928             break;
1929         case 2:
1930             gen_op_iwmmxt_unpackll_M0_wRn(rd1);
1931             break;
1932         case 3:
1933             return 1;
1934         }
1935         gen_op_iwmmxt_movq_wRn_M0(wrd);
1936         gen_op_iwmmxt_set_mup();
1937         gen_op_iwmmxt_set_cup();
1938         break;
1939     case 0x10c: case 0x50c: case 0x90c: case 0xd0c:     /* WUNPCKIH */
1940         wrd = (insn >> 12) & 0xf;
1941         rd0 = (insn >> 16) & 0xf;
1942         rd1 = (insn >> 0) & 0xf;
1943         gen_op_iwmmxt_movq_M0_wRn(rd0);
1944         switch ((insn >> 22) & 3) {
1945         case 0:
1946             gen_op_iwmmxt_unpackhb_M0_wRn(rd1);
1947             break;
1948         case 1:
1949             gen_op_iwmmxt_unpackhw_M0_wRn(rd1);
1950             break;
1951         case 2:
1952             gen_op_iwmmxt_unpackhl_M0_wRn(rd1);
1953             break;
1954         case 3:
1955             return 1;
1956         }
1957         gen_op_iwmmxt_movq_wRn_M0(wrd);
1958         gen_op_iwmmxt_set_mup();
1959         gen_op_iwmmxt_set_cup();
1960         break;
1961     case 0x012: case 0x112: case 0x412: case 0x512:     /* WSAD */
1962         wrd = (insn >> 12) & 0xf;
1963         rd0 = (insn >> 16) & 0xf;
1964         rd1 = (insn >> 0) & 0xf;
1965         gen_op_iwmmxt_movq_M0_wRn(rd0);
1966         if (insn & (1 << 22))
1967             gen_op_iwmmxt_sadw_M0_wRn(rd1);
1968         else
1969             gen_op_iwmmxt_sadb_M0_wRn(rd1);
1970         if (!(insn & (1 << 20)))
1971             gen_op_iwmmxt_addl_M0_wRn(wrd);
1972         gen_op_iwmmxt_movq_wRn_M0(wrd);
1973         gen_op_iwmmxt_set_mup();
1974         break;
1975     case 0x010: case 0x110: case 0x210: case 0x310:     /* WMUL */
1976         wrd = (insn >> 12) & 0xf;
1977         rd0 = (insn >> 16) & 0xf;
1978         rd1 = (insn >> 0) & 0xf;
1979         gen_op_iwmmxt_movq_M0_wRn(rd0);
1980         if (insn & (1 << 21)) {
1981             if (insn & (1 << 20))
1982                 gen_op_iwmmxt_mulshw_M0_wRn(rd1);
1983             else
1984                 gen_op_iwmmxt_mulslw_M0_wRn(rd1);
1985         } else {
1986             if (insn & (1 << 20))
1987                 gen_op_iwmmxt_muluhw_M0_wRn(rd1);
1988             else
1989                 gen_op_iwmmxt_mululw_M0_wRn(rd1);
1990         }
1991         gen_op_iwmmxt_movq_wRn_M0(wrd);
1992         gen_op_iwmmxt_set_mup();
1993         break;
1994     case 0x410: case 0x510: case 0x610: case 0x710:     /* WMAC */
1995         wrd = (insn >> 12) & 0xf;
1996         rd0 = (insn >> 16) & 0xf;
1997         rd1 = (insn >> 0) & 0xf;
1998         gen_op_iwmmxt_movq_M0_wRn(rd0);
1999         if (insn & (1 << 21))
2000             gen_op_iwmmxt_macsw_M0_wRn(rd1);
2001         else
2002             gen_op_iwmmxt_macuw_M0_wRn(rd1);
2003         if (!(insn & (1 << 20))) {
2004             iwmmxt_load_reg(cpu_V1, wrd);
2005             tcg_gen_add_i64(cpu_M0, cpu_M0, cpu_V1);
2006         }
2007         gen_op_iwmmxt_movq_wRn_M0(wrd);
2008         gen_op_iwmmxt_set_mup();
2009         break;
2010     case 0x006: case 0x406: case 0x806: case 0xc06:     /* WCMPEQ */
2011         wrd = (insn >> 12) & 0xf;
2012         rd0 = (insn >> 16) & 0xf;
2013         rd1 = (insn >> 0) & 0xf;
2014         gen_op_iwmmxt_movq_M0_wRn(rd0);
2015         switch ((insn >> 22) & 3) {
2016         case 0:
2017             gen_op_iwmmxt_cmpeqb_M0_wRn(rd1);
2018             break;
2019         case 1:
2020             gen_op_iwmmxt_cmpeqw_M0_wRn(rd1);
2021             break;
2022         case 2:
2023             gen_op_iwmmxt_cmpeql_M0_wRn(rd1);
2024             break;
2025         case 3:
2026             return 1;
2027         }
2028         gen_op_iwmmxt_movq_wRn_M0(wrd);
2029         gen_op_iwmmxt_set_mup();
2030         gen_op_iwmmxt_set_cup();
2031         break;
2032     case 0x800: case 0x900: case 0xc00: case 0xd00:     /* WAVG2 */
2033         wrd = (insn >> 12) & 0xf;
2034         rd0 = (insn >> 16) & 0xf;
2035         rd1 = (insn >> 0) & 0xf;
2036         gen_op_iwmmxt_movq_M0_wRn(rd0);
2037         if (insn & (1 << 22)) {
2038             if (insn & (1 << 20))
2039                 gen_op_iwmmxt_avgw1_M0_wRn(rd1);
2040             else
2041                 gen_op_iwmmxt_avgw0_M0_wRn(rd1);
2042         } else {
2043             if (insn & (1 << 20))
2044                 gen_op_iwmmxt_avgb1_M0_wRn(rd1);
2045             else
2046                 gen_op_iwmmxt_avgb0_M0_wRn(rd1);
2047         }
2048         gen_op_iwmmxt_movq_wRn_M0(wrd);
2049         gen_op_iwmmxt_set_mup();
2050         gen_op_iwmmxt_set_cup();
2051         break;
2052     case 0x802: case 0x902: case 0xa02: case 0xb02:     /* WALIGNR */
2053         wrd = (insn >> 12) & 0xf;
2054         rd0 = (insn >> 16) & 0xf;
2055         rd1 = (insn >> 0) & 0xf;
2056         gen_op_iwmmxt_movq_M0_wRn(rd0);
2057         tmp = iwmmxt_load_creg(ARM_IWMMXT_wCGR0 + ((insn >> 20) & 3));
2058         tcg_gen_andi_i32(tmp, tmp, 7);
2059         iwmmxt_load_reg(cpu_V1, rd1);
2060         gen_helper_iwmmxt_align(cpu_M0, cpu_M0, cpu_V1, tmp);
2061         tcg_temp_free_i32(tmp);
2062         gen_op_iwmmxt_movq_wRn_M0(wrd);
2063         gen_op_iwmmxt_set_mup();
2064         break;
2065     case 0x601: case 0x605: case 0x609: case 0x60d:     /* TINSR */
2066         if (((insn >> 6) & 3) == 3)
2067             return 1;
2068         rd = (insn >> 12) & 0xf;
2069         wrd = (insn >> 16) & 0xf;
2070         tmp = load_reg(s, rd);
2071         gen_op_iwmmxt_movq_M0_wRn(wrd);
2072         switch ((insn >> 6) & 3) {
2073         case 0:
2074             tmp2 = tcg_const_i32(0xff);
2075             tmp3 = tcg_const_i32((insn & 7) << 3);
2076             break;
2077         case 1:
2078             tmp2 = tcg_const_i32(0xffff);
2079             tmp3 = tcg_const_i32((insn & 3) << 4);
2080             break;
2081         case 2:
2082             tmp2 = tcg_const_i32(0xffffffff);
2083             tmp3 = tcg_const_i32((insn & 1) << 5);
2084             break;
2085         default:
2086             tmp2 = NULL;
2087             tmp3 = NULL;
2088         }
2089         gen_helper_iwmmxt_insr(cpu_M0, cpu_M0, tmp, tmp2, tmp3);
2090         tcg_temp_free_i32(tmp3);
2091         tcg_temp_free_i32(tmp2);
2092         tcg_temp_free_i32(tmp);
2093         gen_op_iwmmxt_movq_wRn_M0(wrd);
2094         gen_op_iwmmxt_set_mup();
2095         break;
2096     case 0x107: case 0x507: case 0x907: case 0xd07:     /* TEXTRM */
2097         rd = (insn >> 12) & 0xf;
2098         wrd = (insn >> 16) & 0xf;
2099         if (rd == 15 || ((insn >> 22) & 3) == 3)
2100             return 1;
2101         gen_op_iwmmxt_movq_M0_wRn(wrd);
2102         tmp = tcg_temp_new_i32();
2103         switch ((insn >> 22) & 3) {
2104         case 0:
2105             tcg_gen_shri_i64(cpu_M0, cpu_M0, (insn & 7) << 3);
2106             tcg_gen_extrl_i64_i32(tmp, cpu_M0);
2107             if (insn & 8) {
2108                 tcg_gen_ext8s_i32(tmp, tmp);
2109             } else {
2110                 tcg_gen_andi_i32(tmp, tmp, 0xff);
2111             }
2112             break;
2113         case 1:
2114             tcg_gen_shri_i64(cpu_M0, cpu_M0, (insn & 3) << 4);
2115             tcg_gen_extrl_i64_i32(tmp, cpu_M0);
2116             if (insn & 8) {
2117                 tcg_gen_ext16s_i32(tmp, tmp);
2118             } else {
2119                 tcg_gen_andi_i32(tmp, tmp, 0xffff);
2120             }
2121             break;
2122         case 2:
2123             tcg_gen_shri_i64(cpu_M0, cpu_M0, (insn & 1) << 5);
2124             tcg_gen_extrl_i64_i32(tmp, cpu_M0);
2125             break;
2126         }
2127         store_reg(s, rd, tmp);
2128         break;
2129     case 0x117: case 0x517: case 0x917: case 0xd17:     /* TEXTRC */
2130         if ((insn & 0x000ff008) != 0x0003f000 || ((insn >> 22) & 3) == 3)
2131             return 1;
2132         tmp = iwmmxt_load_creg(ARM_IWMMXT_wCASF);
2133         switch ((insn >> 22) & 3) {
2134         case 0:
2135             tcg_gen_shri_i32(tmp, tmp, ((insn & 7) << 2) + 0);
2136             break;
2137         case 1:
2138             tcg_gen_shri_i32(tmp, tmp, ((insn & 3) << 3) + 4);
2139             break;
2140         case 2:
2141             tcg_gen_shri_i32(tmp, tmp, ((insn & 1) << 4) + 12);
2142             break;
2143         }
2144         tcg_gen_shli_i32(tmp, tmp, 28);
2145         gen_set_nzcv(tmp);
2146         tcg_temp_free_i32(tmp);
2147         break;
2148     case 0x401: case 0x405: case 0x409: case 0x40d:     /* TBCST */
2149         if (((insn >> 6) & 3) == 3)
2150             return 1;
2151         rd = (insn >> 12) & 0xf;
2152         wrd = (insn >> 16) & 0xf;
2153         tmp = load_reg(s, rd);
2154         switch ((insn >> 6) & 3) {
2155         case 0:
2156             gen_helper_iwmmxt_bcstb(cpu_M0, tmp);
2157             break;
2158         case 1:
2159             gen_helper_iwmmxt_bcstw(cpu_M0, tmp);
2160             break;
2161         case 2:
2162             gen_helper_iwmmxt_bcstl(cpu_M0, tmp);
2163             break;
2164         }
2165         tcg_temp_free_i32(tmp);
2166         gen_op_iwmmxt_movq_wRn_M0(wrd);
2167         gen_op_iwmmxt_set_mup();
2168         break;
2169     case 0x113: case 0x513: case 0x913: case 0xd13:     /* TANDC */
2170         if ((insn & 0x000ff00f) != 0x0003f000 || ((insn >> 22) & 3) == 3)
2171             return 1;
2172         tmp = iwmmxt_load_creg(ARM_IWMMXT_wCASF);
2173         tmp2 = tcg_temp_new_i32();
2174         tcg_gen_mov_i32(tmp2, tmp);
2175         switch ((insn >> 22) & 3) {
2176         case 0:
2177             for (i = 0; i < 7; i ++) {
2178                 tcg_gen_shli_i32(tmp2, tmp2, 4);
2179                 tcg_gen_and_i32(tmp, tmp, tmp2);
2180             }
2181             break;
2182         case 1:
2183             for (i = 0; i < 3; i ++) {
2184                 tcg_gen_shli_i32(tmp2, tmp2, 8);
2185                 tcg_gen_and_i32(tmp, tmp, tmp2);
2186             }
2187             break;
2188         case 2:
2189             tcg_gen_shli_i32(tmp2, tmp2, 16);
2190             tcg_gen_and_i32(tmp, tmp, tmp2);
2191             break;
2192         }
2193         gen_set_nzcv(tmp);
2194         tcg_temp_free_i32(tmp2);
2195         tcg_temp_free_i32(tmp);
2196         break;
2197     case 0x01c: case 0x41c: case 0x81c: case 0xc1c:     /* WACC */
2198         wrd = (insn >> 12) & 0xf;
2199         rd0 = (insn >> 16) & 0xf;
2200         gen_op_iwmmxt_movq_M0_wRn(rd0);
2201         switch ((insn >> 22) & 3) {
2202         case 0:
2203             gen_helper_iwmmxt_addcb(cpu_M0, cpu_M0);
2204             break;
2205         case 1:
2206             gen_helper_iwmmxt_addcw(cpu_M0, cpu_M0);
2207             break;
2208         case 2:
2209             gen_helper_iwmmxt_addcl(cpu_M0, cpu_M0);
2210             break;
2211         case 3:
2212             return 1;
2213         }
2214         gen_op_iwmmxt_movq_wRn_M0(wrd);
2215         gen_op_iwmmxt_set_mup();
2216         break;
2217     case 0x115: case 0x515: case 0x915: case 0xd15:     /* TORC */
2218         if ((insn & 0x000ff00f) != 0x0003f000 || ((insn >> 22) & 3) == 3)
2219             return 1;
2220         tmp = iwmmxt_load_creg(ARM_IWMMXT_wCASF);
2221         tmp2 = tcg_temp_new_i32();
2222         tcg_gen_mov_i32(tmp2, tmp);
2223         switch ((insn >> 22) & 3) {
2224         case 0:
2225             for (i = 0; i < 7; i ++) {
2226                 tcg_gen_shli_i32(tmp2, tmp2, 4);
2227                 tcg_gen_or_i32(tmp, tmp, tmp2);
2228             }
2229             break;
2230         case 1:
2231             for (i = 0; i < 3; i ++) {
2232                 tcg_gen_shli_i32(tmp2, tmp2, 8);
2233                 tcg_gen_or_i32(tmp, tmp, tmp2);
2234             }
2235             break;
2236         case 2:
2237             tcg_gen_shli_i32(tmp2, tmp2, 16);
2238             tcg_gen_or_i32(tmp, tmp, tmp2);
2239             break;
2240         }
2241         gen_set_nzcv(tmp);
2242         tcg_temp_free_i32(tmp2);
2243         tcg_temp_free_i32(tmp);
2244         break;
2245     case 0x103: case 0x503: case 0x903: case 0xd03:     /* TMOVMSK */
2246         rd = (insn >> 12) & 0xf;
2247         rd0 = (insn >> 16) & 0xf;
2248         if ((insn & 0xf) != 0 || ((insn >> 22) & 3) == 3)
2249             return 1;
2250         gen_op_iwmmxt_movq_M0_wRn(rd0);
2251         tmp = tcg_temp_new_i32();
2252         switch ((insn >> 22) & 3) {
2253         case 0:
2254             gen_helper_iwmmxt_msbb(tmp, cpu_M0);
2255             break;
2256         case 1:
2257             gen_helper_iwmmxt_msbw(tmp, cpu_M0);
2258             break;
2259         case 2:
2260             gen_helper_iwmmxt_msbl(tmp, cpu_M0);
2261             break;
2262         }
2263         store_reg(s, rd, tmp);
2264         break;
2265     case 0x106: case 0x306: case 0x506: case 0x706:     /* WCMPGT */
2266     case 0x906: case 0xb06: case 0xd06: case 0xf06:
2267         wrd = (insn >> 12) & 0xf;
2268         rd0 = (insn >> 16) & 0xf;
2269         rd1 = (insn >> 0) & 0xf;
2270         gen_op_iwmmxt_movq_M0_wRn(rd0);
2271         switch ((insn >> 22) & 3) {
2272         case 0:
2273             if (insn & (1 << 21))
2274                 gen_op_iwmmxt_cmpgtsb_M0_wRn(rd1);
2275             else
2276                 gen_op_iwmmxt_cmpgtub_M0_wRn(rd1);
2277             break;
2278         case 1:
2279             if (insn & (1 << 21))
2280                 gen_op_iwmmxt_cmpgtsw_M0_wRn(rd1);
2281             else
2282                 gen_op_iwmmxt_cmpgtuw_M0_wRn(rd1);
2283             break;
2284         case 2:
2285             if (insn & (1 << 21))
2286                 gen_op_iwmmxt_cmpgtsl_M0_wRn(rd1);
2287             else
2288                 gen_op_iwmmxt_cmpgtul_M0_wRn(rd1);
2289             break;
2290         case 3:
2291             return 1;
2292         }
2293         gen_op_iwmmxt_movq_wRn_M0(wrd);
2294         gen_op_iwmmxt_set_mup();
2295         gen_op_iwmmxt_set_cup();
2296         break;
2297     case 0x00e: case 0x20e: case 0x40e: case 0x60e:     /* WUNPCKEL */
2298     case 0x80e: case 0xa0e: case 0xc0e: case 0xe0e:
2299         wrd = (insn >> 12) & 0xf;
2300         rd0 = (insn >> 16) & 0xf;
2301         gen_op_iwmmxt_movq_M0_wRn(rd0);
2302         switch ((insn >> 22) & 3) {
2303         case 0:
2304             if (insn & (1 << 21))
2305                 gen_op_iwmmxt_unpacklsb_M0();
2306             else
2307                 gen_op_iwmmxt_unpacklub_M0();
2308             break;
2309         case 1:
2310             if (insn & (1 << 21))
2311                 gen_op_iwmmxt_unpacklsw_M0();
2312             else
2313                 gen_op_iwmmxt_unpackluw_M0();
2314             break;
2315         case 2:
2316             if (insn & (1 << 21))
2317                 gen_op_iwmmxt_unpacklsl_M0();
2318             else
2319                 gen_op_iwmmxt_unpacklul_M0();
2320             break;
2321         case 3:
2322             return 1;
2323         }
2324         gen_op_iwmmxt_movq_wRn_M0(wrd);
2325         gen_op_iwmmxt_set_mup();
2326         gen_op_iwmmxt_set_cup();
2327         break;
2328     case 0x00c: case 0x20c: case 0x40c: case 0x60c:     /* WUNPCKEH */
2329     case 0x80c: case 0xa0c: case 0xc0c: case 0xe0c:
2330         wrd = (insn >> 12) & 0xf;
2331         rd0 = (insn >> 16) & 0xf;
2332         gen_op_iwmmxt_movq_M0_wRn(rd0);
2333         switch ((insn >> 22) & 3) {
2334         case 0:
2335             if (insn & (1 << 21))
2336                 gen_op_iwmmxt_unpackhsb_M0();
2337             else
2338                 gen_op_iwmmxt_unpackhub_M0();
2339             break;
2340         case 1:
2341             if (insn & (1 << 21))
2342                 gen_op_iwmmxt_unpackhsw_M0();
2343             else
2344                 gen_op_iwmmxt_unpackhuw_M0();
2345             break;
2346         case 2:
2347             if (insn & (1 << 21))
2348                 gen_op_iwmmxt_unpackhsl_M0();
2349             else
2350                 gen_op_iwmmxt_unpackhul_M0();
2351             break;
2352         case 3:
2353             return 1;
2354         }
2355         gen_op_iwmmxt_movq_wRn_M0(wrd);
2356         gen_op_iwmmxt_set_mup();
2357         gen_op_iwmmxt_set_cup();
2358         break;
2359     case 0x204: case 0x604: case 0xa04: case 0xe04:     /* WSRL */
2360     case 0x214: case 0x614: case 0xa14: case 0xe14:
2361         if (((insn >> 22) & 3) == 0)
2362             return 1;
2363         wrd = (insn >> 12) & 0xf;
2364         rd0 = (insn >> 16) & 0xf;
2365         gen_op_iwmmxt_movq_M0_wRn(rd0);
2366         tmp = tcg_temp_new_i32();
2367         if (gen_iwmmxt_shift(insn, 0xff, tmp)) {
2368             tcg_temp_free_i32(tmp);
2369             return 1;
2370         }
2371         switch ((insn >> 22) & 3) {
2372         case 1:
2373             gen_helper_iwmmxt_srlw(cpu_M0, cpu_env, cpu_M0, tmp);
2374             break;
2375         case 2:
2376             gen_helper_iwmmxt_srll(cpu_M0, cpu_env, cpu_M0, tmp);
2377             break;
2378         case 3:
2379             gen_helper_iwmmxt_srlq(cpu_M0, cpu_env, cpu_M0, tmp);
2380             break;
2381         }
2382         tcg_temp_free_i32(tmp);
2383         gen_op_iwmmxt_movq_wRn_M0(wrd);
2384         gen_op_iwmmxt_set_mup();
2385         gen_op_iwmmxt_set_cup();
2386         break;
2387     case 0x004: case 0x404: case 0x804: case 0xc04:     /* WSRA */
2388     case 0x014: case 0x414: case 0x814: case 0xc14:
2389         if (((insn >> 22) & 3) == 0)
2390             return 1;
2391         wrd = (insn >> 12) & 0xf;
2392         rd0 = (insn >> 16) & 0xf;
2393         gen_op_iwmmxt_movq_M0_wRn(rd0);
2394         tmp = tcg_temp_new_i32();
2395         if (gen_iwmmxt_shift(insn, 0xff, tmp)) {
2396             tcg_temp_free_i32(tmp);
2397             return 1;
2398         }
2399         switch ((insn >> 22) & 3) {
2400         case 1:
2401             gen_helper_iwmmxt_sraw(cpu_M0, cpu_env, cpu_M0, tmp);
2402             break;
2403         case 2:
2404             gen_helper_iwmmxt_sral(cpu_M0, cpu_env, cpu_M0, tmp);
2405             break;
2406         case 3:
2407             gen_helper_iwmmxt_sraq(cpu_M0, cpu_env, cpu_M0, tmp);
2408             break;
2409         }
2410         tcg_temp_free_i32(tmp);
2411         gen_op_iwmmxt_movq_wRn_M0(wrd);
2412         gen_op_iwmmxt_set_mup();
2413         gen_op_iwmmxt_set_cup();
2414         break;
2415     case 0x104: case 0x504: case 0x904: case 0xd04:     /* WSLL */
2416     case 0x114: case 0x514: case 0x914: case 0xd14:
2417         if (((insn >> 22) & 3) == 0)
2418             return 1;
2419         wrd = (insn >> 12) & 0xf;
2420         rd0 = (insn >> 16) & 0xf;
2421         gen_op_iwmmxt_movq_M0_wRn(rd0);
2422         tmp = tcg_temp_new_i32();
2423         if (gen_iwmmxt_shift(insn, 0xff, tmp)) {
2424             tcg_temp_free_i32(tmp);
2425             return 1;
2426         }
2427         switch ((insn >> 22) & 3) {
2428         case 1:
2429             gen_helper_iwmmxt_sllw(cpu_M0, cpu_env, cpu_M0, tmp);
2430             break;
2431         case 2:
2432             gen_helper_iwmmxt_slll(cpu_M0, cpu_env, cpu_M0, tmp);
2433             break;
2434         case 3:
2435             gen_helper_iwmmxt_sllq(cpu_M0, cpu_env, cpu_M0, tmp);
2436             break;
2437         }
2438         tcg_temp_free_i32(tmp);
2439         gen_op_iwmmxt_movq_wRn_M0(wrd);
2440         gen_op_iwmmxt_set_mup();
2441         gen_op_iwmmxt_set_cup();
2442         break;
2443     case 0x304: case 0x704: case 0xb04: case 0xf04:     /* WROR */
2444     case 0x314: case 0x714: case 0xb14: case 0xf14:
2445         if (((insn >> 22) & 3) == 0)
2446             return 1;
2447         wrd = (insn >> 12) & 0xf;
2448         rd0 = (insn >> 16) & 0xf;
2449         gen_op_iwmmxt_movq_M0_wRn(rd0);
2450         tmp = tcg_temp_new_i32();
2451         switch ((insn >> 22) & 3) {
2452         case 1:
2453             if (gen_iwmmxt_shift(insn, 0xf, tmp)) {
2454                 tcg_temp_free_i32(tmp);
2455                 return 1;
2456             }
2457             gen_helper_iwmmxt_rorw(cpu_M0, cpu_env, cpu_M0, tmp);
2458             break;
2459         case 2:
2460             if (gen_iwmmxt_shift(insn, 0x1f, tmp)) {
2461                 tcg_temp_free_i32(tmp);
2462                 return 1;
2463             }
2464             gen_helper_iwmmxt_rorl(cpu_M0, cpu_env, cpu_M0, tmp);
2465             break;
2466         case 3:
2467             if (gen_iwmmxt_shift(insn, 0x3f, tmp)) {
2468                 tcg_temp_free_i32(tmp);
2469                 return 1;
2470             }
2471             gen_helper_iwmmxt_rorq(cpu_M0, cpu_env, cpu_M0, tmp);
2472             break;
2473         }
2474         tcg_temp_free_i32(tmp);
2475         gen_op_iwmmxt_movq_wRn_M0(wrd);
2476         gen_op_iwmmxt_set_mup();
2477         gen_op_iwmmxt_set_cup();
2478         break;
2479     case 0x116: case 0x316: case 0x516: case 0x716:     /* WMIN */
2480     case 0x916: case 0xb16: case 0xd16: case 0xf16:
2481         wrd = (insn >> 12) & 0xf;
2482         rd0 = (insn >> 16) & 0xf;
2483         rd1 = (insn >> 0) & 0xf;
2484         gen_op_iwmmxt_movq_M0_wRn(rd0);
2485         switch ((insn >> 22) & 3) {
2486         case 0:
2487             if (insn & (1 << 21))
2488                 gen_op_iwmmxt_minsb_M0_wRn(rd1);
2489             else
2490                 gen_op_iwmmxt_minub_M0_wRn(rd1);
2491             break;
2492         case 1:
2493             if (insn & (1 << 21))
2494                 gen_op_iwmmxt_minsw_M0_wRn(rd1);
2495             else
2496                 gen_op_iwmmxt_minuw_M0_wRn(rd1);
2497             break;
2498         case 2:
2499             if (insn & (1 << 21))
2500                 gen_op_iwmmxt_minsl_M0_wRn(rd1);
2501             else
2502                 gen_op_iwmmxt_minul_M0_wRn(rd1);
2503             break;
2504         case 3:
2505             return 1;
2506         }
2507         gen_op_iwmmxt_movq_wRn_M0(wrd);
2508         gen_op_iwmmxt_set_mup();
2509         break;
2510     case 0x016: case 0x216: case 0x416: case 0x616:     /* WMAX */
2511     case 0x816: case 0xa16: case 0xc16: case 0xe16:
2512         wrd = (insn >> 12) & 0xf;
2513         rd0 = (insn >> 16) & 0xf;
2514         rd1 = (insn >> 0) & 0xf;
2515         gen_op_iwmmxt_movq_M0_wRn(rd0);
2516         switch ((insn >> 22) & 3) {
2517         case 0:
2518             if (insn & (1 << 21))
2519                 gen_op_iwmmxt_maxsb_M0_wRn(rd1);
2520             else
2521                 gen_op_iwmmxt_maxub_M0_wRn(rd1);
2522             break;
2523         case 1:
2524             if (insn & (1 << 21))
2525                 gen_op_iwmmxt_maxsw_M0_wRn(rd1);
2526             else
2527                 gen_op_iwmmxt_maxuw_M0_wRn(rd1);
2528             break;
2529         case 2:
2530             if (insn & (1 << 21))
2531                 gen_op_iwmmxt_maxsl_M0_wRn(rd1);
2532             else
2533                 gen_op_iwmmxt_maxul_M0_wRn(rd1);
2534             break;
2535         case 3:
2536             return 1;
2537         }
2538         gen_op_iwmmxt_movq_wRn_M0(wrd);
2539         gen_op_iwmmxt_set_mup();
2540         break;
2541     case 0x002: case 0x102: case 0x202: case 0x302:     /* WALIGNI */
2542     case 0x402: case 0x502: case 0x602: case 0x702:
2543         wrd = (insn >> 12) & 0xf;
2544         rd0 = (insn >> 16) & 0xf;
2545         rd1 = (insn >> 0) & 0xf;
2546         gen_op_iwmmxt_movq_M0_wRn(rd0);
2547         tmp = tcg_const_i32((insn >> 20) & 3);
2548         iwmmxt_load_reg(cpu_V1, rd1);
2549         gen_helper_iwmmxt_align(cpu_M0, cpu_M0, cpu_V1, tmp);
2550         tcg_temp_free_i32(tmp);
2551         gen_op_iwmmxt_movq_wRn_M0(wrd);
2552         gen_op_iwmmxt_set_mup();
2553         break;
2554     case 0x01a: case 0x11a: case 0x21a: case 0x31a:     /* WSUB */
2555     case 0x41a: case 0x51a: case 0x61a: case 0x71a:
2556     case 0x81a: case 0x91a: case 0xa1a: case 0xb1a:
2557     case 0xc1a: case 0xd1a: case 0xe1a: case 0xf1a:
2558         wrd = (insn >> 12) & 0xf;
2559         rd0 = (insn >> 16) & 0xf;
2560         rd1 = (insn >> 0) & 0xf;
2561         gen_op_iwmmxt_movq_M0_wRn(rd0);
2562         switch ((insn >> 20) & 0xf) {
2563         case 0x0:
2564             gen_op_iwmmxt_subnb_M0_wRn(rd1);
2565             break;
2566         case 0x1:
2567             gen_op_iwmmxt_subub_M0_wRn(rd1);
2568             break;
2569         case 0x3:
2570             gen_op_iwmmxt_subsb_M0_wRn(rd1);
2571             break;
2572         case 0x4:
2573             gen_op_iwmmxt_subnw_M0_wRn(rd1);
2574             break;
2575         case 0x5:
2576             gen_op_iwmmxt_subuw_M0_wRn(rd1);
2577             break;
2578         case 0x7:
2579             gen_op_iwmmxt_subsw_M0_wRn(rd1);
2580             break;
2581         case 0x8:
2582             gen_op_iwmmxt_subnl_M0_wRn(rd1);
2583             break;
2584         case 0x9:
2585             gen_op_iwmmxt_subul_M0_wRn(rd1);
2586             break;
2587         case 0xb:
2588             gen_op_iwmmxt_subsl_M0_wRn(rd1);
2589             break;
2590         default:
2591             return 1;
2592         }
2593         gen_op_iwmmxt_movq_wRn_M0(wrd);
2594         gen_op_iwmmxt_set_mup();
2595         gen_op_iwmmxt_set_cup();
2596         break;
2597     case 0x01e: case 0x11e: case 0x21e: case 0x31e:     /* WSHUFH */
2598     case 0x41e: case 0x51e: case 0x61e: case 0x71e:
2599     case 0x81e: case 0x91e: case 0xa1e: case 0xb1e:
2600     case 0xc1e: case 0xd1e: case 0xe1e: case 0xf1e:
2601         wrd = (insn >> 12) & 0xf;
2602         rd0 = (insn >> 16) & 0xf;
2603         gen_op_iwmmxt_movq_M0_wRn(rd0);
2604         tmp = tcg_const_i32(((insn >> 16) & 0xf0) | (insn & 0x0f));
2605         gen_helper_iwmmxt_shufh(cpu_M0, cpu_env, cpu_M0, tmp);
2606         tcg_temp_free_i32(tmp);
2607         gen_op_iwmmxt_movq_wRn_M0(wrd);
2608         gen_op_iwmmxt_set_mup();
2609         gen_op_iwmmxt_set_cup();
2610         break;
2611     case 0x018: case 0x118: case 0x218: case 0x318:     /* WADD */
2612     case 0x418: case 0x518: case 0x618: case 0x718:
2613     case 0x818: case 0x918: case 0xa18: case 0xb18:
2614     case 0xc18: case 0xd18: case 0xe18: case 0xf18:
2615         wrd = (insn >> 12) & 0xf;
2616         rd0 = (insn >> 16) & 0xf;
2617         rd1 = (insn >> 0) & 0xf;
2618         gen_op_iwmmxt_movq_M0_wRn(rd0);
2619         switch ((insn >> 20) & 0xf) {
2620         case 0x0:
2621             gen_op_iwmmxt_addnb_M0_wRn(rd1);
2622             break;
2623         case 0x1:
2624             gen_op_iwmmxt_addub_M0_wRn(rd1);
2625             break;
2626         case 0x3:
2627             gen_op_iwmmxt_addsb_M0_wRn(rd1);
2628             break;
2629         case 0x4:
2630             gen_op_iwmmxt_addnw_M0_wRn(rd1);
2631             break;
2632         case 0x5:
2633             gen_op_iwmmxt_adduw_M0_wRn(rd1);
2634             break;
2635         case 0x7:
2636             gen_op_iwmmxt_addsw_M0_wRn(rd1);
2637             break;
2638         case 0x8:
2639             gen_op_iwmmxt_addnl_M0_wRn(rd1);
2640             break;
2641         case 0x9:
2642             gen_op_iwmmxt_addul_M0_wRn(rd1);
2643             break;
2644         case 0xb:
2645             gen_op_iwmmxt_addsl_M0_wRn(rd1);
2646             break;
2647         default:
2648             return 1;
2649         }
2650         gen_op_iwmmxt_movq_wRn_M0(wrd);
2651         gen_op_iwmmxt_set_mup();
2652         gen_op_iwmmxt_set_cup();
2653         break;
2654     case 0x008: case 0x108: case 0x208: case 0x308:     /* WPACK */
2655     case 0x408: case 0x508: case 0x608: case 0x708:
2656     case 0x808: case 0x908: case 0xa08: case 0xb08:
2657     case 0xc08: case 0xd08: case 0xe08: case 0xf08:
2658         if (!(insn & (1 << 20)) || ((insn >> 22) & 3) == 0)
2659             return 1;
2660         wrd = (insn >> 12) & 0xf;
2661         rd0 = (insn >> 16) & 0xf;
2662         rd1 = (insn >> 0) & 0xf;
2663         gen_op_iwmmxt_movq_M0_wRn(rd0);
2664         switch ((insn >> 22) & 3) {
2665         case 1:
2666             if (insn & (1 << 21))
2667                 gen_op_iwmmxt_packsw_M0_wRn(rd1);
2668             else
2669                 gen_op_iwmmxt_packuw_M0_wRn(rd1);
2670             break;
2671         case 2:
2672             if (insn & (1 << 21))
2673                 gen_op_iwmmxt_packsl_M0_wRn(rd1);
2674             else
2675                 gen_op_iwmmxt_packul_M0_wRn(rd1);
2676             break;
2677         case 3:
2678             if (insn & (1 << 21))
2679                 gen_op_iwmmxt_packsq_M0_wRn(rd1);
2680             else
2681                 gen_op_iwmmxt_packuq_M0_wRn(rd1);
2682             break;
2683         }
2684         gen_op_iwmmxt_movq_wRn_M0(wrd);
2685         gen_op_iwmmxt_set_mup();
2686         gen_op_iwmmxt_set_cup();
2687         break;
2688     case 0x201: case 0x203: case 0x205: case 0x207:
2689     case 0x209: case 0x20b: case 0x20d: case 0x20f:
2690     case 0x211: case 0x213: case 0x215: case 0x217:
2691     case 0x219: case 0x21b: case 0x21d: case 0x21f:
2692         wrd = (insn >> 5) & 0xf;
2693         rd0 = (insn >> 12) & 0xf;
2694         rd1 = (insn >> 0) & 0xf;
2695         if (rd0 == 0xf || rd1 == 0xf)
2696             return 1;
2697         gen_op_iwmmxt_movq_M0_wRn(wrd);
2698         tmp = load_reg(s, rd0);
2699         tmp2 = load_reg(s, rd1);
2700         switch ((insn >> 16) & 0xf) {
2701         case 0x0:                                       /* TMIA */
2702             gen_helper_iwmmxt_muladdsl(cpu_M0, cpu_M0, tmp, tmp2);
2703             break;
2704         case 0x8:                                       /* TMIAPH */
2705             gen_helper_iwmmxt_muladdsw(cpu_M0, cpu_M0, tmp, tmp2);
2706             break;
2707         case 0xc: case 0xd: case 0xe: case 0xf:                 /* TMIAxy */
2708             if (insn & (1 << 16))
2709                 tcg_gen_shri_i32(tmp, tmp, 16);
2710             if (insn & (1 << 17))
2711                 tcg_gen_shri_i32(tmp2, tmp2, 16);
2712             gen_helper_iwmmxt_muladdswl(cpu_M0, cpu_M0, tmp, tmp2);
2713             break;
2714         default:
2715             tcg_temp_free_i32(tmp2);
2716             tcg_temp_free_i32(tmp);
2717             return 1;
2718         }
2719         tcg_temp_free_i32(tmp2);
2720         tcg_temp_free_i32(tmp);
2721         gen_op_iwmmxt_movq_wRn_M0(wrd);
2722         gen_op_iwmmxt_set_mup();
2723         break;
2724     default:
2725         return 1;
2726     }
2727
2728     return 0;
2729 }
2730
2731 /* Disassemble an XScale DSP instruction.  Returns nonzero if an error occurred
2732    (ie. an undefined instruction).  */
2733 static int disas_dsp_insn(DisasContext *s, uint32_t insn)
2734 {
2735     int acc, rd0, rd1, rdhi, rdlo;
2736     TCGv_i32 tmp, tmp2;
2737
2738     if ((insn & 0x0ff00f10) == 0x0e200010) {
2739         /* Multiply with Internal Accumulate Format */
2740         rd0 = (insn >> 12) & 0xf;
2741         rd1 = insn & 0xf;
2742         acc = (insn >> 5) & 7;
2743
2744         if (acc != 0)
2745             return 1;
2746
2747         tmp = load_reg(s, rd0);
2748         tmp2 = load_reg(s, rd1);
2749         switch ((insn >> 16) & 0xf) {
2750         case 0x0:                                       /* MIA */
2751             gen_helper_iwmmxt_muladdsl(cpu_M0, cpu_M0, tmp, tmp2);
2752             break;
2753         case 0x8:                                       /* MIAPH */
2754             gen_helper_iwmmxt_muladdsw(cpu_M0, cpu_M0, tmp, tmp2);
2755             break;
2756         case 0xc:                                       /* MIABB */
2757         case 0xd:                                       /* MIABT */
2758         case 0xe:                                       /* MIATB */
2759         case 0xf:                                       /* MIATT */
2760             if (insn & (1 << 16))
2761                 tcg_gen_shri_i32(tmp, tmp, 16);
2762             if (insn & (1 << 17))
2763                 tcg_gen_shri_i32(tmp2, tmp2, 16);
2764             gen_helper_iwmmxt_muladdswl(cpu_M0, cpu_M0, tmp, tmp2);
2765             break;
2766         default:
2767             return 1;
2768         }
2769         tcg_temp_free_i32(tmp2);
2770         tcg_temp_free_i32(tmp);
2771
2772         gen_op_iwmmxt_movq_wRn_M0(acc);
2773         return 0;
2774     }
2775
2776     if ((insn & 0x0fe00ff8) == 0x0c400000) {
2777         /* Internal Accumulator Access Format */
2778         rdhi = (insn >> 16) & 0xf;
2779         rdlo = (insn >> 12) & 0xf;
2780         acc = insn & 7;
2781
2782         if (acc != 0)
2783             return 1;
2784
2785         if (insn & ARM_CP_RW_BIT) {                     /* MRA */
2786             iwmmxt_load_reg(cpu_V0, acc);
2787             tcg_gen_extrl_i64_i32(cpu_R[rdlo], cpu_V0);
2788             tcg_gen_extrh_i64_i32(cpu_R[rdhi], cpu_V0);
2789             tcg_gen_andi_i32(cpu_R[rdhi], cpu_R[rdhi], (1 << (40 - 32)) - 1);
2790         } else {                                        /* MAR */
2791             tcg_gen_concat_i32_i64(cpu_V0, cpu_R[rdlo], cpu_R[rdhi]);
2792             iwmmxt_store_reg(cpu_V0, acc);
2793         }
2794         return 0;
2795     }
2796
2797     return 1;
2798 }
2799
2800 #define VFP_REG_SHR(x, n) (((n) > 0) ? (x) >> (n) : (x) << -(n))
2801 #define VFP_SREG(insn, bigbit, smallbit) \
2802   ((VFP_REG_SHR(insn, bigbit - 1) & 0x1e) | (((insn) >> (smallbit)) & 1))
2803 #define VFP_DREG(reg, insn, bigbit, smallbit) do { \
2804     if (arm_dc_feature(s, ARM_FEATURE_VFP3)) { \
2805         reg = (((insn) >> (bigbit)) & 0x0f) \
2806               | (((insn) >> ((smallbit) - 4)) & 0x10); \
2807     } else { \
2808         if (insn & (1 << (smallbit))) \
2809             return 1; \
2810         reg = ((insn) >> (bigbit)) & 0x0f; \
2811     }} while (0)
2812
2813 #define VFP_SREG_D(insn) VFP_SREG(insn, 12, 22)
2814 #define VFP_DREG_D(reg, insn) VFP_DREG(reg, insn, 12, 22)
2815 #define VFP_SREG_N(insn) VFP_SREG(insn, 16,  7)
2816 #define VFP_DREG_N(reg, insn) VFP_DREG(reg, insn, 16,  7)
2817 #define VFP_SREG_M(insn) VFP_SREG(insn,  0,  5)
2818 #define VFP_DREG_M(reg, insn) VFP_DREG(reg, insn,  0,  5)
2819
2820 static void gen_neon_dup_low16(TCGv_i32 var)
2821 {
2822     TCGv_i32 tmp = tcg_temp_new_i32();
2823     tcg_gen_ext16u_i32(var, var);
2824     tcg_gen_shli_i32(tmp, var, 16);
2825     tcg_gen_or_i32(var, var, tmp);
2826     tcg_temp_free_i32(tmp);
2827 }
2828
2829 static void gen_neon_dup_high16(TCGv_i32 var)
2830 {
2831     TCGv_i32 tmp = tcg_temp_new_i32();
2832     tcg_gen_andi_i32(var, var, 0xffff0000);
2833     tcg_gen_shri_i32(tmp, var, 16);
2834     tcg_gen_or_i32(var, var, tmp);
2835     tcg_temp_free_i32(tmp);
2836 }
2837
2838 /*
2839  * Disassemble a VFP instruction.  Returns nonzero if an error occurred
2840  * (ie. an undefined instruction).
2841  */
2842 static int disas_vfp_insn(DisasContext *s, uint32_t insn)
2843 {
2844     if (!arm_dc_feature(s, ARM_FEATURE_VFP)) {
2845         return 1;
2846     }
2847
2848     /*
2849      * If the decodetree decoder handles this insn it will always
2850      * emit code to either execute the insn or generate an appropriate
2851      * exception; so we don't need to ever return non-zero to tell
2852      * the calling code to emit an UNDEF exception.
2853      */
2854     if (extract32(insn, 28, 4) == 0xf) {
2855         if (disas_vfp_uncond(s, insn)) {
2856             return 0;
2857         }
2858     } else {
2859         if (disas_vfp(s, insn)) {
2860             return 0;
2861         }
2862     }
2863     /* If the decodetree decoder didn't handle this insn, it must be UNDEF */
2864     return 1;
2865 }
2866
2867 static inline bool use_goto_tb(DisasContext *s, target_ulong dest)
2868 {
2869 #ifndef CONFIG_USER_ONLY
2870     return (s->base.tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK) ||
2871            ((s->base.pc_next - 1) & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK);
2872 #else
2873     return true;
2874 #endif
2875 }
2876
2877 static void gen_goto_ptr(void)
2878 {
2879     tcg_gen_lookup_and_goto_ptr();
2880 }
2881
2882 /* This will end the TB but doesn't guarantee we'll return to
2883  * cpu_loop_exec. Any live exit_requests will be processed as we
2884  * enter the next TB.
2885  */
2886 static void gen_goto_tb(DisasContext *s, int n, target_ulong dest)
2887 {
2888     if (use_goto_tb(s, dest)) {
2889         tcg_gen_goto_tb(n);
2890         gen_set_pc_im(s, dest);
2891         tcg_gen_exit_tb(s->base.tb, n);
2892     } else {
2893         gen_set_pc_im(s, dest);
2894         gen_goto_ptr();
2895     }
2896     s->base.is_jmp = DISAS_NORETURN;
2897 }
2898
2899 static inline void gen_jmp (DisasContext *s, uint32_t dest)
2900 {
2901     if (unlikely(is_singlestepping(s))) {
2902         /* An indirect jump so that we still trigger the debug exception.  */
2903         if (s->thumb)
2904             dest |= 1;
2905         gen_bx_im(s, dest);
2906     } else {
2907         gen_goto_tb(s, 0, dest);
2908     }
2909 }
2910
2911 static inline void gen_mulxy(TCGv_i32 t0, TCGv_i32 t1, int x, int y)
2912 {
2913     if (x)
2914         tcg_gen_sari_i32(t0, t0, 16);
2915     else
2916         gen_sxth(t0);
2917     if (y)
2918         tcg_gen_sari_i32(t1, t1, 16);
2919     else
2920         gen_sxth(t1);
2921     tcg_gen_mul_i32(t0, t0, t1);
2922 }
2923
2924 /* Return the mask of PSR bits set by a MSR instruction.  */
2925 static uint32_t msr_mask(DisasContext *s, int flags, int spsr)
2926 {
2927     uint32_t mask;
2928
2929     mask = 0;
2930     if (flags & (1 << 0))
2931         mask |= 0xff;
2932     if (flags & (1 << 1))
2933         mask |= 0xff00;
2934     if (flags & (1 << 2))
2935         mask |= 0xff0000;
2936     if (flags & (1 << 3))
2937         mask |= 0xff000000;
2938
2939     /* Mask out undefined bits.  */
2940     mask &= ~CPSR_RESERVED;
2941     if (!arm_dc_feature(s, ARM_FEATURE_V4T)) {
2942         mask &= ~CPSR_T;
2943     }
2944     if (!arm_dc_feature(s, ARM_FEATURE_V5)) {
2945         mask &= ~CPSR_Q; /* V5TE in reality*/
2946     }
2947     if (!arm_dc_feature(s, ARM_FEATURE_V6)) {
2948         mask &= ~(CPSR_E | CPSR_GE);
2949     }
2950     if (!arm_dc_feature(s, ARM_FEATURE_THUMB2)) {
2951         mask &= ~CPSR_IT;
2952     }
2953     /* Mask out execution state and reserved bits.  */
2954     if (!spsr) {
2955         mask &= ~(CPSR_EXEC | CPSR_RESERVED);
2956     }
2957     /* Mask out privileged bits.  */
2958     if (IS_USER(s))
2959         mask &= CPSR_USER;
2960     return mask;
2961 }
2962
2963 /* Returns nonzero if access to the PSR is not permitted. Marks t0 as dead. */
2964 static int gen_set_psr(DisasContext *s, uint32_t mask, int spsr, TCGv_i32 t0)
2965 {
2966     TCGv_i32 tmp;
2967     if (spsr) {
2968         /* ??? This is also undefined in system mode.  */
2969         if (IS_USER(s))
2970             return 1;
2971
2972         tmp = load_cpu_field(spsr);
2973         tcg_gen_andi_i32(tmp, tmp, ~mask);
2974         tcg_gen_andi_i32(t0, t0, mask);
2975         tcg_gen_or_i32(tmp, tmp, t0);
2976         store_cpu_field(tmp, spsr);
2977     } else {
2978         gen_set_cpsr(t0, mask);
2979     }
2980     tcg_temp_free_i32(t0);
2981     gen_lookup_tb(s);
2982     return 0;
2983 }
2984
2985 /* Returns nonzero if access to the PSR is not permitted.  */
2986 static int gen_set_psr_im(DisasContext *s, uint32_t mask, int spsr, uint32_t val)
2987 {
2988     TCGv_i32 tmp;
2989     tmp = tcg_temp_new_i32();
2990     tcg_gen_movi_i32(tmp, val);
2991     return gen_set_psr(s, mask, spsr, tmp);
2992 }
2993
2994 static bool msr_banked_access_decode(DisasContext *s, int r, int sysm, int rn,
2995                                      int *tgtmode, int *regno)
2996 {
2997     /* Decode the r and sysm fields of MSR/MRS banked accesses into
2998      * the target mode and register number, and identify the various
2999      * unpredictable cases.
3000      * MSR (banked) and MRS (banked) are CONSTRAINED UNPREDICTABLE if:
3001      *  + executed in user mode
3002      *  + using R15 as the src/dest register
3003      *  + accessing an unimplemented register
3004      *  + accessing a register that's inaccessible at current PL/security state*
3005      *  + accessing a register that you could access with a different insn
3006      * We choose to UNDEF in all these cases.
3007      * Since we don't know which of the various AArch32 modes we are in
3008      * we have to defer some checks to runtime.
3009      * Accesses to Monitor mode registers from Secure EL1 (which implies
3010      * that EL3 is AArch64) must trap to EL3.
3011      *
3012      * If the access checks fail this function will emit code to take
3013      * an exception and return false. Otherwise it will return true,
3014      * and set *tgtmode and *regno appropriately.
3015      */
3016     int exc_target = default_exception_el(s);
3017
3018     /* These instructions are present only in ARMv8, or in ARMv7 with the
3019      * Virtualization Extensions.
3020      */
3021     if (!arm_dc_feature(s, ARM_FEATURE_V8) &&
3022         !arm_dc_feature(s, ARM_FEATURE_EL2)) {
3023         goto undef;
3024     }
3025
3026     if (IS_USER(s) || rn == 15) {
3027         goto undef;
3028     }
3029
3030     /* The table in the v8 ARM ARM section F5.2.3 describes the encoding
3031      * of registers into (r, sysm).
3032      */
3033     if (r) {
3034         /* SPSRs for other modes */
3035         switch (sysm) {
3036         case 0xe: /* SPSR_fiq */
3037             *tgtmode = ARM_CPU_MODE_FIQ;
3038             break;
3039         case 0x10: /* SPSR_irq */
3040             *tgtmode = ARM_CPU_MODE_IRQ;
3041             break;
3042         case 0x12: /* SPSR_svc */
3043             *tgtmode = ARM_CPU_MODE_SVC;
3044             break;
3045         case 0x14: /* SPSR_abt */
3046             *tgtmode = ARM_CPU_MODE_ABT;
3047             break;
3048         case 0x16: /* SPSR_und */
3049             *tgtmode = ARM_CPU_MODE_UND;
3050             break;
3051         case 0x1c: /* SPSR_mon */
3052             *tgtmode = ARM_CPU_MODE_MON;
3053             break;
3054         case 0x1e: /* SPSR_hyp */
3055             *tgtmode = ARM_CPU_MODE_HYP;
3056             break;
3057         default: /* unallocated */
3058             goto undef;
3059         }
3060         /* We arbitrarily assign SPSR a register number of 16. */
3061         *regno = 16;
3062     } else {
3063         /* general purpose registers for other modes */
3064         switch (sysm) {
3065         case 0x0 ... 0x6:   /* 0b00xxx : r8_usr ... r14_usr */
3066             *tgtmode = ARM_CPU_MODE_USR;
3067             *regno = sysm + 8;
3068             break;
3069         case 0x8 ... 0xe:   /* 0b01xxx : r8_fiq ... r14_fiq */
3070             *tgtmode = ARM_CPU_MODE_FIQ;
3071             *regno = sysm;
3072             break;
3073         case 0x10 ... 0x11: /* 0b1000x : r14_irq, r13_irq */
3074             *tgtmode = ARM_CPU_MODE_IRQ;
3075             *regno = sysm & 1 ? 13 : 14;
3076             break;
3077         case 0x12 ... 0x13: /* 0b1001x : r14_svc, r13_svc */
3078             *tgtmode = ARM_CPU_MODE_SVC;
3079             *regno = sysm & 1 ? 13 : 14;
3080             break;
3081         case 0x14 ... 0x15: /* 0b1010x : r14_abt, r13_abt */
3082             *tgtmode = ARM_CPU_MODE_ABT;
3083             *regno = sysm & 1 ? 13 : 14;
3084             break;
3085         case 0x16 ... 0x17: /* 0b1011x : r14_und, r13_und */
3086             *tgtmode = ARM_CPU_MODE_UND;
3087             *regno = sysm & 1 ? 13 : 14;
3088             break;
3089         case 0x1c ... 0x1d: /* 0b1110x : r14_mon, r13_mon */
3090             *tgtmode = ARM_CPU_MODE_MON;
3091             *regno = sysm & 1 ? 13 : 14;
3092             break;
3093         case 0x1e ... 0x1f: /* 0b1111x : elr_hyp, r13_hyp */
3094             *tgtmode = ARM_CPU_MODE_HYP;
3095             /* Arbitrarily pick 17 for ELR_Hyp (which is not a banked LR!) */
3096             *regno = sysm & 1 ? 13 : 17;
3097             break;
3098         default: /* unallocated */
3099             goto undef;
3100         }
3101     }
3102
3103     /* Catch the 'accessing inaccessible register' cases we can detect
3104      * at translate time.
3105      */
3106     switch (*tgtmode) {
3107     case ARM_CPU_MODE_MON:
3108         if (!arm_dc_feature(s, ARM_FEATURE_EL3) || s->ns) {
3109             goto undef;
3110         }
3111         if (s->current_el == 1) {
3112             /* If we're in Secure EL1 (which implies that EL3 is AArch64)
3113              * then accesses to Mon registers trap to EL3
3114              */
3115             exc_target = 3;
3116             goto undef;
3117         }
3118         break;
3119     case ARM_CPU_MODE_HYP:
3120         /*
3121          * SPSR_hyp and r13_hyp can only be accessed from Monitor mode
3122          * (and so we can forbid accesses from EL2 or below). elr_hyp
3123          * can be accessed also from Hyp mode, so forbid accesses from
3124          * EL0 or EL1.
3125          */
3126         if (!arm_dc_feature(s, ARM_FEATURE_EL2) || s->current_el < 2 ||
3127             (s->current_el < 3 && *regno != 17)) {
3128             goto undef;
3129         }
3130         break;
3131     default:
3132         break;
3133     }
3134
3135     return true;
3136
3137 undef:
3138     /* If we get here then some access check did not pass */
3139     gen_exception_insn(s, s->pc_curr, EXCP_UDEF,
3140                        syn_uncategorized(), exc_target);
3141     return false;
3142 }
3143
3144 static void gen_msr_banked(DisasContext *s, int r, int sysm, int rn)
3145 {
3146     TCGv_i32 tcg_reg, tcg_tgtmode, tcg_regno;
3147     int tgtmode = 0, regno = 0;
3148
3149     if (!msr_banked_access_decode(s, r, sysm, rn, &tgtmode, &regno)) {
3150         return;
3151     }
3152
3153     /* Sync state because msr_banked() can raise exceptions */
3154     gen_set_condexec(s);
3155     gen_set_pc_im(s, s->pc_curr);
3156     tcg_reg = load_reg(s, rn);
3157     tcg_tgtmode = tcg_const_i32(tgtmode);
3158     tcg_regno = tcg_const_i32(regno);
3159     gen_helper_msr_banked(cpu_env, tcg_reg, tcg_tgtmode, tcg_regno);
3160     tcg_temp_free_i32(tcg_tgtmode);
3161     tcg_temp_free_i32(tcg_regno);
3162     tcg_temp_free_i32(tcg_reg);
3163     s->base.is_jmp = DISAS_UPDATE;
3164 }
3165
3166 static void gen_mrs_banked(DisasContext *s, int r, int sysm, int rn)
3167 {
3168     TCGv_i32 tcg_reg, tcg_tgtmode, tcg_regno;
3169     int tgtmode = 0, regno = 0;
3170
3171     if (!msr_banked_access_decode(s, r, sysm, rn, &tgtmode, &regno)) {
3172         return;
3173     }
3174
3175     /* Sync state because mrs_banked() can raise exceptions */
3176     gen_set_condexec(s);
3177     gen_set_pc_im(s, s->pc_curr);
3178     tcg_reg = tcg_temp_new_i32();
3179     tcg_tgtmode = tcg_const_i32(tgtmode);
3180     tcg_regno = tcg_const_i32(regno);
3181     gen_helper_mrs_banked(tcg_reg, cpu_env, tcg_tgtmode, tcg_regno);
3182     tcg_temp_free_i32(tcg_tgtmode);
3183     tcg_temp_free_i32(tcg_regno);
3184     store_reg(s, rn, tcg_reg);
3185     s->base.is_jmp = DISAS_UPDATE;
3186 }
3187
3188 /* Store value to PC as for an exception return (ie don't
3189  * mask bits). The subsequent call to gen_helper_cpsr_write_eret()
3190  * will do the masking based on the new value of the Thumb bit.
3191  */
3192 static void store_pc_exc_ret(DisasContext *s, TCGv_i32 pc)
3193 {
3194     tcg_gen_mov_i32(cpu_R[15], pc);
3195     tcg_temp_free_i32(pc);
3196 }
3197
3198 /* Generate a v6 exception return.  Marks both values as dead.  */
3199 static void gen_rfe(DisasContext *s, TCGv_i32 pc, TCGv_i32 cpsr)
3200 {
3201     store_pc_exc_ret(s, pc);
3202     /* The cpsr_write_eret helper will mask the low bits of PC
3203      * appropriately depending on the new Thumb bit, so it must
3204      * be called after storing the new PC.
3205      */
3206     if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
3207         gen_io_start();
3208     }
3209     gen_helper_cpsr_write_eret(cpu_env, cpsr);
3210     tcg_temp_free_i32(cpsr);
3211     /* Must exit loop to check un-masked IRQs */
3212     s->base.is_jmp = DISAS_EXIT;
3213 }
3214
3215 /* Generate an old-style exception return. Marks pc as dead. */
3216 static void gen_exception_return(DisasContext *s, TCGv_i32 pc)
3217 {
3218     gen_rfe(s, pc, load_cpu_field(spsr));
3219 }
3220
3221 /*
3222  * For WFI we will halt the vCPU until an IRQ. For WFE and YIELD we
3223  * only call the helper when running single threaded TCG code to ensure
3224  * the next round-robin scheduled vCPU gets a crack. In MTTCG mode we
3225  * just skip this instruction. Currently the SEV/SEVL instructions
3226  * which are *one* of many ways to wake the CPU from WFE are not
3227  * implemented so we can't sleep like WFI does.
3228  */
3229 static void gen_nop_hint(DisasContext *s, int val)
3230 {
3231     switch (val) {
3232         /* When running in MTTCG we don't generate jumps to the yield and
3233          * WFE helpers as it won't affect the scheduling of other vCPUs.
3234          * If we wanted to more completely model WFE/SEV so we don't busy
3235          * spin unnecessarily we would need to do something more involved.
3236          */
3237     case 1: /* yield */
3238         if (!(tb_cflags(s->base.tb) & CF_PARALLEL)) {
3239             gen_set_pc_im(s, s->base.pc_next);
3240             s->base.is_jmp = DISAS_YIELD;
3241         }
3242         break;
3243     case 3: /* wfi */
3244         gen_set_pc_im(s, s->base.pc_next);
3245         s->base.is_jmp = DISAS_WFI;
3246         break;
3247     case 2: /* wfe */
3248         if (!(tb_cflags(s->base.tb) & CF_PARALLEL)) {
3249             gen_set_pc_im(s, s->base.pc_next);
3250             s->base.is_jmp = DISAS_WFE;
3251         }
3252         break;
3253     case 4: /* sev */
3254     case 5: /* sevl */
3255         /* TODO: Implement SEV, SEVL and WFE.  May help SMP performance.  */
3256     default: /* nop */
3257         break;
3258     }
3259 }
3260
3261 #define CPU_V001 cpu_V0, cpu_V0, cpu_V1
3262
3263 static inline void gen_neon_add(int size, TCGv_i32 t0, TCGv_i32 t1)
3264 {
3265     switch (size) {
3266     case 0: gen_helper_neon_add_u8(t0, t0, t1); break;
3267     case 1: gen_helper_neon_add_u16(t0, t0, t1); break;
3268     case 2: tcg_gen_add_i32(t0, t0, t1); break;
3269     default: abort();
3270     }
3271 }
3272
3273 static inline void gen_neon_rsb(int size, TCGv_i32 t0, TCGv_i32 t1)
3274 {
3275     switch (size) {
3276     case 0: gen_helper_neon_sub_u8(t0, t1, t0); break;
3277     case 1: gen_helper_neon_sub_u16(t0, t1, t0); break;
3278     case 2: tcg_gen_sub_i32(t0, t1, t0); break;
3279     default: return;
3280     }
3281 }
3282
3283 /* 32-bit pairwise ops end up the same as the elementwise versions.  */
3284 #define gen_helper_neon_pmax_s32  tcg_gen_smax_i32
3285 #define gen_helper_neon_pmax_u32  tcg_gen_umax_i32
3286 #define gen_helper_neon_pmin_s32  tcg_gen_smin_i32
3287 #define gen_helper_neon_pmin_u32  tcg_gen_umin_i32
3288
3289 #define GEN_NEON_INTEGER_OP_ENV(name) do { \
3290     switch ((size << 1) | u) { \
3291     case 0: \
3292         gen_helper_neon_##name##_s8(tmp, cpu_env, tmp, tmp2); \
3293         break; \
3294     case 1: \
3295         gen_helper_neon_##name##_u8(tmp, cpu_env, tmp, tmp2); \
3296         break; \
3297     case 2: \
3298         gen_helper_neon_##name##_s16(tmp, cpu_env, tmp, tmp2); \
3299         break; \
3300     case 3: \
3301         gen_helper_neon_##name##_u16(tmp, cpu_env, tmp, tmp2); \
3302         break; \
3303     case 4: \
3304         gen_helper_neon_##name##_s32(tmp, cpu_env, tmp, tmp2); \
3305         break; \
3306     case 5: \
3307         gen_helper_neon_##name##_u32(tmp, cpu_env, tmp, tmp2); \
3308         break; \
3309     default: return 1; \
3310     }} while (0)
3311
3312 #define GEN_NEON_INTEGER_OP(name) do { \
3313     switch ((size << 1) | u) { \
3314     case 0: \
3315         gen_helper_neon_##name##_s8(tmp, tmp, tmp2); \
3316         break; \
3317     case 1: \
3318         gen_helper_neon_##name##_u8(tmp, tmp, tmp2); \
3319         break; \
3320     case 2: \
3321         gen_helper_neon_##name##_s16(tmp, tmp, tmp2); \
3322         break; \
3323     case 3: \
3324         gen_helper_neon_##name##_u16(tmp, tmp, tmp2); \
3325         break; \
3326     case 4: \
3327         gen_helper_neon_##name##_s32(tmp, tmp, tmp2); \
3328         break; \
3329     case 5: \
3330         gen_helper_neon_##name##_u32(tmp, tmp, tmp2); \
3331         break; \
3332     default: return 1; \
3333     }} while (0)
3334
3335 static TCGv_i32 neon_load_scratch(int scratch)
3336 {
3337     TCGv_i32 tmp = tcg_temp_new_i32();
3338     tcg_gen_ld_i32(tmp, cpu_env, offsetof(CPUARMState, vfp.scratch[scratch]));
3339     return tmp;
3340 }
3341
3342 static void neon_store_scratch(int scratch, TCGv_i32 var)
3343 {
3344     tcg_gen_st_i32(var, cpu_env, offsetof(CPUARMState, vfp.scratch[scratch]));
3345     tcg_temp_free_i32(var);
3346 }
3347
3348 static inline TCGv_i32 neon_get_scalar(int size, int reg)
3349 {
3350     TCGv_i32 tmp;
3351     if (size == 1) {
3352         tmp = neon_load_reg(reg & 7, reg >> 4);
3353         if (reg & 8) {
3354             gen_neon_dup_high16(tmp);
3355         } else {
3356             gen_neon_dup_low16(tmp);
3357         }
3358     } else {
3359         tmp = neon_load_reg(reg & 15, reg >> 4);
3360     }
3361     return tmp;
3362 }
3363
3364 static int gen_neon_unzip(int rd, int rm, int size, int q)
3365 {
3366     TCGv_ptr pd, pm;
3367     
3368     if (!q && size == 2) {
3369         return 1;
3370     }
3371     pd = vfp_reg_ptr(true, rd);
3372     pm = vfp_reg_ptr(true, rm);
3373     if (q) {
3374         switch (size) {
3375         case 0:
3376             gen_helper_neon_qunzip8(pd, pm);
3377             break;
3378         case 1:
3379             gen_helper_neon_qunzip16(pd, pm);
3380             break;
3381         case 2:
3382             gen_helper_neon_qunzip32(pd, pm);
3383             break;
3384         default:
3385             abort();
3386         }
3387     } else {
3388         switch (size) {
3389         case 0:
3390             gen_helper_neon_unzip8(pd, pm);
3391             break;
3392         case 1:
3393             gen_helper_neon_unzip16(pd, pm);
3394             break;
3395         default:
3396             abort();
3397         }
3398     }
3399     tcg_temp_free_ptr(pd);
3400     tcg_temp_free_ptr(pm);
3401     return 0;
3402 }
3403
3404 static int gen_neon_zip(int rd, int rm, int size, int q)
3405 {
3406     TCGv_ptr pd, pm;
3407
3408     if (!q && size == 2) {
3409         return 1;
3410     }
3411     pd = vfp_reg_ptr(true, rd);
3412     pm = vfp_reg_ptr(true, rm);
3413     if (q) {
3414         switch (size) {
3415         case 0:
3416             gen_helper_neon_qzip8(pd, pm);
3417             break;
3418         case 1:
3419             gen_helper_neon_qzip16(pd, pm);
3420             break;
3421         case 2:
3422             gen_helper_neon_qzip32(pd, pm);
3423             break;
3424         default:
3425             abort();
3426         }
3427     } else {
3428         switch (size) {
3429         case 0:
3430             gen_helper_neon_zip8(pd, pm);
3431             break;
3432         case 1:
3433             gen_helper_neon_zip16(pd, pm);
3434             break;
3435         default:
3436             abort();
3437         }
3438     }
3439     tcg_temp_free_ptr(pd);
3440     tcg_temp_free_ptr(pm);
3441     return 0;
3442 }
3443
3444 static void gen_neon_trn_u8(TCGv_i32 t0, TCGv_i32 t1)
3445 {
3446     TCGv_i32 rd, tmp;
3447
3448     rd = tcg_temp_new_i32();
3449     tmp = tcg_temp_new_i32();
3450
3451     tcg_gen_shli_i32(rd, t0, 8);
3452     tcg_gen_andi_i32(rd, rd, 0xff00ff00);
3453     tcg_gen_andi_i32(tmp, t1, 0x00ff00ff);
3454     tcg_gen_or_i32(rd, rd, tmp);
3455
3456     tcg_gen_shri_i32(t1, t1, 8);
3457     tcg_gen_andi_i32(t1, t1, 0x00ff00ff);
3458     tcg_gen_andi_i32(tmp, t0, 0xff00ff00);
3459     tcg_gen_or_i32(t1, t1, tmp);
3460     tcg_gen_mov_i32(t0, rd);
3461
3462     tcg_temp_free_i32(tmp);
3463     tcg_temp_free_i32(rd);
3464 }
3465
3466 static void gen_neon_trn_u16(TCGv_i32 t0, TCGv_i32 t1)
3467 {
3468     TCGv_i32 rd, tmp;
3469
3470     rd = tcg_temp_new_i32();
3471     tmp = tcg_temp_new_i32();
3472
3473     tcg_gen_shli_i32(rd, t0, 16);
3474     tcg_gen_andi_i32(tmp, t1, 0xffff);
3475     tcg_gen_or_i32(rd, rd, tmp);
3476     tcg_gen_shri_i32(t1, t1, 16);
3477     tcg_gen_andi_i32(tmp, t0, 0xffff0000);
3478     tcg_gen_or_i32(t1, t1, tmp);
3479     tcg_gen_mov_i32(t0, rd);
3480
3481     tcg_temp_free_i32(tmp);
3482     tcg_temp_free_i32(rd);
3483 }
3484
3485
3486 static struct {
3487     int nregs;
3488     int interleave;
3489     int spacing;
3490 } const neon_ls_element_type[11] = {
3491     {1, 4, 1},
3492     {1, 4, 2},
3493     {4, 1, 1},
3494     {2, 2, 2},
3495     {1, 3, 1},
3496     {1, 3, 2},
3497     {3, 1, 1},
3498     {1, 1, 1},
3499     {1, 2, 1},
3500     {1, 2, 2},
3501     {2, 1, 1}
3502 };
3503
3504 /* Translate a NEON load/store element instruction.  Return nonzero if the
3505    instruction is invalid.  */
3506 static int disas_neon_ls_insn(DisasContext *s, uint32_t insn)
3507 {
3508     int rd, rn, rm;
3509     int op;
3510     int nregs;
3511     int interleave;
3512     int spacing;
3513     int stride;
3514     int size;
3515     int reg;
3516     int load;
3517     int n;
3518     int vec_size;
3519     int mmu_idx;
3520     MemOp endian;
3521     TCGv_i32 addr;
3522     TCGv_i32 tmp;
3523     TCGv_i32 tmp2;
3524     TCGv_i64 tmp64;
3525
3526     /* FIXME: this access check should not take precedence over UNDEF
3527      * for invalid encodings; we will generate incorrect syndrome information
3528      * for attempts to execute invalid vfp/neon encodings with FP disabled.
3529      */
3530     if (s->fp_excp_el) {
3531         gen_exception_insn(s, s->pc_curr, EXCP_UDEF,
3532                            syn_simd_access_trap(1, 0xe, false), s->fp_excp_el);
3533         return 0;
3534     }
3535
3536     if (!s->vfp_enabled)
3537       return 1;
3538     VFP_DREG_D(rd, insn);
3539     rn = (insn >> 16) & 0xf;
3540     rm = insn & 0xf;
3541     load = (insn & (1 << 21)) != 0;
3542     endian = s->be_data;
3543     mmu_idx = get_mem_index(s);
3544     if ((insn & (1 << 23)) == 0) {
3545         /* Load store all elements.  */
3546         op = (insn >> 8) & 0xf;
3547         size = (insn >> 6) & 3;
3548         if (op > 10)
3549             return 1;
3550         /* Catch UNDEF cases for bad values of align field */
3551         switch (op & 0xc) {
3552         case 4:
3553             if (((insn >> 5) & 1) == 1) {
3554                 return 1;
3555             }
3556             break;
3557         case 8:
3558             if (((insn >> 4) & 3) == 3) {
3559                 return 1;
3560             }
3561             break;
3562         default:
3563             break;
3564         }
3565         nregs = neon_ls_element_type[op].nregs;
3566         interleave = neon_ls_element_type[op].interleave;
3567         spacing = neon_ls_element_type[op].spacing;
3568         if (size == 3 && (interleave | spacing) != 1) {
3569             return 1;
3570         }
3571         /* For our purposes, bytes are always little-endian.  */
3572         if (size == 0) {
3573             endian = MO_LE;
3574         }
3575         /* Consecutive little-endian elements from a single register
3576          * can be promoted to a larger little-endian operation.
3577          */
3578         if (interleave == 1 && endian == MO_LE) {
3579             size = 3;
3580         }
3581         tmp64 = tcg_temp_new_i64();
3582         addr = tcg_temp_new_i32();
3583         tmp2 = tcg_const_i32(1 << size);
3584         load_reg_var(s, addr, rn);
3585         for (reg = 0; reg < nregs; reg++) {
3586             for (n = 0; n < 8 >> size; n++) {
3587                 int xs;
3588                 for (xs = 0; xs < interleave; xs++) {
3589                     int tt = rd + reg + spacing * xs;
3590
3591                     if (load) {
3592                         gen_aa32_ld_i64(s, tmp64, addr, mmu_idx, endian | size);
3593                         neon_store_element64(tt, n, size, tmp64);
3594                     } else {
3595                         neon_load_element64(tmp64, tt, n, size);
3596                         gen_aa32_st_i64(s, tmp64, addr, mmu_idx, endian | size);
3597                     }
3598                     tcg_gen_add_i32(addr, addr, tmp2);
3599                 }
3600             }
3601         }
3602         tcg_temp_free_i32(addr);
3603         tcg_temp_free_i32(tmp2);
3604         tcg_temp_free_i64(tmp64);
3605         stride = nregs * interleave * 8;
3606     } else {
3607         size = (insn >> 10) & 3;
3608         if (size == 3) {
3609             /* Load single element to all lanes.  */
3610             int a = (insn >> 4) & 1;
3611             if (!load) {
3612                 return 1;
3613             }
3614             size = (insn >> 6) & 3;
3615             nregs = ((insn >> 8) & 3) + 1;
3616
3617             if (size == 3) {
3618                 if (nregs != 4 || a == 0) {
3619                     return 1;
3620                 }
3621                 /* For VLD4 size==3 a == 1 means 32 bits at 16 byte alignment */
3622                 size = 2;
3623             }
3624             if (nregs == 1 && a == 1 && size == 0) {
3625                 return 1;
3626             }
3627             if (nregs == 3 && a == 1) {
3628                 return 1;
3629             }
3630             addr = tcg_temp_new_i32();
3631             load_reg_var(s, addr, rn);
3632
3633             /* VLD1 to all lanes: bit 5 indicates how many Dregs to write.
3634              * VLD2/3/4 to all lanes: bit 5 indicates register stride.
3635              */
3636             stride = (insn & (1 << 5)) ? 2 : 1;
3637             vec_size = nregs == 1 ? stride * 8 : 8;
3638
3639             tmp = tcg_temp_new_i32();
3640             for (reg = 0; reg < nregs; reg++) {
3641                 gen_aa32_ld_i32(s, tmp, addr, get_mem_index(s),
3642                                 s->be_data | size);
3643                 if ((rd & 1) && vec_size == 16) {
3644                     /* We cannot write 16 bytes at once because the
3645                      * destination is unaligned.
3646                      */
3647                     tcg_gen_gvec_dup_i32(size, neon_reg_offset(rd, 0),
3648                                          8, 8, tmp);
3649                     tcg_gen_gvec_mov(0, neon_reg_offset(rd + 1, 0),
3650                                      neon_reg_offset(rd, 0), 8, 8);
3651                 } else {
3652                     tcg_gen_gvec_dup_i32(size, neon_reg_offset(rd, 0),
3653                                          vec_size, vec_size, tmp);
3654                 }
3655                 tcg_gen_addi_i32(addr, addr, 1 << size);
3656                 rd += stride;
3657             }
3658             tcg_temp_free_i32(tmp);
3659             tcg_temp_free_i32(addr);
3660             stride = (1 << size) * nregs;
3661         } else {
3662             /* Single element.  */
3663             int idx = (insn >> 4) & 0xf;
3664             int reg_idx;
3665             switch (size) {
3666             case 0:
3667                 reg_idx = (insn >> 5) & 7;
3668                 stride = 1;
3669                 break;
3670             case 1:
3671                 reg_idx = (insn >> 6) & 3;
3672                 stride = (insn & (1 << 5)) ? 2 : 1;
3673                 break;
3674             case 2:
3675                 reg_idx = (insn >> 7) & 1;
3676                 stride = (insn & (1 << 6)) ? 2 : 1;
3677                 break;
3678             default:
3679                 abort();
3680             }
3681             nregs = ((insn >> 8) & 3) + 1;
3682             /* Catch the UNDEF cases. This is unavoidably a bit messy. */
3683             switch (nregs) {
3684             case 1:
3685                 if (((idx & (1 << size)) != 0) ||
3686                     (size == 2 && ((idx & 3) == 1 || (idx & 3) == 2))) {
3687                     return 1;
3688                 }
3689                 break;
3690             case 3:
3691                 if ((idx & 1) != 0) {
3692                     return 1;
3693                 }
3694                 /* fall through */
3695             case 2:
3696                 if (size == 2 && (idx & 2) != 0) {
3697                     return 1;
3698                 }
3699                 break;
3700             case 4:
3701                 if ((size == 2) && ((idx & 3) == 3)) {
3702                     return 1;
3703                 }
3704                 break;
3705             default:
3706                 abort();
3707             }
3708             if ((rd + stride * (nregs - 1)) > 31) {
3709                 /* Attempts to write off the end of the register file
3710                  * are UNPREDICTABLE; we choose to UNDEF because otherwise
3711                  * the neon_load_reg() would write off the end of the array.
3712                  */
3713                 return 1;
3714             }
3715             tmp = tcg_temp_new_i32();
3716             addr = tcg_temp_new_i32();
3717             load_reg_var(s, addr, rn);
3718             for (reg = 0; reg < nregs; reg++) {
3719                 if (load) {
3720                     gen_aa32_ld_i32(s, tmp, addr, get_mem_index(s),
3721                                     s->be_data | size);
3722                     neon_store_element(rd, reg_idx, size, tmp);
3723                 } else { /* Store */
3724                     neon_load_element(tmp, rd, reg_idx, size);
3725                     gen_aa32_st_i32(s, tmp, addr, get_mem_index(s),
3726                                     s->be_data | size);
3727                 }
3728                 rd += stride;
3729                 tcg_gen_addi_i32(addr, addr, 1 << size);
3730             }
3731             tcg_temp_free_i32(addr);
3732             tcg_temp_free_i32(tmp);
3733             stride = nregs * (1 << size);
3734         }
3735     }
3736     if (rm != 15) {
3737         TCGv_i32 base;
3738
3739         base = load_reg(s, rn);
3740         if (rm == 13) {
3741             tcg_gen_addi_i32(base, base, stride);
3742         } else {
3743             TCGv_i32 index;
3744             index = load_reg(s, rm);
3745             tcg_gen_add_i32(base, base, index);
3746             tcg_temp_free_i32(index);
3747         }
3748         store_reg(s, rn, base);
3749     }
3750     return 0;
3751 }
3752
3753 static inline void gen_neon_narrow(int size, TCGv_i32 dest, TCGv_i64 src)
3754 {
3755     switch (size) {
3756     case 0: gen_helper_neon_narrow_u8(dest, src); break;
3757     case 1: gen_helper_neon_narrow_u16(dest, src); break;
3758     case 2: tcg_gen_extrl_i64_i32(dest, src); break;
3759     default: abort();
3760     }
3761 }
3762
3763 static inline void gen_neon_narrow_sats(int size, TCGv_i32 dest, TCGv_i64 src)
3764 {
3765     switch (size) {
3766     case 0: gen_helper_neon_narrow_sat_s8(dest, cpu_env, src); break;
3767     case 1: gen_helper_neon_narrow_sat_s16(dest, cpu_env, src); break;
3768     case 2: gen_helper_neon_narrow_sat_s32(dest, cpu_env, src); break;
3769     default: abort();
3770     }
3771 }
3772
3773 static inline void gen_neon_narrow_satu(int size, TCGv_i32 dest, TCGv_i64 src)
3774 {
3775     switch (size) {
3776     case 0: gen_helper_neon_narrow_sat_u8(dest, cpu_env, src); break;
3777     case 1: gen_helper_neon_narrow_sat_u16(dest, cpu_env, src); break;
3778     case 2: gen_helper_neon_narrow_sat_u32(dest, cpu_env, src); break;
3779     default: abort();
3780     }
3781 }
3782
3783 static inline void gen_neon_unarrow_sats(int size, TCGv_i32 dest, TCGv_i64 src)
3784 {
3785     switch (size) {
3786     case 0: gen_helper_neon_unarrow_sat8(dest, cpu_env, src); break;
3787     case 1: gen_helper_neon_unarrow_sat16(dest, cpu_env, src); break;
3788     case 2: gen_helper_neon_unarrow_sat32(dest, cpu_env, src); break;
3789     default: abort();
3790     }
3791 }
3792
3793 static inline void gen_neon_shift_narrow(int size, TCGv_i32 var, TCGv_i32 shift,
3794                                          int q, int u)
3795 {
3796     if (q) {
3797         if (u) {
3798             switch (size) {
3799             case 1: gen_helper_neon_rshl_u16(var, var, shift); break;
3800             case 2: gen_helper_neon_rshl_u32(var, var, shift); break;
3801             default: abort();
3802             }
3803         } else {
3804             switch (size) {
3805             case 1: gen_helper_neon_rshl_s16(var, var, shift); break;
3806             case 2: gen_helper_neon_rshl_s32(var, var, shift); break;
3807             default: abort();
3808             }
3809         }
3810     } else {
3811         if (u) {
3812             switch (size) {
3813             case 1: gen_helper_neon_shl_u16(var, var, shift); break;
3814             case 2: gen_helper_neon_shl_u32(var, var, shift); break;
3815             default: abort();
3816             }
3817         } else {
3818             switch (size) {
3819             case 1: gen_helper_neon_shl_s16(var, var, shift); break;
3820             case 2: gen_helper_neon_shl_s32(var, var, shift); break;
3821             default: abort();
3822             }
3823         }
3824     }
3825 }
3826
3827 static inline void gen_neon_widen(TCGv_i64 dest, TCGv_i32 src, int size, int u)
3828 {
3829     if (u) {
3830         switch (size) {
3831         case 0: gen_helper_neon_widen_u8(dest, src); break;
3832         case 1: gen_helper_neon_widen_u16(dest, src); break;
3833         case 2: tcg_gen_extu_i32_i64(dest, src); break;
3834         default: abort();
3835         }
3836     } else {
3837         switch (size) {
3838         case 0: gen_helper_neon_widen_s8(dest, src); break;
3839         case 1: gen_helper_neon_widen_s16(dest, src); break;
3840         case 2: tcg_gen_ext_i32_i64(dest, src); break;
3841         default: abort();
3842         }
3843     }
3844     tcg_temp_free_i32(src);
3845 }
3846
3847 static inline void gen_neon_addl(int size)
3848 {
3849     switch (size) {
3850     case 0: gen_helper_neon_addl_u16(CPU_V001); break;
3851     case 1: gen_helper_neon_addl_u32(CPU_V001); break;
3852     case 2: tcg_gen_add_i64(CPU_V001); break;
3853     default: abort();
3854     }
3855 }
3856
3857 static inline void gen_neon_subl(int size)
3858 {
3859     switch (size) {
3860     case 0: gen_helper_neon_subl_u16(CPU_V001); break;
3861     case 1: gen_helper_neon_subl_u32(CPU_V001); break;
3862     case 2: tcg_gen_sub_i64(CPU_V001); break;
3863     default: abort();
3864     }
3865 }
3866
3867 static inline void gen_neon_negl(TCGv_i64 var, int size)
3868 {
3869     switch (size) {
3870     case 0: gen_helper_neon_negl_u16(var, var); break;
3871     case 1: gen_helper_neon_negl_u32(var, var); break;
3872     case 2:
3873         tcg_gen_neg_i64(var, var);
3874         break;
3875     default: abort();
3876     }
3877 }
3878
3879 static inline void gen_neon_addl_saturate(TCGv_i64 op0, TCGv_i64 op1, int size)
3880 {
3881     switch (size) {
3882     case 1: gen_helper_neon_addl_saturate_s32(op0, cpu_env, op0, op1); break;
3883     case 2: gen_helper_neon_addl_saturate_s64(op0, cpu_env, op0, op1); break;
3884     default: abort();
3885     }
3886 }
3887
3888 static inline void gen_neon_mull(TCGv_i64 dest, TCGv_i32 a, TCGv_i32 b,
3889                                  int size, int u)
3890 {
3891     TCGv_i64 tmp;
3892
3893     switch ((size << 1) | u) {
3894     case 0: gen_helper_neon_mull_s8(dest, a, b); break;
3895     case 1: gen_helper_neon_mull_u8(dest, a, b); break;
3896     case 2: gen_helper_neon_mull_s16(dest, a, b); break;
3897     case 3: gen_helper_neon_mull_u16(dest, a, b); break;
3898     case 4:
3899         tmp = gen_muls_i64_i32(a, b);
3900         tcg_gen_mov_i64(dest, tmp);
3901         tcg_temp_free_i64(tmp);
3902         break;
3903     case 5:
3904         tmp = gen_mulu_i64_i32(a, b);
3905         tcg_gen_mov_i64(dest, tmp);
3906         tcg_temp_free_i64(tmp);
3907         break;
3908     default: abort();
3909     }
3910
3911     /* gen_helper_neon_mull_[su]{8|16} do not free their parameters.
3912        Don't forget to clean them now.  */
3913     if (size < 2) {
3914         tcg_temp_free_i32(a);
3915         tcg_temp_free_i32(b);
3916     }
3917 }
3918
3919 static void gen_neon_narrow_op(int op, int u, int size,
3920                                TCGv_i32 dest, TCGv_i64 src)
3921 {
3922     if (op) {
3923         if (u) {
3924             gen_neon_unarrow_sats(size, dest, src);
3925         } else {
3926             gen_neon_narrow(size, dest, src);
3927         }
3928     } else {
3929         if (u) {
3930             gen_neon_narrow_satu(size, dest, src);
3931         } else {
3932             gen_neon_narrow_sats(size, dest, src);
3933         }
3934     }
3935 }
3936
3937 /* Symbolic constants for op fields for Neon 3-register same-length.
3938  * The values correspond to bits [11:8,4]; see the ARM ARM DDI0406B
3939  * table A7-9.
3940  */
3941 #define NEON_3R_VHADD 0
3942 #define NEON_3R_VQADD 1
3943 #define NEON_3R_VRHADD 2
3944 #define NEON_3R_LOGIC 3 /* VAND,VBIC,VORR,VMOV,VORN,VEOR,VBIF,VBIT,VBSL */
3945 #define NEON_3R_VHSUB 4
3946 #define NEON_3R_VQSUB 5
3947 #define NEON_3R_VCGT 6
3948 #define NEON_3R_VCGE 7
3949 #define NEON_3R_VSHL 8
3950 #define NEON_3R_VQSHL 9
3951 #define NEON_3R_VRSHL 10
3952 #define NEON_3R_VQRSHL 11
3953 #define NEON_3R_VMAX 12
3954 #define NEON_3R_VMIN 13
3955 #define NEON_3R_VABD 14
3956 #define NEON_3R_VABA 15
3957 #define NEON_3R_VADD_VSUB 16
3958 #define NEON_3R_VTST_VCEQ 17
3959 #define NEON_3R_VML 18 /* VMLA, VMLS */
3960 #define NEON_3R_VMUL 19
3961 #define NEON_3R_VPMAX 20
3962 #define NEON_3R_VPMIN 21
3963 #define NEON_3R_VQDMULH_VQRDMULH 22
3964 #define NEON_3R_VPADD_VQRDMLAH 23
3965 #define NEON_3R_SHA 24 /* SHA1C,SHA1P,SHA1M,SHA1SU0,SHA256H{2},SHA256SU1 */
3966 #define NEON_3R_VFM_VQRDMLSH 25 /* VFMA, VFMS, VQRDMLSH */
3967 #define NEON_3R_FLOAT_ARITH 26 /* float VADD, VSUB, VPADD, VABD */
3968 #define NEON_3R_FLOAT_MULTIPLY 27 /* float VMLA, VMLS, VMUL */
3969 #define NEON_3R_FLOAT_CMP 28 /* float VCEQ, VCGE, VCGT */
3970 #define NEON_3R_FLOAT_ACMP 29 /* float VACGE, VACGT, VACLE, VACLT */
3971 #define NEON_3R_FLOAT_MINMAX 30 /* float VMIN, VMAX */
3972 #define NEON_3R_FLOAT_MISC 31 /* float VRECPS, VRSQRTS, VMAXNM/MINNM */
3973
3974 static const uint8_t neon_3r_sizes[] = {
3975     [NEON_3R_VHADD] = 0x7,
3976     [NEON_3R_VQADD] = 0xf,
3977     [NEON_3R_VRHADD] = 0x7,
3978     [NEON_3R_LOGIC] = 0xf, /* size field encodes op type */
3979     [NEON_3R_VHSUB] = 0x7,
3980     [NEON_3R_VQSUB] = 0xf,
3981     [NEON_3R_VCGT] = 0x7,
3982     [NEON_3R_VCGE] = 0x7,
3983     [NEON_3R_VSHL] = 0xf,
3984     [NEON_3R_VQSHL] = 0xf,
3985     [NEON_3R_VRSHL] = 0xf,
3986     [NEON_3R_VQRSHL] = 0xf,
3987     [NEON_3R_VMAX] = 0x7,
3988     [NEON_3R_VMIN] = 0x7,
3989     [NEON_3R_VABD] = 0x7,
3990     [NEON_3R_VABA] = 0x7,
3991     [NEON_3R_VADD_VSUB] = 0xf,
3992     [NEON_3R_VTST_VCEQ] = 0x7,
3993     [NEON_3R_VML] = 0x7,
3994     [NEON_3R_VMUL] = 0x7,
3995     [NEON_3R_VPMAX] = 0x7,
3996     [NEON_3R_VPMIN] = 0x7,
3997     [NEON_3R_VQDMULH_VQRDMULH] = 0x6,
3998     [NEON_3R_VPADD_VQRDMLAH] = 0x7,
3999     [NEON_3R_SHA] = 0xf, /* size field encodes op type */
4000     [NEON_3R_VFM_VQRDMLSH] = 0x7, /* For VFM, size bit 1 encodes op */
4001     [NEON_3R_FLOAT_ARITH] = 0x5, /* size bit 1 encodes op */
4002     [NEON_3R_FLOAT_MULTIPLY] = 0x5, /* size bit 1 encodes op */
4003     [NEON_3R_FLOAT_CMP] = 0x5, /* size bit 1 encodes op */
4004     [NEON_3R_FLOAT_ACMP] = 0x5, /* size bit 1 encodes op */
4005     [NEON_3R_FLOAT_MINMAX] = 0x5, /* size bit 1 encodes op */
4006     [NEON_3R_FLOAT_MISC] = 0x5, /* size bit 1 encodes op */
4007 };
4008
4009 /* Symbolic constants for op fields for Neon 2-register miscellaneous.
4010  * The values correspond to bits [17:16,10:7]; see the ARM ARM DDI0406B
4011  * table A7-13.
4012  */
4013 #define NEON_2RM_VREV64 0
4014 #define NEON_2RM_VREV32 1
4015 #define NEON_2RM_VREV16 2
4016 #define NEON_2RM_VPADDL 4
4017 #define NEON_2RM_VPADDL_U 5
4018 #define NEON_2RM_AESE 6 /* Includes AESD */
4019 #define NEON_2RM_AESMC 7 /* Includes AESIMC */
4020 #define NEON_2RM_VCLS 8
4021 #define NEON_2RM_VCLZ 9
4022 #define NEON_2RM_VCNT 10
4023 #define NEON_2RM_VMVN 11
4024 #define NEON_2RM_VPADAL 12
4025 #define NEON_2RM_VPADAL_U 13
4026 #define NEON_2RM_VQABS 14
4027 #define NEON_2RM_VQNEG 15
4028 #define NEON_2RM_VCGT0 16
4029 #define NEON_2RM_VCGE0 17
4030 #define NEON_2RM_VCEQ0 18
4031 #define NEON_2RM_VCLE0 19
4032 #define NEON_2RM_VCLT0 20
4033 #define NEON_2RM_SHA1H 21
4034 #define NEON_2RM_VABS 22
4035 #define NEON_2RM_VNEG 23
4036 #define NEON_2RM_VCGT0_F 24
4037 #define NEON_2RM_VCGE0_F 25
4038 #define NEON_2RM_VCEQ0_F 26
4039 #define NEON_2RM_VCLE0_F 27
4040 #define NEON_2RM_VCLT0_F 28
4041 #define NEON_2RM_VABS_F 30
4042 #define NEON_2RM_VNEG_F 31
4043 #define NEON_2RM_VSWP 32
4044 #define NEON_2RM_VTRN 33
4045 #define NEON_2RM_VUZP 34
4046 #define NEON_2RM_VZIP 35
4047 #define NEON_2RM_VMOVN 36 /* Includes VQMOVN, VQMOVUN */
4048 #define NEON_2RM_VQMOVN 37 /* Includes VQMOVUN */
4049 #define NEON_2RM_VSHLL 38
4050 #define NEON_2RM_SHA1SU1 39 /* Includes SHA256SU0 */
4051 #define NEON_2RM_VRINTN 40
4052 #define NEON_2RM_VRINTX 41
4053 #define NEON_2RM_VRINTA 42
4054 #define NEON_2RM_VRINTZ 43
4055 #define NEON_2RM_VCVT_F16_F32 44
4056 #define NEON_2RM_VRINTM 45
4057 #define NEON_2RM_VCVT_F32_F16 46
4058 #define NEON_2RM_VRINTP 47
4059 #define NEON_2RM_VCVTAU 48
4060 #define NEON_2RM_VCVTAS 49
4061 #define NEON_2RM_VCVTNU 50
4062 #define NEON_2RM_VCVTNS 51
4063 #define NEON_2RM_VCVTPU 52
4064 #define NEON_2RM_VCVTPS 53
4065 #define NEON_2RM_VCVTMU 54
4066 #define NEON_2RM_VCVTMS 55
4067 #define NEON_2RM_VRECPE 56
4068 #define NEON_2RM_VRSQRTE 57
4069 #define NEON_2RM_VRECPE_F 58
4070 #define NEON_2RM_VRSQRTE_F 59
4071 #define NEON_2RM_VCVT_FS 60
4072 #define NEON_2RM_VCVT_FU 61
4073 #define NEON_2RM_VCVT_SF 62
4074 #define NEON_2RM_VCVT_UF 63
4075
4076 static bool neon_2rm_is_v8_op(int op)
4077 {
4078     /* Return true if this neon 2reg-misc op is ARMv8 and up */
4079     switch (op) {
4080     case NEON_2RM_VRINTN:
4081     case NEON_2RM_VRINTA:
4082     case NEON_2RM_VRINTM:
4083     case NEON_2RM_VRINTP:
4084     case NEON_2RM_VRINTZ:
4085     case NEON_2RM_VRINTX:
4086     case NEON_2RM_VCVTAU:
4087     case NEON_2RM_VCVTAS:
4088     case NEON_2RM_VCVTNU:
4089     case NEON_2RM_VCVTNS:
4090     case NEON_2RM_VCVTPU:
4091     case NEON_2RM_VCVTPS:
4092     case NEON_2RM_VCVTMU:
4093     case NEON_2RM_VCVTMS:
4094         return true;
4095     default:
4096         return false;
4097     }
4098 }
4099
4100 /* Each entry in this array has bit n set if the insn allows
4101  * size value n (otherwise it will UNDEF). Since unallocated
4102  * op values will have no bits set they always UNDEF.
4103  */
4104 static const uint8_t neon_2rm_sizes[] = {
4105     [NEON_2RM_VREV64] = 0x7,
4106     [NEON_2RM_VREV32] = 0x3,
4107     [NEON_2RM_VREV16] = 0x1,
4108     [NEON_2RM_VPADDL] = 0x7,
4109     [NEON_2RM_VPADDL_U] = 0x7,
4110     [NEON_2RM_AESE] = 0x1,
4111     [NEON_2RM_AESMC] = 0x1,
4112     [NEON_2RM_VCLS] = 0x7,
4113     [NEON_2RM_VCLZ] = 0x7,
4114     [NEON_2RM_VCNT] = 0x1,
4115     [NEON_2RM_VMVN] = 0x1,
4116     [NEON_2RM_VPADAL] = 0x7,
4117     [NEON_2RM_VPADAL_U] = 0x7,
4118     [NEON_2RM_VQABS] = 0x7,
4119     [NEON_2RM_VQNEG] = 0x7,
4120     [NEON_2RM_VCGT0] = 0x7,
4121     [NEON_2RM_VCGE0] = 0x7,
4122     [NEON_2RM_VCEQ0] = 0x7,
4123     [NEON_2RM_VCLE0] = 0x7,
4124     [NEON_2RM_VCLT0] = 0x7,
4125     [NEON_2RM_SHA1H] = 0x4,
4126     [NEON_2RM_VABS] = 0x7,
4127     [NEON_2RM_VNEG] = 0x7,
4128     [NEON_2RM_VCGT0_F] = 0x4,
4129     [NEON_2RM_VCGE0_F] = 0x4,
4130     [NEON_2RM_VCEQ0_F] = 0x4,
4131     [NEON_2RM_VCLE0_F] = 0x4,
4132     [NEON_2RM_VCLT0_F] = 0x4,
4133     [NEON_2RM_VABS_F] = 0x4,
4134     [NEON_2RM_VNEG_F] = 0x4,
4135     [NEON_2RM_VSWP] = 0x1,
4136     [NEON_2RM_VTRN] = 0x7,
4137     [NEON_2RM_VUZP] = 0x7,
4138     [NEON_2RM_VZIP] = 0x7,
4139     [NEON_2RM_VMOVN] = 0x7,
4140     [NEON_2RM_VQMOVN] = 0x7,
4141     [NEON_2RM_VSHLL] = 0x7,
4142     [NEON_2RM_SHA1SU1] = 0x4,
4143     [NEON_2RM_VRINTN] = 0x4,
4144     [NEON_2RM_VRINTX] = 0x4,
4145     [NEON_2RM_VRINTA] = 0x4,
4146     [NEON_2RM_VRINTZ] = 0x4,
4147     [NEON_2RM_VCVT_F16_F32] = 0x2,
4148     [NEON_2RM_VRINTM] = 0x4,
4149     [NEON_2RM_VCVT_F32_F16] = 0x2,
4150     [NEON_2RM_VRINTP] = 0x4,
4151     [NEON_2RM_VCVTAU] = 0x4,
4152     [NEON_2RM_VCVTAS] = 0x4,
4153     [NEON_2RM_VCVTNU] = 0x4,
4154     [NEON_2RM_VCVTNS] = 0x4,
4155     [NEON_2RM_VCVTPU] = 0x4,
4156     [NEON_2RM_VCVTPS] = 0x4,
4157     [NEON_2RM_VCVTMU] = 0x4,
4158     [NEON_2RM_VCVTMS] = 0x4,
4159     [NEON_2RM_VRECPE] = 0x4,
4160     [NEON_2RM_VRSQRTE] = 0x4,
4161     [NEON_2RM_VRECPE_F] = 0x4,
4162     [NEON_2RM_VRSQRTE_F] = 0x4,
4163     [NEON_2RM_VCVT_FS] = 0x4,
4164     [NEON_2RM_VCVT_FU] = 0x4,
4165     [NEON_2RM_VCVT_SF] = 0x4,
4166     [NEON_2RM_VCVT_UF] = 0x4,
4167 };
4168
4169
4170 /* Expand v8.1 simd helper.  */
4171 static int do_v81_helper(DisasContext *s, gen_helper_gvec_3_ptr *fn,
4172                          int q, int rd, int rn, int rm)
4173 {
4174     if (dc_isar_feature(aa32_rdm, s)) {
4175         int opr_sz = (1 + q) * 8;
4176         tcg_gen_gvec_3_ptr(vfp_reg_offset(1, rd),
4177                            vfp_reg_offset(1, rn),
4178                            vfp_reg_offset(1, rm), cpu_env,
4179                            opr_sz, opr_sz, 0, fn);
4180         return 0;
4181     }
4182     return 1;
4183 }
4184
4185 static void gen_ssra8_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift)
4186 {
4187     tcg_gen_vec_sar8i_i64(a, a, shift);
4188     tcg_gen_vec_add8_i64(d, d, a);
4189 }
4190
4191 static void gen_ssra16_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift)
4192 {
4193     tcg_gen_vec_sar16i_i64(a, a, shift);
4194     tcg_gen_vec_add16_i64(d, d, a);
4195 }
4196
4197 static void gen_ssra32_i32(TCGv_i32 d, TCGv_i32 a, int32_t shift)
4198 {
4199     tcg_gen_sari_i32(a, a, shift);
4200     tcg_gen_add_i32(d, d, a);
4201 }
4202
4203 static void gen_ssra64_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift)
4204 {
4205     tcg_gen_sari_i64(a, a, shift);
4206     tcg_gen_add_i64(d, d, a);
4207 }
4208
4209 static void gen_ssra_vec(unsigned vece, TCGv_vec d, TCGv_vec a, int64_t sh)
4210 {
4211     tcg_gen_sari_vec(vece, a, a, sh);
4212     tcg_gen_add_vec(vece, d, d, a);
4213 }
4214
4215 static const TCGOpcode vecop_list_ssra[] = {
4216     INDEX_op_sari_vec, INDEX_op_add_vec, 0
4217 };
4218
4219 const GVecGen2i ssra_op[4] = {
4220     { .fni8 = gen_ssra8_i64,
4221       .fniv = gen_ssra_vec,
4222       .load_dest = true,
4223       .opt_opc = vecop_list_ssra,
4224       .vece = MO_8 },
4225     { .fni8 = gen_ssra16_i64,
4226       .fniv = gen_ssra_vec,
4227       .load_dest = true,
4228       .opt_opc = vecop_list_ssra,
4229       .vece = MO_16 },
4230     { .fni4 = gen_ssra32_i32,
4231       .fniv = gen_ssra_vec,
4232       .load_dest = true,
4233       .opt_opc = vecop_list_ssra,
4234       .vece = MO_32 },
4235     { .fni8 = gen_ssra64_i64,
4236       .fniv = gen_ssra_vec,
4237       .prefer_i64 = TCG_TARGET_REG_BITS == 64,
4238       .opt_opc = vecop_list_ssra,
4239       .load_dest = true,
4240       .vece = MO_64 },
4241 };
4242
4243 static void gen_usra8_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift)
4244 {
4245     tcg_gen_vec_shr8i_i64(a, a, shift);
4246     tcg_gen_vec_add8_i64(d, d, a);
4247 }
4248
4249 static void gen_usra16_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift)
4250 {
4251     tcg_gen_vec_shr16i_i64(a, a, shift);
4252     tcg_gen_vec_add16_i64(d, d, a);
4253 }
4254
4255 static void gen_usra32_i32(TCGv_i32 d, TCGv_i32 a, int32_t shift)
4256 {
4257     tcg_gen_shri_i32(a, a, shift);
4258     tcg_gen_add_i32(d, d, a);
4259 }
4260
4261 static void gen_usra64_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift)
4262 {
4263     tcg_gen_shri_i64(a, a, shift);
4264     tcg_gen_add_i64(d, d, a);
4265 }
4266
4267 static void gen_usra_vec(unsigned vece, TCGv_vec d, TCGv_vec a, int64_t sh)
4268 {
4269     tcg_gen_shri_vec(vece, a, a, sh);
4270     tcg_gen_add_vec(vece, d, d, a);
4271 }
4272
4273 static const TCGOpcode vecop_list_usra[] = {
4274     INDEX_op_shri_vec, INDEX_op_add_vec, 0
4275 };
4276
4277 const GVecGen2i usra_op[4] = {
4278     { .fni8 = gen_usra8_i64,
4279       .fniv = gen_usra_vec,
4280       .load_dest = true,
4281       .opt_opc = vecop_list_usra,
4282       .vece = MO_8, },
4283     { .fni8 = gen_usra16_i64,
4284       .fniv = gen_usra_vec,
4285       .load_dest = true,
4286       .opt_opc = vecop_list_usra,
4287       .vece = MO_16, },
4288     { .fni4 = gen_usra32_i32,
4289       .fniv = gen_usra_vec,
4290       .load_dest = true,
4291       .opt_opc = vecop_list_usra,
4292       .vece = MO_32, },
4293     { .fni8 = gen_usra64_i64,
4294       .fniv = gen_usra_vec,
4295       .prefer_i64 = TCG_TARGET_REG_BITS == 64,
4296       .load_dest = true,
4297       .opt_opc = vecop_list_usra,
4298       .vece = MO_64, },
4299 };
4300
4301 static void gen_shr8_ins_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift)
4302 {
4303     uint64_t mask = dup_const(MO_8, 0xff >> shift);
4304     TCGv_i64 t = tcg_temp_new_i64();
4305
4306     tcg_gen_shri_i64(t, a, shift);
4307     tcg_gen_andi_i64(t, t, mask);
4308     tcg_gen_andi_i64(d, d, ~mask);
4309     tcg_gen_or_i64(d, d, t);
4310     tcg_temp_free_i64(t);
4311 }
4312
4313 static void gen_shr16_ins_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift)
4314 {
4315     uint64_t mask = dup_const(MO_16, 0xffff >> shift);
4316     TCGv_i64 t = tcg_temp_new_i64();
4317
4318     tcg_gen_shri_i64(t, a, shift);
4319     tcg_gen_andi_i64(t, t, mask);
4320     tcg_gen_andi_i64(d, d, ~mask);
4321     tcg_gen_or_i64(d, d, t);
4322     tcg_temp_free_i64(t);
4323 }
4324
4325 static void gen_shr32_ins_i32(TCGv_i32 d, TCGv_i32 a, int32_t shift)
4326 {
4327     tcg_gen_shri_i32(a, a, shift);
4328     tcg_gen_deposit_i32(d, d, a, 0, 32 - shift);
4329 }
4330
4331 static void gen_shr64_ins_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift)
4332 {
4333     tcg_gen_shri_i64(a, a, shift);
4334     tcg_gen_deposit_i64(d, d, a, 0, 64 - shift);
4335 }
4336
4337 static void gen_shr_ins_vec(unsigned vece, TCGv_vec d, TCGv_vec a, int64_t sh)
4338 {
4339     if (sh == 0) {
4340         tcg_gen_mov_vec(d, a);
4341     } else {
4342         TCGv_vec t = tcg_temp_new_vec_matching(d);
4343         TCGv_vec m = tcg_temp_new_vec_matching(d);
4344
4345         tcg_gen_dupi_vec(vece, m, MAKE_64BIT_MASK((8 << vece) - sh, sh));
4346         tcg_gen_shri_vec(vece, t, a, sh);
4347         tcg_gen_and_vec(vece, d, d, m);
4348         tcg_gen_or_vec(vece, d, d, t);
4349
4350         tcg_temp_free_vec(t);
4351         tcg_temp_free_vec(m);
4352     }
4353 }
4354
4355 static const TCGOpcode vecop_list_sri[] = { INDEX_op_shri_vec, 0 };
4356
4357 const GVecGen2i sri_op[4] = {
4358     { .fni8 = gen_shr8_ins_i64,
4359       .fniv = gen_shr_ins_vec,
4360       .load_dest = true,
4361       .opt_opc = vecop_list_sri,
4362       .vece = MO_8 },
4363     { .fni8 = gen_shr16_ins_i64,
4364       .fniv = gen_shr_ins_vec,
4365       .load_dest = true,
4366       .opt_opc = vecop_list_sri,
4367       .vece = MO_16 },
4368     { .fni4 = gen_shr32_ins_i32,
4369       .fniv = gen_shr_ins_vec,
4370       .load_dest = true,
4371       .opt_opc = vecop_list_sri,
4372       .vece = MO_32 },
4373     { .fni8 = gen_shr64_ins_i64,
4374       .fniv = gen_shr_ins_vec,
4375       .prefer_i64 = TCG_TARGET_REG_BITS == 64,
4376       .load_dest = true,
4377       .opt_opc = vecop_list_sri,
4378       .vece = MO_64 },
4379 };
4380
4381 static void gen_shl8_ins_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift)
4382 {
4383     uint64_t mask = dup_const(MO_8, 0xff << shift);
4384     TCGv_i64 t = tcg_temp_new_i64();
4385
4386     tcg_gen_shli_i64(t, a, shift);
4387     tcg_gen_andi_i64(t, t, mask);
4388     tcg_gen_andi_i64(d, d, ~mask);
4389     tcg_gen_or_i64(d, d, t);
4390     tcg_temp_free_i64(t);
4391 }
4392
4393 static void gen_shl16_ins_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift)
4394 {
4395     uint64_t mask = dup_const(MO_16, 0xffff << shift);
4396     TCGv_i64 t = tcg_temp_new_i64();
4397
4398     tcg_gen_shli_i64(t, a, shift);
4399     tcg_gen_andi_i64(t, t, mask);
4400     tcg_gen_andi_i64(d, d, ~mask);
4401     tcg_gen_or_i64(d, d, t);
4402     tcg_temp_free_i64(t);
4403 }
4404
4405 static void gen_shl32_ins_i32(TCGv_i32 d, TCGv_i32 a, int32_t shift)
4406 {
4407     tcg_gen_deposit_i32(d, d, a, shift, 32 - shift);
4408 }
4409
4410 static void gen_shl64_ins_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift)
4411 {
4412     tcg_gen_deposit_i64(d, d, a, shift, 64 - shift);
4413 }
4414
4415 static void gen_shl_ins_vec(unsigned vece, TCGv_vec d, TCGv_vec a, int64_t sh)
4416 {
4417     if (sh == 0) {
4418         tcg_gen_mov_vec(d, a);
4419     } else {
4420         TCGv_vec t = tcg_temp_new_vec_matching(d);
4421         TCGv_vec m = tcg_temp_new_vec_matching(d);
4422
4423         tcg_gen_dupi_vec(vece, m, MAKE_64BIT_MASK(0, sh));
4424         tcg_gen_shli_vec(vece, t, a, sh);
4425         tcg_gen_and_vec(vece, d, d, m);
4426         tcg_gen_or_vec(vece, d, d, t);
4427
4428         tcg_temp_free_vec(t);
4429         tcg_temp_free_vec(m);
4430     }
4431 }
4432
4433 static const TCGOpcode vecop_list_sli[] = { INDEX_op_shli_vec, 0 };
4434
4435 const GVecGen2i sli_op[4] = {
4436     { .fni8 = gen_shl8_ins_i64,
4437       .fniv = gen_shl_ins_vec,
4438       .load_dest = true,
4439       .opt_opc = vecop_list_sli,
4440       .vece = MO_8 },
4441     { .fni8 = gen_shl16_ins_i64,
4442       .fniv = gen_shl_ins_vec,
4443       .load_dest = true,
4444       .opt_opc = vecop_list_sli,
4445       .vece = MO_16 },
4446     { .fni4 = gen_shl32_ins_i32,
4447       .fniv = gen_shl_ins_vec,
4448       .load_dest = true,
4449       .opt_opc = vecop_list_sli,
4450       .vece = MO_32 },
4451     { .fni8 = gen_shl64_ins_i64,
4452       .fniv = gen_shl_ins_vec,
4453       .prefer_i64 = TCG_TARGET_REG_BITS == 64,
4454       .load_dest = true,
4455       .opt_opc = vecop_list_sli,
4456       .vece = MO_64 },
4457 };
4458
4459 static void gen_mla8_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b)
4460 {
4461     gen_helper_neon_mul_u8(a, a, b);
4462     gen_helper_neon_add_u8(d, d, a);
4463 }
4464
4465 static void gen_mls8_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b)
4466 {
4467     gen_helper_neon_mul_u8(a, a, b);
4468     gen_helper_neon_sub_u8(d, d, a);
4469 }
4470
4471 static void gen_mla16_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b)
4472 {
4473     gen_helper_neon_mul_u16(a, a, b);
4474     gen_helper_neon_add_u16(d, d, a);
4475 }
4476
4477 static void gen_mls16_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b)
4478 {
4479     gen_helper_neon_mul_u16(a, a, b);
4480     gen_helper_neon_sub_u16(d, d, a);
4481 }
4482
4483 static void gen_mla32_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b)
4484 {
4485     tcg_gen_mul_i32(a, a, b);
4486     tcg_gen_add_i32(d, d, a);
4487 }
4488
4489 static void gen_mls32_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b)
4490 {
4491     tcg_gen_mul_i32(a, a, b);
4492     tcg_gen_sub_i32(d, d, a);
4493 }
4494
4495 static void gen_mla64_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b)
4496 {
4497     tcg_gen_mul_i64(a, a, b);
4498     tcg_gen_add_i64(d, d, a);
4499 }
4500
4501 static void gen_mls64_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b)
4502 {
4503     tcg_gen_mul_i64(a, a, b);
4504     tcg_gen_sub_i64(d, d, a);
4505 }
4506
4507 static void gen_mla_vec(unsigned vece, TCGv_vec d, TCGv_vec a, TCGv_vec b)
4508 {
4509     tcg_gen_mul_vec(vece, a, a, b);
4510     tcg_gen_add_vec(vece, d, d, a);
4511 }
4512
4513 static void gen_mls_vec(unsigned vece, TCGv_vec d, TCGv_vec a, TCGv_vec b)
4514 {
4515     tcg_gen_mul_vec(vece, a, a, b);
4516     tcg_gen_sub_vec(vece, d, d, a);
4517 }
4518
4519 /* Note that while NEON does not support VMLA and VMLS as 64-bit ops,
4520  * these tables are shared with AArch64 which does support them.
4521  */
4522
4523 static const TCGOpcode vecop_list_mla[] = {
4524     INDEX_op_mul_vec, INDEX_op_add_vec, 0
4525 };
4526
4527 static const TCGOpcode vecop_list_mls[] = {
4528     INDEX_op_mul_vec, INDEX_op_sub_vec, 0
4529 };
4530
4531 const GVecGen3 mla_op[4] = {
4532     { .fni4 = gen_mla8_i32,
4533       .fniv = gen_mla_vec,
4534       .load_dest = true,
4535       .opt_opc = vecop_list_mla,
4536       .vece = MO_8 },
4537     { .fni4 = gen_mla16_i32,
4538       .fniv = gen_mla_vec,
4539       .load_dest = true,
4540       .opt_opc = vecop_list_mla,
4541       .vece = MO_16 },
4542     { .fni4 = gen_mla32_i32,
4543       .fniv = gen_mla_vec,
4544       .load_dest = true,
4545       .opt_opc = vecop_list_mla,
4546       .vece = MO_32 },
4547     { .fni8 = gen_mla64_i64,
4548       .fniv = gen_mla_vec,
4549       .prefer_i64 = TCG_TARGET_REG_BITS == 64,
4550       .load_dest = true,
4551       .opt_opc = vecop_list_mla,
4552       .vece = MO_64 },
4553 };
4554
4555 const GVecGen3 mls_op[4] = {
4556     { .fni4 = gen_mls8_i32,
4557       .fniv = gen_mls_vec,
4558       .load_dest = true,
4559       .opt_opc = vecop_list_mls,
4560       .vece = MO_8 },
4561     { .fni4 = gen_mls16_i32,
4562       .fniv = gen_mls_vec,
4563       .load_dest = true,
4564       .opt_opc = vecop_list_mls,
4565       .vece = MO_16 },
4566     { .fni4 = gen_mls32_i32,
4567       .fniv = gen_mls_vec,
4568       .load_dest = true,
4569       .opt_opc = vecop_list_mls,
4570       .vece = MO_32 },
4571     { .fni8 = gen_mls64_i64,
4572       .fniv = gen_mls_vec,
4573       .prefer_i64 = TCG_TARGET_REG_BITS == 64,
4574       .load_dest = true,
4575       .opt_opc = vecop_list_mls,
4576       .vece = MO_64 },
4577 };
4578
4579 /* CMTST : test is "if (X & Y != 0)". */
4580 static void gen_cmtst_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b)
4581 {
4582     tcg_gen_and_i32(d, a, b);
4583     tcg_gen_setcondi_i32(TCG_COND_NE, d, d, 0);
4584     tcg_gen_neg_i32(d, d);
4585 }
4586
4587 void gen_cmtst_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b)
4588 {
4589     tcg_gen_and_i64(d, a, b);
4590     tcg_gen_setcondi_i64(TCG_COND_NE, d, d, 0);
4591     tcg_gen_neg_i64(d, d);
4592 }
4593
4594 static void gen_cmtst_vec(unsigned vece, TCGv_vec d, TCGv_vec a, TCGv_vec b)
4595 {
4596     tcg_gen_and_vec(vece, d, a, b);
4597     tcg_gen_dupi_vec(vece, a, 0);
4598     tcg_gen_cmp_vec(TCG_COND_NE, vece, d, d, a);
4599 }
4600
4601 static const TCGOpcode vecop_list_cmtst[] = { INDEX_op_cmp_vec, 0 };
4602
4603 const GVecGen3 cmtst_op[4] = {
4604     { .fni4 = gen_helper_neon_tst_u8,
4605       .fniv = gen_cmtst_vec,
4606       .opt_opc = vecop_list_cmtst,
4607       .vece = MO_8 },
4608     { .fni4 = gen_helper_neon_tst_u16,
4609       .fniv = gen_cmtst_vec,
4610       .opt_opc = vecop_list_cmtst,
4611       .vece = MO_16 },
4612     { .fni4 = gen_cmtst_i32,
4613       .fniv = gen_cmtst_vec,
4614       .opt_opc = vecop_list_cmtst,
4615       .vece = MO_32 },
4616     { .fni8 = gen_cmtst_i64,
4617       .fniv = gen_cmtst_vec,
4618       .prefer_i64 = TCG_TARGET_REG_BITS == 64,
4619       .opt_opc = vecop_list_cmtst,
4620       .vece = MO_64 },
4621 };
4622
4623 static void gen_uqadd_vec(unsigned vece, TCGv_vec t, TCGv_vec sat,
4624                           TCGv_vec a, TCGv_vec b)
4625 {
4626     TCGv_vec x = tcg_temp_new_vec_matching(t);
4627     tcg_gen_add_vec(vece, x, a, b);
4628     tcg_gen_usadd_vec(vece, t, a, b);
4629     tcg_gen_cmp_vec(TCG_COND_NE, vece, x, x, t);
4630     tcg_gen_or_vec(vece, sat, sat, x);
4631     tcg_temp_free_vec(x);
4632 }
4633
4634 static const TCGOpcode vecop_list_uqadd[] = {
4635     INDEX_op_usadd_vec, INDEX_op_cmp_vec, INDEX_op_add_vec, 0
4636 };
4637
4638 const GVecGen4 uqadd_op[4] = {
4639     { .fniv = gen_uqadd_vec,
4640       .fno = gen_helper_gvec_uqadd_b,
4641       .write_aofs = true,
4642       .opt_opc = vecop_list_uqadd,
4643       .vece = MO_8 },
4644     { .fniv = gen_uqadd_vec,
4645       .fno = gen_helper_gvec_uqadd_h,
4646       .write_aofs = true,
4647       .opt_opc = vecop_list_uqadd,
4648       .vece = MO_16 },
4649     { .fniv = gen_uqadd_vec,
4650       .fno = gen_helper_gvec_uqadd_s,
4651       .write_aofs = true,
4652       .opt_opc = vecop_list_uqadd,
4653       .vece = MO_32 },
4654     { .fniv = gen_uqadd_vec,
4655       .fno = gen_helper_gvec_uqadd_d,
4656       .write_aofs = true,
4657       .opt_opc = vecop_list_uqadd,
4658       .vece = MO_64 },
4659 };
4660
4661 static void gen_sqadd_vec(unsigned vece, TCGv_vec t, TCGv_vec sat,
4662                           TCGv_vec a, TCGv_vec b)
4663 {
4664     TCGv_vec x = tcg_temp_new_vec_matching(t);
4665     tcg_gen_add_vec(vece, x, a, b);
4666     tcg_gen_ssadd_vec(vece, t, a, b);
4667     tcg_gen_cmp_vec(TCG_COND_NE, vece, x, x, t);
4668     tcg_gen_or_vec(vece, sat, sat, x);
4669     tcg_temp_free_vec(x);
4670 }
4671
4672 static const TCGOpcode vecop_list_sqadd[] = {
4673     INDEX_op_ssadd_vec, INDEX_op_cmp_vec, INDEX_op_add_vec, 0
4674 };
4675
4676 const GVecGen4 sqadd_op[4] = {
4677     { .fniv = gen_sqadd_vec,
4678       .fno = gen_helper_gvec_sqadd_b,
4679       .opt_opc = vecop_list_sqadd,
4680       .write_aofs = true,
4681       .vece = MO_8 },
4682     { .fniv = gen_sqadd_vec,
4683       .fno = gen_helper_gvec_sqadd_h,
4684       .opt_opc = vecop_list_sqadd,
4685       .write_aofs = true,
4686       .vece = MO_16 },
4687     { .fniv = gen_sqadd_vec,
4688       .fno = gen_helper_gvec_sqadd_s,
4689       .opt_opc = vecop_list_sqadd,
4690       .write_aofs = true,
4691       .vece = MO_32 },
4692     { .fniv = gen_sqadd_vec,
4693       .fno = gen_helper_gvec_sqadd_d,
4694       .opt_opc = vecop_list_sqadd,
4695       .write_aofs = true,
4696       .vece = MO_64 },
4697 };
4698
4699 static void gen_uqsub_vec(unsigned vece, TCGv_vec t, TCGv_vec sat,
4700                           TCGv_vec a, TCGv_vec b)
4701 {
4702     TCGv_vec x = tcg_temp_new_vec_matching(t);
4703     tcg_gen_sub_vec(vece, x, a, b);
4704     tcg_gen_ussub_vec(vece, t, a, b);
4705     tcg_gen_cmp_vec(TCG_COND_NE, vece, x, x, t);
4706     tcg_gen_or_vec(vece, sat, sat, x);
4707     tcg_temp_free_vec(x);
4708 }
4709
4710 static const TCGOpcode vecop_list_uqsub[] = {
4711     INDEX_op_ussub_vec, INDEX_op_cmp_vec, INDEX_op_sub_vec, 0
4712 };
4713
4714 const GVecGen4 uqsub_op[4] = {
4715     { .fniv = gen_uqsub_vec,
4716       .fno = gen_helper_gvec_uqsub_b,
4717       .opt_opc = vecop_list_uqsub,
4718       .write_aofs = true,
4719       .vece = MO_8 },
4720     { .fniv = gen_uqsub_vec,
4721       .fno = gen_helper_gvec_uqsub_h,
4722       .opt_opc = vecop_list_uqsub,
4723       .write_aofs = true,
4724       .vece = MO_16 },
4725     { .fniv = gen_uqsub_vec,
4726       .fno = gen_helper_gvec_uqsub_s,
4727       .opt_opc = vecop_list_uqsub,
4728       .write_aofs = true,
4729       .vece = MO_32 },
4730     { .fniv = gen_uqsub_vec,
4731       .fno = gen_helper_gvec_uqsub_d,
4732       .opt_opc = vecop_list_uqsub,
4733       .write_aofs = true,
4734       .vece = MO_64 },
4735 };
4736
4737 static void gen_sqsub_vec(unsigned vece, TCGv_vec t, TCGv_vec sat,
4738                           TCGv_vec a, TCGv_vec b)
4739 {
4740     TCGv_vec x = tcg_temp_new_vec_matching(t);
4741     tcg_gen_sub_vec(vece, x, a, b);
4742     tcg_gen_sssub_vec(vece, t, a, b);
4743     tcg_gen_cmp_vec(TCG_COND_NE, vece, x, x, t);
4744     tcg_gen_or_vec(vece, sat, sat, x);
4745     tcg_temp_free_vec(x);
4746 }
4747
4748 static const TCGOpcode vecop_list_sqsub[] = {
4749     INDEX_op_sssub_vec, INDEX_op_cmp_vec, INDEX_op_sub_vec, 0
4750 };
4751
4752 const GVecGen4 sqsub_op[4] = {
4753     { .fniv = gen_sqsub_vec,
4754       .fno = gen_helper_gvec_sqsub_b,
4755       .opt_opc = vecop_list_sqsub,
4756       .write_aofs = true,
4757       .vece = MO_8 },
4758     { .fniv = gen_sqsub_vec,
4759       .fno = gen_helper_gvec_sqsub_h,
4760       .opt_opc = vecop_list_sqsub,
4761       .write_aofs = true,
4762       .vece = MO_16 },
4763     { .fniv = gen_sqsub_vec,
4764       .fno = gen_helper_gvec_sqsub_s,
4765       .opt_opc = vecop_list_sqsub,
4766       .write_aofs = true,
4767       .vece = MO_32 },
4768     { .fniv = gen_sqsub_vec,
4769       .fno = gen_helper_gvec_sqsub_d,
4770       .opt_opc = vecop_list_sqsub,
4771       .write_aofs = true,
4772       .vece = MO_64 },
4773 };
4774
4775 /* Translate a NEON data processing instruction.  Return nonzero if the
4776    instruction is invalid.
4777    We process data in a mixture of 32-bit and 64-bit chunks.
4778    Mostly we use 32-bit chunks so we can use normal scalar instructions.  */
4779
4780 static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
4781 {
4782     int op;
4783     int q;
4784     int rd, rn, rm, rd_ofs, rn_ofs, rm_ofs;
4785     int size;
4786     int shift;
4787     int pass;
4788     int count;
4789     int pairwise;
4790     int u;
4791     int vec_size;
4792     uint32_t imm;
4793     TCGv_i32 tmp, tmp2, tmp3, tmp4, tmp5;
4794     TCGv_ptr ptr1, ptr2, ptr3;
4795     TCGv_i64 tmp64;
4796
4797     /* FIXME: this access check should not take precedence over UNDEF
4798      * for invalid encodings; we will generate incorrect syndrome information
4799      * for attempts to execute invalid vfp/neon encodings with FP disabled.
4800      */
4801     if (s->fp_excp_el) {
4802         gen_exception_insn(s, s->pc_curr, EXCP_UDEF,
4803                            syn_simd_access_trap(1, 0xe, false), s->fp_excp_el);
4804         return 0;
4805     }
4806
4807     if (!s->vfp_enabled)
4808       return 1;
4809     q = (insn & (1 << 6)) != 0;
4810     u = (insn >> 24) & 1;
4811     VFP_DREG_D(rd, insn);
4812     VFP_DREG_N(rn, insn);
4813     VFP_DREG_M(rm, insn);
4814     size = (insn >> 20) & 3;
4815     vec_size = q ? 16 : 8;
4816     rd_ofs = neon_reg_offset(rd, 0);
4817     rn_ofs = neon_reg_offset(rn, 0);
4818     rm_ofs = neon_reg_offset(rm, 0);
4819
4820     if ((insn & (1 << 23)) == 0) {
4821         /* Three register same length.  */
4822         op = ((insn >> 7) & 0x1e) | ((insn >> 4) & 1);
4823         /* Catch invalid op and bad size combinations: UNDEF */
4824         if ((neon_3r_sizes[op] & (1 << size)) == 0) {
4825             return 1;
4826         }
4827         /* All insns of this form UNDEF for either this condition or the
4828          * superset of cases "Q==1"; we catch the latter later.
4829          */
4830         if (q && ((rd | rn | rm) & 1)) {
4831             return 1;
4832         }
4833         switch (op) {
4834         case NEON_3R_SHA:
4835             /* The SHA-1/SHA-256 3-register instructions require special
4836              * treatment here, as their size field is overloaded as an
4837              * op type selector, and they all consume their input in a
4838              * single pass.
4839              */
4840             if (!q) {
4841                 return 1;
4842             }
4843             if (!u) { /* SHA-1 */
4844                 if (!dc_isar_feature(aa32_sha1, s)) {
4845                     return 1;
4846                 }
4847                 ptr1 = vfp_reg_ptr(true, rd);
4848                 ptr2 = vfp_reg_ptr(true, rn);
4849                 ptr3 = vfp_reg_ptr(true, rm);
4850                 tmp4 = tcg_const_i32(size);
4851                 gen_helper_crypto_sha1_3reg(ptr1, ptr2, ptr3, tmp4);
4852                 tcg_temp_free_i32(tmp4);
4853             } else { /* SHA-256 */
4854                 if (!dc_isar_feature(aa32_sha2, s) || size == 3) {
4855                     return 1;
4856                 }
4857                 ptr1 = vfp_reg_ptr(true, rd);
4858                 ptr2 = vfp_reg_ptr(true, rn);
4859                 ptr3 = vfp_reg_ptr(true, rm);
4860                 switch (size) {
4861                 case 0:
4862                     gen_helper_crypto_sha256h(ptr1, ptr2, ptr3);
4863                     break;
4864                 case 1:
4865                     gen_helper_crypto_sha256h2(ptr1, ptr2, ptr3);
4866                     break;
4867                 case 2:
4868                     gen_helper_crypto_sha256su1(ptr1, ptr2, ptr3);
4869                     break;
4870                 }
4871             }
4872             tcg_temp_free_ptr(ptr1);
4873             tcg_temp_free_ptr(ptr2);
4874             tcg_temp_free_ptr(ptr3);
4875             return 0;
4876
4877         case NEON_3R_VPADD_VQRDMLAH:
4878             if (!u) {
4879                 break;  /* VPADD */
4880             }
4881             /* VQRDMLAH */
4882             switch (size) {
4883             case 1:
4884                 return do_v81_helper(s, gen_helper_gvec_qrdmlah_s16,
4885                                      q, rd, rn, rm);
4886             case 2:
4887                 return do_v81_helper(s, gen_helper_gvec_qrdmlah_s32,
4888                                      q, rd, rn, rm);
4889             }
4890             return 1;
4891
4892         case NEON_3R_VFM_VQRDMLSH:
4893             if (!u) {
4894                 /* VFM, VFMS */
4895                 if (size == 1) {
4896                     return 1;
4897                 }
4898                 break;
4899             }
4900             /* VQRDMLSH */
4901             switch (size) {
4902             case 1:
4903                 return do_v81_helper(s, gen_helper_gvec_qrdmlsh_s16,
4904                                      q, rd, rn, rm);
4905             case 2:
4906                 return do_v81_helper(s, gen_helper_gvec_qrdmlsh_s32,
4907                                      q, rd, rn, rm);
4908             }
4909             return 1;
4910
4911         case NEON_3R_LOGIC: /* Logic ops.  */
4912             switch ((u << 2) | size) {
4913             case 0: /* VAND */
4914                 tcg_gen_gvec_and(0, rd_ofs, rn_ofs, rm_ofs,
4915                                  vec_size, vec_size);
4916                 break;
4917             case 1: /* VBIC */
4918                 tcg_gen_gvec_andc(0, rd_ofs, rn_ofs, rm_ofs,
4919                                   vec_size, vec_size);
4920                 break;
4921             case 2: /* VORR */
4922                 tcg_gen_gvec_or(0, rd_ofs, rn_ofs, rm_ofs,
4923                                 vec_size, vec_size);
4924                 break;
4925             case 3: /* VORN */
4926                 tcg_gen_gvec_orc(0, rd_ofs, rn_ofs, rm_ofs,
4927                                  vec_size, vec_size);
4928                 break;
4929             case 4: /* VEOR */
4930                 tcg_gen_gvec_xor(0, rd_ofs, rn_ofs, rm_ofs,
4931                                  vec_size, vec_size);
4932                 break;
4933             case 5: /* VBSL */
4934                 tcg_gen_gvec_bitsel(MO_8, rd_ofs, rd_ofs, rn_ofs, rm_ofs,
4935                                     vec_size, vec_size);
4936                 break;
4937             case 6: /* VBIT */
4938                 tcg_gen_gvec_bitsel(MO_8, rd_ofs, rm_ofs, rn_ofs, rd_ofs,
4939                                     vec_size, vec_size);
4940                 break;
4941             case 7: /* VBIF */
4942                 tcg_gen_gvec_bitsel(MO_8, rd_ofs, rm_ofs, rd_ofs, rn_ofs,
4943                                     vec_size, vec_size);
4944                 break;
4945             }
4946             return 0;
4947
4948         case NEON_3R_VADD_VSUB:
4949             if (u) {
4950                 tcg_gen_gvec_sub(size, rd_ofs, rn_ofs, rm_ofs,
4951                                  vec_size, vec_size);
4952             } else {
4953                 tcg_gen_gvec_add(size, rd_ofs, rn_ofs, rm_ofs,
4954                                  vec_size, vec_size);
4955             }
4956             return 0;
4957
4958         case NEON_3R_VQADD:
4959             tcg_gen_gvec_4(rd_ofs, offsetof(CPUARMState, vfp.qc),
4960                            rn_ofs, rm_ofs, vec_size, vec_size,
4961                            (u ? uqadd_op : sqadd_op) + size);
4962             return 0;
4963
4964         case NEON_3R_VQSUB:
4965             tcg_gen_gvec_4(rd_ofs, offsetof(CPUARMState, vfp.qc),
4966                            rn_ofs, rm_ofs, vec_size, vec_size,
4967                            (u ? uqsub_op : sqsub_op) + size);
4968             return 0;
4969
4970         case NEON_3R_VMUL: /* VMUL */
4971             if (u) {
4972                 /* Polynomial case allows only P8 and is handled below.  */
4973                 if (size != 0) {
4974                     return 1;
4975                 }
4976             } else {
4977                 tcg_gen_gvec_mul(size, rd_ofs, rn_ofs, rm_ofs,
4978                                  vec_size, vec_size);
4979                 return 0;
4980             }
4981             break;
4982
4983         case NEON_3R_VML: /* VMLA, VMLS */
4984             tcg_gen_gvec_3(rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size,
4985                            u ? &mls_op[size] : &mla_op[size]);
4986             return 0;
4987
4988         case NEON_3R_VTST_VCEQ:
4989             if (u) { /* VCEQ */
4990                 tcg_gen_gvec_cmp(TCG_COND_EQ, size, rd_ofs, rn_ofs, rm_ofs,
4991                                  vec_size, vec_size);
4992             } else { /* VTST */
4993                 tcg_gen_gvec_3(rd_ofs, rn_ofs, rm_ofs,
4994                                vec_size, vec_size, &cmtst_op[size]);
4995             }
4996             return 0;
4997
4998         case NEON_3R_VCGT:
4999             tcg_gen_gvec_cmp(u ? TCG_COND_GTU : TCG_COND_GT, size,
5000                              rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size);
5001             return 0;
5002
5003         case NEON_3R_VCGE:
5004             tcg_gen_gvec_cmp(u ? TCG_COND_GEU : TCG_COND_GE, size,
5005                              rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size);
5006             return 0;
5007
5008         case NEON_3R_VMAX:
5009             if (u) {
5010                 tcg_gen_gvec_umax(size, rd_ofs, rn_ofs, rm_ofs,
5011                                   vec_size, vec_size);
5012             } else {
5013                 tcg_gen_gvec_smax(size, rd_ofs, rn_ofs, rm_ofs,
5014                                   vec_size, vec_size);
5015             }
5016             return 0;
5017         case NEON_3R_VMIN:
5018             if (u) {
5019                 tcg_gen_gvec_umin(size, rd_ofs, rn_ofs, rm_ofs,
5020                                   vec_size, vec_size);
5021             } else {
5022                 tcg_gen_gvec_smin(size, rd_ofs, rn_ofs, rm_ofs,
5023                                   vec_size, vec_size);
5024             }
5025             return 0;
5026         }
5027
5028         if (size == 3) {
5029             /* 64-bit element instructions. */
5030             for (pass = 0; pass < (q ? 2 : 1); pass++) {
5031                 neon_load_reg64(cpu_V0, rn + pass);
5032                 neon_load_reg64(cpu_V1, rm + pass);
5033                 switch (op) {
5034                 case NEON_3R_VSHL:
5035                     if (u) {
5036                         gen_helper_neon_shl_u64(cpu_V0, cpu_V1, cpu_V0);
5037                     } else {
5038                         gen_helper_neon_shl_s64(cpu_V0, cpu_V1, cpu_V0);
5039                     }
5040                     break;
5041                 case NEON_3R_VQSHL:
5042                     if (u) {
5043                         gen_helper_neon_qshl_u64(cpu_V0, cpu_env,
5044                                                  cpu_V1, cpu_V0);
5045                     } else {
5046                         gen_helper_neon_qshl_s64(cpu_V0, cpu_env,
5047                                                  cpu_V1, cpu_V0);
5048                     }
5049                     break;
5050                 case NEON_3R_VRSHL:
5051                     if (u) {
5052                         gen_helper_neon_rshl_u64(cpu_V0, cpu_V1, cpu_V0);
5053                     } else {
5054                         gen_helper_neon_rshl_s64(cpu_V0, cpu_V1, cpu_V0);
5055                     }
5056                     break;
5057                 case NEON_3R_VQRSHL:
5058                     if (u) {
5059                         gen_helper_neon_qrshl_u64(cpu_V0, cpu_env,
5060                                                   cpu_V1, cpu_V0);
5061                     } else {
5062                         gen_helper_neon_qrshl_s64(cpu_V0, cpu_env,
5063                                                   cpu_V1, cpu_V0);
5064                     }
5065                     break;
5066                 default:
5067                     abort();
5068                 }
5069                 neon_store_reg64(cpu_V0, rd + pass);
5070             }
5071             return 0;
5072         }
5073         pairwise = 0;
5074         switch (op) {
5075         case NEON_3R_VSHL:
5076         case NEON_3R_VQSHL:
5077         case NEON_3R_VRSHL:
5078         case NEON_3R_VQRSHL:
5079             {
5080                 int rtmp;
5081                 /* Shift instruction operands are reversed.  */
5082                 rtmp = rn;
5083                 rn = rm;
5084                 rm = rtmp;
5085             }
5086             break;
5087         case NEON_3R_VPADD_VQRDMLAH:
5088         case NEON_3R_VPMAX:
5089         case NEON_3R_VPMIN:
5090             pairwise = 1;
5091             break;
5092         case NEON_3R_FLOAT_ARITH:
5093             pairwise = (u && size < 2); /* if VPADD (float) */
5094             break;
5095         case NEON_3R_FLOAT_MINMAX:
5096             pairwise = u; /* if VPMIN/VPMAX (float) */
5097             break;
5098         case NEON_3R_FLOAT_CMP:
5099             if (!u && size) {
5100                 /* no encoding for U=0 C=1x */
5101                 return 1;
5102             }
5103             break;
5104         case NEON_3R_FLOAT_ACMP:
5105             if (!u) {
5106                 return 1;
5107             }
5108             break;
5109         case NEON_3R_FLOAT_MISC:
5110             /* VMAXNM/VMINNM in ARMv8 */
5111             if (u && !arm_dc_feature(s, ARM_FEATURE_V8)) {
5112                 return 1;
5113             }
5114             break;
5115         case NEON_3R_VFM_VQRDMLSH:
5116             if (!arm_dc_feature(s, ARM_FEATURE_VFP4)) {
5117                 return 1;
5118             }
5119             break;
5120         default:
5121             break;
5122         }
5123
5124         if (pairwise && q) {
5125             /* All the pairwise insns UNDEF if Q is set */
5126             return 1;
5127         }
5128
5129         for (pass = 0; pass < (q ? 4 : 2); pass++) {
5130
5131         if (pairwise) {
5132             /* Pairwise.  */
5133             if (pass < 1) {
5134                 tmp = neon_load_reg(rn, 0);
5135                 tmp2 = neon_load_reg(rn, 1);
5136             } else {
5137                 tmp = neon_load_reg(rm, 0);
5138                 tmp2 = neon_load_reg(rm, 1);
5139             }
5140         } else {
5141             /* Elementwise.  */
5142             tmp = neon_load_reg(rn, pass);
5143             tmp2 = neon_load_reg(rm, pass);
5144         }
5145         switch (op) {
5146         case NEON_3R_VHADD:
5147             GEN_NEON_INTEGER_OP(hadd);
5148             break;
5149         case NEON_3R_VRHADD:
5150             GEN_NEON_INTEGER_OP(rhadd);
5151             break;
5152         case NEON_3R_VHSUB:
5153             GEN_NEON_INTEGER_OP(hsub);
5154             break;
5155         case NEON_3R_VSHL:
5156             GEN_NEON_INTEGER_OP(shl);
5157             break;
5158         case NEON_3R_VQSHL:
5159             GEN_NEON_INTEGER_OP_ENV(qshl);
5160             break;
5161         case NEON_3R_VRSHL:
5162             GEN_NEON_INTEGER_OP(rshl);
5163             break;
5164         case NEON_3R_VQRSHL:
5165             GEN_NEON_INTEGER_OP_ENV(qrshl);
5166             break;
5167         case NEON_3R_VABD:
5168             GEN_NEON_INTEGER_OP(abd);
5169             break;
5170         case NEON_3R_VABA:
5171             GEN_NEON_INTEGER_OP(abd);
5172             tcg_temp_free_i32(tmp2);
5173             tmp2 = neon_load_reg(rd, pass);
5174             gen_neon_add(size, tmp, tmp2);
5175             break;
5176         case NEON_3R_VMUL:
5177             /* VMUL.P8; other cases already eliminated.  */
5178             gen_helper_neon_mul_p8(tmp, tmp, tmp2);
5179             break;
5180         case NEON_3R_VPMAX:
5181             GEN_NEON_INTEGER_OP(pmax);
5182             break;
5183         case NEON_3R_VPMIN:
5184             GEN_NEON_INTEGER_OP(pmin);
5185             break;
5186         case NEON_3R_VQDMULH_VQRDMULH: /* Multiply high.  */
5187             if (!u) { /* VQDMULH */
5188                 switch (size) {
5189                 case 1:
5190                     gen_helper_neon_qdmulh_s16(tmp, cpu_env, tmp, tmp2);
5191                     break;
5192                 case 2:
5193                     gen_helper_neon_qdmulh_s32(tmp, cpu_env, tmp, tmp2);
5194                     break;
5195                 default: abort();
5196                 }
5197             } else { /* VQRDMULH */
5198                 switch (size) {
5199                 case 1:
5200                     gen_helper_neon_qrdmulh_s16(tmp, cpu_env, tmp, tmp2);
5201                     break;
5202                 case 2:
5203                     gen_helper_neon_qrdmulh_s32(tmp, cpu_env, tmp, tmp2);
5204                     break;
5205                 default: abort();
5206                 }
5207             }
5208             break;
5209         case NEON_3R_VPADD_VQRDMLAH:
5210             switch (size) {
5211             case 0: gen_helper_neon_padd_u8(tmp, tmp, tmp2); break;
5212             case 1: gen_helper_neon_padd_u16(tmp, tmp, tmp2); break;
5213             case 2: tcg_gen_add_i32(tmp, tmp, tmp2); break;
5214             default: abort();
5215             }
5216             break;
5217         case NEON_3R_FLOAT_ARITH: /* Floating point arithmetic. */
5218         {
5219             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
5220             switch ((u << 2) | size) {
5221             case 0: /* VADD */
5222             case 4: /* VPADD */
5223                 gen_helper_vfp_adds(tmp, tmp, tmp2, fpstatus);
5224                 break;
5225             case 2: /* VSUB */
5226                 gen_helper_vfp_subs(tmp, tmp, tmp2, fpstatus);
5227                 break;
5228             case 6: /* VABD */
5229                 gen_helper_neon_abd_f32(tmp, tmp, tmp2, fpstatus);
5230                 break;
5231             default:
5232                 abort();
5233             }
5234             tcg_temp_free_ptr(fpstatus);
5235             break;
5236         }
5237         case NEON_3R_FLOAT_MULTIPLY:
5238         {
5239             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
5240             gen_helper_vfp_muls(tmp, tmp, tmp2, fpstatus);
5241             if (!u) {
5242                 tcg_temp_free_i32(tmp2);
5243                 tmp2 = neon_load_reg(rd, pass);
5244                 if (size == 0) {
5245                     gen_helper_vfp_adds(tmp, tmp, tmp2, fpstatus);
5246                 } else {
5247                     gen_helper_vfp_subs(tmp, tmp2, tmp, fpstatus);
5248                 }
5249             }
5250             tcg_temp_free_ptr(fpstatus);
5251             break;
5252         }
5253         case NEON_3R_FLOAT_CMP:
5254         {
5255             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
5256             if (!u) {
5257                 gen_helper_neon_ceq_f32(tmp, tmp, tmp2, fpstatus);
5258             } else {
5259                 if (size == 0) {
5260                     gen_helper_neon_cge_f32(tmp, tmp, tmp2, fpstatus);
5261                 } else {
5262                     gen_helper_neon_cgt_f32(tmp, tmp, tmp2, fpstatus);
5263                 }
5264             }
5265             tcg_temp_free_ptr(fpstatus);
5266             break;
5267         }
5268         case NEON_3R_FLOAT_ACMP:
5269         {
5270             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
5271             if (size == 0) {
5272                 gen_helper_neon_acge_f32(tmp, tmp, tmp2, fpstatus);
5273             } else {
5274                 gen_helper_neon_acgt_f32(tmp, tmp, tmp2, fpstatus);
5275             }
5276             tcg_temp_free_ptr(fpstatus);
5277             break;
5278         }
5279         case NEON_3R_FLOAT_MINMAX:
5280         {
5281             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
5282             if (size == 0) {
5283                 gen_helper_vfp_maxs(tmp, tmp, tmp2, fpstatus);
5284             } else {
5285                 gen_helper_vfp_mins(tmp, tmp, tmp2, fpstatus);
5286             }
5287             tcg_temp_free_ptr(fpstatus);
5288             break;
5289         }
5290         case NEON_3R_FLOAT_MISC:
5291             if (u) {
5292                 /* VMAXNM/VMINNM */
5293                 TCGv_ptr fpstatus = get_fpstatus_ptr(1);
5294                 if (size == 0) {
5295                     gen_helper_vfp_maxnums(tmp, tmp, tmp2, fpstatus);
5296                 } else {
5297                     gen_helper_vfp_minnums(tmp, tmp, tmp2, fpstatus);
5298                 }
5299                 tcg_temp_free_ptr(fpstatus);
5300             } else {
5301                 if (size == 0) {
5302                     gen_helper_recps_f32(tmp, tmp, tmp2, cpu_env);
5303                 } else {
5304                     gen_helper_rsqrts_f32(tmp, tmp, tmp2, cpu_env);
5305               }
5306             }
5307             break;
5308         case NEON_3R_VFM_VQRDMLSH:
5309         {
5310             /* VFMA, VFMS: fused multiply-add */
5311             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
5312             TCGv_i32 tmp3 = neon_load_reg(rd, pass);
5313             if (size) {
5314                 /* VFMS */
5315                 gen_helper_vfp_negs(tmp, tmp);
5316             }
5317             gen_helper_vfp_muladds(tmp, tmp, tmp2, tmp3, fpstatus);
5318             tcg_temp_free_i32(tmp3);
5319             tcg_temp_free_ptr(fpstatus);
5320             break;
5321         }
5322         default:
5323             abort();
5324         }
5325         tcg_temp_free_i32(tmp2);
5326
5327         /* Save the result.  For elementwise operations we can put it
5328            straight into the destination register.  For pairwise operations
5329            we have to be careful to avoid clobbering the source operands.  */
5330         if (pairwise && rd == rm) {
5331             neon_store_scratch(pass, tmp);
5332         } else {
5333             neon_store_reg(rd, pass, tmp);
5334         }
5335
5336         } /* for pass */
5337         if (pairwise && rd == rm) {
5338             for (pass = 0; pass < (q ? 4 : 2); pass++) {
5339                 tmp = neon_load_scratch(pass);
5340                 neon_store_reg(rd, pass, tmp);
5341             }
5342         }
5343         /* End of 3 register same size operations.  */
5344     } else if (insn & (1 << 4)) {
5345         if ((insn & 0x00380080) != 0) {
5346             /* Two registers and shift.  */
5347             op = (insn >> 8) & 0xf;
5348             if (insn & (1 << 7)) {
5349                 /* 64-bit shift. */
5350                 if (op > 7) {
5351                     return 1;
5352                 }
5353                 size = 3;
5354             } else {
5355                 size = 2;
5356                 while ((insn & (1 << (size + 19))) == 0)
5357                     size--;
5358             }
5359             shift = (insn >> 16) & ((1 << (3 + size)) - 1);
5360             if (op < 8) {
5361                 /* Shift by immediate:
5362                    VSHR, VSRA, VRSHR, VRSRA, VSRI, VSHL, VQSHL, VQSHLU.  */
5363                 if (q && ((rd | rm) & 1)) {
5364                     return 1;
5365                 }
5366                 if (!u && (op == 4 || op == 6)) {
5367                     return 1;
5368                 }
5369                 /* Right shifts are encoded as N - shift, where N is the
5370                    element size in bits.  */
5371                 if (op <= 4) {
5372                     shift = shift - (1 << (size + 3));
5373                 }
5374
5375                 switch (op) {
5376                 case 0:  /* VSHR */
5377                     /* Right shift comes here negative.  */
5378                     shift = -shift;
5379                     /* Shifts larger than the element size are architecturally
5380                      * valid.  Unsigned results in all zeros; signed results
5381                      * in all sign bits.
5382                      */
5383                     if (!u) {
5384                         tcg_gen_gvec_sari(size, rd_ofs, rm_ofs,
5385                                           MIN(shift, (8 << size) - 1),
5386                                           vec_size, vec_size);
5387                     } else if (shift >= 8 << size) {
5388                         tcg_gen_gvec_dup8i(rd_ofs, vec_size, vec_size, 0);
5389                     } else {
5390                         tcg_gen_gvec_shri(size, rd_ofs, rm_ofs, shift,
5391                                           vec_size, vec_size);
5392                     }
5393                     return 0;
5394
5395                 case 1:  /* VSRA */
5396                     /* Right shift comes here negative.  */
5397                     shift = -shift;
5398                     /* Shifts larger than the element size are architecturally
5399                      * valid.  Unsigned results in all zeros; signed results
5400                      * in all sign bits.
5401                      */
5402                     if (!u) {
5403                         tcg_gen_gvec_2i(rd_ofs, rm_ofs, vec_size, vec_size,
5404                                         MIN(shift, (8 << size) - 1),
5405                                         &ssra_op[size]);
5406                     } else if (shift >= 8 << size) {
5407                         /* rd += 0 */
5408                     } else {
5409                         tcg_gen_gvec_2i(rd_ofs, rm_ofs, vec_size, vec_size,
5410                                         shift, &usra_op[size]);
5411                     }
5412                     return 0;
5413
5414                 case 4: /* VSRI */
5415                     if (!u) {
5416                         return 1;
5417                     }
5418                     /* Right shift comes here negative.  */
5419                     shift = -shift;
5420                     /* Shift out of range leaves destination unchanged.  */
5421                     if (shift < 8 << size) {
5422                         tcg_gen_gvec_2i(rd_ofs, rm_ofs, vec_size, vec_size,
5423                                         shift, &sri_op[size]);
5424                     }
5425                     return 0;
5426
5427                 case 5: /* VSHL, VSLI */
5428                     if (u) { /* VSLI */
5429                         /* Shift out of range leaves destination unchanged.  */
5430                         if (shift < 8 << size) {
5431                             tcg_gen_gvec_2i(rd_ofs, rm_ofs, vec_size,
5432                                             vec_size, shift, &sli_op[size]);
5433                         }
5434                     } else { /* VSHL */
5435                         /* Shifts larger than the element size are
5436                          * architecturally valid and results in zero.
5437                          */
5438                         if (shift >= 8 << size) {
5439                             tcg_gen_gvec_dup8i(rd_ofs, vec_size, vec_size, 0);
5440                         } else {
5441                             tcg_gen_gvec_shli(size, rd_ofs, rm_ofs, shift,
5442                                               vec_size, vec_size);
5443                         }
5444                     }
5445                     return 0;
5446                 }
5447
5448                 if (size == 3) {
5449                     count = q + 1;
5450                 } else {
5451                     count = q ? 4: 2;
5452                 }
5453
5454                 /* To avoid excessive duplication of ops we implement shift
5455                  * by immediate using the variable shift operations.
5456                   */
5457                 imm = dup_const(size, shift);
5458
5459                 for (pass = 0; pass < count; pass++) {
5460                     if (size == 3) {
5461                         neon_load_reg64(cpu_V0, rm + pass);
5462                         tcg_gen_movi_i64(cpu_V1, imm);
5463                         switch (op) {
5464                         case 2: /* VRSHR */
5465                         case 3: /* VRSRA */
5466                             if (u)
5467                                 gen_helper_neon_rshl_u64(cpu_V0, cpu_V0, cpu_V1);
5468                             else
5469                                 gen_helper_neon_rshl_s64(cpu_V0, cpu_V0, cpu_V1);
5470                             break;
5471                         case 6: /* VQSHLU */
5472                             gen_helper_neon_qshlu_s64(cpu_V0, cpu_env,
5473                                                       cpu_V0, cpu_V1);
5474                             break;
5475                         case 7: /* VQSHL */
5476                             if (u) {
5477                                 gen_helper_neon_qshl_u64(cpu_V0, cpu_env,
5478                                                          cpu_V0, cpu_V1);
5479                             } else {
5480                                 gen_helper_neon_qshl_s64(cpu_V0, cpu_env,
5481                                                          cpu_V0, cpu_V1);
5482                             }
5483                             break;
5484                         default:
5485                             g_assert_not_reached();
5486                         }
5487                         if (op == 3) {
5488                             /* Accumulate.  */
5489                             neon_load_reg64(cpu_V1, rd + pass);
5490                             tcg_gen_add_i64(cpu_V0, cpu_V0, cpu_V1);
5491                         }
5492                         neon_store_reg64(cpu_V0, rd + pass);
5493                     } else { /* size < 3 */
5494                         /* Operands in T0 and T1.  */
5495                         tmp = neon_load_reg(rm, pass);
5496                         tmp2 = tcg_temp_new_i32();
5497                         tcg_gen_movi_i32(tmp2, imm);
5498                         switch (op) {
5499                         case 2: /* VRSHR */
5500                         case 3: /* VRSRA */
5501                             GEN_NEON_INTEGER_OP(rshl);
5502                             break;
5503                         case 6: /* VQSHLU */
5504                             switch (size) {
5505                             case 0:
5506                                 gen_helper_neon_qshlu_s8(tmp, cpu_env,
5507                                                          tmp, tmp2);
5508                                 break;
5509                             case 1:
5510                                 gen_helper_neon_qshlu_s16(tmp, cpu_env,
5511                                                           tmp, tmp2);
5512                                 break;
5513                             case 2:
5514                                 gen_helper_neon_qshlu_s32(tmp, cpu_env,
5515                                                           tmp, tmp2);
5516                                 break;
5517                             default:
5518                                 abort();
5519                             }
5520                             break;
5521                         case 7: /* VQSHL */
5522                             GEN_NEON_INTEGER_OP_ENV(qshl);
5523                             break;
5524                         default:
5525                             g_assert_not_reached();
5526                         }
5527                         tcg_temp_free_i32(tmp2);
5528
5529                         if (op == 3) {
5530                             /* Accumulate.  */
5531                             tmp2 = neon_load_reg(rd, pass);
5532                             gen_neon_add(size, tmp, tmp2);
5533                             tcg_temp_free_i32(tmp2);
5534                         }
5535                         neon_store_reg(rd, pass, tmp);
5536                     }
5537                 } /* for pass */
5538             } else if (op < 10) {
5539                 /* Shift by immediate and narrow:
5540                    VSHRN, VRSHRN, VQSHRN, VQRSHRN.  */
5541                 int input_unsigned = (op == 8) ? !u : u;
5542                 if (rm & 1) {
5543                     return 1;
5544                 }
5545                 shift = shift - (1 << (size + 3));
5546                 size++;
5547                 if (size == 3) {
5548                     tmp64 = tcg_const_i64(shift);
5549                     neon_load_reg64(cpu_V0, rm);
5550                     neon_load_reg64(cpu_V1, rm + 1);
5551                     for (pass = 0; pass < 2; pass++) {
5552                         TCGv_i64 in;
5553                         if (pass == 0) {
5554                             in = cpu_V0;
5555                         } else {
5556                             in = cpu_V1;
5557                         }
5558                         if (q) {
5559                             if (input_unsigned) {
5560                                 gen_helper_neon_rshl_u64(cpu_V0, in, tmp64);
5561                             } else {
5562                                 gen_helper_neon_rshl_s64(cpu_V0, in, tmp64);
5563                             }
5564                         } else {
5565                             if (input_unsigned) {
5566                                 gen_helper_neon_shl_u64(cpu_V0, in, tmp64);
5567                             } else {
5568                                 gen_helper_neon_shl_s64(cpu_V0, in, tmp64);
5569                             }
5570                         }
5571                         tmp = tcg_temp_new_i32();
5572                         gen_neon_narrow_op(op == 8, u, size - 1, tmp, cpu_V0);
5573                         neon_store_reg(rd, pass, tmp);
5574                     } /* for pass */
5575                     tcg_temp_free_i64(tmp64);
5576                 } else {
5577                     if (size == 1) {
5578                         imm = (uint16_t)shift;
5579                         imm |= imm << 16;
5580                     } else {
5581                         /* size == 2 */
5582                         imm = (uint32_t)shift;
5583                     }
5584                     tmp2 = tcg_const_i32(imm);
5585                     tmp4 = neon_load_reg(rm + 1, 0);
5586                     tmp5 = neon_load_reg(rm + 1, 1);
5587                     for (pass = 0; pass < 2; pass++) {
5588                         if (pass == 0) {
5589                             tmp = neon_load_reg(rm, 0);
5590                         } else {
5591                             tmp = tmp4;
5592                         }
5593                         gen_neon_shift_narrow(size, tmp, tmp2, q,
5594                                               input_unsigned);
5595                         if (pass == 0) {
5596                             tmp3 = neon_load_reg(rm, 1);
5597                         } else {
5598                             tmp3 = tmp5;
5599                         }
5600                         gen_neon_shift_narrow(size, tmp3, tmp2, q,
5601                                               input_unsigned);
5602                         tcg_gen_concat_i32_i64(cpu_V0, tmp, tmp3);
5603                         tcg_temp_free_i32(tmp);
5604                         tcg_temp_free_i32(tmp3);
5605                         tmp = tcg_temp_new_i32();
5606                         gen_neon_narrow_op(op == 8, u, size - 1, tmp, cpu_V0);
5607                         neon_store_reg(rd, pass, tmp);
5608                     } /* for pass */
5609                     tcg_temp_free_i32(tmp2);
5610                 }
5611             } else if (op == 10) {
5612                 /* VSHLL, VMOVL */
5613                 if (q || (rd & 1)) {
5614                     return 1;
5615                 }
5616                 tmp = neon_load_reg(rm, 0);
5617                 tmp2 = neon_load_reg(rm, 1);
5618                 for (pass = 0; pass < 2; pass++) {
5619                     if (pass == 1)
5620                         tmp = tmp2;
5621
5622                     gen_neon_widen(cpu_V0, tmp, size, u);
5623
5624                     if (shift != 0) {
5625                         /* The shift is less than the width of the source
5626                            type, so we can just shift the whole register.  */
5627                         tcg_gen_shli_i64(cpu_V0, cpu_V0, shift);
5628                         /* Widen the result of shift: we need to clear
5629                          * the potential overflow bits resulting from
5630                          * left bits of the narrow input appearing as
5631                          * right bits of left the neighbour narrow
5632                          * input.  */
5633                         if (size < 2 || !u) {
5634                             uint64_t imm64;
5635                             if (size == 0) {
5636                                 imm = (0xffu >> (8 - shift));
5637                                 imm |= imm << 16;
5638                             } else if (size == 1) {
5639                                 imm = 0xffff >> (16 - shift);
5640                             } else {
5641                                 /* size == 2 */
5642                                 imm = 0xffffffff >> (32 - shift);
5643                             }
5644                             if (size < 2) {
5645                                 imm64 = imm | (((uint64_t)imm) << 32);
5646                             } else {
5647                                 imm64 = imm;
5648                             }
5649                             tcg_gen_andi_i64(cpu_V0, cpu_V0, ~imm64);
5650                         }
5651                     }
5652                     neon_store_reg64(cpu_V0, rd + pass);
5653                 }
5654             } else if (op >= 14) {
5655                 /* VCVT fixed-point.  */
5656                 TCGv_ptr fpst;
5657                 TCGv_i32 shiftv;
5658                 VFPGenFixPointFn *fn;
5659
5660                 if (!(insn & (1 << 21)) || (q && ((rd | rm) & 1))) {
5661                     return 1;
5662                 }
5663
5664                 if (!(op & 1)) {
5665                     if (u) {
5666                         fn = gen_helper_vfp_ultos;
5667                     } else {
5668                         fn = gen_helper_vfp_sltos;
5669                     }
5670                 } else {
5671                     if (u) {
5672                         fn = gen_helper_vfp_touls_round_to_zero;
5673                     } else {
5674                         fn = gen_helper_vfp_tosls_round_to_zero;
5675                     }
5676                 }
5677
5678                 /* We have already masked out the must-be-1 top bit of imm6,
5679                  * hence this 32-shift where the ARM ARM has 64-imm6.
5680                  */
5681                 shift = 32 - shift;
5682                 fpst = get_fpstatus_ptr(1);
5683                 shiftv = tcg_const_i32(shift);
5684                 for (pass = 0; pass < (q ? 4 : 2); pass++) {
5685                     TCGv_i32 tmpf = neon_load_reg(rm, pass);
5686                     fn(tmpf, tmpf, shiftv, fpst);
5687                     neon_store_reg(rd, pass, tmpf);
5688                 }
5689                 tcg_temp_free_ptr(fpst);
5690                 tcg_temp_free_i32(shiftv);
5691             } else {
5692                 return 1;
5693             }
5694         } else { /* (insn & 0x00380080) == 0 */
5695             int invert, reg_ofs, vec_size;
5696
5697             if (q && (rd & 1)) {
5698                 return 1;
5699             }
5700
5701             op = (insn >> 8) & 0xf;
5702             /* One register and immediate.  */
5703             imm = (u << 7) | ((insn >> 12) & 0x70) | (insn & 0xf);
5704             invert = (insn & (1 << 5)) != 0;
5705             /* Note that op = 2,3,4,5,6,7,10,11,12,13 imm=0 is UNPREDICTABLE.
5706              * We choose to not special-case this and will behave as if a
5707              * valid constant encoding of 0 had been given.
5708              */
5709             switch (op) {
5710             case 0: case 1:
5711                 /* no-op */
5712                 break;
5713             case 2: case 3:
5714                 imm <<= 8;
5715                 break;
5716             case 4: case 5:
5717                 imm <<= 16;
5718                 break;
5719             case 6: case 7:
5720                 imm <<= 24;
5721                 break;
5722             case 8: case 9:
5723                 imm |= imm << 16;
5724                 break;
5725             case 10: case 11:
5726                 imm = (imm << 8) | (imm << 24);
5727                 break;
5728             case 12:
5729                 imm = (imm << 8) | 0xff;
5730                 break;
5731             case 13:
5732                 imm = (imm << 16) | 0xffff;
5733                 break;
5734             case 14:
5735                 imm |= (imm << 8) | (imm << 16) | (imm << 24);
5736                 if (invert) {
5737                     imm = ~imm;
5738                 }
5739                 break;
5740             case 15:
5741                 if (invert) {
5742                     return 1;
5743                 }
5744                 imm = ((imm & 0x80) << 24) | ((imm & 0x3f) << 19)
5745                       | ((imm & 0x40) ? (0x1f << 25) : (1 << 30));
5746                 break;
5747             }
5748             if (invert) {
5749                 imm = ~imm;
5750             }
5751
5752             reg_ofs = neon_reg_offset(rd, 0);
5753             vec_size = q ? 16 : 8;
5754
5755             if (op & 1 && op < 12) {
5756                 if (invert) {
5757                     /* The immediate value has already been inverted,
5758                      * so BIC becomes AND.
5759                      */
5760                     tcg_gen_gvec_andi(MO_32, reg_ofs, reg_ofs, imm,
5761                                       vec_size, vec_size);
5762                 } else {
5763                     tcg_gen_gvec_ori(MO_32, reg_ofs, reg_ofs, imm,
5764                                      vec_size, vec_size);
5765                 }
5766             } else {
5767                 /* VMOV, VMVN.  */
5768                 if (op == 14 && invert) {
5769                     TCGv_i64 t64 = tcg_temp_new_i64();
5770
5771                     for (pass = 0; pass <= q; ++pass) {
5772                         uint64_t val = 0;
5773                         int n;
5774
5775                         for (n = 0; n < 8; n++) {
5776                             if (imm & (1 << (n + pass * 8))) {
5777                                 val |= 0xffull << (n * 8);
5778                             }
5779                         }
5780                         tcg_gen_movi_i64(t64, val);
5781                         neon_store_reg64(t64, rd + pass);
5782                     }
5783                     tcg_temp_free_i64(t64);
5784                 } else {
5785                     tcg_gen_gvec_dup32i(reg_ofs, vec_size, vec_size, imm);
5786                 }
5787             }
5788         }
5789     } else { /* (insn & 0x00800010 == 0x00800000) */
5790         if (size != 3) {
5791             op = (insn >> 8) & 0xf;
5792             if ((insn & (1 << 6)) == 0) {
5793                 /* Three registers of different lengths.  */
5794                 int src1_wide;
5795                 int src2_wide;
5796                 int prewiden;
5797                 /* undefreq: bit 0 : UNDEF if size == 0
5798                  *           bit 1 : UNDEF if size == 1
5799                  *           bit 2 : UNDEF if size == 2
5800                  *           bit 3 : UNDEF if U == 1
5801                  * Note that [2:0] set implies 'always UNDEF'
5802                  */
5803                 int undefreq;
5804                 /* prewiden, src1_wide, src2_wide, undefreq */
5805                 static const int neon_3reg_wide[16][4] = {
5806                     {1, 0, 0, 0}, /* VADDL */
5807                     {1, 1, 0, 0}, /* VADDW */
5808                     {1, 0, 0, 0}, /* VSUBL */
5809                     {1, 1, 0, 0}, /* VSUBW */
5810                     {0, 1, 1, 0}, /* VADDHN */
5811                     {0, 0, 0, 0}, /* VABAL */
5812                     {0, 1, 1, 0}, /* VSUBHN */
5813                     {0, 0, 0, 0}, /* VABDL */
5814                     {0, 0, 0, 0}, /* VMLAL */
5815                     {0, 0, 0, 9}, /* VQDMLAL */
5816                     {0, 0, 0, 0}, /* VMLSL */
5817                     {0, 0, 0, 9}, /* VQDMLSL */
5818                     {0, 0, 0, 0}, /* Integer VMULL */
5819                     {0, 0, 0, 1}, /* VQDMULL */
5820                     {0, 0, 0, 0xa}, /* Polynomial VMULL */
5821                     {0, 0, 0, 7}, /* Reserved: always UNDEF */
5822                 };
5823
5824                 prewiden = neon_3reg_wide[op][0];
5825                 src1_wide = neon_3reg_wide[op][1];
5826                 src2_wide = neon_3reg_wide[op][2];
5827                 undefreq = neon_3reg_wide[op][3];
5828
5829                 if ((undefreq & (1 << size)) ||
5830                     ((undefreq & 8) && u)) {
5831                     return 1;
5832                 }
5833                 if ((src1_wide && (rn & 1)) ||
5834                     (src2_wide && (rm & 1)) ||
5835                     (!src2_wide && (rd & 1))) {
5836                     return 1;
5837                 }
5838
5839                 /* Handle VMULL.P64 (Polynomial 64x64 to 128 bit multiply)
5840                  * outside the loop below as it only performs a single pass.
5841                  */
5842                 if (op == 14 && size == 2) {
5843                     TCGv_i64 tcg_rn, tcg_rm, tcg_rd;
5844
5845                     if (!dc_isar_feature(aa32_pmull, s)) {
5846                         return 1;
5847                     }
5848                     tcg_rn = tcg_temp_new_i64();
5849                     tcg_rm = tcg_temp_new_i64();
5850                     tcg_rd = tcg_temp_new_i64();
5851                     neon_load_reg64(tcg_rn, rn);
5852                     neon_load_reg64(tcg_rm, rm);
5853                     gen_helper_neon_pmull_64_lo(tcg_rd, tcg_rn, tcg_rm);
5854                     neon_store_reg64(tcg_rd, rd);
5855                     gen_helper_neon_pmull_64_hi(tcg_rd, tcg_rn, tcg_rm);
5856                     neon_store_reg64(tcg_rd, rd + 1);
5857                     tcg_temp_free_i64(tcg_rn);
5858                     tcg_temp_free_i64(tcg_rm);
5859                     tcg_temp_free_i64(tcg_rd);
5860                     return 0;
5861                 }
5862
5863                 /* Avoid overlapping operands.  Wide source operands are
5864                    always aligned so will never overlap with wide
5865                    destinations in problematic ways.  */
5866                 if (rd == rm && !src2_wide) {
5867                     tmp = neon_load_reg(rm, 1);
5868                     neon_store_scratch(2, tmp);
5869                 } else if (rd == rn && !src1_wide) {
5870                     tmp = neon_load_reg(rn, 1);
5871                     neon_store_scratch(2, tmp);
5872                 }
5873                 tmp3 = NULL;
5874                 for (pass = 0; pass < 2; pass++) {
5875                     if (src1_wide) {
5876                         neon_load_reg64(cpu_V0, rn + pass);
5877                         tmp = NULL;
5878                     } else {
5879                         if (pass == 1 && rd == rn) {
5880                             tmp = neon_load_scratch(2);
5881                         } else {
5882                             tmp = neon_load_reg(rn, pass);
5883                         }
5884                         if (prewiden) {
5885                             gen_neon_widen(cpu_V0, tmp, size, u);
5886                         }
5887                     }
5888                     if (src2_wide) {
5889                         neon_load_reg64(cpu_V1, rm + pass);
5890                         tmp2 = NULL;
5891                     } else {
5892                         if (pass == 1 && rd == rm) {
5893                             tmp2 = neon_load_scratch(2);
5894                         } else {
5895                             tmp2 = neon_load_reg(rm, pass);
5896                         }
5897                         if (prewiden) {
5898                             gen_neon_widen(cpu_V1, tmp2, size, u);
5899                         }
5900                     }
5901                     switch (op) {
5902                     case 0: case 1: case 4: /* VADDL, VADDW, VADDHN, VRADDHN */
5903                         gen_neon_addl(size);
5904                         break;
5905                     case 2: case 3: case 6: /* VSUBL, VSUBW, VSUBHN, VRSUBHN */
5906                         gen_neon_subl(size);
5907                         break;
5908                     case 5: case 7: /* VABAL, VABDL */
5909                         switch ((size << 1) | u) {
5910                         case 0:
5911                             gen_helper_neon_abdl_s16(cpu_V0, tmp, tmp2);
5912                             break;
5913                         case 1:
5914                             gen_helper_neon_abdl_u16(cpu_V0, tmp, tmp2);
5915                             break;
5916                         case 2:
5917                             gen_helper_neon_abdl_s32(cpu_V0, tmp, tmp2);
5918                             break;
5919                         case 3:
5920                             gen_helper_neon_abdl_u32(cpu_V0, tmp, tmp2);
5921                             break;
5922                         case 4:
5923                             gen_helper_neon_abdl_s64(cpu_V0, tmp, tmp2);
5924                             break;
5925                         case 5:
5926                             gen_helper_neon_abdl_u64(cpu_V0, tmp, tmp2);
5927                             break;
5928                         default: abort();
5929                         }
5930                         tcg_temp_free_i32(tmp2);
5931                         tcg_temp_free_i32(tmp);
5932                         break;
5933                     case 8: case 9: case 10: case 11: case 12: case 13:
5934                         /* VMLAL, VQDMLAL, VMLSL, VQDMLSL, VMULL, VQDMULL */
5935                         gen_neon_mull(cpu_V0, tmp, tmp2, size, u);
5936                         break;
5937                     case 14: /* Polynomial VMULL */
5938                         gen_helper_neon_mull_p8(cpu_V0, tmp, tmp2);
5939                         tcg_temp_free_i32(tmp2);
5940                         tcg_temp_free_i32(tmp);
5941                         break;
5942                     default: /* 15 is RESERVED: caught earlier  */
5943                         abort();
5944                     }
5945                     if (op == 13) {
5946                         /* VQDMULL */
5947                         gen_neon_addl_saturate(cpu_V0, cpu_V0, size);
5948                         neon_store_reg64(cpu_V0, rd + pass);
5949                     } else if (op == 5 || (op >= 8 && op <= 11)) {
5950                         /* Accumulate.  */
5951                         neon_load_reg64(cpu_V1, rd + pass);
5952                         switch (op) {
5953                         case 10: /* VMLSL */
5954                             gen_neon_negl(cpu_V0, size);
5955                             /* Fall through */
5956                         case 5: case 8: /* VABAL, VMLAL */
5957                             gen_neon_addl(size);
5958                             break;
5959                         case 9: case 11: /* VQDMLAL, VQDMLSL */
5960                             gen_neon_addl_saturate(cpu_V0, cpu_V0, size);
5961                             if (op == 11) {
5962                                 gen_neon_negl(cpu_V0, size);
5963                             }
5964                             gen_neon_addl_saturate(cpu_V0, cpu_V1, size);
5965                             break;
5966                         default:
5967                             abort();
5968                         }
5969                         neon_store_reg64(cpu_V0, rd + pass);
5970                     } else if (op == 4 || op == 6) {
5971                         /* Narrowing operation.  */
5972                         tmp = tcg_temp_new_i32();
5973                         if (!u) {
5974                             switch (size) {
5975                             case 0:
5976                                 gen_helper_neon_narrow_high_u8(tmp, cpu_V0);
5977                                 break;
5978                             case 1:
5979                                 gen_helper_neon_narrow_high_u16(tmp, cpu_V0);
5980                                 break;
5981                             case 2:
5982                                 tcg_gen_extrh_i64_i32(tmp, cpu_V0);
5983                                 break;
5984                             default: abort();
5985                             }
5986                         } else {
5987                             switch (size) {
5988                             case 0:
5989                                 gen_helper_neon_narrow_round_high_u8(tmp, cpu_V0);
5990                                 break;
5991                             case 1:
5992                                 gen_helper_neon_narrow_round_high_u16(tmp, cpu_V0);
5993                                 break;
5994                             case 2:
5995                                 tcg_gen_addi_i64(cpu_V0, cpu_V0, 1u << 31);
5996                                 tcg_gen_extrh_i64_i32(tmp, cpu_V0);
5997                                 break;
5998                             default: abort();
5999                             }
6000                         }
6001                         if (pass == 0) {
6002                             tmp3 = tmp;
6003                         } else {
6004                             neon_store_reg(rd, 0, tmp3);
6005                             neon_store_reg(rd, 1, tmp);
6006                         }
6007                     } else {
6008                         /* Write back the result.  */
6009                         neon_store_reg64(cpu_V0, rd + pass);
6010                     }
6011                 }
6012             } else {
6013                 /* Two registers and a scalar. NB that for ops of this form
6014                  * the ARM ARM labels bit 24 as Q, but it is in our variable
6015                  * 'u', not 'q'.
6016                  */
6017                 if (size == 0) {
6018                     return 1;
6019                 }
6020                 switch (op) {
6021                 case 1: /* Float VMLA scalar */
6022                 case 5: /* Floating point VMLS scalar */
6023                 case 9: /* Floating point VMUL scalar */
6024                     if (size == 1) {
6025                         return 1;
6026                     }
6027                     /* fall through */
6028                 case 0: /* Integer VMLA scalar */
6029                 case 4: /* Integer VMLS scalar */
6030                 case 8: /* Integer VMUL scalar */
6031                 case 12: /* VQDMULH scalar */
6032                 case 13: /* VQRDMULH scalar */
6033                     if (u && ((rd | rn) & 1)) {
6034                         return 1;
6035                     }
6036                     tmp = neon_get_scalar(size, rm);
6037                     neon_store_scratch(0, tmp);
6038                     for (pass = 0; pass < (u ? 4 : 2); pass++) {
6039                         tmp = neon_load_scratch(0);
6040                         tmp2 = neon_load_reg(rn, pass);
6041                         if (op == 12) {
6042                             if (size == 1) {
6043                                 gen_helper_neon_qdmulh_s16(tmp, cpu_env, tmp, tmp2);
6044                             } else {
6045                                 gen_helper_neon_qdmulh_s32(tmp, cpu_env, tmp, tmp2);
6046                             }
6047                         } else if (op == 13) {
6048                             if (size == 1) {
6049                                 gen_helper_neon_qrdmulh_s16(tmp, cpu_env, tmp, tmp2);
6050                             } else {
6051                                 gen_helper_neon_qrdmulh_s32(tmp, cpu_env, tmp, tmp2);
6052                             }
6053                         } else if (op & 1) {
6054                             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6055                             gen_helper_vfp_muls(tmp, tmp, tmp2, fpstatus);
6056                             tcg_temp_free_ptr(fpstatus);
6057                         } else {
6058                             switch (size) {
6059                             case 0: gen_helper_neon_mul_u8(tmp, tmp, tmp2); break;
6060                             case 1: gen_helper_neon_mul_u16(tmp, tmp, tmp2); break;
6061                             case 2: tcg_gen_mul_i32(tmp, tmp, tmp2); break;
6062                             default: abort();
6063                             }
6064                         }
6065                         tcg_temp_free_i32(tmp2);
6066                         if (op < 8) {
6067                             /* Accumulate.  */
6068                             tmp2 = neon_load_reg(rd, pass);
6069                             switch (op) {
6070                             case 0:
6071                                 gen_neon_add(size, tmp, tmp2);
6072                                 break;
6073                             case 1:
6074                             {
6075                                 TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6076                                 gen_helper_vfp_adds(tmp, tmp, tmp2, fpstatus);
6077                                 tcg_temp_free_ptr(fpstatus);
6078                                 break;
6079                             }
6080                             case 4:
6081                                 gen_neon_rsb(size, tmp, tmp2);
6082                                 break;
6083                             case 5:
6084                             {
6085                                 TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6086                                 gen_helper_vfp_subs(tmp, tmp2, tmp, fpstatus);
6087                                 tcg_temp_free_ptr(fpstatus);
6088                                 break;
6089                             }
6090                             default:
6091                                 abort();
6092                             }
6093                             tcg_temp_free_i32(tmp2);
6094                         }
6095                         neon_store_reg(rd, pass, tmp);
6096                     }
6097                     break;
6098                 case 3: /* VQDMLAL scalar */
6099                 case 7: /* VQDMLSL scalar */
6100                 case 11: /* VQDMULL scalar */
6101                     if (u == 1) {
6102                         return 1;
6103                     }
6104                     /* fall through */
6105                 case 2: /* VMLAL sclar */
6106                 case 6: /* VMLSL scalar */
6107                 case 10: /* VMULL scalar */
6108                     if (rd & 1) {
6109                         return 1;
6110                     }
6111                     tmp2 = neon_get_scalar(size, rm);
6112                     /* We need a copy of tmp2 because gen_neon_mull
6113                      * deletes it during pass 0.  */
6114                     tmp4 = tcg_temp_new_i32();
6115                     tcg_gen_mov_i32(tmp4, tmp2);
6116                     tmp3 = neon_load_reg(rn, 1);
6117
6118                     for (pass = 0; pass < 2; pass++) {
6119                         if (pass == 0) {
6120                             tmp = neon_load_reg(rn, 0);
6121                         } else {
6122                             tmp = tmp3;
6123                             tmp2 = tmp4;
6124                         }
6125                         gen_neon_mull(cpu_V0, tmp, tmp2, size, u);
6126                         if (op != 11) {
6127                             neon_load_reg64(cpu_V1, rd + pass);
6128                         }
6129                         switch (op) {
6130                         case 6:
6131                             gen_neon_negl(cpu_V0, size);
6132                             /* Fall through */
6133                         case 2:
6134                             gen_neon_addl(size);
6135                             break;
6136                         case 3: case 7:
6137                             gen_neon_addl_saturate(cpu_V0, cpu_V0, size);
6138                             if (op == 7) {
6139                                 gen_neon_negl(cpu_V0, size);
6140                             }
6141                             gen_neon_addl_saturate(cpu_V0, cpu_V1, size);
6142                             break;
6143                         case 10:
6144                             /* no-op */
6145                             break;
6146                         case 11:
6147                             gen_neon_addl_saturate(cpu_V0, cpu_V0, size);
6148                             break;
6149                         default:
6150                             abort();
6151                         }
6152                         neon_store_reg64(cpu_V0, rd + pass);
6153                     }
6154                     break;
6155                 case 14: /* VQRDMLAH scalar */
6156                 case 15: /* VQRDMLSH scalar */
6157                     {
6158                         NeonGenThreeOpEnvFn *fn;
6159
6160                         if (!dc_isar_feature(aa32_rdm, s)) {
6161                             return 1;
6162                         }
6163                         if (u && ((rd | rn) & 1)) {
6164                             return 1;
6165                         }
6166                         if (op == 14) {
6167                             if (size == 1) {
6168                                 fn = gen_helper_neon_qrdmlah_s16;
6169                             } else {
6170                                 fn = gen_helper_neon_qrdmlah_s32;
6171                             }
6172                         } else {
6173                             if (size == 1) {
6174                                 fn = gen_helper_neon_qrdmlsh_s16;
6175                             } else {
6176                                 fn = gen_helper_neon_qrdmlsh_s32;
6177                             }
6178                         }
6179
6180                         tmp2 = neon_get_scalar(size, rm);
6181                         for (pass = 0; pass < (u ? 4 : 2); pass++) {
6182                             tmp = neon_load_reg(rn, pass);
6183                             tmp3 = neon_load_reg(rd, pass);
6184                             fn(tmp, cpu_env, tmp, tmp2, tmp3);
6185                             tcg_temp_free_i32(tmp3);
6186                             neon_store_reg(rd, pass, tmp);
6187                         }
6188                         tcg_temp_free_i32(tmp2);
6189                     }
6190                     break;
6191                 default:
6192                     g_assert_not_reached();
6193                 }
6194             }
6195         } else { /* size == 3 */
6196             if (!u) {
6197                 /* Extract.  */
6198                 imm = (insn >> 8) & 0xf;
6199
6200                 if (imm > 7 && !q)
6201                     return 1;
6202
6203                 if (q && ((rd | rn | rm) & 1)) {
6204                     return 1;
6205                 }
6206
6207                 if (imm == 0) {
6208                     neon_load_reg64(cpu_V0, rn);
6209                     if (q) {
6210                         neon_load_reg64(cpu_V1, rn + 1);
6211                     }
6212                 } else if (imm == 8) {
6213                     neon_load_reg64(cpu_V0, rn + 1);
6214                     if (q) {
6215                         neon_load_reg64(cpu_V1, rm);
6216                     }
6217                 } else if (q) {
6218                     tmp64 = tcg_temp_new_i64();
6219                     if (imm < 8) {
6220                         neon_load_reg64(cpu_V0, rn);
6221                         neon_load_reg64(tmp64, rn + 1);
6222                     } else {
6223                         neon_load_reg64(cpu_V0, rn + 1);
6224                         neon_load_reg64(tmp64, rm);
6225                     }
6226                     tcg_gen_shri_i64(cpu_V0, cpu_V0, (imm & 7) * 8);
6227                     tcg_gen_shli_i64(cpu_V1, tmp64, 64 - ((imm & 7) * 8));
6228                     tcg_gen_or_i64(cpu_V0, cpu_V0, cpu_V1);
6229                     if (imm < 8) {
6230                         neon_load_reg64(cpu_V1, rm);
6231                     } else {
6232                         neon_load_reg64(cpu_V1, rm + 1);
6233                         imm -= 8;
6234                     }
6235                     tcg_gen_shli_i64(cpu_V1, cpu_V1, 64 - (imm * 8));
6236                     tcg_gen_shri_i64(tmp64, tmp64, imm * 8);
6237                     tcg_gen_or_i64(cpu_V1, cpu_V1, tmp64);
6238                     tcg_temp_free_i64(tmp64);
6239                 } else {
6240                     /* BUGFIX */
6241                     neon_load_reg64(cpu_V0, rn);
6242                     tcg_gen_shri_i64(cpu_V0, cpu_V0, imm * 8);
6243                     neon_load_reg64(cpu_V1, rm);
6244                     tcg_gen_shli_i64(cpu_V1, cpu_V1, 64 - (imm * 8));
6245                     tcg_gen_or_i64(cpu_V0, cpu_V0, cpu_V1);
6246                 }
6247                 neon_store_reg64(cpu_V0, rd);
6248                 if (q) {
6249                     neon_store_reg64(cpu_V1, rd + 1);
6250                 }
6251             } else if ((insn & (1 << 11)) == 0) {
6252                 /* Two register misc.  */
6253                 op = ((insn >> 12) & 0x30) | ((insn >> 7) & 0xf);
6254                 size = (insn >> 18) & 3;
6255                 /* UNDEF for unknown op values and bad op-size combinations */
6256                 if ((neon_2rm_sizes[op] & (1 << size)) == 0) {
6257                     return 1;
6258                 }
6259                 if (neon_2rm_is_v8_op(op) &&
6260                     !arm_dc_feature(s, ARM_FEATURE_V8)) {
6261                     return 1;
6262                 }
6263                 if ((op != NEON_2RM_VMOVN && op != NEON_2RM_VQMOVN) &&
6264                     q && ((rm | rd) & 1)) {
6265                     return 1;
6266                 }
6267                 switch (op) {
6268                 case NEON_2RM_VREV64:
6269                     for (pass = 0; pass < (q ? 2 : 1); pass++) {
6270                         tmp = neon_load_reg(rm, pass * 2);
6271                         tmp2 = neon_load_reg(rm, pass * 2 + 1);
6272                         switch (size) {
6273                         case 0: tcg_gen_bswap32_i32(tmp, tmp); break;
6274                         case 1: gen_swap_half(tmp); break;
6275                         case 2: /* no-op */ break;
6276                         default: abort();
6277                         }
6278                         neon_store_reg(rd, pass * 2 + 1, tmp);
6279                         if (size == 2) {
6280                             neon_store_reg(rd, pass * 2, tmp2);
6281                         } else {
6282                             switch (size) {
6283                             case 0: tcg_gen_bswap32_i32(tmp2, tmp2); break;
6284                             case 1: gen_swap_half(tmp2); break;
6285                             default: abort();
6286                             }
6287                             neon_store_reg(rd, pass * 2, tmp2);
6288                         }
6289                     }
6290                     break;
6291                 case NEON_2RM_VPADDL: case NEON_2RM_VPADDL_U:
6292                 case NEON_2RM_VPADAL: case NEON_2RM_VPADAL_U:
6293                     for (pass = 0; pass < q + 1; pass++) {
6294                         tmp = neon_load_reg(rm, pass * 2);
6295                         gen_neon_widen(cpu_V0, tmp, size, op & 1);
6296                         tmp = neon_load_reg(rm, pass * 2 + 1);
6297                         gen_neon_widen(cpu_V1, tmp, size, op & 1);
6298                         switch (size) {
6299                         case 0: gen_helper_neon_paddl_u16(CPU_V001); break;
6300                         case 1: gen_helper_neon_paddl_u32(CPU_V001); break;
6301                         case 2: tcg_gen_add_i64(CPU_V001); break;
6302                         default: abort();
6303                         }
6304                         if (op >= NEON_2RM_VPADAL) {
6305                             /* Accumulate.  */
6306                             neon_load_reg64(cpu_V1, rd + pass);
6307                             gen_neon_addl(size);
6308                         }
6309                         neon_store_reg64(cpu_V0, rd + pass);
6310                     }
6311                     break;
6312                 case NEON_2RM_VTRN:
6313                     if (size == 2) {
6314                         int n;
6315                         for (n = 0; n < (q ? 4 : 2); n += 2) {
6316                             tmp = neon_load_reg(rm, n);
6317                             tmp2 = neon_load_reg(rd, n + 1);
6318                             neon_store_reg(rm, n, tmp2);
6319                             neon_store_reg(rd, n + 1, tmp);
6320                         }
6321                     } else {
6322                         goto elementwise;
6323                     }
6324                     break;
6325                 case NEON_2RM_VUZP:
6326                     if (gen_neon_unzip(rd, rm, size, q)) {
6327                         return 1;
6328                     }
6329                     break;
6330                 case NEON_2RM_VZIP:
6331                     if (gen_neon_zip(rd, rm, size, q)) {
6332                         return 1;
6333                     }
6334                     break;
6335                 case NEON_2RM_VMOVN: case NEON_2RM_VQMOVN:
6336                     /* also VQMOVUN; op field and mnemonics don't line up */
6337                     if (rm & 1) {
6338                         return 1;
6339                     }
6340                     tmp2 = NULL;
6341                     for (pass = 0; pass < 2; pass++) {
6342                         neon_load_reg64(cpu_V0, rm + pass);
6343                         tmp = tcg_temp_new_i32();
6344                         gen_neon_narrow_op(op == NEON_2RM_VMOVN, q, size,
6345                                            tmp, cpu_V0);
6346                         if (pass == 0) {
6347                             tmp2 = tmp;
6348                         } else {
6349                             neon_store_reg(rd, 0, tmp2);
6350                             neon_store_reg(rd, 1, tmp);
6351                         }
6352                     }
6353                     break;
6354                 case NEON_2RM_VSHLL:
6355                     if (q || (rd & 1)) {
6356                         return 1;
6357                     }
6358                     tmp = neon_load_reg(rm, 0);
6359                     tmp2 = neon_load_reg(rm, 1);
6360                     for (pass = 0; pass < 2; pass++) {
6361                         if (pass == 1)
6362                             tmp = tmp2;
6363                         gen_neon_widen(cpu_V0, tmp, size, 1);
6364                         tcg_gen_shli_i64(cpu_V0, cpu_V0, 8 << size);
6365                         neon_store_reg64(cpu_V0, rd + pass);
6366                     }
6367                     break;
6368                 case NEON_2RM_VCVT_F16_F32:
6369                 {
6370                     TCGv_ptr fpst;
6371                     TCGv_i32 ahp;
6372
6373                     if (!dc_isar_feature(aa32_fp16_spconv, s) ||
6374                         q || (rm & 1)) {
6375                         return 1;
6376                     }
6377                     fpst = get_fpstatus_ptr(true);
6378                     ahp = get_ahp_flag();
6379                     tmp = neon_load_reg(rm, 0);
6380                     gen_helper_vfp_fcvt_f32_to_f16(tmp, tmp, fpst, ahp);
6381                     tmp2 = neon_load_reg(rm, 1);
6382                     gen_helper_vfp_fcvt_f32_to_f16(tmp2, tmp2, fpst, ahp);
6383                     tcg_gen_shli_i32(tmp2, tmp2, 16);
6384                     tcg_gen_or_i32(tmp2, tmp2, tmp);
6385                     tcg_temp_free_i32(tmp);
6386                     tmp = neon_load_reg(rm, 2);
6387                     gen_helper_vfp_fcvt_f32_to_f16(tmp, tmp, fpst, ahp);
6388                     tmp3 = neon_load_reg(rm, 3);
6389                     neon_store_reg(rd, 0, tmp2);
6390                     gen_helper_vfp_fcvt_f32_to_f16(tmp3, tmp3, fpst, ahp);
6391                     tcg_gen_shli_i32(tmp3, tmp3, 16);
6392                     tcg_gen_or_i32(tmp3, tmp3, tmp);
6393                     neon_store_reg(rd, 1, tmp3);
6394                     tcg_temp_free_i32(tmp);
6395                     tcg_temp_free_i32(ahp);
6396                     tcg_temp_free_ptr(fpst);
6397                     break;
6398                 }
6399                 case NEON_2RM_VCVT_F32_F16:
6400                 {
6401                     TCGv_ptr fpst;
6402                     TCGv_i32 ahp;
6403                     if (!dc_isar_feature(aa32_fp16_spconv, s) ||
6404                         q || (rd & 1)) {
6405                         return 1;
6406                     }
6407                     fpst = get_fpstatus_ptr(true);
6408                     ahp = get_ahp_flag();
6409                     tmp3 = tcg_temp_new_i32();
6410                     tmp = neon_load_reg(rm, 0);
6411                     tmp2 = neon_load_reg(rm, 1);
6412                     tcg_gen_ext16u_i32(tmp3, tmp);
6413                     gen_helper_vfp_fcvt_f16_to_f32(tmp3, tmp3, fpst, ahp);
6414                     neon_store_reg(rd, 0, tmp3);
6415                     tcg_gen_shri_i32(tmp, tmp, 16);
6416                     gen_helper_vfp_fcvt_f16_to_f32(tmp, tmp, fpst, ahp);
6417                     neon_store_reg(rd, 1, tmp);
6418                     tmp3 = tcg_temp_new_i32();
6419                     tcg_gen_ext16u_i32(tmp3, tmp2);
6420                     gen_helper_vfp_fcvt_f16_to_f32(tmp3, tmp3, fpst, ahp);
6421                     neon_store_reg(rd, 2, tmp3);
6422                     tcg_gen_shri_i32(tmp2, tmp2, 16);
6423                     gen_helper_vfp_fcvt_f16_to_f32(tmp2, tmp2, fpst, ahp);
6424                     neon_store_reg(rd, 3, tmp2);
6425                     tcg_temp_free_i32(ahp);
6426                     tcg_temp_free_ptr(fpst);
6427                     break;
6428                 }
6429                 case NEON_2RM_AESE: case NEON_2RM_AESMC:
6430                     if (!dc_isar_feature(aa32_aes, s) || ((rm | rd) & 1)) {
6431                         return 1;
6432                     }
6433                     ptr1 = vfp_reg_ptr(true, rd);
6434                     ptr2 = vfp_reg_ptr(true, rm);
6435
6436                      /* Bit 6 is the lowest opcode bit; it distinguishes between
6437                       * encryption (AESE/AESMC) and decryption (AESD/AESIMC)
6438                       */
6439                     tmp3 = tcg_const_i32(extract32(insn, 6, 1));
6440
6441                     if (op == NEON_2RM_AESE) {
6442                         gen_helper_crypto_aese(ptr1, ptr2, tmp3);
6443                     } else {
6444                         gen_helper_crypto_aesmc(ptr1, ptr2, tmp3);
6445                     }
6446                     tcg_temp_free_ptr(ptr1);
6447                     tcg_temp_free_ptr(ptr2);
6448                     tcg_temp_free_i32(tmp3);
6449                     break;
6450                 case NEON_2RM_SHA1H:
6451                     if (!dc_isar_feature(aa32_sha1, s) || ((rm | rd) & 1)) {
6452                         return 1;
6453                     }
6454                     ptr1 = vfp_reg_ptr(true, rd);
6455                     ptr2 = vfp_reg_ptr(true, rm);
6456
6457                     gen_helper_crypto_sha1h(ptr1, ptr2);
6458
6459                     tcg_temp_free_ptr(ptr1);
6460                     tcg_temp_free_ptr(ptr2);
6461                     break;
6462                 case NEON_2RM_SHA1SU1:
6463                     if ((rm | rd) & 1) {
6464                             return 1;
6465                     }
6466                     /* bit 6 (q): set -> SHA256SU0, cleared -> SHA1SU1 */
6467                     if (q) {
6468                         if (!dc_isar_feature(aa32_sha2, s)) {
6469                             return 1;
6470                         }
6471                     } else if (!dc_isar_feature(aa32_sha1, s)) {
6472                         return 1;
6473                     }
6474                     ptr1 = vfp_reg_ptr(true, rd);
6475                     ptr2 = vfp_reg_ptr(true, rm);
6476                     if (q) {
6477                         gen_helper_crypto_sha256su0(ptr1, ptr2);
6478                     } else {
6479                         gen_helper_crypto_sha1su1(ptr1, ptr2);
6480                     }
6481                     tcg_temp_free_ptr(ptr1);
6482                     tcg_temp_free_ptr(ptr2);
6483                     break;
6484
6485                 case NEON_2RM_VMVN:
6486                     tcg_gen_gvec_not(0, rd_ofs, rm_ofs, vec_size, vec_size);
6487                     break;
6488                 case NEON_2RM_VNEG:
6489                     tcg_gen_gvec_neg(size, rd_ofs, rm_ofs, vec_size, vec_size);
6490                     break;
6491                 case NEON_2RM_VABS:
6492                     tcg_gen_gvec_abs(size, rd_ofs, rm_ofs, vec_size, vec_size);
6493                     break;
6494
6495                 default:
6496                 elementwise:
6497                     for (pass = 0; pass < (q ? 4 : 2); pass++) {
6498                         tmp = neon_load_reg(rm, pass);
6499                         switch (op) {
6500                         case NEON_2RM_VREV32:
6501                             switch (size) {
6502                             case 0: tcg_gen_bswap32_i32(tmp, tmp); break;
6503                             case 1: gen_swap_half(tmp); break;
6504                             default: abort();
6505                             }
6506                             break;
6507                         case NEON_2RM_VREV16:
6508                             gen_rev16(tmp);
6509                             break;
6510                         case NEON_2RM_VCLS:
6511                             switch (size) {
6512                             case 0: gen_helper_neon_cls_s8(tmp, tmp); break;
6513                             case 1: gen_helper_neon_cls_s16(tmp, tmp); break;
6514                             case 2: gen_helper_neon_cls_s32(tmp, tmp); break;
6515                             default: abort();
6516                             }
6517                             break;
6518                         case NEON_2RM_VCLZ:
6519                             switch (size) {
6520                             case 0: gen_helper_neon_clz_u8(tmp, tmp); break;
6521                             case 1: gen_helper_neon_clz_u16(tmp, tmp); break;
6522                             case 2: tcg_gen_clzi_i32(tmp, tmp, 32); break;
6523                             default: abort();
6524                             }
6525                             break;
6526                         case NEON_2RM_VCNT:
6527                             gen_helper_neon_cnt_u8(tmp, tmp);
6528                             break;
6529                         case NEON_2RM_VQABS:
6530                             switch (size) {
6531                             case 0:
6532                                 gen_helper_neon_qabs_s8(tmp, cpu_env, tmp);
6533                                 break;
6534                             case 1:
6535                                 gen_helper_neon_qabs_s16(tmp, cpu_env, tmp);
6536                                 break;
6537                             case 2:
6538                                 gen_helper_neon_qabs_s32(tmp, cpu_env, tmp);
6539                                 break;
6540                             default: abort();
6541                             }
6542                             break;
6543                         case NEON_2RM_VQNEG:
6544                             switch (size) {
6545                             case 0:
6546                                 gen_helper_neon_qneg_s8(tmp, cpu_env, tmp);
6547                                 break;
6548                             case 1:
6549                                 gen_helper_neon_qneg_s16(tmp, cpu_env, tmp);
6550                                 break;
6551                             case 2:
6552                                 gen_helper_neon_qneg_s32(tmp, cpu_env, tmp);
6553                                 break;
6554                             default: abort();
6555                             }
6556                             break;
6557                         case NEON_2RM_VCGT0: case NEON_2RM_VCLE0:
6558                             tmp2 = tcg_const_i32(0);
6559                             switch(size) {
6560                             case 0: gen_helper_neon_cgt_s8(tmp, tmp, tmp2); break;
6561                             case 1: gen_helper_neon_cgt_s16(tmp, tmp, tmp2); break;
6562                             case 2: gen_helper_neon_cgt_s32(tmp, tmp, tmp2); break;
6563                             default: abort();
6564                             }
6565                             tcg_temp_free_i32(tmp2);
6566                             if (op == NEON_2RM_VCLE0) {
6567                                 tcg_gen_not_i32(tmp, tmp);
6568                             }
6569                             break;
6570                         case NEON_2RM_VCGE0: case NEON_2RM_VCLT0:
6571                             tmp2 = tcg_const_i32(0);
6572                             switch(size) {
6573                             case 0: gen_helper_neon_cge_s8(tmp, tmp, tmp2); break;
6574                             case 1: gen_helper_neon_cge_s16(tmp, tmp, tmp2); break;
6575                             case 2: gen_helper_neon_cge_s32(tmp, tmp, tmp2); break;
6576                             default: abort();
6577                             }
6578                             tcg_temp_free_i32(tmp2);
6579                             if (op == NEON_2RM_VCLT0) {
6580                                 tcg_gen_not_i32(tmp, tmp);
6581                             }
6582                             break;
6583                         case NEON_2RM_VCEQ0:
6584                             tmp2 = tcg_const_i32(0);
6585                             switch(size) {
6586                             case 0: gen_helper_neon_ceq_u8(tmp, tmp, tmp2); break;
6587                             case 1: gen_helper_neon_ceq_u16(tmp, tmp, tmp2); break;
6588                             case 2: gen_helper_neon_ceq_u32(tmp, tmp, tmp2); break;
6589                             default: abort();
6590                             }
6591                             tcg_temp_free_i32(tmp2);
6592                             break;
6593                         case NEON_2RM_VCGT0_F:
6594                         {
6595                             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6596                             tmp2 = tcg_const_i32(0);
6597                             gen_helper_neon_cgt_f32(tmp, tmp, tmp2, fpstatus);
6598                             tcg_temp_free_i32(tmp2);
6599                             tcg_temp_free_ptr(fpstatus);
6600                             break;
6601                         }
6602                         case NEON_2RM_VCGE0_F:
6603                         {
6604                             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6605                             tmp2 = tcg_const_i32(0);
6606                             gen_helper_neon_cge_f32(tmp, tmp, tmp2, fpstatus);
6607                             tcg_temp_free_i32(tmp2);
6608                             tcg_temp_free_ptr(fpstatus);
6609                             break;
6610                         }
6611                         case NEON_2RM_VCEQ0_F:
6612                         {
6613                             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6614                             tmp2 = tcg_const_i32(0);
6615                             gen_helper_neon_ceq_f32(tmp, tmp, tmp2, fpstatus);
6616                             tcg_temp_free_i32(tmp2);
6617                             tcg_temp_free_ptr(fpstatus);
6618                             break;
6619                         }
6620                         case NEON_2RM_VCLE0_F:
6621                         {
6622                             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6623                             tmp2 = tcg_const_i32(0);
6624                             gen_helper_neon_cge_f32(tmp, tmp2, tmp, fpstatus);
6625                             tcg_temp_free_i32(tmp2);
6626                             tcg_temp_free_ptr(fpstatus);
6627                             break;
6628                         }
6629                         case NEON_2RM_VCLT0_F:
6630                         {
6631                             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6632                             tmp2 = tcg_const_i32(0);
6633                             gen_helper_neon_cgt_f32(tmp, tmp2, tmp, fpstatus);
6634                             tcg_temp_free_i32(tmp2);
6635                             tcg_temp_free_ptr(fpstatus);
6636                             break;
6637                         }
6638                         case NEON_2RM_VABS_F:
6639                             gen_helper_vfp_abss(tmp, tmp);
6640                             break;
6641                         case NEON_2RM_VNEG_F:
6642                             gen_helper_vfp_negs(tmp, tmp);
6643                             break;
6644                         case NEON_2RM_VSWP:
6645                             tmp2 = neon_load_reg(rd, pass);
6646                             neon_store_reg(rm, pass, tmp2);
6647                             break;
6648                         case NEON_2RM_VTRN:
6649                             tmp2 = neon_load_reg(rd, pass);
6650                             switch (size) {
6651                             case 0: gen_neon_trn_u8(tmp, tmp2); break;
6652                             case 1: gen_neon_trn_u16(tmp, tmp2); break;
6653                             default: abort();
6654                             }
6655                             neon_store_reg(rm, pass, tmp2);
6656                             break;
6657                         case NEON_2RM_VRINTN:
6658                         case NEON_2RM_VRINTA:
6659                         case NEON_2RM_VRINTM:
6660                         case NEON_2RM_VRINTP:
6661                         case NEON_2RM_VRINTZ:
6662                         {
6663                             TCGv_i32 tcg_rmode;
6664                             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6665                             int rmode;
6666
6667                             if (op == NEON_2RM_VRINTZ) {
6668                                 rmode = FPROUNDING_ZERO;
6669                             } else {
6670                                 rmode = fp_decode_rm[((op & 0x6) >> 1) ^ 1];
6671                             }
6672
6673                             tcg_rmode = tcg_const_i32(arm_rmode_to_sf(rmode));
6674                             gen_helper_set_neon_rmode(tcg_rmode, tcg_rmode,
6675                                                       cpu_env);
6676                             gen_helper_rints(tmp, tmp, fpstatus);
6677                             gen_helper_set_neon_rmode(tcg_rmode, tcg_rmode,
6678                                                       cpu_env);
6679                             tcg_temp_free_ptr(fpstatus);
6680                             tcg_temp_free_i32(tcg_rmode);
6681                             break;
6682                         }
6683                         case NEON_2RM_VRINTX:
6684                         {
6685                             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6686                             gen_helper_rints_exact(tmp, tmp, fpstatus);
6687                             tcg_temp_free_ptr(fpstatus);
6688                             break;
6689                         }
6690                         case NEON_2RM_VCVTAU:
6691                         case NEON_2RM_VCVTAS:
6692                         case NEON_2RM_VCVTNU:
6693                         case NEON_2RM_VCVTNS:
6694                         case NEON_2RM_VCVTPU:
6695                         case NEON_2RM_VCVTPS:
6696                         case NEON_2RM_VCVTMU:
6697                         case NEON_2RM_VCVTMS:
6698                         {
6699                             bool is_signed = !extract32(insn, 7, 1);
6700                             TCGv_ptr fpst = get_fpstatus_ptr(1);
6701                             TCGv_i32 tcg_rmode, tcg_shift;
6702                             int rmode = fp_decode_rm[extract32(insn, 8, 2)];
6703
6704                             tcg_shift = tcg_const_i32(0);
6705                             tcg_rmode = tcg_const_i32(arm_rmode_to_sf(rmode));
6706                             gen_helper_set_neon_rmode(tcg_rmode, tcg_rmode,
6707                                                       cpu_env);
6708
6709                             if (is_signed) {
6710                                 gen_helper_vfp_tosls(tmp, tmp,
6711                                                      tcg_shift, fpst);
6712                             } else {
6713                                 gen_helper_vfp_touls(tmp, tmp,
6714                                                      tcg_shift, fpst);
6715                             }
6716
6717                             gen_helper_set_neon_rmode(tcg_rmode, tcg_rmode,
6718                                                       cpu_env);
6719                             tcg_temp_free_i32(tcg_rmode);
6720                             tcg_temp_free_i32(tcg_shift);
6721                             tcg_temp_free_ptr(fpst);
6722                             break;
6723                         }
6724                         case NEON_2RM_VRECPE:
6725                         {
6726                             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6727                             gen_helper_recpe_u32(tmp, tmp, fpstatus);
6728                             tcg_temp_free_ptr(fpstatus);
6729                             break;
6730                         }
6731                         case NEON_2RM_VRSQRTE:
6732                         {
6733                             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6734                             gen_helper_rsqrte_u32(tmp, tmp, fpstatus);
6735                             tcg_temp_free_ptr(fpstatus);
6736                             break;
6737                         }
6738                         case NEON_2RM_VRECPE_F:
6739                         {
6740                             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6741                             gen_helper_recpe_f32(tmp, tmp, fpstatus);
6742                             tcg_temp_free_ptr(fpstatus);
6743                             break;
6744                         }
6745                         case NEON_2RM_VRSQRTE_F:
6746                         {
6747                             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6748                             gen_helper_rsqrte_f32(tmp, tmp, fpstatus);
6749                             tcg_temp_free_ptr(fpstatus);
6750                             break;
6751                         }
6752                         case NEON_2RM_VCVT_FS: /* VCVT.F32.S32 */
6753                         {
6754                             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6755                             gen_helper_vfp_sitos(tmp, tmp, fpstatus);
6756                             tcg_temp_free_ptr(fpstatus);
6757                             break;
6758                         }
6759                         case NEON_2RM_VCVT_FU: /* VCVT.F32.U32 */
6760                         {
6761                             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6762                             gen_helper_vfp_uitos(tmp, tmp, fpstatus);
6763                             tcg_temp_free_ptr(fpstatus);
6764                             break;
6765                         }
6766                         case NEON_2RM_VCVT_SF: /* VCVT.S32.F32 */
6767                         {
6768                             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6769                             gen_helper_vfp_tosizs(tmp, tmp, fpstatus);
6770                             tcg_temp_free_ptr(fpstatus);
6771                             break;
6772                         }
6773                         case NEON_2RM_VCVT_UF: /* VCVT.U32.F32 */
6774                         {
6775                             TCGv_ptr fpstatus = get_fpstatus_ptr(1);
6776                             gen_helper_vfp_touizs(tmp, tmp, fpstatus);
6777                             tcg_temp_free_ptr(fpstatus);
6778                             break;
6779                         }
6780                         default:
6781                             /* Reserved op values were caught by the
6782                              * neon_2rm_sizes[] check earlier.
6783                              */
6784                             abort();
6785                         }
6786                         neon_store_reg(rd, pass, tmp);
6787                     }
6788                     break;
6789                 }
6790             } else if ((insn & (1 << 10)) == 0) {
6791                 /* VTBL, VTBX.  */
6792                 int n = ((insn >> 8) & 3) + 1;
6793                 if ((rn + n) > 32) {
6794                     /* This is UNPREDICTABLE; we choose to UNDEF to avoid the
6795                      * helper function running off the end of the register file.
6796                      */
6797                     return 1;
6798                 }
6799                 n <<= 3;
6800                 if (insn & (1 << 6)) {
6801                     tmp = neon_load_reg(rd, 0);
6802                 } else {
6803                     tmp = tcg_temp_new_i32();
6804                     tcg_gen_movi_i32(tmp, 0);
6805                 }
6806                 tmp2 = neon_load_reg(rm, 0);
6807                 ptr1 = vfp_reg_ptr(true, rn);
6808                 tmp5 = tcg_const_i32(n);
6809                 gen_helper_neon_tbl(tmp2, tmp2, tmp, ptr1, tmp5);
6810                 tcg_temp_free_i32(tmp);
6811                 if (insn & (1 << 6)) {
6812                     tmp = neon_load_reg(rd, 1);
6813                 } else {
6814                     tmp = tcg_temp_new_i32();
6815                     tcg_gen_movi_i32(tmp, 0);
6816                 }
6817                 tmp3 = neon_load_reg(rm, 1);
6818                 gen_helper_neon_tbl(tmp3, tmp3, tmp, ptr1, tmp5);
6819                 tcg_temp_free_i32(tmp5);
6820                 tcg_temp_free_ptr(ptr1);
6821                 neon_store_reg(rd, 0, tmp2);
6822                 neon_store_reg(rd, 1, tmp3);
6823                 tcg_temp_free_i32(tmp);
6824             } else if ((insn & 0x380) == 0) {
6825                 /* VDUP */
6826                 int element;
6827                 MemOp size;
6828
6829                 if ((insn & (7 << 16)) == 0 || (q && (rd & 1))) {
6830                     return 1;
6831                 }
6832                 if (insn & (1 << 16)) {
6833                     size = MO_8;
6834                     element = (insn >> 17) & 7;
6835                 } else if (insn & (1 << 17)) {
6836                     size = MO_16;
6837                     element = (insn >> 18) & 3;
6838                 } else {
6839                     size = MO_32;
6840                     element = (insn >> 19) & 1;
6841                 }
6842                 tcg_gen_gvec_dup_mem(size, neon_reg_offset(rd, 0),
6843                                      neon_element_offset(rm, element, size),
6844                                      q ? 16 : 8, q ? 16 : 8);
6845             } else {
6846                 return 1;
6847             }
6848         }
6849     }
6850     return 0;
6851 }
6852
6853 /* Advanced SIMD three registers of the same length extension.
6854  *  31           25    23  22    20   16   12  11   10   9    8        3     0
6855  * +---------------+-----+---+-----+----+----+---+----+---+----+---------+----+
6856  * | 1 1 1 1 1 1 0 | op1 | D | op2 | Vn | Vd | 1 | o3 | 0 | o4 | N Q M U | Vm |
6857  * +---------------+-----+---+-----+----+----+---+----+---+----+---------+----+
6858  */
6859 static int disas_neon_insn_3same_ext(DisasContext *s, uint32_t insn)
6860 {
6861     gen_helper_gvec_3 *fn_gvec = NULL;
6862     gen_helper_gvec_3_ptr *fn_gvec_ptr = NULL;
6863     int rd, rn, rm, opr_sz;
6864     int data = 0;
6865     int off_rn, off_rm;
6866     bool is_long = false, q = extract32(insn, 6, 1);
6867     bool ptr_is_env = false;
6868
6869     if ((insn & 0xfe200f10) == 0xfc200800) {
6870         /* VCMLA -- 1111 110R R.1S .... .... 1000 ...0 .... */
6871         int size = extract32(insn, 20, 1);
6872         data = extract32(insn, 23, 2); /* rot */
6873         if (!dc_isar_feature(aa32_vcma, s)
6874             || (!size && !dc_isar_feature(aa32_fp16_arith, s))) {
6875             return 1;
6876         }
6877         fn_gvec_ptr = size ? gen_helper_gvec_fcmlas : gen_helper_gvec_fcmlah;
6878     } else if ((insn & 0xfea00f10) == 0xfc800800) {
6879         /* VCADD -- 1111 110R 1.0S .... .... 1000 ...0 .... */
6880         int size = extract32(insn, 20, 1);
6881         data = extract32(insn, 24, 1); /* rot */
6882         if (!dc_isar_feature(aa32_vcma, s)
6883             || (!size && !dc_isar_feature(aa32_fp16_arith, s))) {
6884             return 1;
6885         }
6886         fn_gvec_ptr = size ? gen_helper_gvec_fcadds : gen_helper_gvec_fcaddh;
6887     } else if ((insn & 0xfeb00f00) == 0xfc200d00) {
6888         /* V[US]DOT -- 1111 1100 0.10 .... .... 1101 .Q.U .... */
6889         bool u = extract32(insn, 4, 1);
6890         if (!dc_isar_feature(aa32_dp, s)) {
6891             return 1;
6892         }
6893         fn_gvec = u ? gen_helper_gvec_udot_b : gen_helper_gvec_sdot_b;
6894     } else if ((insn & 0xff300f10) == 0xfc200810) {
6895         /* VFM[AS]L -- 1111 1100 S.10 .... .... 1000 .Q.1 .... */
6896         int is_s = extract32(insn, 23, 1);
6897         if (!dc_isar_feature(aa32_fhm, s)) {
6898             return 1;
6899         }
6900         is_long = true;
6901         data = is_s; /* is_2 == 0 */
6902         fn_gvec_ptr = gen_helper_gvec_fmlal_a32;
6903         ptr_is_env = true;
6904     } else {
6905         return 1;
6906     }
6907
6908     VFP_DREG_D(rd, insn);
6909     if (rd & q) {
6910         return 1;
6911     }
6912     if (q || !is_long) {
6913         VFP_DREG_N(rn, insn);
6914         VFP_DREG_M(rm, insn);
6915         if ((rn | rm) & q & !is_long) {
6916             return 1;
6917         }
6918         off_rn = vfp_reg_offset(1, rn);
6919         off_rm = vfp_reg_offset(1, rm);
6920     } else {
6921         rn = VFP_SREG_N(insn);
6922         rm = VFP_SREG_M(insn);
6923         off_rn = vfp_reg_offset(0, rn);
6924         off_rm = vfp_reg_offset(0, rm);
6925     }
6926
6927     if (s->fp_excp_el) {
6928         gen_exception_insn(s, s->pc_curr, EXCP_UDEF,
6929                            syn_simd_access_trap(1, 0xe, false), s->fp_excp_el);
6930         return 0;
6931     }
6932     if (!s->vfp_enabled) {
6933         return 1;
6934     }
6935
6936     opr_sz = (1 + q) * 8;
6937     if (fn_gvec_ptr) {
6938         TCGv_ptr ptr;
6939         if (ptr_is_env) {
6940             ptr = cpu_env;
6941         } else {
6942             ptr = get_fpstatus_ptr(1);
6943         }
6944         tcg_gen_gvec_3_ptr(vfp_reg_offset(1, rd), off_rn, off_rm, ptr,
6945                            opr_sz, opr_sz, data, fn_gvec_ptr);
6946         if (!ptr_is_env) {
6947             tcg_temp_free_ptr(ptr);
6948         }
6949     } else {
6950         tcg_gen_gvec_3_ool(vfp_reg_offset(1, rd), off_rn, off_rm,
6951                            opr_sz, opr_sz, data, fn_gvec);
6952     }
6953     return 0;
6954 }
6955
6956 /* Advanced SIMD two registers and a scalar extension.
6957  *  31             24   23  22   20   16   12  11   10   9    8        3     0
6958  * +-----------------+----+---+----+----+----+---+----+---+----+---------+----+
6959  * | 1 1 1 1 1 1 1 0 | o1 | D | o2 | Vn | Vd | 1 | o3 | 0 | o4 | N Q M U | Vm |
6960  * +-----------------+----+---+----+----+----+---+----+---+----+---------+----+
6961  *
6962  */
6963
6964 static int disas_neon_insn_2reg_scalar_ext(DisasContext *s, uint32_t insn)
6965 {
6966     gen_helper_gvec_3 *fn_gvec = NULL;
6967     gen_helper_gvec_3_ptr *fn_gvec_ptr = NULL;
6968     int rd, rn, rm, opr_sz, data;
6969     int off_rn, off_rm;
6970     bool is_long = false, q = extract32(insn, 6, 1);
6971     bool ptr_is_env = false;
6972
6973     if ((insn & 0xff000f10) == 0xfe000800) {
6974         /* VCMLA (indexed) -- 1111 1110 S.RR .... .... 1000 ...0 .... */
6975         int rot = extract32(insn, 20, 2);
6976         int size = extract32(insn, 23, 1);
6977         int index;
6978
6979         if (!dc_isar_feature(aa32_vcma, s)) {
6980             return 1;
6981         }
6982         if (size == 0) {
6983             if (!dc_isar_feature(aa32_fp16_arith, s)) {
6984                 return 1;
6985             }
6986             /* For fp16, rm is just Vm, and index is M.  */
6987             rm = extract32(insn, 0, 4);
6988             index = extract32(insn, 5, 1);
6989         } else {
6990             /* For fp32, rm is the usual M:Vm, and index is 0.  */
6991             VFP_DREG_M(rm, insn);
6992             index = 0;
6993         }
6994         data = (index << 2) | rot;
6995         fn_gvec_ptr = (size ? gen_helper_gvec_fcmlas_idx
6996                        : gen_helper_gvec_fcmlah_idx);
6997     } else if ((insn & 0xffb00f00) == 0xfe200d00) {
6998         /* V[US]DOT -- 1111 1110 0.10 .... .... 1101 .Q.U .... */
6999         int u = extract32(insn, 4, 1);
7000
7001         if (!dc_isar_feature(aa32_dp, s)) {
7002             return 1;
7003         }
7004         fn_gvec = u ? gen_helper_gvec_udot_idx_b : gen_helper_gvec_sdot_idx_b;
7005         /* rm is just Vm, and index is M.  */
7006         data = extract32(insn, 5, 1); /* index */
7007         rm = extract32(insn, 0, 4);
7008     } else if ((insn & 0xffa00f10) == 0xfe000810) {
7009         /* VFM[AS]L -- 1111 1110 0.0S .... .... 1000 .Q.1 .... */
7010         int is_s = extract32(insn, 20, 1);
7011         int vm20 = extract32(insn, 0, 3);
7012         int vm3 = extract32(insn, 3, 1);
7013         int m = extract32(insn, 5, 1);
7014         int index;
7015
7016         if (!dc_isar_feature(aa32_fhm, s)) {
7017             return 1;
7018         }
7019         if (q) {
7020             rm = vm20;
7021             index = m * 2 + vm3;
7022         } else {
7023             rm = vm20 * 2 + m;
7024             index = vm3;
7025         }
7026         is_long = true;
7027         data = (index << 2) | is_s; /* is_2 == 0 */
7028         fn_gvec_ptr = gen_helper_gvec_fmlal_idx_a32;
7029         ptr_is_env = true;
7030     } else {
7031         return 1;
7032     }
7033
7034     VFP_DREG_D(rd, insn);
7035     if (rd & q) {
7036         return 1;
7037     }
7038     if (q || !is_long) {
7039         VFP_DREG_N(rn, insn);
7040         if (rn & q & !is_long) {
7041             return 1;
7042         }
7043         off_rn = vfp_reg_offset(1, rn);
7044         off_rm = vfp_reg_offset(1, rm);
7045     } else {
7046         rn = VFP_SREG_N(insn);
7047         off_rn = vfp_reg_offset(0, rn);
7048         off_rm = vfp_reg_offset(0, rm);
7049     }
7050     if (s->fp_excp_el) {
7051         gen_exception_insn(s, s->pc_curr, EXCP_UDEF,
7052                            syn_simd_access_trap(1, 0xe, false), s->fp_excp_el);
7053         return 0;
7054     }
7055     if (!s->vfp_enabled) {
7056         return 1;
7057     }
7058
7059     opr_sz = (1 + q) * 8;
7060     if (fn_gvec_ptr) {
7061         TCGv_ptr ptr;
7062         if (ptr_is_env) {
7063             ptr = cpu_env;
7064         } else {
7065             ptr = get_fpstatus_ptr(1);
7066         }
7067         tcg_gen_gvec_3_ptr(vfp_reg_offset(1, rd), off_rn, off_rm, ptr,
7068                            opr_sz, opr_sz, data, fn_gvec_ptr);
7069         if (!ptr_is_env) {
7070             tcg_temp_free_ptr(ptr);
7071         }
7072     } else {
7073         tcg_gen_gvec_3_ool(vfp_reg_offset(1, rd), off_rn, off_rm,
7074                            opr_sz, opr_sz, data, fn_gvec);
7075     }
7076     return 0;
7077 }
7078
7079 static int disas_coproc_insn(DisasContext *s, uint32_t insn)
7080 {
7081     int cpnum, is64, crn, crm, opc1, opc2, isread, rt, rt2;
7082     const ARMCPRegInfo *ri;
7083
7084     cpnum = (insn >> 8) & 0xf;
7085
7086     /* First check for coprocessor space used for XScale/iwMMXt insns */
7087     if (arm_dc_feature(s, ARM_FEATURE_XSCALE) && (cpnum < 2)) {
7088         if (extract32(s->c15_cpar, cpnum, 1) == 0) {
7089             return 1;
7090         }
7091         if (arm_dc_feature(s, ARM_FEATURE_IWMMXT)) {
7092             return disas_iwmmxt_insn(s, insn);
7093         } else if (arm_dc_feature(s, ARM_FEATURE_XSCALE)) {
7094             return disas_dsp_insn(s, insn);
7095         }
7096         return 1;
7097     }
7098
7099     /* Otherwise treat as a generic register access */
7100     is64 = (insn & (1 << 25)) == 0;
7101     if (!is64 && ((insn & (1 << 4)) == 0)) {
7102         /* cdp */
7103         return 1;
7104     }
7105
7106     crm = insn & 0xf;
7107     if (is64) {
7108         crn = 0;
7109         opc1 = (insn >> 4) & 0xf;
7110         opc2 = 0;
7111         rt2 = (insn >> 16) & 0xf;
7112     } else {
7113         crn = (insn >> 16) & 0xf;
7114         opc1 = (insn >> 21) & 7;
7115         opc2 = (insn >> 5) & 7;
7116         rt2 = 0;
7117     }
7118     isread = (insn >> 20) & 1;
7119     rt = (insn >> 12) & 0xf;
7120
7121     ri = get_arm_cp_reginfo(s->cp_regs,
7122             ENCODE_CP_REG(cpnum, is64, s->ns, crn, crm, opc1, opc2));
7123     if (ri) {
7124         /* Check access permissions */
7125         if (!cp_access_ok(s->current_el, ri, isread)) {
7126             return 1;
7127         }
7128
7129         if (ri->accessfn ||
7130             (arm_dc_feature(s, ARM_FEATURE_XSCALE) && cpnum < 14)) {
7131             /* Emit code to perform further access permissions checks at
7132              * runtime; this may result in an exception.
7133              * Note that on XScale all cp0..c13 registers do an access check
7134              * call in order to handle c15_cpar.
7135              */
7136             TCGv_ptr tmpptr;
7137             TCGv_i32 tcg_syn, tcg_isread;
7138             uint32_t syndrome;
7139
7140             /* Note that since we are an implementation which takes an
7141              * exception on a trapped conditional instruction only if the
7142              * instruction passes its condition code check, we can take
7143              * advantage of the clause in the ARM ARM that allows us to set
7144              * the COND field in the instruction to 0xE in all cases.
7145              * We could fish the actual condition out of the insn (ARM)
7146              * or the condexec bits (Thumb) but it isn't necessary.
7147              */
7148             switch (cpnum) {
7149             case 14:
7150                 if (is64) {
7151                     syndrome = syn_cp14_rrt_trap(1, 0xe, opc1, crm, rt, rt2,
7152                                                  isread, false);
7153                 } else {
7154                     syndrome = syn_cp14_rt_trap(1, 0xe, opc1, opc2, crn, crm,
7155                                                 rt, isread, false);
7156                 }
7157                 break;
7158             case 15:
7159                 if (is64) {
7160                     syndrome = syn_cp15_rrt_trap(1, 0xe, opc1, crm, rt, rt2,
7161                                                  isread, false);
7162                 } else {
7163                     syndrome = syn_cp15_rt_trap(1, 0xe, opc1, opc2, crn, crm,
7164                                                 rt, isread, false);
7165                 }
7166                 break;
7167             default:
7168                 /* ARMv8 defines that only coprocessors 14 and 15 exist,
7169                  * so this can only happen if this is an ARMv7 or earlier CPU,
7170                  * in which case the syndrome information won't actually be
7171                  * guest visible.
7172                  */
7173                 assert(!arm_dc_feature(s, ARM_FEATURE_V8));
7174                 syndrome = syn_uncategorized();
7175                 break;
7176             }
7177
7178             gen_set_condexec(s);
7179             gen_set_pc_im(s, s->pc_curr);
7180             tmpptr = tcg_const_ptr(ri);
7181             tcg_syn = tcg_const_i32(syndrome);
7182             tcg_isread = tcg_const_i32(isread);
7183             gen_helper_access_check_cp_reg(cpu_env, tmpptr, tcg_syn,
7184                                            tcg_isread);
7185             tcg_temp_free_ptr(tmpptr);
7186             tcg_temp_free_i32(tcg_syn);
7187             tcg_temp_free_i32(tcg_isread);
7188         } else if (ri->type & ARM_CP_RAISES_EXC) {
7189             /*
7190              * The readfn or writefn might raise an exception;
7191              * synchronize the CPU state in case it does.
7192              */
7193             gen_set_condexec(s);
7194             gen_set_pc_im(s, s->pc_curr);
7195         }
7196
7197         /* Handle special cases first */
7198         switch (ri->type & ~(ARM_CP_FLAG_MASK & ~ARM_CP_SPECIAL)) {
7199         case ARM_CP_NOP:
7200             return 0;
7201         case ARM_CP_WFI:
7202             if (isread) {
7203                 return 1;
7204             }
7205             gen_set_pc_im(s, s->base.pc_next);
7206             s->base.is_jmp = DISAS_WFI;
7207             return 0;
7208         default:
7209             break;
7210         }
7211
7212         if ((tb_cflags(s->base.tb) & CF_USE_ICOUNT) && (ri->type & ARM_CP_IO)) {
7213             gen_io_start();
7214         }
7215
7216         if (isread) {
7217             /* Read */
7218             if (is64) {
7219                 TCGv_i64 tmp64;
7220                 TCGv_i32 tmp;
7221                 if (ri->type & ARM_CP_CONST) {
7222                     tmp64 = tcg_const_i64(ri->resetvalue);
7223                 } else if (ri->readfn) {
7224                     TCGv_ptr tmpptr;
7225                     tmp64 = tcg_temp_new_i64();
7226                     tmpptr = tcg_const_ptr(ri);
7227                     gen_helper_get_cp_reg64(tmp64, cpu_env, tmpptr);
7228                     tcg_temp_free_ptr(tmpptr);
7229                 } else {
7230                     tmp64 = tcg_temp_new_i64();
7231                     tcg_gen_ld_i64(tmp64, cpu_env, ri->fieldoffset);
7232                 }
7233                 tmp = tcg_temp_new_i32();
7234                 tcg_gen_extrl_i64_i32(tmp, tmp64);
7235                 store_reg(s, rt, tmp);
7236                 tmp = tcg_temp_new_i32();
7237                 tcg_gen_extrh_i64_i32(tmp, tmp64);
7238                 tcg_temp_free_i64(tmp64);
7239                 store_reg(s, rt2, tmp);
7240             } else {
7241                 TCGv_i32 tmp;
7242                 if (ri->type & ARM_CP_CONST) {
7243                     tmp = tcg_const_i32(ri->resetvalue);
7244                 } else if (ri->readfn) {
7245                     TCGv_ptr tmpptr;
7246                     tmp = tcg_temp_new_i32();
7247                     tmpptr = tcg_const_ptr(ri);
7248                     gen_helper_get_cp_reg(tmp, cpu_env, tmpptr);
7249                     tcg_temp_free_ptr(tmpptr);
7250                 } else {
7251                     tmp = load_cpu_offset(ri->fieldoffset);
7252                 }
7253                 if (rt == 15) {
7254                     /* Destination register of r15 for 32 bit loads sets
7255                      * the condition codes from the high 4 bits of the value
7256                      */
7257                     gen_set_nzcv(tmp);
7258                     tcg_temp_free_i32(tmp);
7259                 } else {
7260                     store_reg(s, rt, tmp);
7261                 }
7262             }
7263         } else {
7264             /* Write */
7265             if (ri->type & ARM_CP_CONST) {
7266                 /* If not forbidden by access permissions, treat as WI */
7267                 return 0;
7268             }
7269
7270             if (is64) {
7271                 TCGv_i32 tmplo, tmphi;
7272                 TCGv_i64 tmp64 = tcg_temp_new_i64();
7273                 tmplo = load_reg(s, rt);
7274                 tmphi = load_reg(s, rt2);
7275                 tcg_gen_concat_i32_i64(tmp64, tmplo, tmphi);
7276                 tcg_temp_free_i32(tmplo);
7277                 tcg_temp_free_i32(tmphi);
7278                 if (ri->writefn) {
7279                     TCGv_ptr tmpptr = tcg_const_ptr(ri);
7280                     gen_helper_set_cp_reg64(cpu_env, tmpptr, tmp64);
7281                     tcg_temp_free_ptr(tmpptr);
7282                 } else {
7283                     tcg_gen_st_i64(tmp64, cpu_env, ri->fieldoffset);
7284                 }
7285                 tcg_temp_free_i64(tmp64);
7286             } else {
7287                 if (ri->writefn) {
7288                     TCGv_i32 tmp;
7289                     TCGv_ptr tmpptr;
7290                     tmp = load_reg(s, rt);
7291                     tmpptr = tcg_const_ptr(ri);
7292                     gen_helper_set_cp_reg(cpu_env, tmpptr, tmp);
7293                     tcg_temp_free_ptr(tmpptr);
7294                     tcg_temp_free_i32(tmp);
7295                 } else {
7296                     TCGv_i32 tmp = load_reg(s, rt);
7297                     store_cpu_offset(tmp, ri->fieldoffset);
7298                 }
7299             }
7300         }
7301
7302         if ((tb_cflags(s->base.tb) & CF_USE_ICOUNT) && (ri->type & ARM_CP_IO)) {
7303             /* I/O operations must end the TB here (whether read or write) */
7304             gen_lookup_tb(s);
7305         } else if (!isread && !(ri->type & ARM_CP_SUPPRESS_TB_END)) {
7306             /* We default to ending the TB on a coprocessor register write,
7307              * but allow this to be suppressed by the register definition
7308              * (usually only necessary to work around guest bugs).
7309              */
7310             gen_lookup_tb(s);
7311         }
7312
7313         return 0;
7314     }
7315
7316     /* Unknown register; this might be a guest error or a QEMU
7317      * unimplemented feature.
7318      */
7319     if (is64) {
7320         qemu_log_mask(LOG_UNIMP, "%s access to unsupported AArch32 "
7321                       "64 bit system register cp:%d opc1: %d crm:%d "
7322                       "(%s)\n",
7323                       isread ? "read" : "write", cpnum, opc1, crm,
7324                       s->ns ? "non-secure" : "secure");
7325     } else {
7326         qemu_log_mask(LOG_UNIMP, "%s access to unsupported AArch32 "
7327                       "system register cp:%d opc1:%d crn:%d crm:%d opc2:%d "
7328                       "(%s)\n",
7329                       isread ? "read" : "write", cpnum, opc1, crn, crm, opc2,
7330                       s->ns ? "non-secure" : "secure");
7331     }
7332
7333     return 1;
7334 }
7335
7336
7337 /* Store a 64-bit value to a register pair.  Clobbers val.  */
7338 static void gen_storeq_reg(DisasContext *s, int rlow, int rhigh, TCGv_i64 val)
7339 {
7340     TCGv_i32 tmp;
7341     tmp = tcg_temp_new_i32();
7342     tcg_gen_extrl_i64_i32(tmp, val);
7343     store_reg(s, rlow, tmp);
7344     tmp = tcg_temp_new_i32();
7345     tcg_gen_extrh_i64_i32(tmp, val);
7346     store_reg(s, rhigh, tmp);
7347 }
7348
7349 /* load and add a 64-bit value from a register pair.  */
7350 static void gen_addq(DisasContext *s, TCGv_i64 val, int rlow, int rhigh)
7351 {
7352     TCGv_i64 tmp;
7353     TCGv_i32 tmpl;
7354     TCGv_i32 tmph;
7355
7356     /* Load 64-bit value rd:rn.  */
7357     tmpl = load_reg(s, rlow);
7358     tmph = load_reg(s, rhigh);
7359     tmp = tcg_temp_new_i64();
7360     tcg_gen_concat_i32_i64(tmp, tmpl, tmph);
7361     tcg_temp_free_i32(tmpl);
7362     tcg_temp_free_i32(tmph);
7363     tcg_gen_add_i64(val, val, tmp);
7364     tcg_temp_free_i64(tmp);
7365 }
7366
7367 /* Set N and Z flags from hi|lo.  */
7368 static void gen_logicq_cc(TCGv_i32 lo, TCGv_i32 hi)
7369 {
7370     tcg_gen_mov_i32(cpu_NF, hi);
7371     tcg_gen_or_i32(cpu_ZF, lo, hi);
7372 }
7373
7374 /* Load/Store exclusive instructions are implemented by remembering
7375    the value/address loaded, and seeing if these are the same
7376    when the store is performed.  This should be sufficient to implement
7377    the architecturally mandated semantics, and avoids having to monitor
7378    regular stores.  The compare vs the remembered value is done during
7379    the cmpxchg operation, but we must compare the addresses manually.  */
7380 static void gen_load_exclusive(DisasContext *s, int rt, int rt2,
7381                                TCGv_i32 addr, int size)
7382 {
7383     TCGv_i32 tmp = tcg_temp_new_i32();
7384     MemOp opc = size | MO_ALIGN | s->be_data;
7385
7386     s->is_ldex = true;
7387
7388     if (size == 3) {
7389         TCGv_i32 tmp2 = tcg_temp_new_i32();
7390         TCGv_i64 t64 = tcg_temp_new_i64();
7391
7392         /* For AArch32, architecturally the 32-bit word at the lowest
7393          * address is always Rt and the one at addr+4 is Rt2, even if
7394          * the CPU is big-endian. That means we don't want to do a
7395          * gen_aa32_ld_i64(), which invokes gen_aa32_frob64() as if
7396          * for an architecturally 64-bit access, but instead do a
7397          * 64-bit access using MO_BE if appropriate and then split
7398          * the two halves.
7399          * This only makes a difference for BE32 user-mode, where
7400          * frob64() must not flip the two halves of the 64-bit data
7401          * but this code must treat BE32 user-mode like BE32 system.
7402          */
7403         TCGv taddr = gen_aa32_addr(s, addr, opc);
7404
7405         tcg_gen_qemu_ld_i64(t64, taddr, get_mem_index(s), opc);
7406         tcg_temp_free(taddr);
7407         tcg_gen_mov_i64(cpu_exclusive_val, t64);
7408         if (s->be_data == MO_BE) {
7409             tcg_gen_extr_i64_i32(tmp2, tmp, t64);
7410         } else {
7411             tcg_gen_extr_i64_i32(tmp, tmp2, t64);
7412         }
7413         tcg_temp_free_i64(t64);
7414
7415         store_reg(s, rt2, tmp2);
7416     } else {
7417         gen_aa32_ld_i32(s, tmp, addr, get_mem_index(s), opc);
7418         tcg_gen_extu_i32_i64(cpu_exclusive_val, tmp);
7419     }
7420
7421     store_reg(s, rt, tmp);
7422     tcg_gen_extu_i32_i64(cpu_exclusive_addr, addr);
7423 }
7424
7425 static void gen_clrex(DisasContext *s)
7426 {
7427     tcg_gen_movi_i64(cpu_exclusive_addr, -1);
7428 }
7429
7430 static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2,
7431                                 TCGv_i32 addr, int size)
7432 {
7433     TCGv_i32 t0, t1, t2;
7434     TCGv_i64 extaddr;
7435     TCGv taddr;
7436     TCGLabel *done_label;
7437     TCGLabel *fail_label;
7438     MemOp opc = size | MO_ALIGN | s->be_data;
7439
7440     /* if (env->exclusive_addr == addr && env->exclusive_val == [addr]) {
7441          [addr] = {Rt};
7442          {Rd} = 0;
7443        } else {
7444          {Rd} = 1;
7445        } */
7446     fail_label = gen_new_label();
7447     done_label = gen_new_label();
7448     extaddr = tcg_temp_new_i64();
7449     tcg_gen_extu_i32_i64(extaddr, addr);
7450     tcg_gen_brcond_i64(TCG_COND_NE, extaddr, cpu_exclusive_addr, fail_label);
7451     tcg_temp_free_i64(extaddr);
7452
7453     taddr = gen_aa32_addr(s, addr, opc);
7454     t0 = tcg_temp_new_i32();
7455     t1 = load_reg(s, rt);
7456     if (size == 3) {
7457         TCGv_i64 o64 = tcg_temp_new_i64();
7458         TCGv_i64 n64 = tcg_temp_new_i64();
7459
7460         t2 = load_reg(s, rt2);
7461         /* For AArch32, architecturally the 32-bit word at the lowest
7462          * address is always Rt and the one at addr+4 is Rt2, even if
7463          * the CPU is big-endian. Since we're going to treat this as a
7464          * single 64-bit BE store, we need to put the two halves in the
7465          * opposite order for BE to LE, so that they end up in the right
7466          * places.
7467          * We don't want gen_aa32_frob64() because that does the wrong
7468          * thing for BE32 usermode.
7469          */
7470         if (s->be_data == MO_BE) {
7471             tcg_gen_concat_i32_i64(n64, t2, t1);
7472         } else {
7473             tcg_gen_concat_i32_i64(n64, t1, t2);
7474         }
7475         tcg_temp_free_i32(t2);
7476
7477         tcg_gen_atomic_cmpxchg_i64(o64, taddr, cpu_exclusive_val, n64,
7478                                    get_mem_index(s), opc);
7479         tcg_temp_free_i64(n64);
7480
7481         tcg_gen_setcond_i64(TCG_COND_NE, o64, o64, cpu_exclusive_val);
7482         tcg_gen_extrl_i64_i32(t0, o64);
7483
7484         tcg_temp_free_i64(o64);
7485     } else {
7486         t2 = tcg_temp_new_i32();
7487         tcg_gen_extrl_i64_i32(t2, cpu_exclusive_val);
7488         tcg_gen_atomic_cmpxchg_i32(t0, taddr, t2, t1, get_mem_index(s), opc);
7489         tcg_gen_setcond_i32(TCG_COND_NE, t0, t0, t2);
7490         tcg_temp_free_i32(t2);
7491     }
7492     tcg_temp_free_i32(t1);
7493     tcg_temp_free(taddr);
7494     tcg_gen_mov_i32(cpu_R[rd], t0);
7495     tcg_temp_free_i32(t0);
7496     tcg_gen_br(done_label);
7497
7498     gen_set_label(fail_label);
7499     tcg_gen_movi_i32(cpu_R[rd], 1);
7500     gen_set_label(done_label);
7501     tcg_gen_movi_i64(cpu_exclusive_addr, -1);
7502 }
7503
7504 /* gen_srs:
7505  * @env: CPUARMState
7506  * @s: DisasContext
7507  * @mode: mode field from insn (which stack to store to)
7508  * @amode: addressing mode (DA/IA/DB/IB), encoded as per P,U bits in ARM insn
7509  * @writeback: true if writeback bit set
7510  *
7511  * Generate code for the SRS (Store Return State) insn.
7512  */
7513 static void gen_srs(DisasContext *s,
7514                     uint32_t mode, uint32_t amode, bool writeback)
7515 {
7516     int32_t offset;
7517     TCGv_i32 addr, tmp;
7518     bool undef = false;
7519
7520     /* SRS is:
7521      * - trapped to EL3 if EL3 is AArch64 and we are at Secure EL1
7522      *   and specified mode is monitor mode
7523      * - UNDEFINED in Hyp mode
7524      * - UNPREDICTABLE in User or System mode
7525      * - UNPREDICTABLE if the specified mode is:
7526      * -- not implemented
7527      * -- not a valid mode number
7528      * -- a mode that's at a higher exception level
7529      * -- Monitor, if we are Non-secure
7530      * For the UNPREDICTABLE cases we choose to UNDEF.
7531      */
7532     if (s->current_el == 1 && !s->ns && mode == ARM_CPU_MODE_MON) {
7533         gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(), 3);
7534         return;
7535     }
7536
7537     if (s->current_el == 0 || s->current_el == 2) {
7538         undef = true;
7539     }
7540
7541     switch (mode) {
7542     case ARM_CPU_MODE_USR:
7543     case ARM_CPU_MODE_FIQ:
7544     case ARM_CPU_MODE_IRQ:
7545     case ARM_CPU_MODE_SVC:
7546     case ARM_CPU_MODE_ABT:
7547     case ARM_CPU_MODE_UND:
7548     case ARM_CPU_MODE_SYS:
7549         break;
7550     case ARM_CPU_MODE_HYP:
7551         if (s->current_el == 1 || !arm_dc_feature(s, ARM_FEATURE_EL2)) {
7552             undef = true;
7553         }
7554         break;
7555     case ARM_CPU_MODE_MON:
7556         /* No need to check specifically for "are we non-secure" because
7557          * we've already made EL0 UNDEF and handled the trap for S-EL1;
7558          * so if this isn't EL3 then we must be non-secure.
7559          */
7560         if (s->current_el != 3) {
7561             undef = true;
7562         }
7563         break;
7564     default:
7565         undef = true;
7566     }
7567
7568     if (undef) {
7569         unallocated_encoding(s);
7570         return;
7571     }
7572
7573     addr = tcg_temp_new_i32();
7574     tmp = tcg_const_i32(mode);
7575     /* get_r13_banked() will raise an exception if called from System mode */
7576     gen_set_condexec(s);
7577     gen_set_pc_im(s, s->pc_curr);
7578     gen_helper_get_r13_banked(addr, cpu_env, tmp);
7579     tcg_temp_free_i32(tmp);
7580     switch (amode) {
7581     case 0: /* DA */
7582         offset = -4;
7583         break;
7584     case 1: /* IA */
7585         offset = 0;
7586         break;
7587     case 2: /* DB */
7588         offset = -8;
7589         break;
7590     case 3: /* IB */
7591         offset = 4;
7592         break;
7593     default:
7594         abort();
7595     }
7596     tcg_gen_addi_i32(addr, addr, offset);
7597     tmp = load_reg(s, 14);
7598     gen_aa32_st32(s, tmp, addr, get_mem_index(s));
7599     tcg_temp_free_i32(tmp);
7600     tmp = load_cpu_field(spsr);
7601     tcg_gen_addi_i32(addr, addr, 4);
7602     gen_aa32_st32(s, tmp, addr, get_mem_index(s));
7603     tcg_temp_free_i32(tmp);
7604     if (writeback) {
7605         switch (amode) {
7606         case 0:
7607             offset = -8;
7608             break;
7609         case 1:
7610             offset = 4;
7611             break;
7612         case 2:
7613             offset = -4;
7614             break;
7615         case 3:
7616             offset = 0;
7617             break;
7618         default:
7619             abort();
7620         }
7621         tcg_gen_addi_i32(addr, addr, offset);
7622         tmp = tcg_const_i32(mode);
7623         gen_helper_set_r13_banked(cpu_env, tmp, addr);
7624         tcg_temp_free_i32(tmp);
7625     }
7626     tcg_temp_free_i32(addr);
7627     s->base.is_jmp = DISAS_UPDATE;
7628 }
7629
7630 /* Generate a label used for skipping this instruction */
7631 static void arm_gen_condlabel(DisasContext *s)
7632 {
7633     if (!s->condjmp) {
7634         s->condlabel = gen_new_label();
7635         s->condjmp = 1;
7636     }
7637 }
7638
7639 /* Skip this instruction if the ARM condition is false */
7640 static void arm_skip_unless(DisasContext *s, uint32_t cond)
7641 {
7642     arm_gen_condlabel(s);
7643     arm_gen_test_cc(cond ^ 1, s->condlabel);
7644 }
7645
7646
7647 /*
7648  * Constant expanders for the decoders.
7649  */
7650
7651 static int times_2(DisasContext *s, int x)
7652 {
7653     return x * 2;
7654 }
7655
7656 /* Return only the rotation part of T32ExpandImm.  */
7657 static int t32_expandimm_rot(DisasContext *s, int x)
7658 {
7659     return x & 0xc00 ? extract32(x, 7, 5) : 0;
7660 }
7661
7662 /* Return the unrotated immediate from T32ExpandImm.  */
7663 static int t32_expandimm_imm(DisasContext *s, int x)
7664 {
7665     int imm = extract32(x, 0, 8);
7666
7667     switch (extract32(x, 8, 4)) {
7668     case 0: /* XY */
7669         /* Nothing to do.  */
7670         break;
7671     case 1: /* 00XY00XY */
7672         imm *= 0x00010001;
7673         break;
7674     case 2: /* XY00XY00 */
7675         imm *= 0x01000100;
7676         break;
7677     case 3: /* XYXYXYXY */
7678         imm *= 0x01010101;
7679         break;
7680     default:
7681         /* Rotated constant.  */
7682         imm |= 0x80;
7683         break;
7684     }
7685     return imm;
7686 }
7687
7688 /*
7689  * Include the generated decoders.
7690  */
7691
7692 #include "decode-a32.inc.c"
7693 #include "decode-a32-uncond.inc.c"
7694 #include "decode-t32.inc.c"
7695
7696 /* Helpers to swap operands for reverse-subtract.  */
7697 static void gen_rsb(TCGv_i32 dst, TCGv_i32 a, TCGv_i32 b)
7698 {
7699     tcg_gen_sub_i32(dst, b, a);
7700 }
7701
7702 static void gen_rsb_CC(TCGv_i32 dst, TCGv_i32 a, TCGv_i32 b)
7703 {
7704     gen_sub_CC(dst, b, a);
7705 }
7706
7707 static void gen_rsc(TCGv_i32 dest, TCGv_i32 a, TCGv_i32 b)
7708 {
7709     gen_sub_carry(dest, b, a);
7710 }
7711
7712 static void gen_rsc_CC(TCGv_i32 dest, TCGv_i32 a, TCGv_i32 b)
7713 {
7714     gen_sbc_CC(dest, b, a);
7715 }
7716
7717 /*
7718  * Helpers for the data processing routines.
7719  *
7720  * After the computation store the results back.
7721  * This may be suppressed altogether (STREG_NONE), require a runtime
7722  * check against the stack limits (STREG_SP_CHECK), or generate an
7723  * exception return.  Oh, or store into a register.
7724  *
7725  * Always return true, indicating success for a trans_* function.
7726  */
7727 typedef enum {
7728    STREG_NONE,
7729    STREG_NORMAL,
7730    STREG_SP_CHECK,
7731    STREG_EXC_RET,
7732 } StoreRegKind;
7733
7734 static bool store_reg_kind(DisasContext *s, int rd,
7735                             TCGv_i32 val, StoreRegKind kind)
7736 {
7737     switch (kind) {
7738     case STREG_NONE:
7739         tcg_temp_free_i32(val);
7740         return true;
7741     case STREG_NORMAL:
7742         /* See ALUWritePC: Interworking only from a32 mode. */
7743         if (s->thumb) {
7744             store_reg(s, rd, val);
7745         } else {
7746             store_reg_bx(s, rd, val);
7747         }
7748         return true;
7749     case STREG_SP_CHECK:
7750         store_sp_checked(s, val);
7751         return true;
7752     case STREG_EXC_RET:
7753         gen_exception_return(s, val);
7754         return true;
7755     }
7756     g_assert_not_reached();
7757 }
7758
7759 /*
7760  * Data Processing (register)
7761  *
7762  * Operate, with set flags, one register source,
7763  * one immediate shifted register source, and a destination.
7764  */
7765 static bool op_s_rrr_shi(DisasContext *s, arg_s_rrr_shi *a,
7766                          void (*gen)(TCGv_i32, TCGv_i32, TCGv_i32),
7767                          int logic_cc, StoreRegKind kind)
7768 {
7769     TCGv_i32 tmp1, tmp2;
7770
7771     tmp2 = load_reg(s, a->rm);
7772     gen_arm_shift_im(tmp2, a->shty, a->shim, logic_cc);
7773     tmp1 = load_reg(s, a->rn);
7774
7775     gen(tmp1, tmp1, tmp2);
7776     tcg_temp_free_i32(tmp2);
7777
7778     if (logic_cc) {
7779         gen_logic_CC(tmp1);
7780     }
7781     return store_reg_kind(s, a->rd, tmp1, kind);
7782 }
7783
7784 static bool op_s_rxr_shi(DisasContext *s, arg_s_rrr_shi *a,
7785                          void (*gen)(TCGv_i32, TCGv_i32),
7786                          int logic_cc, StoreRegKind kind)
7787 {
7788     TCGv_i32 tmp;
7789
7790     tmp = load_reg(s, a->rm);
7791     gen_arm_shift_im(tmp, a->shty, a->shim, logic_cc);
7792
7793     gen(tmp, tmp);
7794     if (logic_cc) {
7795         gen_logic_CC(tmp);
7796     }
7797     return store_reg_kind(s, a->rd, tmp, kind);
7798 }
7799
7800 /*
7801  * Data-processing (register-shifted register)
7802  *
7803  * Operate, with set flags, one register source,
7804  * one register shifted register source, and a destination.
7805  */
7806 static bool op_s_rrr_shr(DisasContext *s, arg_s_rrr_shr *a,
7807                          void (*gen)(TCGv_i32, TCGv_i32, TCGv_i32),
7808                          int logic_cc, StoreRegKind kind)
7809 {
7810     TCGv_i32 tmp1, tmp2;
7811
7812     tmp1 = load_reg(s, a->rs);
7813     tmp2 = load_reg(s, a->rm);
7814     gen_arm_shift_reg(tmp2, a->shty, tmp1, logic_cc);
7815     tmp1 = load_reg(s, a->rn);
7816
7817     gen(tmp1, tmp1, tmp2);
7818     tcg_temp_free_i32(tmp2);
7819
7820     if (logic_cc) {
7821         gen_logic_CC(tmp1);
7822     }
7823     return store_reg_kind(s, a->rd, tmp1, kind);
7824 }
7825
7826 static bool op_s_rxr_shr(DisasContext *s, arg_s_rrr_shr *a,
7827                          void (*gen)(TCGv_i32, TCGv_i32),
7828                          int logic_cc, StoreRegKind kind)
7829 {
7830     TCGv_i32 tmp1, tmp2;
7831
7832     tmp1 = load_reg(s, a->rs);
7833     tmp2 = load_reg(s, a->rm);
7834     gen_arm_shift_reg(tmp2, a->shty, tmp1, logic_cc);
7835
7836     gen(tmp2, tmp2);
7837     if (logic_cc) {
7838         gen_logic_CC(tmp2);
7839     }
7840     return store_reg_kind(s, a->rd, tmp2, kind);
7841 }
7842
7843 /*
7844  * Data-processing (immediate)
7845  *
7846  * Operate, with set flags, one register source,
7847  * one rotated immediate, and a destination.
7848  *
7849  * Note that logic_cc && a->rot setting CF based on the msb of the
7850  * immediate is the reason why we must pass in the unrotated form
7851  * of the immediate.
7852  */
7853 static bool op_s_rri_rot(DisasContext *s, arg_s_rri_rot *a,
7854                          void (*gen)(TCGv_i32, TCGv_i32, TCGv_i32),
7855                          int logic_cc, StoreRegKind kind)
7856 {
7857     TCGv_i32 tmp1, tmp2;
7858     uint32_t imm;
7859
7860     imm = ror32(a->imm, a->rot);
7861     if (logic_cc && a->rot) {
7862         tcg_gen_movi_i32(cpu_CF, imm >> 31);
7863     }
7864     tmp2 = tcg_const_i32(imm);
7865     tmp1 = load_reg(s, a->rn);
7866
7867     gen(tmp1, tmp1, tmp2);
7868     tcg_temp_free_i32(tmp2);
7869
7870     if (logic_cc) {
7871         gen_logic_CC(tmp1);
7872     }
7873     return store_reg_kind(s, a->rd, tmp1, kind);
7874 }
7875
7876 static bool op_s_rxi_rot(DisasContext *s, arg_s_rri_rot *a,
7877                          void (*gen)(TCGv_i32, TCGv_i32),
7878                          int logic_cc, StoreRegKind kind)
7879 {
7880     TCGv_i32 tmp;
7881     uint32_t imm;
7882
7883     imm = ror32(a->imm, a->rot);
7884     if (logic_cc && a->rot) {
7885         tcg_gen_movi_i32(cpu_CF, imm >> 31);
7886     }
7887     tmp = tcg_const_i32(imm);
7888
7889     gen(tmp, tmp);
7890     if (logic_cc) {
7891         gen_logic_CC(tmp);
7892     }
7893     return store_reg_kind(s, a->rd, tmp, kind);
7894 }
7895
7896 #define DO_ANY3(NAME, OP, L, K)                                         \
7897     static bool trans_##NAME##_rrri(DisasContext *s, arg_s_rrr_shi *a)  \
7898     { StoreRegKind k = (K); return op_s_rrr_shi(s, a, OP, L, k); }      \
7899     static bool trans_##NAME##_rrrr(DisasContext *s, arg_s_rrr_shr *a)  \
7900     { StoreRegKind k = (K); return op_s_rrr_shr(s, a, OP, L, k); }      \
7901     static bool trans_##NAME##_rri(DisasContext *s, arg_s_rri_rot *a)   \
7902     { StoreRegKind k = (K); return op_s_rri_rot(s, a, OP, L, k); }
7903
7904 #define DO_ANY2(NAME, OP, L, K)                                         \
7905     static bool trans_##NAME##_rxri(DisasContext *s, arg_s_rrr_shi *a)  \
7906     { StoreRegKind k = (K); return op_s_rxr_shi(s, a, OP, L, k); }      \
7907     static bool trans_##NAME##_rxrr(DisasContext *s, arg_s_rrr_shr *a)  \
7908     { StoreRegKind k = (K); return op_s_rxr_shr(s, a, OP, L, k); }      \
7909     static bool trans_##NAME##_rxi(DisasContext *s, arg_s_rri_rot *a)   \
7910     { StoreRegKind k = (K); return op_s_rxi_rot(s, a, OP, L, k); }
7911
7912 #define DO_CMP2(NAME, OP, L)                                            \
7913     static bool trans_##NAME##_xrri(DisasContext *s, arg_s_rrr_shi *a)  \
7914     { return op_s_rrr_shi(s, a, OP, L, STREG_NONE); }                   \
7915     static bool trans_##NAME##_xrrr(DisasContext *s, arg_s_rrr_shr *a)  \
7916     { return op_s_rrr_shr(s, a, OP, L, STREG_NONE); }                   \
7917     static bool trans_##NAME##_xri(DisasContext *s, arg_s_rri_rot *a)   \
7918     { return op_s_rri_rot(s, a, OP, L, STREG_NONE); }
7919
7920 DO_ANY3(AND, tcg_gen_and_i32, a->s, STREG_NORMAL)
7921 DO_ANY3(EOR, tcg_gen_xor_i32, a->s, STREG_NORMAL)
7922 DO_ANY3(ORR, tcg_gen_or_i32, a->s, STREG_NORMAL)
7923 DO_ANY3(BIC, tcg_gen_andc_i32, a->s, STREG_NORMAL)
7924
7925 DO_ANY3(RSB, a->s ? gen_rsb_CC : gen_rsb, false, STREG_NORMAL)
7926 DO_ANY3(ADC, a->s ? gen_adc_CC : gen_add_carry, false, STREG_NORMAL)
7927 DO_ANY3(SBC, a->s ? gen_sbc_CC : gen_sub_carry, false, STREG_NORMAL)
7928 DO_ANY3(RSC, a->s ? gen_rsc_CC : gen_rsc, false, STREG_NORMAL)
7929
7930 DO_CMP2(TST, tcg_gen_and_i32, true)
7931 DO_CMP2(TEQ, tcg_gen_xor_i32, true)
7932 DO_CMP2(CMN, gen_add_CC, false)
7933 DO_CMP2(CMP, gen_sub_CC, false)
7934
7935 DO_ANY3(ADD, a->s ? gen_add_CC : tcg_gen_add_i32, false,
7936         a->rd == 13 && a->rn == 13 ? STREG_SP_CHECK : STREG_NORMAL)
7937
7938 /*
7939  * Note for the computation of StoreRegKind we return out of the
7940  * middle of the functions that are expanded by DO_ANY3, and that
7941  * we modify a->s via that parameter before it is used by OP.
7942  */
7943 DO_ANY3(SUB, a->s ? gen_sub_CC : tcg_gen_sub_i32, false,
7944         ({
7945             StoreRegKind ret = STREG_NORMAL;
7946             if (a->rd == 15 && a->s) {
7947                 /*
7948                  * See ALUExceptionReturn:
7949                  * In User mode, UNPREDICTABLE; we choose UNDEF.
7950                  * In Hyp mode, UNDEFINED.
7951                  */
7952                 if (IS_USER(s) || s->current_el == 2) {
7953                     unallocated_encoding(s);
7954                     return true;
7955                 }
7956                 /* There is no writeback of nzcv to PSTATE.  */
7957                 a->s = 0;
7958                 ret = STREG_EXC_RET;
7959             } else if (a->rd == 13 && a->rn == 13) {
7960                 ret = STREG_SP_CHECK;
7961             }
7962             ret;
7963         }))
7964
7965 DO_ANY2(MOV, tcg_gen_mov_i32, a->s,
7966         ({
7967             StoreRegKind ret = STREG_NORMAL;
7968             if (a->rd == 15 && a->s) {
7969                 /*
7970                  * See ALUExceptionReturn:
7971                  * In User mode, UNPREDICTABLE; we choose UNDEF.
7972                  * In Hyp mode, UNDEFINED.
7973                  */
7974                 if (IS_USER(s) || s->current_el == 2) {
7975                     unallocated_encoding(s);
7976                     return true;
7977                 }
7978                 /* There is no writeback of nzcv to PSTATE.  */
7979                 a->s = 0;
7980                 ret = STREG_EXC_RET;
7981             } else if (a->rd == 13) {
7982                 ret = STREG_SP_CHECK;
7983             }
7984             ret;
7985         }))
7986
7987 DO_ANY2(MVN, tcg_gen_not_i32, a->s, STREG_NORMAL)
7988
7989 /*
7990  * ORN is only available with T32, so there is no register-shifted-register
7991  * form of the insn.  Using the DO_ANY3 macro would create an unused function.
7992  */
7993 static bool trans_ORN_rrri(DisasContext *s, arg_s_rrr_shi *a)
7994 {
7995     return op_s_rrr_shi(s, a, tcg_gen_orc_i32, a->s, STREG_NORMAL);
7996 }
7997
7998 static bool trans_ORN_rri(DisasContext *s, arg_s_rri_rot *a)
7999 {
8000     return op_s_rri_rot(s, a, tcg_gen_orc_i32, a->s, STREG_NORMAL);
8001 }
8002
8003 #undef DO_ANY3
8004 #undef DO_ANY2
8005 #undef DO_CMP2
8006
8007 /*
8008  * Multiply and multiply accumulate
8009  */
8010
8011 static bool op_mla(DisasContext *s, arg_s_rrrr *a, bool add)
8012 {
8013     TCGv_i32 t1, t2;
8014
8015     t1 = load_reg(s, a->rn);
8016     t2 = load_reg(s, a->rm);
8017     tcg_gen_mul_i32(t1, t1, t2);
8018     tcg_temp_free_i32(t2);
8019     if (add) {
8020         t2 = load_reg(s, a->ra);
8021         tcg_gen_add_i32(t1, t1, t2);
8022         tcg_temp_free_i32(t2);
8023     }
8024     if (a->s) {
8025         gen_logic_CC(t1);
8026     }
8027     store_reg(s, a->rd, t1);
8028     return true;
8029 }
8030
8031 static bool trans_MUL(DisasContext *s, arg_MUL *a)
8032 {
8033     return op_mla(s, a, false);
8034 }
8035
8036 static bool trans_MLA(DisasContext *s, arg_MLA *a)
8037 {
8038     return op_mla(s, a, true);
8039 }
8040
8041 static bool trans_MLS(DisasContext *s, arg_MLS *a)
8042 {
8043     TCGv_i32 t1, t2;
8044
8045     if (!ENABLE_ARCH_6T2) {
8046         return false;
8047     }
8048     t1 = load_reg(s, a->rn);
8049     t2 = load_reg(s, a->rm);
8050     tcg_gen_mul_i32(t1, t1, t2);
8051     tcg_temp_free_i32(t2);
8052     t2 = load_reg(s, a->ra);
8053     tcg_gen_sub_i32(t1, t2, t1);
8054     tcg_temp_free_i32(t2);
8055     store_reg(s, a->rd, t1);
8056     return true;
8057 }
8058
8059 static bool op_mlal(DisasContext *s, arg_s_rrrr *a, bool uns, bool add)
8060 {
8061     TCGv_i32 t0, t1, t2, t3;
8062
8063     t0 = load_reg(s, a->rm);
8064     t1 = load_reg(s, a->rn);
8065     if (uns) {
8066         tcg_gen_mulu2_i32(t0, t1, t0, t1);
8067     } else {
8068         tcg_gen_muls2_i32(t0, t1, t0, t1);
8069     }
8070     if (add) {
8071         t2 = load_reg(s, a->ra);
8072         t3 = load_reg(s, a->rd);
8073         tcg_gen_add2_i32(t0, t1, t0, t1, t2, t3);
8074         tcg_temp_free_i32(t2);
8075         tcg_temp_free_i32(t3);
8076     }
8077     if (a->s) {
8078         gen_logicq_cc(t0, t1);
8079     }
8080     store_reg(s, a->ra, t0);
8081     store_reg(s, a->rd, t1);
8082     return true;
8083 }
8084
8085 static bool trans_UMULL(DisasContext *s, arg_UMULL *a)
8086 {
8087     return op_mlal(s, a, true, false);
8088 }
8089
8090 static bool trans_SMULL(DisasContext *s, arg_SMULL *a)
8091 {
8092     return op_mlal(s, a, false, false);
8093 }
8094
8095 static bool trans_UMLAL(DisasContext *s, arg_UMLAL *a)
8096 {
8097     return op_mlal(s, a, true, true);
8098 }
8099
8100 static bool trans_SMLAL(DisasContext *s, arg_SMLAL *a)
8101 {
8102     return op_mlal(s, a, false, true);
8103 }
8104
8105 static bool trans_UMAAL(DisasContext *s, arg_UMAAL *a)
8106 {
8107     TCGv_i32 t0, t1, t2, zero;
8108
8109     if (s->thumb
8110         ? !arm_dc_feature(s, ARM_FEATURE_THUMB_DSP)
8111         : !ENABLE_ARCH_6) {
8112         return false;
8113     }
8114
8115     t0 = load_reg(s, a->rm);
8116     t1 = load_reg(s, a->rn);
8117     tcg_gen_mulu2_i32(t0, t1, t0, t1);
8118     zero = tcg_const_i32(0);
8119     t2 = load_reg(s, a->ra);
8120     tcg_gen_add2_i32(t0, t1, t0, t1, t2, zero);
8121     tcg_temp_free_i32(t2);
8122     t2 = load_reg(s, a->rd);
8123     tcg_gen_add2_i32(t0, t1, t0, t1, t2, zero);
8124     tcg_temp_free_i32(t2);
8125     tcg_temp_free_i32(zero);
8126     store_reg(s, a->ra, t0);
8127     store_reg(s, a->rd, t1);
8128     return true;
8129 }
8130
8131 /*
8132  * Legacy decoder.
8133  */
8134
8135 static void disas_arm_insn(DisasContext *s, unsigned int insn)
8136 {
8137     unsigned int cond, val, op1, i, shift, rm, rs, rn, rd, sh;
8138     TCGv_i32 tmp;
8139     TCGv_i32 tmp2;
8140     TCGv_i32 tmp3;
8141     TCGv_i32 addr;
8142     TCGv_i64 tmp64;
8143
8144     /* M variants do not implement ARM mode; this must raise the INVSTATE
8145      * UsageFault exception.
8146      */
8147     if (arm_dc_feature(s, ARM_FEATURE_M)) {
8148         gen_exception_insn(s, s->pc_curr, EXCP_INVSTATE, syn_uncategorized(),
8149                            default_exception_el(s));
8150         return;
8151     }
8152     cond = insn >> 28;
8153
8154     if (cond == 0xf) {
8155         /* In ARMv3 and v4 the NV condition is UNPREDICTABLE; we
8156          * choose to UNDEF. In ARMv5 and above the space is used
8157          * for miscellaneous unconditional instructions.
8158          */
8159         ARCH(5);
8160
8161         /* Unconditional instructions.  */
8162         if (disas_a32_uncond(s, insn)) {
8163             return;
8164         }
8165         /* fall back to legacy decoder */
8166
8167         if (((insn >> 25) & 7) == 1) {
8168             /* NEON Data processing.  */
8169             if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
8170                 goto illegal_op;
8171             }
8172
8173             if (disas_neon_data_insn(s, insn)) {
8174                 goto illegal_op;
8175             }
8176             return;
8177         }
8178         if ((insn & 0x0f100000) == 0x04000000) {
8179             /* NEON load/store.  */
8180             if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
8181                 goto illegal_op;
8182             }
8183
8184             if (disas_neon_ls_insn(s, insn)) {
8185                 goto illegal_op;
8186             }
8187             return;
8188         }
8189         if ((insn & 0x0f000e10) == 0x0e000a00) {
8190             /* VFP.  */
8191             if (disas_vfp_insn(s, insn)) {
8192                 goto illegal_op;
8193             }
8194             return;
8195         }
8196         if (((insn & 0x0f30f000) == 0x0510f000) ||
8197             ((insn & 0x0f30f010) == 0x0710f000)) {
8198             if ((insn & (1 << 22)) == 0) {
8199                 /* PLDW; v7MP */
8200                 if (!arm_dc_feature(s, ARM_FEATURE_V7MP)) {
8201                     goto illegal_op;
8202                 }
8203             }
8204             /* Otherwise PLD; v5TE+ */
8205             ARCH(5TE);
8206             return;
8207         }
8208         if (((insn & 0x0f70f000) == 0x0450f000) ||
8209             ((insn & 0x0f70f010) == 0x0650f000)) {
8210             ARCH(7);
8211             return; /* PLI; V7 */
8212         }
8213         if (((insn & 0x0f700000) == 0x04100000) ||
8214             ((insn & 0x0f700010) == 0x06100000)) {
8215             if (!arm_dc_feature(s, ARM_FEATURE_V7MP)) {
8216                 goto illegal_op;
8217             }
8218             return; /* v7MP: Unallocated memory hint: must NOP */
8219         }
8220
8221         if ((insn & 0x0ffffdff) == 0x01010000) {
8222             ARCH(6);
8223             /* setend */
8224             if (((insn >> 9) & 1) != !!(s->be_data == MO_BE)) {
8225                 gen_helper_setend(cpu_env);
8226                 s->base.is_jmp = DISAS_UPDATE;
8227             }
8228             return;
8229         } else if ((insn & 0x0fffff00) == 0x057ff000) {
8230             switch ((insn >> 4) & 0xf) {
8231             case 1: /* clrex */
8232                 ARCH(6K);
8233                 gen_clrex(s);
8234                 return;
8235             case 4: /* dsb */
8236             case 5: /* dmb */
8237                 ARCH(7);
8238                 tcg_gen_mb(TCG_MO_ALL | TCG_BAR_SC);
8239                 return;
8240             case 6: /* isb */
8241                 /* We need to break the TB after this insn to execute
8242                  * self-modifying code correctly and also to take
8243                  * any pending interrupts immediately.
8244                  */
8245                 gen_goto_tb(s, 0, s->base.pc_next);
8246                 return;
8247             case 7: /* sb */
8248                 if ((insn & 0xf) || !dc_isar_feature(aa32_sb, s)) {
8249                     goto illegal_op;
8250                 }
8251                 /*
8252                  * TODO: There is no speculation barrier opcode
8253                  * for TCG; MB and end the TB instead.
8254                  */
8255                 tcg_gen_mb(TCG_MO_ALL | TCG_BAR_SC);
8256                 gen_goto_tb(s, 0, s->base.pc_next);
8257                 return;
8258             default:
8259                 goto illegal_op;
8260             }
8261         } else if ((insn & 0x0e5fffe0) == 0x084d0500) {
8262             /* srs */
8263             ARCH(6);
8264             gen_srs(s, (insn & 0x1f), (insn >> 23) & 3, insn & (1 << 21));
8265             return;
8266         } else if ((insn & 0x0e50ffe0) == 0x08100a00) {
8267             /* rfe */
8268             int32_t offset;
8269             if (IS_USER(s))
8270                 goto illegal_op;
8271             ARCH(6);
8272             rn = (insn >> 16) & 0xf;
8273             addr = load_reg(s, rn);
8274             i = (insn >> 23) & 3;
8275             switch (i) {
8276             case 0: offset = -4; break; /* DA */
8277             case 1: offset = 0; break; /* IA */
8278             case 2: offset = -8; break; /* DB */
8279             case 3: offset = 4; break; /* IB */
8280             default: abort();
8281             }
8282             if (offset)
8283                 tcg_gen_addi_i32(addr, addr, offset);
8284             /* Load PC into tmp and CPSR into tmp2.  */
8285             tmp = tcg_temp_new_i32();
8286             gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
8287             tcg_gen_addi_i32(addr, addr, 4);
8288             tmp2 = tcg_temp_new_i32();
8289             gen_aa32_ld32u(s, tmp2, addr, get_mem_index(s));
8290             if (insn & (1 << 21)) {
8291                 /* Base writeback.  */
8292                 switch (i) {
8293                 case 0: offset = -8; break;
8294                 case 1: offset = 4; break;
8295                 case 2: offset = -4; break;
8296                 case 3: offset = 0; break;
8297                 default: abort();
8298                 }
8299                 if (offset)
8300                     tcg_gen_addi_i32(addr, addr, offset);
8301                 store_reg(s, rn, addr);
8302             } else {
8303                 tcg_temp_free_i32(addr);
8304             }
8305             gen_rfe(s, tmp, tmp2);
8306             return;
8307         } else if ((insn & 0x0e000000) == 0x0a000000) {
8308             /* branch link and change to thumb (blx <offset>) */
8309             int32_t offset;
8310
8311             tmp = tcg_temp_new_i32();
8312             tcg_gen_movi_i32(tmp, s->base.pc_next);
8313             store_reg(s, 14, tmp);
8314             /* Sign-extend the 24-bit offset */
8315             offset = (((int32_t)insn) << 8) >> 8;
8316             val = read_pc(s);
8317             /* offset * 4 + bit24 * 2 + (thumb bit) */
8318             val += (offset << 2) | ((insn >> 23) & 2) | 1;
8319             /* protected by ARCH(5); above, near the start of uncond block */
8320             gen_bx_im(s, val);
8321             return;
8322         } else if ((insn & 0x0e000f00) == 0x0c000100) {
8323             if (arm_dc_feature(s, ARM_FEATURE_IWMMXT)) {
8324                 /* iWMMXt register transfer.  */
8325                 if (extract32(s->c15_cpar, 1, 1)) {
8326                     if (!disas_iwmmxt_insn(s, insn)) {
8327                         return;
8328                     }
8329                 }
8330             }
8331         } else if ((insn & 0x0e000a00) == 0x0c000800
8332                    && arm_dc_feature(s, ARM_FEATURE_V8)) {
8333             if (disas_neon_insn_3same_ext(s, insn)) {
8334                 goto illegal_op;
8335             }
8336             return;
8337         } else if ((insn & 0x0f000a00) == 0x0e000800
8338                    && arm_dc_feature(s, ARM_FEATURE_V8)) {
8339             if (disas_neon_insn_2reg_scalar_ext(s, insn)) {
8340                 goto illegal_op;
8341             }
8342             return;
8343         } else if ((insn & 0x0fe00000) == 0x0c400000) {
8344             /* Coprocessor double register transfer.  */
8345             ARCH(5TE);
8346         } else if ((insn & 0x0f000010) == 0x0e000010) {
8347             /* Additional coprocessor register transfer.  */
8348         } else if ((insn & 0x0ff10020) == 0x01000000) {
8349             uint32_t mask;
8350             uint32_t val;
8351             /* cps (privileged) */
8352             if (IS_USER(s))
8353                 return;
8354             mask = val = 0;
8355             if (insn & (1 << 19)) {
8356                 if (insn & (1 << 8))
8357                     mask |= CPSR_A;
8358                 if (insn & (1 << 7))
8359                     mask |= CPSR_I;
8360                 if (insn & (1 << 6))
8361                     mask |= CPSR_F;
8362                 if (insn & (1 << 18))
8363                     val |= mask;
8364             }
8365             if (insn & (1 << 17)) {
8366                 mask |= CPSR_M;
8367                 val |= (insn & 0x1f);
8368             }
8369             if (mask) {
8370                 gen_set_psr_im(s, mask, 0, val);
8371             }
8372             return;
8373         }
8374         goto illegal_op;
8375     }
8376     if (cond != 0xe) {
8377         /* if not always execute, we generate a conditional jump to
8378            next instruction */
8379         arm_skip_unless(s, cond);
8380     }
8381
8382     if (disas_a32(s, insn)) {
8383         return;
8384     }
8385     /* fall back to legacy decoder */
8386
8387     if ((insn & 0x0f900000) == 0x03000000) {
8388         if ((insn & (1 << 21)) == 0) {
8389             ARCH(6T2);
8390             rd = (insn >> 12) & 0xf;
8391             val = ((insn >> 4) & 0xf000) | (insn & 0xfff);
8392             if ((insn & (1 << 22)) == 0) {
8393                 /* MOVW */
8394                 tmp = tcg_temp_new_i32();
8395                 tcg_gen_movi_i32(tmp, val);
8396             } else {
8397                 /* MOVT */
8398                 tmp = load_reg(s, rd);
8399                 tcg_gen_ext16u_i32(tmp, tmp);
8400                 tcg_gen_ori_i32(tmp, tmp, val << 16);
8401             }
8402             store_reg(s, rd, tmp);
8403         } else {
8404             if (((insn >> 12) & 0xf) != 0xf)
8405                 goto illegal_op;
8406             if (((insn >> 16) & 0xf) == 0) {
8407                 gen_nop_hint(s, insn & 0xff);
8408             } else {
8409                 /* CPSR = immediate */
8410                 val = insn & 0xff;
8411                 shift = ((insn >> 8) & 0xf) * 2;
8412                 val = ror32(val, shift);
8413                 i = ((insn & (1 << 22)) != 0);
8414                 if (gen_set_psr_im(s, msr_mask(s, (insn >> 16) & 0xf, i),
8415                                    i, val)) {
8416                     goto illegal_op;
8417                 }
8418             }
8419         }
8420     } else if ((insn & 0x0f900000) == 0x01000000
8421                && (insn & 0x00000090) != 0x00000090) {
8422         /* miscellaneous instructions */
8423         op1 = (insn >> 21) & 3;
8424         sh = (insn >> 4) & 0xf;
8425         rm = insn & 0xf;
8426         switch (sh) {
8427         case 0x0: /* MSR, MRS */
8428             if (insn & (1 << 9)) {
8429                 /* MSR (banked) and MRS (banked) */
8430                 int sysm = extract32(insn, 16, 4) |
8431                     (extract32(insn, 8, 1) << 4);
8432                 int r = extract32(insn, 22, 1);
8433
8434                 if (op1 & 1) {
8435                     /* MSR (banked) */
8436                     gen_msr_banked(s, r, sysm, rm);
8437                 } else {
8438                     /* MRS (banked) */
8439                     int rd = extract32(insn, 12, 4);
8440
8441                     gen_mrs_banked(s, r, sysm, rd);
8442                 }
8443                 break;
8444             }
8445
8446             /* MSR, MRS (for PSRs) */
8447             if (op1 & 1) {
8448                 /* PSR = reg */
8449                 tmp = load_reg(s, rm);
8450                 i = ((op1 & 2) != 0);
8451                 if (gen_set_psr(s, msr_mask(s, (insn >> 16) & 0xf, i), i, tmp))
8452                     goto illegal_op;
8453             } else {
8454                 /* reg = PSR */
8455                 rd = (insn >> 12) & 0xf;
8456                 if (op1 & 2) {
8457                     if (IS_USER(s))
8458                         goto illegal_op;
8459                     tmp = load_cpu_field(spsr);
8460                 } else {
8461                     tmp = tcg_temp_new_i32();
8462                     gen_helper_cpsr_read(tmp, cpu_env);
8463                 }
8464                 store_reg(s, rd, tmp);
8465             }
8466             break;
8467         case 0x1:
8468             if (op1 == 1) {
8469                 /* branch/exchange thumb (bx).  */
8470                 ARCH(4T);
8471                 tmp = load_reg(s, rm);
8472                 gen_bx(s, tmp);
8473             } else if (op1 == 3) {
8474                 /* clz */
8475                 ARCH(5);
8476                 rd = (insn >> 12) & 0xf;
8477                 tmp = load_reg(s, rm);
8478                 tcg_gen_clzi_i32(tmp, tmp, 32);
8479                 store_reg(s, rd, tmp);
8480             } else {
8481                 goto illegal_op;
8482             }
8483             break;
8484         case 0x2:
8485             if (op1 == 1) {
8486                 ARCH(5J); /* bxj */
8487                 /* Trivial implementation equivalent to bx.  */
8488                 tmp = load_reg(s, rm);
8489                 gen_bx(s, tmp);
8490             } else {
8491                 goto illegal_op;
8492             }
8493             break;
8494         case 0x3:
8495             if (op1 != 1)
8496               goto illegal_op;
8497
8498             ARCH(5);
8499             /* branch link/exchange thumb (blx) */
8500             tmp = load_reg(s, rm);
8501             tmp2 = tcg_temp_new_i32();
8502             tcg_gen_movi_i32(tmp2, s->base.pc_next);
8503             store_reg(s, 14, tmp2);
8504             gen_bx(s, tmp);
8505             break;
8506         case 0x4:
8507         {
8508             /* crc32/crc32c */
8509             uint32_t c = extract32(insn, 8, 4);
8510
8511             /* Check this CPU supports ARMv8 CRC instructions.
8512              * op1 == 3 is UNPREDICTABLE but handle as UNDEFINED.
8513              * Bits 8, 10 and 11 should be zero.
8514              */
8515             if (!dc_isar_feature(aa32_crc32, s) || op1 == 0x3 || (c & 0xd) != 0) {
8516                 goto illegal_op;
8517             }
8518
8519             rn = extract32(insn, 16, 4);
8520             rd = extract32(insn, 12, 4);
8521
8522             tmp = load_reg(s, rn);
8523             tmp2 = load_reg(s, rm);
8524             if (op1 == 0) {
8525                 tcg_gen_andi_i32(tmp2, tmp2, 0xff);
8526             } else if (op1 == 1) {
8527                 tcg_gen_andi_i32(tmp2, tmp2, 0xffff);
8528             }
8529             tmp3 = tcg_const_i32(1 << op1);
8530             if (c & 0x2) {
8531                 gen_helper_crc32c(tmp, tmp, tmp2, tmp3);
8532             } else {
8533                 gen_helper_crc32(tmp, tmp, tmp2, tmp3);
8534             }
8535             tcg_temp_free_i32(tmp2);
8536             tcg_temp_free_i32(tmp3);
8537             store_reg(s, rd, tmp);
8538             break;
8539         }
8540         case 0x5: /* saturating add/subtract */
8541             ARCH(5TE);
8542             rd = (insn >> 12) & 0xf;
8543             rn = (insn >> 16) & 0xf;
8544             tmp = load_reg(s, rm);
8545             tmp2 = load_reg(s, rn);
8546             if (op1 & 2)
8547                 gen_helper_add_saturate(tmp2, cpu_env, tmp2, tmp2);
8548             if (op1 & 1)
8549                 gen_helper_sub_saturate(tmp, cpu_env, tmp, tmp2);
8550             else
8551                 gen_helper_add_saturate(tmp, cpu_env, tmp, tmp2);
8552             tcg_temp_free_i32(tmp2);
8553             store_reg(s, rd, tmp);
8554             break;
8555         case 0x6: /* ERET */
8556             if (op1 != 3) {
8557                 goto illegal_op;
8558             }
8559             if (!arm_dc_feature(s, ARM_FEATURE_V7VE)) {
8560                 goto illegal_op;
8561             }
8562             if ((insn & 0x000fff0f) != 0x0000000e) {
8563                 /* UNPREDICTABLE; we choose to UNDEF */
8564                 goto illegal_op;
8565             }
8566
8567             if (s->current_el == 2) {
8568                 tmp = load_cpu_field(elr_el[2]);
8569             } else {
8570                 tmp = load_reg(s, 14);
8571             }
8572             gen_exception_return(s, tmp);
8573             break;
8574         case 7:
8575         {
8576             int imm16 = extract32(insn, 0, 4) | (extract32(insn, 8, 12) << 4);
8577             switch (op1) {
8578             case 0:
8579                 /* HLT */
8580                 gen_hlt(s, imm16);
8581                 break;
8582             case 1:
8583                 /* bkpt */
8584                 ARCH(5);
8585                 gen_exception_bkpt_insn(s, syn_aa32_bkpt(imm16, false));
8586                 break;
8587             case 2:
8588                 /* Hypervisor call (v7) */
8589                 ARCH(7);
8590                 if (IS_USER(s)) {
8591                     goto illegal_op;
8592                 }
8593                 gen_hvc(s, imm16);
8594                 break;
8595             case 3:
8596                 /* Secure monitor call (v6+) */
8597                 ARCH(6K);
8598                 if (IS_USER(s)) {
8599                     goto illegal_op;
8600                 }
8601                 gen_smc(s);
8602                 break;
8603             default:
8604                 g_assert_not_reached();
8605             }
8606             break;
8607         }
8608         case 0x8: /* signed multiply */
8609         case 0xa:
8610         case 0xc:
8611         case 0xe:
8612             ARCH(5TE);
8613             rs = (insn >> 8) & 0xf;
8614             rn = (insn >> 12) & 0xf;
8615             rd = (insn >> 16) & 0xf;
8616             if (op1 == 1) {
8617                 /* (32 * 16) >> 16 */
8618                 tmp = load_reg(s, rm);
8619                 tmp2 = load_reg(s, rs);
8620                 if (sh & 4)
8621                     tcg_gen_sari_i32(tmp2, tmp2, 16);
8622                 else
8623                     gen_sxth(tmp2);
8624                 tmp64 = gen_muls_i64_i32(tmp, tmp2);
8625                 tcg_gen_shri_i64(tmp64, tmp64, 16);
8626                 tmp = tcg_temp_new_i32();
8627                 tcg_gen_extrl_i64_i32(tmp, tmp64);
8628                 tcg_temp_free_i64(tmp64);
8629                 if ((sh & 2) == 0) {
8630                     tmp2 = load_reg(s, rn);
8631                     gen_helper_add_setq(tmp, cpu_env, tmp, tmp2);
8632                     tcg_temp_free_i32(tmp2);
8633                 }
8634                 store_reg(s, rd, tmp);
8635             } else {
8636                 /* 16 * 16 */
8637                 tmp = load_reg(s, rm);
8638                 tmp2 = load_reg(s, rs);
8639                 gen_mulxy(tmp, tmp2, sh & 2, sh & 4);
8640                 tcg_temp_free_i32(tmp2);
8641                 if (op1 == 2) {
8642                     tmp64 = tcg_temp_new_i64();
8643                     tcg_gen_ext_i32_i64(tmp64, tmp);
8644                     tcg_temp_free_i32(tmp);
8645                     gen_addq(s, tmp64, rn, rd);
8646                     gen_storeq_reg(s, rn, rd, tmp64);
8647                     tcg_temp_free_i64(tmp64);
8648                 } else {
8649                     if (op1 == 0) {
8650                         tmp2 = load_reg(s, rn);
8651                         gen_helper_add_setq(tmp, cpu_env, tmp, tmp2);
8652                         tcg_temp_free_i32(tmp2);
8653                     }
8654                     store_reg(s, rd, tmp);
8655                 }
8656             }
8657             break;
8658         default:
8659             goto illegal_op;
8660         }
8661     } else if (((insn & 0x0e000000) == 0 &&
8662                 (insn & 0x00000090) != 0x90) ||
8663                ((insn & 0x0e000000) == (1 << 25))) {
8664         /* Data-processing (reg, reg-shift-reg, imm).  */
8665         /* All done in decodetree.  Reach here for illegal ops.  */
8666         goto illegal_op;
8667     } else {
8668         /* other instructions */
8669         op1 = (insn >> 24) & 0xf;
8670         switch(op1) {
8671         case 0x0:
8672         case 0x1:
8673             /* multiplies, extra load/stores */
8674             sh = (insn >> 5) & 3;
8675             if (sh == 0) {
8676                 if (op1 == 0x0) {
8677                     /* Multiply and multiply accumulate.  */
8678                     /* All done in decodetree.  Reach here for illegal ops.  */
8679                     goto illegal_op;
8680                 } else {
8681                     rn = (insn >> 16) & 0xf;
8682                     rd = (insn >> 12) & 0xf;
8683                     if (insn & (1 << 23)) {
8684                         /* load/store exclusive */
8685                         bool is_ld = extract32(insn, 20, 1);
8686                         bool is_lasr = !extract32(insn, 8, 1);
8687                         int op2 = (insn >> 8) & 3;
8688                         op1 = (insn >> 21) & 0x3;
8689
8690                         switch (op2) {
8691                         case 0: /* lda/stl */
8692                             if (op1 == 1) {
8693                                 goto illegal_op;
8694                             }
8695                             ARCH(8);
8696                             break;
8697                         case 1: /* reserved */
8698                             goto illegal_op;
8699                         case 2: /* ldaex/stlex */
8700                             ARCH(8);
8701                             break;
8702                         case 3: /* ldrex/strex */
8703                             if (op1) {
8704                                 ARCH(6K);
8705                             } else {
8706                                 ARCH(6);
8707                             }
8708                             break;
8709                         }
8710
8711                         addr = tcg_temp_local_new_i32();
8712                         load_reg_var(s, addr, rn);
8713
8714                         if (is_lasr && !is_ld) {
8715                             tcg_gen_mb(TCG_MO_ALL | TCG_BAR_STRL);
8716                         }
8717
8718                         if (op2 == 0) {
8719                             if (is_ld) {
8720                                 tmp = tcg_temp_new_i32();
8721                                 switch (op1) {
8722                                 case 0: /* lda */
8723                                     gen_aa32_ld32u_iss(s, tmp, addr,
8724                                                        get_mem_index(s),
8725                                                        rd | ISSIsAcqRel);
8726                                     break;
8727                                 case 2: /* ldab */
8728                                     gen_aa32_ld8u_iss(s, tmp, addr,
8729                                                       get_mem_index(s),
8730                                                       rd | ISSIsAcqRel);
8731                                     break;
8732                                 case 3: /* ldah */
8733                                     gen_aa32_ld16u_iss(s, tmp, addr,
8734                                                        get_mem_index(s),
8735                                                        rd | ISSIsAcqRel);
8736                                     break;
8737                                 default:
8738                                     abort();
8739                                 }
8740                                 store_reg(s, rd, tmp);
8741                             } else {
8742                                 rm = insn & 0xf;
8743                                 tmp = load_reg(s, rm);
8744                                 switch (op1) {
8745                                 case 0: /* stl */
8746                                     gen_aa32_st32_iss(s, tmp, addr,
8747                                                       get_mem_index(s),
8748                                                       rm | ISSIsAcqRel);
8749                                     break;
8750                                 case 2: /* stlb */
8751                                     gen_aa32_st8_iss(s, tmp, addr,
8752                                                      get_mem_index(s),
8753                                                      rm | ISSIsAcqRel);
8754                                     break;
8755                                 case 3: /* stlh */
8756                                     gen_aa32_st16_iss(s, tmp, addr,
8757                                                       get_mem_index(s),
8758                                                       rm | ISSIsAcqRel);
8759                                     break;
8760                                 default:
8761                                     abort();
8762                                 }
8763                                 tcg_temp_free_i32(tmp);
8764                             }
8765                         } else if (is_ld) {
8766                             switch (op1) {
8767                             case 0: /* ldrex */
8768                                 gen_load_exclusive(s, rd, 15, addr, 2);
8769                                 break;
8770                             case 1: /* ldrexd */
8771                                 gen_load_exclusive(s, rd, rd + 1, addr, 3);
8772                                 break;
8773                             case 2: /* ldrexb */
8774                                 gen_load_exclusive(s, rd, 15, addr, 0);
8775                                 break;
8776                             case 3: /* ldrexh */
8777                                 gen_load_exclusive(s, rd, 15, addr, 1);
8778                                 break;
8779                             default:
8780                                 abort();
8781                             }
8782                         } else {
8783                             rm = insn & 0xf;
8784                             switch (op1) {
8785                             case 0:  /*  strex */
8786                                 gen_store_exclusive(s, rd, rm, 15, addr, 2);
8787                                 break;
8788                             case 1: /*  strexd */
8789                                 gen_store_exclusive(s, rd, rm, rm + 1, addr, 3);
8790                                 break;
8791                             case 2: /*  strexb */
8792                                 gen_store_exclusive(s, rd, rm, 15, addr, 0);
8793                                 break;
8794                             case 3: /* strexh */
8795                                 gen_store_exclusive(s, rd, rm, 15, addr, 1);
8796                                 break;
8797                             default:
8798                                 abort();
8799                             }
8800                         }
8801                         tcg_temp_free_i32(addr);
8802
8803                         if (is_lasr && is_ld) {
8804                             tcg_gen_mb(TCG_MO_ALL | TCG_BAR_LDAQ);
8805                         }
8806                     } else if ((insn & 0x00300f00) == 0) {
8807                         /* 0bcccc_0001_0x00_xxxx_xxxx_0000_1001_xxxx
8808                         *  - SWP, SWPB
8809                         */
8810
8811                         TCGv taddr;
8812                         MemOp opc = s->be_data;
8813
8814                         rm = (insn) & 0xf;
8815
8816                         if (insn & (1 << 22)) {
8817                             opc |= MO_UB;
8818                         } else {
8819                             opc |= MO_UL | MO_ALIGN;
8820                         }
8821
8822                         addr = load_reg(s, rn);
8823                         taddr = gen_aa32_addr(s, addr, opc);
8824                         tcg_temp_free_i32(addr);
8825
8826                         tmp = load_reg(s, rm);
8827                         tcg_gen_atomic_xchg_i32(tmp, taddr, tmp,
8828                                                 get_mem_index(s), opc);
8829                         tcg_temp_free(taddr);
8830                         store_reg(s, rd, tmp);
8831                     } else {
8832                         goto illegal_op;
8833                     }
8834                 }
8835             } else {
8836                 int address_offset;
8837                 bool load = insn & (1 << 20);
8838                 bool wbit = insn & (1 << 21);
8839                 bool pbit = insn & (1 << 24);
8840                 bool doubleword = false;
8841                 ISSInfo issinfo;
8842
8843                 /* Misc load/store */
8844                 rn = (insn >> 16) & 0xf;
8845                 rd = (insn >> 12) & 0xf;
8846
8847                 /* ISS not valid if writeback */
8848                 issinfo = (pbit & !wbit) ? rd : ISSInvalid;
8849
8850                 if (!load && (sh & 2)) {
8851                     /* doubleword */
8852                     ARCH(5TE);
8853                     if (rd & 1) {
8854                         /* UNPREDICTABLE; we choose to UNDEF */
8855                         goto illegal_op;
8856                     }
8857                     load = (sh & 1) == 0;
8858                     doubleword = true;
8859                 }
8860
8861                 addr = load_reg(s, rn);
8862                 if (pbit) {
8863                     gen_add_datah_offset(s, insn, 0, addr);
8864                 }
8865                 address_offset = 0;
8866
8867                 if (doubleword) {
8868                     if (!load) {
8869                         /* store */
8870                         tmp = load_reg(s, rd);
8871                         gen_aa32_st32(s, tmp, addr, get_mem_index(s));
8872                         tcg_temp_free_i32(tmp);
8873                         tcg_gen_addi_i32(addr, addr, 4);
8874                         tmp = load_reg(s, rd + 1);
8875                         gen_aa32_st32(s, tmp, addr, get_mem_index(s));
8876                         tcg_temp_free_i32(tmp);
8877                     } else {
8878                         /* load */
8879                         tmp = tcg_temp_new_i32();
8880                         gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
8881                         store_reg(s, rd, tmp);
8882                         tcg_gen_addi_i32(addr, addr, 4);
8883                         tmp = tcg_temp_new_i32();
8884                         gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
8885                         rd++;
8886                     }
8887                     address_offset = -4;
8888                 } else if (load) {
8889                     /* load */
8890                     tmp = tcg_temp_new_i32();
8891                     switch (sh) {
8892                     case 1:
8893                         gen_aa32_ld16u_iss(s, tmp, addr, get_mem_index(s),
8894                                            issinfo);
8895                         break;
8896                     case 2:
8897                         gen_aa32_ld8s_iss(s, tmp, addr, get_mem_index(s),
8898                                           issinfo);
8899                         break;
8900                     default:
8901                     case 3:
8902                         gen_aa32_ld16s_iss(s, tmp, addr, get_mem_index(s),
8903                                            issinfo);
8904                         break;
8905                     }
8906                 } else {
8907                     /* store */
8908                     tmp = load_reg(s, rd);
8909                     gen_aa32_st16_iss(s, tmp, addr, get_mem_index(s), issinfo);
8910                     tcg_temp_free_i32(tmp);
8911                 }
8912                 /* Perform base writeback before the loaded value to
8913                    ensure correct behavior with overlapping index registers.
8914                    ldrd with base writeback is undefined if the
8915                    destination and index registers overlap.  */
8916                 if (!pbit) {
8917                     gen_add_datah_offset(s, insn, address_offset, addr);
8918                     store_reg(s, rn, addr);
8919                 } else if (wbit) {
8920                     if (address_offset)
8921                         tcg_gen_addi_i32(addr, addr, address_offset);
8922                     store_reg(s, rn, addr);
8923                 } else {
8924                     tcg_temp_free_i32(addr);
8925                 }
8926                 if (load) {
8927                     /* Complete the load.  */
8928                     store_reg(s, rd, tmp);
8929                 }
8930             }
8931             break;
8932         case 0x4:
8933         case 0x5:
8934             goto do_ldst;
8935         case 0x6:
8936         case 0x7:
8937             if (insn & (1 << 4)) {
8938                 ARCH(6);
8939                 /* Armv6 Media instructions.  */
8940                 rm = insn & 0xf;
8941                 rn = (insn >> 16) & 0xf;
8942                 rd = (insn >> 12) & 0xf;
8943                 rs = (insn >> 8) & 0xf;
8944                 switch ((insn >> 23) & 3) {
8945                 case 0: /* Parallel add/subtract.  */
8946                     op1 = (insn >> 20) & 7;
8947                     tmp = load_reg(s, rn);
8948                     tmp2 = load_reg(s, rm);
8949                     sh = (insn >> 5) & 7;
8950                     if ((op1 & 3) == 0 || sh == 5 || sh == 6)
8951                         goto illegal_op;
8952                     gen_arm_parallel_addsub(op1, sh, tmp, tmp2);
8953                     tcg_temp_free_i32(tmp2);
8954                     store_reg(s, rd, tmp);
8955                     break;
8956                 case 1:
8957                     if ((insn & 0x00700020) == 0) {
8958                         /* Halfword pack.  */
8959                         tmp = load_reg(s, rn);
8960                         tmp2 = load_reg(s, rm);
8961                         shift = (insn >> 7) & 0x1f;
8962                         if (insn & (1 << 6)) {
8963                             /* pkhtb */
8964                             if (shift == 0) {
8965                                 shift = 31;
8966                             }
8967                             tcg_gen_sari_i32(tmp2, tmp2, shift);
8968                             tcg_gen_deposit_i32(tmp, tmp, tmp2, 0, 16);
8969                         } else {
8970                             /* pkhbt */
8971                             tcg_gen_shli_i32(tmp2, tmp2, shift);
8972                             tcg_gen_deposit_i32(tmp, tmp2, tmp, 0, 16);
8973                         }
8974                         tcg_temp_free_i32(tmp2);
8975                         store_reg(s, rd, tmp);
8976                     } else if ((insn & 0x00200020) == 0x00200000) {
8977                         /* [us]sat */
8978                         tmp = load_reg(s, rm);
8979                         shift = (insn >> 7) & 0x1f;
8980                         if (insn & (1 << 6)) {
8981                             if (shift == 0)
8982                                 shift = 31;
8983                             tcg_gen_sari_i32(tmp, tmp, shift);
8984                         } else {
8985                             tcg_gen_shli_i32(tmp, tmp, shift);
8986                         }
8987                         sh = (insn >> 16) & 0x1f;
8988                         tmp2 = tcg_const_i32(sh);
8989                         if (insn & (1 << 22))
8990                           gen_helper_usat(tmp, cpu_env, tmp, tmp2);
8991                         else
8992                           gen_helper_ssat(tmp, cpu_env, tmp, tmp2);
8993                         tcg_temp_free_i32(tmp2);
8994                         store_reg(s, rd, tmp);
8995                     } else if ((insn & 0x00300fe0) == 0x00200f20) {
8996                         /* [us]sat16 */
8997                         tmp = load_reg(s, rm);
8998                         sh = (insn >> 16) & 0x1f;
8999                         tmp2 = tcg_const_i32(sh);
9000                         if (insn & (1 << 22))
9001                           gen_helper_usat16(tmp, cpu_env, tmp, tmp2);
9002                         else
9003                           gen_helper_ssat16(tmp, cpu_env, tmp, tmp2);
9004                         tcg_temp_free_i32(tmp2);
9005                         store_reg(s, rd, tmp);
9006                     } else if ((insn & 0x00700fe0) == 0x00000fa0) {
9007                         /* Select bytes.  */
9008                         tmp = load_reg(s, rn);
9009                         tmp2 = load_reg(s, rm);
9010                         tmp3 = tcg_temp_new_i32();
9011                         tcg_gen_ld_i32(tmp3, cpu_env, offsetof(CPUARMState, GE));
9012                         gen_helper_sel_flags(tmp, tmp3, tmp, tmp2);
9013                         tcg_temp_free_i32(tmp3);
9014                         tcg_temp_free_i32(tmp2);
9015                         store_reg(s, rd, tmp);
9016                     } else if ((insn & 0x000003e0) == 0x00000060) {
9017                         tmp = load_reg(s, rm);
9018                         shift = (insn >> 10) & 3;
9019                         /* ??? In many cases it's not necessary to do a
9020                            rotate, a shift is sufficient.  */
9021                         tcg_gen_rotri_i32(tmp, tmp, shift * 8);
9022                         op1 = (insn >> 20) & 7;
9023                         switch (op1) {
9024                         case 0: gen_sxtb16(tmp);  break;
9025                         case 2: gen_sxtb(tmp);    break;
9026                         case 3: gen_sxth(tmp);    break;
9027                         case 4: gen_uxtb16(tmp);  break;
9028                         case 6: gen_uxtb(tmp);    break;
9029                         case 7: gen_uxth(tmp);    break;
9030                         default: goto illegal_op;
9031                         }
9032                         if (rn != 15) {
9033                             tmp2 = load_reg(s, rn);
9034                             if ((op1 & 3) == 0) {
9035                                 gen_add16(tmp, tmp2);
9036                             } else {
9037                                 tcg_gen_add_i32(tmp, tmp, tmp2);
9038                                 tcg_temp_free_i32(tmp2);
9039                             }
9040                         }
9041                         store_reg(s, rd, tmp);
9042                     } else if ((insn & 0x003f0f60) == 0x003f0f20) {
9043                         /* rev */
9044                         tmp = load_reg(s, rm);
9045                         if (insn & (1 << 22)) {
9046                             if (insn & (1 << 7)) {
9047                                 gen_revsh(tmp);
9048                             } else {
9049                                 ARCH(6T2);
9050                                 gen_helper_rbit(tmp, tmp);
9051                             }
9052                         } else {
9053                             if (insn & (1 << 7))
9054                                 gen_rev16(tmp);
9055                             else
9056                                 tcg_gen_bswap32_i32(tmp, tmp);
9057                         }
9058                         store_reg(s, rd, tmp);
9059                     } else {
9060                         goto illegal_op;
9061                     }
9062                     break;
9063                 case 2: /* Multiplies (Type 3).  */
9064                     switch ((insn >> 20) & 0x7) {
9065                     case 5:
9066                         if (((insn >> 6) ^ (insn >> 7)) & 1) {
9067                             /* op2 not 00x or 11x : UNDEF */
9068                             goto illegal_op;
9069                         }
9070                         /* Signed multiply most significant [accumulate].
9071                            (SMMUL, SMMLA, SMMLS) */
9072                         tmp = load_reg(s, rm);
9073                         tmp2 = load_reg(s, rs);
9074                         tcg_gen_muls2_i32(tmp2, tmp, tmp, tmp2);
9075
9076                         if (rd != 15) {
9077                             tmp3 = load_reg(s, rd);
9078                             if (insn & (1 << 6)) {
9079                                 /*
9080                                  * For SMMLS, we need a 64-bit subtract.
9081                                  * Borrow caused by a non-zero multiplicand
9082                                  * lowpart, and the correct result lowpart
9083                                  * for rounding.
9084                                  */
9085                                 TCGv_i32 zero = tcg_const_i32(0);
9086                                 tcg_gen_sub2_i32(tmp2, tmp, zero, tmp3,
9087                                                  tmp2, tmp);
9088                                 tcg_temp_free_i32(zero);
9089                             } else {
9090                                 tcg_gen_add_i32(tmp, tmp, tmp3);
9091                             }
9092                             tcg_temp_free_i32(tmp3);
9093                         }
9094                         if (insn & (1 << 5)) {
9095                             /*
9096                              * Adding 0x80000000 to the 64-bit quantity
9097                              * means that we have carry in to the high
9098                              * word when the low word has the high bit set.
9099                              */
9100                             tcg_gen_shri_i32(tmp2, tmp2, 31);
9101                             tcg_gen_add_i32(tmp, tmp, tmp2);
9102                         }
9103                         tcg_temp_free_i32(tmp2);
9104                         store_reg(s, rn, tmp);
9105                         break;
9106                     case 0:
9107                     case 4:
9108                         /* SMLAD, SMUAD, SMLSD, SMUSD, SMLALD, SMLSLD */
9109                         if (insn & (1 << 7)) {
9110                             goto illegal_op;
9111                         }
9112                         tmp = load_reg(s, rm);
9113                         tmp2 = load_reg(s, rs);
9114                         if (insn & (1 << 5))
9115                             gen_swap_half(tmp2);
9116                         gen_smul_dual(tmp, tmp2);
9117                         if (insn & (1 << 22)) {
9118                             /* smlald, smlsld */
9119                             TCGv_i64 tmp64_2;
9120
9121                             tmp64 = tcg_temp_new_i64();
9122                             tmp64_2 = tcg_temp_new_i64();
9123                             tcg_gen_ext_i32_i64(tmp64, tmp);
9124                             tcg_gen_ext_i32_i64(tmp64_2, tmp2);
9125                             tcg_temp_free_i32(tmp);
9126                             tcg_temp_free_i32(tmp2);
9127                             if (insn & (1 << 6)) {
9128                                 tcg_gen_sub_i64(tmp64, tmp64, tmp64_2);
9129                             } else {
9130                                 tcg_gen_add_i64(tmp64, tmp64, tmp64_2);
9131                             }
9132                             tcg_temp_free_i64(tmp64_2);
9133                             gen_addq(s, tmp64, rd, rn);
9134                             gen_storeq_reg(s, rd, rn, tmp64);
9135                             tcg_temp_free_i64(tmp64);
9136                         } else {
9137                             /* smuad, smusd, smlad, smlsd */
9138                             if (insn & (1 << 6)) {
9139                                 /* This subtraction cannot overflow. */
9140                                 tcg_gen_sub_i32(tmp, tmp, tmp2);
9141                             } else {
9142                                 /* This addition cannot overflow 32 bits;
9143                                  * however it may overflow considered as a
9144                                  * signed operation, in which case we must set
9145                                  * the Q flag.
9146                                  */
9147                                 gen_helper_add_setq(tmp, cpu_env, tmp, tmp2);
9148                             }
9149                             tcg_temp_free_i32(tmp2);
9150                             if (rd != 15)
9151                               {
9152                                 tmp2 = load_reg(s, rd);
9153                                 gen_helper_add_setq(tmp, cpu_env, tmp, tmp2);
9154                                 tcg_temp_free_i32(tmp2);
9155                               }
9156                             store_reg(s, rn, tmp);
9157                         }
9158                         break;
9159                     case 1:
9160                     case 3:
9161                         /* SDIV, UDIV */
9162                         if (!dc_isar_feature(arm_div, s)) {
9163                             goto illegal_op;
9164                         }
9165                         if (((insn >> 5) & 7) || (rd != 15)) {
9166                             goto illegal_op;
9167                         }
9168                         tmp = load_reg(s, rm);
9169                         tmp2 = load_reg(s, rs);
9170                         if (insn & (1 << 21)) {
9171                             gen_helper_udiv(tmp, tmp, tmp2);
9172                         } else {
9173                             gen_helper_sdiv(tmp, tmp, tmp2);
9174                         }
9175                         tcg_temp_free_i32(tmp2);
9176                         store_reg(s, rn, tmp);
9177                         break;
9178                     default:
9179                         goto illegal_op;
9180                     }
9181                     break;
9182                 case 3:
9183                     op1 = ((insn >> 17) & 0x38) | ((insn >> 5) & 7);
9184                     switch (op1) {
9185                     case 0: /* Unsigned sum of absolute differences.  */
9186                         ARCH(6);
9187                         tmp = load_reg(s, rm);
9188                         tmp2 = load_reg(s, rs);
9189                         gen_helper_usad8(tmp, tmp, tmp2);
9190                         tcg_temp_free_i32(tmp2);
9191                         if (rd != 15) {
9192                             tmp2 = load_reg(s, rd);
9193                             tcg_gen_add_i32(tmp, tmp, tmp2);
9194                             tcg_temp_free_i32(tmp2);
9195                         }
9196                         store_reg(s, rn, tmp);
9197                         break;
9198                     case 0x20: case 0x24: case 0x28: case 0x2c:
9199                         /* Bitfield insert/clear.  */
9200                         ARCH(6T2);
9201                         shift = (insn >> 7) & 0x1f;
9202                         i = (insn >> 16) & 0x1f;
9203                         if (i < shift) {
9204                             /* UNPREDICTABLE; we choose to UNDEF */
9205                             goto illegal_op;
9206                         }
9207                         i = i + 1 - shift;
9208                         if (rm == 15) {
9209                             tmp = tcg_temp_new_i32();
9210                             tcg_gen_movi_i32(tmp, 0);
9211                         } else {
9212                             tmp = load_reg(s, rm);
9213                         }
9214                         if (i != 32) {
9215                             tmp2 = load_reg(s, rd);
9216                             tcg_gen_deposit_i32(tmp, tmp2, tmp, shift, i);
9217                             tcg_temp_free_i32(tmp2);
9218                         }
9219                         store_reg(s, rd, tmp);
9220                         break;
9221                     case 0x12: case 0x16: case 0x1a: case 0x1e: /* sbfx */
9222                     case 0x32: case 0x36: case 0x3a: case 0x3e: /* ubfx */
9223                         ARCH(6T2);
9224                         tmp = load_reg(s, rm);
9225                         shift = (insn >> 7) & 0x1f;
9226                         i = ((insn >> 16) & 0x1f) + 1;
9227                         if (shift + i > 32)
9228                             goto illegal_op;
9229                         if (i < 32) {
9230                             if (op1 & 0x20) {
9231                                 tcg_gen_extract_i32(tmp, tmp, shift, i);
9232                             } else {
9233                                 tcg_gen_sextract_i32(tmp, tmp, shift, i);
9234                             }
9235                         }
9236                         store_reg(s, rd, tmp);
9237                         break;
9238                     default:
9239                         goto illegal_op;
9240                     }
9241                     break;
9242                 }
9243                 break;
9244             }
9245         do_ldst:
9246             /* Check for undefined extension instructions
9247              * per the ARM Bible IE:
9248              * xxxx 0111 1111 xxxx  xxxx xxxx 1111 xxxx
9249              */
9250             sh = (0xf << 20) | (0xf << 4);
9251             if (op1 == 0x7 && ((insn & sh) == sh))
9252             {
9253                 goto illegal_op;
9254             }
9255             /* load/store byte/word */
9256             rn = (insn >> 16) & 0xf;
9257             rd = (insn >> 12) & 0xf;
9258             tmp2 = load_reg(s, rn);
9259             if ((insn & 0x01200000) == 0x00200000) {
9260                 /* ldrt/strt */
9261                 i = get_a32_user_mem_index(s);
9262             } else {
9263                 i = get_mem_index(s);
9264             }
9265             if (insn & (1 << 24))
9266                 gen_add_data_offset(s, insn, tmp2);
9267             if (insn & (1 << 20)) {
9268                 /* load */
9269                 tmp = tcg_temp_new_i32();
9270                 if (insn & (1 << 22)) {
9271                     gen_aa32_ld8u_iss(s, tmp, tmp2, i, rd);
9272                 } else {
9273                     gen_aa32_ld32u_iss(s, tmp, tmp2, i, rd);
9274                 }
9275             } else {
9276                 /* store */
9277                 tmp = load_reg(s, rd);
9278                 if (insn & (1 << 22)) {
9279                     gen_aa32_st8_iss(s, tmp, tmp2, i, rd);
9280                 } else {
9281                     gen_aa32_st32_iss(s, tmp, tmp2, i, rd);
9282                 }
9283                 tcg_temp_free_i32(tmp);
9284             }
9285             if (!(insn & (1 << 24))) {
9286                 gen_add_data_offset(s, insn, tmp2);
9287                 store_reg(s, rn, tmp2);
9288             } else if (insn & (1 << 21)) {
9289                 store_reg(s, rn, tmp2);
9290             } else {
9291                 tcg_temp_free_i32(tmp2);
9292             }
9293             if (insn & (1 << 20)) {
9294                 /* Complete the load.  */
9295                 store_reg_from_load(s, rd, tmp);
9296             }
9297             break;
9298         case 0x08:
9299         case 0x09:
9300             {
9301                 int j, n, loaded_base;
9302                 bool exc_return = false;
9303                 bool is_load = extract32(insn, 20, 1);
9304                 bool user = false;
9305                 TCGv_i32 loaded_var;
9306                 /* load/store multiple words */
9307                 /* XXX: store correct base if write back */
9308                 if (insn & (1 << 22)) {
9309                     /* LDM (user), LDM (exception return) and STM (user) */
9310                     if (IS_USER(s))
9311                         goto illegal_op; /* only usable in supervisor mode */
9312
9313                     if (is_load && extract32(insn, 15, 1)) {
9314                         exc_return = true;
9315                     } else {
9316                         user = true;
9317                     }
9318                 }
9319                 rn = (insn >> 16) & 0xf;
9320                 addr = load_reg(s, rn);
9321
9322                 /* compute total size */
9323                 loaded_base = 0;
9324                 loaded_var = NULL;
9325                 n = 0;
9326                 for (i = 0; i < 16; i++) {
9327                     if (insn & (1 << i))
9328                         n++;
9329                 }
9330                 /* XXX: test invalid n == 0 case ? */
9331                 if (insn & (1 << 23)) {
9332                     if (insn & (1 << 24)) {
9333                         /* pre increment */
9334                         tcg_gen_addi_i32(addr, addr, 4);
9335                     } else {
9336                         /* post increment */
9337                     }
9338                 } else {
9339                     if (insn & (1 << 24)) {
9340                         /* pre decrement */
9341                         tcg_gen_addi_i32(addr, addr, -(n * 4));
9342                     } else {
9343                         /* post decrement */
9344                         if (n != 1)
9345                         tcg_gen_addi_i32(addr, addr, -((n - 1) * 4));
9346                     }
9347                 }
9348                 j = 0;
9349                 for (i = 0; i < 16; i++) {
9350                     if (insn & (1 << i)) {
9351                         if (is_load) {
9352                             /* load */
9353                             tmp = tcg_temp_new_i32();
9354                             gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
9355                             if (user) {
9356                                 tmp2 = tcg_const_i32(i);
9357                                 gen_helper_set_user_reg(cpu_env, tmp2, tmp);
9358                                 tcg_temp_free_i32(tmp2);
9359                                 tcg_temp_free_i32(tmp);
9360                             } else if (i == rn) {
9361                                 loaded_var = tmp;
9362                                 loaded_base = 1;
9363                             } else if (i == 15 && exc_return) {
9364                                 store_pc_exc_ret(s, tmp);
9365                             } else {
9366                                 store_reg_from_load(s, i, tmp);
9367                             }
9368                         } else {
9369                             /* store */
9370                             if (i == 15) {
9371                                 tmp = tcg_temp_new_i32();
9372                                 tcg_gen_movi_i32(tmp, read_pc(s));
9373                             } else if (user) {
9374                                 tmp = tcg_temp_new_i32();
9375                                 tmp2 = tcg_const_i32(i);
9376                                 gen_helper_get_user_reg(tmp, cpu_env, tmp2);
9377                                 tcg_temp_free_i32(tmp2);
9378                             } else {
9379                                 tmp = load_reg(s, i);
9380                             }
9381                             gen_aa32_st32(s, tmp, addr, get_mem_index(s));
9382                             tcg_temp_free_i32(tmp);
9383                         }
9384                         j++;
9385                         /* no need to add after the last transfer */
9386                         if (j != n)
9387                             tcg_gen_addi_i32(addr, addr, 4);
9388                     }
9389                 }
9390                 if (insn & (1 << 21)) {
9391                     /* write back */
9392                     if (insn & (1 << 23)) {
9393                         if (insn & (1 << 24)) {
9394                             /* pre increment */
9395                         } else {
9396                             /* post increment */
9397                             tcg_gen_addi_i32(addr, addr, 4);
9398                         }
9399                     } else {
9400                         if (insn & (1 << 24)) {
9401                             /* pre decrement */
9402                             if (n != 1)
9403                                 tcg_gen_addi_i32(addr, addr, -((n - 1) * 4));
9404                         } else {
9405                             /* post decrement */
9406                             tcg_gen_addi_i32(addr, addr, -(n * 4));
9407                         }
9408                     }
9409                     store_reg(s, rn, addr);
9410                 } else {
9411                     tcg_temp_free_i32(addr);
9412                 }
9413                 if (loaded_base) {
9414                     store_reg(s, rn, loaded_var);
9415                 }
9416                 if (exc_return) {
9417                     /* Restore CPSR from SPSR.  */
9418                     tmp = load_cpu_field(spsr);
9419                     if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
9420                         gen_io_start();
9421                     }
9422                     gen_helper_cpsr_write_eret(cpu_env, tmp);
9423                     tcg_temp_free_i32(tmp);
9424                     /* Must exit loop to check un-masked IRQs */
9425                     s->base.is_jmp = DISAS_EXIT;
9426                 }
9427             }
9428             break;
9429         case 0xa:
9430         case 0xb:
9431             {
9432                 int32_t offset;
9433
9434                 /* branch (and link) */
9435                 if (insn & (1 << 24)) {
9436                     tmp = tcg_temp_new_i32();
9437                     tcg_gen_movi_i32(tmp, s->base.pc_next);
9438                     store_reg(s, 14, tmp);
9439                 }
9440                 offset = sextract32(insn << 2, 0, 26);
9441                 gen_jmp(s, read_pc(s) + offset);
9442             }
9443             break;
9444         case 0xc:
9445         case 0xd:
9446         case 0xe:
9447             if (((insn >> 8) & 0xe) == 10) {
9448                 /* VFP.  */
9449                 if (disas_vfp_insn(s, insn)) {
9450                     goto illegal_op;
9451                 }
9452             } else if (disas_coproc_insn(s, insn)) {
9453                 /* Coprocessor.  */
9454                 goto illegal_op;
9455             }
9456             break;
9457         case 0xf:
9458             /* swi */
9459             gen_set_pc_im(s, s->base.pc_next);
9460             s->svc_imm = extract32(insn, 0, 24);
9461             s->base.is_jmp = DISAS_SWI;
9462             break;
9463         default:
9464         illegal_op:
9465             unallocated_encoding(s);
9466             break;
9467         }
9468     }
9469 }
9470
9471 static bool thumb_insn_is_16bit(DisasContext *s, uint32_t pc, uint32_t insn)
9472 {
9473     /*
9474      * Return true if this is a 16 bit instruction. We must be precise
9475      * about this (matching the decode).
9476      */
9477     if ((insn >> 11) < 0x1d) {
9478         /* Definitely a 16-bit instruction */
9479         return true;
9480     }
9481
9482     /* Top five bits 0b11101 / 0b11110 / 0b11111 : this is the
9483      * first half of a 32-bit Thumb insn. Thumb-1 cores might
9484      * end up actually treating this as two 16-bit insns, though,
9485      * if it's half of a bl/blx pair that might span a page boundary.
9486      */
9487     if (arm_dc_feature(s, ARM_FEATURE_THUMB2) ||
9488         arm_dc_feature(s, ARM_FEATURE_M)) {
9489         /* Thumb2 cores (including all M profile ones) always treat
9490          * 32-bit insns as 32-bit.
9491          */
9492         return false;
9493     }
9494
9495     if ((insn >> 11) == 0x1e && pc - s->page_start < TARGET_PAGE_SIZE - 3) {
9496         /* 0b1111_0xxx_xxxx_xxxx : BL/BLX prefix, and the suffix
9497          * is not on the next page; we merge this into a 32-bit
9498          * insn.
9499          */
9500         return false;
9501     }
9502     /* 0b1110_1xxx_xxxx_xxxx : BLX suffix (or UNDEF);
9503      * 0b1111_1xxx_xxxx_xxxx : BL suffix;
9504      * 0b1111_0xxx_xxxx_xxxx : BL/BLX prefix on the end of a page
9505      *  -- handle as single 16 bit insn
9506      */
9507     return true;
9508 }
9509
9510 /* Translate a 32-bit thumb instruction. */
9511 static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
9512 {
9513     uint32_t imm, shift, offset;
9514     uint32_t rd, rn, rm, rs;
9515     TCGv_i32 tmp;
9516     TCGv_i32 tmp2;
9517     TCGv_i32 tmp3;
9518     TCGv_i32 addr;
9519     TCGv_i64 tmp64;
9520     int op;
9521
9522     /*
9523      * ARMv6-M supports a limited subset of Thumb2 instructions.
9524      * Other Thumb1 architectures allow only 32-bit
9525      * combined BL/BLX prefix and suffix.
9526      */
9527     if (arm_dc_feature(s, ARM_FEATURE_M) &&
9528         !arm_dc_feature(s, ARM_FEATURE_V7)) {
9529         int i;
9530         bool found = false;
9531         static const uint32_t armv6m_insn[] = {0xf3808000 /* msr */,
9532                                                0xf3b08040 /* dsb */,
9533                                                0xf3b08050 /* dmb */,
9534                                                0xf3b08060 /* isb */,
9535                                                0xf3e08000 /* mrs */,
9536                                                0xf000d000 /* bl */};
9537         static const uint32_t armv6m_mask[] = {0xffe0d000,
9538                                                0xfff0d0f0,
9539                                                0xfff0d0f0,
9540                                                0xfff0d0f0,
9541                                                0xffe0d000,
9542                                                0xf800d000};
9543
9544         for (i = 0; i < ARRAY_SIZE(armv6m_insn); i++) {
9545             if ((insn & armv6m_mask[i]) == armv6m_insn[i]) {
9546                 found = true;
9547                 break;
9548             }
9549         }
9550         if (!found) {
9551             goto illegal_op;
9552         }
9553     } else if ((insn & 0xf800e800) != 0xf000e800)  {
9554         ARCH(6T2);
9555     }
9556
9557     if (disas_t32(s, insn)) {
9558         return;
9559     }
9560     /* fall back to legacy decoder */
9561
9562     rn = (insn >> 16) & 0xf;
9563     rs = (insn >> 12) & 0xf;
9564     rd = (insn >> 8) & 0xf;
9565     rm = insn & 0xf;
9566     switch ((insn >> 25) & 0xf) {
9567     case 0: case 1: case 2: case 3:
9568         /* 16-bit instructions.  Should never happen.  */
9569         abort();
9570     case 4:
9571         if (insn & (1 << 22)) {
9572             /* 0b1110_100x_x1xx_xxxx_xxxx_xxxx_xxxx_xxxx
9573              * - load/store doubleword, load/store exclusive, ldacq/strel,
9574              *   table branch, TT.
9575              */
9576             if (insn == 0xe97fe97f && arm_dc_feature(s, ARM_FEATURE_M) &&
9577                 arm_dc_feature(s, ARM_FEATURE_V8)) {
9578                 /* 0b1110_1001_0111_1111_1110_1001_0111_111
9579                  *  - SG (v8M only)
9580                  * The bulk of the behaviour for this instruction is implemented
9581                  * in v7m_handle_execute_nsc(), which deals with the insn when
9582                  * it is executed by a CPU in non-secure state from memory
9583                  * which is Secure & NonSecure-Callable.
9584                  * Here we only need to handle the remaining cases:
9585                  *  * in NS memory (including the "security extension not
9586                  *    implemented" case) : NOP
9587                  *  * in S memory but CPU already secure (clear IT bits)
9588                  * We know that the attribute for the memory this insn is
9589                  * in must match the current CPU state, because otherwise
9590                  * get_phys_addr_pmsav8 would have generated an exception.
9591                  */
9592                 if (s->v8m_secure) {
9593                     /* Like the IT insn, we don't need to generate any code */
9594                     s->condexec_cond = 0;
9595                     s->condexec_mask = 0;
9596                 }
9597             } else if (insn & 0x01200000) {
9598                 /* 0b1110_1000_x11x_xxxx_xxxx_xxxx_xxxx_xxxx
9599                  *  - load/store dual (post-indexed)
9600                  * 0b1111_1001_x10x_xxxx_xxxx_xxxx_xxxx_xxxx
9601                  *  - load/store dual (literal and immediate)
9602                  * 0b1111_1001_x11x_xxxx_xxxx_xxxx_xxxx_xxxx
9603                  *  - load/store dual (pre-indexed)
9604                  */
9605                 bool wback = extract32(insn, 21, 1);
9606
9607                 if (rn == 15 && (insn & (1 << 21))) {
9608                     /* UNPREDICTABLE */
9609                     goto illegal_op;
9610                 }
9611
9612                 addr = add_reg_for_lit(s, rn, 0);
9613                 offset = (insn & 0xff) * 4;
9614                 if ((insn & (1 << 23)) == 0) {
9615                     offset = -offset;
9616                 }
9617
9618                 if (s->v8m_stackcheck && rn == 13 && wback) {
9619                     /*
9620                      * Here 'addr' is the current SP; if offset is +ve we're
9621                      * moving SP up, else down. It is UNKNOWN whether the limit
9622                      * check triggers when SP starts below the limit and ends
9623                      * up above it; check whichever of the current and final
9624                      * SP is lower, so QEMU will trigger in that situation.
9625                      */
9626                     if ((int32_t)offset < 0) {
9627                         TCGv_i32 newsp = tcg_temp_new_i32();
9628
9629                         tcg_gen_addi_i32(newsp, addr, offset);
9630                         gen_helper_v8m_stackcheck(cpu_env, newsp);
9631                         tcg_temp_free_i32(newsp);
9632                     } else {
9633                         gen_helper_v8m_stackcheck(cpu_env, addr);
9634                     }
9635                 }
9636
9637                 if (insn & (1 << 24)) {
9638                     tcg_gen_addi_i32(addr, addr, offset);
9639                     offset = 0;
9640                 }
9641                 if (insn & (1 << 20)) {
9642                     /* ldrd */
9643                     tmp = tcg_temp_new_i32();
9644                     gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
9645                     store_reg(s, rs, tmp);
9646                     tcg_gen_addi_i32(addr, addr, 4);
9647                     tmp = tcg_temp_new_i32();
9648                     gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
9649                     store_reg(s, rd, tmp);
9650                 } else {
9651                     /* strd */
9652                     tmp = load_reg(s, rs);
9653                     gen_aa32_st32(s, tmp, addr, get_mem_index(s));
9654                     tcg_temp_free_i32(tmp);
9655                     tcg_gen_addi_i32(addr, addr, 4);
9656                     tmp = load_reg(s, rd);
9657                     gen_aa32_st32(s, tmp, addr, get_mem_index(s));
9658                     tcg_temp_free_i32(tmp);
9659                 }
9660                 if (wback) {
9661                     /* Base writeback.  */
9662                     tcg_gen_addi_i32(addr, addr, offset - 4);
9663                     store_reg(s, rn, addr);
9664                 } else {
9665                     tcg_temp_free_i32(addr);
9666                 }
9667             } else if ((insn & (1 << 23)) == 0) {
9668                 /* 0b1110_1000_010x_xxxx_xxxx_xxxx_xxxx_xxxx
9669                  * - load/store exclusive word
9670                  * - TT (v8M only)
9671                  */
9672                 if (rs == 15) {
9673                     if (!(insn & (1 << 20)) &&
9674                         arm_dc_feature(s, ARM_FEATURE_M) &&
9675                         arm_dc_feature(s, ARM_FEATURE_V8)) {
9676                         /* 0b1110_1000_0100_xxxx_1111_xxxx_xxxx_xxxx
9677                          *  - TT (v8M only)
9678                          */
9679                         bool alt = insn & (1 << 7);
9680                         TCGv_i32 addr, op, ttresp;
9681
9682                         if ((insn & 0x3f) || rd == 13 || rd == 15 || rn == 15) {
9683                             /* we UNDEF for these UNPREDICTABLE cases */
9684                             goto illegal_op;
9685                         }
9686
9687                         if (alt && !s->v8m_secure) {
9688                             goto illegal_op;
9689                         }
9690
9691                         addr = load_reg(s, rn);
9692                         op = tcg_const_i32(extract32(insn, 6, 2));
9693                         ttresp = tcg_temp_new_i32();
9694                         gen_helper_v7m_tt(ttresp, cpu_env, addr, op);
9695                         tcg_temp_free_i32(addr);
9696                         tcg_temp_free_i32(op);
9697                         store_reg(s, rd, ttresp);
9698                         break;
9699                     }
9700                     goto illegal_op;
9701                 }
9702                 addr = tcg_temp_local_new_i32();
9703                 load_reg_var(s, addr, rn);
9704                 tcg_gen_addi_i32(addr, addr, (insn & 0xff) << 2);
9705                 if (insn & (1 << 20)) {
9706                     gen_load_exclusive(s, rs, 15, addr, 2);
9707                 } else {
9708                     gen_store_exclusive(s, rd, rs, 15, addr, 2);
9709                 }
9710                 tcg_temp_free_i32(addr);
9711             } else if ((insn & (7 << 5)) == 0) {
9712                 /* Table Branch.  */
9713                 addr = load_reg(s, rn);
9714                 tmp = load_reg(s, rm);
9715                 tcg_gen_add_i32(addr, addr, tmp);
9716                 if (insn & (1 << 4)) {
9717                     /* tbh */
9718                     tcg_gen_add_i32(addr, addr, tmp);
9719                     tcg_temp_free_i32(tmp);
9720                     tmp = tcg_temp_new_i32();
9721                     gen_aa32_ld16u(s, tmp, addr, get_mem_index(s));
9722                 } else { /* tbb */
9723                     tcg_temp_free_i32(tmp);
9724                     tmp = tcg_temp_new_i32();
9725                     gen_aa32_ld8u(s, tmp, addr, get_mem_index(s));
9726                 }
9727                 tcg_temp_free_i32(addr);
9728                 tcg_gen_shli_i32(tmp, tmp, 1);
9729                 tcg_gen_addi_i32(tmp, tmp, read_pc(s));
9730                 store_reg(s, 15, tmp);
9731             } else {
9732                 bool is_lasr = false;
9733                 bool is_ld = extract32(insn, 20, 1);
9734                 int op2 = (insn >> 6) & 0x3;
9735                 op = (insn >> 4) & 0x3;
9736                 switch (op2) {
9737                 case 0:
9738                     goto illegal_op;
9739                 case 1:
9740                     /* Load/store exclusive byte/halfword/doubleword */
9741                     if (op == 2) {
9742                         goto illegal_op;
9743                     }
9744                     ARCH(7);
9745                     break;
9746                 case 2:
9747                     /* Load-acquire/store-release */
9748                     if (op == 3) {
9749                         goto illegal_op;
9750                     }
9751                     /* Fall through */
9752                 case 3:
9753                     /* Load-acquire/store-release exclusive */
9754                     ARCH(8);
9755                     is_lasr = true;
9756                     break;
9757                 }
9758
9759                 if (is_lasr && !is_ld) {
9760                     tcg_gen_mb(TCG_MO_ALL | TCG_BAR_STRL);
9761                 }
9762
9763                 addr = tcg_temp_local_new_i32();
9764                 load_reg_var(s, addr, rn);
9765                 if (!(op2 & 1)) {
9766                     if (is_ld) {
9767                         tmp = tcg_temp_new_i32();
9768                         switch (op) {
9769                         case 0: /* ldab */
9770                             gen_aa32_ld8u_iss(s, tmp, addr, get_mem_index(s),
9771                                               rs | ISSIsAcqRel);
9772                             break;
9773                         case 1: /* ldah */
9774                             gen_aa32_ld16u_iss(s, tmp, addr, get_mem_index(s),
9775                                                rs | ISSIsAcqRel);
9776                             break;
9777                         case 2: /* lda */
9778                             gen_aa32_ld32u_iss(s, tmp, addr, get_mem_index(s),
9779                                                rs | ISSIsAcqRel);
9780                             break;
9781                         default:
9782                             abort();
9783                         }
9784                         store_reg(s, rs, tmp);
9785                     } else {
9786                         tmp = load_reg(s, rs);
9787                         switch (op) {
9788                         case 0: /* stlb */
9789                             gen_aa32_st8_iss(s, tmp, addr, get_mem_index(s),
9790                                              rs | ISSIsAcqRel);
9791                             break;
9792                         case 1: /* stlh */
9793                             gen_aa32_st16_iss(s, tmp, addr, get_mem_index(s),
9794                                               rs | ISSIsAcqRel);
9795                             break;
9796                         case 2: /* stl */
9797                             gen_aa32_st32_iss(s, tmp, addr, get_mem_index(s),
9798                                               rs | ISSIsAcqRel);
9799                             break;
9800                         default:
9801                             abort();
9802                         }
9803                         tcg_temp_free_i32(tmp);
9804                     }
9805                 } else if (is_ld) {
9806                     gen_load_exclusive(s, rs, rd, addr, op);
9807                 } else {
9808                     gen_store_exclusive(s, rm, rs, rd, addr, op);
9809                 }
9810                 tcg_temp_free_i32(addr);
9811
9812                 if (is_lasr && is_ld) {
9813                     tcg_gen_mb(TCG_MO_ALL | TCG_BAR_LDAQ);
9814                 }
9815             }
9816         } else {
9817             /* Load/store multiple, RFE, SRS.  */
9818             if (((insn >> 23) & 1) == ((insn >> 24) & 1)) {
9819                 /* RFE, SRS: not available in user mode or on M profile */
9820                 if (IS_USER(s) || arm_dc_feature(s, ARM_FEATURE_M)) {
9821                     goto illegal_op;
9822                 }
9823                 if (insn & (1 << 20)) {
9824                     /* rfe */
9825                     addr = load_reg(s, rn);
9826                     if ((insn & (1 << 24)) == 0)
9827                         tcg_gen_addi_i32(addr, addr, -8);
9828                     /* Load PC into tmp and CPSR into tmp2.  */
9829                     tmp = tcg_temp_new_i32();
9830                     gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
9831                     tcg_gen_addi_i32(addr, addr, 4);
9832                     tmp2 = tcg_temp_new_i32();
9833                     gen_aa32_ld32u(s, tmp2, addr, get_mem_index(s));
9834                     if (insn & (1 << 21)) {
9835                         /* Base writeback.  */
9836                         if (insn & (1 << 24)) {
9837                             tcg_gen_addi_i32(addr, addr, 4);
9838                         } else {
9839                             tcg_gen_addi_i32(addr, addr, -4);
9840                         }
9841                         store_reg(s, rn, addr);
9842                     } else {
9843                         tcg_temp_free_i32(addr);
9844                     }
9845                     gen_rfe(s, tmp, tmp2);
9846                 } else {
9847                     /* srs */
9848                     gen_srs(s, (insn & 0x1f), (insn & (1 << 24)) ? 1 : 2,
9849                             insn & (1 << 21));
9850                 }
9851             } else {
9852                 int i, loaded_base = 0;
9853                 TCGv_i32 loaded_var;
9854                 bool wback = extract32(insn, 21, 1);
9855                 /* Load/store multiple.  */
9856                 addr = load_reg(s, rn);
9857                 offset = 0;
9858                 for (i = 0; i < 16; i++) {
9859                     if (insn & (1 << i))
9860                         offset += 4;
9861                 }
9862
9863                 if (insn & (1 << 24)) {
9864                     tcg_gen_addi_i32(addr, addr, -offset);
9865                 }
9866
9867                 if (s->v8m_stackcheck && rn == 13 && wback) {
9868                     /*
9869                      * If the writeback is incrementing SP rather than
9870                      * decrementing it, and the initial SP is below the
9871                      * stack limit but the final written-back SP would
9872                      * be above, then then we must not perform any memory
9873                      * accesses, but it is IMPDEF whether we generate
9874                      * an exception. We choose to do so in this case.
9875                      * At this point 'addr' is the lowest address, so
9876                      * either the original SP (if incrementing) or our
9877                      * final SP (if decrementing), so that's what we check.
9878                      */
9879                     gen_helper_v8m_stackcheck(cpu_env, addr);
9880                 }
9881
9882                 loaded_var = NULL;
9883                 for (i = 0; i < 16; i++) {
9884                     if ((insn & (1 << i)) == 0)
9885                         continue;
9886                     if (insn & (1 << 20)) {
9887                         /* Load.  */
9888                         tmp = tcg_temp_new_i32();
9889                         gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
9890                         if (i == rn) {
9891                             loaded_var = tmp;
9892                             loaded_base = 1;
9893                         } else {
9894                             store_reg_from_load(s, i, tmp);
9895                         }
9896                     } else {
9897                         /* Store.  */
9898                         tmp = load_reg(s, i);
9899                         gen_aa32_st32(s, tmp, addr, get_mem_index(s));
9900                         tcg_temp_free_i32(tmp);
9901                     }
9902                     tcg_gen_addi_i32(addr, addr, 4);
9903                 }
9904                 if (loaded_base) {
9905                     store_reg(s, rn, loaded_var);
9906                 }
9907                 if (wback) {
9908                     /* Base register writeback.  */
9909                     if (insn & (1 << 24)) {
9910                         tcg_gen_addi_i32(addr, addr, -offset);
9911                     }
9912                     /* Fault if writeback register is in register list.  */
9913                     if (insn & (1 << rn))
9914                         goto illegal_op;
9915                     store_reg(s, rn, addr);
9916                 } else {
9917                     tcg_temp_free_i32(addr);
9918                 }
9919             }
9920         }
9921         break;
9922     case 5:
9923
9924         op = (insn >> 21) & 0xf;
9925         if (op == 6) {
9926             if (!arm_dc_feature(s, ARM_FEATURE_THUMB_DSP)) {
9927                 goto illegal_op;
9928             }
9929             /* Halfword pack.  */
9930             tmp = load_reg(s, rn);
9931             tmp2 = load_reg(s, rm);
9932             shift = ((insn >> 10) & 0x1c) | ((insn >> 6) & 0x3);
9933             if (insn & (1 << 5)) {
9934                 /* pkhtb */
9935                 if (shift == 0) {
9936                     shift = 31;
9937                 }
9938                 tcg_gen_sari_i32(tmp2, tmp2, shift);
9939                 tcg_gen_deposit_i32(tmp, tmp, tmp2, 0, 16);
9940             } else {
9941                 /* pkhbt */
9942                 tcg_gen_shli_i32(tmp2, tmp2, shift);
9943                 tcg_gen_deposit_i32(tmp, tmp2, tmp, 0, 16);
9944             }
9945             tcg_temp_free_i32(tmp2);
9946             store_reg(s, rd, tmp);
9947         } else {
9948             /* Data processing register constant shift.  */
9949             /* All done in decodetree.  Reach here for illegal ops.  */
9950             goto illegal_op;
9951         }
9952         break;
9953     case 13: /* Misc data processing.  */
9954         op = ((insn >> 22) & 6) | ((insn >> 7) & 1);
9955         if (op < 4 && (insn & 0xf000) != 0xf000)
9956             goto illegal_op;
9957         switch (op) {
9958         case 0: /* Register controlled shift, in decodetree */
9959             goto illegal_op;
9960         case 1: /* Sign/zero extend.  */
9961             op = (insn >> 20) & 7;
9962             switch (op) {
9963             case 0: /* SXTAH, SXTH */
9964             case 1: /* UXTAH, UXTH */
9965             case 4: /* SXTAB, SXTB */
9966             case 5: /* UXTAB, UXTB */
9967                 break;
9968             case 2: /* SXTAB16, SXTB16 */
9969             case 3: /* UXTAB16, UXTB16 */
9970                 if (!arm_dc_feature(s, ARM_FEATURE_THUMB_DSP)) {
9971                     goto illegal_op;
9972                 }
9973                 break;
9974             default:
9975                 goto illegal_op;
9976             }
9977             if (rn != 15) {
9978                 if (!arm_dc_feature(s, ARM_FEATURE_THUMB_DSP)) {
9979                     goto illegal_op;
9980                 }
9981             }
9982             tmp = load_reg(s, rm);
9983             shift = (insn >> 4) & 3;
9984             /* ??? In many cases it's not necessary to do a
9985                rotate, a shift is sufficient.  */
9986             tcg_gen_rotri_i32(tmp, tmp, shift * 8);
9987             op = (insn >> 20) & 7;
9988             switch (op) {
9989             case 0: gen_sxth(tmp);   break;
9990             case 1: gen_uxth(tmp);   break;
9991             case 2: gen_sxtb16(tmp); break;
9992             case 3: gen_uxtb16(tmp); break;
9993             case 4: gen_sxtb(tmp);   break;
9994             case 5: gen_uxtb(tmp);   break;
9995             default:
9996                 g_assert_not_reached();
9997             }
9998             if (rn != 15) {
9999                 tmp2 = load_reg(s, rn);
10000                 if ((op >> 1) == 1) {
10001                     gen_add16(tmp, tmp2);
10002                 } else {
10003                     tcg_gen_add_i32(tmp, tmp, tmp2);
10004                     tcg_temp_free_i32(tmp2);
10005                 }
10006             }
10007             store_reg(s, rd, tmp);
10008             break;
10009         case 2: /* SIMD add/subtract.  */
10010             if (!arm_dc_feature(s, ARM_FEATURE_THUMB_DSP)) {
10011                 goto illegal_op;
10012             }
10013             op = (insn >> 20) & 7;
10014             shift = (insn >> 4) & 7;
10015             if ((op & 3) == 3 || (shift & 3) == 3)
10016                 goto illegal_op;
10017             tmp = load_reg(s, rn);
10018             tmp2 = load_reg(s, rm);
10019             gen_thumb2_parallel_addsub(op, shift, tmp, tmp2);
10020             tcg_temp_free_i32(tmp2);
10021             store_reg(s, rd, tmp);
10022             break;
10023         case 3: /* Other data processing.  */
10024             op = ((insn >> 17) & 0x38) | ((insn >> 4) & 7);
10025             if (op < 4) {
10026                 /* Saturating add/subtract.  */
10027                 if (!arm_dc_feature(s, ARM_FEATURE_THUMB_DSP)) {
10028                     goto illegal_op;
10029                 }
10030                 tmp = load_reg(s, rn);
10031                 tmp2 = load_reg(s, rm);
10032                 if (op & 1)
10033                     gen_helper_add_saturate(tmp, cpu_env, tmp, tmp);
10034                 if (op & 2)
10035                     gen_helper_sub_saturate(tmp, cpu_env, tmp2, tmp);
10036                 else
10037                     gen_helper_add_saturate(tmp, cpu_env, tmp, tmp2);
10038                 tcg_temp_free_i32(tmp2);
10039             } else {
10040                 switch (op) {
10041                 case 0x0a: /* rbit */
10042                 case 0x08: /* rev */
10043                 case 0x09: /* rev16 */
10044                 case 0x0b: /* revsh */
10045                 case 0x18: /* clz */
10046                     break;
10047                 case 0x10: /* sel */
10048                     if (!arm_dc_feature(s, ARM_FEATURE_THUMB_DSP)) {
10049                         goto illegal_op;
10050                     }
10051                     break;
10052                 case 0x20: /* crc32/crc32c */
10053                 case 0x21:
10054                 case 0x22:
10055                 case 0x28:
10056                 case 0x29:
10057                 case 0x2a:
10058                     if (!dc_isar_feature(aa32_crc32, s)) {
10059                         goto illegal_op;
10060                     }
10061                     break;
10062                 default:
10063                     goto illegal_op;
10064                 }
10065                 tmp = load_reg(s, rn);
10066                 switch (op) {
10067                 case 0x0a: /* rbit */
10068                     gen_helper_rbit(tmp, tmp);
10069                     break;
10070                 case 0x08: /* rev */
10071                     tcg_gen_bswap32_i32(tmp, tmp);
10072                     break;
10073                 case 0x09: /* rev16 */
10074                     gen_rev16(tmp);
10075                     break;
10076                 case 0x0b: /* revsh */
10077                     gen_revsh(tmp);
10078                     break;
10079                 case 0x10: /* sel */
10080                     tmp2 = load_reg(s, rm);
10081                     tmp3 = tcg_temp_new_i32();
10082                     tcg_gen_ld_i32(tmp3, cpu_env, offsetof(CPUARMState, GE));
10083                     gen_helper_sel_flags(tmp, tmp3, tmp, tmp2);
10084                     tcg_temp_free_i32(tmp3);
10085                     tcg_temp_free_i32(tmp2);
10086                     break;
10087                 case 0x18: /* clz */
10088                     tcg_gen_clzi_i32(tmp, tmp, 32);
10089                     break;
10090                 case 0x20:
10091                 case 0x21:
10092                 case 0x22:
10093                 case 0x28:
10094                 case 0x29:
10095                 case 0x2a:
10096                 {
10097                     /* crc32/crc32c */
10098                     uint32_t sz = op & 0x3;
10099                     uint32_t c = op & 0x8;
10100
10101                     tmp2 = load_reg(s, rm);
10102                     if (sz == 0) {
10103                         tcg_gen_andi_i32(tmp2, tmp2, 0xff);
10104                     } else if (sz == 1) {
10105                         tcg_gen_andi_i32(tmp2, tmp2, 0xffff);
10106                     }
10107                     tmp3 = tcg_const_i32(1 << sz);
10108                     if (c) {
10109                         gen_helper_crc32c(tmp, tmp, tmp2, tmp3);
10110                     } else {
10111                         gen_helper_crc32(tmp, tmp, tmp2, tmp3);
10112                     }
10113                     tcg_temp_free_i32(tmp2);
10114                     tcg_temp_free_i32(tmp3);
10115                     break;
10116                 }
10117                 default:
10118                     g_assert_not_reached();
10119                 }
10120             }
10121             store_reg(s, rd, tmp);
10122             break;
10123         case 4: case 5: /* 32-bit multiply.  Sum of absolute differences.  */
10124             switch ((insn >> 20) & 7) {
10125             case 0: /* 32 x 32 -> 32, in decodetree */
10126                 goto illegal_op;
10127             case 7: /* Unsigned sum of absolute differences.  */
10128                 break;
10129             case 1: /* 16 x 16 -> 32 */
10130             case 2: /* Dual multiply add.  */
10131             case 3: /* 32 * 16 -> 32msb */
10132             case 4: /* Dual multiply subtract.  */
10133             case 5: case 6: /* 32 * 32 -> 32msb (SMMUL, SMMLA, SMMLS) */
10134                 if (!arm_dc_feature(s, ARM_FEATURE_THUMB_DSP)) {
10135                     goto illegal_op;
10136                 }
10137                 break;
10138             }
10139             op = (insn >> 4) & 0xf;
10140             tmp = load_reg(s, rn);
10141             tmp2 = load_reg(s, rm);
10142             switch ((insn >> 20) & 7) {
10143             case 1: /* 16 x 16 -> 32 */
10144                 gen_mulxy(tmp, tmp2, op & 2, op & 1);
10145                 tcg_temp_free_i32(tmp2);
10146                 if (rs != 15) {
10147                     tmp2 = load_reg(s, rs);
10148                     gen_helper_add_setq(tmp, cpu_env, tmp, tmp2);
10149                     tcg_temp_free_i32(tmp2);
10150                 }
10151                 break;
10152             case 2: /* Dual multiply add.  */
10153             case 4: /* Dual multiply subtract.  */
10154                 if (op)
10155                     gen_swap_half(tmp2);
10156                 gen_smul_dual(tmp, tmp2);
10157                 if (insn & (1 << 22)) {
10158                     /* This subtraction cannot overflow. */
10159                     tcg_gen_sub_i32(tmp, tmp, tmp2);
10160                 } else {
10161                     /* This addition cannot overflow 32 bits;
10162                      * however it may overflow considered as a signed
10163                      * operation, in which case we must set the Q flag.
10164                      */
10165                     gen_helper_add_setq(tmp, cpu_env, tmp, tmp2);
10166                 }
10167                 tcg_temp_free_i32(tmp2);
10168                 if (rs != 15)
10169                   {
10170                     tmp2 = load_reg(s, rs);
10171                     gen_helper_add_setq(tmp, cpu_env, tmp, tmp2);
10172                     tcg_temp_free_i32(tmp2);
10173                   }
10174                 break;
10175             case 3: /* 32 * 16 -> 32msb */
10176                 if (op)
10177                     tcg_gen_sari_i32(tmp2, tmp2, 16);
10178                 else
10179                     gen_sxth(tmp2);
10180                 tmp64 = gen_muls_i64_i32(tmp, tmp2);
10181                 tcg_gen_shri_i64(tmp64, tmp64, 16);
10182                 tmp = tcg_temp_new_i32();
10183                 tcg_gen_extrl_i64_i32(tmp, tmp64);
10184                 tcg_temp_free_i64(tmp64);
10185                 if (rs != 15)
10186                   {
10187                     tmp2 = load_reg(s, rs);
10188                     gen_helper_add_setq(tmp, cpu_env, tmp, tmp2);
10189                     tcg_temp_free_i32(tmp2);
10190                   }
10191                 break;
10192             case 5: case 6: /* 32 * 32 -> 32msb (SMMUL, SMMLA, SMMLS) */
10193                 tcg_gen_muls2_i32(tmp2, tmp, tmp, tmp2);
10194                 if (rs != 15) {
10195                     tmp3 = load_reg(s, rs);
10196                     if (insn & (1 << 20)) {
10197                         tcg_gen_add_i32(tmp, tmp, tmp3);
10198                     } else {
10199                         /*
10200                          * For SMMLS, we need a 64-bit subtract.
10201                          * Borrow caused by a non-zero multiplicand lowpart,
10202                          * and the correct result lowpart for rounding.
10203                          */
10204                         TCGv_i32 zero = tcg_const_i32(0);
10205                         tcg_gen_sub2_i32(tmp2, tmp, zero, tmp3, tmp2, tmp);
10206                         tcg_temp_free_i32(zero);
10207                     }
10208                     tcg_temp_free_i32(tmp3);
10209                 }
10210                 if (insn & (1 << 4)) {
10211                     /*
10212                      * Adding 0x80000000 to the 64-bit quantity
10213                      * means that we have carry in to the high
10214                      * word when the low word has the high bit set.
10215                      */
10216                     tcg_gen_shri_i32(tmp2, tmp2, 31);
10217                     tcg_gen_add_i32(tmp, tmp, tmp2);
10218                 }
10219                 tcg_temp_free_i32(tmp2);
10220                 break;
10221             case 7: /* Unsigned sum of absolute differences.  */
10222                 gen_helper_usad8(tmp, tmp, tmp2);
10223                 tcg_temp_free_i32(tmp2);
10224                 if (rs != 15) {
10225                     tmp2 = load_reg(s, rs);
10226                     tcg_gen_add_i32(tmp, tmp, tmp2);
10227                     tcg_temp_free_i32(tmp2);
10228                 }
10229                 break;
10230             }
10231             store_reg(s, rd, tmp);
10232             break;
10233         case 6: case 7: /* 64-bit multiply, Divide.  */
10234             op = ((insn >> 4) & 0xf) | ((insn >> 16) & 0x70);
10235             tmp = load_reg(s, rn);
10236             tmp2 = load_reg(s, rm);
10237             if ((op & 0x50) == 0x10) {
10238                 /* sdiv, udiv */
10239                 if (!dc_isar_feature(thumb_div, s)) {
10240                     goto illegal_op;
10241                 }
10242                 if (op & 0x20)
10243                     gen_helper_udiv(tmp, tmp, tmp2);
10244                 else
10245                     gen_helper_sdiv(tmp, tmp, tmp2);
10246                 tcg_temp_free_i32(tmp2);
10247                 store_reg(s, rd, tmp);
10248             } else if ((op & 0xe) == 0xc) {
10249                 /* Dual multiply accumulate long.  */
10250                 if (!arm_dc_feature(s, ARM_FEATURE_THUMB_DSP)) {
10251                     tcg_temp_free_i32(tmp);
10252                     tcg_temp_free_i32(tmp2);
10253                     goto illegal_op;
10254                 }
10255                 if (op & 1)
10256                     gen_swap_half(tmp2);
10257                 gen_smul_dual(tmp, tmp2);
10258                 if (op & 0x10) {
10259                     tcg_gen_sub_i32(tmp, tmp, tmp2);
10260                 } else {
10261                     tcg_gen_add_i32(tmp, tmp, tmp2);
10262                 }
10263                 tcg_temp_free_i32(tmp2);
10264                 /* BUGFIX */
10265                 tmp64 = tcg_temp_new_i64();
10266                 tcg_gen_ext_i32_i64(tmp64, tmp);
10267                 tcg_temp_free_i32(tmp);
10268                 gen_addq(s, tmp64, rs, rd);
10269                 gen_storeq_reg(s, rs, rd, tmp64);
10270                 tcg_temp_free_i64(tmp64);
10271             } else {
10272                 if ((op & 0x20) || !(op & 8)) {
10273                     /* Signed/unsigned 64-bit multiply, in decodetree */
10274                     tcg_temp_free_i32(tmp2);
10275                     tcg_temp_free_i32(tmp);
10276                     goto illegal_op;
10277                 }
10278                 /* smlalxy */
10279                 if (!arm_dc_feature(s, ARM_FEATURE_THUMB_DSP)) {
10280                     tcg_temp_free_i32(tmp2);
10281                     tcg_temp_free_i32(tmp);
10282                     goto illegal_op;
10283                 }
10284                 gen_mulxy(tmp, tmp2, op & 2, op & 1);
10285                 tcg_temp_free_i32(tmp2);
10286                 tmp64 = tcg_temp_new_i64();
10287                 tcg_gen_ext_i32_i64(tmp64, tmp);
10288                 tcg_temp_free_i32(tmp);
10289                 if (op & 0x40) {
10290                     /* 64-bit accumulate.  */
10291                     gen_addq(s, tmp64, rs, rd);
10292                 }
10293                 gen_storeq_reg(s, rs, rd, tmp64);
10294                 tcg_temp_free_i64(tmp64);
10295             }
10296             break;
10297         }
10298         break;
10299     case 6: case 7: case 14: case 15:
10300         /* Coprocessor.  */
10301         if (arm_dc_feature(s, ARM_FEATURE_M)) {
10302             /* 0b111x_11xx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx */
10303             if (extract32(insn, 24, 2) == 3) {
10304                 goto illegal_op; /* op0 = 0b11 : unallocated */
10305             }
10306
10307             /*
10308              * Decode VLLDM and VLSTM first: these are nonstandard because:
10309              *  * if there is no FPU then these insns must NOP in
10310              *    Secure state and UNDEF in Nonsecure state
10311              *  * if there is an FPU then these insns do not have
10312              *    the usual behaviour that disas_vfp_insn() provides of
10313              *    being controlled by CPACR/NSACR enable bits or the
10314              *    lazy-stacking logic.
10315              */
10316             if (arm_dc_feature(s, ARM_FEATURE_V8) &&
10317                 (insn & 0xffa00f00) == 0xec200a00) {
10318                 /* 0b1110_1100_0x1x_xxxx_xxxx_1010_xxxx_xxxx
10319                  *  - VLLDM, VLSTM
10320                  * We choose to UNDEF if the RAZ bits are non-zero.
10321                  */
10322                 if (!s->v8m_secure || (insn & 0x0040f0ff)) {
10323                     goto illegal_op;
10324                 }
10325
10326                 if (arm_dc_feature(s, ARM_FEATURE_VFP)) {
10327                     TCGv_i32 fptr = load_reg(s, rn);
10328
10329                     if (extract32(insn, 20, 1)) {
10330                         gen_helper_v7m_vlldm(cpu_env, fptr);
10331                     } else {
10332                         gen_helper_v7m_vlstm(cpu_env, fptr);
10333                     }
10334                     tcg_temp_free_i32(fptr);
10335
10336                     /* End the TB, because we have updated FP control bits */
10337                     s->base.is_jmp = DISAS_UPDATE;
10338                 }
10339                 break;
10340             }
10341             if (arm_dc_feature(s, ARM_FEATURE_VFP) &&
10342                 ((insn >> 8) & 0xe) == 10) {
10343                 /* FP, and the CPU supports it */
10344                 if (disas_vfp_insn(s, insn)) {
10345                     goto illegal_op;
10346                 }
10347                 break;
10348             }
10349
10350             /* All other insns: NOCP */
10351             gen_exception_insn(s, s->pc_curr, EXCP_NOCP, syn_uncategorized(),
10352                                default_exception_el(s));
10353             break;
10354         }
10355         if ((insn & 0xfe000a00) == 0xfc000800
10356             && arm_dc_feature(s, ARM_FEATURE_V8)) {
10357             /* The Thumb2 and ARM encodings are identical.  */
10358             if (disas_neon_insn_3same_ext(s, insn)) {
10359                 goto illegal_op;
10360             }
10361         } else if ((insn & 0xff000a00) == 0xfe000800
10362                    && arm_dc_feature(s, ARM_FEATURE_V8)) {
10363             /* The Thumb2 and ARM encodings are identical.  */
10364             if (disas_neon_insn_2reg_scalar_ext(s, insn)) {
10365                 goto illegal_op;
10366             }
10367         } else if (((insn >> 24) & 3) == 3) {
10368             /* Translate into the equivalent ARM encoding.  */
10369             insn = (insn & 0xe2ffffff) | ((insn & (1 << 28)) >> 4) | (1 << 28);
10370             if (disas_neon_data_insn(s, insn)) {
10371                 goto illegal_op;
10372             }
10373         } else if (((insn >> 8) & 0xe) == 10) {
10374             if (disas_vfp_insn(s, insn)) {
10375                 goto illegal_op;
10376             }
10377         } else {
10378             if (insn & (1 << 28))
10379                 goto illegal_op;
10380             if (disas_coproc_insn(s, insn)) {
10381                 goto illegal_op;
10382             }
10383         }
10384         break;
10385     case 8: case 9: case 10: case 11:
10386         if (insn & (1 << 15)) {
10387             /* Branches, misc control.  */
10388             if (insn & 0x5000) {
10389                 /* Unconditional branch.  */
10390                 /* signextend(hw1[10:0]) -> offset[:12].  */
10391                 offset = ((int32_t)insn << 5) >> 9 & ~(int32_t)0xfff;
10392                 /* hw1[10:0] -> offset[11:1].  */
10393                 offset |= (insn & 0x7ff) << 1;
10394                 /* (~hw2[13, 11] ^ offset[24]) -> offset[23,22]
10395                    offset[24:22] already have the same value because of the
10396                    sign extension above.  */
10397                 offset ^= ((~insn) & (1 << 13)) << 10;
10398                 offset ^= ((~insn) & (1 << 11)) << 11;
10399
10400                 if (insn & (1 << 14)) {
10401                     /* Branch and link.  */
10402                     tcg_gen_movi_i32(cpu_R[14], s->base.pc_next | 1);
10403                 }
10404
10405                 offset += read_pc(s);
10406                 if (insn & (1 << 12)) {
10407                     /* b/bl */
10408                     gen_jmp(s, offset);
10409                 } else {
10410                     /* blx */
10411                     offset &= ~(uint32_t)2;
10412                     /* thumb2 bx, no need to check */
10413                     gen_bx_im(s, offset);
10414                 }
10415             } else if (((insn >> 23) & 7) == 7) {
10416                 /* Misc control */
10417                 if (insn & (1 << 13))
10418                     goto illegal_op;
10419
10420                 if (insn & (1 << 26)) {
10421                     if (arm_dc_feature(s, ARM_FEATURE_M)) {
10422                         goto illegal_op;
10423                     }
10424                     if (!(insn & (1 << 20))) {
10425                         /* Hypervisor call (v7) */
10426                         int imm16 = extract32(insn, 16, 4) << 12
10427                             | extract32(insn, 0, 12);
10428                         ARCH(7);
10429                         if (IS_USER(s)) {
10430                             goto illegal_op;
10431                         }
10432                         gen_hvc(s, imm16);
10433                     } else {
10434                         /* Secure monitor call (v6+) */
10435                         ARCH(6K);
10436                         if (IS_USER(s)) {
10437                             goto illegal_op;
10438                         }
10439                         gen_smc(s);
10440                     }
10441                 } else {
10442                     op = (insn >> 20) & 7;
10443                     switch (op) {
10444                     case 0: /* msr cpsr.  */
10445                         if (arm_dc_feature(s, ARM_FEATURE_M)) {
10446                             tmp = load_reg(s, rn);
10447                             /* the constant is the mask and SYSm fields */
10448                             addr = tcg_const_i32(insn & 0xfff);
10449                             gen_helper_v7m_msr(cpu_env, addr, tmp);
10450                             tcg_temp_free_i32(addr);
10451                             tcg_temp_free_i32(tmp);
10452                             gen_lookup_tb(s);
10453                             break;
10454                         }
10455                         /* fall through */
10456                     case 1: /* msr spsr.  */
10457                         if (arm_dc_feature(s, ARM_FEATURE_M)) {
10458                             goto illegal_op;
10459                         }
10460
10461                         if (extract32(insn, 5, 1)) {
10462                             /* MSR (banked) */
10463                             int sysm = extract32(insn, 8, 4) |
10464                                 (extract32(insn, 4, 1) << 4);
10465                             int r = op & 1;
10466
10467                             gen_msr_banked(s, r, sysm, rm);
10468                             break;
10469                         }
10470
10471                         /* MSR (for PSRs) */
10472                         tmp = load_reg(s, rn);
10473                         if (gen_set_psr(s,
10474                               msr_mask(s, (insn >> 8) & 0xf, op == 1),
10475                               op == 1, tmp))
10476                             goto illegal_op;
10477                         break;
10478                     case 2: /* cps, nop-hint.  */
10479                         if (((insn >> 8) & 7) == 0) {
10480                             gen_nop_hint(s, insn & 0xff);
10481                         }
10482                         /* Implemented as NOP in user mode.  */
10483                         if (IS_USER(s))
10484                             break;
10485                         offset = 0;
10486                         imm = 0;
10487                         if (insn & (1 << 10)) {
10488                             if (insn & (1 << 7))
10489                                 offset |= CPSR_A;
10490                             if (insn & (1 << 6))
10491                                 offset |= CPSR_I;
10492                             if (insn & (1 << 5))
10493                                 offset |= CPSR_F;
10494                             if (insn & (1 << 9))
10495                                 imm = CPSR_A | CPSR_I | CPSR_F;
10496                         }
10497                         if (insn & (1 << 8)) {
10498                             offset |= 0x1f;
10499                             imm |= (insn & 0x1f);
10500                         }
10501                         if (offset) {
10502                             gen_set_psr_im(s, offset, 0, imm);
10503                         }
10504                         break;
10505                     case 3: /* Special control operations.  */
10506                         if (!arm_dc_feature(s, ARM_FEATURE_V7) &&
10507                             !arm_dc_feature(s, ARM_FEATURE_M)) {
10508                             goto illegal_op;
10509                         }
10510                         op = (insn >> 4) & 0xf;
10511                         switch (op) {
10512                         case 2: /* clrex */
10513                             gen_clrex(s);
10514                             break;
10515                         case 4: /* dsb */
10516                         case 5: /* dmb */
10517                             tcg_gen_mb(TCG_MO_ALL | TCG_BAR_SC);
10518                             break;
10519                         case 6: /* isb */
10520                             /* We need to break the TB after this insn
10521                              * to execute self-modifying code correctly
10522                              * and also to take any pending interrupts
10523                              * immediately.
10524                              */
10525                             gen_goto_tb(s, 0, s->base.pc_next);
10526                             break;
10527                         case 7: /* sb */
10528                             if ((insn & 0xf) || !dc_isar_feature(aa32_sb, s)) {
10529                                 goto illegal_op;
10530                             }
10531                             /*
10532                              * TODO: There is no speculation barrier opcode
10533                              * for TCG; MB and end the TB instead.
10534                              */
10535                             tcg_gen_mb(TCG_MO_ALL | TCG_BAR_SC);
10536                             gen_goto_tb(s, 0, s->base.pc_next);
10537                             break;
10538                         default:
10539                             goto illegal_op;
10540                         }
10541                         break;
10542                     case 4: /* bxj */
10543                         /* Trivial implementation equivalent to bx.
10544                          * This instruction doesn't exist at all for M-profile.
10545                          */
10546                         if (arm_dc_feature(s, ARM_FEATURE_M)) {
10547                             goto illegal_op;
10548                         }
10549                         tmp = load_reg(s, rn);
10550                         gen_bx(s, tmp);
10551                         break;
10552                     case 5: /* Exception return.  */
10553                         if (IS_USER(s)) {
10554                             goto illegal_op;
10555                         }
10556                         if (rn != 14 || rd != 15) {
10557                             goto illegal_op;
10558                         }
10559                         if (s->current_el == 2) {
10560                             /* ERET from Hyp uses ELR_Hyp, not LR */
10561                             if (insn & 0xff) {
10562                                 goto illegal_op;
10563                             }
10564                             tmp = load_cpu_field(elr_el[2]);
10565                         } else {
10566                             tmp = load_reg(s, rn);
10567                             tcg_gen_subi_i32(tmp, tmp, insn & 0xff);
10568                         }
10569                         gen_exception_return(s, tmp);
10570                         break;
10571                     case 6: /* MRS */
10572                         if (extract32(insn, 5, 1) &&
10573                             !arm_dc_feature(s, ARM_FEATURE_M)) {
10574                             /* MRS (banked) */
10575                             int sysm = extract32(insn, 16, 4) |
10576                                 (extract32(insn, 4, 1) << 4);
10577
10578                             gen_mrs_banked(s, 0, sysm, rd);
10579                             break;
10580                         }
10581
10582                         if (extract32(insn, 16, 4) != 0xf) {
10583                             goto illegal_op;
10584                         }
10585                         if (!arm_dc_feature(s, ARM_FEATURE_M) &&
10586                             extract32(insn, 0, 8) != 0) {
10587                             goto illegal_op;
10588                         }
10589
10590                         /* mrs cpsr */
10591                         tmp = tcg_temp_new_i32();
10592                         if (arm_dc_feature(s, ARM_FEATURE_M)) {
10593                             addr = tcg_const_i32(insn & 0xff);
10594                             gen_helper_v7m_mrs(tmp, cpu_env, addr);
10595                             tcg_temp_free_i32(addr);
10596                         } else {
10597                             gen_helper_cpsr_read(tmp, cpu_env);
10598                         }
10599                         store_reg(s, rd, tmp);
10600                         break;
10601                     case 7: /* MRS */
10602                         if (extract32(insn, 5, 1) &&
10603                             !arm_dc_feature(s, ARM_FEATURE_M)) {
10604                             /* MRS (banked) */
10605                             int sysm = extract32(insn, 16, 4) |
10606                                 (extract32(insn, 4, 1) << 4);
10607
10608                             gen_mrs_banked(s, 1, sysm, rd);
10609                             break;
10610                         }
10611
10612                         /* mrs spsr.  */
10613                         /* Not accessible in user mode.  */
10614                         if (IS_USER(s) || arm_dc_feature(s, ARM_FEATURE_M)) {
10615                             goto illegal_op;
10616                         }
10617
10618                         if (extract32(insn, 16, 4) != 0xf ||
10619                             extract32(insn, 0, 8) != 0) {
10620                             goto illegal_op;
10621                         }
10622
10623                         tmp = load_cpu_field(spsr);
10624                         store_reg(s, rd, tmp);
10625                         break;
10626                     }
10627                 }
10628             } else {
10629                 /* Conditional branch.  */
10630                 op = (insn >> 22) & 0xf;
10631                 /* Generate a conditional jump to next instruction.  */
10632                 arm_skip_unless(s, op);
10633
10634                 /* offset[11:1] = insn[10:0] */
10635                 offset = (insn & 0x7ff) << 1;
10636                 /* offset[17:12] = insn[21:16].  */
10637                 offset |= (insn & 0x003f0000) >> 4;
10638                 /* offset[31:20] = insn[26].  */
10639                 offset |= ((int32_t)((insn << 5) & 0x80000000)) >> 11;
10640                 /* offset[18] = insn[13].  */
10641                 offset |= (insn & (1 << 13)) << 5;
10642                 /* offset[19] = insn[11].  */
10643                 offset |= (insn & (1 << 11)) << 8;
10644
10645                 /* jump to the offset */
10646                 gen_jmp(s, read_pc(s) + offset);
10647             }
10648         } else {
10649             /*
10650              * 0b1111_0xxx_xxxx_0xxx_xxxx_xxxx
10651              *  - Data-processing (modified immediate, plain binary immediate)
10652              */
10653             if (insn & (1 << 25)) {
10654                 /*
10655                  * 0b1111_0x1x_xxxx_0xxx_xxxx_xxxx
10656                  *  - Data-processing (plain binary immediate)
10657                  */
10658                 if (insn & (1 << 24)) {
10659                     if (insn & (1 << 20))
10660                         goto illegal_op;
10661                     /* Bitfield/Saturate.  */
10662                     op = (insn >> 21) & 7;
10663                     imm = insn & 0x1f;
10664                     shift = ((insn >> 6) & 3) | ((insn >> 10) & 0x1c);
10665                     if (rn == 15) {
10666                         tmp = tcg_temp_new_i32();
10667                         tcg_gen_movi_i32(tmp, 0);
10668                     } else {
10669                         tmp = load_reg(s, rn);
10670                     }
10671                     switch (op) {
10672                     case 2: /* Signed bitfield extract.  */
10673                         imm++;
10674                         if (shift + imm > 32)
10675                             goto illegal_op;
10676                         if (imm < 32) {
10677                             tcg_gen_sextract_i32(tmp, tmp, shift, imm);
10678                         }
10679                         break;
10680                     case 6: /* Unsigned bitfield extract.  */
10681                         imm++;
10682                         if (shift + imm > 32)
10683                             goto illegal_op;
10684                         if (imm < 32) {
10685                             tcg_gen_extract_i32(tmp, tmp, shift, imm);
10686                         }
10687                         break;
10688                     case 3: /* Bitfield insert/clear.  */
10689                         if (imm < shift)
10690                             goto illegal_op;
10691                         imm = imm + 1 - shift;
10692                         if (imm != 32) {
10693                             tmp2 = load_reg(s, rd);
10694                             tcg_gen_deposit_i32(tmp, tmp2, tmp, shift, imm);
10695                             tcg_temp_free_i32(tmp2);
10696                         }
10697                         break;
10698                     case 7:
10699                         goto illegal_op;
10700                     default: /* Saturate.  */
10701                         if (op & 1) {
10702                             tcg_gen_sari_i32(tmp, tmp, shift);
10703                         } else {
10704                             tcg_gen_shli_i32(tmp, tmp, shift);
10705                         }
10706                         tmp2 = tcg_const_i32(imm);
10707                         if (op & 4) {
10708                             /* Unsigned.  */
10709                             if ((op & 1) && shift == 0) {
10710                                 if (!arm_dc_feature(s, ARM_FEATURE_THUMB_DSP)) {
10711                                     tcg_temp_free_i32(tmp);
10712                                     tcg_temp_free_i32(tmp2);
10713                                     goto illegal_op;
10714                                 }
10715                                 gen_helper_usat16(tmp, cpu_env, tmp, tmp2);
10716                             } else {
10717                                 gen_helper_usat(tmp, cpu_env, tmp, tmp2);
10718                             }
10719                         } else {
10720                             /* Signed.  */
10721                             if ((op & 1) && shift == 0) {
10722                                 if (!arm_dc_feature(s, ARM_FEATURE_THUMB_DSP)) {
10723                                     tcg_temp_free_i32(tmp);
10724                                     tcg_temp_free_i32(tmp2);
10725                                     goto illegal_op;
10726                                 }
10727                                 gen_helper_ssat16(tmp, cpu_env, tmp, tmp2);
10728                             } else {
10729                                 gen_helper_ssat(tmp, cpu_env, tmp, tmp2);
10730                             }
10731                         }
10732                         tcg_temp_free_i32(tmp2);
10733                         break;
10734                     }
10735                     store_reg(s, rd, tmp);
10736                 } else {
10737                     imm = ((insn & 0x04000000) >> 15)
10738                           | ((insn & 0x7000) >> 4) | (insn & 0xff);
10739                     if (insn & (1 << 22)) {
10740                         /* 16-bit immediate.  */
10741                         imm |= (insn >> 4) & 0xf000;
10742                         if (insn & (1 << 23)) {
10743                             /* movt */
10744                             tmp = load_reg(s, rd);
10745                             tcg_gen_ext16u_i32(tmp, tmp);
10746                             tcg_gen_ori_i32(tmp, tmp, imm << 16);
10747                         } else {
10748                             /* movw */
10749                             tmp = tcg_temp_new_i32();
10750                             tcg_gen_movi_i32(tmp, imm);
10751                         }
10752                         store_reg(s, rd, tmp);
10753                     } else {
10754                         /* Add/sub 12-bit immediate.  */
10755                         if (insn & (1 << 23)) {
10756                             imm = -imm;
10757                         }
10758                         tmp = add_reg_for_lit(s, rn, imm);
10759                         if (rn == 13 && rd == 13) {
10760                             /* ADD SP, SP, imm or SUB SP, SP, imm */
10761                             store_sp_checked(s, tmp);
10762                         } else {
10763                             store_reg(s, rd, tmp);
10764                         }
10765                     }
10766                 }
10767             } else {
10768                 /* Data-processing (modified immediate) */
10769                 /* All done in decodetree.  Reach here for illegal ops.  */
10770                 goto illegal_op;
10771             }
10772         }
10773         break;
10774     case 12: /* Load/store single data item.  */
10775         {
10776         int postinc = 0;
10777         int writeback = 0;
10778         int memidx;
10779         ISSInfo issinfo;
10780
10781         if ((insn & 0x01100000) == 0x01000000) {
10782             if (disas_neon_ls_insn(s, insn)) {
10783                 goto illegal_op;
10784             }
10785             break;
10786         }
10787         op = ((insn >> 21) & 3) | ((insn >> 22) & 4);
10788         if (rs == 15) {
10789             if (!(insn & (1 << 20))) {
10790                 goto illegal_op;
10791             }
10792             if (op != 2) {
10793                 /* Byte or halfword load space with dest == r15 : memory hints.
10794                  * Catch them early so we don't emit pointless addressing code.
10795                  * This space is a mix of:
10796                  *  PLD/PLDW/PLI,  which we implement as NOPs (note that unlike
10797                  *     the ARM encodings, PLDW space doesn't UNDEF for non-v7MP
10798                  *     cores)
10799                  *  unallocated hints, which must be treated as NOPs
10800                  *  UNPREDICTABLE space, which we NOP or UNDEF depending on
10801                  *     which is easiest for the decoding logic
10802                  *  Some space which must UNDEF
10803                  */
10804                 int op1 = (insn >> 23) & 3;
10805                 int op2 = (insn >> 6) & 0x3f;
10806                 if (op & 2) {
10807                     goto illegal_op;
10808                 }
10809                 if (rn == 15) {
10810                     /* UNPREDICTABLE, unallocated hint or
10811                      * PLD/PLDW/PLI (literal)
10812                      */
10813                     return;
10814                 }
10815                 if (op1 & 1) {
10816                     return; /* PLD/PLDW/PLI or unallocated hint */
10817                 }
10818                 if ((op2 == 0) || ((op2 & 0x3c) == 0x30)) {
10819                     return; /* PLD/PLDW/PLI or unallocated hint */
10820                 }
10821                 /* UNDEF space, or an UNPREDICTABLE */
10822                 goto illegal_op;
10823             }
10824         }
10825         memidx = get_mem_index(s);
10826         imm = insn & 0xfff;
10827         if (insn & (1 << 23)) {
10828             /* PC relative or Positive offset.  */
10829             addr = add_reg_for_lit(s, rn, imm);
10830         } else if (rn == 15) {
10831             /* PC relative with negative offset.  */
10832             addr = add_reg_for_lit(s, rn, -imm);
10833         } else {
10834             addr = load_reg(s, rn);
10835             imm = insn & 0xff;
10836             switch ((insn >> 8) & 0xf) {
10837             case 0x0: /* Shifted Register.  */
10838                 shift = (insn >> 4) & 0xf;
10839                 if (shift > 3) {
10840                     tcg_temp_free_i32(addr);
10841                     goto illegal_op;
10842                 }
10843                 tmp = load_reg(s, rm);
10844                 tcg_gen_shli_i32(tmp, tmp, shift);
10845                 tcg_gen_add_i32(addr, addr, tmp);
10846                 tcg_temp_free_i32(tmp);
10847                 break;
10848             case 0xc: /* Negative offset.  */
10849                 tcg_gen_addi_i32(addr, addr, -imm);
10850                 break;
10851             case 0xe: /* User privilege.  */
10852                 tcg_gen_addi_i32(addr, addr, imm);
10853                 memidx = get_a32_user_mem_index(s);
10854                 break;
10855             case 0x9: /* Post-decrement.  */
10856                 imm = -imm;
10857                 /* Fall through.  */
10858             case 0xb: /* Post-increment.  */
10859                 postinc = 1;
10860                 writeback = 1;
10861                 break;
10862             case 0xd: /* Pre-decrement.  */
10863                 imm = -imm;
10864                 /* Fall through.  */
10865             case 0xf: /* Pre-increment.  */
10866                 writeback = 1;
10867                 break;
10868             default:
10869                 tcg_temp_free_i32(addr);
10870                 goto illegal_op;
10871             }
10872         }
10873
10874         issinfo = writeback ? ISSInvalid : rs;
10875
10876         if (s->v8m_stackcheck && rn == 13 && writeback) {
10877             /*
10878              * Stackcheck. Here we know 'addr' is the current SP;
10879              * if imm is +ve we're moving SP up, else down. It is
10880              * UNKNOWN whether the limit check triggers when SP starts
10881              * below the limit and ends up above it; we chose to do so.
10882              */
10883             if ((int32_t)imm < 0) {
10884                 TCGv_i32 newsp = tcg_temp_new_i32();
10885
10886                 tcg_gen_addi_i32(newsp, addr, imm);
10887                 gen_helper_v8m_stackcheck(cpu_env, newsp);
10888                 tcg_temp_free_i32(newsp);
10889             } else {
10890                 gen_helper_v8m_stackcheck(cpu_env, addr);
10891             }
10892         }
10893
10894         if (writeback && !postinc) {
10895             tcg_gen_addi_i32(addr, addr, imm);
10896         }
10897
10898         if (insn & (1 << 20)) {
10899             /* Load.  */
10900             tmp = tcg_temp_new_i32();
10901             switch (op) {
10902             case 0:
10903                 gen_aa32_ld8u_iss(s, tmp, addr, memidx, issinfo);
10904                 break;
10905             case 4:
10906                 gen_aa32_ld8s_iss(s, tmp, addr, memidx, issinfo);
10907                 break;
10908             case 1:
10909                 gen_aa32_ld16u_iss(s, tmp, addr, memidx, issinfo);
10910                 break;
10911             case 5:
10912                 gen_aa32_ld16s_iss(s, tmp, addr, memidx, issinfo);
10913                 break;
10914             case 2:
10915                 gen_aa32_ld32u_iss(s, tmp, addr, memidx, issinfo);
10916                 break;
10917             default:
10918                 tcg_temp_free_i32(tmp);
10919                 tcg_temp_free_i32(addr);
10920                 goto illegal_op;
10921             }
10922             store_reg_from_load(s, rs, tmp);
10923         } else {
10924             /* Store.  */
10925             tmp = load_reg(s, rs);
10926             switch (op) {
10927             case 0:
10928                 gen_aa32_st8_iss(s, tmp, addr, memidx, issinfo);
10929                 break;
10930             case 1:
10931                 gen_aa32_st16_iss(s, tmp, addr, memidx, issinfo);
10932                 break;
10933             case 2:
10934                 gen_aa32_st32_iss(s, tmp, addr, memidx, issinfo);
10935                 break;
10936             default:
10937                 tcg_temp_free_i32(tmp);
10938                 tcg_temp_free_i32(addr);
10939                 goto illegal_op;
10940             }
10941             tcg_temp_free_i32(tmp);
10942         }
10943         if (postinc)
10944             tcg_gen_addi_i32(addr, addr, imm);
10945         if (writeback) {
10946             store_reg(s, rn, addr);
10947         } else {
10948             tcg_temp_free_i32(addr);
10949         }
10950         }
10951         break;
10952     default:
10953         goto illegal_op;
10954     }
10955     return;
10956 illegal_op:
10957     unallocated_encoding(s);
10958 }
10959
10960 static void disas_thumb_insn(DisasContext *s, uint32_t insn)
10961 {
10962     uint32_t val, op, rm, rn, rd, shift, cond;
10963     int32_t offset;
10964     int i;
10965     TCGv_i32 tmp;
10966     TCGv_i32 tmp2;
10967     TCGv_i32 addr;
10968
10969     switch (insn >> 12) {
10970     case 0: case 1:
10971
10972         rd = insn & 7;
10973         op = (insn >> 11) & 3;
10974         if (op == 3) {
10975             /*
10976              * 0b0001_1xxx_xxxx_xxxx
10977              *  - Add, subtract (three low registers)
10978              *  - Add, subtract (two low registers and immediate)
10979              */
10980             rn = (insn >> 3) & 7;
10981             tmp = load_reg(s, rn);
10982             if (insn & (1 << 10)) {
10983                 /* immediate */
10984                 tmp2 = tcg_temp_new_i32();
10985                 tcg_gen_movi_i32(tmp2, (insn >> 6) & 7);
10986             } else {
10987                 /* reg */
10988                 rm = (insn >> 6) & 7;
10989                 tmp2 = load_reg(s, rm);
10990             }
10991             if (insn & (1 << 9)) {
10992                 if (s->condexec_mask)
10993                     tcg_gen_sub_i32(tmp, tmp, tmp2);
10994                 else
10995                     gen_sub_CC(tmp, tmp, tmp2);
10996             } else {
10997                 if (s->condexec_mask)
10998                     tcg_gen_add_i32(tmp, tmp, tmp2);
10999                 else
11000                     gen_add_CC(tmp, tmp, tmp2);
11001             }
11002             tcg_temp_free_i32(tmp2);
11003             store_reg(s, rd, tmp);
11004         } else {
11005             /* shift immediate */
11006             rm = (insn >> 3) & 7;
11007             shift = (insn >> 6) & 0x1f;
11008             tmp = load_reg(s, rm);
11009             gen_arm_shift_im(tmp, op, shift, s->condexec_mask == 0);
11010             if (!s->condexec_mask)
11011                 gen_logic_CC(tmp);
11012             store_reg(s, rd, tmp);
11013         }
11014         break;
11015     case 2: case 3:
11016         /*
11017          * 0b001x_xxxx_xxxx_xxxx
11018          *  - Add, subtract, compare, move (one low register and immediate)
11019          */
11020         op = (insn >> 11) & 3;
11021         rd = (insn >> 8) & 0x7;
11022         if (op == 0) { /* mov */
11023             tmp = tcg_temp_new_i32();
11024             tcg_gen_movi_i32(tmp, insn & 0xff);
11025             if (!s->condexec_mask)
11026                 gen_logic_CC(tmp);
11027             store_reg(s, rd, tmp);
11028         } else {
11029             tmp = load_reg(s, rd);
11030             tmp2 = tcg_temp_new_i32();
11031             tcg_gen_movi_i32(tmp2, insn & 0xff);
11032             switch (op) {
11033             case 1: /* cmp */
11034                 gen_sub_CC(tmp, tmp, tmp2);
11035                 tcg_temp_free_i32(tmp);
11036                 tcg_temp_free_i32(tmp2);
11037                 break;
11038             case 2: /* add */
11039                 if (s->condexec_mask)
11040                     tcg_gen_add_i32(tmp, tmp, tmp2);
11041                 else
11042                     gen_add_CC(tmp, tmp, tmp2);
11043                 tcg_temp_free_i32(tmp2);
11044                 store_reg(s, rd, tmp);
11045                 break;
11046             case 3: /* sub */
11047                 if (s->condexec_mask)
11048                     tcg_gen_sub_i32(tmp, tmp, tmp2);
11049                 else
11050                     gen_sub_CC(tmp, tmp, tmp2);
11051                 tcg_temp_free_i32(tmp2);
11052                 store_reg(s, rd, tmp);
11053                 break;
11054             }
11055         }
11056         break;
11057     case 4:
11058         if (insn & (1 << 11)) {
11059             rd = (insn >> 8) & 7;
11060             /* load pc-relative.  Bit 1 of PC is ignored.  */
11061             addr = add_reg_for_lit(s, 15, (insn & 0xff) * 4);
11062             tmp = tcg_temp_new_i32();
11063             gen_aa32_ld32u_iss(s, tmp, addr, get_mem_index(s),
11064                                rd | ISSIs16Bit);
11065             tcg_temp_free_i32(addr);
11066             store_reg(s, rd, tmp);
11067             break;
11068         }
11069         if (insn & (1 << 10)) {
11070             /* 0b0100_01xx_xxxx_xxxx
11071              * - data processing extended, branch and exchange
11072              */
11073             rd = (insn & 7) | ((insn >> 4) & 8);
11074             rm = (insn >> 3) & 0xf;
11075             op = (insn >> 8) & 3;
11076             switch (op) {
11077             case 0: /* add */
11078                 tmp = load_reg(s, rd);
11079                 tmp2 = load_reg(s, rm);
11080                 tcg_gen_add_i32(tmp, tmp, tmp2);
11081                 tcg_temp_free_i32(tmp2);
11082                 if (rd == 13) {
11083                     /* ADD SP, SP, reg */
11084                     store_sp_checked(s, tmp);
11085                 } else {
11086                     store_reg(s, rd, tmp);
11087                 }
11088                 break;
11089             case 1: /* cmp */
11090                 tmp = load_reg(s, rd);
11091                 tmp2 = load_reg(s, rm);
11092                 gen_sub_CC(tmp, tmp, tmp2);
11093                 tcg_temp_free_i32(tmp2);
11094                 tcg_temp_free_i32(tmp);
11095                 break;
11096             case 2: /* mov/cpy */
11097                 tmp = load_reg(s, rm);
11098                 if (rd == 13) {
11099                     /* MOV SP, reg */
11100                     store_sp_checked(s, tmp);
11101                 } else {
11102                     store_reg(s, rd, tmp);
11103                 }
11104                 break;
11105             case 3:
11106             {
11107                 /* 0b0100_0111_xxxx_xxxx
11108                  * - branch [and link] exchange thumb register
11109                  */
11110                 bool link = insn & (1 << 7);
11111
11112                 if (insn & 3) {
11113                     goto undef;
11114                 }
11115                 if (link) {
11116                     ARCH(5);
11117                 }
11118                 if ((insn & 4)) {
11119                     /* BXNS/BLXNS: only exists for v8M with the
11120                      * security extensions, and always UNDEF if NonSecure.
11121                      * We don't implement these in the user-only mode
11122                      * either (in theory you can use them from Secure User
11123                      * mode but they are too tied in to system emulation.)
11124                      */
11125                     if (!s->v8m_secure || IS_USER_ONLY) {
11126                         goto undef;
11127                     }
11128                     if (link) {
11129                         gen_blxns(s, rm);
11130                     } else {
11131                         gen_bxns(s, rm);
11132                     }
11133                     break;
11134                 }
11135                 /* BLX/BX */
11136                 tmp = load_reg(s, rm);
11137                 if (link) {
11138                     val = (uint32_t)s->base.pc_next | 1;
11139                     tmp2 = tcg_temp_new_i32();
11140                     tcg_gen_movi_i32(tmp2, val);
11141                     store_reg(s, 14, tmp2);
11142                     gen_bx(s, tmp);
11143                 } else {
11144                     /* Only BX works as exception-return, not BLX */
11145                     gen_bx_excret(s, tmp);
11146                 }
11147                 break;
11148             }
11149             }
11150             break;
11151         }
11152
11153         /*
11154          * 0b0100_00xx_xxxx_xxxx
11155          *  - Data-processing (two low registers)
11156          */
11157         rd = insn & 7;
11158         rm = (insn >> 3) & 7;
11159         op = (insn >> 6) & 0xf;
11160         if (op == 2 || op == 3 || op == 4 || op == 7) {
11161             /* the shift/rotate ops want the operands backwards */
11162             val = rm;
11163             rm = rd;
11164             rd = val;
11165             val = 1;
11166         } else {
11167             val = 0;
11168         }
11169
11170         if (op == 9) { /* neg */
11171             tmp = tcg_temp_new_i32();
11172             tcg_gen_movi_i32(tmp, 0);
11173         } else if (op != 0xf) { /* mvn doesn't read its first operand */
11174             tmp = load_reg(s, rd);
11175         } else {
11176             tmp = NULL;
11177         }
11178
11179         tmp2 = load_reg(s, rm);
11180         switch (op) {
11181         case 0x0: /* and */
11182             tcg_gen_and_i32(tmp, tmp, tmp2);
11183             if (!s->condexec_mask)
11184                 gen_logic_CC(tmp);
11185             break;
11186         case 0x1: /* eor */
11187             tcg_gen_xor_i32(tmp, tmp, tmp2);
11188             if (!s->condexec_mask)
11189                 gen_logic_CC(tmp);
11190             break;
11191         case 0x2: /* lsl */
11192             if (s->condexec_mask) {
11193                 gen_shl(tmp2, tmp2, tmp);
11194             } else {
11195                 gen_helper_shl_cc(tmp2, cpu_env, tmp2, tmp);
11196                 gen_logic_CC(tmp2);
11197             }
11198             break;
11199         case 0x3: /* lsr */
11200             if (s->condexec_mask) {
11201                 gen_shr(tmp2, tmp2, tmp);
11202             } else {
11203                 gen_helper_shr_cc(tmp2, cpu_env, tmp2, tmp);
11204                 gen_logic_CC(tmp2);
11205             }
11206             break;
11207         case 0x4: /* asr */
11208             if (s->condexec_mask) {
11209                 gen_sar(tmp2, tmp2, tmp);
11210             } else {
11211                 gen_helper_sar_cc(tmp2, cpu_env, tmp2, tmp);
11212                 gen_logic_CC(tmp2);
11213             }
11214             break;
11215         case 0x5: /* adc */
11216             if (s->condexec_mask) {
11217                 gen_adc(tmp, tmp2);
11218             } else {
11219                 gen_adc_CC(tmp, tmp, tmp2);
11220             }
11221             break;
11222         case 0x6: /* sbc */
11223             if (s->condexec_mask) {
11224                 gen_sub_carry(tmp, tmp, tmp2);
11225             } else {
11226                 gen_sbc_CC(tmp, tmp, tmp2);
11227             }
11228             break;
11229         case 0x7: /* ror */
11230             if (s->condexec_mask) {
11231                 tcg_gen_andi_i32(tmp, tmp, 0x1f);
11232                 tcg_gen_rotr_i32(tmp2, tmp2, tmp);
11233             } else {
11234                 gen_helper_ror_cc(tmp2, cpu_env, tmp2, tmp);
11235                 gen_logic_CC(tmp2);
11236             }
11237             break;
11238         case 0x8: /* tst */
11239             tcg_gen_and_i32(tmp, tmp, tmp2);
11240             gen_logic_CC(tmp);
11241             rd = 16;
11242             break;
11243         case 0x9: /* neg */
11244             if (s->condexec_mask)
11245                 tcg_gen_neg_i32(tmp, tmp2);
11246             else
11247                 gen_sub_CC(tmp, tmp, tmp2);
11248             break;
11249         case 0xa: /* cmp */
11250             gen_sub_CC(tmp, tmp, tmp2);
11251             rd = 16;
11252             break;
11253         case 0xb: /* cmn */
11254             gen_add_CC(tmp, tmp, tmp2);
11255             rd = 16;
11256             break;
11257         case 0xc: /* orr */
11258             tcg_gen_or_i32(tmp, tmp, tmp2);
11259             if (!s->condexec_mask)
11260                 gen_logic_CC(tmp);
11261             break;
11262         case 0xd: /* mul */
11263             tcg_gen_mul_i32(tmp, tmp, tmp2);
11264             if (!s->condexec_mask)
11265                 gen_logic_CC(tmp);
11266             break;
11267         case 0xe: /* bic */
11268             tcg_gen_andc_i32(tmp, tmp, tmp2);
11269             if (!s->condexec_mask)
11270                 gen_logic_CC(tmp);
11271             break;
11272         case 0xf: /* mvn */
11273             tcg_gen_not_i32(tmp2, tmp2);
11274             if (!s->condexec_mask)
11275                 gen_logic_CC(tmp2);
11276             val = 1;
11277             rm = rd;
11278             break;
11279         }
11280         if (rd != 16) {
11281             if (val) {
11282                 store_reg(s, rm, tmp2);
11283                 if (op != 0xf)
11284                     tcg_temp_free_i32(tmp);
11285             } else {
11286                 store_reg(s, rd, tmp);
11287                 tcg_temp_free_i32(tmp2);
11288             }
11289         } else {
11290             tcg_temp_free_i32(tmp);
11291             tcg_temp_free_i32(tmp2);
11292         }
11293         break;
11294
11295     case 5:
11296         /* load/store register offset.  */
11297         rd = insn & 7;
11298         rn = (insn >> 3) & 7;
11299         rm = (insn >> 6) & 7;
11300         op = (insn >> 9) & 7;
11301         addr = load_reg(s, rn);
11302         tmp = load_reg(s, rm);
11303         tcg_gen_add_i32(addr, addr, tmp);
11304         tcg_temp_free_i32(tmp);
11305
11306         if (op < 3) { /* store */
11307             tmp = load_reg(s, rd);
11308         } else {
11309             tmp = tcg_temp_new_i32();
11310         }
11311
11312         switch (op) {
11313         case 0: /* str */
11314             gen_aa32_st32_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
11315             break;
11316         case 1: /* strh */
11317             gen_aa32_st16_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
11318             break;
11319         case 2: /* strb */
11320             gen_aa32_st8_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
11321             break;
11322         case 3: /* ldrsb */
11323             gen_aa32_ld8s_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
11324             break;
11325         case 4: /* ldr */
11326             gen_aa32_ld32u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
11327             break;
11328         case 5: /* ldrh */
11329             gen_aa32_ld16u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
11330             break;
11331         case 6: /* ldrb */
11332             gen_aa32_ld8u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
11333             break;
11334         case 7: /* ldrsh */
11335             gen_aa32_ld16s_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
11336             break;
11337         }
11338         if (op >= 3) { /* load */
11339             store_reg(s, rd, tmp);
11340         } else {
11341             tcg_temp_free_i32(tmp);
11342         }
11343         tcg_temp_free_i32(addr);
11344         break;
11345
11346     case 6:
11347         /* load/store word immediate offset */
11348         rd = insn & 7;
11349         rn = (insn >> 3) & 7;
11350         addr = load_reg(s, rn);
11351         val = (insn >> 4) & 0x7c;
11352         tcg_gen_addi_i32(addr, addr, val);
11353
11354         if (insn & (1 << 11)) {
11355             /* load */
11356             tmp = tcg_temp_new_i32();
11357             gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
11358             store_reg(s, rd, tmp);
11359         } else {
11360             /* store */
11361             tmp = load_reg(s, rd);
11362             gen_aa32_st32(s, tmp, addr, get_mem_index(s));
11363             tcg_temp_free_i32(tmp);
11364         }
11365         tcg_temp_free_i32(addr);
11366         break;
11367
11368     case 7:
11369         /* load/store byte immediate offset */
11370         rd = insn & 7;
11371         rn = (insn >> 3) & 7;
11372         addr = load_reg(s, rn);
11373         val = (insn >> 6) & 0x1f;
11374         tcg_gen_addi_i32(addr, addr, val);
11375
11376         if (insn & (1 << 11)) {
11377             /* load */
11378             tmp = tcg_temp_new_i32();
11379             gen_aa32_ld8u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
11380             store_reg(s, rd, tmp);
11381         } else {
11382             /* store */
11383             tmp = load_reg(s, rd);
11384             gen_aa32_st8_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
11385             tcg_temp_free_i32(tmp);
11386         }
11387         tcg_temp_free_i32(addr);
11388         break;
11389
11390     case 8:
11391         /* load/store halfword immediate offset */
11392         rd = insn & 7;
11393         rn = (insn >> 3) & 7;
11394         addr = load_reg(s, rn);
11395         val = (insn >> 5) & 0x3e;
11396         tcg_gen_addi_i32(addr, addr, val);
11397
11398         if (insn & (1 << 11)) {
11399             /* load */
11400             tmp = tcg_temp_new_i32();
11401             gen_aa32_ld16u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
11402             store_reg(s, rd, tmp);
11403         } else {
11404             /* store */
11405             tmp = load_reg(s, rd);
11406             gen_aa32_st16_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
11407             tcg_temp_free_i32(tmp);
11408         }
11409         tcg_temp_free_i32(addr);
11410         break;
11411
11412     case 9:
11413         /* load/store from stack */
11414         rd = (insn >> 8) & 7;
11415         addr = load_reg(s, 13);
11416         val = (insn & 0xff) * 4;
11417         tcg_gen_addi_i32(addr, addr, val);
11418
11419         if (insn & (1 << 11)) {
11420             /* load */
11421             tmp = tcg_temp_new_i32();
11422             gen_aa32_ld32u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
11423             store_reg(s, rd, tmp);
11424         } else {
11425             /* store */
11426             tmp = load_reg(s, rd);
11427             gen_aa32_st32_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
11428             tcg_temp_free_i32(tmp);
11429         }
11430         tcg_temp_free_i32(addr);
11431         break;
11432
11433     case 10:
11434         /*
11435          * 0b1010_xxxx_xxxx_xxxx
11436          *  - Add PC/SP (immediate)
11437          */
11438         rd = (insn >> 8) & 7;
11439         val = (insn & 0xff) * 4;
11440         tmp = add_reg_for_lit(s, insn & (1 << 11) ? 13 : 15, val);
11441         store_reg(s, rd, tmp);
11442         break;
11443
11444     case 11:
11445         /* misc */
11446         op = (insn >> 8) & 0xf;
11447         switch (op) {
11448         case 0:
11449             /*
11450              * 0b1011_0000_xxxx_xxxx
11451              *  - ADD (SP plus immediate)
11452              *  - SUB (SP minus immediate)
11453              */
11454             tmp = load_reg(s, 13);
11455             val = (insn & 0x7f) * 4;
11456             if (insn & (1 << 7))
11457                 val = -(int32_t)val;
11458             tcg_gen_addi_i32(tmp, tmp, val);
11459             store_sp_checked(s, tmp);
11460             break;
11461
11462         case 2: /* sign/zero extend.  */
11463             ARCH(6);
11464             rd = insn & 7;
11465             rm = (insn >> 3) & 7;
11466             tmp = load_reg(s, rm);
11467             switch ((insn >> 6) & 3) {
11468             case 0: gen_sxth(tmp); break;
11469             case 1: gen_sxtb(tmp); break;
11470             case 2: gen_uxth(tmp); break;
11471             case 3: gen_uxtb(tmp); break;
11472             }
11473             store_reg(s, rd, tmp);
11474             break;
11475         case 4: case 5: case 0xc: case 0xd:
11476             /*
11477              * 0b1011_x10x_xxxx_xxxx
11478              *  - push/pop
11479              */
11480             addr = load_reg(s, 13);
11481             if (insn & (1 << 8))
11482                 offset = 4;
11483             else
11484                 offset = 0;
11485             for (i = 0; i < 8; i++) {
11486                 if (insn & (1 << i))
11487                     offset += 4;
11488             }
11489             if ((insn & (1 << 11)) == 0) {
11490                 tcg_gen_addi_i32(addr, addr, -offset);
11491             }
11492
11493             if (s->v8m_stackcheck) {
11494                 /*
11495                  * Here 'addr' is the lower of "old SP" and "new SP";
11496                  * if this is a pop that starts below the limit and ends
11497                  * above it, it is UNKNOWN whether the limit check triggers;
11498                  * we choose to trigger.
11499                  */
11500                 gen_helper_v8m_stackcheck(cpu_env, addr);
11501             }
11502
11503             for (i = 0; i < 8; i++) {
11504                 if (insn & (1 << i)) {
11505                     if (insn & (1 << 11)) {
11506                         /* pop */
11507                         tmp = tcg_temp_new_i32();
11508                         gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
11509                         store_reg(s, i, tmp);
11510                     } else {
11511                         /* push */
11512                         tmp = load_reg(s, i);
11513                         gen_aa32_st32(s, tmp, addr, get_mem_index(s));
11514                         tcg_temp_free_i32(tmp);
11515                     }
11516                     /* advance to the next address.  */
11517                     tcg_gen_addi_i32(addr, addr, 4);
11518                 }
11519             }
11520             tmp = NULL;
11521             if (insn & (1 << 8)) {
11522                 if (insn & (1 << 11)) {
11523                     /* pop pc */
11524                     tmp = tcg_temp_new_i32();
11525                     gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
11526                     /* don't set the pc until the rest of the instruction
11527                        has completed */
11528                 } else {
11529                     /* push lr */
11530                     tmp = load_reg(s, 14);
11531                     gen_aa32_st32(s, tmp, addr, get_mem_index(s));
11532                     tcg_temp_free_i32(tmp);
11533                 }
11534                 tcg_gen_addi_i32(addr, addr, 4);
11535             }
11536             if ((insn & (1 << 11)) == 0) {
11537                 tcg_gen_addi_i32(addr, addr, -offset);
11538             }
11539             /* write back the new stack pointer */
11540             store_reg(s, 13, addr);
11541             /* set the new PC value */
11542             if ((insn & 0x0900) == 0x0900) {
11543                 store_reg_from_load(s, 15, tmp);
11544             }
11545             break;
11546
11547         case 1: case 3: case 9: case 11: /* czb */
11548             rm = insn & 7;
11549             tmp = load_reg(s, rm);
11550             arm_gen_condlabel(s);
11551             if (insn & (1 << 11))
11552                 tcg_gen_brcondi_i32(TCG_COND_EQ, tmp, 0, s->condlabel);
11553             else
11554                 tcg_gen_brcondi_i32(TCG_COND_NE, tmp, 0, s->condlabel);
11555             tcg_temp_free_i32(tmp);
11556             offset = ((insn & 0xf8) >> 2) | (insn & 0x200) >> 3;
11557             gen_jmp(s, read_pc(s) + offset);
11558             break;
11559
11560         case 15: /* IT, nop-hint.  */
11561             if ((insn & 0xf) == 0) {
11562                 gen_nop_hint(s, (insn >> 4) & 0xf);
11563                 break;
11564             }
11565             /*
11566              * IT (If-Then)
11567              *
11568              * Combinations of firstcond and mask which set up an 0b1111
11569              * condition are UNPREDICTABLE; we take the CONSTRAINED
11570              * UNPREDICTABLE choice to treat 0b1111 the same as 0b1110,
11571              * i.e. both meaning "execute always".
11572              */
11573             s->condexec_cond = (insn >> 4) & 0xe;
11574             s->condexec_mask = insn & 0x1f;
11575             /* No actual code generated for this insn, just setup state.  */
11576             break;
11577
11578         case 0xe: /* bkpt */
11579         {
11580             int imm8 = extract32(insn, 0, 8);
11581             ARCH(5);
11582             gen_exception_bkpt_insn(s, syn_aa32_bkpt(imm8, true));
11583             break;
11584         }
11585
11586         case 0xa: /* rev, and hlt */
11587         {
11588             int op1 = extract32(insn, 6, 2);
11589
11590             if (op1 == 2) {
11591                 /* HLT */
11592                 int imm6 = extract32(insn, 0, 6);
11593
11594                 gen_hlt(s, imm6);
11595                 break;
11596             }
11597
11598             /* Otherwise this is rev */
11599             ARCH(6);
11600             rn = (insn >> 3) & 0x7;
11601             rd = insn & 0x7;
11602             tmp = load_reg(s, rn);
11603             switch (op1) {
11604             case 0: tcg_gen_bswap32_i32(tmp, tmp); break;
11605             case 1: gen_rev16(tmp); break;
11606             case 3: gen_revsh(tmp); break;
11607             default:
11608                 g_assert_not_reached();
11609             }
11610             store_reg(s, rd, tmp);
11611             break;
11612         }
11613
11614         case 6:
11615             switch ((insn >> 5) & 7) {
11616             case 2:
11617                 /* setend */
11618                 ARCH(6);
11619                 if (((insn >> 3) & 1) != !!(s->be_data == MO_BE)) {
11620                     gen_helper_setend(cpu_env);
11621                     s->base.is_jmp = DISAS_UPDATE;
11622                 }
11623                 break;
11624             case 3:
11625                 /* cps */
11626                 ARCH(6);
11627                 if (IS_USER(s)) {
11628                     break;
11629                 }
11630                 if (arm_dc_feature(s, ARM_FEATURE_M)) {
11631                     tmp = tcg_const_i32((insn & (1 << 4)) != 0);
11632                     /* FAULTMASK */
11633                     if (insn & 1) {
11634                         addr = tcg_const_i32(19);
11635                         gen_helper_v7m_msr(cpu_env, addr, tmp);
11636                         tcg_temp_free_i32(addr);
11637                     }
11638                     /* PRIMASK */
11639                     if (insn & 2) {
11640                         addr = tcg_const_i32(16);
11641                         gen_helper_v7m_msr(cpu_env, addr, tmp);
11642                         tcg_temp_free_i32(addr);
11643                     }
11644                     tcg_temp_free_i32(tmp);
11645                     gen_lookup_tb(s);
11646                 } else {
11647                     if (insn & (1 << 4)) {
11648                         shift = CPSR_A | CPSR_I | CPSR_F;
11649                     } else {
11650                         shift = 0;
11651                     }
11652                     gen_set_psr_im(s, ((insn & 7) << 6), 0, shift);
11653                 }
11654                 break;
11655             default:
11656                 goto undef;
11657             }
11658             break;
11659
11660         default:
11661             goto undef;
11662         }
11663         break;
11664
11665     case 12:
11666     {
11667         /* load/store multiple */
11668         TCGv_i32 loaded_var = NULL;
11669         rn = (insn >> 8) & 0x7;
11670         addr = load_reg(s, rn);
11671         for (i = 0; i < 8; i++) {
11672             if (insn & (1 << i)) {
11673                 if (insn & (1 << 11)) {
11674                     /* load */
11675                     tmp = tcg_temp_new_i32();
11676                     gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
11677                     if (i == rn) {
11678                         loaded_var = tmp;
11679                     } else {
11680                         store_reg(s, i, tmp);
11681                     }
11682                 } else {
11683                     /* store */
11684                     tmp = load_reg(s, i);
11685                     gen_aa32_st32(s, tmp, addr, get_mem_index(s));
11686                     tcg_temp_free_i32(tmp);
11687                 }
11688                 /* advance to the next address */
11689                 tcg_gen_addi_i32(addr, addr, 4);
11690             }
11691         }
11692         if ((insn & (1 << rn)) == 0) {
11693             /* base reg not in list: base register writeback */
11694             store_reg(s, rn, addr);
11695         } else {
11696             /* base reg in list: if load, complete it now */
11697             if (insn & (1 << 11)) {
11698                 store_reg(s, rn, loaded_var);
11699             }
11700             tcg_temp_free_i32(addr);
11701         }
11702         break;
11703     }
11704     case 13:
11705         /* conditional branch or swi */
11706         cond = (insn >> 8) & 0xf;
11707         if (cond == 0xe)
11708             goto undef;
11709
11710         if (cond == 0xf) {
11711             /* swi */
11712             gen_set_pc_im(s, s->base.pc_next);
11713             s->svc_imm = extract32(insn, 0, 8);
11714             s->base.is_jmp = DISAS_SWI;
11715             break;
11716         }
11717         /* generate a conditional jump to next instruction */
11718         arm_skip_unless(s, cond);
11719
11720         /* jump to the offset */
11721         val = read_pc(s);
11722         offset = ((int32_t)insn << 24) >> 24;
11723         val += offset << 1;
11724         gen_jmp(s, val);
11725         break;
11726
11727     case 14:
11728         if (insn & (1 << 11)) {
11729             /* thumb_insn_is_16bit() ensures we can't get here for
11730              * a Thumb2 CPU, so this must be a thumb1 split BL/BLX:
11731              * 0b1110_1xxx_xxxx_xxxx : BLX suffix (or UNDEF)
11732              */
11733             assert(!arm_dc_feature(s, ARM_FEATURE_THUMB2));
11734             ARCH(5);
11735             offset = ((insn & 0x7ff) << 1);
11736             tmp = load_reg(s, 14);
11737             tcg_gen_addi_i32(tmp, tmp, offset);
11738             tcg_gen_andi_i32(tmp, tmp, 0xfffffffc);
11739
11740             tmp2 = tcg_temp_new_i32();
11741             tcg_gen_movi_i32(tmp2, s->base.pc_next | 1);
11742             store_reg(s, 14, tmp2);
11743             gen_bx(s, tmp);
11744             break;
11745         }
11746         /* unconditional branch */
11747         val = read_pc(s);
11748         offset = ((int32_t)insn << 21) >> 21;
11749         val += offset << 1;
11750         gen_jmp(s, val);
11751         break;
11752
11753     case 15:
11754         /* thumb_insn_is_16bit() ensures we can't get here for
11755          * a Thumb2 CPU, so this must be a thumb1 split BL/BLX.
11756          */
11757         assert(!arm_dc_feature(s, ARM_FEATURE_THUMB2));
11758
11759         if (insn & (1 << 11)) {
11760             /* 0b1111_1xxx_xxxx_xxxx : BL suffix */
11761             offset = ((insn & 0x7ff) << 1) | 1;
11762             tmp = load_reg(s, 14);
11763             tcg_gen_addi_i32(tmp, tmp, offset);
11764
11765             tmp2 = tcg_temp_new_i32();
11766             tcg_gen_movi_i32(tmp2, s->base.pc_next | 1);
11767             store_reg(s, 14, tmp2);
11768             gen_bx(s, tmp);
11769         } else {
11770             /* 0b1111_0xxx_xxxx_xxxx : BL/BLX prefix */
11771             uint32_t uoffset = ((int32_t)insn << 21) >> 9;
11772
11773             tcg_gen_movi_i32(cpu_R[14], read_pc(s) + uoffset);
11774         }
11775         break;
11776     }
11777     return;
11778 illegal_op:
11779 undef:
11780     unallocated_encoding(s);
11781 }
11782
11783 static bool insn_crosses_page(CPUARMState *env, DisasContext *s)
11784 {
11785     /* Return true if the insn at dc->base.pc_next might cross a page boundary.
11786      * (False positives are OK, false negatives are not.)
11787      * We know this is a Thumb insn, and our caller ensures we are
11788      * only called if dc->base.pc_next is less than 4 bytes from the page
11789      * boundary, so we cross the page if the first 16 bits indicate
11790      * that this is a 32 bit insn.
11791      */
11792     uint16_t insn = arm_lduw_code(env, s->base.pc_next, s->sctlr_b);
11793
11794     return !thumb_insn_is_16bit(s, s->base.pc_next, insn);
11795 }
11796
11797 static void arm_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
11798 {
11799     DisasContext *dc = container_of(dcbase, DisasContext, base);
11800     CPUARMState *env = cs->env_ptr;
11801     ARMCPU *cpu = env_archcpu(env);
11802     uint32_t tb_flags = dc->base.tb->flags;
11803     uint32_t condexec, core_mmu_idx;
11804
11805     dc->isar = &cpu->isar;
11806     dc->condjmp = 0;
11807
11808     dc->aarch64 = 0;
11809     /* If we are coming from secure EL0 in a system with a 32-bit EL3, then
11810      * there is no secure EL1, so we route exceptions to EL3.
11811      */
11812     dc->secure_routed_to_el3 = arm_feature(env, ARM_FEATURE_EL3) &&
11813                                !arm_el_is_aa64(env, 3);
11814     dc->thumb = FIELD_EX32(tb_flags, TBFLAG_A32, THUMB);
11815     dc->sctlr_b = FIELD_EX32(tb_flags, TBFLAG_A32, SCTLR_B);
11816     dc->be_data = FIELD_EX32(tb_flags, TBFLAG_ANY, BE_DATA) ? MO_BE : MO_LE;
11817     condexec = FIELD_EX32(tb_flags, TBFLAG_A32, CONDEXEC);
11818     dc->condexec_mask = (condexec & 0xf) << 1;
11819     dc->condexec_cond = condexec >> 4;
11820     core_mmu_idx = FIELD_EX32(tb_flags, TBFLAG_ANY, MMUIDX);
11821     dc->mmu_idx = core_to_arm_mmu_idx(env, core_mmu_idx);
11822     dc->current_el = arm_mmu_idx_to_el(dc->mmu_idx);
11823 #if !defined(CONFIG_USER_ONLY)
11824     dc->user = (dc->current_el == 0);
11825 #endif
11826     dc->ns = FIELD_EX32(tb_flags, TBFLAG_A32, NS);
11827     dc->fp_excp_el = FIELD_EX32(tb_flags, TBFLAG_ANY, FPEXC_EL);
11828     dc->vfp_enabled = FIELD_EX32(tb_flags, TBFLAG_A32, VFPEN);
11829     dc->vec_len = FIELD_EX32(tb_flags, TBFLAG_A32, VECLEN);
11830     if (arm_feature(env, ARM_FEATURE_XSCALE)) {
11831         dc->c15_cpar = FIELD_EX32(tb_flags, TBFLAG_A32, XSCALE_CPAR);
11832         dc->vec_stride = 0;
11833     } else {
11834         dc->vec_stride = FIELD_EX32(tb_flags, TBFLAG_A32, VECSTRIDE);
11835         dc->c15_cpar = 0;
11836     }
11837     dc->v7m_handler_mode = FIELD_EX32(tb_flags, TBFLAG_A32, HANDLER);
11838     dc->v8m_secure = arm_feature(env, ARM_FEATURE_M_SECURITY) &&
11839         regime_is_secure(env, dc->mmu_idx);
11840     dc->v8m_stackcheck = FIELD_EX32(tb_flags, TBFLAG_A32, STACKCHECK);
11841     dc->v8m_fpccr_s_wrong = FIELD_EX32(tb_flags, TBFLAG_A32, FPCCR_S_WRONG);
11842     dc->v7m_new_fp_ctxt_needed =
11843         FIELD_EX32(tb_flags, TBFLAG_A32, NEW_FP_CTXT_NEEDED);
11844     dc->v7m_lspact = FIELD_EX32(tb_flags, TBFLAG_A32, LSPACT);
11845     dc->cp_regs = cpu->cp_regs;
11846     dc->features = env->features;
11847
11848     /* Single step state. The code-generation logic here is:
11849      *  SS_ACTIVE == 0:
11850      *   generate code with no special handling for single-stepping (except
11851      *   that anything that can make us go to SS_ACTIVE == 1 must end the TB;
11852      *   this happens anyway because those changes are all system register or
11853      *   PSTATE writes).
11854      *  SS_ACTIVE == 1, PSTATE.SS == 1: (active-not-pending)
11855      *   emit code for one insn
11856      *   emit code to clear PSTATE.SS
11857      *   emit code to generate software step exception for completed step
11858      *   end TB (as usual for having generated an exception)
11859      *  SS_ACTIVE == 1, PSTATE.SS == 0: (active-pending)
11860      *   emit code to generate a software step exception
11861      *   end the TB
11862      */
11863     dc->ss_active = FIELD_EX32(tb_flags, TBFLAG_ANY, SS_ACTIVE);
11864     dc->pstate_ss = FIELD_EX32(tb_flags, TBFLAG_ANY, PSTATE_SS);
11865     dc->is_ldex = false;
11866     if (!arm_feature(env, ARM_FEATURE_M)) {
11867         dc->debug_target_el = FIELD_EX32(tb_flags, TBFLAG_ANY, DEBUG_TARGET_EL);
11868     }
11869
11870     dc->page_start = dc->base.pc_first & TARGET_PAGE_MASK;
11871
11872     /* If architectural single step active, limit to 1.  */
11873     if (is_singlestepping(dc)) {
11874         dc->base.max_insns = 1;
11875     }
11876
11877     /* ARM is a fixed-length ISA.  Bound the number of insns to execute
11878        to those left on the page.  */
11879     if (!dc->thumb) {
11880         int bound = -(dc->base.pc_first | TARGET_PAGE_MASK) / 4;
11881         dc->base.max_insns = MIN(dc->base.max_insns, bound);
11882     }
11883
11884     cpu_V0 = tcg_temp_new_i64();
11885     cpu_V1 = tcg_temp_new_i64();
11886     /* FIXME: cpu_M0 can probably be the same as cpu_V0.  */
11887     cpu_M0 = tcg_temp_new_i64();
11888 }
11889
11890 static void arm_tr_tb_start(DisasContextBase *dcbase, CPUState *cpu)
11891 {
11892     DisasContext *dc = container_of(dcbase, DisasContext, base);
11893
11894     /* A note on handling of the condexec (IT) bits:
11895      *
11896      * We want to avoid the overhead of having to write the updated condexec
11897      * bits back to the CPUARMState for every instruction in an IT block. So:
11898      * (1) if the condexec bits are not already zero then we write
11899      * zero back into the CPUARMState now. This avoids complications trying
11900      * to do it at the end of the block. (For example if we don't do this
11901      * it's hard to identify whether we can safely skip writing condexec
11902      * at the end of the TB, which we definitely want to do for the case
11903      * where a TB doesn't do anything with the IT state at all.)
11904      * (2) if we are going to leave the TB then we call gen_set_condexec()
11905      * which will write the correct value into CPUARMState if zero is wrong.
11906      * This is done both for leaving the TB at the end, and for leaving
11907      * it because of an exception we know will happen, which is done in
11908      * gen_exception_insn(). The latter is necessary because we need to
11909      * leave the TB with the PC/IT state just prior to execution of the
11910      * instruction which caused the exception.
11911      * (3) if we leave the TB unexpectedly (eg a data abort on a load)
11912      * then the CPUARMState will be wrong and we need to reset it.
11913      * This is handled in the same way as restoration of the
11914      * PC in these situations; we save the value of the condexec bits
11915      * for each PC via tcg_gen_insn_start(), and restore_state_to_opc()
11916      * then uses this to restore them after an exception.
11917      *
11918      * Note that there are no instructions which can read the condexec
11919      * bits, and none which can write non-static values to them, so
11920      * we don't need to care about whether CPUARMState is correct in the
11921      * middle of a TB.
11922      */
11923
11924     /* Reset the conditional execution bits immediately. This avoids
11925        complications trying to do it at the end of the block.  */
11926     if (dc->condexec_mask || dc->condexec_cond) {
11927         TCGv_i32 tmp = tcg_temp_new_i32();
11928         tcg_gen_movi_i32(tmp, 0);
11929         store_cpu_field(tmp, condexec_bits);
11930     }
11931 }
11932
11933 static void arm_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu)
11934 {
11935     DisasContext *dc = container_of(dcbase, DisasContext, base);
11936
11937     tcg_gen_insn_start(dc->base.pc_next,
11938                        (dc->condexec_cond << 4) | (dc->condexec_mask >> 1),
11939                        0);
11940     dc->insn_start = tcg_last_op();
11941 }
11942
11943 static bool arm_tr_breakpoint_check(DisasContextBase *dcbase, CPUState *cpu,
11944                                     const CPUBreakpoint *bp)
11945 {
11946     DisasContext *dc = container_of(dcbase, DisasContext, base);
11947
11948     if (bp->flags & BP_CPU) {
11949         gen_set_condexec(dc);
11950         gen_set_pc_im(dc, dc->base.pc_next);
11951         gen_helper_check_breakpoints(cpu_env);
11952         /* End the TB early; it's likely not going to be executed */
11953         dc->base.is_jmp = DISAS_TOO_MANY;
11954     } else {
11955         gen_exception_internal_insn(dc, dc->base.pc_next, EXCP_DEBUG);
11956         /* The address covered by the breakpoint must be
11957            included in [tb->pc, tb->pc + tb->size) in order
11958            to for it to be properly cleared -- thus we
11959            increment the PC here so that the logic setting
11960            tb->size below does the right thing.  */
11961         /* TODO: Advance PC by correct instruction length to
11962          * avoid disassembler error messages */
11963         dc->base.pc_next += 2;
11964         dc->base.is_jmp = DISAS_NORETURN;
11965     }
11966
11967     return true;
11968 }
11969
11970 static bool arm_pre_translate_insn(DisasContext *dc)
11971 {
11972 #ifdef CONFIG_USER_ONLY
11973     /* Intercept jump to the magic kernel page.  */
11974     if (dc->base.pc_next >= 0xffff0000) {
11975         /* We always get here via a jump, so know we are not in a
11976            conditional execution block.  */
11977         gen_exception_internal(EXCP_KERNEL_TRAP);
11978         dc->base.is_jmp = DISAS_NORETURN;
11979         return true;
11980     }
11981 #endif
11982
11983     if (dc->ss_active && !dc->pstate_ss) {
11984         /* Singlestep state is Active-pending.
11985          * If we're in this state at the start of a TB then either
11986          *  a) we just took an exception to an EL which is being debugged
11987          *     and this is the first insn in the exception handler
11988          *  b) debug exceptions were masked and we just unmasked them
11989          *     without changing EL (eg by clearing PSTATE.D)
11990          * In either case we're going to take a swstep exception in the
11991          * "did not step an insn" case, and so the syndrome ISV and EX
11992          * bits should be zero.
11993          */
11994         assert(dc->base.num_insns == 1);
11995         gen_swstep_exception(dc, 0, 0);
11996         dc->base.is_jmp = DISAS_NORETURN;
11997         return true;
11998     }
11999
12000     return false;
12001 }
12002
12003 static void arm_post_translate_insn(DisasContext *dc)
12004 {
12005     if (dc->condjmp && !dc->base.is_jmp) {
12006         gen_set_label(dc->condlabel);
12007         dc->condjmp = 0;
12008     }
12009     translator_loop_temp_check(&dc->base);
12010 }
12011
12012 static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
12013 {
12014     DisasContext *dc = container_of(dcbase, DisasContext, base);
12015     CPUARMState *env = cpu->env_ptr;
12016     unsigned int insn;
12017
12018     if (arm_pre_translate_insn(dc)) {
12019         return;
12020     }
12021
12022     dc->pc_curr = dc->base.pc_next;
12023     insn = arm_ldl_code(env, dc->base.pc_next, dc->sctlr_b);
12024     dc->insn = insn;
12025     dc->base.pc_next += 4;
12026     disas_arm_insn(dc, insn);
12027
12028     arm_post_translate_insn(dc);
12029
12030     /* ARM is a fixed-length ISA.  We performed the cross-page check
12031        in init_disas_context by adjusting max_insns.  */
12032 }
12033
12034 static bool thumb_insn_is_unconditional(DisasContext *s, uint32_t insn)
12035 {
12036     /* Return true if this Thumb insn is always unconditional,
12037      * even inside an IT block. This is true of only a very few
12038      * instructions: BKPT, HLT, and SG.
12039      *
12040      * A larger class of instructions are UNPREDICTABLE if used
12041      * inside an IT block; we do not need to detect those here, because
12042      * what we do by default (perform the cc check and update the IT
12043      * bits state machine) is a permitted CONSTRAINED UNPREDICTABLE
12044      * choice for those situations.
12045      *
12046      * insn is either a 16-bit or a 32-bit instruction; the two are
12047      * distinguishable because for the 16-bit case the top 16 bits
12048      * are zeroes, and that isn't a valid 32-bit encoding.
12049      */
12050     if ((insn & 0xffffff00) == 0xbe00) {
12051         /* BKPT */
12052         return true;
12053     }
12054
12055     if ((insn & 0xffffffc0) == 0xba80 && arm_dc_feature(s, ARM_FEATURE_V8) &&
12056         !arm_dc_feature(s, ARM_FEATURE_M)) {
12057         /* HLT: v8A only. This is unconditional even when it is going to
12058          * UNDEF; see the v8A ARM ARM DDI0487B.a H3.3.
12059          * For v7 cores this was a plain old undefined encoding and so
12060          * honours its cc check. (We might be using the encoding as
12061          * a semihosting trap, but we don't change the cc check behaviour
12062          * on that account, because a debugger connected to a real v7A
12063          * core and emulating semihosting traps by catching the UNDEF
12064          * exception would also only see cases where the cc check passed.
12065          * No guest code should be trying to do a HLT semihosting trap
12066          * in an IT block anyway.
12067          */
12068         return true;
12069     }
12070
12071     if (insn == 0xe97fe97f && arm_dc_feature(s, ARM_FEATURE_V8) &&
12072         arm_dc_feature(s, ARM_FEATURE_M)) {
12073         /* SG: v8M only */
12074         return true;
12075     }
12076
12077     return false;
12078 }
12079
12080 static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
12081 {
12082     DisasContext *dc = container_of(dcbase, DisasContext, base);
12083     CPUARMState *env = cpu->env_ptr;
12084     uint32_t insn;
12085     bool is_16bit;
12086
12087     if (arm_pre_translate_insn(dc)) {
12088         return;
12089     }
12090
12091     dc->pc_curr = dc->base.pc_next;
12092     insn = arm_lduw_code(env, dc->base.pc_next, dc->sctlr_b);
12093     is_16bit = thumb_insn_is_16bit(dc, dc->base.pc_next, insn);
12094     dc->base.pc_next += 2;
12095     if (!is_16bit) {
12096         uint32_t insn2 = arm_lduw_code(env, dc->base.pc_next, dc->sctlr_b);
12097
12098         insn = insn << 16 | insn2;
12099         dc->base.pc_next += 2;
12100     }
12101     dc->insn = insn;
12102
12103     if (dc->condexec_mask && !thumb_insn_is_unconditional(dc, insn)) {
12104         uint32_t cond = dc->condexec_cond;
12105
12106         /*
12107          * Conditionally skip the insn. Note that both 0xe and 0xf mean
12108          * "always"; 0xf is not "never".
12109          */
12110         if (cond < 0x0e) {
12111             arm_skip_unless(dc, cond);
12112         }
12113     }
12114
12115     if (is_16bit) {
12116         disas_thumb_insn(dc, insn);
12117     } else {
12118         disas_thumb2_insn(dc, insn);
12119     }
12120
12121     /* Advance the Thumb condexec condition.  */
12122     if (dc->condexec_mask) {
12123         dc->condexec_cond = ((dc->condexec_cond & 0xe) |
12124                              ((dc->condexec_mask >> 4) & 1));
12125         dc->condexec_mask = (dc->condexec_mask << 1) & 0x1f;
12126         if (dc->condexec_mask == 0) {
12127             dc->condexec_cond = 0;
12128         }
12129     }
12130
12131     arm_post_translate_insn(dc);
12132
12133     /* Thumb is a variable-length ISA.  Stop translation when the next insn
12134      * will touch a new page.  This ensures that prefetch aborts occur at
12135      * the right place.
12136      *
12137      * We want to stop the TB if the next insn starts in a new page,
12138      * or if it spans between this page and the next. This means that
12139      * if we're looking at the last halfword in the page we need to
12140      * see if it's a 16-bit Thumb insn (which will fit in this TB)
12141      * or a 32-bit Thumb insn (which won't).
12142      * This is to avoid generating a silly TB with a single 16-bit insn
12143      * in it at the end of this page (which would execute correctly
12144      * but isn't very efficient).
12145      */
12146     if (dc->base.is_jmp == DISAS_NEXT
12147         && (dc->base.pc_next - dc->page_start >= TARGET_PAGE_SIZE
12148             || (dc->base.pc_next - dc->page_start >= TARGET_PAGE_SIZE - 3
12149                 && insn_crosses_page(env, dc)))) {
12150         dc->base.is_jmp = DISAS_TOO_MANY;
12151     }
12152 }
12153
12154 static void arm_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
12155 {
12156     DisasContext *dc = container_of(dcbase, DisasContext, base);
12157
12158     if (tb_cflags(dc->base.tb) & CF_LAST_IO && dc->condjmp) {
12159         /* FIXME: This can theoretically happen with self-modifying code. */
12160         cpu_abort(cpu, "IO on conditional branch instruction");
12161     }
12162
12163     /* At this stage dc->condjmp will only be set when the skipped
12164        instruction was a conditional branch or trap, and the PC has
12165        already been written.  */
12166     gen_set_condexec(dc);
12167     if (dc->base.is_jmp == DISAS_BX_EXCRET) {
12168         /* Exception return branches need some special case code at the
12169          * end of the TB, which is complex enough that it has to
12170          * handle the single-step vs not and the condition-failed
12171          * insn codepath itself.
12172          */
12173         gen_bx_excret_final_code(dc);
12174     } else if (unlikely(is_singlestepping(dc))) {
12175         /* Unconditional and "condition passed" instruction codepath. */
12176         switch (dc->base.is_jmp) {
12177         case DISAS_SWI:
12178             gen_ss_advance(dc);
12179             gen_exception(EXCP_SWI, syn_aa32_svc(dc->svc_imm, dc->thumb),
12180                           default_exception_el(dc));
12181             break;
12182         case DISAS_HVC:
12183             gen_ss_advance(dc);
12184             gen_exception(EXCP_HVC, syn_aa32_hvc(dc->svc_imm), 2);
12185             break;
12186         case DISAS_SMC:
12187             gen_ss_advance(dc);
12188             gen_exception(EXCP_SMC, syn_aa32_smc(), 3);
12189             break;
12190         case DISAS_NEXT:
12191         case DISAS_TOO_MANY:
12192         case DISAS_UPDATE:
12193             gen_set_pc_im(dc, dc->base.pc_next);
12194             /* fall through */
12195         default:
12196             /* FIXME: Single stepping a WFI insn will not halt the CPU. */
12197             gen_singlestep_exception(dc);
12198             break;
12199         case DISAS_NORETURN:
12200             break;
12201         }
12202     } else {
12203         /* While branches must always occur at the end of an IT block,
12204            there are a few other things that can cause us to terminate
12205            the TB in the middle of an IT block:
12206             - Exception generating instructions (bkpt, swi, undefined).
12207             - Page boundaries.
12208             - Hardware watchpoints.
12209            Hardware breakpoints have already been handled and skip this code.
12210          */
12211         switch(dc->base.is_jmp) {
12212         case DISAS_NEXT:
12213         case DISAS_TOO_MANY:
12214             gen_goto_tb(dc, 1, dc->base.pc_next);
12215             break;
12216         case DISAS_JUMP:
12217             gen_goto_ptr();
12218             break;
12219         case DISAS_UPDATE:
12220             gen_set_pc_im(dc, dc->base.pc_next);
12221             /* fall through */
12222         default:
12223             /* indicate that the hash table must be used to find the next TB */
12224             tcg_gen_exit_tb(NULL, 0);
12225             break;
12226         case DISAS_NORETURN:
12227             /* nothing more to generate */
12228             break;
12229         case DISAS_WFI:
12230         {
12231             TCGv_i32 tmp = tcg_const_i32((dc->thumb &&
12232                                           !(dc->insn & (1U << 31))) ? 2 : 4);
12233
12234             gen_helper_wfi(cpu_env, tmp);
12235             tcg_temp_free_i32(tmp);
12236             /* The helper doesn't necessarily throw an exception, but we
12237              * must go back to the main loop to check for interrupts anyway.
12238              */
12239             tcg_gen_exit_tb(NULL, 0);
12240             break;
12241         }
12242         case DISAS_WFE:
12243             gen_helper_wfe(cpu_env);
12244             break;
12245         case DISAS_YIELD:
12246             gen_helper_yield(cpu_env);
12247             break;
12248         case DISAS_SWI:
12249             gen_exception(EXCP_SWI, syn_aa32_svc(dc->svc_imm, dc->thumb),
12250                           default_exception_el(dc));
12251             break;
12252         case DISAS_HVC:
12253             gen_exception(EXCP_HVC, syn_aa32_hvc(dc->svc_imm), 2);
12254             break;
12255         case DISAS_SMC:
12256             gen_exception(EXCP_SMC, syn_aa32_smc(), 3);
12257             break;
12258         }
12259     }
12260
12261     if (dc->condjmp) {
12262         /* "Condition failed" instruction codepath for the branch/trap insn */
12263         gen_set_label(dc->condlabel);
12264         gen_set_condexec(dc);
12265         if (unlikely(is_singlestepping(dc))) {
12266             gen_set_pc_im(dc, dc->base.pc_next);
12267             gen_singlestep_exception(dc);
12268         } else {
12269             gen_goto_tb(dc, 1, dc->base.pc_next);
12270         }
12271     }
12272 }
12273
12274 static void arm_tr_disas_log(const DisasContextBase *dcbase, CPUState *cpu)
12275 {
12276     DisasContext *dc = container_of(dcbase, DisasContext, base);
12277
12278     qemu_log("IN: %s\n", lookup_symbol(dc->base.pc_first));
12279     log_target_disas(cpu, dc->base.pc_first, dc->base.tb->size);
12280 }
12281
12282 static const TranslatorOps arm_translator_ops = {
12283     .init_disas_context = arm_tr_init_disas_context,
12284     .tb_start           = arm_tr_tb_start,
12285     .insn_start         = arm_tr_insn_start,
12286     .breakpoint_check   = arm_tr_breakpoint_check,
12287     .translate_insn     = arm_tr_translate_insn,
12288     .tb_stop            = arm_tr_tb_stop,
12289     .disas_log          = arm_tr_disas_log,
12290 };
12291
12292 static const TranslatorOps thumb_translator_ops = {
12293     .init_disas_context = arm_tr_init_disas_context,
12294     .tb_start           = arm_tr_tb_start,
12295     .insn_start         = arm_tr_insn_start,
12296     .breakpoint_check   = arm_tr_breakpoint_check,
12297     .translate_insn     = thumb_tr_translate_insn,
12298     .tb_stop            = arm_tr_tb_stop,
12299     .disas_log          = arm_tr_disas_log,
12300 };
12301
12302 /* generate intermediate code for basic block 'tb'.  */
12303 void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int max_insns)
12304 {
12305     DisasContext dc;
12306     const TranslatorOps *ops = &arm_translator_ops;
12307
12308     if (FIELD_EX32(tb->flags, TBFLAG_A32, THUMB)) {
12309         ops = &thumb_translator_ops;
12310     }
12311 #ifdef TARGET_AARCH64
12312     if (FIELD_EX32(tb->flags, TBFLAG_ANY, AARCH64_STATE)) {
12313         ops = &aarch64_translator_ops;
12314     }
12315 #endif
12316
12317     translator_loop(ops, &dc.base, cpu, tb, max_insns);
12318 }
12319
12320 void restore_state_to_opc(CPUARMState *env, TranslationBlock *tb,
12321                           target_ulong *data)
12322 {
12323     if (is_a64(env)) {
12324         env->pc = data[0];
12325         env->condexec_bits = 0;
12326         env->exception.syndrome = data[2] << ARM_INSN_START_WORD2_SHIFT;
12327     } else {
12328         env->regs[15] = data[0];
12329         env->condexec_bits = data[1];
12330         env->exception.syndrome = data[2] << ARM_INSN_START_WORD2_SHIFT;
12331     }
12332 }
This page took 0.708341 seconds and 4 git commands to generate.