xref: /qemu/target/tricore/translate.c (revision dbd9e084)
1 /*
2  *  TriCore emulation for qemu: main translation routines.
3  *
4  *  Copyright (c) 2013-2014 Bastian Koppelmann C-Lab/University Paderborn
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 
21 #include "qemu/osdep.h"
22 #include "cpu.h"
23 #include "disas/disas.h"
24 #include "exec/exec-all.h"
25 #include "tcg/tcg-op.h"
26 #include "exec/cpu_ldst.h"
27 #include "qemu/qemu-print.h"
28 
29 #include "exec/helper-proto.h"
30 #include "exec/helper-gen.h"
31 
32 #include "tricore-opcodes.h"
33 #include "exec/translator.h"
34 #include "exec/log.h"
35 
36 /*
37  * TCG registers
38  */
39 static TCGv cpu_PC;
40 static TCGv cpu_PCXI;
41 static TCGv cpu_PSW;
42 static TCGv cpu_ICR;
43 /* GPR registers */
44 static TCGv cpu_gpr_a[16];
45 static TCGv cpu_gpr_d[16];
46 /* PSW Flag cache */
47 static TCGv cpu_PSW_C;
48 static TCGv cpu_PSW_V;
49 static TCGv cpu_PSW_SV;
50 static TCGv cpu_PSW_AV;
51 static TCGv cpu_PSW_SAV;
52 
53 #include "exec/gen-icount.h"
54 
55 static const char *regnames_a[] = {
56       "a0"  , "a1"  , "a2"  , "a3" , "a4"  , "a5" ,
57       "a6"  , "a7"  , "a8"  , "a9" , "sp" , "a11" ,
58       "a12" , "a13" , "a14" , "a15",
59     };
60 
61 static const char *regnames_d[] = {
62       "d0"  , "d1"  , "d2"  , "d3" , "d4"  , "d5"  ,
63       "d6"  , "d7"  , "d8"  , "d9" , "d10" , "d11" ,
64       "d12" , "d13" , "d14" , "d15",
65     };
66 
67 typedef struct DisasContext {
68     DisasContextBase base;
69     target_ulong pc_succ_insn;
70     uint32_t opcode;
71     /* Routine used to access memory */
72     int mem_idx;
73     uint32_t hflags, saved_hflags;
74     uint64_t features;
75 } DisasContext;
76 
77 static int has_feature(DisasContext *ctx, int feature)
78 {
79     return (ctx->features & (1ULL << feature)) != 0;
80 }
81 
82 enum {
83     MODE_LL = 0,
84     MODE_LU = 1,
85     MODE_UL = 2,
86     MODE_UU = 3,
87 };
88 
89 void tricore_cpu_dump_state(CPUState *cs, FILE *f, int flags)
90 {
91     TriCoreCPU *cpu = TRICORE_CPU(cs);
92     CPUTriCoreState *env = &cpu->env;
93     uint32_t psw;
94     int i;
95 
96     psw = psw_read(env);
97 
98     qemu_fprintf(f, "PC: " TARGET_FMT_lx, env->PC);
99     qemu_fprintf(f, " PSW: " TARGET_FMT_lx, psw);
100     qemu_fprintf(f, " ICR: " TARGET_FMT_lx, env->ICR);
101     qemu_fprintf(f, "\nPCXI: " TARGET_FMT_lx, env->PCXI);
102     qemu_fprintf(f, " FCX: " TARGET_FMT_lx, env->FCX);
103     qemu_fprintf(f, " LCX: " TARGET_FMT_lx, env->LCX);
104 
105     for (i = 0; i < 16; ++i) {
106         if ((i & 3) == 0) {
107             qemu_fprintf(f, "\nGPR A%02d:", i);
108         }
109         qemu_fprintf(f, " " TARGET_FMT_lx, env->gpr_a[i]);
110     }
111     for (i = 0; i < 16; ++i) {
112         if ((i & 3) == 0) {
113             qemu_fprintf(f, "\nGPR D%02d:", i);
114         }
115         qemu_fprintf(f, " " TARGET_FMT_lx, env->gpr_d[i]);
116     }
117     qemu_fprintf(f, "\n");
118 }
119 
120 /*
121  * Functions to generate micro-ops
122  */
123 
124 /* Makros for generating helpers */
125 
126 #define gen_helper_1arg(name, arg) do {                           \
127     TCGv_i32 helper_tmp = tcg_const_i32(arg);                     \
128     gen_helper_##name(cpu_env, helper_tmp);                       \
129     tcg_temp_free_i32(helper_tmp);                                \
130     } while (0)
131 
132 #define GEN_HELPER_LL(name, ret, arg0, arg1, n) do {         \
133     TCGv arg00 = tcg_temp_new();                             \
134     TCGv arg01 = tcg_temp_new();                             \
135     TCGv arg11 = tcg_temp_new();                             \
136     tcg_gen_sari_tl(arg00, arg0, 16);                        \
137     tcg_gen_ext16s_tl(arg01, arg0);                          \
138     tcg_gen_ext16s_tl(arg11, arg1);                          \
139     gen_helper_##name(ret, arg00, arg01, arg11, arg11, n);   \
140     tcg_temp_free(arg00);                                    \
141     tcg_temp_free(arg01);                                    \
142     tcg_temp_free(arg11);                                    \
143 } while (0)
144 
145 #define GEN_HELPER_LU(name, ret, arg0, arg1, n) do {         \
146     TCGv arg00 = tcg_temp_new();                             \
147     TCGv arg01 = tcg_temp_new();                             \
148     TCGv arg10 = tcg_temp_new();                             \
149     TCGv arg11 = tcg_temp_new();                             \
150     tcg_gen_sari_tl(arg00, arg0, 16);                        \
151     tcg_gen_ext16s_tl(arg01, arg0);                          \
152     tcg_gen_sari_tl(arg11, arg1, 16);                        \
153     tcg_gen_ext16s_tl(arg10, arg1);                          \
154     gen_helper_##name(ret, arg00, arg01, arg10, arg11, n);   \
155     tcg_temp_free(arg00);                                    \
156     tcg_temp_free(arg01);                                    \
157     tcg_temp_free(arg10);                                    \
158     tcg_temp_free(arg11);                                    \
159 } while (0)
160 
161 #define GEN_HELPER_UL(name, ret, arg0, arg1, n) do {         \
162     TCGv arg00 = tcg_temp_new();                             \
163     TCGv arg01 = tcg_temp_new();                             \
164     TCGv arg10 = tcg_temp_new();                             \
165     TCGv arg11 = tcg_temp_new();                             \
166     tcg_gen_sari_tl(arg00, arg0, 16);                        \
167     tcg_gen_ext16s_tl(arg01, arg0);                          \
168     tcg_gen_sari_tl(arg10, arg1, 16);                        \
169     tcg_gen_ext16s_tl(arg11, arg1);                          \
170     gen_helper_##name(ret, arg00, arg01, arg10, arg11, n);   \
171     tcg_temp_free(arg00);                                    \
172     tcg_temp_free(arg01);                                    \
173     tcg_temp_free(arg10);                                    \
174     tcg_temp_free(arg11);                                    \
175 } while (0)
176 
177 #define GEN_HELPER_UU(name, ret, arg0, arg1, n) do {         \
178     TCGv arg00 = tcg_temp_new();                             \
179     TCGv arg01 = tcg_temp_new();                             \
180     TCGv arg11 = tcg_temp_new();                             \
181     tcg_gen_sari_tl(arg01, arg0, 16);                        \
182     tcg_gen_ext16s_tl(arg00, arg0);                          \
183     tcg_gen_sari_tl(arg11, arg1, 16);                        \
184     gen_helper_##name(ret, arg00, arg01, arg11, arg11, n);   \
185     tcg_temp_free(arg00);                                    \
186     tcg_temp_free(arg01);                                    \
187     tcg_temp_free(arg11);                                    \
188 } while (0)
189 
190 #define GEN_HELPER_RRR(name, rl, rh, al1, ah1, arg2) do {    \
191     TCGv_i64 ret = tcg_temp_new_i64();                       \
192     TCGv_i64 arg1 = tcg_temp_new_i64();                      \
193                                                              \
194     tcg_gen_concat_i32_i64(arg1, al1, ah1);                  \
195     gen_helper_##name(ret, arg1, arg2);                      \
196     tcg_gen_extr_i64_i32(rl, rh, ret);                       \
197                                                              \
198     tcg_temp_free_i64(ret);                                  \
199     tcg_temp_free_i64(arg1);                                 \
200 } while (0)
201 
202 #define GEN_HELPER_RR(name, rl, rh, arg1, arg2) do {        \
203     TCGv_i64 ret = tcg_temp_new_i64();                      \
204                                                             \
205     gen_helper_##name(ret, cpu_env, arg1, arg2);            \
206     tcg_gen_extr_i64_i32(rl, rh, ret);                      \
207                                                             \
208     tcg_temp_free_i64(ret);                                 \
209 } while (0)
210 
211 #define EA_ABS_FORMAT(con) (((con & 0x3C000) << 14) + (con & 0x3FFF))
212 #define EA_B_ABSOLUT(con) (((offset & 0xf00000) << 8) | \
213                            ((offset & 0x0fffff) << 1))
214 
215 /* For two 32-bit registers used a 64-bit register, the first
216    registernumber needs to be even. Otherwise we trap. */
217 static inline void generate_trap(DisasContext *ctx, int class, int tin);
218 #define CHECK_REG_PAIR(reg) do {                      \
219     if (reg & 0x1) {                                  \
220         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_OPD); \
221     }                                                 \
222 } while (0)
223 
224 /* Functions for load/save to/from memory */
225 
226 static inline void gen_offset_ld(DisasContext *ctx, TCGv r1, TCGv r2,
227                                  int16_t con, MemOp mop)
228 {
229     TCGv temp = tcg_temp_new();
230     tcg_gen_addi_tl(temp, r2, con);
231     tcg_gen_qemu_ld_tl(r1, temp, ctx->mem_idx, mop);
232     tcg_temp_free(temp);
233 }
234 
235 static inline void gen_offset_st(DisasContext *ctx, TCGv r1, TCGv r2,
236                                  int16_t con, MemOp mop)
237 {
238     TCGv temp = tcg_temp_new();
239     tcg_gen_addi_tl(temp, r2, con);
240     tcg_gen_qemu_st_tl(r1, temp, ctx->mem_idx, mop);
241     tcg_temp_free(temp);
242 }
243 
244 static void gen_st_2regs_64(TCGv rh, TCGv rl, TCGv address, DisasContext *ctx)
245 {
246     TCGv_i64 temp = tcg_temp_new_i64();
247 
248     tcg_gen_concat_i32_i64(temp, rl, rh);
249     tcg_gen_qemu_st_i64(temp, address, ctx->mem_idx, MO_LEQ);
250 
251     tcg_temp_free_i64(temp);
252 }
253 
254 static void gen_offset_st_2regs(TCGv rh, TCGv rl, TCGv base, int16_t con,
255                                 DisasContext *ctx)
256 {
257     TCGv temp = tcg_temp_new();
258     tcg_gen_addi_tl(temp, base, con);
259     gen_st_2regs_64(rh, rl, temp, ctx);
260     tcg_temp_free(temp);
261 }
262 
263 static void gen_ld_2regs_64(TCGv rh, TCGv rl, TCGv address, DisasContext *ctx)
264 {
265     TCGv_i64 temp = tcg_temp_new_i64();
266 
267     tcg_gen_qemu_ld_i64(temp, address, ctx->mem_idx, MO_LEQ);
268     /* write back to two 32 bit regs */
269     tcg_gen_extr_i64_i32(rl, rh, temp);
270 
271     tcg_temp_free_i64(temp);
272 }
273 
274 static void gen_offset_ld_2regs(TCGv rh, TCGv rl, TCGv base, int16_t con,
275                                 DisasContext *ctx)
276 {
277     TCGv temp = tcg_temp_new();
278     tcg_gen_addi_tl(temp, base, con);
279     gen_ld_2regs_64(rh, rl, temp, ctx);
280     tcg_temp_free(temp);
281 }
282 
283 static void gen_st_preincr(DisasContext *ctx, TCGv r1, TCGv r2, int16_t off,
284                            MemOp mop)
285 {
286     TCGv temp = tcg_temp_new();
287     tcg_gen_addi_tl(temp, r2, off);
288     tcg_gen_qemu_st_tl(r1, temp, ctx->mem_idx, mop);
289     tcg_gen_mov_tl(r2, temp);
290     tcg_temp_free(temp);
291 }
292 
293 static void gen_ld_preincr(DisasContext *ctx, TCGv r1, TCGv r2, int16_t off,
294                            MemOp mop)
295 {
296     TCGv temp = tcg_temp_new();
297     tcg_gen_addi_tl(temp, r2, off);
298     tcg_gen_qemu_ld_tl(r1, temp, ctx->mem_idx, mop);
299     tcg_gen_mov_tl(r2, temp);
300     tcg_temp_free(temp);
301 }
302 
303 /* M(EA, word) = (M(EA, word) & ~E[a][63:32]) | (E[a][31:0] & E[a][63:32]); */
304 static void gen_ldmst(DisasContext *ctx, int ereg, TCGv ea)
305 {
306     TCGv temp = tcg_temp_new();
307     TCGv temp2 = tcg_temp_new();
308 
309     CHECK_REG_PAIR(ereg);
310     /* temp = (M(EA, word) */
311     tcg_gen_qemu_ld_tl(temp, ea, ctx->mem_idx, MO_LEUL);
312     /* temp = temp & ~E[a][63:32]) */
313     tcg_gen_andc_tl(temp, temp, cpu_gpr_d[ereg+1]);
314     /* temp2 = (E[a][31:0] & E[a][63:32]); */
315     tcg_gen_and_tl(temp2, cpu_gpr_d[ereg], cpu_gpr_d[ereg+1]);
316     /* temp = temp | temp2; */
317     tcg_gen_or_tl(temp, temp, temp2);
318     /* M(EA, word) = temp; */
319     tcg_gen_qemu_st_tl(temp, ea, ctx->mem_idx, MO_LEUL);
320 
321     tcg_temp_free(temp);
322     tcg_temp_free(temp2);
323 }
324 
325 /* tmp = M(EA, word);
326    M(EA, word) = D[a];
327    D[a] = tmp[31:0];*/
328 static void gen_swap(DisasContext *ctx, int reg, TCGv ea)
329 {
330     TCGv temp = tcg_temp_new();
331 
332     tcg_gen_qemu_ld_tl(temp, ea, ctx->mem_idx, MO_LEUL);
333     tcg_gen_qemu_st_tl(cpu_gpr_d[reg], ea, ctx->mem_idx, MO_LEUL);
334     tcg_gen_mov_tl(cpu_gpr_d[reg], temp);
335 
336     tcg_temp_free(temp);
337 }
338 
339 static void gen_cmpswap(DisasContext *ctx, int reg, TCGv ea)
340 {
341     TCGv temp = tcg_temp_new();
342     TCGv temp2 = tcg_temp_new();
343     tcg_gen_qemu_ld_tl(temp, ea, ctx->mem_idx, MO_LEUL);
344     tcg_gen_movcond_tl(TCG_COND_EQ, temp2, cpu_gpr_d[reg+1], temp,
345                        cpu_gpr_d[reg], temp);
346     tcg_gen_qemu_st_tl(temp2, ea, ctx->mem_idx, MO_LEUL);
347     tcg_gen_mov_tl(cpu_gpr_d[reg], temp);
348 
349     tcg_temp_free(temp);
350     tcg_temp_free(temp2);
351 }
352 
353 static void gen_swapmsk(DisasContext *ctx, int reg, TCGv ea)
354 {
355     TCGv temp = tcg_temp_new();
356     TCGv temp2 = tcg_temp_new();
357     TCGv temp3 = tcg_temp_new();
358 
359     tcg_gen_qemu_ld_tl(temp, ea, ctx->mem_idx, MO_LEUL);
360     tcg_gen_and_tl(temp2, cpu_gpr_d[reg], cpu_gpr_d[reg+1]);
361     tcg_gen_andc_tl(temp3, temp, cpu_gpr_d[reg+1]);
362     tcg_gen_or_tl(temp2, temp2, temp3);
363     tcg_gen_qemu_st_tl(temp2, ea, ctx->mem_idx, MO_LEUL);
364     tcg_gen_mov_tl(cpu_gpr_d[reg], temp);
365 
366     tcg_temp_free(temp);
367     tcg_temp_free(temp2);
368     tcg_temp_free(temp3);
369 }
370 
371 
372 /* We generate loads and store to core special function register (csfr) through
373    the function gen_mfcr and gen_mtcr. To handle access permissions, we use 3
374    makros R, A and E, which allow read-only, all and endinit protected access.
375    These makros also specify in which ISA version the csfr was introduced. */
376 #define R(ADDRESS, REG, FEATURE)                                         \
377     case ADDRESS:                                                        \
378         if (has_feature(ctx, FEATURE)) {                             \
379             tcg_gen_ld_tl(ret, cpu_env, offsetof(CPUTriCoreState, REG)); \
380         }                                                                \
381         break;
382 #define A(ADDRESS, REG, FEATURE) R(ADDRESS, REG, FEATURE)
383 #define E(ADDRESS, REG, FEATURE) R(ADDRESS, REG, FEATURE)
384 static inline void gen_mfcr(DisasContext *ctx, TCGv ret, int32_t offset)
385 {
386     /* since we're caching PSW make this a special case */
387     if (offset == 0xfe04) {
388         gen_helper_psw_read(ret, cpu_env);
389     } else {
390         switch (offset) {
391 #include "csfr.def"
392         }
393     }
394 }
395 #undef R
396 #undef A
397 #undef E
398 
399 #define R(ADDRESS, REG, FEATURE) /* don't gen writes to read-only reg,
400                                     since no execption occurs */
401 #define A(ADDRESS, REG, FEATURE) R(ADDRESS, REG, FEATURE)                \
402     case ADDRESS:                                                        \
403         if (has_feature(ctx, FEATURE)) {                             \
404             tcg_gen_st_tl(r1, cpu_env, offsetof(CPUTriCoreState, REG));  \
405         }                                                                \
406         break;
407 /* Endinit protected registers
408    TODO: Since the endinit bit is in a register of a not yet implemented
409          watchdog device, we handle endinit protected registers like
410          all-access registers for now. */
411 #define E(ADDRESS, REG, FEATURE) A(ADDRESS, REG, FEATURE)
412 static inline void gen_mtcr(DisasContext *ctx, TCGv r1,
413                             int32_t offset)
414 {
415     if ((ctx->hflags & TRICORE_HFLAG_KUU) == TRICORE_HFLAG_SM) {
416         /* since we're caching PSW make this a special case */
417         if (offset == 0xfe04) {
418             gen_helper_psw_write(cpu_env, r1);
419         } else {
420             switch (offset) {
421 #include "csfr.def"
422             }
423         }
424     } else {
425         /* generate privilege trap */
426     }
427 }
428 
429 /* Functions for arithmetic instructions  */
430 
431 static inline void gen_add_d(TCGv ret, TCGv r1, TCGv r2)
432 {
433     TCGv t0 = tcg_temp_new_i32();
434     TCGv result = tcg_temp_new_i32();
435     /* Addition and set V/SV bits */
436     tcg_gen_add_tl(result, r1, r2);
437     /* calc V bit */
438     tcg_gen_xor_tl(cpu_PSW_V, result, r1);
439     tcg_gen_xor_tl(t0, r1, r2);
440     tcg_gen_andc_tl(cpu_PSW_V, cpu_PSW_V, t0);
441     /* Calc SV bit */
442     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
443     /* Calc AV/SAV bits */
444     tcg_gen_add_tl(cpu_PSW_AV, result, result);
445     tcg_gen_xor_tl(cpu_PSW_AV, result, cpu_PSW_AV);
446     /* calc SAV */
447     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
448     /* write back result */
449     tcg_gen_mov_tl(ret, result);
450 
451     tcg_temp_free(result);
452     tcg_temp_free(t0);
453 }
454 
455 static inline void
456 gen_add64_d(TCGv_i64 ret, TCGv_i64 r1, TCGv_i64 r2)
457 {
458     TCGv temp = tcg_temp_new();
459     TCGv_i64 t0 = tcg_temp_new_i64();
460     TCGv_i64 t1 = tcg_temp_new_i64();
461     TCGv_i64 result = tcg_temp_new_i64();
462 
463     tcg_gen_add_i64(result, r1, r2);
464     /* calc v bit */
465     tcg_gen_xor_i64(t1, result, r1);
466     tcg_gen_xor_i64(t0, r1, r2);
467     tcg_gen_andc_i64(t1, t1, t0);
468     tcg_gen_extrh_i64_i32(cpu_PSW_V, t1);
469     /* calc SV bit */
470     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
471     /* calc AV/SAV bits */
472     tcg_gen_extrh_i64_i32(temp, result);
473     tcg_gen_add_tl(cpu_PSW_AV, temp, temp);
474     tcg_gen_xor_tl(cpu_PSW_AV, temp, cpu_PSW_AV);
475     /* calc SAV */
476     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
477     /* write back result */
478     tcg_gen_mov_i64(ret, result);
479 
480     tcg_temp_free(temp);
481     tcg_temp_free_i64(result);
482     tcg_temp_free_i64(t0);
483     tcg_temp_free_i64(t1);
484 }
485 
486 static inline void
487 gen_addsub64_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
488                TCGv r3, void(*op1)(TCGv, TCGv, TCGv),
489                void(*op2)(TCGv, TCGv, TCGv))
490 {
491     TCGv temp = tcg_temp_new();
492     TCGv temp2 = tcg_temp_new();
493     TCGv temp3 = tcg_temp_new();
494     TCGv temp4 = tcg_temp_new();
495 
496     (*op1)(temp, r1_low, r2);
497     /* calc V0 bit */
498     tcg_gen_xor_tl(temp2, temp, r1_low);
499     tcg_gen_xor_tl(temp3, r1_low, r2);
500     if (op1 == tcg_gen_add_tl) {
501         tcg_gen_andc_tl(temp2, temp2, temp3);
502     } else {
503         tcg_gen_and_tl(temp2, temp2, temp3);
504     }
505 
506     (*op2)(temp3, r1_high, r3);
507     /* calc V1 bit */
508     tcg_gen_xor_tl(cpu_PSW_V, temp3, r1_high);
509     tcg_gen_xor_tl(temp4, r1_high, r3);
510     if (op2 == tcg_gen_add_tl) {
511         tcg_gen_andc_tl(cpu_PSW_V, cpu_PSW_V, temp4);
512     } else {
513         tcg_gen_and_tl(cpu_PSW_V, cpu_PSW_V, temp4);
514     }
515     /* combine V0/V1 bits */
516     tcg_gen_or_tl(cpu_PSW_V, cpu_PSW_V, temp2);
517     /* calc sv bit */
518     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
519     /* write result */
520     tcg_gen_mov_tl(ret_low, temp);
521     tcg_gen_mov_tl(ret_high, temp3);
522     /* calc AV bit */
523     tcg_gen_add_tl(temp, ret_low, ret_low);
524     tcg_gen_xor_tl(temp, temp, ret_low);
525     tcg_gen_add_tl(cpu_PSW_AV, ret_high, ret_high);
526     tcg_gen_xor_tl(cpu_PSW_AV, cpu_PSW_AV, ret_high);
527     tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp);
528     /* calc SAV bit */
529     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
530 
531     tcg_temp_free(temp);
532     tcg_temp_free(temp2);
533     tcg_temp_free(temp3);
534     tcg_temp_free(temp4);
535 }
536 
537 /* ret = r2 + (r1 * r3); */
538 static inline void gen_madd32_d(TCGv ret, TCGv r1, TCGv r2, TCGv r3)
539 {
540     TCGv_i64 t1 = tcg_temp_new_i64();
541     TCGv_i64 t2 = tcg_temp_new_i64();
542     TCGv_i64 t3 = tcg_temp_new_i64();
543 
544     tcg_gen_ext_i32_i64(t1, r1);
545     tcg_gen_ext_i32_i64(t2, r2);
546     tcg_gen_ext_i32_i64(t3, r3);
547 
548     tcg_gen_mul_i64(t1, t1, t3);
549     tcg_gen_add_i64(t1, t2, t1);
550 
551     tcg_gen_extrl_i64_i32(ret, t1);
552     /* calc V
553        t1 > 0x7fffffff */
554     tcg_gen_setcondi_i64(TCG_COND_GT, t3, t1, 0x7fffffffLL);
555     /* t1 < -0x80000000 */
556     tcg_gen_setcondi_i64(TCG_COND_LT, t2, t1, -0x80000000LL);
557     tcg_gen_or_i64(t2, t2, t3);
558     tcg_gen_extrl_i64_i32(cpu_PSW_V, t2);
559     tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
560     /* Calc SV bit */
561     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
562     /* Calc AV/SAV bits */
563     tcg_gen_add_tl(cpu_PSW_AV, ret, ret);
564     tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV);
565     /* calc SAV */
566     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
567 
568     tcg_temp_free_i64(t1);
569     tcg_temp_free_i64(t2);
570     tcg_temp_free_i64(t3);
571 }
572 
573 static inline void gen_maddi32_d(TCGv ret, TCGv r1, TCGv r2, int32_t con)
574 {
575     TCGv temp = tcg_const_i32(con);
576     gen_madd32_d(ret, r1, r2, temp);
577     tcg_temp_free(temp);
578 }
579 
580 static inline void
581 gen_madd64_d(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high,
582              TCGv r3)
583 {
584     TCGv t1 = tcg_temp_new();
585     TCGv t2 = tcg_temp_new();
586     TCGv t3 = tcg_temp_new();
587     TCGv t4 = tcg_temp_new();
588 
589     tcg_gen_muls2_tl(t1, t2, r1, r3);
590     /* only the add can overflow */
591     tcg_gen_add2_tl(t3, t4, r2_low, r2_high, t1, t2);
592     /* calc V bit */
593     tcg_gen_xor_tl(cpu_PSW_V, t4, r2_high);
594     tcg_gen_xor_tl(t1, r2_high, t2);
595     tcg_gen_andc_tl(cpu_PSW_V, cpu_PSW_V, t1);
596     /* Calc SV bit */
597     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
598     /* Calc AV/SAV bits */
599     tcg_gen_add_tl(cpu_PSW_AV, t4, t4);
600     tcg_gen_xor_tl(cpu_PSW_AV, t4, cpu_PSW_AV);
601     /* calc SAV */
602     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
603     /* write back the result */
604     tcg_gen_mov_tl(ret_low, t3);
605     tcg_gen_mov_tl(ret_high, t4);
606 
607     tcg_temp_free(t1);
608     tcg_temp_free(t2);
609     tcg_temp_free(t3);
610     tcg_temp_free(t4);
611 }
612 
613 static inline void
614 gen_maddu64_d(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high,
615               TCGv r3)
616 {
617     TCGv_i64 t1 = tcg_temp_new_i64();
618     TCGv_i64 t2 = tcg_temp_new_i64();
619     TCGv_i64 t3 = tcg_temp_new_i64();
620 
621     tcg_gen_extu_i32_i64(t1, r1);
622     tcg_gen_concat_i32_i64(t2, r2_low, r2_high);
623     tcg_gen_extu_i32_i64(t3, r3);
624 
625     tcg_gen_mul_i64(t1, t1, t3);
626     tcg_gen_add_i64(t2, t2, t1);
627     /* write back result */
628     tcg_gen_extr_i64_i32(ret_low, ret_high, t2);
629     /* only the add overflows, if t2 < t1
630        calc V bit */
631     tcg_gen_setcond_i64(TCG_COND_LTU, t2, t2, t1);
632     tcg_gen_extrl_i64_i32(cpu_PSW_V, t2);
633     tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
634     /* Calc SV bit */
635     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
636     /* Calc AV/SAV bits */
637     tcg_gen_add_tl(cpu_PSW_AV, ret_high, ret_high);
638     tcg_gen_xor_tl(cpu_PSW_AV, ret_high, cpu_PSW_AV);
639     /* calc SAV */
640     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
641 
642     tcg_temp_free_i64(t1);
643     tcg_temp_free_i64(t2);
644     tcg_temp_free_i64(t3);
645 }
646 
647 static inline void
648 gen_maddi64_d(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high,
649               int32_t con)
650 {
651     TCGv temp = tcg_const_i32(con);
652     gen_madd64_d(ret_low, ret_high, r1, r2_low, r2_high, temp);
653     tcg_temp_free(temp);
654 }
655 
656 static inline void
657 gen_maddui64_d(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high,
658                int32_t con)
659 {
660     TCGv temp = tcg_const_i32(con);
661     gen_maddu64_d(ret_low, ret_high, r1, r2_low, r2_high, temp);
662     tcg_temp_free(temp);
663 }
664 
665 static inline void
666 gen_madd_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
667            TCGv r3, uint32_t n, uint32_t mode)
668 {
669     TCGv temp = tcg_const_i32(n);
670     TCGv temp2 = tcg_temp_new();
671     TCGv_i64 temp64 = tcg_temp_new_i64();
672     switch (mode) {
673     case MODE_LL:
674         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
675         break;
676     case MODE_LU:
677         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
678         break;
679     case MODE_UL:
680         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
681         break;
682     case MODE_UU:
683         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
684         break;
685     }
686     tcg_gen_extr_i64_i32(temp, temp2, temp64);
687     gen_addsub64_h(ret_low, ret_high, r1_low, r1_high, temp, temp2,
688                    tcg_gen_add_tl, tcg_gen_add_tl);
689     tcg_temp_free(temp);
690     tcg_temp_free(temp2);
691     tcg_temp_free_i64(temp64);
692 }
693 
694 static inline void
695 gen_maddsu_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
696              TCGv r3, uint32_t n, uint32_t mode)
697 {
698     TCGv temp = tcg_const_i32(n);
699     TCGv temp2 = tcg_temp_new();
700     TCGv_i64 temp64 = tcg_temp_new_i64();
701     switch (mode) {
702     case MODE_LL:
703         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
704         break;
705     case MODE_LU:
706         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
707         break;
708     case MODE_UL:
709         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
710         break;
711     case MODE_UU:
712         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
713         break;
714     }
715     tcg_gen_extr_i64_i32(temp, temp2, temp64);
716     gen_addsub64_h(ret_low, ret_high, r1_low, r1_high, temp, temp2,
717                    tcg_gen_sub_tl, tcg_gen_add_tl);
718     tcg_temp_free(temp);
719     tcg_temp_free(temp2);
720     tcg_temp_free_i64(temp64);
721 }
722 
723 static inline void
724 gen_maddsum_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
725               TCGv r3, uint32_t n, uint32_t mode)
726 {
727     TCGv temp = tcg_const_i32(n);
728     TCGv_i64 temp64 = tcg_temp_new_i64();
729     TCGv_i64 temp64_2 = tcg_temp_new_i64();
730     TCGv_i64 temp64_3 = tcg_temp_new_i64();
731     switch (mode) {
732     case MODE_LL:
733         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
734         break;
735     case MODE_LU:
736         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
737         break;
738     case MODE_UL:
739         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
740         break;
741     case MODE_UU:
742         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
743         break;
744     }
745     tcg_gen_concat_i32_i64(temp64_3, r1_low, r1_high);
746     tcg_gen_sari_i64(temp64_2, temp64, 32); /* high */
747     tcg_gen_ext32s_i64(temp64, temp64); /* low */
748     tcg_gen_sub_i64(temp64, temp64_2, temp64);
749     tcg_gen_shli_i64(temp64, temp64, 16);
750 
751     gen_add64_d(temp64_2, temp64_3, temp64);
752     /* write back result */
753     tcg_gen_extr_i64_i32(ret_low, ret_high, temp64_2);
754 
755     tcg_temp_free(temp);
756     tcg_temp_free_i64(temp64);
757     tcg_temp_free_i64(temp64_2);
758     tcg_temp_free_i64(temp64_3);
759 }
760 
761 static inline void gen_adds(TCGv ret, TCGv r1, TCGv r2);
762 
763 static inline void
764 gen_madds_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
765            TCGv r3, uint32_t n, uint32_t mode)
766 {
767     TCGv temp = tcg_const_i32(n);
768     TCGv temp2 = tcg_temp_new();
769     TCGv temp3 = tcg_temp_new();
770     TCGv_i64 temp64 = tcg_temp_new_i64();
771 
772     switch (mode) {
773     case MODE_LL:
774         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
775         break;
776     case MODE_LU:
777         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
778         break;
779     case MODE_UL:
780         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
781         break;
782     case MODE_UU:
783         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
784         break;
785     }
786     tcg_gen_extr_i64_i32(temp, temp2, temp64);
787     gen_adds(ret_low, r1_low, temp);
788     tcg_gen_mov_tl(temp, cpu_PSW_V);
789     tcg_gen_mov_tl(temp3, cpu_PSW_AV);
790     gen_adds(ret_high, r1_high, temp2);
791     /* combine v bits */
792     tcg_gen_or_tl(cpu_PSW_V, cpu_PSW_V, temp);
793     /* combine av bits */
794     tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp3);
795 
796     tcg_temp_free(temp);
797     tcg_temp_free(temp2);
798     tcg_temp_free(temp3);
799     tcg_temp_free_i64(temp64);
800 
801 }
802 
803 static inline void gen_subs(TCGv ret, TCGv r1, TCGv r2);
804 
805 static inline void
806 gen_maddsus_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
807               TCGv r3, uint32_t n, uint32_t mode)
808 {
809     TCGv temp = tcg_const_i32(n);
810     TCGv temp2 = tcg_temp_new();
811     TCGv temp3 = tcg_temp_new();
812     TCGv_i64 temp64 = tcg_temp_new_i64();
813 
814     switch (mode) {
815     case MODE_LL:
816         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
817         break;
818     case MODE_LU:
819         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
820         break;
821     case MODE_UL:
822         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
823         break;
824     case MODE_UU:
825         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
826         break;
827     }
828     tcg_gen_extr_i64_i32(temp, temp2, temp64);
829     gen_subs(ret_low, r1_low, temp);
830     tcg_gen_mov_tl(temp, cpu_PSW_V);
831     tcg_gen_mov_tl(temp3, cpu_PSW_AV);
832     gen_adds(ret_high, r1_high, temp2);
833     /* combine v bits */
834     tcg_gen_or_tl(cpu_PSW_V, cpu_PSW_V, temp);
835     /* combine av bits */
836     tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp3);
837 
838     tcg_temp_free(temp);
839     tcg_temp_free(temp2);
840     tcg_temp_free(temp3);
841     tcg_temp_free_i64(temp64);
842 
843 }
844 
845 static inline void
846 gen_maddsums_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
847                TCGv r3, uint32_t n, uint32_t mode)
848 {
849     TCGv temp = tcg_const_i32(n);
850     TCGv_i64 temp64 = tcg_temp_new_i64();
851     TCGv_i64 temp64_2 = tcg_temp_new_i64();
852 
853     switch (mode) {
854     case MODE_LL:
855         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
856         break;
857     case MODE_LU:
858         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
859         break;
860     case MODE_UL:
861         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
862         break;
863     case MODE_UU:
864         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
865         break;
866     }
867     tcg_gen_sari_i64(temp64_2, temp64, 32); /* high */
868     tcg_gen_ext32s_i64(temp64, temp64); /* low */
869     tcg_gen_sub_i64(temp64, temp64_2, temp64);
870     tcg_gen_shli_i64(temp64, temp64, 16);
871     tcg_gen_concat_i32_i64(temp64_2, r1_low, r1_high);
872 
873     gen_helper_add64_ssov(temp64, cpu_env, temp64_2, temp64);
874     tcg_gen_extr_i64_i32(ret_low, ret_high, temp64);
875 
876     tcg_temp_free(temp);
877     tcg_temp_free_i64(temp64);
878     tcg_temp_free_i64(temp64_2);
879 }
880 
881 
882 static inline void
883 gen_maddm_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
884            TCGv r3, uint32_t n, uint32_t mode)
885 {
886     TCGv temp = tcg_const_i32(n);
887     TCGv_i64 temp64 = tcg_temp_new_i64();
888     TCGv_i64 temp64_2 = tcg_temp_new_i64();
889     TCGv_i64 temp64_3 = tcg_temp_new_i64();
890     switch (mode) {
891     case MODE_LL:
892         GEN_HELPER_LL(mulm_h, temp64, r2, r3, temp);
893         break;
894     case MODE_LU:
895         GEN_HELPER_LU(mulm_h, temp64, r2, r3, temp);
896         break;
897     case MODE_UL:
898         GEN_HELPER_UL(mulm_h, temp64, r2, r3, temp);
899         break;
900     case MODE_UU:
901         GEN_HELPER_UU(mulm_h, temp64, r2, r3, temp);
902         break;
903     }
904     tcg_gen_concat_i32_i64(temp64_2, r1_low, r1_high);
905     gen_add64_d(temp64_3, temp64_2, temp64);
906     /* write back result */
907     tcg_gen_extr_i64_i32(ret_low, ret_high, temp64_3);
908 
909     tcg_temp_free(temp);
910     tcg_temp_free_i64(temp64);
911     tcg_temp_free_i64(temp64_2);
912     tcg_temp_free_i64(temp64_3);
913 }
914 
915 static inline void
916 gen_maddms_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
917            TCGv r3, uint32_t n, uint32_t mode)
918 {
919     TCGv temp = tcg_const_i32(n);
920     TCGv_i64 temp64 = tcg_temp_new_i64();
921     TCGv_i64 temp64_2 = tcg_temp_new_i64();
922     switch (mode) {
923     case MODE_LL:
924         GEN_HELPER_LL(mulm_h, temp64, r2, r3, temp);
925         break;
926     case MODE_LU:
927         GEN_HELPER_LU(mulm_h, temp64, r2, r3, temp);
928         break;
929     case MODE_UL:
930         GEN_HELPER_UL(mulm_h, temp64, r2, r3, temp);
931         break;
932     case MODE_UU:
933         GEN_HELPER_UU(mulm_h, temp64, r2, r3, temp);
934         break;
935     }
936     tcg_gen_concat_i32_i64(temp64_2, r1_low, r1_high);
937     gen_helper_add64_ssov(temp64, cpu_env, temp64_2, temp64);
938     tcg_gen_extr_i64_i32(ret_low, ret_high, temp64);
939 
940     tcg_temp_free(temp);
941     tcg_temp_free_i64(temp64);
942     tcg_temp_free_i64(temp64_2);
943 }
944 
945 static inline void
946 gen_maddr64_h(TCGv ret, TCGv r1_low, TCGv r1_high, TCGv r2, TCGv r3, uint32_t n,
947               uint32_t mode)
948 {
949     TCGv temp = tcg_const_i32(n);
950     TCGv_i64 temp64 = tcg_temp_new_i64();
951     switch (mode) {
952     case MODE_LL:
953         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
954         break;
955     case MODE_LU:
956         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
957         break;
958     case MODE_UL:
959         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
960         break;
961     case MODE_UU:
962         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
963         break;
964     }
965     gen_helper_addr_h(ret, cpu_env, temp64, r1_low, r1_high);
966 
967     tcg_temp_free(temp);
968     tcg_temp_free_i64(temp64);
969 }
970 
971 static inline void
972 gen_maddr32_h(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n, uint32_t mode)
973 {
974     TCGv temp = tcg_temp_new();
975     TCGv temp2 = tcg_temp_new();
976 
977     tcg_gen_andi_tl(temp2, r1, 0xffff0000);
978     tcg_gen_shli_tl(temp, r1, 16);
979     gen_maddr64_h(ret, temp, temp2, r2, r3, n, mode);
980 
981     tcg_temp_free(temp);
982     tcg_temp_free(temp2);
983 }
984 
985 static inline void
986 gen_maddsur32_h(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n, uint32_t mode)
987 {
988     TCGv temp = tcg_const_i32(n);
989     TCGv temp2 = tcg_temp_new();
990     TCGv_i64 temp64 = tcg_temp_new_i64();
991     switch (mode) {
992     case MODE_LL:
993         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
994         break;
995     case MODE_LU:
996         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
997         break;
998     case MODE_UL:
999         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
1000         break;
1001     case MODE_UU:
1002         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
1003         break;
1004     }
1005     tcg_gen_andi_tl(temp2, r1, 0xffff0000);
1006     tcg_gen_shli_tl(temp, r1, 16);
1007     gen_helper_addsur_h(ret, cpu_env, temp64, temp, temp2);
1008 
1009     tcg_temp_free(temp);
1010     tcg_temp_free(temp2);
1011     tcg_temp_free_i64(temp64);
1012 }
1013 
1014 
1015 static inline void
1016 gen_maddr64s_h(TCGv ret, TCGv r1_low, TCGv r1_high, TCGv r2, TCGv r3,
1017                uint32_t n, uint32_t mode)
1018 {
1019     TCGv temp = tcg_const_i32(n);
1020     TCGv_i64 temp64 = tcg_temp_new_i64();
1021     switch (mode) {
1022     case MODE_LL:
1023         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
1024         break;
1025     case MODE_LU:
1026         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
1027         break;
1028     case MODE_UL:
1029         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
1030         break;
1031     case MODE_UU:
1032         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
1033         break;
1034     }
1035     gen_helper_addr_h_ssov(ret, cpu_env, temp64, r1_low, r1_high);
1036 
1037     tcg_temp_free(temp);
1038     tcg_temp_free_i64(temp64);
1039 }
1040 
1041 static inline void
1042 gen_maddr32s_h(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n, uint32_t mode)
1043 {
1044     TCGv temp = tcg_temp_new();
1045     TCGv temp2 = tcg_temp_new();
1046 
1047     tcg_gen_andi_tl(temp2, r1, 0xffff0000);
1048     tcg_gen_shli_tl(temp, r1, 16);
1049     gen_maddr64s_h(ret, temp, temp2, r2, r3, n, mode);
1050 
1051     tcg_temp_free(temp);
1052     tcg_temp_free(temp2);
1053 }
1054 
1055 static inline void
1056 gen_maddsur32s_h(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n, uint32_t mode)
1057 {
1058     TCGv temp = tcg_const_i32(n);
1059     TCGv temp2 = tcg_temp_new();
1060     TCGv_i64 temp64 = tcg_temp_new_i64();
1061     switch (mode) {
1062     case MODE_LL:
1063         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
1064         break;
1065     case MODE_LU:
1066         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
1067         break;
1068     case MODE_UL:
1069         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
1070         break;
1071     case MODE_UU:
1072         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
1073         break;
1074     }
1075     tcg_gen_andi_tl(temp2, r1, 0xffff0000);
1076     tcg_gen_shli_tl(temp, r1, 16);
1077     gen_helper_addsur_h_ssov(ret, cpu_env, temp64, temp, temp2);
1078 
1079     tcg_temp_free(temp);
1080     tcg_temp_free(temp2);
1081     tcg_temp_free_i64(temp64);
1082 }
1083 
1084 static inline void
1085 gen_maddr_q(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n)
1086 {
1087     TCGv temp = tcg_const_i32(n);
1088     gen_helper_maddr_q(ret, cpu_env, r1, r2, r3, temp);
1089     tcg_temp_free(temp);
1090 }
1091 
1092 static inline void
1093 gen_maddrs_q(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n)
1094 {
1095     TCGv temp = tcg_const_i32(n);
1096     gen_helper_maddr_q_ssov(ret, cpu_env, r1, r2, r3, temp);
1097     tcg_temp_free(temp);
1098 }
1099 
1100 static inline void
1101 gen_madd32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n,
1102              uint32_t up_shift)
1103 {
1104     TCGv temp = tcg_temp_new();
1105     TCGv temp2 = tcg_temp_new();
1106     TCGv temp3 = tcg_temp_new();
1107     TCGv_i64 t1 = tcg_temp_new_i64();
1108     TCGv_i64 t2 = tcg_temp_new_i64();
1109     TCGv_i64 t3 = tcg_temp_new_i64();
1110 
1111     tcg_gen_ext_i32_i64(t2, arg2);
1112     tcg_gen_ext_i32_i64(t3, arg3);
1113 
1114     tcg_gen_mul_i64(t2, t2, t3);
1115     tcg_gen_shli_i64(t2, t2, n);
1116 
1117     tcg_gen_ext_i32_i64(t1, arg1);
1118     tcg_gen_sari_i64(t2, t2, up_shift);
1119 
1120     tcg_gen_add_i64(t3, t1, t2);
1121     tcg_gen_extrl_i64_i32(temp3, t3);
1122     /* calc v bit */
1123     tcg_gen_setcondi_i64(TCG_COND_GT, t1, t3, 0x7fffffffLL);
1124     tcg_gen_setcondi_i64(TCG_COND_LT, t2, t3, -0x80000000LL);
1125     tcg_gen_or_i64(t1, t1, t2);
1126     tcg_gen_extrl_i64_i32(cpu_PSW_V, t1);
1127     tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
1128     /* We produce an overflow on the host if the mul before was
1129        (0x80000000 * 0x80000000) << 1). If this is the
1130        case, we negate the ovf. */
1131     if (n == 1) {
1132         tcg_gen_setcondi_tl(TCG_COND_EQ, temp, arg2, 0x80000000);
1133         tcg_gen_setcond_tl(TCG_COND_EQ, temp2, arg2, arg3);
1134         tcg_gen_and_tl(temp, temp, temp2);
1135         tcg_gen_shli_tl(temp, temp, 31);
1136         /* negate v bit, if special condition */
1137         tcg_gen_xor_tl(cpu_PSW_V, cpu_PSW_V, temp);
1138     }
1139     /* Calc SV bit */
1140     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1141     /* Calc AV/SAV bits */
1142     tcg_gen_add_tl(cpu_PSW_AV, temp3, temp3);
1143     tcg_gen_xor_tl(cpu_PSW_AV, temp3, cpu_PSW_AV);
1144     /* calc SAV */
1145     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1146     /* write back result */
1147     tcg_gen_mov_tl(ret, temp3);
1148 
1149     tcg_temp_free(temp);
1150     tcg_temp_free(temp2);
1151     tcg_temp_free(temp3);
1152     tcg_temp_free_i64(t1);
1153     tcg_temp_free_i64(t2);
1154     tcg_temp_free_i64(t3);
1155 }
1156 
1157 static inline void
1158 gen_m16add32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n)
1159 {
1160     TCGv temp = tcg_temp_new();
1161     TCGv temp2 = tcg_temp_new();
1162     if (n == 0) {
1163         tcg_gen_mul_tl(temp, arg2, arg3);
1164     } else { /* n is expected to be 1 */
1165         tcg_gen_mul_tl(temp, arg2, arg3);
1166         tcg_gen_shli_tl(temp, temp, 1);
1167         /* catch special case r1 = r2 = 0x8000 */
1168         tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, temp, 0x80000000);
1169         tcg_gen_sub_tl(temp, temp, temp2);
1170     }
1171     gen_add_d(ret, arg1, temp);
1172 
1173     tcg_temp_free(temp);
1174     tcg_temp_free(temp2);
1175 }
1176 
1177 static inline void
1178 gen_m16adds32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n)
1179 {
1180     TCGv temp = tcg_temp_new();
1181     TCGv temp2 = tcg_temp_new();
1182     if (n == 0) {
1183         tcg_gen_mul_tl(temp, arg2, arg3);
1184     } else { /* n is expected to be 1 */
1185         tcg_gen_mul_tl(temp, arg2, arg3);
1186         tcg_gen_shli_tl(temp, temp, 1);
1187         /* catch special case r1 = r2 = 0x8000 */
1188         tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, temp, 0x80000000);
1189         tcg_gen_sub_tl(temp, temp, temp2);
1190     }
1191     gen_adds(ret, arg1, temp);
1192 
1193     tcg_temp_free(temp);
1194     tcg_temp_free(temp2);
1195 }
1196 
1197 static inline void
1198 gen_m16add64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2,
1199                TCGv arg3, uint32_t n)
1200 {
1201     TCGv temp = tcg_temp_new();
1202     TCGv temp2 = tcg_temp_new();
1203     TCGv_i64 t1 = tcg_temp_new_i64();
1204     TCGv_i64 t2 = tcg_temp_new_i64();
1205     TCGv_i64 t3 = tcg_temp_new_i64();
1206 
1207     if (n == 0) {
1208         tcg_gen_mul_tl(temp, arg2, arg3);
1209     } else { /* n is expected to be 1 */
1210         tcg_gen_mul_tl(temp, arg2, arg3);
1211         tcg_gen_shli_tl(temp, temp, 1);
1212         /* catch special case r1 = r2 = 0x8000 */
1213         tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, temp, 0x80000000);
1214         tcg_gen_sub_tl(temp, temp, temp2);
1215     }
1216     tcg_gen_ext_i32_i64(t2, temp);
1217     tcg_gen_shli_i64(t2, t2, 16);
1218     tcg_gen_concat_i32_i64(t1, arg1_low, arg1_high);
1219     gen_add64_d(t3, t1, t2);
1220     /* write back result */
1221     tcg_gen_extr_i64_i32(rl, rh, t3);
1222 
1223     tcg_temp_free_i64(t1);
1224     tcg_temp_free_i64(t2);
1225     tcg_temp_free_i64(t3);
1226     tcg_temp_free(temp);
1227     tcg_temp_free(temp2);
1228 }
1229 
1230 static inline void
1231 gen_m16adds64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2,
1232                TCGv arg3, uint32_t n)
1233 {
1234     TCGv temp = tcg_temp_new();
1235     TCGv temp2 = tcg_temp_new();
1236     TCGv_i64 t1 = tcg_temp_new_i64();
1237     TCGv_i64 t2 = tcg_temp_new_i64();
1238 
1239     if (n == 0) {
1240         tcg_gen_mul_tl(temp, arg2, arg3);
1241     } else { /* n is expected to be 1 */
1242         tcg_gen_mul_tl(temp, arg2, arg3);
1243         tcg_gen_shli_tl(temp, temp, 1);
1244         /* catch special case r1 = r2 = 0x8000 */
1245         tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, temp, 0x80000000);
1246         tcg_gen_sub_tl(temp, temp, temp2);
1247     }
1248     tcg_gen_ext_i32_i64(t2, temp);
1249     tcg_gen_shli_i64(t2, t2, 16);
1250     tcg_gen_concat_i32_i64(t1, arg1_low, arg1_high);
1251 
1252     gen_helper_add64_ssov(t1, cpu_env, t1, t2);
1253     tcg_gen_extr_i64_i32(rl, rh, t1);
1254 
1255     tcg_temp_free(temp);
1256     tcg_temp_free(temp2);
1257     tcg_temp_free_i64(t1);
1258     tcg_temp_free_i64(t2);
1259 }
1260 
1261 static inline void
1262 gen_madd64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2,
1263              TCGv arg3, uint32_t n)
1264 {
1265     TCGv_i64 t1 = tcg_temp_new_i64();
1266     TCGv_i64 t2 = tcg_temp_new_i64();
1267     TCGv_i64 t3 = tcg_temp_new_i64();
1268     TCGv_i64 t4 = tcg_temp_new_i64();
1269     TCGv temp, temp2;
1270 
1271     tcg_gen_concat_i32_i64(t1, arg1_low, arg1_high);
1272     tcg_gen_ext_i32_i64(t2, arg2);
1273     tcg_gen_ext_i32_i64(t3, arg3);
1274 
1275     tcg_gen_mul_i64(t2, t2, t3);
1276     if (n != 0) {
1277         tcg_gen_shli_i64(t2, t2, 1);
1278     }
1279     tcg_gen_add_i64(t4, t1, t2);
1280     /* calc v bit */
1281     tcg_gen_xor_i64(t3, t4, t1);
1282     tcg_gen_xor_i64(t2, t1, t2);
1283     tcg_gen_andc_i64(t3, t3, t2);
1284     tcg_gen_extrh_i64_i32(cpu_PSW_V, t3);
1285     /* We produce an overflow on the host if the mul before was
1286        (0x80000000 * 0x80000000) << 1). If this is the
1287        case, we negate the ovf. */
1288     if (n == 1) {
1289         temp = tcg_temp_new();
1290         temp2 = tcg_temp_new();
1291         tcg_gen_setcondi_tl(TCG_COND_EQ, temp, arg2, 0x80000000);
1292         tcg_gen_setcond_tl(TCG_COND_EQ, temp2, arg2, arg3);
1293         tcg_gen_and_tl(temp, temp, temp2);
1294         tcg_gen_shli_tl(temp, temp, 31);
1295         /* negate v bit, if special condition */
1296         tcg_gen_xor_tl(cpu_PSW_V, cpu_PSW_V, temp);
1297 
1298         tcg_temp_free(temp);
1299         tcg_temp_free(temp2);
1300     }
1301     /* write back result */
1302     tcg_gen_extr_i64_i32(rl, rh, t4);
1303     /* Calc SV bit */
1304     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1305     /* Calc AV/SAV bits */
1306     tcg_gen_add_tl(cpu_PSW_AV, rh, rh);
1307     tcg_gen_xor_tl(cpu_PSW_AV, rh, cpu_PSW_AV);
1308     /* calc SAV */
1309     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1310 
1311     tcg_temp_free_i64(t1);
1312     tcg_temp_free_i64(t2);
1313     tcg_temp_free_i64(t3);
1314     tcg_temp_free_i64(t4);
1315 }
1316 
1317 static inline void
1318 gen_madds32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n,
1319               uint32_t up_shift)
1320 {
1321     TCGv_i64 t1 = tcg_temp_new_i64();
1322     TCGv_i64 t2 = tcg_temp_new_i64();
1323     TCGv_i64 t3 = tcg_temp_new_i64();
1324 
1325     tcg_gen_ext_i32_i64(t1, arg1);
1326     tcg_gen_ext_i32_i64(t2, arg2);
1327     tcg_gen_ext_i32_i64(t3, arg3);
1328 
1329     tcg_gen_mul_i64(t2, t2, t3);
1330     tcg_gen_sari_i64(t2, t2, up_shift - n);
1331 
1332     gen_helper_madd32_q_add_ssov(ret, cpu_env, t1, t2);
1333 
1334     tcg_temp_free_i64(t1);
1335     tcg_temp_free_i64(t2);
1336     tcg_temp_free_i64(t3);
1337 }
1338 
1339 static inline void
1340 gen_madds64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2,
1341              TCGv arg3, uint32_t n)
1342 {
1343     TCGv_i64 r1 = tcg_temp_new_i64();
1344     TCGv temp = tcg_const_i32(n);
1345 
1346     tcg_gen_concat_i32_i64(r1, arg1_low, arg1_high);
1347     gen_helper_madd64_q_ssov(r1, cpu_env, r1, arg2, arg3, temp);
1348     tcg_gen_extr_i64_i32(rl, rh, r1);
1349 
1350     tcg_temp_free_i64(r1);
1351     tcg_temp_free(temp);
1352 }
1353 /* ret = r2 - (r1 * r3); */
1354 static inline void gen_msub32_d(TCGv ret, TCGv r1, TCGv r2, TCGv r3)
1355 {
1356     TCGv_i64 t1 = tcg_temp_new_i64();
1357     TCGv_i64 t2 = tcg_temp_new_i64();
1358     TCGv_i64 t3 = tcg_temp_new_i64();
1359 
1360     tcg_gen_ext_i32_i64(t1, r1);
1361     tcg_gen_ext_i32_i64(t2, r2);
1362     tcg_gen_ext_i32_i64(t3, r3);
1363 
1364     tcg_gen_mul_i64(t1, t1, t3);
1365     tcg_gen_sub_i64(t1, t2, t1);
1366 
1367     tcg_gen_extrl_i64_i32(ret, t1);
1368     /* calc V
1369        t2 > 0x7fffffff */
1370     tcg_gen_setcondi_i64(TCG_COND_GT, t3, t1, 0x7fffffffLL);
1371     /* result < -0x80000000 */
1372     tcg_gen_setcondi_i64(TCG_COND_LT, t2, t1, -0x80000000LL);
1373     tcg_gen_or_i64(t2, t2, t3);
1374     tcg_gen_extrl_i64_i32(cpu_PSW_V, t2);
1375     tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
1376 
1377     /* Calc SV bit */
1378     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1379     /* Calc AV/SAV bits */
1380     tcg_gen_add_tl(cpu_PSW_AV, ret, ret);
1381     tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV);
1382     /* calc SAV */
1383     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1384 
1385     tcg_temp_free_i64(t1);
1386     tcg_temp_free_i64(t2);
1387     tcg_temp_free_i64(t3);
1388 }
1389 
1390 static inline void gen_msubi32_d(TCGv ret, TCGv r1, TCGv r2, int32_t con)
1391 {
1392     TCGv temp = tcg_const_i32(con);
1393     gen_msub32_d(ret, r1, r2, temp);
1394     tcg_temp_free(temp);
1395 }
1396 
1397 static inline void
1398 gen_msub64_d(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high,
1399              TCGv r3)
1400 {
1401     TCGv t1 = tcg_temp_new();
1402     TCGv t2 = tcg_temp_new();
1403     TCGv t3 = tcg_temp_new();
1404     TCGv t4 = tcg_temp_new();
1405 
1406     tcg_gen_muls2_tl(t1, t2, r1, r3);
1407     /* only the sub can overflow */
1408     tcg_gen_sub2_tl(t3, t4, r2_low, r2_high, t1, t2);
1409     /* calc V bit */
1410     tcg_gen_xor_tl(cpu_PSW_V, t4, r2_high);
1411     tcg_gen_xor_tl(t1, r2_high, t2);
1412     tcg_gen_and_tl(cpu_PSW_V, cpu_PSW_V, t1);
1413     /* Calc SV bit */
1414     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1415     /* Calc AV/SAV bits */
1416     tcg_gen_add_tl(cpu_PSW_AV, t4, t4);
1417     tcg_gen_xor_tl(cpu_PSW_AV, t4, cpu_PSW_AV);
1418     /* calc SAV */
1419     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1420     /* write back the result */
1421     tcg_gen_mov_tl(ret_low, t3);
1422     tcg_gen_mov_tl(ret_high, t4);
1423 
1424     tcg_temp_free(t1);
1425     tcg_temp_free(t2);
1426     tcg_temp_free(t3);
1427     tcg_temp_free(t4);
1428 }
1429 
1430 static inline void
1431 gen_msubi64_d(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high,
1432               int32_t con)
1433 {
1434     TCGv temp = tcg_const_i32(con);
1435     gen_msub64_d(ret_low, ret_high, r1, r2_low, r2_high, temp);
1436     tcg_temp_free(temp);
1437 }
1438 
1439 static inline void
1440 gen_msubu64_d(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high,
1441               TCGv r3)
1442 {
1443     TCGv_i64 t1 = tcg_temp_new_i64();
1444     TCGv_i64 t2 = tcg_temp_new_i64();
1445     TCGv_i64 t3 = tcg_temp_new_i64();
1446 
1447     tcg_gen_extu_i32_i64(t1, r1);
1448     tcg_gen_concat_i32_i64(t2, r2_low, r2_high);
1449     tcg_gen_extu_i32_i64(t3, r3);
1450 
1451     tcg_gen_mul_i64(t1, t1, t3);
1452     tcg_gen_sub_i64(t3, t2, t1);
1453     tcg_gen_extr_i64_i32(ret_low, ret_high, t3);
1454     /* calc V bit, only the sub can overflow, if t1 > t2 */
1455     tcg_gen_setcond_i64(TCG_COND_GTU, t1, t1, t2);
1456     tcg_gen_extrl_i64_i32(cpu_PSW_V, t1);
1457     tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
1458     /* Calc SV bit */
1459     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1460     /* Calc AV/SAV bits */
1461     tcg_gen_add_tl(cpu_PSW_AV, ret_high, ret_high);
1462     tcg_gen_xor_tl(cpu_PSW_AV, ret_high, cpu_PSW_AV);
1463     /* calc SAV */
1464     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1465 
1466     tcg_temp_free_i64(t1);
1467     tcg_temp_free_i64(t2);
1468     tcg_temp_free_i64(t3);
1469 }
1470 
1471 static inline void
1472 gen_msubui64_d(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high,
1473                int32_t con)
1474 {
1475     TCGv temp = tcg_const_i32(con);
1476     gen_msubu64_d(ret_low, ret_high, r1, r2_low, r2_high, temp);
1477     tcg_temp_free(temp);
1478 }
1479 
1480 static inline void gen_addi_d(TCGv ret, TCGv r1, target_ulong r2)
1481 {
1482     TCGv temp = tcg_const_i32(r2);
1483     gen_add_d(ret, r1, temp);
1484     tcg_temp_free(temp);
1485 }
1486 /* calculate the carry bit too */
1487 static inline void gen_add_CC(TCGv ret, TCGv r1, TCGv r2)
1488 {
1489     TCGv t0    = tcg_temp_new_i32();
1490     TCGv result = tcg_temp_new_i32();
1491 
1492     tcg_gen_movi_tl(t0, 0);
1493     /* Addition and set C/V/SV bits */
1494     tcg_gen_add2_i32(result, cpu_PSW_C, r1, t0, r2, t0);
1495     /* calc V bit */
1496     tcg_gen_xor_tl(cpu_PSW_V, result, r1);
1497     tcg_gen_xor_tl(t0, r1, r2);
1498     tcg_gen_andc_tl(cpu_PSW_V, cpu_PSW_V, t0);
1499     /* Calc SV bit */
1500     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1501     /* Calc AV/SAV bits */
1502     tcg_gen_add_tl(cpu_PSW_AV, result, result);
1503     tcg_gen_xor_tl(cpu_PSW_AV, result, cpu_PSW_AV);
1504     /* calc SAV */
1505     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1506     /* write back result */
1507     tcg_gen_mov_tl(ret, result);
1508 
1509     tcg_temp_free(result);
1510     tcg_temp_free(t0);
1511 }
1512 
1513 static inline void gen_addi_CC(TCGv ret, TCGv r1, int32_t con)
1514 {
1515     TCGv temp = tcg_const_i32(con);
1516     gen_add_CC(ret, r1, temp);
1517     tcg_temp_free(temp);
1518 }
1519 
1520 static inline void gen_addc_CC(TCGv ret, TCGv r1, TCGv r2)
1521 {
1522     TCGv carry = tcg_temp_new_i32();
1523     TCGv t0    = tcg_temp_new_i32();
1524     TCGv result = tcg_temp_new_i32();
1525 
1526     tcg_gen_movi_tl(t0, 0);
1527     tcg_gen_setcondi_tl(TCG_COND_NE, carry, cpu_PSW_C, 0);
1528     /* Addition, carry and set C/V/SV bits */
1529     tcg_gen_add2_i32(result, cpu_PSW_C, r1, t0, carry, t0);
1530     tcg_gen_add2_i32(result, cpu_PSW_C, result, cpu_PSW_C, r2, t0);
1531     /* calc V bit */
1532     tcg_gen_xor_tl(cpu_PSW_V, result, r1);
1533     tcg_gen_xor_tl(t0, r1, r2);
1534     tcg_gen_andc_tl(cpu_PSW_V, cpu_PSW_V, t0);
1535     /* Calc SV bit */
1536     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1537     /* Calc AV/SAV bits */
1538     tcg_gen_add_tl(cpu_PSW_AV, result, result);
1539     tcg_gen_xor_tl(cpu_PSW_AV, result, cpu_PSW_AV);
1540     /* calc SAV */
1541     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1542     /* write back result */
1543     tcg_gen_mov_tl(ret, result);
1544 
1545     tcg_temp_free(result);
1546     tcg_temp_free(t0);
1547     tcg_temp_free(carry);
1548 }
1549 
1550 static inline void gen_addci_CC(TCGv ret, TCGv r1, int32_t con)
1551 {
1552     TCGv temp = tcg_const_i32(con);
1553     gen_addc_CC(ret, r1, temp);
1554     tcg_temp_free(temp);
1555 }
1556 
1557 static inline void gen_cond_add(TCGCond cond, TCGv r1, TCGv r2, TCGv r3,
1558                                 TCGv r4)
1559 {
1560     TCGv temp = tcg_temp_new();
1561     TCGv temp2 = tcg_temp_new();
1562     TCGv result = tcg_temp_new();
1563     TCGv mask = tcg_temp_new();
1564     TCGv t0 = tcg_const_i32(0);
1565 
1566     /* create mask for sticky bits */
1567     tcg_gen_setcond_tl(cond, mask, r4, t0);
1568     tcg_gen_shli_tl(mask, mask, 31);
1569 
1570     tcg_gen_add_tl(result, r1, r2);
1571     /* Calc PSW_V */
1572     tcg_gen_xor_tl(temp, result, r1);
1573     tcg_gen_xor_tl(temp2, r1, r2);
1574     tcg_gen_andc_tl(temp, temp, temp2);
1575     tcg_gen_movcond_tl(cond, cpu_PSW_V, r4, t0, temp, cpu_PSW_V);
1576     /* Set PSW_SV */
1577     tcg_gen_and_tl(temp, temp, mask);
1578     tcg_gen_or_tl(cpu_PSW_SV, temp, cpu_PSW_SV);
1579     /* calc AV bit */
1580     tcg_gen_add_tl(temp, result, result);
1581     tcg_gen_xor_tl(temp, temp, result);
1582     tcg_gen_movcond_tl(cond, cpu_PSW_AV, r4, t0, temp, cpu_PSW_AV);
1583     /* calc SAV bit */
1584     tcg_gen_and_tl(temp, temp, mask);
1585     tcg_gen_or_tl(cpu_PSW_SAV, temp, cpu_PSW_SAV);
1586     /* write back result */
1587     tcg_gen_movcond_tl(cond, r3, r4, t0, result, r1);
1588 
1589     tcg_temp_free(t0);
1590     tcg_temp_free(temp);
1591     tcg_temp_free(temp2);
1592     tcg_temp_free(result);
1593     tcg_temp_free(mask);
1594 }
1595 
1596 static inline void gen_condi_add(TCGCond cond, TCGv r1, int32_t r2,
1597                                  TCGv r3, TCGv r4)
1598 {
1599     TCGv temp = tcg_const_i32(r2);
1600     gen_cond_add(cond, r1, temp, r3, r4);
1601     tcg_temp_free(temp);
1602 }
1603 
1604 static inline void gen_sub_d(TCGv ret, TCGv r1, TCGv r2)
1605 {
1606     TCGv temp = tcg_temp_new_i32();
1607     TCGv result = tcg_temp_new_i32();
1608 
1609     tcg_gen_sub_tl(result, r1, r2);
1610     /* calc V bit */
1611     tcg_gen_xor_tl(cpu_PSW_V, result, r1);
1612     tcg_gen_xor_tl(temp, r1, r2);
1613     tcg_gen_and_tl(cpu_PSW_V, cpu_PSW_V, temp);
1614     /* calc SV bit */
1615     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1616     /* Calc AV bit */
1617     tcg_gen_add_tl(cpu_PSW_AV, result, result);
1618     tcg_gen_xor_tl(cpu_PSW_AV, result, cpu_PSW_AV);
1619     /* calc SAV bit */
1620     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1621     /* write back result */
1622     tcg_gen_mov_tl(ret, result);
1623 
1624     tcg_temp_free(temp);
1625     tcg_temp_free(result);
1626 }
1627 
1628 static inline void
1629 gen_sub64_d(TCGv_i64 ret, TCGv_i64 r1, TCGv_i64 r2)
1630 {
1631     TCGv temp = tcg_temp_new();
1632     TCGv_i64 t0 = tcg_temp_new_i64();
1633     TCGv_i64 t1 = tcg_temp_new_i64();
1634     TCGv_i64 result = tcg_temp_new_i64();
1635 
1636     tcg_gen_sub_i64(result, r1, r2);
1637     /* calc v bit */
1638     tcg_gen_xor_i64(t1, result, r1);
1639     tcg_gen_xor_i64(t0, r1, r2);
1640     tcg_gen_and_i64(t1, t1, t0);
1641     tcg_gen_extrh_i64_i32(cpu_PSW_V, t1);
1642     /* calc SV bit */
1643     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1644     /* calc AV/SAV bits */
1645     tcg_gen_extrh_i64_i32(temp, result);
1646     tcg_gen_add_tl(cpu_PSW_AV, temp, temp);
1647     tcg_gen_xor_tl(cpu_PSW_AV, temp, cpu_PSW_AV);
1648     /* calc SAV */
1649     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1650     /* write back result */
1651     tcg_gen_mov_i64(ret, result);
1652 
1653     tcg_temp_free(temp);
1654     tcg_temp_free_i64(result);
1655     tcg_temp_free_i64(t0);
1656     tcg_temp_free_i64(t1);
1657 }
1658 
1659 static inline void gen_sub_CC(TCGv ret, TCGv r1, TCGv r2)
1660 {
1661     TCGv result = tcg_temp_new();
1662     TCGv temp = tcg_temp_new();
1663 
1664     tcg_gen_sub_tl(result, r1, r2);
1665     /* calc C bit */
1666     tcg_gen_setcond_tl(TCG_COND_GEU, cpu_PSW_C, r1, r2);
1667     /* calc V bit */
1668     tcg_gen_xor_tl(cpu_PSW_V, result, r1);
1669     tcg_gen_xor_tl(temp, r1, r2);
1670     tcg_gen_and_tl(cpu_PSW_V, cpu_PSW_V, temp);
1671     /* calc SV bit */
1672     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1673     /* Calc AV bit */
1674     tcg_gen_add_tl(cpu_PSW_AV, result, result);
1675     tcg_gen_xor_tl(cpu_PSW_AV, result, cpu_PSW_AV);
1676     /* calc SAV bit */
1677     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1678     /* write back result */
1679     tcg_gen_mov_tl(ret, result);
1680 
1681     tcg_temp_free(result);
1682     tcg_temp_free(temp);
1683 }
1684 
1685 static inline void gen_subc_CC(TCGv ret, TCGv r1, TCGv r2)
1686 {
1687     TCGv temp = tcg_temp_new();
1688     tcg_gen_not_tl(temp, r2);
1689     gen_addc_CC(ret, r1, temp);
1690     tcg_temp_free(temp);
1691 }
1692 
1693 static inline void gen_cond_sub(TCGCond cond, TCGv r1, TCGv r2, TCGv r3,
1694                                 TCGv r4)
1695 {
1696     TCGv temp = tcg_temp_new();
1697     TCGv temp2 = tcg_temp_new();
1698     TCGv result = tcg_temp_new();
1699     TCGv mask = tcg_temp_new();
1700     TCGv t0 = tcg_const_i32(0);
1701 
1702     /* create mask for sticky bits */
1703     tcg_gen_setcond_tl(cond, mask, r4, t0);
1704     tcg_gen_shli_tl(mask, mask, 31);
1705 
1706     tcg_gen_sub_tl(result, r1, r2);
1707     /* Calc PSW_V */
1708     tcg_gen_xor_tl(temp, result, r1);
1709     tcg_gen_xor_tl(temp2, r1, r2);
1710     tcg_gen_and_tl(temp, temp, temp2);
1711     tcg_gen_movcond_tl(cond, cpu_PSW_V, r4, t0, temp, cpu_PSW_V);
1712     /* Set PSW_SV */
1713     tcg_gen_and_tl(temp, temp, mask);
1714     tcg_gen_or_tl(cpu_PSW_SV, temp, cpu_PSW_SV);
1715     /* calc AV bit */
1716     tcg_gen_add_tl(temp, result, result);
1717     tcg_gen_xor_tl(temp, temp, result);
1718     tcg_gen_movcond_tl(cond, cpu_PSW_AV, r4, t0, temp, cpu_PSW_AV);
1719     /* calc SAV bit */
1720     tcg_gen_and_tl(temp, temp, mask);
1721     tcg_gen_or_tl(cpu_PSW_SAV, temp, cpu_PSW_SAV);
1722     /* write back result */
1723     tcg_gen_movcond_tl(cond, r3, r4, t0, result, r1);
1724 
1725     tcg_temp_free(t0);
1726     tcg_temp_free(temp);
1727     tcg_temp_free(temp2);
1728     tcg_temp_free(result);
1729     tcg_temp_free(mask);
1730 }
1731 
1732 static inline void
1733 gen_msub_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
1734            TCGv r3, uint32_t n, uint32_t mode)
1735 {
1736     TCGv temp = tcg_const_i32(n);
1737     TCGv temp2 = tcg_temp_new();
1738     TCGv_i64 temp64 = tcg_temp_new_i64();
1739     switch (mode) {
1740     case MODE_LL:
1741         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
1742         break;
1743     case MODE_LU:
1744         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
1745         break;
1746     case MODE_UL:
1747         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
1748         break;
1749     case MODE_UU:
1750         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
1751         break;
1752     }
1753     tcg_gen_extr_i64_i32(temp, temp2, temp64);
1754     gen_addsub64_h(ret_low, ret_high, r1_low, r1_high, temp, temp2,
1755                    tcg_gen_sub_tl, tcg_gen_sub_tl);
1756     tcg_temp_free(temp);
1757     tcg_temp_free(temp2);
1758     tcg_temp_free_i64(temp64);
1759 }
1760 
1761 static inline void
1762 gen_msubs_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
1763             TCGv r3, uint32_t n, uint32_t mode)
1764 {
1765     TCGv temp = tcg_const_i32(n);
1766     TCGv temp2 = tcg_temp_new();
1767     TCGv temp3 = tcg_temp_new();
1768     TCGv_i64 temp64 = tcg_temp_new_i64();
1769 
1770     switch (mode) {
1771     case MODE_LL:
1772         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
1773         break;
1774     case MODE_LU:
1775         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
1776         break;
1777     case MODE_UL:
1778         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
1779         break;
1780     case MODE_UU:
1781         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
1782         break;
1783     }
1784     tcg_gen_extr_i64_i32(temp, temp2, temp64);
1785     gen_subs(ret_low, r1_low, temp);
1786     tcg_gen_mov_tl(temp, cpu_PSW_V);
1787     tcg_gen_mov_tl(temp3, cpu_PSW_AV);
1788     gen_subs(ret_high, r1_high, temp2);
1789     /* combine v bits */
1790     tcg_gen_or_tl(cpu_PSW_V, cpu_PSW_V, temp);
1791     /* combine av bits */
1792     tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp3);
1793 
1794     tcg_temp_free(temp);
1795     tcg_temp_free(temp2);
1796     tcg_temp_free(temp3);
1797     tcg_temp_free_i64(temp64);
1798 }
1799 
1800 static inline void
1801 gen_msubm_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
1802             TCGv r3, uint32_t n, uint32_t mode)
1803 {
1804     TCGv temp = tcg_const_i32(n);
1805     TCGv_i64 temp64 = tcg_temp_new_i64();
1806     TCGv_i64 temp64_2 = tcg_temp_new_i64();
1807     TCGv_i64 temp64_3 = tcg_temp_new_i64();
1808     switch (mode) {
1809     case MODE_LL:
1810         GEN_HELPER_LL(mulm_h, temp64, r2, r3, temp);
1811         break;
1812     case MODE_LU:
1813         GEN_HELPER_LU(mulm_h, temp64, r2, r3, temp);
1814         break;
1815     case MODE_UL:
1816         GEN_HELPER_UL(mulm_h, temp64, r2, r3, temp);
1817         break;
1818     case MODE_UU:
1819         GEN_HELPER_UU(mulm_h, temp64, r2, r3, temp);
1820         break;
1821     }
1822     tcg_gen_concat_i32_i64(temp64_2, r1_low, r1_high);
1823     gen_sub64_d(temp64_3, temp64_2, temp64);
1824     /* write back result */
1825     tcg_gen_extr_i64_i32(ret_low, ret_high, temp64_3);
1826 
1827     tcg_temp_free(temp);
1828     tcg_temp_free_i64(temp64);
1829     tcg_temp_free_i64(temp64_2);
1830     tcg_temp_free_i64(temp64_3);
1831 }
1832 
1833 static inline void
1834 gen_msubms_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
1835              TCGv r3, uint32_t n, uint32_t mode)
1836 {
1837     TCGv temp = tcg_const_i32(n);
1838     TCGv_i64 temp64 = tcg_temp_new_i64();
1839     TCGv_i64 temp64_2 = tcg_temp_new_i64();
1840     switch (mode) {
1841     case MODE_LL:
1842         GEN_HELPER_LL(mulm_h, temp64, r2, r3, temp);
1843         break;
1844     case MODE_LU:
1845         GEN_HELPER_LU(mulm_h, temp64, r2, r3, temp);
1846         break;
1847     case MODE_UL:
1848         GEN_HELPER_UL(mulm_h, temp64, r2, r3, temp);
1849         break;
1850     case MODE_UU:
1851         GEN_HELPER_UU(mulm_h, temp64, r2, r3, temp);
1852         break;
1853     }
1854     tcg_gen_concat_i32_i64(temp64_2, r1_low, r1_high);
1855     gen_helper_sub64_ssov(temp64, cpu_env, temp64_2, temp64);
1856     tcg_gen_extr_i64_i32(ret_low, ret_high, temp64);
1857 
1858     tcg_temp_free(temp);
1859     tcg_temp_free_i64(temp64);
1860     tcg_temp_free_i64(temp64_2);
1861 }
1862 
1863 static inline void
1864 gen_msubr64_h(TCGv ret, TCGv r1_low, TCGv r1_high, TCGv r2, TCGv r3, uint32_t n,
1865               uint32_t mode)
1866 {
1867     TCGv temp = tcg_const_i32(n);
1868     TCGv_i64 temp64 = tcg_temp_new_i64();
1869     switch (mode) {
1870     case MODE_LL:
1871         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
1872         break;
1873     case MODE_LU:
1874         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
1875         break;
1876     case MODE_UL:
1877         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
1878         break;
1879     case MODE_UU:
1880         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
1881         break;
1882     }
1883     gen_helper_subr_h(ret, cpu_env, temp64, r1_low, r1_high);
1884 
1885     tcg_temp_free(temp);
1886     tcg_temp_free_i64(temp64);
1887 }
1888 
1889 static inline void
1890 gen_msubr32_h(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n, uint32_t mode)
1891 {
1892     TCGv temp = tcg_temp_new();
1893     TCGv temp2 = tcg_temp_new();
1894 
1895     tcg_gen_andi_tl(temp2, r1, 0xffff0000);
1896     tcg_gen_shli_tl(temp, r1, 16);
1897     gen_msubr64_h(ret, temp, temp2, r2, r3, n, mode);
1898 
1899     tcg_temp_free(temp);
1900     tcg_temp_free(temp2);
1901 }
1902 
1903 static inline void
1904 gen_msubr64s_h(TCGv ret, TCGv r1_low, TCGv r1_high, TCGv r2, TCGv r3,
1905                uint32_t n, uint32_t mode)
1906 {
1907     TCGv temp = tcg_const_i32(n);
1908     TCGv_i64 temp64 = tcg_temp_new_i64();
1909     switch (mode) {
1910     case MODE_LL:
1911         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
1912         break;
1913     case MODE_LU:
1914         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
1915         break;
1916     case MODE_UL:
1917         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
1918         break;
1919     case MODE_UU:
1920         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
1921         break;
1922     }
1923     gen_helper_subr_h_ssov(ret, cpu_env, temp64, r1_low, r1_high);
1924 
1925     tcg_temp_free(temp);
1926     tcg_temp_free_i64(temp64);
1927 }
1928 
1929 static inline void
1930 gen_msubr32s_h(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n, uint32_t mode)
1931 {
1932     TCGv temp = tcg_temp_new();
1933     TCGv temp2 = tcg_temp_new();
1934 
1935     tcg_gen_andi_tl(temp2, r1, 0xffff0000);
1936     tcg_gen_shli_tl(temp, r1, 16);
1937     gen_msubr64s_h(ret, temp, temp2, r2, r3, n, mode);
1938 
1939     tcg_temp_free(temp);
1940     tcg_temp_free(temp2);
1941 }
1942 
1943 static inline void
1944 gen_msubr_q(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n)
1945 {
1946     TCGv temp = tcg_const_i32(n);
1947     gen_helper_msubr_q(ret, cpu_env, r1, r2, r3, temp);
1948     tcg_temp_free(temp);
1949 }
1950 
1951 static inline void
1952 gen_msubrs_q(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n)
1953 {
1954     TCGv temp = tcg_const_i32(n);
1955     gen_helper_msubr_q_ssov(ret, cpu_env, r1, r2, r3, temp);
1956     tcg_temp_free(temp);
1957 }
1958 
1959 static inline void
1960 gen_msub32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n,
1961              uint32_t up_shift)
1962 {
1963     TCGv temp = tcg_temp_new();
1964     TCGv temp2 = tcg_temp_new();
1965     TCGv temp3 = tcg_temp_new();
1966     TCGv_i64 t1 = tcg_temp_new_i64();
1967     TCGv_i64 t2 = tcg_temp_new_i64();
1968     TCGv_i64 t3 = tcg_temp_new_i64();
1969     TCGv_i64 t4 = tcg_temp_new_i64();
1970 
1971     tcg_gen_ext_i32_i64(t2, arg2);
1972     tcg_gen_ext_i32_i64(t3, arg3);
1973 
1974     tcg_gen_mul_i64(t2, t2, t3);
1975 
1976     tcg_gen_ext_i32_i64(t1, arg1);
1977     /* if we shift part of the fraction out, we need to round up */
1978     tcg_gen_andi_i64(t4, t2, (1ll << (up_shift - n)) - 1);
1979     tcg_gen_setcondi_i64(TCG_COND_NE, t4, t4, 0);
1980     tcg_gen_sari_i64(t2, t2, up_shift - n);
1981     tcg_gen_add_i64(t2, t2, t4);
1982 
1983     tcg_gen_sub_i64(t3, t1, t2);
1984     tcg_gen_extrl_i64_i32(temp3, t3);
1985     /* calc v bit */
1986     tcg_gen_setcondi_i64(TCG_COND_GT, t1, t3, 0x7fffffffLL);
1987     tcg_gen_setcondi_i64(TCG_COND_LT, t2, t3, -0x80000000LL);
1988     tcg_gen_or_i64(t1, t1, t2);
1989     tcg_gen_extrl_i64_i32(cpu_PSW_V, t1);
1990     tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
1991     /* Calc SV bit */
1992     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1993     /* Calc AV/SAV bits */
1994     tcg_gen_add_tl(cpu_PSW_AV, temp3, temp3);
1995     tcg_gen_xor_tl(cpu_PSW_AV, temp3, cpu_PSW_AV);
1996     /* calc SAV */
1997     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1998     /* write back result */
1999     tcg_gen_mov_tl(ret, temp3);
2000 
2001     tcg_temp_free(temp);
2002     tcg_temp_free(temp2);
2003     tcg_temp_free(temp3);
2004     tcg_temp_free_i64(t1);
2005     tcg_temp_free_i64(t2);
2006     tcg_temp_free_i64(t3);
2007     tcg_temp_free_i64(t4);
2008 }
2009 
2010 static inline void
2011 gen_m16sub32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n)
2012 {
2013     TCGv temp = tcg_temp_new();
2014     TCGv temp2 = tcg_temp_new();
2015     if (n == 0) {
2016         tcg_gen_mul_tl(temp, arg2, arg3);
2017     } else { /* n is expected to be 1 */
2018         tcg_gen_mul_tl(temp, arg2, arg3);
2019         tcg_gen_shli_tl(temp, temp, 1);
2020         /* catch special case r1 = r2 = 0x8000 */
2021         tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, temp, 0x80000000);
2022         tcg_gen_sub_tl(temp, temp, temp2);
2023     }
2024     gen_sub_d(ret, arg1, temp);
2025 
2026     tcg_temp_free(temp);
2027     tcg_temp_free(temp2);
2028 }
2029 
2030 static inline void
2031 gen_m16subs32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n)
2032 {
2033     TCGv temp = tcg_temp_new();
2034     TCGv temp2 = tcg_temp_new();
2035     if (n == 0) {
2036         tcg_gen_mul_tl(temp, arg2, arg3);
2037     } else { /* n is expected to be 1 */
2038         tcg_gen_mul_tl(temp, arg2, arg3);
2039         tcg_gen_shli_tl(temp, temp, 1);
2040         /* catch special case r1 = r2 = 0x8000 */
2041         tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, temp, 0x80000000);
2042         tcg_gen_sub_tl(temp, temp, temp2);
2043     }
2044     gen_subs(ret, arg1, temp);
2045 
2046     tcg_temp_free(temp);
2047     tcg_temp_free(temp2);
2048 }
2049 
2050 static inline void
2051 gen_m16sub64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2,
2052                TCGv arg3, uint32_t n)
2053 {
2054     TCGv temp = tcg_temp_new();
2055     TCGv temp2 = tcg_temp_new();
2056     TCGv_i64 t1 = tcg_temp_new_i64();
2057     TCGv_i64 t2 = tcg_temp_new_i64();
2058     TCGv_i64 t3 = tcg_temp_new_i64();
2059 
2060     if (n == 0) {
2061         tcg_gen_mul_tl(temp, arg2, arg3);
2062     } else { /* n is expected to be 1 */
2063         tcg_gen_mul_tl(temp, arg2, arg3);
2064         tcg_gen_shli_tl(temp, temp, 1);
2065         /* catch special case r1 = r2 = 0x8000 */
2066         tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, temp, 0x80000000);
2067         tcg_gen_sub_tl(temp, temp, temp2);
2068     }
2069     tcg_gen_ext_i32_i64(t2, temp);
2070     tcg_gen_shli_i64(t2, t2, 16);
2071     tcg_gen_concat_i32_i64(t1, arg1_low, arg1_high);
2072     gen_sub64_d(t3, t1, t2);
2073     /* write back result */
2074     tcg_gen_extr_i64_i32(rl, rh, t3);
2075 
2076     tcg_temp_free_i64(t1);
2077     tcg_temp_free_i64(t2);
2078     tcg_temp_free_i64(t3);
2079     tcg_temp_free(temp);
2080     tcg_temp_free(temp2);
2081 }
2082 
2083 static inline void
2084 gen_m16subs64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2,
2085                TCGv arg3, uint32_t n)
2086 {
2087     TCGv temp = tcg_temp_new();
2088     TCGv temp2 = tcg_temp_new();
2089     TCGv_i64 t1 = tcg_temp_new_i64();
2090     TCGv_i64 t2 = tcg_temp_new_i64();
2091 
2092     if (n == 0) {
2093         tcg_gen_mul_tl(temp, arg2, arg3);
2094     } else { /* n is expected to be 1 */
2095         tcg_gen_mul_tl(temp, arg2, arg3);
2096         tcg_gen_shli_tl(temp, temp, 1);
2097         /* catch special case r1 = r2 = 0x8000 */
2098         tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, temp, 0x80000000);
2099         tcg_gen_sub_tl(temp, temp, temp2);
2100     }
2101     tcg_gen_ext_i32_i64(t2, temp);
2102     tcg_gen_shli_i64(t2, t2, 16);
2103     tcg_gen_concat_i32_i64(t1, arg1_low, arg1_high);
2104 
2105     gen_helper_sub64_ssov(t1, cpu_env, t1, t2);
2106     tcg_gen_extr_i64_i32(rl, rh, t1);
2107 
2108     tcg_temp_free(temp);
2109     tcg_temp_free(temp2);
2110     tcg_temp_free_i64(t1);
2111     tcg_temp_free_i64(t2);
2112 }
2113 
2114 static inline void
2115 gen_msub64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2,
2116              TCGv arg3, uint32_t n)
2117 {
2118     TCGv_i64 t1 = tcg_temp_new_i64();
2119     TCGv_i64 t2 = tcg_temp_new_i64();
2120     TCGv_i64 t3 = tcg_temp_new_i64();
2121     TCGv_i64 t4 = tcg_temp_new_i64();
2122     TCGv temp, temp2;
2123 
2124     tcg_gen_concat_i32_i64(t1, arg1_low, arg1_high);
2125     tcg_gen_ext_i32_i64(t2, arg2);
2126     tcg_gen_ext_i32_i64(t3, arg3);
2127 
2128     tcg_gen_mul_i64(t2, t2, t3);
2129     if (n != 0) {
2130         tcg_gen_shli_i64(t2, t2, 1);
2131     }
2132     tcg_gen_sub_i64(t4, t1, t2);
2133     /* calc v bit */
2134     tcg_gen_xor_i64(t3, t4, t1);
2135     tcg_gen_xor_i64(t2, t1, t2);
2136     tcg_gen_and_i64(t3, t3, t2);
2137     tcg_gen_extrh_i64_i32(cpu_PSW_V, t3);
2138     /* We produce an overflow on the host if the mul before was
2139        (0x80000000 * 0x80000000) << 1). If this is the
2140        case, we negate the ovf. */
2141     if (n == 1) {
2142         temp = tcg_temp_new();
2143         temp2 = tcg_temp_new();
2144         tcg_gen_setcondi_tl(TCG_COND_EQ, temp, arg2, 0x80000000);
2145         tcg_gen_setcond_tl(TCG_COND_EQ, temp2, arg2, arg3);
2146         tcg_gen_and_tl(temp, temp, temp2);
2147         tcg_gen_shli_tl(temp, temp, 31);
2148         /* negate v bit, if special condition */
2149         tcg_gen_xor_tl(cpu_PSW_V, cpu_PSW_V, temp);
2150 
2151         tcg_temp_free(temp);
2152         tcg_temp_free(temp2);
2153     }
2154     /* write back result */
2155     tcg_gen_extr_i64_i32(rl, rh, t4);
2156     /* Calc SV bit */
2157     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
2158     /* Calc AV/SAV bits */
2159     tcg_gen_add_tl(cpu_PSW_AV, rh, rh);
2160     tcg_gen_xor_tl(cpu_PSW_AV, rh, cpu_PSW_AV);
2161     /* calc SAV */
2162     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2163 
2164     tcg_temp_free_i64(t1);
2165     tcg_temp_free_i64(t2);
2166     tcg_temp_free_i64(t3);
2167     tcg_temp_free_i64(t4);
2168 }
2169 
2170 static inline void
2171 gen_msubs32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n,
2172               uint32_t up_shift)
2173 {
2174     TCGv_i64 t1 = tcg_temp_new_i64();
2175     TCGv_i64 t2 = tcg_temp_new_i64();
2176     TCGv_i64 t3 = tcg_temp_new_i64();
2177     TCGv_i64 t4 = tcg_temp_new_i64();
2178 
2179     tcg_gen_ext_i32_i64(t1, arg1);
2180     tcg_gen_ext_i32_i64(t2, arg2);
2181     tcg_gen_ext_i32_i64(t3, arg3);
2182 
2183     tcg_gen_mul_i64(t2, t2, t3);
2184     /* if we shift part of the fraction out, we need to round up */
2185     tcg_gen_andi_i64(t4, t2, (1ll << (up_shift - n)) - 1);
2186     tcg_gen_setcondi_i64(TCG_COND_NE, t4, t4, 0);
2187     tcg_gen_sari_i64(t3, t2, up_shift - n);
2188     tcg_gen_add_i64(t3, t3, t4);
2189 
2190     gen_helper_msub32_q_sub_ssov(ret, cpu_env, t1, t3);
2191 
2192     tcg_temp_free_i64(t1);
2193     tcg_temp_free_i64(t2);
2194     tcg_temp_free_i64(t3);
2195     tcg_temp_free_i64(t4);
2196 }
2197 
2198 static inline void
2199 gen_msubs64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2,
2200              TCGv arg3, uint32_t n)
2201 {
2202     TCGv_i64 r1 = tcg_temp_new_i64();
2203     TCGv temp = tcg_const_i32(n);
2204 
2205     tcg_gen_concat_i32_i64(r1, arg1_low, arg1_high);
2206     gen_helper_msub64_q_ssov(r1, cpu_env, r1, arg2, arg3, temp);
2207     tcg_gen_extr_i64_i32(rl, rh, r1);
2208 
2209     tcg_temp_free_i64(r1);
2210     tcg_temp_free(temp);
2211 }
2212 
2213 static inline void
2214 gen_msubad_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
2215              TCGv r3, uint32_t n, uint32_t mode)
2216 {
2217     TCGv temp = tcg_const_i32(n);
2218     TCGv temp2 = tcg_temp_new();
2219     TCGv_i64 temp64 = tcg_temp_new_i64();
2220     switch (mode) {
2221     case MODE_LL:
2222         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
2223         break;
2224     case MODE_LU:
2225         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
2226         break;
2227     case MODE_UL:
2228         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
2229         break;
2230     case MODE_UU:
2231         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
2232         break;
2233     }
2234     tcg_gen_extr_i64_i32(temp, temp2, temp64);
2235     gen_addsub64_h(ret_low, ret_high, r1_low, r1_high, temp, temp2,
2236                    tcg_gen_add_tl, tcg_gen_sub_tl);
2237     tcg_temp_free(temp);
2238     tcg_temp_free(temp2);
2239     tcg_temp_free_i64(temp64);
2240 }
2241 
2242 static inline void
2243 gen_msubadm_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
2244               TCGv r3, uint32_t n, uint32_t mode)
2245 {
2246     TCGv temp = tcg_const_i32(n);
2247     TCGv_i64 temp64 = tcg_temp_new_i64();
2248     TCGv_i64 temp64_2 = tcg_temp_new_i64();
2249     TCGv_i64 temp64_3 = tcg_temp_new_i64();
2250     switch (mode) {
2251     case MODE_LL:
2252         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
2253         break;
2254     case MODE_LU:
2255         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
2256         break;
2257     case MODE_UL:
2258         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
2259         break;
2260     case MODE_UU:
2261         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
2262         break;
2263     }
2264     tcg_gen_concat_i32_i64(temp64_3, r1_low, r1_high);
2265     tcg_gen_sari_i64(temp64_2, temp64, 32); /* high */
2266     tcg_gen_ext32s_i64(temp64, temp64); /* low */
2267     tcg_gen_sub_i64(temp64, temp64_2, temp64);
2268     tcg_gen_shli_i64(temp64, temp64, 16);
2269 
2270     gen_sub64_d(temp64_2, temp64_3, temp64);
2271     /* write back result */
2272     tcg_gen_extr_i64_i32(ret_low, ret_high, temp64_2);
2273 
2274     tcg_temp_free(temp);
2275     tcg_temp_free_i64(temp64);
2276     tcg_temp_free_i64(temp64_2);
2277     tcg_temp_free_i64(temp64_3);
2278 }
2279 
2280 static inline void
2281 gen_msubadr32_h(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n, uint32_t mode)
2282 {
2283     TCGv temp = tcg_const_i32(n);
2284     TCGv temp2 = tcg_temp_new();
2285     TCGv_i64 temp64 = tcg_temp_new_i64();
2286     switch (mode) {
2287     case MODE_LL:
2288         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
2289         break;
2290     case MODE_LU:
2291         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
2292         break;
2293     case MODE_UL:
2294         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
2295         break;
2296     case MODE_UU:
2297         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
2298         break;
2299     }
2300     tcg_gen_andi_tl(temp2, r1, 0xffff0000);
2301     tcg_gen_shli_tl(temp, r1, 16);
2302     gen_helper_subadr_h(ret, cpu_env, temp64, temp, temp2);
2303 
2304     tcg_temp_free(temp);
2305     tcg_temp_free(temp2);
2306     tcg_temp_free_i64(temp64);
2307 }
2308 
2309 static inline void
2310 gen_msubads_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
2311               TCGv r3, uint32_t n, uint32_t mode)
2312 {
2313     TCGv temp = tcg_const_i32(n);
2314     TCGv temp2 = tcg_temp_new();
2315     TCGv temp3 = tcg_temp_new();
2316     TCGv_i64 temp64 = tcg_temp_new_i64();
2317 
2318     switch (mode) {
2319     case MODE_LL:
2320         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
2321         break;
2322     case MODE_LU:
2323         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
2324         break;
2325     case MODE_UL:
2326         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
2327         break;
2328     case MODE_UU:
2329         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
2330         break;
2331     }
2332     tcg_gen_extr_i64_i32(temp, temp2, temp64);
2333     gen_adds(ret_low, r1_low, temp);
2334     tcg_gen_mov_tl(temp, cpu_PSW_V);
2335     tcg_gen_mov_tl(temp3, cpu_PSW_AV);
2336     gen_subs(ret_high, r1_high, temp2);
2337     /* combine v bits */
2338     tcg_gen_or_tl(cpu_PSW_V, cpu_PSW_V, temp);
2339     /* combine av bits */
2340     tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp3);
2341 
2342     tcg_temp_free(temp);
2343     tcg_temp_free(temp2);
2344     tcg_temp_free(temp3);
2345     tcg_temp_free_i64(temp64);
2346 }
2347 
2348 static inline void
2349 gen_msubadms_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2,
2350                TCGv r3, uint32_t n, uint32_t mode)
2351 {
2352     TCGv temp = tcg_const_i32(n);
2353     TCGv_i64 temp64 = tcg_temp_new_i64();
2354     TCGv_i64 temp64_2 = tcg_temp_new_i64();
2355 
2356     switch (mode) {
2357     case MODE_LL:
2358         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
2359         break;
2360     case MODE_LU:
2361         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
2362         break;
2363     case MODE_UL:
2364         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
2365         break;
2366     case MODE_UU:
2367         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
2368         break;
2369     }
2370     tcg_gen_sari_i64(temp64_2, temp64, 32); /* high */
2371     tcg_gen_ext32s_i64(temp64, temp64); /* low */
2372     tcg_gen_sub_i64(temp64, temp64_2, temp64);
2373     tcg_gen_shli_i64(temp64, temp64, 16);
2374     tcg_gen_concat_i32_i64(temp64_2, r1_low, r1_high);
2375 
2376     gen_helper_sub64_ssov(temp64, cpu_env, temp64_2, temp64);
2377     tcg_gen_extr_i64_i32(ret_low, ret_high, temp64);
2378 
2379     tcg_temp_free(temp);
2380     tcg_temp_free_i64(temp64);
2381     tcg_temp_free_i64(temp64_2);
2382 }
2383 
2384 static inline void
2385 gen_msubadr32s_h(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n, uint32_t mode)
2386 {
2387     TCGv temp = tcg_const_i32(n);
2388     TCGv temp2 = tcg_temp_new();
2389     TCGv_i64 temp64 = tcg_temp_new_i64();
2390     switch (mode) {
2391     case MODE_LL:
2392         GEN_HELPER_LL(mul_h, temp64, r2, r3, temp);
2393         break;
2394     case MODE_LU:
2395         GEN_HELPER_LU(mul_h, temp64, r2, r3, temp);
2396         break;
2397     case MODE_UL:
2398         GEN_HELPER_UL(mul_h, temp64, r2, r3, temp);
2399         break;
2400     case MODE_UU:
2401         GEN_HELPER_UU(mul_h, temp64, r2, r3, temp);
2402         break;
2403     }
2404     tcg_gen_andi_tl(temp2, r1, 0xffff0000);
2405     tcg_gen_shli_tl(temp, r1, 16);
2406     gen_helper_subadr_h_ssov(ret, cpu_env, temp64, temp, temp2);
2407 
2408     tcg_temp_free(temp);
2409     tcg_temp_free(temp2);
2410     tcg_temp_free_i64(temp64);
2411 }
2412 
2413 static inline void gen_abs(TCGv ret, TCGv r1)
2414 {
2415     tcg_gen_abs_tl(ret, r1);
2416     /* overflow can only happen, if r1 = 0x80000000 */
2417     tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, r1, 0x80000000);
2418     tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
2419     /* calc SV bit */
2420     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
2421     /* Calc AV bit */
2422     tcg_gen_add_tl(cpu_PSW_AV, ret, ret);
2423     tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV);
2424     /* calc SAV bit */
2425     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2426 }
2427 
2428 static inline void gen_absdif(TCGv ret, TCGv r1, TCGv r2)
2429 {
2430     TCGv temp = tcg_temp_new_i32();
2431     TCGv result = tcg_temp_new_i32();
2432 
2433     tcg_gen_sub_tl(result, r1, r2);
2434     tcg_gen_sub_tl(temp, r2, r1);
2435     tcg_gen_movcond_tl(TCG_COND_GT, result, r1, r2, result, temp);
2436 
2437     /* calc V bit */
2438     tcg_gen_xor_tl(cpu_PSW_V, result, r1);
2439     tcg_gen_xor_tl(temp, result, r2);
2440     tcg_gen_movcond_tl(TCG_COND_GT, cpu_PSW_V, r1, r2, cpu_PSW_V, temp);
2441     tcg_gen_xor_tl(temp, r1, r2);
2442     tcg_gen_and_tl(cpu_PSW_V, cpu_PSW_V, temp);
2443     /* calc SV bit */
2444     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
2445     /* Calc AV bit */
2446     tcg_gen_add_tl(cpu_PSW_AV, result, result);
2447     tcg_gen_xor_tl(cpu_PSW_AV, result, cpu_PSW_AV);
2448     /* calc SAV bit */
2449     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2450     /* write back result */
2451     tcg_gen_mov_tl(ret, result);
2452 
2453     tcg_temp_free(temp);
2454     tcg_temp_free(result);
2455 }
2456 
2457 static inline void gen_absdifi(TCGv ret, TCGv r1, int32_t con)
2458 {
2459     TCGv temp = tcg_const_i32(con);
2460     gen_absdif(ret, r1, temp);
2461     tcg_temp_free(temp);
2462 }
2463 
2464 static inline void gen_absdifsi(TCGv ret, TCGv r1, int32_t con)
2465 {
2466     TCGv temp = tcg_const_i32(con);
2467     gen_helper_absdif_ssov(ret, cpu_env, r1, temp);
2468     tcg_temp_free(temp);
2469 }
2470 
2471 static inline void gen_mul_i32s(TCGv ret, TCGv r1, TCGv r2)
2472 {
2473     TCGv high = tcg_temp_new();
2474     TCGv low = tcg_temp_new();
2475 
2476     tcg_gen_muls2_tl(low, high, r1, r2);
2477     tcg_gen_mov_tl(ret, low);
2478     /* calc V bit */
2479     tcg_gen_sari_tl(low, low, 31);
2480     tcg_gen_setcond_tl(TCG_COND_NE, cpu_PSW_V, high, low);
2481     tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
2482     /* calc SV bit */
2483     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
2484     /* Calc AV bit */
2485     tcg_gen_add_tl(cpu_PSW_AV, ret, ret);
2486     tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV);
2487     /* calc SAV bit */
2488     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2489 
2490     tcg_temp_free(high);
2491     tcg_temp_free(low);
2492 }
2493 
2494 static inline void gen_muli_i32s(TCGv ret, TCGv r1, int32_t con)
2495 {
2496     TCGv temp = tcg_const_i32(con);
2497     gen_mul_i32s(ret, r1, temp);
2498     tcg_temp_free(temp);
2499 }
2500 
2501 static inline void gen_mul_i64s(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2)
2502 {
2503     tcg_gen_muls2_tl(ret_low, ret_high, r1, r2);
2504     /* clear V bit */
2505     tcg_gen_movi_tl(cpu_PSW_V, 0);
2506     /* calc SV bit */
2507     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
2508     /* Calc AV bit */
2509     tcg_gen_add_tl(cpu_PSW_AV, ret_high, ret_high);
2510     tcg_gen_xor_tl(cpu_PSW_AV, ret_high, cpu_PSW_AV);
2511     /* calc SAV bit */
2512     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2513 }
2514 
2515 static inline void gen_muli_i64s(TCGv ret_low, TCGv ret_high, TCGv r1,
2516                                 int32_t con)
2517 {
2518     TCGv temp = tcg_const_i32(con);
2519     gen_mul_i64s(ret_low, ret_high, r1, temp);
2520     tcg_temp_free(temp);
2521 }
2522 
2523 static inline void gen_mul_i64u(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2)
2524 {
2525     tcg_gen_mulu2_tl(ret_low, ret_high, r1, r2);
2526     /* clear V bit */
2527     tcg_gen_movi_tl(cpu_PSW_V, 0);
2528     /* calc SV bit */
2529     tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
2530     /* Calc AV bit */
2531     tcg_gen_add_tl(cpu_PSW_AV, ret_high, ret_high);
2532     tcg_gen_xor_tl(cpu_PSW_AV, ret_high, cpu_PSW_AV);
2533     /* calc SAV bit */
2534     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2535 }
2536 
2537 static inline void gen_muli_i64u(TCGv ret_low, TCGv ret_high, TCGv r1,
2538                                 int32_t con)
2539 {
2540     TCGv temp = tcg_const_i32(con);
2541     gen_mul_i64u(ret_low, ret_high, r1, temp);
2542     tcg_temp_free(temp);
2543 }
2544 
2545 static inline void gen_mulsi_i32(TCGv ret, TCGv r1, int32_t con)
2546 {
2547     TCGv temp = tcg_const_i32(con);
2548     gen_helper_mul_ssov(ret, cpu_env, r1, temp);
2549     tcg_temp_free(temp);
2550 }
2551 
2552 static inline void gen_mulsui_i32(TCGv ret, TCGv r1, int32_t con)
2553 {
2554     TCGv temp = tcg_const_i32(con);
2555     gen_helper_mul_suov(ret, cpu_env, r1, temp);
2556     tcg_temp_free(temp);
2557 }
2558 /* gen_maddsi_32(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], const9); */
2559 static inline void gen_maddsi_32(TCGv ret, TCGv r1, TCGv r2, int32_t con)
2560 {
2561     TCGv temp = tcg_const_i32(con);
2562     gen_helper_madd32_ssov(ret, cpu_env, r1, r2, temp);
2563     tcg_temp_free(temp);
2564 }
2565 
2566 static inline void gen_maddsui_32(TCGv ret, TCGv r1, TCGv r2, int32_t con)
2567 {
2568     TCGv temp = tcg_const_i32(con);
2569     gen_helper_madd32_suov(ret, cpu_env, r1, r2, temp);
2570     tcg_temp_free(temp);
2571 }
2572 
2573 static void
2574 gen_mul_q(TCGv rl, TCGv rh, TCGv arg1, TCGv arg2, uint32_t n, uint32_t up_shift)
2575 {
2576     TCGv temp = tcg_temp_new();
2577     TCGv_i64 temp_64 = tcg_temp_new_i64();
2578     TCGv_i64 temp2_64 = tcg_temp_new_i64();
2579 
2580     if (n == 0) {
2581         if (up_shift == 32) {
2582             tcg_gen_muls2_tl(rh, rl, arg1, arg2);
2583         } else if (up_shift == 16) {
2584             tcg_gen_ext_i32_i64(temp_64, arg1);
2585             tcg_gen_ext_i32_i64(temp2_64, arg2);
2586 
2587             tcg_gen_mul_i64(temp_64, temp_64, temp2_64);
2588             tcg_gen_shri_i64(temp_64, temp_64, up_shift);
2589             tcg_gen_extr_i64_i32(rl, rh, temp_64);
2590         } else {
2591             tcg_gen_muls2_tl(rl, rh, arg1, arg2);
2592         }
2593         /* reset v bit */
2594         tcg_gen_movi_tl(cpu_PSW_V, 0);
2595     } else { /* n is expected to be 1 */
2596         tcg_gen_ext_i32_i64(temp_64, arg1);
2597         tcg_gen_ext_i32_i64(temp2_64, arg2);
2598 
2599         tcg_gen_mul_i64(temp_64, temp_64, temp2_64);
2600 
2601         if (up_shift == 0) {
2602             tcg_gen_shli_i64(temp_64, temp_64, 1);
2603         } else {
2604             tcg_gen_shri_i64(temp_64, temp_64, up_shift - 1);
2605         }
2606         tcg_gen_extr_i64_i32(rl, rh, temp_64);
2607         /* overflow only occurs if r1 = r2 = 0x8000 */
2608         if (up_shift == 0) {/* result is 64 bit */
2609             tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, rh,
2610                                 0x80000000);
2611         } else { /* result is 32 bit */
2612             tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, rl,
2613                                 0x80000000);
2614         }
2615         tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
2616         /* calc sv overflow bit */
2617         tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
2618     }
2619     /* calc av overflow bit */
2620     if (up_shift == 0) {
2621         tcg_gen_add_tl(cpu_PSW_AV, rh, rh);
2622         tcg_gen_xor_tl(cpu_PSW_AV, rh, cpu_PSW_AV);
2623     } else {
2624         tcg_gen_add_tl(cpu_PSW_AV, rl, rl);
2625         tcg_gen_xor_tl(cpu_PSW_AV, rl, cpu_PSW_AV);
2626     }
2627     /* calc sav overflow bit */
2628     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2629     tcg_temp_free(temp);
2630     tcg_temp_free_i64(temp_64);
2631     tcg_temp_free_i64(temp2_64);
2632 }
2633 
2634 static void
2635 gen_mul_q_16(TCGv ret, TCGv arg1, TCGv arg2, uint32_t n)
2636 {
2637     TCGv temp = tcg_temp_new();
2638     if (n == 0) {
2639         tcg_gen_mul_tl(ret, arg1, arg2);
2640     } else { /* n is expected to be 1 */
2641         tcg_gen_mul_tl(ret, arg1, arg2);
2642         tcg_gen_shli_tl(ret, ret, 1);
2643         /* catch special case r1 = r2 = 0x8000 */
2644         tcg_gen_setcondi_tl(TCG_COND_EQ, temp, ret, 0x80000000);
2645         tcg_gen_sub_tl(ret, ret, temp);
2646     }
2647     /* reset v bit */
2648     tcg_gen_movi_tl(cpu_PSW_V, 0);
2649     /* calc av overflow bit */
2650     tcg_gen_add_tl(cpu_PSW_AV, ret, ret);
2651     tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV);
2652     /* calc sav overflow bit */
2653     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2654 
2655     tcg_temp_free(temp);
2656 }
2657 
2658 static void gen_mulr_q(TCGv ret, TCGv arg1, TCGv arg2, uint32_t n)
2659 {
2660     TCGv temp = tcg_temp_new();
2661     if (n == 0) {
2662         tcg_gen_mul_tl(ret, arg1, arg2);
2663         tcg_gen_addi_tl(ret, ret, 0x8000);
2664     } else {
2665         tcg_gen_mul_tl(ret, arg1, arg2);
2666         tcg_gen_shli_tl(ret, ret, 1);
2667         tcg_gen_addi_tl(ret, ret, 0x8000);
2668         /* catch special case r1 = r2 = 0x8000 */
2669         tcg_gen_setcondi_tl(TCG_COND_EQ, temp, ret, 0x80008000);
2670         tcg_gen_muli_tl(temp, temp, 0x8001);
2671         tcg_gen_sub_tl(ret, ret, temp);
2672     }
2673     /* reset v bit */
2674     tcg_gen_movi_tl(cpu_PSW_V, 0);
2675     /* calc av overflow bit */
2676     tcg_gen_add_tl(cpu_PSW_AV, ret, ret);
2677     tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV);
2678     /* calc sav overflow bit */
2679     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2680     /* cut halfword off */
2681     tcg_gen_andi_tl(ret, ret, 0xffff0000);
2682 
2683     tcg_temp_free(temp);
2684 }
2685 
2686 static inline void
2687 gen_madds_64(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high,
2688              TCGv r3)
2689 {
2690     TCGv_i64 temp64 = tcg_temp_new_i64();
2691     tcg_gen_concat_i32_i64(temp64, r2_low, r2_high);
2692     gen_helper_madd64_ssov(temp64, cpu_env, r1, temp64, r3);
2693     tcg_gen_extr_i64_i32(ret_low, ret_high, temp64);
2694     tcg_temp_free_i64(temp64);
2695 }
2696 
2697 static inline void
2698 gen_maddsi_64(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high,
2699               int32_t con)
2700 {
2701     TCGv temp = tcg_const_i32(con);
2702     gen_madds_64(ret_low, ret_high, r1, r2_low, r2_high, temp);
2703     tcg_temp_free(temp);
2704 }
2705 
2706 static inline void
2707 gen_maddsu_64(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high,
2708              TCGv r3)
2709 {
2710     TCGv_i64 temp64 = tcg_temp_new_i64();
2711     tcg_gen_concat_i32_i64(temp64, r2_low, r2_high);
2712     gen_helper_madd64_suov(temp64, cpu_env, r1, temp64, r3);
2713     tcg_gen_extr_i64_i32(ret_low, ret_high, temp64);
2714     tcg_temp_free_i64(temp64);
2715 }
2716 
2717 static inline void
2718 gen_maddsui_64(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high,
2719                int32_t con)
2720 {
2721     TCGv temp = tcg_const_i32(con);
2722     gen_maddsu_64(ret_low, ret_high, r1, r2_low, r2_high, temp);
2723     tcg_temp_free(temp);
2724 }
2725 
2726 static inline void gen_msubsi_32(TCGv ret, TCGv r1, TCGv r2, int32_t con)
2727 {
2728     TCGv temp = tcg_const_i32(con);
2729     gen_helper_msub32_ssov(ret, cpu_env, r1, r2, temp);
2730     tcg_temp_free(temp);
2731 }
2732 
2733 static inline void gen_msubsui_32(TCGv ret, TCGv r1, TCGv r2, int32_t con)
2734 {
2735     TCGv temp = tcg_const_i32(con);
2736     gen_helper_msub32_suov(ret, cpu_env, r1, r2, temp);
2737     tcg_temp_free(temp);
2738 }
2739 
2740 static inline void
2741 gen_msubs_64(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high,
2742              TCGv r3)
2743 {
2744     TCGv_i64 temp64 = tcg_temp_new_i64();
2745     tcg_gen_concat_i32_i64(temp64, r2_low, r2_high);
2746     gen_helper_msub64_ssov(temp64, cpu_env, r1, temp64, r3);
2747     tcg_gen_extr_i64_i32(ret_low, ret_high, temp64);
2748     tcg_temp_free_i64(temp64);
2749 }
2750 
2751 static inline void
2752 gen_msubsi_64(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high,
2753               int32_t con)
2754 {
2755     TCGv temp = tcg_const_i32(con);
2756     gen_msubs_64(ret_low, ret_high, r1, r2_low, r2_high, temp);
2757     tcg_temp_free(temp);
2758 }
2759 
2760 static inline void
2761 gen_msubsu_64(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high,
2762              TCGv r3)
2763 {
2764     TCGv_i64 temp64 = tcg_temp_new_i64();
2765     tcg_gen_concat_i32_i64(temp64, r2_low, r2_high);
2766     gen_helper_msub64_suov(temp64, cpu_env, r1, temp64, r3);
2767     tcg_gen_extr_i64_i32(ret_low, ret_high, temp64);
2768     tcg_temp_free_i64(temp64);
2769 }
2770 
2771 static inline void
2772 gen_msubsui_64(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high,
2773                int32_t con)
2774 {
2775     TCGv temp = tcg_const_i32(con);
2776     gen_msubsu_64(ret_low, ret_high, r1, r2_low, r2_high, temp);
2777     tcg_temp_free(temp);
2778 }
2779 
2780 static void gen_saturate(TCGv ret, TCGv arg, int32_t up, int32_t low)
2781 {
2782     TCGv sat_neg = tcg_const_i32(low);
2783     TCGv temp = tcg_const_i32(up);
2784 
2785     /* sat_neg = (arg < low ) ? low : arg; */
2786     tcg_gen_movcond_tl(TCG_COND_LT, sat_neg, arg, sat_neg, sat_neg, arg);
2787 
2788     /* ret = (sat_neg > up ) ? up  : sat_neg; */
2789     tcg_gen_movcond_tl(TCG_COND_GT, ret, sat_neg, temp, temp, sat_neg);
2790 
2791     tcg_temp_free(sat_neg);
2792     tcg_temp_free(temp);
2793 }
2794 
2795 static void gen_saturate_u(TCGv ret, TCGv arg, int32_t up)
2796 {
2797     TCGv temp = tcg_const_i32(up);
2798     /* sat_neg = (arg > up ) ? up : arg; */
2799     tcg_gen_movcond_tl(TCG_COND_GTU, ret, arg, temp, temp, arg);
2800     tcg_temp_free(temp);
2801 }
2802 
2803 static void gen_shi(TCGv ret, TCGv r1, int32_t shift_count)
2804 {
2805     if (shift_count == -32) {
2806         tcg_gen_movi_tl(ret, 0);
2807     } else if (shift_count >= 0) {
2808         tcg_gen_shli_tl(ret, r1, shift_count);
2809     } else {
2810         tcg_gen_shri_tl(ret, r1, -shift_count);
2811     }
2812 }
2813 
2814 static void gen_sh_hi(TCGv ret, TCGv r1, int32_t shiftcount)
2815 {
2816     TCGv temp_low, temp_high;
2817 
2818     if (shiftcount == -16) {
2819         tcg_gen_movi_tl(ret, 0);
2820     } else {
2821         temp_high = tcg_temp_new();
2822         temp_low = tcg_temp_new();
2823 
2824         tcg_gen_andi_tl(temp_low, r1, 0xffff);
2825         tcg_gen_andi_tl(temp_high, r1, 0xffff0000);
2826         gen_shi(temp_low, temp_low, shiftcount);
2827         gen_shi(ret, temp_high, shiftcount);
2828         tcg_gen_deposit_tl(ret, ret, temp_low, 0, 16);
2829 
2830         tcg_temp_free(temp_low);
2831         tcg_temp_free(temp_high);
2832     }
2833 }
2834 
2835 static void gen_shaci(TCGv ret, TCGv r1, int32_t shift_count)
2836 {
2837     uint32_t msk, msk_start;
2838     TCGv temp = tcg_temp_new();
2839     TCGv temp2 = tcg_temp_new();
2840     TCGv t_0 = tcg_const_i32(0);
2841 
2842     if (shift_count == 0) {
2843         /* Clear PSW.C and PSW.V */
2844         tcg_gen_movi_tl(cpu_PSW_C, 0);
2845         tcg_gen_mov_tl(cpu_PSW_V, cpu_PSW_C);
2846         tcg_gen_mov_tl(ret, r1);
2847     } else if (shift_count == -32) {
2848         /* set PSW.C */
2849         tcg_gen_mov_tl(cpu_PSW_C, r1);
2850         /* fill ret completely with sign bit */
2851         tcg_gen_sari_tl(ret, r1, 31);
2852         /* clear PSW.V */
2853         tcg_gen_movi_tl(cpu_PSW_V, 0);
2854     } else if (shift_count > 0) {
2855         TCGv t_max = tcg_const_i32(0x7FFFFFFF >> shift_count);
2856         TCGv t_min = tcg_const_i32(((int32_t) -0x80000000) >> shift_count);
2857 
2858         /* calc carry */
2859         msk_start = 32 - shift_count;
2860         msk = ((1 << shift_count) - 1) << msk_start;
2861         tcg_gen_andi_tl(cpu_PSW_C, r1, msk);
2862         /* calc v/sv bits */
2863         tcg_gen_setcond_tl(TCG_COND_GT, temp, r1, t_max);
2864         tcg_gen_setcond_tl(TCG_COND_LT, temp2, r1, t_min);
2865         tcg_gen_or_tl(cpu_PSW_V, temp, temp2);
2866         tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
2867         /* calc sv */
2868         tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_V, cpu_PSW_SV);
2869         /* do shift */
2870         tcg_gen_shli_tl(ret, r1, shift_count);
2871 
2872         tcg_temp_free(t_max);
2873         tcg_temp_free(t_min);
2874     } else {
2875         /* clear PSW.V */
2876         tcg_gen_movi_tl(cpu_PSW_V, 0);
2877         /* calc carry */
2878         msk = (1 << -shift_count) - 1;
2879         tcg_gen_andi_tl(cpu_PSW_C, r1, msk);
2880         /* do shift */
2881         tcg_gen_sari_tl(ret, r1, -shift_count);
2882     }
2883     /* calc av overflow bit */
2884     tcg_gen_add_tl(cpu_PSW_AV, ret, ret);
2885     tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV);
2886     /* calc sav overflow bit */
2887     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2888 
2889     tcg_temp_free(temp);
2890     tcg_temp_free(temp2);
2891     tcg_temp_free(t_0);
2892 }
2893 
2894 static void gen_shas(TCGv ret, TCGv r1, TCGv r2)
2895 {
2896     gen_helper_sha_ssov(ret, cpu_env, r1, r2);
2897 }
2898 
2899 static void gen_shasi(TCGv ret, TCGv r1, int32_t con)
2900 {
2901     TCGv temp = tcg_const_i32(con);
2902     gen_shas(ret, r1, temp);
2903     tcg_temp_free(temp);
2904 }
2905 
2906 static void gen_sha_hi(TCGv ret, TCGv r1, int32_t shift_count)
2907 {
2908     TCGv low, high;
2909 
2910     if (shift_count == 0) {
2911         tcg_gen_mov_tl(ret, r1);
2912     } else if (shift_count > 0) {
2913         low = tcg_temp_new();
2914         high = tcg_temp_new();
2915 
2916         tcg_gen_andi_tl(high, r1, 0xffff0000);
2917         tcg_gen_shli_tl(low, r1, shift_count);
2918         tcg_gen_shli_tl(ret, high, shift_count);
2919         tcg_gen_deposit_tl(ret, ret, low, 0, 16);
2920 
2921         tcg_temp_free(low);
2922         tcg_temp_free(high);
2923     } else {
2924         low = tcg_temp_new();
2925         high = tcg_temp_new();
2926 
2927         tcg_gen_ext16s_tl(low, r1);
2928         tcg_gen_sari_tl(low, low, -shift_count);
2929         tcg_gen_sari_tl(ret, r1, -shift_count);
2930         tcg_gen_deposit_tl(ret, ret, low, 0, 16);
2931 
2932         tcg_temp_free(low);
2933         tcg_temp_free(high);
2934     }
2935 
2936 }
2937 
2938 /* ret = {ret[30:0], (r1 cond r2)}; */
2939 static void gen_sh_cond(int cond, TCGv ret, TCGv r1, TCGv r2)
2940 {
2941     TCGv temp = tcg_temp_new();
2942     TCGv temp2 = tcg_temp_new();
2943 
2944     tcg_gen_shli_tl(temp, ret, 1);
2945     tcg_gen_setcond_tl(cond, temp2, r1, r2);
2946     tcg_gen_or_tl(ret, temp, temp2);
2947 
2948     tcg_temp_free(temp);
2949     tcg_temp_free(temp2);
2950 }
2951 
2952 static void gen_sh_condi(int cond, TCGv ret, TCGv r1, int32_t con)
2953 {
2954     TCGv temp = tcg_const_i32(con);
2955     gen_sh_cond(cond, ret, r1, temp);
2956     tcg_temp_free(temp);
2957 }
2958 
2959 static inline void gen_adds(TCGv ret, TCGv r1, TCGv r2)
2960 {
2961     gen_helper_add_ssov(ret, cpu_env, r1, r2);
2962 }
2963 
2964 static inline void gen_addsi(TCGv ret, TCGv r1, int32_t con)
2965 {
2966     TCGv temp = tcg_const_i32(con);
2967     gen_helper_add_ssov(ret, cpu_env, r1, temp);
2968     tcg_temp_free(temp);
2969 }
2970 
2971 static inline void gen_addsui(TCGv ret, TCGv r1, int32_t con)
2972 {
2973     TCGv temp = tcg_const_i32(con);
2974     gen_helper_add_suov(ret, cpu_env, r1, temp);
2975     tcg_temp_free(temp);
2976 }
2977 
2978 static inline void gen_subs(TCGv ret, TCGv r1, TCGv r2)
2979 {
2980     gen_helper_sub_ssov(ret, cpu_env, r1, r2);
2981 }
2982 
2983 static inline void gen_subsu(TCGv ret, TCGv r1, TCGv r2)
2984 {
2985     gen_helper_sub_suov(ret, cpu_env, r1, r2);
2986 }
2987 
2988 static inline void gen_bit_2op(TCGv ret, TCGv r1, TCGv r2,
2989                                int pos1, int pos2,
2990                                void(*op1)(TCGv, TCGv, TCGv),
2991                                void(*op2)(TCGv, TCGv, TCGv))
2992 {
2993     TCGv temp1, temp2;
2994 
2995     temp1 = tcg_temp_new();
2996     temp2 = tcg_temp_new();
2997 
2998     tcg_gen_shri_tl(temp2, r2, pos2);
2999     tcg_gen_shri_tl(temp1, r1, pos1);
3000 
3001     (*op1)(temp1, temp1, temp2);
3002     (*op2)(temp1 , ret, temp1);
3003 
3004     tcg_gen_deposit_tl(ret, ret, temp1, 0, 1);
3005 
3006     tcg_temp_free(temp1);
3007     tcg_temp_free(temp2);
3008 }
3009 
3010 /* ret = r1[pos1] op1 r2[pos2]; */
3011 static inline void gen_bit_1op(TCGv ret, TCGv r1, TCGv r2,
3012                                int pos1, int pos2,
3013                                void(*op1)(TCGv, TCGv, TCGv))
3014 {
3015     TCGv temp1, temp2;
3016 
3017     temp1 = tcg_temp_new();
3018     temp2 = tcg_temp_new();
3019 
3020     tcg_gen_shri_tl(temp2, r2, pos2);
3021     tcg_gen_shri_tl(temp1, r1, pos1);
3022 
3023     (*op1)(ret, temp1, temp2);
3024 
3025     tcg_gen_andi_tl(ret, ret, 0x1);
3026 
3027     tcg_temp_free(temp1);
3028     tcg_temp_free(temp2);
3029 }
3030 
3031 static inline void gen_accumulating_cond(int cond, TCGv ret, TCGv r1, TCGv r2,
3032                                          void(*op)(TCGv, TCGv, TCGv))
3033 {
3034     TCGv temp = tcg_temp_new();
3035     TCGv temp2 = tcg_temp_new();
3036     /* temp = (arg1 cond arg2 )*/
3037     tcg_gen_setcond_tl(cond, temp, r1, r2);
3038     /* temp2 = ret[0]*/
3039     tcg_gen_andi_tl(temp2, ret, 0x1);
3040     /* temp = temp insn temp2 */
3041     (*op)(temp, temp, temp2);
3042     /* ret = {ret[31:1], temp} */
3043     tcg_gen_deposit_tl(ret, ret, temp, 0, 1);
3044 
3045     tcg_temp_free(temp);
3046     tcg_temp_free(temp2);
3047 }
3048 
3049 static inline void
3050 gen_accumulating_condi(int cond, TCGv ret, TCGv r1, int32_t con,
3051                        void(*op)(TCGv, TCGv, TCGv))
3052 {
3053     TCGv temp = tcg_const_i32(con);
3054     gen_accumulating_cond(cond, ret, r1, temp, op);
3055     tcg_temp_free(temp);
3056 }
3057 
3058 /* ret = (r1 cond r2) ? 0xFFFFFFFF ? 0x00000000;*/
3059 static inline void gen_cond_w(TCGCond cond, TCGv ret, TCGv r1, TCGv r2)
3060 {
3061     tcg_gen_setcond_tl(cond, ret, r1, r2);
3062     tcg_gen_neg_tl(ret, ret);
3063 }
3064 
3065 static inline void gen_eqany_bi(TCGv ret, TCGv r1, int32_t con)
3066 {
3067     TCGv b0 = tcg_temp_new();
3068     TCGv b1 = tcg_temp_new();
3069     TCGv b2 = tcg_temp_new();
3070     TCGv b3 = tcg_temp_new();
3071 
3072     /* byte 0 */
3073     tcg_gen_andi_tl(b0, r1, 0xff);
3074     tcg_gen_setcondi_tl(TCG_COND_EQ, b0, b0, con & 0xff);
3075 
3076     /* byte 1 */
3077     tcg_gen_andi_tl(b1, r1, 0xff00);
3078     tcg_gen_setcondi_tl(TCG_COND_EQ, b1, b1, con & 0xff00);
3079 
3080     /* byte 2 */
3081     tcg_gen_andi_tl(b2, r1, 0xff0000);
3082     tcg_gen_setcondi_tl(TCG_COND_EQ, b2, b2, con & 0xff0000);
3083 
3084     /* byte 3 */
3085     tcg_gen_andi_tl(b3, r1, 0xff000000);
3086     tcg_gen_setcondi_tl(TCG_COND_EQ, b3, b3, con & 0xff000000);
3087 
3088     /* combine them */
3089     tcg_gen_or_tl(ret, b0, b1);
3090     tcg_gen_or_tl(ret, ret, b2);
3091     tcg_gen_or_tl(ret, ret, b3);
3092 
3093     tcg_temp_free(b0);
3094     tcg_temp_free(b1);
3095     tcg_temp_free(b2);
3096     tcg_temp_free(b3);
3097 }
3098 
3099 static inline void gen_eqany_hi(TCGv ret, TCGv r1, int32_t con)
3100 {
3101     TCGv h0 = tcg_temp_new();
3102     TCGv h1 = tcg_temp_new();
3103 
3104     /* halfword 0 */
3105     tcg_gen_andi_tl(h0, r1, 0xffff);
3106     tcg_gen_setcondi_tl(TCG_COND_EQ, h0, h0, con & 0xffff);
3107 
3108     /* halfword 1 */
3109     tcg_gen_andi_tl(h1, r1, 0xffff0000);
3110     tcg_gen_setcondi_tl(TCG_COND_EQ, h1, h1, con & 0xffff0000);
3111 
3112     /* combine them */
3113     tcg_gen_or_tl(ret, h0, h1);
3114 
3115     tcg_temp_free(h0);
3116     tcg_temp_free(h1);
3117 }
3118 /* mask = ((1 << width) -1) << pos;
3119    ret = (r1 & ~mask) | (r2 << pos) & mask); */
3120 static inline void gen_insert(TCGv ret, TCGv r1, TCGv r2, TCGv width, TCGv pos)
3121 {
3122     TCGv mask = tcg_temp_new();
3123     TCGv temp = tcg_temp_new();
3124     TCGv temp2 = tcg_temp_new();
3125 
3126     tcg_gen_movi_tl(mask, 1);
3127     tcg_gen_shl_tl(mask, mask, width);
3128     tcg_gen_subi_tl(mask, mask, 1);
3129     tcg_gen_shl_tl(mask, mask, pos);
3130 
3131     tcg_gen_shl_tl(temp, r2, pos);
3132     tcg_gen_and_tl(temp, temp, mask);
3133     tcg_gen_andc_tl(temp2, r1, mask);
3134     tcg_gen_or_tl(ret, temp, temp2);
3135 
3136     tcg_temp_free(mask);
3137     tcg_temp_free(temp);
3138     tcg_temp_free(temp2);
3139 }
3140 
3141 static inline void gen_bsplit(TCGv rl, TCGv rh, TCGv r1)
3142 {
3143     TCGv_i64 temp = tcg_temp_new_i64();
3144 
3145     gen_helper_bsplit(temp, r1);
3146     tcg_gen_extr_i64_i32(rl, rh, temp);
3147 
3148     tcg_temp_free_i64(temp);
3149 }
3150 
3151 static inline void gen_unpack(TCGv rl, TCGv rh, TCGv r1)
3152 {
3153     TCGv_i64 temp = tcg_temp_new_i64();
3154 
3155     gen_helper_unpack(temp, r1);
3156     tcg_gen_extr_i64_i32(rl, rh, temp);
3157 
3158     tcg_temp_free_i64(temp);
3159 }
3160 
3161 static inline void
3162 gen_dvinit_b(DisasContext *ctx, TCGv rl, TCGv rh, TCGv r1, TCGv r2)
3163 {
3164     TCGv_i64 ret = tcg_temp_new_i64();
3165 
3166     if (!has_feature(ctx, TRICORE_FEATURE_131)) {
3167         gen_helper_dvinit_b_13(ret, cpu_env, r1, r2);
3168     } else {
3169         gen_helper_dvinit_b_131(ret, cpu_env, r1, r2);
3170     }
3171     tcg_gen_extr_i64_i32(rl, rh, ret);
3172 
3173     tcg_temp_free_i64(ret);
3174 }
3175 
3176 static inline void
3177 gen_dvinit_h(DisasContext *ctx, TCGv rl, TCGv rh, TCGv r1, TCGv r2)
3178 {
3179     TCGv_i64 ret = tcg_temp_new_i64();
3180 
3181     if (!has_feature(ctx, TRICORE_FEATURE_131)) {
3182         gen_helper_dvinit_h_13(ret, cpu_env, r1, r2);
3183     } else {
3184         gen_helper_dvinit_h_131(ret, cpu_env, r1, r2);
3185     }
3186     tcg_gen_extr_i64_i32(rl, rh, ret);
3187 
3188     tcg_temp_free_i64(ret);
3189 }
3190 
3191 static void gen_calc_usb_mul_h(TCGv arg_low, TCGv arg_high)
3192 {
3193     TCGv temp = tcg_temp_new();
3194     /* calc AV bit */
3195     tcg_gen_add_tl(temp, arg_low, arg_low);
3196     tcg_gen_xor_tl(temp, temp, arg_low);
3197     tcg_gen_add_tl(cpu_PSW_AV, arg_high, arg_high);
3198     tcg_gen_xor_tl(cpu_PSW_AV, cpu_PSW_AV, arg_high);
3199     tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp);
3200     /* calc SAV bit */
3201     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
3202     tcg_gen_movi_tl(cpu_PSW_V, 0);
3203     tcg_temp_free(temp);
3204 }
3205 
3206 static void gen_calc_usb_mulr_h(TCGv arg)
3207 {
3208     TCGv temp = tcg_temp_new();
3209     /* calc AV bit */
3210     tcg_gen_add_tl(temp, arg, arg);
3211     tcg_gen_xor_tl(temp, temp, arg);
3212     tcg_gen_shli_tl(cpu_PSW_AV, temp, 16);
3213     tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp);
3214     /* calc SAV bit */
3215     tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
3216     /* clear V bit */
3217     tcg_gen_movi_tl(cpu_PSW_V, 0);
3218     tcg_temp_free(temp);
3219 }
3220 
3221 /* helpers for generating program flow micro-ops */
3222 
3223 static inline void gen_save_pc(target_ulong pc)
3224 {
3225     tcg_gen_movi_tl(cpu_PC, pc);
3226 }
3227 
3228 static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
3229 {
3230     if (translator_use_goto_tb(&ctx->base, dest)) {
3231         tcg_gen_goto_tb(n);
3232         gen_save_pc(dest);
3233         tcg_gen_exit_tb(ctx->base.tb, n);
3234     } else {
3235         gen_save_pc(dest);
3236         tcg_gen_lookup_and_goto_ptr();
3237     }
3238 }
3239 
3240 static void generate_trap(DisasContext *ctx, int class, int tin)
3241 {
3242     TCGv_i32 classtemp = tcg_const_i32(class);
3243     TCGv_i32 tintemp = tcg_const_i32(tin);
3244 
3245     gen_save_pc(ctx->base.pc_next);
3246     gen_helper_raise_exception_sync(cpu_env, classtemp, tintemp);
3247     ctx->base.is_jmp = DISAS_NORETURN;
3248 
3249     tcg_temp_free(classtemp);
3250     tcg_temp_free(tintemp);
3251 }
3252 
3253 static inline void gen_branch_cond(DisasContext *ctx, TCGCond cond, TCGv r1,
3254                                    TCGv r2, int16_t address)
3255 {
3256     TCGLabel *jumpLabel = gen_new_label();
3257     tcg_gen_brcond_tl(cond, r1, r2, jumpLabel);
3258 
3259     gen_goto_tb(ctx, 1, ctx->pc_succ_insn);
3260 
3261     gen_set_label(jumpLabel);
3262     gen_goto_tb(ctx, 0, ctx->base.pc_next + address * 2);
3263 }
3264 
3265 static inline void gen_branch_condi(DisasContext *ctx, TCGCond cond, TCGv r1,
3266                                     int r2, int16_t address)
3267 {
3268     TCGv temp = tcg_const_i32(r2);
3269     gen_branch_cond(ctx, cond, r1, temp, address);
3270     tcg_temp_free(temp);
3271 }
3272 
3273 static void gen_loop(DisasContext *ctx, int r1, int32_t offset)
3274 {
3275     TCGLabel *l1 = gen_new_label();
3276 
3277     tcg_gen_subi_tl(cpu_gpr_a[r1], cpu_gpr_a[r1], 1);
3278     tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr_a[r1], -1, l1);
3279     gen_goto_tb(ctx, 1, ctx->base.pc_next + offset);
3280     gen_set_label(l1);
3281     gen_goto_tb(ctx, 0, ctx->pc_succ_insn);
3282 }
3283 
3284 static void gen_fcall_save_ctx(DisasContext *ctx)
3285 {
3286     TCGv temp = tcg_temp_new();
3287 
3288     tcg_gen_addi_tl(temp, cpu_gpr_a[10], -4);
3289     tcg_gen_qemu_st_tl(cpu_gpr_a[11], temp, ctx->mem_idx, MO_LESL);
3290     tcg_gen_movi_tl(cpu_gpr_a[11], ctx->pc_succ_insn);
3291     tcg_gen_mov_tl(cpu_gpr_a[10], temp);
3292 
3293     tcg_temp_free(temp);
3294 }
3295 
3296 static void gen_fret(DisasContext *ctx)
3297 {
3298     TCGv temp = tcg_temp_new();
3299 
3300     tcg_gen_andi_tl(temp, cpu_gpr_a[11], ~0x1);
3301     tcg_gen_qemu_ld_tl(cpu_gpr_a[11], cpu_gpr_a[10], ctx->mem_idx, MO_LESL);
3302     tcg_gen_addi_tl(cpu_gpr_a[10], cpu_gpr_a[10], 4);
3303     tcg_gen_mov_tl(cpu_PC, temp);
3304     tcg_gen_exit_tb(NULL, 0);
3305     ctx->base.is_jmp = DISAS_NORETURN;
3306 
3307     tcg_temp_free(temp);
3308 }
3309 
3310 static void gen_compute_branch(DisasContext *ctx, uint32_t opc, int r1,
3311                                int r2 , int32_t constant , int32_t offset)
3312 {
3313     TCGv temp, temp2;
3314     int n;
3315 
3316     switch (opc) {
3317 /* SB-format jumps */
3318     case OPC1_16_SB_J:
3319     case OPC1_32_B_J:
3320         gen_goto_tb(ctx, 0, ctx->base.pc_next + offset * 2);
3321         break;
3322     case OPC1_32_B_CALL:
3323     case OPC1_16_SB_CALL:
3324         gen_helper_1arg(call, ctx->pc_succ_insn);
3325         gen_goto_tb(ctx, 0, ctx->base.pc_next + offset * 2);
3326         break;
3327     case OPC1_16_SB_JZ:
3328         gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_d[15], 0, offset);
3329         break;
3330     case OPC1_16_SB_JNZ:
3331         gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_d[15], 0, offset);
3332         break;
3333 /* SBC-format jumps */
3334     case OPC1_16_SBC_JEQ:
3335         gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_d[15], constant, offset);
3336         break;
3337     case OPC1_16_SBC_JEQ2:
3338         gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_d[15], constant,
3339                          offset + 16);
3340         break;
3341     case OPC1_16_SBC_JNE:
3342         gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_d[15], constant, offset);
3343         break;
3344     case OPC1_16_SBC_JNE2:
3345         gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_d[15],
3346                          constant, offset + 16);
3347         break;
3348 /* SBRN-format jumps */
3349     case OPC1_16_SBRN_JZ_T:
3350         temp = tcg_temp_new();
3351         tcg_gen_andi_tl(temp, cpu_gpr_d[15], 0x1u << constant);
3352         gen_branch_condi(ctx, TCG_COND_EQ, temp, 0, offset);
3353         tcg_temp_free(temp);
3354         break;
3355     case OPC1_16_SBRN_JNZ_T:
3356         temp = tcg_temp_new();
3357         tcg_gen_andi_tl(temp, cpu_gpr_d[15], 0x1u << constant);
3358         gen_branch_condi(ctx, TCG_COND_NE, temp, 0, offset);
3359         tcg_temp_free(temp);
3360         break;
3361 /* SBR-format jumps */
3362     case OPC1_16_SBR_JEQ:
3363         gen_branch_cond(ctx, TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[15],
3364                         offset);
3365         break;
3366     case OPC1_16_SBR_JEQ2:
3367         gen_branch_cond(ctx, TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[15],
3368                         offset + 16);
3369         break;
3370     case OPC1_16_SBR_JNE:
3371         gen_branch_cond(ctx, TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[15],
3372                         offset);
3373         break;
3374     case OPC1_16_SBR_JNE2:
3375         gen_branch_cond(ctx, TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[15],
3376                         offset + 16);
3377         break;
3378     case OPC1_16_SBR_JNZ:
3379         gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_d[r1], 0, offset);
3380         break;
3381     case OPC1_16_SBR_JNZ_A:
3382         gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_a[r1], 0, offset);
3383         break;
3384     case OPC1_16_SBR_JGEZ:
3385         gen_branch_condi(ctx, TCG_COND_GE, cpu_gpr_d[r1], 0, offset);
3386         break;
3387     case OPC1_16_SBR_JGTZ:
3388         gen_branch_condi(ctx, TCG_COND_GT, cpu_gpr_d[r1], 0, offset);
3389         break;
3390     case OPC1_16_SBR_JLEZ:
3391         gen_branch_condi(ctx, TCG_COND_LE, cpu_gpr_d[r1], 0, offset);
3392         break;
3393     case OPC1_16_SBR_JLTZ:
3394         gen_branch_condi(ctx, TCG_COND_LT, cpu_gpr_d[r1], 0, offset);
3395         break;
3396     case OPC1_16_SBR_JZ:
3397         gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_d[r1], 0, offset);
3398         break;
3399     case OPC1_16_SBR_JZ_A:
3400         gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_a[r1], 0, offset);
3401         break;
3402     case OPC1_16_SBR_LOOP:
3403         gen_loop(ctx, r1, offset * 2 - 32);
3404         break;
3405 /* SR-format jumps */
3406     case OPC1_16_SR_JI:
3407         tcg_gen_andi_tl(cpu_PC, cpu_gpr_a[r1], 0xfffffffe);
3408         tcg_gen_exit_tb(NULL, 0);
3409         break;
3410     case OPC2_32_SYS_RET:
3411     case OPC2_16_SR_RET:
3412         gen_helper_ret(cpu_env);
3413         tcg_gen_exit_tb(NULL, 0);
3414         break;
3415 /* B-format */
3416     case OPC1_32_B_CALLA:
3417         gen_helper_1arg(call, ctx->pc_succ_insn);
3418         gen_goto_tb(ctx, 0, EA_B_ABSOLUT(offset));
3419         break;
3420     case OPC1_32_B_FCALL:
3421         gen_fcall_save_ctx(ctx);
3422         gen_goto_tb(ctx, 0, ctx->base.pc_next + offset * 2);
3423         break;
3424     case OPC1_32_B_FCALLA:
3425         gen_fcall_save_ctx(ctx);
3426         gen_goto_tb(ctx, 0, EA_B_ABSOLUT(offset));
3427         break;
3428     case OPC1_32_B_JLA:
3429         tcg_gen_movi_tl(cpu_gpr_a[11], ctx->pc_succ_insn);
3430         /* fall through */
3431     case OPC1_32_B_JA:
3432         gen_goto_tb(ctx, 0, EA_B_ABSOLUT(offset));
3433         break;
3434     case OPC1_32_B_JL:
3435         tcg_gen_movi_tl(cpu_gpr_a[11], ctx->pc_succ_insn);
3436         gen_goto_tb(ctx, 0, ctx->base.pc_next + offset * 2);
3437         break;
3438 /* BOL format */
3439     case OPCM_32_BRC_EQ_NEQ:
3440          if (MASK_OP_BRC_OP2(ctx->opcode) == OPC2_32_BRC_JEQ) {
3441             gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_d[r1], constant, offset);
3442          } else {
3443             gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_d[r1], constant, offset);
3444          }
3445          break;
3446     case OPCM_32_BRC_GE:
3447          if (MASK_OP_BRC_OP2(ctx->opcode) == OP2_32_BRC_JGE) {
3448             gen_branch_condi(ctx, TCG_COND_GE, cpu_gpr_d[r1], constant, offset);
3449          } else {
3450             constant = MASK_OP_BRC_CONST4(ctx->opcode);
3451             gen_branch_condi(ctx, TCG_COND_GEU, cpu_gpr_d[r1], constant,
3452                              offset);
3453          }
3454          break;
3455     case OPCM_32_BRC_JLT:
3456          if (MASK_OP_BRC_OP2(ctx->opcode) == OPC2_32_BRC_JLT) {
3457             gen_branch_condi(ctx, TCG_COND_LT, cpu_gpr_d[r1], constant, offset);
3458          } else {
3459             constant = MASK_OP_BRC_CONST4(ctx->opcode);
3460             gen_branch_condi(ctx, TCG_COND_LTU, cpu_gpr_d[r1], constant,
3461                              offset);
3462          }
3463          break;
3464     case OPCM_32_BRC_JNE:
3465         temp = tcg_temp_new();
3466         if (MASK_OP_BRC_OP2(ctx->opcode) == OPC2_32_BRC_JNED) {
3467             tcg_gen_mov_tl(temp, cpu_gpr_d[r1]);
3468             /* subi is unconditional */
3469             tcg_gen_subi_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 1);
3470             gen_branch_condi(ctx, TCG_COND_NE, temp, constant, offset);
3471         } else {
3472             tcg_gen_mov_tl(temp, cpu_gpr_d[r1]);
3473             /* addi is unconditional */
3474             tcg_gen_addi_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 1);
3475             gen_branch_condi(ctx, TCG_COND_NE, temp, constant, offset);
3476         }
3477         tcg_temp_free(temp);
3478         break;
3479 /* BRN format */
3480     case OPCM_32_BRN_JTT:
3481         n = MASK_OP_BRN_N(ctx->opcode);
3482 
3483         temp = tcg_temp_new();
3484         tcg_gen_andi_tl(temp, cpu_gpr_d[r1], (1 << n));
3485 
3486         if (MASK_OP_BRN_OP2(ctx->opcode) == OPC2_32_BRN_JNZ_T) {
3487             gen_branch_condi(ctx, TCG_COND_NE, temp, 0, offset);
3488         } else {
3489             gen_branch_condi(ctx, TCG_COND_EQ, temp, 0, offset);
3490         }
3491         tcg_temp_free(temp);
3492         break;
3493 /* BRR Format */
3494     case OPCM_32_BRR_EQ_NEQ:
3495         if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_JEQ) {
3496             gen_branch_cond(ctx, TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[r2],
3497                             offset);
3498         } else {
3499             gen_branch_cond(ctx, TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[r2],
3500                             offset);
3501         }
3502         break;
3503     case OPCM_32_BRR_ADDR_EQ_NEQ:
3504         if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_JEQ_A) {
3505             gen_branch_cond(ctx, TCG_COND_EQ, cpu_gpr_a[r1], cpu_gpr_a[r2],
3506                             offset);
3507         } else {
3508             gen_branch_cond(ctx, TCG_COND_NE, cpu_gpr_a[r1], cpu_gpr_a[r2],
3509                             offset);
3510         }
3511         break;
3512     case OPCM_32_BRR_GE:
3513         if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_JGE) {
3514             gen_branch_cond(ctx, TCG_COND_GE, cpu_gpr_d[r1], cpu_gpr_d[r2],
3515                             offset);
3516         } else {
3517             gen_branch_cond(ctx, TCG_COND_GEU, cpu_gpr_d[r1], cpu_gpr_d[r2],
3518                             offset);
3519         }
3520         break;
3521     case OPCM_32_BRR_JLT:
3522         if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_JLT) {
3523             gen_branch_cond(ctx, TCG_COND_LT, cpu_gpr_d[r1], cpu_gpr_d[r2],
3524                             offset);
3525         } else {
3526             gen_branch_cond(ctx, TCG_COND_LTU, cpu_gpr_d[r1], cpu_gpr_d[r2],
3527                             offset);
3528         }
3529         break;
3530     case OPCM_32_BRR_LOOP:
3531         if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_LOOP) {
3532             gen_loop(ctx, r2, offset * 2);
3533         } else {
3534             /* OPC2_32_BRR_LOOPU */
3535             gen_goto_tb(ctx, 0, ctx->base.pc_next + offset * 2);
3536         }
3537         break;
3538     case OPCM_32_BRR_JNE:
3539         temp = tcg_temp_new();
3540         temp2 = tcg_temp_new();
3541         if (MASK_OP_BRC_OP2(ctx->opcode) == OPC2_32_BRR_JNED) {
3542             tcg_gen_mov_tl(temp, cpu_gpr_d[r1]);
3543             /* also save r2, in case of r1 == r2, so r2 is not decremented */
3544             tcg_gen_mov_tl(temp2, cpu_gpr_d[r2]);
3545             /* subi is unconditional */
3546             tcg_gen_subi_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 1);
3547             gen_branch_cond(ctx, TCG_COND_NE, temp, temp2, offset);
3548         } else {
3549             tcg_gen_mov_tl(temp, cpu_gpr_d[r1]);
3550             /* also save r2, in case of r1 == r2, so r2 is not decremented */
3551             tcg_gen_mov_tl(temp2, cpu_gpr_d[r2]);
3552             /* addi is unconditional */
3553             tcg_gen_addi_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 1);
3554             gen_branch_cond(ctx, TCG_COND_NE, temp, temp2, offset);
3555         }
3556         tcg_temp_free(temp);
3557         tcg_temp_free(temp2);
3558         break;
3559     case OPCM_32_BRR_JNZ:
3560         if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_JNZ_A) {
3561             gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_a[r1], 0, offset);
3562         } else {
3563             gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_a[r1], 0, offset);
3564         }
3565         break;
3566     default:
3567         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
3568     }
3569     ctx->base.is_jmp = DISAS_NORETURN;
3570 }
3571 
3572 
3573 /*
3574  * Functions for decoding instructions
3575  */
3576 
3577 static void decode_src_opc(DisasContext *ctx, int op1)
3578 {
3579     int r1;
3580     int32_t const4;
3581     TCGv temp, temp2;
3582 
3583     r1 = MASK_OP_SRC_S1D(ctx->opcode);
3584     const4 = MASK_OP_SRC_CONST4_SEXT(ctx->opcode);
3585 
3586     switch (op1) {
3587     case OPC1_16_SRC_ADD:
3588         gen_addi_d(cpu_gpr_d[r1], cpu_gpr_d[r1], const4);
3589         break;
3590     case OPC1_16_SRC_ADD_A15:
3591         gen_addi_d(cpu_gpr_d[r1], cpu_gpr_d[15], const4);
3592         break;
3593     case OPC1_16_SRC_ADD_15A:
3594         gen_addi_d(cpu_gpr_d[15], cpu_gpr_d[r1], const4);
3595         break;
3596     case OPC1_16_SRC_ADD_A:
3597         tcg_gen_addi_tl(cpu_gpr_a[r1], cpu_gpr_a[r1], const4);
3598         break;
3599     case OPC1_16_SRC_CADD:
3600         gen_condi_add(TCG_COND_NE, cpu_gpr_d[r1], const4, cpu_gpr_d[r1],
3601                       cpu_gpr_d[15]);
3602         break;
3603     case OPC1_16_SRC_CADDN:
3604         gen_condi_add(TCG_COND_EQ, cpu_gpr_d[r1], const4, cpu_gpr_d[r1],
3605                       cpu_gpr_d[15]);
3606         break;
3607     case OPC1_16_SRC_CMOV:
3608         temp = tcg_const_tl(0);
3609         temp2 = tcg_const_tl(const4);
3610         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[15], temp,
3611                            temp2, cpu_gpr_d[r1]);
3612         tcg_temp_free(temp);
3613         tcg_temp_free(temp2);
3614         break;
3615     case OPC1_16_SRC_CMOVN:
3616         temp = tcg_const_tl(0);
3617         temp2 = tcg_const_tl(const4);
3618         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[15], temp,
3619                            temp2, cpu_gpr_d[r1]);
3620         tcg_temp_free(temp);
3621         tcg_temp_free(temp2);
3622         break;
3623     case OPC1_16_SRC_EQ:
3624         tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_gpr_d[15], cpu_gpr_d[r1],
3625                             const4);
3626         break;
3627     case OPC1_16_SRC_LT:
3628         tcg_gen_setcondi_tl(TCG_COND_LT, cpu_gpr_d[15], cpu_gpr_d[r1],
3629                             const4);
3630         break;
3631     case OPC1_16_SRC_MOV:
3632         tcg_gen_movi_tl(cpu_gpr_d[r1], const4);
3633         break;
3634     case OPC1_16_SRC_MOV_A:
3635         const4 = MASK_OP_SRC_CONST4(ctx->opcode);
3636         tcg_gen_movi_tl(cpu_gpr_a[r1], const4);
3637         break;
3638     case OPC1_16_SRC_MOV_E:
3639         if (has_feature(ctx, TRICORE_FEATURE_16)) {
3640             tcg_gen_movi_tl(cpu_gpr_d[r1], const4);
3641             tcg_gen_sari_tl(cpu_gpr_d[r1+1], cpu_gpr_d[r1], 31);
3642         } else {
3643             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
3644         }
3645         break;
3646     case OPC1_16_SRC_SH:
3647         gen_shi(cpu_gpr_d[r1], cpu_gpr_d[r1], const4);
3648         break;
3649     case OPC1_16_SRC_SHA:
3650         gen_shaci(cpu_gpr_d[r1], cpu_gpr_d[r1], const4);
3651         break;
3652     default:
3653         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
3654     }
3655 }
3656 
3657 static void decode_srr_opc(DisasContext *ctx, int op1)
3658 {
3659     int r1, r2;
3660     TCGv temp;
3661 
3662     r1 = MASK_OP_SRR_S1D(ctx->opcode);
3663     r2 = MASK_OP_SRR_S2(ctx->opcode);
3664 
3665     switch (op1) {
3666     case OPC1_16_SRR_ADD:
3667         gen_add_d(cpu_gpr_d[r1], cpu_gpr_d[r1], cpu_gpr_d[r2]);
3668         break;
3669     case OPC1_16_SRR_ADD_A15:
3670         gen_add_d(cpu_gpr_d[r1], cpu_gpr_d[15], cpu_gpr_d[r2]);
3671         break;
3672     case OPC1_16_SRR_ADD_15A:
3673         gen_add_d(cpu_gpr_d[15], cpu_gpr_d[r1], cpu_gpr_d[r2]);
3674         break;
3675     case OPC1_16_SRR_ADD_A:
3676         tcg_gen_add_tl(cpu_gpr_a[r1], cpu_gpr_a[r1], cpu_gpr_a[r2]);
3677         break;
3678     case OPC1_16_SRR_ADDS:
3679         gen_adds(cpu_gpr_d[r1], cpu_gpr_d[r1], cpu_gpr_d[r2]);
3680         break;
3681     case OPC1_16_SRR_AND:
3682         tcg_gen_and_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], cpu_gpr_d[r2]);
3683         break;
3684     case OPC1_16_SRR_CMOV:
3685         temp = tcg_const_tl(0);
3686         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[15], temp,
3687                            cpu_gpr_d[r2], cpu_gpr_d[r1]);
3688         tcg_temp_free(temp);
3689         break;
3690     case OPC1_16_SRR_CMOVN:
3691         temp = tcg_const_tl(0);
3692         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[15], temp,
3693                            cpu_gpr_d[r2], cpu_gpr_d[r1]);
3694         tcg_temp_free(temp);
3695         break;
3696     case OPC1_16_SRR_EQ:
3697         tcg_gen_setcond_tl(TCG_COND_EQ, cpu_gpr_d[15], cpu_gpr_d[r1],
3698                            cpu_gpr_d[r2]);
3699         break;
3700     case OPC1_16_SRR_LT:
3701         tcg_gen_setcond_tl(TCG_COND_LT, cpu_gpr_d[15], cpu_gpr_d[r1],
3702                            cpu_gpr_d[r2]);
3703         break;
3704     case OPC1_16_SRR_MOV:
3705         tcg_gen_mov_tl(cpu_gpr_d[r1], cpu_gpr_d[r2]);
3706         break;
3707     case OPC1_16_SRR_MOV_A:
3708         tcg_gen_mov_tl(cpu_gpr_a[r1], cpu_gpr_d[r2]);
3709         break;
3710     case OPC1_16_SRR_MOV_AA:
3711         tcg_gen_mov_tl(cpu_gpr_a[r1], cpu_gpr_a[r2]);
3712         break;
3713     case OPC1_16_SRR_MOV_D:
3714         tcg_gen_mov_tl(cpu_gpr_d[r1], cpu_gpr_a[r2]);
3715         break;
3716     case OPC1_16_SRR_MUL:
3717         gen_mul_i32s(cpu_gpr_d[r1], cpu_gpr_d[r1], cpu_gpr_d[r2]);
3718         break;
3719     case OPC1_16_SRR_OR:
3720         tcg_gen_or_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], cpu_gpr_d[r2]);
3721         break;
3722     case OPC1_16_SRR_SUB:
3723         gen_sub_d(cpu_gpr_d[r1], cpu_gpr_d[r1], cpu_gpr_d[r2]);
3724         break;
3725     case OPC1_16_SRR_SUB_A15B:
3726         gen_sub_d(cpu_gpr_d[r1], cpu_gpr_d[15], cpu_gpr_d[r2]);
3727         break;
3728     case OPC1_16_SRR_SUB_15AB:
3729         gen_sub_d(cpu_gpr_d[15], cpu_gpr_d[r1], cpu_gpr_d[r2]);
3730         break;
3731     case OPC1_16_SRR_SUBS:
3732         gen_subs(cpu_gpr_d[r1], cpu_gpr_d[r1], cpu_gpr_d[r2]);
3733         break;
3734     case OPC1_16_SRR_XOR:
3735         tcg_gen_xor_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], cpu_gpr_d[r2]);
3736         break;
3737     default:
3738         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
3739     }
3740 }
3741 
3742 static void decode_ssr_opc(DisasContext *ctx, int op1)
3743 {
3744     int r1, r2;
3745 
3746     r1 = MASK_OP_SSR_S1(ctx->opcode);
3747     r2 = MASK_OP_SSR_S2(ctx->opcode);
3748 
3749     switch (op1) {
3750     case OPC1_16_SSR_ST_A:
3751         tcg_gen_qemu_st_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LEUL);
3752         break;
3753     case OPC1_16_SSR_ST_A_POSTINC:
3754         tcg_gen_qemu_st_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LEUL);
3755         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 4);
3756         break;
3757     case OPC1_16_SSR_ST_B:
3758         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_UB);
3759         break;
3760     case OPC1_16_SSR_ST_B_POSTINC:
3761         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_UB);
3762         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 1);
3763         break;
3764     case OPC1_16_SSR_ST_H:
3765         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LEUW);
3766         break;
3767     case OPC1_16_SSR_ST_H_POSTINC:
3768         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LEUW);
3769         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 2);
3770         break;
3771     case OPC1_16_SSR_ST_W:
3772         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LEUL);
3773         break;
3774     case OPC1_16_SSR_ST_W_POSTINC:
3775         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LEUL);
3776         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 4);
3777         break;
3778     default:
3779         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
3780     }
3781 }
3782 
3783 static void decode_sc_opc(DisasContext *ctx, int op1)
3784 {
3785     int32_t const16;
3786 
3787     const16 = MASK_OP_SC_CONST8(ctx->opcode);
3788 
3789     switch (op1) {
3790     case OPC1_16_SC_AND:
3791         tcg_gen_andi_tl(cpu_gpr_d[15], cpu_gpr_d[15], const16);
3792         break;
3793     case OPC1_16_SC_BISR:
3794         gen_helper_1arg(bisr, const16 & 0xff);
3795         break;
3796     case OPC1_16_SC_LD_A:
3797         gen_offset_ld(ctx, cpu_gpr_a[15], cpu_gpr_a[10], const16 * 4, MO_LESL);
3798         break;
3799     case OPC1_16_SC_LD_W:
3800         gen_offset_ld(ctx, cpu_gpr_d[15], cpu_gpr_a[10], const16 * 4, MO_LESL);
3801         break;
3802     case OPC1_16_SC_MOV:
3803         tcg_gen_movi_tl(cpu_gpr_d[15], const16);
3804         break;
3805     case OPC1_16_SC_OR:
3806         tcg_gen_ori_tl(cpu_gpr_d[15], cpu_gpr_d[15], const16);
3807         break;
3808     case OPC1_16_SC_ST_A:
3809         gen_offset_st(ctx, cpu_gpr_a[15], cpu_gpr_a[10], const16 * 4, MO_LESL);
3810         break;
3811     case OPC1_16_SC_ST_W:
3812         gen_offset_st(ctx, cpu_gpr_d[15], cpu_gpr_a[10], const16 * 4, MO_LESL);
3813         break;
3814     case OPC1_16_SC_SUB_A:
3815         tcg_gen_subi_tl(cpu_gpr_a[10], cpu_gpr_a[10], const16);
3816         break;
3817     default:
3818         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
3819     }
3820 }
3821 
3822 static void decode_slr_opc(DisasContext *ctx, int op1)
3823 {
3824     int r1, r2;
3825 
3826     r1 = MASK_OP_SLR_D(ctx->opcode);
3827     r2 = MASK_OP_SLR_S2(ctx->opcode);
3828 
3829     switch (op1) {
3830 /* SLR-format */
3831     case OPC1_16_SLR_LD_A:
3832         tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESL);
3833         break;
3834     case OPC1_16_SLR_LD_A_POSTINC:
3835         tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESL);
3836         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 4);
3837         break;
3838     case OPC1_16_SLR_LD_BU:
3839         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_UB);
3840         break;
3841     case OPC1_16_SLR_LD_BU_POSTINC:
3842         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_UB);
3843         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 1);
3844         break;
3845     case OPC1_16_SLR_LD_H:
3846         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESW);
3847         break;
3848     case OPC1_16_SLR_LD_H_POSTINC:
3849         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESW);
3850         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 2);
3851         break;
3852     case OPC1_16_SLR_LD_W:
3853         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESL);
3854         break;
3855     case OPC1_16_SLR_LD_W_POSTINC:
3856         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESL);
3857         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 4);
3858         break;
3859     default:
3860         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
3861     }
3862 }
3863 
3864 static void decode_sro_opc(DisasContext *ctx, int op1)
3865 {
3866     int r2;
3867     int32_t address;
3868 
3869     r2 = MASK_OP_SRO_S2(ctx->opcode);
3870     address = MASK_OP_SRO_OFF4(ctx->opcode);
3871 
3872 /* SRO-format */
3873     switch (op1) {
3874     case OPC1_16_SRO_LD_A:
3875         gen_offset_ld(ctx, cpu_gpr_a[15], cpu_gpr_a[r2], address * 4, MO_LESL);
3876         break;
3877     case OPC1_16_SRO_LD_BU:
3878         gen_offset_ld(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address, MO_UB);
3879         break;
3880     case OPC1_16_SRO_LD_H:
3881         gen_offset_ld(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address, MO_LESW);
3882         break;
3883     case OPC1_16_SRO_LD_W:
3884         gen_offset_ld(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address * 4, MO_LESL);
3885         break;
3886     case OPC1_16_SRO_ST_A:
3887         gen_offset_st(ctx, cpu_gpr_a[15], cpu_gpr_a[r2], address * 4, MO_LESL);
3888         break;
3889     case OPC1_16_SRO_ST_B:
3890         gen_offset_st(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address, MO_UB);
3891         break;
3892     case OPC1_16_SRO_ST_H:
3893         gen_offset_st(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address * 2, MO_LESW);
3894         break;
3895     case OPC1_16_SRO_ST_W:
3896         gen_offset_st(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address * 4, MO_LESL);
3897         break;
3898     default:
3899         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
3900     }
3901 }
3902 
3903 static void decode_sr_system(DisasContext *ctx)
3904 {
3905     uint32_t op2;
3906     op2 = MASK_OP_SR_OP2(ctx->opcode);
3907 
3908     switch (op2) {
3909     case OPC2_16_SR_NOP:
3910         break;
3911     case OPC2_16_SR_RET:
3912         gen_compute_branch(ctx, op2, 0, 0, 0, 0);
3913         break;
3914     case OPC2_16_SR_RFE:
3915         gen_helper_rfe(cpu_env);
3916         tcg_gen_exit_tb(NULL, 0);
3917         ctx->base.is_jmp = DISAS_NORETURN;
3918         break;
3919     case OPC2_16_SR_DEBUG:
3920         /* raise EXCP_DEBUG */
3921         break;
3922     case OPC2_16_SR_FRET:
3923         gen_fret(ctx);
3924         break;
3925     default:
3926         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
3927     }
3928 }
3929 
3930 static void decode_sr_accu(DisasContext *ctx)
3931 {
3932     uint32_t op2;
3933     uint32_t r1;
3934     TCGv temp;
3935 
3936     r1 = MASK_OP_SR_S1D(ctx->opcode);
3937     op2 = MASK_OP_SR_OP2(ctx->opcode);
3938 
3939     switch (op2) {
3940     case OPC2_16_SR_RSUB:
3941         /* overflow only if r1 = -0x80000000 */
3942         temp = tcg_const_i32(-0x80000000);
3943         /* calc V bit */
3944         tcg_gen_setcond_tl(TCG_COND_EQ, cpu_PSW_V, cpu_gpr_d[r1], temp);
3945         tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
3946         /* calc SV bit */
3947         tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
3948         /* sub */
3949         tcg_gen_neg_tl(cpu_gpr_d[r1], cpu_gpr_d[r1]);
3950         /* calc av */
3951         tcg_gen_add_tl(cpu_PSW_AV, cpu_gpr_d[r1], cpu_gpr_d[r1]);
3952         tcg_gen_xor_tl(cpu_PSW_AV, cpu_gpr_d[r1], cpu_PSW_AV);
3953         /* calc sav */
3954         tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
3955         tcg_temp_free(temp);
3956         break;
3957     case OPC2_16_SR_SAT_B:
3958         gen_saturate(cpu_gpr_d[r1], cpu_gpr_d[r1], 0x7f, -0x80);
3959         break;
3960     case OPC2_16_SR_SAT_BU:
3961         gen_saturate_u(cpu_gpr_d[r1], cpu_gpr_d[r1], 0xff);
3962         break;
3963     case OPC2_16_SR_SAT_H:
3964         gen_saturate(cpu_gpr_d[r1], cpu_gpr_d[r1], 0x7fff, -0x8000);
3965         break;
3966     case OPC2_16_SR_SAT_HU:
3967         gen_saturate_u(cpu_gpr_d[r1], cpu_gpr_d[r1], 0xffff);
3968         break;
3969     default:
3970         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
3971     }
3972 }
3973 
3974 static void decode_16Bit_opc(DisasContext *ctx)
3975 {
3976     int op1;
3977     int r1, r2;
3978     int32_t const16;
3979     int32_t address;
3980     TCGv temp;
3981 
3982     op1 = MASK_OP_MAJOR(ctx->opcode);
3983 
3984     /* handle ADDSC.A opcode only being 6 bit long */
3985     if (unlikely((op1 & 0x3f) == OPC1_16_SRRS_ADDSC_A)) {
3986         op1 = OPC1_16_SRRS_ADDSC_A;
3987     }
3988 
3989     switch (op1) {
3990     case OPC1_16_SRC_ADD:
3991     case OPC1_16_SRC_ADD_A15:
3992     case OPC1_16_SRC_ADD_15A:
3993     case OPC1_16_SRC_ADD_A:
3994     case OPC1_16_SRC_CADD:
3995     case OPC1_16_SRC_CADDN:
3996     case OPC1_16_SRC_CMOV:
3997     case OPC1_16_SRC_CMOVN:
3998     case OPC1_16_SRC_EQ:
3999     case OPC1_16_SRC_LT:
4000     case OPC1_16_SRC_MOV:
4001     case OPC1_16_SRC_MOV_A:
4002     case OPC1_16_SRC_MOV_E:
4003     case OPC1_16_SRC_SH:
4004     case OPC1_16_SRC_SHA:
4005         decode_src_opc(ctx, op1);
4006         break;
4007 /* SRR-format */
4008     case OPC1_16_SRR_ADD:
4009     case OPC1_16_SRR_ADD_A15:
4010     case OPC1_16_SRR_ADD_15A:
4011     case OPC1_16_SRR_ADD_A:
4012     case OPC1_16_SRR_ADDS:
4013     case OPC1_16_SRR_AND:
4014     case OPC1_16_SRR_CMOV:
4015     case OPC1_16_SRR_CMOVN:
4016     case OPC1_16_SRR_EQ:
4017     case OPC1_16_SRR_LT:
4018     case OPC1_16_SRR_MOV:
4019     case OPC1_16_SRR_MOV_A:
4020     case OPC1_16_SRR_MOV_AA:
4021     case OPC1_16_SRR_MOV_D:
4022     case OPC1_16_SRR_MUL:
4023     case OPC1_16_SRR_OR:
4024     case OPC1_16_SRR_SUB:
4025     case OPC1_16_SRR_SUB_A15B:
4026     case OPC1_16_SRR_SUB_15AB:
4027     case OPC1_16_SRR_SUBS:
4028     case OPC1_16_SRR_XOR:
4029         decode_srr_opc(ctx, op1);
4030         break;
4031 /* SSR-format */
4032     case OPC1_16_SSR_ST_A:
4033     case OPC1_16_SSR_ST_A_POSTINC:
4034     case OPC1_16_SSR_ST_B:
4035     case OPC1_16_SSR_ST_B_POSTINC:
4036     case OPC1_16_SSR_ST_H:
4037     case OPC1_16_SSR_ST_H_POSTINC:
4038     case OPC1_16_SSR_ST_W:
4039     case OPC1_16_SSR_ST_W_POSTINC:
4040         decode_ssr_opc(ctx, op1);
4041         break;
4042 /* SRRS-format */
4043     case OPC1_16_SRRS_ADDSC_A:
4044         r2 = MASK_OP_SRRS_S2(ctx->opcode);
4045         r1 = MASK_OP_SRRS_S1D(ctx->opcode);
4046         const16 = MASK_OP_SRRS_N(ctx->opcode);
4047         temp = tcg_temp_new();
4048         tcg_gen_shli_tl(temp, cpu_gpr_d[15], const16);
4049         tcg_gen_add_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], temp);
4050         tcg_temp_free(temp);
4051         break;
4052 /* SLRO-format */
4053     case OPC1_16_SLRO_LD_A:
4054         r1 = MASK_OP_SLRO_D(ctx->opcode);
4055         const16 = MASK_OP_SLRO_OFF4(ctx->opcode);
4056         gen_offset_ld(ctx, cpu_gpr_a[r1], cpu_gpr_a[15], const16 * 4, MO_LESL);
4057         break;
4058     case OPC1_16_SLRO_LD_BU:
4059         r1 = MASK_OP_SLRO_D(ctx->opcode);
4060         const16 = MASK_OP_SLRO_OFF4(ctx->opcode);
4061         gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16, MO_UB);
4062         break;
4063     case OPC1_16_SLRO_LD_H:
4064         r1 = MASK_OP_SLRO_D(ctx->opcode);
4065         const16 = MASK_OP_SLRO_OFF4(ctx->opcode);
4066         gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16 * 2, MO_LESW);
4067         break;
4068     case OPC1_16_SLRO_LD_W:
4069         r1 = MASK_OP_SLRO_D(ctx->opcode);
4070         const16 = MASK_OP_SLRO_OFF4(ctx->opcode);
4071         gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16 * 4, MO_LESL);
4072         break;
4073 /* SB-format */
4074     case OPC1_16_SB_CALL:
4075     case OPC1_16_SB_J:
4076     case OPC1_16_SB_JNZ:
4077     case OPC1_16_SB_JZ:
4078         address = MASK_OP_SB_DISP8_SEXT(ctx->opcode);
4079         gen_compute_branch(ctx, op1, 0, 0, 0, address);
4080         break;
4081 /* SBC-format */
4082     case OPC1_16_SBC_JEQ:
4083     case OPC1_16_SBC_JNE:
4084         address = MASK_OP_SBC_DISP4(ctx->opcode);
4085         const16 = MASK_OP_SBC_CONST4_SEXT(ctx->opcode);
4086         gen_compute_branch(ctx, op1, 0, 0, const16, address);
4087         break;
4088     case OPC1_16_SBC_JEQ2:
4089     case OPC1_16_SBC_JNE2:
4090         if (has_feature(ctx, TRICORE_FEATURE_16)) {
4091             address = MASK_OP_SBC_DISP4(ctx->opcode);
4092             const16 = MASK_OP_SBC_CONST4_SEXT(ctx->opcode);
4093             gen_compute_branch(ctx, op1, 0, 0, const16, address);
4094         } else {
4095             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4096         }
4097         break;
4098 /* SBRN-format */
4099     case OPC1_16_SBRN_JNZ_T:
4100     case OPC1_16_SBRN_JZ_T:
4101         address = MASK_OP_SBRN_DISP4(ctx->opcode);
4102         const16 = MASK_OP_SBRN_N(ctx->opcode);
4103         gen_compute_branch(ctx, op1, 0, 0, const16, address);
4104         break;
4105 /* SBR-format */
4106     case OPC1_16_SBR_JEQ2:
4107     case OPC1_16_SBR_JNE2:
4108         if (has_feature(ctx, TRICORE_FEATURE_16)) {
4109             r1 = MASK_OP_SBR_S2(ctx->opcode);
4110             address = MASK_OP_SBR_DISP4(ctx->opcode);
4111             gen_compute_branch(ctx, op1, r1, 0, 0, address);
4112         } else {
4113             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4114         }
4115         break;
4116     case OPC1_16_SBR_JEQ:
4117     case OPC1_16_SBR_JGEZ:
4118     case OPC1_16_SBR_JGTZ:
4119     case OPC1_16_SBR_JLEZ:
4120     case OPC1_16_SBR_JLTZ:
4121     case OPC1_16_SBR_JNE:
4122     case OPC1_16_SBR_JNZ:
4123     case OPC1_16_SBR_JNZ_A:
4124     case OPC1_16_SBR_JZ:
4125     case OPC1_16_SBR_JZ_A:
4126     case OPC1_16_SBR_LOOP:
4127         r1 = MASK_OP_SBR_S2(ctx->opcode);
4128         address = MASK_OP_SBR_DISP4(ctx->opcode);
4129         gen_compute_branch(ctx, op1, r1, 0, 0, address);
4130         break;
4131 /* SC-format */
4132     case OPC1_16_SC_AND:
4133     case OPC1_16_SC_BISR:
4134     case OPC1_16_SC_LD_A:
4135     case OPC1_16_SC_LD_W:
4136     case OPC1_16_SC_MOV:
4137     case OPC1_16_SC_OR:
4138     case OPC1_16_SC_ST_A:
4139     case OPC1_16_SC_ST_W:
4140     case OPC1_16_SC_SUB_A:
4141         decode_sc_opc(ctx, op1);
4142         break;
4143 /* SLR-format */
4144     case OPC1_16_SLR_LD_A:
4145     case OPC1_16_SLR_LD_A_POSTINC:
4146     case OPC1_16_SLR_LD_BU:
4147     case OPC1_16_SLR_LD_BU_POSTINC:
4148     case OPC1_16_SLR_LD_H:
4149     case OPC1_16_SLR_LD_H_POSTINC:
4150     case OPC1_16_SLR_LD_W:
4151     case OPC1_16_SLR_LD_W_POSTINC:
4152         decode_slr_opc(ctx, op1);
4153         break;
4154 /* SRO-format */
4155     case OPC1_16_SRO_LD_A:
4156     case OPC1_16_SRO_LD_BU:
4157     case OPC1_16_SRO_LD_H:
4158     case OPC1_16_SRO_LD_W:
4159     case OPC1_16_SRO_ST_A:
4160     case OPC1_16_SRO_ST_B:
4161     case OPC1_16_SRO_ST_H:
4162     case OPC1_16_SRO_ST_W:
4163         decode_sro_opc(ctx, op1);
4164         break;
4165 /* SSRO-format */
4166     case OPC1_16_SSRO_ST_A:
4167         r1 = MASK_OP_SSRO_S1(ctx->opcode);
4168         const16 = MASK_OP_SSRO_OFF4(ctx->opcode);
4169         gen_offset_st(ctx, cpu_gpr_a[r1], cpu_gpr_a[15], const16 * 4, MO_LESL);
4170         break;
4171     case OPC1_16_SSRO_ST_B:
4172         r1 = MASK_OP_SSRO_S1(ctx->opcode);
4173         const16 = MASK_OP_SSRO_OFF4(ctx->opcode);
4174         gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16, MO_UB);
4175         break;
4176     case OPC1_16_SSRO_ST_H:
4177         r1 = MASK_OP_SSRO_S1(ctx->opcode);
4178         const16 = MASK_OP_SSRO_OFF4(ctx->opcode);
4179         gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16 * 2, MO_LESW);
4180         break;
4181     case OPC1_16_SSRO_ST_W:
4182         r1 = MASK_OP_SSRO_S1(ctx->opcode);
4183         const16 = MASK_OP_SSRO_OFF4(ctx->opcode);
4184         gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16 * 4, MO_LESL);
4185         break;
4186 /* SR-format */
4187     case OPCM_16_SR_SYSTEM:
4188         decode_sr_system(ctx);
4189         break;
4190     case OPCM_16_SR_ACCU:
4191         decode_sr_accu(ctx);
4192         break;
4193     case OPC1_16_SR_JI:
4194         r1 = MASK_OP_SR_S1D(ctx->opcode);
4195         gen_compute_branch(ctx, op1, r1, 0, 0, 0);
4196         break;
4197     case OPC1_16_SR_NOT:
4198         r1 = MASK_OP_SR_S1D(ctx->opcode);
4199         tcg_gen_not_tl(cpu_gpr_d[r1], cpu_gpr_d[r1]);
4200         break;
4201     default:
4202         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4203     }
4204 }
4205 
4206 /*
4207  * 32 bit instructions
4208  */
4209 
4210 /* ABS-format */
4211 static void decode_abs_ldw(DisasContext *ctx)
4212 {
4213     int32_t op2;
4214     int32_t r1;
4215     uint32_t address;
4216     TCGv temp;
4217 
4218     r1 = MASK_OP_ABS_S1D(ctx->opcode);
4219     address = MASK_OP_ABS_OFF18(ctx->opcode);
4220     op2 = MASK_OP_ABS_OP2(ctx->opcode);
4221 
4222     temp = tcg_const_i32(EA_ABS_FORMAT(address));
4223 
4224     switch (op2) {
4225     case OPC2_32_ABS_LD_A:
4226         tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], temp, ctx->mem_idx, MO_LESL);
4227         break;
4228     case OPC2_32_ABS_LD_D:
4229         CHECK_REG_PAIR(r1);
4230         gen_ld_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], temp, ctx);
4231         break;
4232     case OPC2_32_ABS_LD_DA:
4233         CHECK_REG_PAIR(r1);
4234         gen_ld_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], temp, ctx);
4235         break;
4236     case OPC2_32_ABS_LD_W:
4237         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LESL);
4238         break;
4239     default:
4240         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4241     }
4242 
4243     tcg_temp_free(temp);
4244 }
4245 
4246 static void decode_abs_ldb(DisasContext *ctx)
4247 {
4248     int32_t op2;
4249     int32_t r1;
4250     uint32_t address;
4251     TCGv temp;
4252 
4253     r1 = MASK_OP_ABS_S1D(ctx->opcode);
4254     address = MASK_OP_ABS_OFF18(ctx->opcode);
4255     op2 = MASK_OP_ABS_OP2(ctx->opcode);
4256 
4257     temp = tcg_const_i32(EA_ABS_FORMAT(address));
4258 
4259     switch (op2) {
4260     case OPC2_32_ABS_LD_B:
4261         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_SB);
4262         break;
4263     case OPC2_32_ABS_LD_BU:
4264         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_UB);
4265         break;
4266     case OPC2_32_ABS_LD_H:
4267         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LESW);
4268         break;
4269     case OPC2_32_ABS_LD_HU:
4270         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LEUW);
4271         break;
4272     default:
4273         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4274     }
4275 
4276     tcg_temp_free(temp);
4277 }
4278 
4279 static void decode_abs_ldst_swap(DisasContext *ctx)
4280 {
4281     int32_t op2;
4282     int32_t r1;
4283     uint32_t address;
4284     TCGv temp;
4285 
4286     r1 = MASK_OP_ABS_S1D(ctx->opcode);
4287     address = MASK_OP_ABS_OFF18(ctx->opcode);
4288     op2 = MASK_OP_ABS_OP2(ctx->opcode);
4289 
4290     temp = tcg_const_i32(EA_ABS_FORMAT(address));
4291 
4292     switch (op2) {
4293     case OPC2_32_ABS_LDMST:
4294         gen_ldmst(ctx, r1, temp);
4295         break;
4296     case OPC2_32_ABS_SWAP_W:
4297         gen_swap(ctx, r1, temp);
4298         break;
4299     default:
4300         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4301     }
4302 
4303     tcg_temp_free(temp);
4304 }
4305 
4306 static void decode_abs_ldst_context(DisasContext *ctx)
4307 {
4308     uint32_t op2;
4309     int32_t off18;
4310 
4311     off18 = MASK_OP_ABS_OFF18(ctx->opcode);
4312     op2   = MASK_OP_ABS_OP2(ctx->opcode);
4313 
4314     switch (op2) {
4315     case OPC2_32_ABS_LDLCX:
4316         gen_helper_1arg(ldlcx, EA_ABS_FORMAT(off18));
4317         break;
4318     case OPC2_32_ABS_LDUCX:
4319         gen_helper_1arg(lducx, EA_ABS_FORMAT(off18));
4320         break;
4321     case OPC2_32_ABS_STLCX:
4322         gen_helper_1arg(stlcx, EA_ABS_FORMAT(off18));
4323         break;
4324     case OPC2_32_ABS_STUCX:
4325         gen_helper_1arg(stucx, EA_ABS_FORMAT(off18));
4326         break;
4327     default:
4328         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4329     }
4330 }
4331 
4332 static void decode_abs_store(DisasContext *ctx)
4333 {
4334     int32_t op2;
4335     int32_t r1;
4336     uint32_t address;
4337     TCGv temp;
4338 
4339     r1 = MASK_OP_ABS_S1D(ctx->opcode);
4340     address = MASK_OP_ABS_OFF18(ctx->opcode);
4341     op2 = MASK_OP_ABS_OP2(ctx->opcode);
4342 
4343     temp = tcg_const_i32(EA_ABS_FORMAT(address));
4344 
4345     switch (op2) {
4346     case OPC2_32_ABS_ST_A:
4347         tcg_gen_qemu_st_tl(cpu_gpr_a[r1], temp, ctx->mem_idx, MO_LESL);
4348         break;
4349     case OPC2_32_ABS_ST_D:
4350         CHECK_REG_PAIR(r1);
4351         gen_st_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], temp, ctx);
4352         break;
4353     case OPC2_32_ABS_ST_DA:
4354         CHECK_REG_PAIR(r1);
4355         gen_st_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], temp, ctx);
4356         break;
4357     case OPC2_32_ABS_ST_W:
4358         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LESL);
4359         break;
4360     default:
4361         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4362     }
4363     tcg_temp_free(temp);
4364 }
4365 
4366 static void decode_abs_storeb_h(DisasContext *ctx)
4367 {
4368     int32_t op2;
4369     int32_t r1;
4370     uint32_t address;
4371     TCGv temp;
4372 
4373     r1 = MASK_OP_ABS_S1D(ctx->opcode);
4374     address = MASK_OP_ABS_OFF18(ctx->opcode);
4375     op2 = MASK_OP_ABS_OP2(ctx->opcode);
4376 
4377     temp = tcg_const_i32(EA_ABS_FORMAT(address));
4378 
4379     switch (op2) {
4380     case OPC2_32_ABS_ST_B:
4381         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_UB);
4382         break;
4383     case OPC2_32_ABS_ST_H:
4384         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LEUW);
4385         break;
4386     default:
4387         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4388     }
4389     tcg_temp_free(temp);
4390 }
4391 
4392 /* Bit-format */
4393 
4394 static void decode_bit_andacc(DisasContext *ctx)
4395 {
4396     uint32_t op2;
4397     int r1, r2, r3;
4398     int pos1, pos2;
4399 
4400     r1 = MASK_OP_BIT_S1(ctx->opcode);
4401     r2 = MASK_OP_BIT_S2(ctx->opcode);
4402     r3 = MASK_OP_BIT_D(ctx->opcode);
4403     pos1 = MASK_OP_BIT_POS1(ctx->opcode);
4404     pos2 = MASK_OP_BIT_POS2(ctx->opcode);
4405     op2 = MASK_OP_BIT_OP2(ctx->opcode);
4406 
4407 
4408     switch (op2) {
4409     case OPC2_32_BIT_AND_AND_T:
4410         gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4411                     pos1, pos2, &tcg_gen_and_tl, &tcg_gen_and_tl);
4412         break;
4413     case OPC2_32_BIT_AND_ANDN_T:
4414         gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4415                     pos1, pos2, &tcg_gen_andc_tl, &tcg_gen_and_tl);
4416         break;
4417     case OPC2_32_BIT_AND_NOR_T:
4418         if (TCG_TARGET_HAS_andc_i32) {
4419             gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4420                         pos1, pos2, &tcg_gen_or_tl, &tcg_gen_andc_tl);
4421         } else {
4422             gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4423                         pos1, pos2, &tcg_gen_nor_tl, &tcg_gen_and_tl);
4424         }
4425         break;
4426     case OPC2_32_BIT_AND_OR_T:
4427         gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4428                     pos1, pos2, &tcg_gen_or_tl, &tcg_gen_and_tl);
4429         break;
4430     default:
4431         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4432     }
4433 }
4434 
4435 static void decode_bit_logical_t(DisasContext *ctx)
4436 {
4437     uint32_t op2;
4438     int r1, r2, r3;
4439     int pos1, pos2;
4440     r1 = MASK_OP_BIT_S1(ctx->opcode);
4441     r2 = MASK_OP_BIT_S2(ctx->opcode);
4442     r3 = MASK_OP_BIT_D(ctx->opcode);
4443     pos1 = MASK_OP_BIT_POS1(ctx->opcode);
4444     pos2 = MASK_OP_BIT_POS2(ctx->opcode);
4445     op2 = MASK_OP_BIT_OP2(ctx->opcode);
4446 
4447     switch (op2) {
4448     case OPC2_32_BIT_AND_T:
4449         gen_bit_1op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4450                     pos1, pos2, &tcg_gen_and_tl);
4451         break;
4452     case OPC2_32_BIT_ANDN_T:
4453         gen_bit_1op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4454                     pos1, pos2, &tcg_gen_andc_tl);
4455         break;
4456     case OPC2_32_BIT_NOR_T:
4457         gen_bit_1op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4458                     pos1, pos2, &tcg_gen_nor_tl);
4459         break;
4460     case OPC2_32_BIT_OR_T:
4461         gen_bit_1op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4462                     pos1, pos2, &tcg_gen_or_tl);
4463         break;
4464     default:
4465         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4466     }
4467 }
4468 
4469 static void decode_bit_insert(DisasContext *ctx)
4470 {
4471     uint32_t op2;
4472     int r1, r2, r3;
4473     int pos1, pos2;
4474     TCGv temp;
4475     op2 = MASK_OP_BIT_OP2(ctx->opcode);
4476     r1 = MASK_OP_BIT_S1(ctx->opcode);
4477     r2 = MASK_OP_BIT_S2(ctx->opcode);
4478     r3 = MASK_OP_BIT_D(ctx->opcode);
4479     pos1 = MASK_OP_BIT_POS1(ctx->opcode);
4480     pos2 = MASK_OP_BIT_POS2(ctx->opcode);
4481 
4482     temp = tcg_temp_new();
4483 
4484     tcg_gen_shri_tl(temp, cpu_gpr_d[r2], pos2);
4485     if (op2 == OPC2_32_BIT_INSN_T) {
4486         tcg_gen_not_tl(temp, temp);
4487     }
4488     tcg_gen_deposit_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], temp, pos1, 1);
4489     tcg_temp_free(temp);
4490 }
4491 
4492 static void decode_bit_logical_t2(DisasContext *ctx)
4493 {
4494     uint32_t op2;
4495 
4496     int r1, r2, r3;
4497     int pos1, pos2;
4498 
4499     op2 = MASK_OP_BIT_OP2(ctx->opcode);
4500     r1 = MASK_OP_BIT_S1(ctx->opcode);
4501     r2 = MASK_OP_BIT_S2(ctx->opcode);
4502     r3 = MASK_OP_BIT_D(ctx->opcode);
4503     pos1 = MASK_OP_BIT_POS1(ctx->opcode);
4504     pos2 = MASK_OP_BIT_POS2(ctx->opcode);
4505 
4506     switch (op2) {
4507     case OPC2_32_BIT_NAND_T:
4508         gen_bit_1op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4509                     pos1, pos2, &tcg_gen_nand_tl);
4510         break;
4511     case OPC2_32_BIT_ORN_T:
4512         gen_bit_1op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4513                     pos1, pos2, &tcg_gen_orc_tl);
4514         break;
4515     case OPC2_32_BIT_XNOR_T:
4516         gen_bit_1op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4517                     pos1, pos2, &tcg_gen_eqv_tl);
4518         break;
4519     case OPC2_32_BIT_XOR_T:
4520         gen_bit_1op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4521                     pos1, pos2, &tcg_gen_xor_tl);
4522         break;
4523     default:
4524         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4525     }
4526 }
4527 
4528 static void decode_bit_orand(DisasContext *ctx)
4529 {
4530     uint32_t op2;
4531 
4532     int r1, r2, r3;
4533     int pos1, pos2;
4534 
4535     op2 = MASK_OP_BIT_OP2(ctx->opcode);
4536     r1 = MASK_OP_BIT_S1(ctx->opcode);
4537     r2 = MASK_OP_BIT_S2(ctx->opcode);
4538     r3 = MASK_OP_BIT_D(ctx->opcode);
4539     pos1 = MASK_OP_BIT_POS1(ctx->opcode);
4540     pos2 = MASK_OP_BIT_POS2(ctx->opcode);
4541 
4542     switch (op2) {
4543     case OPC2_32_BIT_OR_AND_T:
4544         gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4545                     pos1, pos2, &tcg_gen_and_tl, &tcg_gen_or_tl);
4546         break;
4547     case OPC2_32_BIT_OR_ANDN_T:
4548         gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4549                     pos1, pos2, &tcg_gen_andc_tl, &tcg_gen_or_tl);
4550         break;
4551     case OPC2_32_BIT_OR_NOR_T:
4552         if (TCG_TARGET_HAS_orc_i32) {
4553             gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4554                         pos1, pos2, &tcg_gen_or_tl, &tcg_gen_orc_tl);
4555         } else {
4556             gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4557                         pos1, pos2, &tcg_gen_nor_tl, &tcg_gen_or_tl);
4558         }
4559         break;
4560     case OPC2_32_BIT_OR_OR_T:
4561         gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
4562                     pos1, pos2, &tcg_gen_or_tl, &tcg_gen_or_tl);
4563         break;
4564     default:
4565         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4566     }
4567 }
4568 
4569 static void decode_bit_sh_logic1(DisasContext *ctx)
4570 {
4571     uint32_t op2;
4572     int r1, r2, r3;
4573     int pos1, pos2;
4574     TCGv temp;
4575 
4576     op2 = MASK_OP_BIT_OP2(ctx->opcode);
4577     r1 = MASK_OP_BIT_S1(ctx->opcode);
4578     r2 = MASK_OP_BIT_S2(ctx->opcode);
4579     r3 = MASK_OP_BIT_D(ctx->opcode);
4580     pos1 = MASK_OP_BIT_POS1(ctx->opcode);
4581     pos2 = MASK_OP_BIT_POS2(ctx->opcode);
4582 
4583     temp = tcg_temp_new();
4584 
4585     switch (op2) {
4586     case OPC2_32_BIT_SH_AND_T:
4587         gen_bit_1op(temp, cpu_gpr_d[r1], cpu_gpr_d[r2],
4588                     pos1, pos2, &tcg_gen_and_tl);
4589         break;
4590     case OPC2_32_BIT_SH_ANDN_T:
4591         gen_bit_1op(temp, cpu_gpr_d[r1], cpu_gpr_d[r2],
4592                     pos1, pos2, &tcg_gen_andc_tl);
4593         break;
4594     case OPC2_32_BIT_SH_NOR_T:
4595         gen_bit_1op(temp, cpu_gpr_d[r1], cpu_gpr_d[r2],
4596                     pos1, pos2, &tcg_gen_nor_tl);
4597         break;
4598     case OPC2_32_BIT_SH_OR_T:
4599         gen_bit_1op(temp, cpu_gpr_d[r1], cpu_gpr_d[r2],
4600                     pos1, pos2, &tcg_gen_or_tl);
4601         break;
4602     default:
4603         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4604     }
4605     tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], 1);
4606     tcg_gen_add_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], temp);
4607     tcg_temp_free(temp);
4608 }
4609 
4610 static void decode_bit_sh_logic2(DisasContext *ctx)
4611 {
4612     uint32_t op2;
4613     int r1, r2, r3;
4614     int pos1, pos2;
4615     TCGv temp;
4616 
4617     op2 = MASK_OP_BIT_OP2(ctx->opcode);
4618     r1 = MASK_OP_BIT_S1(ctx->opcode);
4619     r2 = MASK_OP_BIT_S2(ctx->opcode);
4620     r3 = MASK_OP_BIT_D(ctx->opcode);
4621     pos1 = MASK_OP_BIT_POS1(ctx->opcode);
4622     pos2 = MASK_OP_BIT_POS2(ctx->opcode);
4623 
4624     temp = tcg_temp_new();
4625 
4626     switch (op2) {
4627     case OPC2_32_BIT_SH_NAND_T:
4628         gen_bit_1op(temp, cpu_gpr_d[r1] , cpu_gpr_d[r2] ,
4629                     pos1, pos2, &tcg_gen_nand_tl);
4630         break;
4631     case OPC2_32_BIT_SH_ORN_T:
4632         gen_bit_1op(temp, cpu_gpr_d[r1], cpu_gpr_d[r2],
4633                     pos1, pos2, &tcg_gen_orc_tl);
4634         break;
4635     case OPC2_32_BIT_SH_XNOR_T:
4636         gen_bit_1op(temp, cpu_gpr_d[r1], cpu_gpr_d[r2],
4637                     pos1, pos2, &tcg_gen_eqv_tl);
4638         break;
4639     case OPC2_32_BIT_SH_XOR_T:
4640         gen_bit_1op(temp, cpu_gpr_d[r1], cpu_gpr_d[r2],
4641                     pos1, pos2, &tcg_gen_xor_tl);
4642         break;
4643     default:
4644         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4645     }
4646     tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], 1);
4647     tcg_gen_add_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], temp);
4648     tcg_temp_free(temp);
4649 }
4650 
4651 /* BO-format */
4652 
4653 
4654 static void decode_bo_addrmode_post_pre_base(DisasContext *ctx)
4655 {
4656     uint32_t op2;
4657     uint32_t off10;
4658     int32_t r1, r2;
4659     TCGv temp;
4660 
4661     r1 = MASK_OP_BO_S1D(ctx->opcode);
4662     r2  = MASK_OP_BO_S2(ctx->opcode);
4663     off10 = MASK_OP_BO_OFF10_SEXT(ctx->opcode);
4664     op2 = MASK_OP_BO_OP2(ctx->opcode);
4665 
4666     switch (op2) {
4667     case OPC2_32_BO_CACHEA_WI_SHORTOFF:
4668     case OPC2_32_BO_CACHEA_W_SHORTOFF:
4669     case OPC2_32_BO_CACHEA_I_SHORTOFF:
4670         /* instruction to access the cache */
4671         break;
4672     case OPC2_32_BO_CACHEA_WI_POSTINC:
4673     case OPC2_32_BO_CACHEA_W_POSTINC:
4674     case OPC2_32_BO_CACHEA_I_POSTINC:
4675         /* instruction to access the cache, but we still need to handle
4676            the addressing mode */
4677         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4678         break;
4679     case OPC2_32_BO_CACHEA_WI_PREINC:
4680     case OPC2_32_BO_CACHEA_W_PREINC:
4681     case OPC2_32_BO_CACHEA_I_PREINC:
4682         /* instruction to access the cache, but we still need to handle
4683            the addressing mode */
4684         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4685         break;
4686     case OPC2_32_BO_CACHEI_WI_SHORTOFF:
4687     case OPC2_32_BO_CACHEI_W_SHORTOFF:
4688         if (!has_feature(ctx, TRICORE_FEATURE_131)) {
4689             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4690         }
4691         break;
4692     case OPC2_32_BO_CACHEI_W_POSTINC:
4693     case OPC2_32_BO_CACHEI_WI_POSTINC:
4694         if (has_feature(ctx, TRICORE_FEATURE_131)) {
4695             tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4696         } else {
4697             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4698         }
4699         break;
4700     case OPC2_32_BO_CACHEI_W_PREINC:
4701     case OPC2_32_BO_CACHEI_WI_PREINC:
4702         if (has_feature(ctx, TRICORE_FEATURE_131)) {
4703             tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4704         } else {
4705             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4706         }
4707         break;
4708     case OPC2_32_BO_ST_A_SHORTOFF:
4709         gen_offset_st(ctx, cpu_gpr_a[r1], cpu_gpr_a[r2], off10, MO_LESL);
4710         break;
4711     case OPC2_32_BO_ST_A_POSTINC:
4712         tcg_gen_qemu_st_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], ctx->mem_idx,
4713                            MO_LESL);
4714         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4715         break;
4716     case OPC2_32_BO_ST_A_PREINC:
4717         gen_st_preincr(ctx, cpu_gpr_a[r1], cpu_gpr_a[r2], off10, MO_LESL);
4718         break;
4719     case OPC2_32_BO_ST_B_SHORTOFF:
4720         gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_UB);
4721         break;
4722     case OPC2_32_BO_ST_B_POSTINC:
4723         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx,
4724                            MO_UB);
4725         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4726         break;
4727     case OPC2_32_BO_ST_B_PREINC:
4728         gen_st_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_UB);
4729         break;
4730     case OPC2_32_BO_ST_D_SHORTOFF:
4731         CHECK_REG_PAIR(r1);
4732         gen_offset_st_2regs(cpu_gpr_d[r1+1], cpu_gpr_d[r1], cpu_gpr_a[r2],
4733                             off10, ctx);
4734         break;
4735     case OPC2_32_BO_ST_D_POSTINC:
4736         CHECK_REG_PAIR(r1);
4737         gen_st_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], cpu_gpr_a[r2], ctx);
4738         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4739         break;
4740     case OPC2_32_BO_ST_D_PREINC:
4741         CHECK_REG_PAIR(r1);
4742         temp = tcg_temp_new();
4743         tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10);
4744         gen_st_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], temp, ctx);
4745         tcg_gen_mov_tl(cpu_gpr_a[r2], temp);
4746         tcg_temp_free(temp);
4747         break;
4748     case OPC2_32_BO_ST_DA_SHORTOFF:
4749         CHECK_REG_PAIR(r1);
4750         gen_offset_st_2regs(cpu_gpr_a[r1+1], cpu_gpr_a[r1], cpu_gpr_a[r2],
4751                             off10, ctx);
4752         break;
4753     case OPC2_32_BO_ST_DA_POSTINC:
4754         CHECK_REG_PAIR(r1);
4755         gen_st_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], cpu_gpr_a[r2], ctx);
4756         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4757         break;
4758     case OPC2_32_BO_ST_DA_PREINC:
4759         CHECK_REG_PAIR(r1);
4760         temp = tcg_temp_new();
4761         tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10);
4762         gen_st_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], temp, ctx);
4763         tcg_gen_mov_tl(cpu_gpr_a[r2], temp);
4764         tcg_temp_free(temp);
4765         break;
4766     case OPC2_32_BO_ST_H_SHORTOFF:
4767         gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUW);
4768         break;
4769     case OPC2_32_BO_ST_H_POSTINC:
4770         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx,
4771                            MO_LEUW);
4772         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4773         break;
4774     case OPC2_32_BO_ST_H_PREINC:
4775         gen_st_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUW);
4776         break;
4777     case OPC2_32_BO_ST_Q_SHORTOFF:
4778         temp = tcg_temp_new();
4779         tcg_gen_shri_tl(temp, cpu_gpr_d[r1], 16);
4780         gen_offset_st(ctx, temp, cpu_gpr_a[r2], off10, MO_LEUW);
4781         tcg_temp_free(temp);
4782         break;
4783     case OPC2_32_BO_ST_Q_POSTINC:
4784         temp = tcg_temp_new();
4785         tcg_gen_shri_tl(temp, cpu_gpr_d[r1], 16);
4786         tcg_gen_qemu_st_tl(temp, cpu_gpr_a[r2], ctx->mem_idx,
4787                            MO_LEUW);
4788         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4789         tcg_temp_free(temp);
4790         break;
4791     case OPC2_32_BO_ST_Q_PREINC:
4792         temp = tcg_temp_new();
4793         tcg_gen_shri_tl(temp, cpu_gpr_d[r1], 16);
4794         gen_st_preincr(ctx, temp, cpu_gpr_a[r2], off10, MO_LEUW);
4795         tcg_temp_free(temp);
4796         break;
4797     case OPC2_32_BO_ST_W_SHORTOFF:
4798         gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUL);
4799         break;
4800     case OPC2_32_BO_ST_W_POSTINC:
4801         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx,
4802                            MO_LEUL);
4803         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4804         break;
4805     case OPC2_32_BO_ST_W_PREINC:
4806         gen_st_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUL);
4807         break;
4808     default:
4809         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4810     }
4811 }
4812 
4813 static void decode_bo_addrmode_bitreverse_circular(DisasContext *ctx)
4814 {
4815     uint32_t op2;
4816     uint32_t off10;
4817     int32_t r1, r2;
4818     TCGv temp, temp2, temp3;
4819 
4820     r1 = MASK_OP_BO_S1D(ctx->opcode);
4821     r2  = MASK_OP_BO_S2(ctx->opcode);
4822     off10 = MASK_OP_BO_OFF10_SEXT(ctx->opcode);
4823     op2 = MASK_OP_BO_OP2(ctx->opcode);
4824 
4825     temp = tcg_temp_new();
4826     temp2 = tcg_temp_new();
4827     temp3 = tcg_const_i32(off10);
4828     CHECK_REG_PAIR(r2);
4829     tcg_gen_ext16u_tl(temp, cpu_gpr_a[r2+1]);
4830     tcg_gen_add_tl(temp2, cpu_gpr_a[r2], temp);
4831 
4832     switch (op2) {
4833     case OPC2_32_BO_CACHEA_WI_BR:
4834     case OPC2_32_BO_CACHEA_W_BR:
4835     case OPC2_32_BO_CACHEA_I_BR:
4836         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
4837         break;
4838     case OPC2_32_BO_CACHEA_WI_CIRC:
4839     case OPC2_32_BO_CACHEA_W_CIRC:
4840     case OPC2_32_BO_CACHEA_I_CIRC:
4841         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
4842         break;
4843     case OPC2_32_BO_ST_A_BR:
4844         tcg_gen_qemu_st_tl(cpu_gpr_a[r1], temp2, ctx->mem_idx, MO_LEUL);
4845         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
4846         break;
4847     case OPC2_32_BO_ST_A_CIRC:
4848         tcg_gen_qemu_st_tl(cpu_gpr_a[r1], temp2, ctx->mem_idx, MO_LEUL);
4849         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
4850         break;
4851     case OPC2_32_BO_ST_B_BR:
4852         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_UB);
4853         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
4854         break;
4855     case OPC2_32_BO_ST_B_CIRC:
4856         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_UB);
4857         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
4858         break;
4859     case OPC2_32_BO_ST_D_BR:
4860         CHECK_REG_PAIR(r1);
4861         gen_st_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], temp2, ctx);
4862         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
4863         break;
4864     case OPC2_32_BO_ST_D_CIRC:
4865         CHECK_REG_PAIR(r1);
4866         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUL);
4867         tcg_gen_shri_tl(temp2, cpu_gpr_a[r2+1], 16);
4868         tcg_gen_addi_tl(temp, temp, 4);
4869         tcg_gen_rem_tl(temp, temp, temp2);
4870         tcg_gen_add_tl(temp2, cpu_gpr_a[r2], temp);
4871         tcg_gen_qemu_st_tl(cpu_gpr_d[r1+1], temp2, ctx->mem_idx, MO_LEUL);
4872         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
4873         break;
4874     case OPC2_32_BO_ST_DA_BR:
4875         CHECK_REG_PAIR(r1);
4876         gen_st_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], temp2, ctx);
4877         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
4878         break;
4879     case OPC2_32_BO_ST_DA_CIRC:
4880         CHECK_REG_PAIR(r1);
4881         tcg_gen_qemu_st_tl(cpu_gpr_a[r1], temp2, ctx->mem_idx, MO_LEUL);
4882         tcg_gen_shri_tl(temp2, cpu_gpr_a[r2+1], 16);
4883         tcg_gen_addi_tl(temp, temp, 4);
4884         tcg_gen_rem_tl(temp, temp, temp2);
4885         tcg_gen_add_tl(temp2, cpu_gpr_a[r2], temp);
4886         tcg_gen_qemu_st_tl(cpu_gpr_a[r1+1], temp2, ctx->mem_idx, MO_LEUL);
4887         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
4888         break;
4889     case OPC2_32_BO_ST_H_BR:
4890         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUW);
4891         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
4892         break;
4893     case OPC2_32_BO_ST_H_CIRC:
4894         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUW);
4895         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
4896         break;
4897     case OPC2_32_BO_ST_Q_BR:
4898         tcg_gen_shri_tl(temp, cpu_gpr_d[r1], 16);
4899         tcg_gen_qemu_st_tl(temp, temp2, ctx->mem_idx, MO_LEUW);
4900         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
4901         break;
4902     case OPC2_32_BO_ST_Q_CIRC:
4903         tcg_gen_shri_tl(temp, cpu_gpr_d[r1], 16);
4904         tcg_gen_qemu_st_tl(temp, temp2, ctx->mem_idx, MO_LEUW);
4905         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
4906         break;
4907     case OPC2_32_BO_ST_W_BR:
4908         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUL);
4909         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
4910         break;
4911     case OPC2_32_BO_ST_W_CIRC:
4912         tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUL);
4913         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
4914         break;
4915     default:
4916         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4917     }
4918     tcg_temp_free(temp);
4919     tcg_temp_free(temp2);
4920     tcg_temp_free(temp3);
4921 }
4922 
4923 static void decode_bo_addrmode_ld_post_pre_base(DisasContext *ctx)
4924 {
4925     uint32_t op2;
4926     uint32_t off10;
4927     int32_t r1, r2;
4928     TCGv temp;
4929 
4930     r1 = MASK_OP_BO_S1D(ctx->opcode);
4931     r2  = MASK_OP_BO_S2(ctx->opcode);
4932     off10 = MASK_OP_BO_OFF10_SEXT(ctx->opcode);
4933     op2 = MASK_OP_BO_OP2(ctx->opcode);
4934 
4935     switch (op2) {
4936     case OPC2_32_BO_LD_A_SHORTOFF:
4937         gen_offset_ld(ctx, cpu_gpr_a[r1], cpu_gpr_a[r2], off10, MO_LEUL);
4938         break;
4939     case OPC2_32_BO_LD_A_POSTINC:
4940         tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], ctx->mem_idx,
4941                            MO_LEUL);
4942         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4943         break;
4944     case OPC2_32_BO_LD_A_PREINC:
4945         gen_ld_preincr(ctx, cpu_gpr_a[r1], cpu_gpr_a[r2], off10, MO_LEUL);
4946         break;
4947     case OPC2_32_BO_LD_B_SHORTOFF:
4948         gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_SB);
4949         break;
4950     case OPC2_32_BO_LD_B_POSTINC:
4951         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx,
4952                            MO_SB);
4953         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4954         break;
4955     case OPC2_32_BO_LD_B_PREINC:
4956         gen_ld_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_SB);
4957         break;
4958     case OPC2_32_BO_LD_BU_SHORTOFF:
4959         gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_UB);
4960         break;
4961     case OPC2_32_BO_LD_BU_POSTINC:
4962         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx,
4963                            MO_UB);
4964         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4965         break;
4966     case OPC2_32_BO_LD_BU_PREINC:
4967         gen_ld_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_SB);
4968         break;
4969     case OPC2_32_BO_LD_D_SHORTOFF:
4970         CHECK_REG_PAIR(r1);
4971         gen_offset_ld_2regs(cpu_gpr_d[r1+1], cpu_gpr_d[r1], cpu_gpr_a[r2],
4972                             off10, ctx);
4973         break;
4974     case OPC2_32_BO_LD_D_POSTINC:
4975         CHECK_REG_PAIR(r1);
4976         gen_ld_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], cpu_gpr_a[r2], ctx);
4977         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4978         break;
4979     case OPC2_32_BO_LD_D_PREINC:
4980         CHECK_REG_PAIR(r1);
4981         temp = tcg_temp_new();
4982         tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10);
4983         gen_ld_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], temp, ctx);
4984         tcg_gen_mov_tl(cpu_gpr_a[r2], temp);
4985         tcg_temp_free(temp);
4986         break;
4987     case OPC2_32_BO_LD_DA_SHORTOFF:
4988         CHECK_REG_PAIR(r1);
4989         gen_offset_ld_2regs(cpu_gpr_a[r1+1], cpu_gpr_a[r1], cpu_gpr_a[r2],
4990                             off10, ctx);
4991         break;
4992     case OPC2_32_BO_LD_DA_POSTINC:
4993         CHECK_REG_PAIR(r1);
4994         gen_ld_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], cpu_gpr_a[r2], ctx);
4995         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4996         break;
4997     case OPC2_32_BO_LD_DA_PREINC:
4998         CHECK_REG_PAIR(r1);
4999         temp = tcg_temp_new();
5000         tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10);
5001         gen_ld_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], temp, ctx);
5002         tcg_gen_mov_tl(cpu_gpr_a[r2], temp);
5003         tcg_temp_free(temp);
5004         break;
5005     case OPC2_32_BO_LD_H_SHORTOFF:
5006         gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LESW);
5007         break;
5008     case OPC2_32_BO_LD_H_POSTINC:
5009         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx,
5010                            MO_LESW);
5011         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
5012         break;
5013     case OPC2_32_BO_LD_H_PREINC:
5014         gen_ld_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LESW);
5015         break;
5016     case OPC2_32_BO_LD_HU_SHORTOFF:
5017         gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUW);
5018         break;
5019     case OPC2_32_BO_LD_HU_POSTINC:
5020         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx,
5021                            MO_LEUW);
5022         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
5023         break;
5024     case OPC2_32_BO_LD_HU_PREINC:
5025         gen_ld_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUW);
5026         break;
5027     case OPC2_32_BO_LD_Q_SHORTOFF:
5028         gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUW);
5029         tcg_gen_shli_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 16);
5030         break;
5031     case OPC2_32_BO_LD_Q_POSTINC:
5032         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx,
5033                            MO_LEUW);
5034         tcg_gen_shli_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 16);
5035         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
5036         break;
5037     case OPC2_32_BO_LD_Q_PREINC:
5038         gen_ld_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUW);
5039         tcg_gen_shli_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 16);
5040         break;
5041     case OPC2_32_BO_LD_W_SHORTOFF:
5042         gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUL);
5043         break;
5044     case OPC2_32_BO_LD_W_POSTINC:
5045         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx,
5046                            MO_LEUL);
5047         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
5048         break;
5049     case OPC2_32_BO_LD_W_PREINC:
5050         gen_ld_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUL);
5051         break;
5052     default:
5053         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5054     }
5055 }
5056 
5057 static void decode_bo_addrmode_ld_bitreverse_circular(DisasContext *ctx)
5058 {
5059     uint32_t op2;
5060     uint32_t off10;
5061     int r1, r2;
5062 
5063     TCGv temp, temp2, temp3;
5064 
5065     r1 = MASK_OP_BO_S1D(ctx->opcode);
5066     r2 = MASK_OP_BO_S2(ctx->opcode);
5067     off10 = MASK_OP_BO_OFF10_SEXT(ctx->opcode);
5068     op2 = MASK_OP_BO_OP2(ctx->opcode);
5069 
5070     temp = tcg_temp_new();
5071     temp2 = tcg_temp_new();
5072     temp3 = tcg_const_i32(off10);
5073     CHECK_REG_PAIR(r2);
5074     tcg_gen_ext16u_tl(temp, cpu_gpr_a[r2+1]);
5075     tcg_gen_add_tl(temp2, cpu_gpr_a[r2], temp);
5076 
5077 
5078     switch (op2) {
5079     case OPC2_32_BO_LD_A_BR:
5080         tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], temp2, ctx->mem_idx, MO_LEUL);
5081         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
5082         break;
5083     case OPC2_32_BO_LD_A_CIRC:
5084         tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], temp2, ctx->mem_idx, MO_LEUL);
5085         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
5086         break;
5087     case OPC2_32_BO_LD_B_BR:
5088         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_SB);
5089         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
5090         break;
5091     case OPC2_32_BO_LD_B_CIRC:
5092         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_SB);
5093         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
5094         break;
5095     case OPC2_32_BO_LD_BU_BR:
5096         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_UB);
5097         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
5098         break;
5099     case OPC2_32_BO_LD_BU_CIRC:
5100         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_UB);
5101         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
5102         break;
5103     case OPC2_32_BO_LD_D_BR:
5104         CHECK_REG_PAIR(r1);
5105         gen_ld_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], temp2, ctx);
5106         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
5107         break;
5108     case OPC2_32_BO_LD_D_CIRC:
5109         CHECK_REG_PAIR(r1);
5110         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUL);
5111         tcg_gen_shri_tl(temp2, cpu_gpr_a[r2+1], 16);
5112         tcg_gen_addi_tl(temp, temp, 4);
5113         tcg_gen_rem_tl(temp, temp, temp2);
5114         tcg_gen_add_tl(temp2, cpu_gpr_a[r2], temp);
5115         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1+1], temp2, ctx->mem_idx, MO_LEUL);
5116         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
5117         break;
5118     case OPC2_32_BO_LD_DA_BR:
5119         CHECK_REG_PAIR(r1);
5120         gen_ld_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], temp2, ctx);
5121         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
5122         break;
5123     case OPC2_32_BO_LD_DA_CIRC:
5124         CHECK_REG_PAIR(r1);
5125         tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], temp2, ctx->mem_idx, MO_LEUL);
5126         tcg_gen_shri_tl(temp2, cpu_gpr_a[r2+1], 16);
5127         tcg_gen_addi_tl(temp, temp, 4);
5128         tcg_gen_rem_tl(temp, temp, temp2);
5129         tcg_gen_add_tl(temp2, cpu_gpr_a[r2], temp);
5130         tcg_gen_qemu_ld_tl(cpu_gpr_a[r1+1], temp2, ctx->mem_idx, MO_LEUL);
5131         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
5132         break;
5133     case OPC2_32_BO_LD_H_BR:
5134         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LESW);
5135         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
5136         break;
5137     case OPC2_32_BO_LD_H_CIRC:
5138         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LESW);
5139         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
5140         break;
5141     case OPC2_32_BO_LD_HU_BR:
5142         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUW);
5143         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
5144         break;
5145     case OPC2_32_BO_LD_HU_CIRC:
5146         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUW);
5147         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
5148         break;
5149     case OPC2_32_BO_LD_Q_BR:
5150         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUW);
5151         tcg_gen_shli_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 16);
5152         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
5153         break;
5154     case OPC2_32_BO_LD_Q_CIRC:
5155         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUW);
5156         tcg_gen_shli_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 16);
5157         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
5158         break;
5159     case OPC2_32_BO_LD_W_BR:
5160         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUL);
5161         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
5162         break;
5163     case OPC2_32_BO_LD_W_CIRC:
5164         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUL);
5165         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
5166         break;
5167     default:
5168         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5169     }
5170     tcg_temp_free(temp);
5171     tcg_temp_free(temp2);
5172     tcg_temp_free(temp3);
5173 }
5174 
5175 static void decode_bo_addrmode_stctx_post_pre_base(DisasContext *ctx)
5176 {
5177     uint32_t op2;
5178     uint32_t off10;
5179     int r1, r2;
5180 
5181     TCGv temp, temp2;
5182 
5183     r1 = MASK_OP_BO_S1D(ctx->opcode);
5184     r2 = MASK_OP_BO_S2(ctx->opcode);
5185     off10 = MASK_OP_BO_OFF10_SEXT(ctx->opcode);
5186     op2 = MASK_OP_BO_OP2(ctx->opcode);
5187 
5188 
5189     temp = tcg_temp_new();
5190     temp2 = tcg_temp_new();
5191 
5192     switch (op2) {
5193     case OPC2_32_BO_LDLCX_SHORTOFF:
5194         tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10);
5195         gen_helper_ldlcx(cpu_env, temp);
5196         break;
5197     case OPC2_32_BO_LDMST_SHORTOFF:
5198         tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10);
5199         gen_ldmst(ctx, r1, temp);
5200         break;
5201     case OPC2_32_BO_LDMST_POSTINC:
5202         gen_ldmst(ctx, r1, cpu_gpr_a[r2]);
5203         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
5204         break;
5205     case OPC2_32_BO_LDMST_PREINC:
5206         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
5207         gen_ldmst(ctx, r1, cpu_gpr_a[r2]);
5208         break;
5209     case OPC2_32_BO_LDUCX_SHORTOFF:
5210         tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10);
5211         gen_helper_lducx(cpu_env, temp);
5212         break;
5213     case OPC2_32_BO_LEA_SHORTOFF:
5214         tcg_gen_addi_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], off10);
5215         break;
5216     case OPC2_32_BO_STLCX_SHORTOFF:
5217         tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10);
5218         gen_helper_stlcx(cpu_env, temp);
5219         break;
5220     case OPC2_32_BO_STUCX_SHORTOFF:
5221         tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10);
5222         gen_helper_stucx(cpu_env, temp);
5223         break;
5224     case OPC2_32_BO_SWAP_W_SHORTOFF:
5225         tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10);
5226         gen_swap(ctx, r1, temp);
5227         break;
5228     case OPC2_32_BO_SWAP_W_POSTINC:
5229         gen_swap(ctx, r1, cpu_gpr_a[r2]);
5230         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
5231         break;
5232     case OPC2_32_BO_SWAP_W_PREINC:
5233         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
5234         gen_swap(ctx, r1, cpu_gpr_a[r2]);
5235         break;
5236     case OPC2_32_BO_CMPSWAP_W_SHORTOFF:
5237         tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10);
5238         gen_cmpswap(ctx, r1, temp);
5239         break;
5240     case OPC2_32_BO_CMPSWAP_W_POSTINC:
5241         gen_cmpswap(ctx, r1, cpu_gpr_a[r2]);
5242         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
5243         break;
5244     case OPC2_32_BO_CMPSWAP_W_PREINC:
5245         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
5246         gen_cmpswap(ctx, r1, cpu_gpr_a[r2]);
5247         break;
5248     case OPC2_32_BO_SWAPMSK_W_SHORTOFF:
5249         tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10);
5250         gen_swapmsk(ctx, r1, temp);
5251         break;
5252     case OPC2_32_BO_SWAPMSK_W_POSTINC:
5253         gen_swapmsk(ctx, r1, cpu_gpr_a[r2]);
5254         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
5255         break;
5256     case OPC2_32_BO_SWAPMSK_W_PREINC:
5257         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
5258         gen_swapmsk(ctx, r1, cpu_gpr_a[r2]);
5259         break;
5260     default:
5261         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5262     }
5263     tcg_temp_free(temp);
5264     tcg_temp_free(temp2);
5265 }
5266 
5267 static void decode_bo_addrmode_ldmst_bitreverse_circular(DisasContext *ctx)
5268 {
5269     uint32_t op2;
5270     uint32_t off10;
5271     int r1, r2;
5272 
5273     TCGv temp, temp2, temp3;
5274 
5275     r1 = MASK_OP_BO_S1D(ctx->opcode);
5276     r2 = MASK_OP_BO_S2(ctx->opcode);
5277     off10 = MASK_OP_BO_OFF10_SEXT(ctx->opcode);
5278     op2 = MASK_OP_BO_OP2(ctx->opcode);
5279 
5280     temp = tcg_temp_new();
5281     temp2 = tcg_temp_new();
5282     temp3 = tcg_const_i32(off10);
5283     CHECK_REG_PAIR(r2);
5284     tcg_gen_ext16u_tl(temp, cpu_gpr_a[r2+1]);
5285     tcg_gen_add_tl(temp2, cpu_gpr_a[r2], temp);
5286 
5287     switch (op2) {
5288     case OPC2_32_BO_LDMST_BR:
5289         gen_ldmst(ctx, r1, temp2);
5290         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
5291         break;
5292     case OPC2_32_BO_LDMST_CIRC:
5293         gen_ldmst(ctx, r1, temp2);
5294         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
5295         break;
5296     case OPC2_32_BO_SWAP_W_BR:
5297         gen_swap(ctx, r1, temp2);
5298         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
5299         break;
5300     case OPC2_32_BO_SWAP_W_CIRC:
5301         gen_swap(ctx, r1, temp2);
5302         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
5303         break;
5304     case OPC2_32_BO_CMPSWAP_W_BR:
5305         gen_cmpswap(ctx, r1, temp2);
5306         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
5307         break;
5308     case OPC2_32_BO_CMPSWAP_W_CIRC:
5309         gen_cmpswap(ctx, r1, temp2);
5310         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
5311         break;
5312     case OPC2_32_BO_SWAPMSK_W_BR:
5313         gen_swapmsk(ctx, r1, temp2);
5314         gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]);
5315         break;
5316     case OPC2_32_BO_SWAPMSK_W_CIRC:
5317         gen_swapmsk(ctx, r1, temp2);
5318         gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3);
5319         break;
5320     default:
5321         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5322     }
5323 
5324     tcg_temp_free(temp);
5325     tcg_temp_free(temp2);
5326     tcg_temp_free(temp3);
5327 }
5328 
5329 static void decode_bol_opc(DisasContext *ctx, int32_t op1)
5330 {
5331     int r1, r2;
5332     int32_t address;
5333     TCGv temp;
5334 
5335     r1 = MASK_OP_BOL_S1D(ctx->opcode);
5336     r2 = MASK_OP_BOL_S2(ctx->opcode);
5337     address = MASK_OP_BOL_OFF16_SEXT(ctx->opcode);
5338 
5339     switch (op1) {
5340     case OPC1_32_BOL_LD_A_LONGOFF:
5341         temp = tcg_temp_new();
5342         tcg_gen_addi_tl(temp, cpu_gpr_a[r2], address);
5343         tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], temp, ctx->mem_idx, MO_LEUL);
5344         tcg_temp_free(temp);
5345         break;
5346     case OPC1_32_BOL_LD_W_LONGOFF:
5347         temp = tcg_temp_new();
5348         tcg_gen_addi_tl(temp, cpu_gpr_a[r2], address);
5349         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LEUL);
5350         tcg_temp_free(temp);
5351         break;
5352     case OPC1_32_BOL_LEA_LONGOFF:
5353         tcg_gen_addi_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], address);
5354         break;
5355     case OPC1_32_BOL_ST_A_LONGOFF:
5356         if (has_feature(ctx, TRICORE_FEATURE_16)) {
5357             gen_offset_st(ctx, cpu_gpr_a[r1], cpu_gpr_a[r2], address, MO_LEUL);
5358         } else {
5359             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5360         }
5361         break;
5362     case OPC1_32_BOL_ST_W_LONGOFF:
5363         gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_LEUL);
5364         break;
5365     case OPC1_32_BOL_LD_B_LONGOFF:
5366         if (has_feature(ctx, TRICORE_FEATURE_16)) {
5367             gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_SB);
5368         } else {
5369             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5370         }
5371         break;
5372     case OPC1_32_BOL_LD_BU_LONGOFF:
5373         if (has_feature(ctx, TRICORE_FEATURE_16)) {
5374             gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_UB);
5375         } else {
5376             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5377         }
5378         break;
5379     case OPC1_32_BOL_LD_H_LONGOFF:
5380         if (has_feature(ctx, TRICORE_FEATURE_16)) {
5381             gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_LESW);
5382         } else {
5383             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5384         }
5385         break;
5386     case OPC1_32_BOL_LD_HU_LONGOFF:
5387         if (has_feature(ctx, TRICORE_FEATURE_16)) {
5388             gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_LEUW);
5389         } else {
5390             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5391         }
5392         break;
5393     case OPC1_32_BOL_ST_B_LONGOFF:
5394         if (has_feature(ctx, TRICORE_FEATURE_16)) {
5395             gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_SB);
5396         } else {
5397             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5398         }
5399         break;
5400     case OPC1_32_BOL_ST_H_LONGOFF:
5401         if (has_feature(ctx, TRICORE_FEATURE_16)) {
5402             gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_LESW);
5403         } else {
5404             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5405         }
5406         break;
5407     default:
5408         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5409     }
5410 }
5411 
5412 /* RC format */
5413 static void decode_rc_logical_shift(DisasContext *ctx)
5414 {
5415     uint32_t op2;
5416     int r1, r2;
5417     int32_t const9;
5418     TCGv temp;
5419 
5420     r2 = MASK_OP_RC_D(ctx->opcode);
5421     r1 = MASK_OP_RC_S1(ctx->opcode);
5422     const9 = MASK_OP_RC_CONST9(ctx->opcode);
5423     op2 = MASK_OP_RC_OP2(ctx->opcode);
5424 
5425     temp = tcg_temp_new();
5426 
5427     switch (op2) {
5428     case OPC2_32_RC_AND:
5429         tcg_gen_andi_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5430         break;
5431     case OPC2_32_RC_ANDN:
5432         tcg_gen_andi_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], ~const9);
5433         break;
5434     case OPC2_32_RC_NAND:
5435         tcg_gen_movi_tl(temp, const9);
5436         tcg_gen_nand_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], temp);
5437         break;
5438     case OPC2_32_RC_NOR:
5439         tcg_gen_movi_tl(temp, const9);
5440         tcg_gen_nor_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], temp);
5441         break;
5442     case OPC2_32_RC_OR:
5443         tcg_gen_ori_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5444         break;
5445     case OPC2_32_RC_ORN:
5446         tcg_gen_ori_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], ~const9);
5447         break;
5448     case OPC2_32_RC_SH:
5449         const9 = sextract32(const9, 0, 6);
5450         gen_shi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5451         break;
5452     case OPC2_32_RC_SH_H:
5453         const9 = sextract32(const9, 0, 5);
5454         gen_sh_hi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5455         break;
5456     case OPC2_32_RC_SHA:
5457         const9 = sextract32(const9, 0, 6);
5458         gen_shaci(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5459         break;
5460     case OPC2_32_RC_SHA_H:
5461         const9 = sextract32(const9, 0, 5);
5462         gen_sha_hi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5463         break;
5464     case OPC2_32_RC_SHAS:
5465         gen_shasi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5466         break;
5467     case OPC2_32_RC_XNOR:
5468         tcg_gen_xori_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5469         tcg_gen_not_tl(cpu_gpr_d[r2], cpu_gpr_d[r2]);
5470         break;
5471     case OPC2_32_RC_XOR:
5472         tcg_gen_xori_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5473         break;
5474     default:
5475         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5476     }
5477     tcg_temp_free(temp);
5478 }
5479 
5480 static void decode_rc_accumulator(DisasContext *ctx)
5481 {
5482     uint32_t op2;
5483     int r1, r2;
5484     int16_t const9;
5485 
5486     TCGv temp;
5487 
5488     r2 = MASK_OP_RC_D(ctx->opcode);
5489     r1 = MASK_OP_RC_S1(ctx->opcode);
5490     const9 = MASK_OP_RC_CONST9_SEXT(ctx->opcode);
5491 
5492     op2 = MASK_OP_RC_OP2(ctx->opcode);
5493 
5494     temp = tcg_temp_new();
5495 
5496     switch (op2) {
5497     case OPC2_32_RC_ABSDIF:
5498         gen_absdifi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5499         break;
5500     case OPC2_32_RC_ABSDIFS:
5501         gen_absdifsi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5502         break;
5503     case OPC2_32_RC_ADD:
5504         gen_addi_d(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5505         break;
5506     case OPC2_32_RC_ADDC:
5507         gen_addci_CC(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5508         break;
5509     case OPC2_32_RC_ADDS:
5510         gen_addsi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5511         break;
5512     case OPC2_32_RC_ADDS_U:
5513         gen_addsui(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5514         break;
5515     case OPC2_32_RC_ADDX:
5516         gen_addi_CC(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5517         break;
5518     case OPC2_32_RC_AND_EQ:
5519         gen_accumulating_condi(TCG_COND_EQ, cpu_gpr_d[r2], cpu_gpr_d[r1],
5520                                const9, &tcg_gen_and_tl);
5521         break;
5522     case OPC2_32_RC_AND_GE:
5523         gen_accumulating_condi(TCG_COND_GE, cpu_gpr_d[r2], cpu_gpr_d[r1],
5524                                const9, &tcg_gen_and_tl);
5525         break;
5526     case OPC2_32_RC_AND_GE_U:
5527         const9 = MASK_OP_RC_CONST9(ctx->opcode);
5528         gen_accumulating_condi(TCG_COND_GEU, cpu_gpr_d[r2], cpu_gpr_d[r1],
5529                                const9, &tcg_gen_and_tl);
5530         break;
5531     case OPC2_32_RC_AND_LT:
5532         gen_accumulating_condi(TCG_COND_LT, cpu_gpr_d[r2], cpu_gpr_d[r1],
5533                                const9, &tcg_gen_and_tl);
5534         break;
5535     case OPC2_32_RC_AND_LT_U:
5536         const9 = MASK_OP_RC_CONST9(ctx->opcode);
5537         gen_accumulating_condi(TCG_COND_LTU, cpu_gpr_d[r2], cpu_gpr_d[r1],
5538                                const9, &tcg_gen_and_tl);
5539         break;
5540     case OPC2_32_RC_AND_NE:
5541         gen_accumulating_condi(TCG_COND_NE, cpu_gpr_d[r2], cpu_gpr_d[r1],
5542                                const9, &tcg_gen_and_tl);
5543         break;
5544     case OPC2_32_RC_EQ:
5545         tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5546         break;
5547     case OPC2_32_RC_EQANY_B:
5548         gen_eqany_bi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5549         break;
5550     case OPC2_32_RC_EQANY_H:
5551         gen_eqany_hi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5552         break;
5553     case OPC2_32_RC_GE:
5554         tcg_gen_setcondi_tl(TCG_COND_GE, cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5555         break;
5556     case OPC2_32_RC_GE_U:
5557         const9 = MASK_OP_RC_CONST9(ctx->opcode);
5558         tcg_gen_setcondi_tl(TCG_COND_GEU, cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5559         break;
5560     case OPC2_32_RC_LT:
5561         tcg_gen_setcondi_tl(TCG_COND_LT, cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5562         break;
5563     case OPC2_32_RC_LT_U:
5564         const9 = MASK_OP_RC_CONST9(ctx->opcode);
5565         tcg_gen_setcondi_tl(TCG_COND_LTU, cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5566         break;
5567     case OPC2_32_RC_MAX:
5568         tcg_gen_movi_tl(temp, const9);
5569         tcg_gen_movcond_tl(TCG_COND_GT, cpu_gpr_d[r2], cpu_gpr_d[r1], temp,
5570                            cpu_gpr_d[r1], temp);
5571         break;
5572     case OPC2_32_RC_MAX_U:
5573         tcg_gen_movi_tl(temp, MASK_OP_RC_CONST9(ctx->opcode));
5574         tcg_gen_movcond_tl(TCG_COND_GTU, cpu_gpr_d[r2], cpu_gpr_d[r1], temp,
5575                            cpu_gpr_d[r1], temp);
5576         break;
5577     case OPC2_32_RC_MIN:
5578         tcg_gen_movi_tl(temp, const9);
5579         tcg_gen_movcond_tl(TCG_COND_LT, cpu_gpr_d[r2], cpu_gpr_d[r1], temp,
5580                            cpu_gpr_d[r1], temp);
5581         break;
5582     case OPC2_32_RC_MIN_U:
5583         tcg_gen_movi_tl(temp, MASK_OP_RC_CONST9(ctx->opcode));
5584         tcg_gen_movcond_tl(TCG_COND_LTU, cpu_gpr_d[r2], cpu_gpr_d[r1], temp,
5585                            cpu_gpr_d[r1], temp);
5586         break;
5587     case OPC2_32_RC_NE:
5588         tcg_gen_setcondi_tl(TCG_COND_NE, cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5589         break;
5590     case OPC2_32_RC_OR_EQ:
5591         gen_accumulating_condi(TCG_COND_EQ, cpu_gpr_d[r2], cpu_gpr_d[r1],
5592                                const9, &tcg_gen_or_tl);
5593         break;
5594     case OPC2_32_RC_OR_GE:
5595         gen_accumulating_condi(TCG_COND_GE, cpu_gpr_d[r2], cpu_gpr_d[r1],
5596                                const9, &tcg_gen_or_tl);
5597         break;
5598     case OPC2_32_RC_OR_GE_U:
5599         const9 = MASK_OP_RC_CONST9(ctx->opcode);
5600         gen_accumulating_condi(TCG_COND_GEU, cpu_gpr_d[r2], cpu_gpr_d[r1],
5601                                const9, &tcg_gen_or_tl);
5602         break;
5603     case OPC2_32_RC_OR_LT:
5604         gen_accumulating_condi(TCG_COND_LT, cpu_gpr_d[r2], cpu_gpr_d[r1],
5605                                const9, &tcg_gen_or_tl);
5606         break;
5607     case OPC2_32_RC_OR_LT_U:
5608         const9 = MASK_OP_RC_CONST9(ctx->opcode);
5609         gen_accumulating_condi(TCG_COND_LTU, cpu_gpr_d[r2], cpu_gpr_d[r1],
5610                                const9, &tcg_gen_or_tl);
5611         break;
5612     case OPC2_32_RC_OR_NE:
5613         gen_accumulating_condi(TCG_COND_NE, cpu_gpr_d[r2], cpu_gpr_d[r1],
5614                                const9, &tcg_gen_or_tl);
5615         break;
5616     case OPC2_32_RC_RSUB:
5617         tcg_gen_movi_tl(temp, const9);
5618         gen_sub_d(cpu_gpr_d[r2], temp, cpu_gpr_d[r1]);
5619         break;
5620     case OPC2_32_RC_RSUBS:
5621         tcg_gen_movi_tl(temp, const9);
5622         gen_subs(cpu_gpr_d[r2], temp, cpu_gpr_d[r1]);
5623         break;
5624     case OPC2_32_RC_RSUBS_U:
5625         tcg_gen_movi_tl(temp, const9);
5626         gen_subsu(cpu_gpr_d[r2], temp, cpu_gpr_d[r1]);
5627         break;
5628     case OPC2_32_RC_SH_EQ:
5629         gen_sh_condi(TCG_COND_EQ, cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5630         break;
5631     case OPC2_32_RC_SH_GE:
5632         gen_sh_condi(TCG_COND_GE, cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5633         break;
5634     case OPC2_32_RC_SH_GE_U:
5635         const9 = MASK_OP_RC_CONST9(ctx->opcode);
5636         gen_sh_condi(TCG_COND_GEU, cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5637         break;
5638     case OPC2_32_RC_SH_LT:
5639         gen_sh_condi(TCG_COND_LT, cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5640         break;
5641     case OPC2_32_RC_SH_LT_U:
5642         const9 = MASK_OP_RC_CONST9(ctx->opcode);
5643         gen_sh_condi(TCG_COND_LTU, cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5644         break;
5645     case OPC2_32_RC_SH_NE:
5646         gen_sh_condi(TCG_COND_NE, cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5647         break;
5648     case OPC2_32_RC_XOR_EQ:
5649         gen_accumulating_condi(TCG_COND_EQ, cpu_gpr_d[r2], cpu_gpr_d[r1],
5650                                const9, &tcg_gen_xor_tl);
5651         break;
5652     case OPC2_32_RC_XOR_GE:
5653         gen_accumulating_condi(TCG_COND_GE, cpu_gpr_d[r2], cpu_gpr_d[r1],
5654                                const9, &tcg_gen_xor_tl);
5655         break;
5656     case OPC2_32_RC_XOR_GE_U:
5657         const9 = MASK_OP_RC_CONST9(ctx->opcode);
5658         gen_accumulating_condi(TCG_COND_GEU, cpu_gpr_d[r2], cpu_gpr_d[r1],
5659                                const9, &tcg_gen_xor_tl);
5660         break;
5661     case OPC2_32_RC_XOR_LT:
5662         gen_accumulating_condi(TCG_COND_LT, cpu_gpr_d[r2], cpu_gpr_d[r1],
5663                                const9, &tcg_gen_xor_tl);
5664         break;
5665     case OPC2_32_RC_XOR_LT_U:
5666         const9 = MASK_OP_RC_CONST9(ctx->opcode);
5667         gen_accumulating_condi(TCG_COND_LTU, cpu_gpr_d[r2], cpu_gpr_d[r1],
5668                                const9, &tcg_gen_xor_tl);
5669         break;
5670     case OPC2_32_RC_XOR_NE:
5671         gen_accumulating_condi(TCG_COND_NE, cpu_gpr_d[r2], cpu_gpr_d[r1],
5672                                const9, &tcg_gen_xor_tl);
5673         break;
5674     default:
5675         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5676     }
5677     tcg_temp_free(temp);
5678 }
5679 
5680 static void decode_rc_serviceroutine(DisasContext *ctx)
5681 {
5682     uint32_t op2;
5683     uint32_t const9;
5684 
5685     op2 = MASK_OP_RC_OP2(ctx->opcode);
5686     const9 = MASK_OP_RC_CONST9(ctx->opcode);
5687 
5688     switch (op2) {
5689     case OPC2_32_RC_BISR:
5690         gen_helper_1arg(bisr, const9);
5691         break;
5692     case OPC2_32_RC_SYSCALL:
5693         /* TODO: Add exception generation */
5694         break;
5695     default:
5696         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5697     }
5698 }
5699 
5700 static void decode_rc_mul(DisasContext *ctx)
5701 {
5702     uint32_t op2;
5703     int r1, r2;
5704     int16_t const9;
5705 
5706     r2 = MASK_OP_RC_D(ctx->opcode);
5707     r1 = MASK_OP_RC_S1(ctx->opcode);
5708     const9 = MASK_OP_RC_CONST9_SEXT(ctx->opcode);
5709 
5710     op2 = MASK_OP_RC_OP2(ctx->opcode);
5711 
5712     switch (op2) {
5713     case OPC2_32_RC_MUL_32:
5714         gen_muli_i32s(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5715         break;
5716     case OPC2_32_RC_MUL_64:
5717         CHECK_REG_PAIR(r2);
5718         gen_muli_i64s(cpu_gpr_d[r2], cpu_gpr_d[r2+1], cpu_gpr_d[r1], const9);
5719         break;
5720     case OPC2_32_RC_MULS_32:
5721         gen_mulsi_i32(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5722         break;
5723     case OPC2_32_RC_MUL_U_64:
5724         const9 = MASK_OP_RC_CONST9(ctx->opcode);
5725         CHECK_REG_PAIR(r2);
5726         gen_muli_i64u(cpu_gpr_d[r2], cpu_gpr_d[r2+1], cpu_gpr_d[r1], const9);
5727         break;
5728     case OPC2_32_RC_MULS_U_32:
5729         const9 = MASK_OP_RC_CONST9(ctx->opcode);
5730         gen_mulsui_i32(cpu_gpr_d[r2], cpu_gpr_d[r1], const9);
5731         break;
5732     default:
5733         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5734     }
5735 }
5736 
5737 /* RCPW format */
5738 static void decode_rcpw_insert(DisasContext *ctx)
5739 {
5740     uint32_t op2;
5741     int r1, r2;
5742     int32_t pos, width, const4;
5743 
5744     TCGv temp;
5745 
5746     op2    = MASK_OP_RCPW_OP2(ctx->opcode);
5747     r1     = MASK_OP_RCPW_S1(ctx->opcode);
5748     r2     = MASK_OP_RCPW_D(ctx->opcode);
5749     const4 = MASK_OP_RCPW_CONST4(ctx->opcode);
5750     width  = MASK_OP_RCPW_WIDTH(ctx->opcode);
5751     pos    = MASK_OP_RCPW_POS(ctx->opcode);
5752 
5753     switch (op2) {
5754     case OPC2_32_RCPW_IMASK:
5755         CHECK_REG_PAIR(r2);
5756         /* if pos + width > 32 undefined result */
5757         if (pos + width <= 32) {
5758             tcg_gen_movi_tl(cpu_gpr_d[r2+1], ((1u << width) - 1) << pos);
5759             tcg_gen_movi_tl(cpu_gpr_d[r2], (const4 << pos));
5760         }
5761         break;
5762     case OPC2_32_RCPW_INSERT:
5763         /* if pos + width > 32 undefined result */
5764         if (pos + width <= 32) {
5765             temp = tcg_const_i32(const4);
5766             tcg_gen_deposit_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], temp, pos, width);
5767             tcg_temp_free(temp);
5768         }
5769         break;
5770     default:
5771         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5772     }
5773 }
5774 
5775 /* RCRW format */
5776 
5777 static void decode_rcrw_insert(DisasContext *ctx)
5778 {
5779     uint32_t op2;
5780     int r1, r3, r4;
5781     int32_t width, const4;
5782 
5783     TCGv temp, temp2, temp3;
5784 
5785     op2    = MASK_OP_RCRW_OP2(ctx->opcode);
5786     r1     = MASK_OP_RCRW_S1(ctx->opcode);
5787     r3     = MASK_OP_RCRW_S3(ctx->opcode);
5788     r4     = MASK_OP_RCRW_D(ctx->opcode);
5789     width  = MASK_OP_RCRW_WIDTH(ctx->opcode);
5790     const4 = MASK_OP_RCRW_CONST4(ctx->opcode);
5791 
5792     temp = tcg_temp_new();
5793     temp2 = tcg_temp_new();
5794 
5795     switch (op2) {
5796     case OPC2_32_RCRW_IMASK:
5797         tcg_gen_andi_tl(temp, cpu_gpr_d[r4], 0x1f);
5798         tcg_gen_movi_tl(temp2, (1 << width) - 1);
5799         tcg_gen_shl_tl(cpu_gpr_d[r3 + 1], temp2, temp);
5800         tcg_gen_movi_tl(temp2, const4);
5801         tcg_gen_shl_tl(cpu_gpr_d[r3], temp2, temp);
5802         break;
5803     case OPC2_32_RCRW_INSERT:
5804         temp3 = tcg_temp_new();
5805 
5806         tcg_gen_movi_tl(temp, width);
5807         tcg_gen_movi_tl(temp2, const4);
5808         tcg_gen_andi_tl(temp3, cpu_gpr_d[r4], 0x1f);
5809         gen_insert(cpu_gpr_d[r3], cpu_gpr_d[r1], temp2, temp, temp3);
5810 
5811         tcg_temp_free(temp3);
5812         break;
5813     default:
5814         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5815     }
5816     tcg_temp_free(temp);
5817     tcg_temp_free(temp2);
5818 }
5819 
5820 /* RCR format */
5821 
5822 static void decode_rcr_cond_select(DisasContext *ctx)
5823 {
5824     uint32_t op2;
5825     int r1, r3, r4;
5826     int32_t const9;
5827 
5828     TCGv temp, temp2;
5829 
5830     op2 = MASK_OP_RCR_OP2(ctx->opcode);
5831     r1 = MASK_OP_RCR_S1(ctx->opcode);
5832     const9 = MASK_OP_RCR_CONST9_SEXT(ctx->opcode);
5833     r3 = MASK_OP_RCR_S3(ctx->opcode);
5834     r4 = MASK_OP_RCR_D(ctx->opcode);
5835 
5836     switch (op2) {
5837     case OPC2_32_RCR_CADD:
5838         gen_condi_add(TCG_COND_NE, cpu_gpr_d[r1], const9, cpu_gpr_d[r4],
5839                       cpu_gpr_d[r3]);
5840         break;
5841     case OPC2_32_RCR_CADDN:
5842         gen_condi_add(TCG_COND_EQ, cpu_gpr_d[r1], const9, cpu_gpr_d[r4],
5843                       cpu_gpr_d[r3]);
5844         break;
5845     case OPC2_32_RCR_SEL:
5846         temp = tcg_const_i32(0);
5847         temp2 = tcg_const_i32(const9);
5848         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr_d[r4], cpu_gpr_d[r3], temp,
5849                            cpu_gpr_d[r1], temp2);
5850         tcg_temp_free(temp);
5851         tcg_temp_free(temp2);
5852         break;
5853     case OPC2_32_RCR_SELN:
5854         temp = tcg_const_i32(0);
5855         temp2 = tcg_const_i32(const9);
5856         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr_d[r4], cpu_gpr_d[r3], temp,
5857                            cpu_gpr_d[r1], temp2);
5858         tcg_temp_free(temp);
5859         tcg_temp_free(temp2);
5860         break;
5861     default:
5862         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5863     }
5864 }
5865 
5866 static void decode_rcr_madd(DisasContext *ctx)
5867 {
5868     uint32_t op2;
5869     int r1, r3, r4;
5870     int32_t const9;
5871 
5872 
5873     op2 = MASK_OP_RCR_OP2(ctx->opcode);
5874     r1 = MASK_OP_RCR_S1(ctx->opcode);
5875     const9 = MASK_OP_RCR_CONST9_SEXT(ctx->opcode);
5876     r3 = MASK_OP_RCR_S3(ctx->opcode);
5877     r4 = MASK_OP_RCR_D(ctx->opcode);
5878 
5879     switch (op2) {
5880     case OPC2_32_RCR_MADD_32:
5881         gen_maddi32_d(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], const9);
5882         break;
5883     case OPC2_32_RCR_MADD_64:
5884         CHECK_REG_PAIR(r4);
5885         CHECK_REG_PAIR(r3);
5886         gen_maddi64_d(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1],
5887                       cpu_gpr_d[r3], cpu_gpr_d[r3+1], const9);
5888         break;
5889     case OPC2_32_RCR_MADDS_32:
5890         gen_maddsi_32(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], const9);
5891         break;
5892     case OPC2_32_RCR_MADDS_64:
5893         CHECK_REG_PAIR(r4);
5894         CHECK_REG_PAIR(r3);
5895         gen_maddsi_64(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1],
5896                       cpu_gpr_d[r3], cpu_gpr_d[r3+1], const9);
5897         break;
5898     case OPC2_32_RCR_MADD_U_64:
5899         CHECK_REG_PAIR(r4);
5900         CHECK_REG_PAIR(r3);
5901         const9 = MASK_OP_RCR_CONST9(ctx->opcode);
5902         gen_maddui64_d(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1],
5903                        cpu_gpr_d[r3], cpu_gpr_d[r3+1], const9);
5904         break;
5905     case OPC2_32_RCR_MADDS_U_32:
5906         const9 = MASK_OP_RCR_CONST9(ctx->opcode);
5907         gen_maddsui_32(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], const9);
5908         break;
5909     case OPC2_32_RCR_MADDS_U_64:
5910         CHECK_REG_PAIR(r4);
5911         CHECK_REG_PAIR(r3);
5912         const9 = MASK_OP_RCR_CONST9(ctx->opcode);
5913         gen_maddsui_64(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1],
5914                        cpu_gpr_d[r3], cpu_gpr_d[r3+1], const9);
5915         break;
5916     default:
5917         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5918     }
5919 }
5920 
5921 static void decode_rcr_msub(DisasContext *ctx)
5922 {
5923     uint32_t op2;
5924     int r1, r3, r4;
5925     int32_t const9;
5926 
5927 
5928     op2 = MASK_OP_RCR_OP2(ctx->opcode);
5929     r1 = MASK_OP_RCR_S1(ctx->opcode);
5930     const9 = MASK_OP_RCR_CONST9_SEXT(ctx->opcode);
5931     r3 = MASK_OP_RCR_S3(ctx->opcode);
5932     r4 = MASK_OP_RCR_D(ctx->opcode);
5933 
5934     switch (op2) {
5935     case OPC2_32_RCR_MSUB_32:
5936         gen_msubi32_d(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], const9);
5937         break;
5938     case OPC2_32_RCR_MSUB_64:
5939         CHECK_REG_PAIR(r4);
5940         CHECK_REG_PAIR(r3);
5941         gen_msubi64_d(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1],
5942                       cpu_gpr_d[r3], cpu_gpr_d[r3+1], const9);
5943         break;
5944     case OPC2_32_RCR_MSUBS_32:
5945         gen_msubsi_32(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], const9);
5946         break;
5947     case OPC2_32_RCR_MSUBS_64:
5948         CHECK_REG_PAIR(r4);
5949         CHECK_REG_PAIR(r3);
5950         gen_msubsi_64(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1],
5951                       cpu_gpr_d[r3], cpu_gpr_d[r3+1], const9);
5952         break;
5953     case OPC2_32_RCR_MSUB_U_64:
5954         CHECK_REG_PAIR(r4);
5955         CHECK_REG_PAIR(r3);
5956         const9 = MASK_OP_RCR_CONST9(ctx->opcode);
5957         gen_msubui64_d(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1],
5958                        cpu_gpr_d[r3], cpu_gpr_d[r3+1], const9);
5959         break;
5960     case OPC2_32_RCR_MSUBS_U_32:
5961         const9 = MASK_OP_RCR_CONST9(ctx->opcode);
5962         gen_msubsui_32(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], const9);
5963         break;
5964     case OPC2_32_RCR_MSUBS_U_64:
5965         CHECK_REG_PAIR(r4);
5966         CHECK_REG_PAIR(r3);
5967         const9 = MASK_OP_RCR_CONST9(ctx->opcode);
5968         gen_msubsui_64(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1],
5969                        cpu_gpr_d[r3], cpu_gpr_d[r3+1], const9);
5970         break;
5971     default:
5972         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5973     }
5974 }
5975 
5976 /* RLC format */
5977 
5978 static void decode_rlc_opc(DisasContext *ctx,
5979                            uint32_t op1)
5980 {
5981     int32_t const16;
5982     int r1, r2;
5983 
5984     const16 = MASK_OP_RLC_CONST16_SEXT(ctx->opcode);
5985     r1      = MASK_OP_RLC_S1(ctx->opcode);
5986     r2      = MASK_OP_RLC_D(ctx->opcode);
5987 
5988     switch (op1) {
5989     case OPC1_32_RLC_ADDI:
5990         gen_addi_d(cpu_gpr_d[r2], cpu_gpr_d[r1], const16);
5991         break;
5992     case OPC1_32_RLC_ADDIH:
5993         gen_addi_d(cpu_gpr_d[r2], cpu_gpr_d[r1], const16 << 16);
5994         break;
5995     case OPC1_32_RLC_ADDIH_A:
5996         tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r1], const16 << 16);
5997         break;
5998     case OPC1_32_RLC_MFCR:
5999         const16 = MASK_OP_RLC_CONST16(ctx->opcode);
6000         gen_mfcr(ctx, cpu_gpr_d[r2], const16);
6001         break;
6002     case OPC1_32_RLC_MOV:
6003         tcg_gen_movi_tl(cpu_gpr_d[r2], const16);
6004         break;
6005     case OPC1_32_RLC_MOV_64:
6006         if (has_feature(ctx, TRICORE_FEATURE_16)) {
6007             CHECK_REG_PAIR(r2);
6008             tcg_gen_movi_tl(cpu_gpr_d[r2], const16);
6009             tcg_gen_movi_tl(cpu_gpr_d[r2+1], const16 >> 15);
6010         } else {
6011             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6012         }
6013         break;
6014     case OPC1_32_RLC_MOV_U:
6015         const16 = MASK_OP_RLC_CONST16(ctx->opcode);
6016         tcg_gen_movi_tl(cpu_gpr_d[r2], const16);
6017         break;
6018     case OPC1_32_RLC_MOV_H:
6019         tcg_gen_movi_tl(cpu_gpr_d[r2], const16 << 16);
6020         break;
6021     case OPC1_32_RLC_MOVH_A:
6022         tcg_gen_movi_tl(cpu_gpr_a[r2], const16 << 16);
6023         break;
6024     case OPC1_32_RLC_MTCR:
6025         const16 = MASK_OP_RLC_CONST16(ctx->opcode);
6026         gen_mtcr(ctx, cpu_gpr_d[r1], const16);
6027         break;
6028     default:
6029         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6030     }
6031 }
6032 
6033 /* RR format */
6034 static void decode_rr_accumulator(DisasContext *ctx)
6035 {
6036     uint32_t op2;
6037     int r3, r2, r1;
6038 
6039     TCGv temp;
6040 
6041     r3 = MASK_OP_RR_D(ctx->opcode);
6042     r2 = MASK_OP_RR_S2(ctx->opcode);
6043     r1 = MASK_OP_RR_S1(ctx->opcode);
6044     op2 = MASK_OP_RR_OP2(ctx->opcode);
6045 
6046     switch (op2) {
6047     case OPC2_32_RR_ABS:
6048         gen_abs(cpu_gpr_d[r3], cpu_gpr_d[r2]);
6049         break;
6050     case OPC2_32_RR_ABS_B:
6051         gen_helper_abs_b(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r2]);
6052         break;
6053     case OPC2_32_RR_ABS_H:
6054         gen_helper_abs_h(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r2]);
6055         break;
6056     case OPC2_32_RR_ABSDIF:
6057         gen_absdif(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6058         break;
6059     case OPC2_32_RR_ABSDIF_B:
6060         gen_helper_absdif_b(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
6061                             cpu_gpr_d[r2]);
6062         break;
6063     case OPC2_32_RR_ABSDIF_H:
6064         gen_helper_absdif_h(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
6065                             cpu_gpr_d[r2]);
6066         break;
6067     case OPC2_32_RR_ABSDIFS:
6068         gen_helper_absdif_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
6069                                cpu_gpr_d[r2]);
6070         break;
6071     case OPC2_32_RR_ABSDIFS_H:
6072         gen_helper_absdif_h_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
6073                                  cpu_gpr_d[r2]);
6074         break;
6075     case OPC2_32_RR_ABSS:
6076         gen_helper_abs_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r2]);
6077         break;
6078     case OPC2_32_RR_ABSS_H:
6079         gen_helper_abs_h_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r2]);
6080         break;
6081     case OPC2_32_RR_ADD:
6082         gen_add_d(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6083         break;
6084     case OPC2_32_RR_ADD_B:
6085         gen_helper_add_b(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
6086         break;
6087     case OPC2_32_RR_ADD_H:
6088         gen_helper_add_h(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
6089         break;
6090     case OPC2_32_RR_ADDC:
6091         gen_addc_CC(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6092         break;
6093     case OPC2_32_RR_ADDS:
6094         gen_adds(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6095         break;
6096     case OPC2_32_RR_ADDS_H:
6097         gen_helper_add_h_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
6098                               cpu_gpr_d[r2]);
6099         break;
6100     case OPC2_32_RR_ADDS_HU:
6101         gen_helper_add_h_suov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
6102                               cpu_gpr_d[r2]);
6103         break;
6104     case OPC2_32_RR_ADDS_U:
6105         gen_helper_add_suov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
6106                             cpu_gpr_d[r2]);
6107         break;
6108     case OPC2_32_RR_ADDX:
6109         gen_add_CC(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6110         break;
6111     case OPC2_32_RR_AND_EQ:
6112         gen_accumulating_cond(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1],
6113                               cpu_gpr_d[r2], &tcg_gen_and_tl);
6114         break;
6115     case OPC2_32_RR_AND_GE:
6116         gen_accumulating_cond(TCG_COND_GE, cpu_gpr_d[r3], cpu_gpr_d[r1],
6117                               cpu_gpr_d[r2], &tcg_gen_and_tl);
6118         break;
6119     case OPC2_32_RR_AND_GE_U:
6120         gen_accumulating_cond(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_d[r1],
6121                               cpu_gpr_d[r2], &tcg_gen_and_tl);
6122         break;
6123     case OPC2_32_RR_AND_LT:
6124         gen_accumulating_cond(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1],
6125                               cpu_gpr_d[r2], &tcg_gen_and_tl);
6126         break;
6127     case OPC2_32_RR_AND_LT_U:
6128         gen_accumulating_cond(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1],
6129                               cpu_gpr_d[r2], &tcg_gen_and_tl);
6130         break;
6131     case OPC2_32_RR_AND_NE:
6132         gen_accumulating_cond(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_d[r1],
6133                               cpu_gpr_d[r2], &tcg_gen_and_tl);
6134         break;
6135     case OPC2_32_RR_EQ:
6136         tcg_gen_setcond_tl(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1],
6137                            cpu_gpr_d[r2]);
6138         break;
6139     case OPC2_32_RR_EQ_B:
6140         gen_helper_eq_b(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6141         break;
6142     case OPC2_32_RR_EQ_H:
6143         gen_helper_eq_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6144         break;
6145     case OPC2_32_RR_EQ_W:
6146         gen_cond_w(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6147         break;
6148     case OPC2_32_RR_EQANY_B:
6149         gen_helper_eqany_b(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6150         break;
6151     case OPC2_32_RR_EQANY_H:
6152         gen_helper_eqany_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6153         break;
6154     case OPC2_32_RR_GE:
6155         tcg_gen_setcond_tl(TCG_COND_GE, cpu_gpr_d[r3], cpu_gpr_d[r1],
6156                            cpu_gpr_d[r2]);
6157         break;
6158     case OPC2_32_RR_GE_U:
6159         tcg_gen_setcond_tl(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_d[r1],
6160                            cpu_gpr_d[r2]);
6161         break;
6162     case OPC2_32_RR_LT:
6163         tcg_gen_setcond_tl(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1],
6164                            cpu_gpr_d[r2]);
6165         break;
6166     case OPC2_32_RR_LT_U:
6167         tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1],
6168                            cpu_gpr_d[r2]);
6169         break;
6170     case OPC2_32_RR_LT_B:
6171         gen_helper_lt_b(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6172         break;
6173     case OPC2_32_RR_LT_BU:
6174         gen_helper_lt_bu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6175         break;
6176     case OPC2_32_RR_LT_H:
6177         gen_helper_lt_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6178         break;
6179     case OPC2_32_RR_LT_HU:
6180         gen_helper_lt_hu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6181         break;
6182     case OPC2_32_RR_LT_W:
6183         gen_cond_w(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6184         break;
6185     case OPC2_32_RR_LT_WU:
6186         gen_cond_w(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6187         break;
6188     case OPC2_32_RR_MAX:
6189         tcg_gen_movcond_tl(TCG_COND_GT, cpu_gpr_d[r3], cpu_gpr_d[r1],
6190                            cpu_gpr_d[r2], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6191         break;
6192     case OPC2_32_RR_MAX_U:
6193         tcg_gen_movcond_tl(TCG_COND_GTU, cpu_gpr_d[r3], cpu_gpr_d[r1],
6194                            cpu_gpr_d[r2], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6195         break;
6196     case OPC2_32_RR_MAX_B:
6197         gen_helper_max_b(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6198         break;
6199     case OPC2_32_RR_MAX_BU:
6200         gen_helper_max_bu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6201         break;
6202     case OPC2_32_RR_MAX_H:
6203         gen_helper_max_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6204         break;
6205     case OPC2_32_RR_MAX_HU:
6206         gen_helper_max_hu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6207         break;
6208     case OPC2_32_RR_MIN:
6209         tcg_gen_movcond_tl(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1],
6210                            cpu_gpr_d[r2], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6211         break;
6212     case OPC2_32_RR_MIN_U:
6213         tcg_gen_movcond_tl(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1],
6214                            cpu_gpr_d[r2], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6215         break;
6216     case OPC2_32_RR_MIN_B:
6217         gen_helper_min_b(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6218         break;
6219     case OPC2_32_RR_MIN_BU:
6220         gen_helper_min_bu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6221         break;
6222     case OPC2_32_RR_MIN_H:
6223         gen_helper_min_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6224         break;
6225     case OPC2_32_RR_MIN_HU:
6226         gen_helper_min_hu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6227         break;
6228     case OPC2_32_RR_MOV:
6229         tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r2]);
6230         break;
6231     case OPC2_32_RR_MOV_64:
6232         if (has_feature(ctx, TRICORE_FEATURE_16)) {
6233             temp = tcg_temp_new();
6234 
6235             CHECK_REG_PAIR(r3);
6236             tcg_gen_mov_tl(temp, cpu_gpr_d[r1]);
6237             tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r2]);
6238             tcg_gen_mov_tl(cpu_gpr_d[r3 + 1], temp);
6239 
6240             tcg_temp_free(temp);
6241         } else {
6242             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6243         }
6244         break;
6245     case OPC2_32_RR_MOVS_64:
6246         if (has_feature(ctx, TRICORE_FEATURE_16)) {
6247             CHECK_REG_PAIR(r3);
6248             tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r2]);
6249             tcg_gen_sari_tl(cpu_gpr_d[r3 + 1], cpu_gpr_d[r2], 31);
6250         } else {
6251             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6252         }
6253         break;
6254     case OPC2_32_RR_NE:
6255         tcg_gen_setcond_tl(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_d[r1],
6256                            cpu_gpr_d[r2]);
6257         break;
6258     case OPC2_32_RR_OR_EQ:
6259         gen_accumulating_cond(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1],
6260                               cpu_gpr_d[r2], &tcg_gen_or_tl);
6261         break;
6262     case OPC2_32_RR_OR_GE:
6263         gen_accumulating_cond(TCG_COND_GE, cpu_gpr_d[r3], cpu_gpr_d[r1],
6264                               cpu_gpr_d[r2], &tcg_gen_or_tl);
6265         break;
6266     case OPC2_32_RR_OR_GE_U:
6267         gen_accumulating_cond(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_d[r1],
6268                               cpu_gpr_d[r2], &tcg_gen_or_tl);
6269         break;
6270     case OPC2_32_RR_OR_LT:
6271         gen_accumulating_cond(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1],
6272                               cpu_gpr_d[r2], &tcg_gen_or_tl);
6273         break;
6274     case OPC2_32_RR_OR_LT_U:
6275         gen_accumulating_cond(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1],
6276                               cpu_gpr_d[r2], &tcg_gen_or_tl);
6277         break;
6278     case OPC2_32_RR_OR_NE:
6279         gen_accumulating_cond(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_d[r1],
6280                               cpu_gpr_d[r2], &tcg_gen_or_tl);
6281         break;
6282     case OPC2_32_RR_SAT_B:
6283         gen_saturate(cpu_gpr_d[r3], cpu_gpr_d[r1], 0x7f, -0x80);
6284         break;
6285     case OPC2_32_RR_SAT_BU:
6286         gen_saturate_u(cpu_gpr_d[r3], cpu_gpr_d[r1], 0xff);
6287         break;
6288     case OPC2_32_RR_SAT_H:
6289         gen_saturate(cpu_gpr_d[r3], cpu_gpr_d[r1], 0x7fff, -0x8000);
6290         break;
6291     case OPC2_32_RR_SAT_HU:
6292         gen_saturate_u(cpu_gpr_d[r3], cpu_gpr_d[r1], 0xffff);
6293         break;
6294     case OPC2_32_RR_SH_EQ:
6295         gen_sh_cond(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1],
6296                     cpu_gpr_d[r2]);
6297         break;
6298     case OPC2_32_RR_SH_GE:
6299         gen_sh_cond(TCG_COND_GE, cpu_gpr_d[r3], cpu_gpr_d[r1],
6300                     cpu_gpr_d[r2]);
6301         break;
6302     case OPC2_32_RR_SH_GE_U:
6303         gen_sh_cond(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_d[r1],
6304                     cpu_gpr_d[r2]);
6305         break;
6306     case OPC2_32_RR_SH_LT:
6307         gen_sh_cond(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1],
6308                     cpu_gpr_d[r2]);
6309         break;
6310     case OPC2_32_RR_SH_LT_U:
6311         gen_sh_cond(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1],
6312                     cpu_gpr_d[r2]);
6313         break;
6314     case OPC2_32_RR_SH_NE:
6315         gen_sh_cond(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_d[r1],
6316                     cpu_gpr_d[r2]);
6317         break;
6318     case OPC2_32_RR_SUB:
6319         gen_sub_d(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6320         break;
6321     case OPC2_32_RR_SUB_B:
6322         gen_helper_sub_b(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
6323         break;
6324     case OPC2_32_RR_SUB_H:
6325         gen_helper_sub_h(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
6326         break;
6327     case OPC2_32_RR_SUBC:
6328         gen_subc_CC(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6329         break;
6330     case OPC2_32_RR_SUBS:
6331         gen_subs(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6332         break;
6333     case OPC2_32_RR_SUBS_U:
6334         gen_subsu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6335         break;
6336     case OPC2_32_RR_SUBS_H:
6337         gen_helper_sub_h_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
6338                               cpu_gpr_d[r2]);
6339         break;
6340     case OPC2_32_RR_SUBS_HU:
6341         gen_helper_sub_h_suov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
6342                               cpu_gpr_d[r2]);
6343         break;
6344     case OPC2_32_RR_SUBX:
6345         gen_sub_CC(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6346         break;
6347     case OPC2_32_RR_XOR_EQ:
6348         gen_accumulating_cond(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1],
6349                               cpu_gpr_d[r2], &tcg_gen_xor_tl);
6350         break;
6351     case OPC2_32_RR_XOR_GE:
6352         gen_accumulating_cond(TCG_COND_GE, cpu_gpr_d[r3], cpu_gpr_d[r1],
6353                               cpu_gpr_d[r2], &tcg_gen_xor_tl);
6354         break;
6355     case OPC2_32_RR_XOR_GE_U:
6356         gen_accumulating_cond(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_d[r1],
6357                               cpu_gpr_d[r2], &tcg_gen_xor_tl);
6358         break;
6359     case OPC2_32_RR_XOR_LT:
6360         gen_accumulating_cond(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1],
6361                               cpu_gpr_d[r2], &tcg_gen_xor_tl);
6362         break;
6363     case OPC2_32_RR_XOR_LT_U:
6364         gen_accumulating_cond(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1],
6365                               cpu_gpr_d[r2], &tcg_gen_xor_tl);
6366         break;
6367     case OPC2_32_RR_XOR_NE:
6368         gen_accumulating_cond(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_d[r1],
6369                               cpu_gpr_d[r2], &tcg_gen_xor_tl);
6370         break;
6371     default:
6372         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6373     }
6374 }
6375 
6376 static void decode_rr_logical_shift(DisasContext *ctx)
6377 {
6378     uint32_t op2;
6379     int r3, r2, r1;
6380     TCGv temp;
6381 
6382     r3 = MASK_OP_RR_D(ctx->opcode);
6383     r2 = MASK_OP_RR_S2(ctx->opcode);
6384     r1 = MASK_OP_RR_S1(ctx->opcode);
6385 
6386     temp = tcg_temp_new();
6387     op2 = MASK_OP_RR_OP2(ctx->opcode);
6388 
6389     switch (op2) {
6390     case OPC2_32_RR_AND:
6391         tcg_gen_and_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6392         break;
6393     case OPC2_32_RR_ANDN:
6394         tcg_gen_andc_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6395         break;
6396     case OPC2_32_RR_CLO:
6397         tcg_gen_not_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]);
6398         tcg_gen_clzi_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], TARGET_LONG_BITS);
6399         break;
6400     case OPC2_32_RR_CLO_H:
6401         gen_helper_clo_h(cpu_gpr_d[r3], cpu_gpr_d[r1]);
6402         break;
6403     case OPC2_32_RR_CLS:
6404         tcg_gen_clrsb_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]);
6405         break;
6406     case OPC2_32_RR_CLS_H:
6407         gen_helper_cls_h(cpu_gpr_d[r3], cpu_gpr_d[r1]);
6408         break;
6409     case OPC2_32_RR_CLZ:
6410         tcg_gen_clzi_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], TARGET_LONG_BITS);
6411         break;
6412     case OPC2_32_RR_CLZ_H:
6413         gen_helper_clz_h(cpu_gpr_d[r3], cpu_gpr_d[r1]);
6414         break;
6415     case OPC2_32_RR_NAND:
6416         tcg_gen_nand_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6417         break;
6418     case OPC2_32_RR_NOR:
6419         tcg_gen_nor_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6420         break;
6421     case OPC2_32_RR_OR:
6422         tcg_gen_or_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6423         break;
6424     case OPC2_32_RR_ORN:
6425         tcg_gen_orc_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6426         break;
6427     case OPC2_32_RR_SH:
6428         gen_helper_sh(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6429         break;
6430     case OPC2_32_RR_SH_H:
6431         gen_helper_sh_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6432         break;
6433     case OPC2_32_RR_SHA:
6434         gen_helper_sha(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
6435         break;
6436     case OPC2_32_RR_SHA_H:
6437         gen_helper_sha_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6438         break;
6439     case OPC2_32_RR_SHAS:
6440         gen_shas(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6441         break;
6442     case OPC2_32_RR_XNOR:
6443         tcg_gen_eqv_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6444         break;
6445     case OPC2_32_RR_XOR:
6446         tcg_gen_xor_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6447         break;
6448     default:
6449         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6450     }
6451     tcg_temp_free(temp);
6452 }
6453 
6454 static void decode_rr_address(DisasContext *ctx)
6455 {
6456     uint32_t op2, n;
6457     int r1, r2, r3;
6458     TCGv temp;
6459 
6460     op2 = MASK_OP_RR_OP2(ctx->opcode);
6461     r3 = MASK_OP_RR_D(ctx->opcode);
6462     r2 = MASK_OP_RR_S2(ctx->opcode);
6463     r1 = MASK_OP_RR_S1(ctx->opcode);
6464     n = MASK_OP_RR_N(ctx->opcode);
6465 
6466     switch (op2) {
6467     case OPC2_32_RR_ADD_A:
6468         tcg_gen_add_tl(cpu_gpr_a[r3], cpu_gpr_a[r1], cpu_gpr_a[r2]);
6469         break;
6470     case OPC2_32_RR_ADDSC_A:
6471         temp = tcg_temp_new();
6472         tcg_gen_shli_tl(temp, cpu_gpr_d[r1], n);
6473         tcg_gen_add_tl(cpu_gpr_a[r3], cpu_gpr_a[r2], temp);
6474         tcg_temp_free(temp);
6475         break;
6476     case OPC2_32_RR_ADDSC_AT:
6477         temp = tcg_temp_new();
6478         tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 3);
6479         tcg_gen_add_tl(temp, cpu_gpr_a[r2], temp);
6480         tcg_gen_andi_tl(cpu_gpr_a[r3], temp, 0xFFFFFFFC);
6481         tcg_temp_free(temp);
6482         break;
6483     case OPC2_32_RR_EQ_A:
6484         tcg_gen_setcond_tl(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_a[r1],
6485                            cpu_gpr_a[r2]);
6486         break;
6487     case OPC2_32_RR_EQZ:
6488         tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_a[r1], 0);
6489         break;
6490     case OPC2_32_RR_GE_A:
6491         tcg_gen_setcond_tl(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_a[r1],
6492                            cpu_gpr_a[r2]);
6493         break;
6494     case OPC2_32_RR_LT_A:
6495         tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_a[r1],
6496                            cpu_gpr_a[r2]);
6497         break;
6498     case OPC2_32_RR_MOV_A:
6499         tcg_gen_mov_tl(cpu_gpr_a[r3], cpu_gpr_d[r2]);
6500         break;
6501     case OPC2_32_RR_MOV_AA:
6502         tcg_gen_mov_tl(cpu_gpr_a[r3], cpu_gpr_a[r2]);
6503         break;
6504     case OPC2_32_RR_MOV_D:
6505         tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_a[r2]);
6506         break;
6507     case OPC2_32_RR_NE_A:
6508         tcg_gen_setcond_tl(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_a[r1],
6509                            cpu_gpr_a[r2]);
6510         break;
6511     case OPC2_32_RR_NEZ_A:
6512         tcg_gen_setcondi_tl(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_a[r1], 0);
6513         break;
6514     case OPC2_32_RR_SUB_A:
6515         tcg_gen_sub_tl(cpu_gpr_a[r3], cpu_gpr_a[r1], cpu_gpr_a[r2]);
6516         break;
6517     default:
6518         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6519     }
6520 }
6521 
6522 static void decode_rr_idirect(DisasContext *ctx)
6523 {
6524     uint32_t op2;
6525     int r1;
6526 
6527     op2 = MASK_OP_RR_OP2(ctx->opcode);
6528     r1 = MASK_OP_RR_S1(ctx->opcode);
6529 
6530     switch (op2) {
6531     case OPC2_32_RR_JI:
6532         tcg_gen_andi_tl(cpu_PC, cpu_gpr_a[r1], ~0x1);
6533         break;
6534     case OPC2_32_RR_JLI:
6535         tcg_gen_movi_tl(cpu_gpr_a[11], ctx->pc_succ_insn);
6536         tcg_gen_andi_tl(cpu_PC, cpu_gpr_a[r1], ~0x1);
6537         break;
6538     case OPC2_32_RR_CALLI:
6539         gen_helper_1arg(call, ctx->pc_succ_insn);
6540         tcg_gen_andi_tl(cpu_PC, cpu_gpr_a[r1], ~0x1);
6541         break;
6542     case OPC2_32_RR_FCALLI:
6543         gen_fcall_save_ctx(ctx);
6544         tcg_gen_andi_tl(cpu_PC, cpu_gpr_a[r1], ~0x1);
6545         break;
6546     default:
6547         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6548     }
6549     tcg_gen_exit_tb(NULL, 0);
6550     ctx->base.is_jmp = DISAS_NORETURN;
6551 }
6552 
6553 static void decode_rr_divide(DisasContext *ctx)
6554 {
6555     uint32_t op2;
6556     int r1, r2, r3;
6557 
6558     TCGv temp, temp2, temp3;
6559 
6560     op2 = MASK_OP_RR_OP2(ctx->opcode);
6561     r3 = MASK_OP_RR_D(ctx->opcode);
6562     r2 = MASK_OP_RR_S2(ctx->opcode);
6563     r1 = MASK_OP_RR_S1(ctx->opcode);
6564 
6565     switch (op2) {
6566     case OPC2_32_RR_BMERGE:
6567         gen_helper_bmerge(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6568         break;
6569     case OPC2_32_RR_BSPLIT:
6570         CHECK_REG_PAIR(r3);
6571         gen_bsplit(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1]);
6572         break;
6573     case OPC2_32_RR_DVINIT_B:
6574         CHECK_REG_PAIR(r3);
6575         gen_dvinit_b(ctx, cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1],
6576                      cpu_gpr_d[r2]);
6577         break;
6578     case OPC2_32_RR_DVINIT_BU:
6579         temp = tcg_temp_new();
6580         temp2 = tcg_temp_new();
6581         temp3 = tcg_temp_new();
6582         CHECK_REG_PAIR(r3);
6583         tcg_gen_shri_tl(temp3, cpu_gpr_d[r1], 8);
6584         /* reset av */
6585         tcg_gen_movi_tl(cpu_PSW_AV, 0);
6586         if (!has_feature(ctx, TRICORE_FEATURE_131)) {
6587             /* overflow = (abs(D[r3+1]) >= abs(D[r2])) */
6588             tcg_gen_abs_tl(temp, temp3);
6589             tcg_gen_abs_tl(temp2, cpu_gpr_d[r2]);
6590             tcg_gen_setcond_tl(TCG_COND_GE, cpu_PSW_V, temp, temp2);
6591         } else {
6592             /* overflow = (D[b] == 0) */
6593             tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, cpu_gpr_d[r2], 0);
6594         }
6595         tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
6596         /* sv */
6597         tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
6598         /* write result */
6599         tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], 24);
6600         tcg_gen_mov_tl(cpu_gpr_d[r3+1], temp3);
6601 
6602         tcg_temp_free(temp);
6603         tcg_temp_free(temp2);
6604         tcg_temp_free(temp3);
6605         break;
6606     case OPC2_32_RR_DVINIT_H:
6607         CHECK_REG_PAIR(r3);
6608         gen_dvinit_h(ctx, cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1],
6609                      cpu_gpr_d[r2]);
6610         break;
6611     case OPC2_32_RR_DVINIT_HU:
6612         temp = tcg_temp_new();
6613         temp2 = tcg_temp_new();
6614         temp3 = tcg_temp_new();
6615         CHECK_REG_PAIR(r3);
6616         tcg_gen_shri_tl(temp3, cpu_gpr_d[r1], 16);
6617         /* reset av */
6618         tcg_gen_movi_tl(cpu_PSW_AV, 0);
6619         if (!has_feature(ctx, TRICORE_FEATURE_131)) {
6620             /* overflow = (abs(D[r3+1]) >= abs(D[r2])) */
6621             tcg_gen_abs_tl(temp, temp3);
6622             tcg_gen_abs_tl(temp2, cpu_gpr_d[r2]);
6623             tcg_gen_setcond_tl(TCG_COND_GE, cpu_PSW_V, temp, temp2);
6624         } else {
6625             /* overflow = (D[b] == 0) */
6626             tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, cpu_gpr_d[r2], 0);
6627         }
6628         tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
6629         /* sv */
6630         tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
6631         /* write result */
6632         tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], 16);
6633         tcg_gen_mov_tl(cpu_gpr_d[r3+1], temp3);
6634         tcg_temp_free(temp);
6635         tcg_temp_free(temp2);
6636         tcg_temp_free(temp3);
6637         break;
6638     case OPC2_32_RR_DVINIT:
6639         temp = tcg_temp_new();
6640         temp2 = tcg_temp_new();
6641         CHECK_REG_PAIR(r3);
6642         /* overflow = ((D[b] == 0) ||
6643                       ((D[b] == 0xFFFFFFFF) && (D[a] == 0x80000000))) */
6644         tcg_gen_setcondi_tl(TCG_COND_EQ, temp, cpu_gpr_d[r2], 0xffffffff);
6645         tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, cpu_gpr_d[r1], 0x80000000);
6646         tcg_gen_and_tl(temp, temp, temp2);
6647         tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, cpu_gpr_d[r2], 0);
6648         tcg_gen_or_tl(cpu_PSW_V, temp, temp2);
6649         tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
6650         /* sv */
6651         tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
6652         /* reset av */
6653        tcg_gen_movi_tl(cpu_PSW_AV, 0);
6654         /* write result */
6655         tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]);
6656         /* sign extend to high reg */
6657         tcg_gen_sari_tl(cpu_gpr_d[r3+1], cpu_gpr_d[r1], 31);
6658         tcg_temp_free(temp);
6659         tcg_temp_free(temp2);
6660         break;
6661     case OPC2_32_RR_DVINIT_U:
6662         /* overflow = (D[b] == 0) */
6663         tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, cpu_gpr_d[r2], 0);
6664         tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
6665         /* sv */
6666         tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
6667         /* reset av */
6668         tcg_gen_movi_tl(cpu_PSW_AV, 0);
6669         /* write result */
6670         tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]);
6671         /* zero extend to high reg*/
6672         tcg_gen_movi_tl(cpu_gpr_d[r3+1], 0);
6673         break;
6674     case OPC2_32_RR_PARITY:
6675         gen_helper_parity(cpu_gpr_d[r3], cpu_gpr_d[r1]);
6676         break;
6677     case OPC2_32_RR_UNPACK:
6678         CHECK_REG_PAIR(r3);
6679         gen_unpack(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1]);
6680         break;
6681     case OPC2_32_RR_CRC32:
6682         if (has_feature(ctx, TRICORE_FEATURE_161)) {
6683             gen_helper_crc32(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6684         } else {
6685             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6686         }
6687         break;
6688     case OPC2_32_RR_DIV:
6689         if (has_feature(ctx, TRICORE_FEATURE_16)) {
6690             GEN_HELPER_RR(divide, cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1],
6691                           cpu_gpr_d[r2]);
6692         } else {
6693             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6694         }
6695         break;
6696     case OPC2_32_RR_DIV_U:
6697         if (has_feature(ctx, TRICORE_FEATURE_16)) {
6698             GEN_HELPER_RR(divide_u, cpu_gpr_d[r3], cpu_gpr_d[r3+1],
6699                           cpu_gpr_d[r1], cpu_gpr_d[r2]);
6700         } else {
6701             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6702         }
6703         break;
6704     case OPC2_32_RR_MUL_F:
6705         gen_helper_fmul(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
6706         break;
6707     case OPC2_32_RR_DIV_F:
6708         gen_helper_fdiv(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
6709         break;
6710     case OPC2_32_RR_CMP_F:
6711         gen_helper_fcmp(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
6712         break;
6713     case OPC2_32_RR_FTOI:
6714         gen_helper_ftoi(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
6715         break;
6716     case OPC2_32_RR_ITOF:
6717         gen_helper_itof(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
6718         break;
6719     case OPC2_32_RR_FTOUZ:
6720         gen_helper_ftouz(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
6721         break;
6722     case OPC2_32_RR_UPDFL:
6723         gen_helper_updfl(cpu_env, cpu_gpr_d[r1]);
6724         break;
6725     case OPC2_32_RR_UTOF:
6726         gen_helper_utof(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
6727         break;
6728     case OPC2_32_RR_FTOIZ:
6729         gen_helper_ftoiz(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
6730         break;
6731     case OPC2_32_RR_QSEED_F:
6732         gen_helper_qseed(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
6733         break;
6734     default:
6735         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6736     }
6737 }
6738 
6739 /* RR1 Format */
6740 static void decode_rr1_mul(DisasContext *ctx)
6741 {
6742     uint32_t op2;
6743 
6744     int r1, r2, r3;
6745     TCGv n;
6746     TCGv_i64 temp64;
6747 
6748     r1 = MASK_OP_RR1_S1(ctx->opcode);
6749     r2 = MASK_OP_RR1_S2(ctx->opcode);
6750     r3 = MASK_OP_RR1_D(ctx->opcode);
6751     n  = tcg_const_i32(MASK_OP_RR1_N(ctx->opcode));
6752     op2 = MASK_OP_RR1_OP2(ctx->opcode);
6753 
6754     switch (op2) {
6755     case OPC2_32_RR1_MUL_H_32_LL:
6756         temp64 = tcg_temp_new_i64();
6757         CHECK_REG_PAIR(r3);
6758         GEN_HELPER_LL(mul_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6759         tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
6760         gen_calc_usb_mul_h(cpu_gpr_d[r3], cpu_gpr_d[r3+1]);
6761         tcg_temp_free_i64(temp64);
6762         break;
6763     case OPC2_32_RR1_MUL_H_32_LU:
6764         temp64 = tcg_temp_new_i64();
6765         CHECK_REG_PAIR(r3);
6766         GEN_HELPER_LU(mul_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6767         tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
6768         gen_calc_usb_mul_h(cpu_gpr_d[r3], cpu_gpr_d[r3+1]);
6769         tcg_temp_free_i64(temp64);
6770         break;
6771     case OPC2_32_RR1_MUL_H_32_UL:
6772         temp64 = tcg_temp_new_i64();
6773         CHECK_REG_PAIR(r3);
6774         GEN_HELPER_UL(mul_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6775         tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
6776         gen_calc_usb_mul_h(cpu_gpr_d[r3], cpu_gpr_d[r3+1]);
6777         tcg_temp_free_i64(temp64);
6778         break;
6779     case OPC2_32_RR1_MUL_H_32_UU:
6780         temp64 = tcg_temp_new_i64();
6781         CHECK_REG_PAIR(r3);
6782         GEN_HELPER_UU(mul_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6783         tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
6784         gen_calc_usb_mul_h(cpu_gpr_d[r3], cpu_gpr_d[r3+1]);
6785         tcg_temp_free_i64(temp64);
6786         break;
6787     case OPC2_32_RR1_MULM_H_64_LL:
6788         temp64 = tcg_temp_new_i64();
6789         CHECK_REG_PAIR(r3);
6790         GEN_HELPER_LL(mulm_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6791         tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
6792         /* reset V bit */
6793         tcg_gen_movi_tl(cpu_PSW_V, 0);
6794         /* reset AV bit */
6795         tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V);
6796         tcg_temp_free_i64(temp64);
6797         break;
6798     case OPC2_32_RR1_MULM_H_64_LU:
6799         temp64 = tcg_temp_new_i64();
6800         CHECK_REG_PAIR(r3);
6801         GEN_HELPER_LU(mulm_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6802         tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
6803         /* reset V bit */
6804         tcg_gen_movi_tl(cpu_PSW_V, 0);
6805         /* reset AV bit */
6806         tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V);
6807         tcg_temp_free_i64(temp64);
6808         break;
6809     case OPC2_32_RR1_MULM_H_64_UL:
6810         temp64 = tcg_temp_new_i64();
6811         CHECK_REG_PAIR(r3);
6812         GEN_HELPER_UL(mulm_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6813         tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
6814         /* reset V bit */
6815         tcg_gen_movi_tl(cpu_PSW_V, 0);
6816         /* reset AV bit */
6817         tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V);
6818         tcg_temp_free_i64(temp64);
6819         break;
6820     case OPC2_32_RR1_MULM_H_64_UU:
6821         temp64 = tcg_temp_new_i64();
6822         CHECK_REG_PAIR(r3);
6823         GEN_HELPER_UU(mulm_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6824         tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
6825         /* reset V bit */
6826         tcg_gen_movi_tl(cpu_PSW_V, 0);
6827         /* reset AV bit */
6828         tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V);
6829         tcg_temp_free_i64(temp64);
6830 
6831         break;
6832     case OPC2_32_RR1_MULR_H_16_LL:
6833         GEN_HELPER_LL(mulr_h, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6834         gen_calc_usb_mulr_h(cpu_gpr_d[r3]);
6835         break;
6836     case OPC2_32_RR1_MULR_H_16_LU:
6837         GEN_HELPER_LU(mulr_h, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6838         gen_calc_usb_mulr_h(cpu_gpr_d[r3]);
6839         break;
6840     case OPC2_32_RR1_MULR_H_16_UL:
6841         GEN_HELPER_UL(mulr_h, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6842         gen_calc_usb_mulr_h(cpu_gpr_d[r3]);
6843         break;
6844     case OPC2_32_RR1_MULR_H_16_UU:
6845         GEN_HELPER_UU(mulr_h, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6846         gen_calc_usb_mulr_h(cpu_gpr_d[r3]);
6847         break;
6848     default:
6849         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6850     }
6851     tcg_temp_free(n);
6852 }
6853 
6854 static void decode_rr1_mulq(DisasContext *ctx)
6855 {
6856     uint32_t op2;
6857     int r1, r2, r3;
6858     uint32_t n;
6859 
6860     TCGv temp, temp2;
6861 
6862     r1 = MASK_OP_RR1_S1(ctx->opcode);
6863     r2 = MASK_OP_RR1_S2(ctx->opcode);
6864     r3 = MASK_OP_RR1_D(ctx->opcode);
6865     n  = MASK_OP_RR1_N(ctx->opcode);
6866     op2 = MASK_OP_RR1_OP2(ctx->opcode);
6867 
6868     temp = tcg_temp_new();
6869     temp2 = tcg_temp_new();
6870 
6871     switch (op2) {
6872     case OPC2_32_RR1_MUL_Q_32:
6873         gen_mul_q(cpu_gpr_d[r3], temp, cpu_gpr_d[r1], cpu_gpr_d[r2], n, 32);
6874         break;
6875     case OPC2_32_RR1_MUL_Q_64:
6876         CHECK_REG_PAIR(r3);
6877         gen_mul_q(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
6878                   n, 0);
6879         break;
6880     case OPC2_32_RR1_MUL_Q_32_L:
6881         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]);
6882         gen_mul_q(cpu_gpr_d[r3], temp, cpu_gpr_d[r1], temp, n, 16);
6883         break;
6884     case OPC2_32_RR1_MUL_Q_64_L:
6885         CHECK_REG_PAIR(r3);
6886         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]);
6887         gen_mul_q(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp, n, 0);
6888         break;
6889     case OPC2_32_RR1_MUL_Q_32_U:
6890         tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16);
6891         gen_mul_q(cpu_gpr_d[r3], temp, cpu_gpr_d[r1], temp, n, 16);
6892         break;
6893     case OPC2_32_RR1_MUL_Q_64_U:
6894         CHECK_REG_PAIR(r3);
6895         tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16);
6896         gen_mul_q(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp, n, 0);
6897         break;
6898     case OPC2_32_RR1_MUL_Q_32_LL:
6899         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]);
6900         tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]);
6901         gen_mul_q_16(cpu_gpr_d[r3], temp, temp2, n);
6902         break;
6903     case OPC2_32_RR1_MUL_Q_32_UU:
6904         tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16);
6905         tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16);
6906         gen_mul_q_16(cpu_gpr_d[r3], temp, temp2, n);
6907         break;
6908     case OPC2_32_RR1_MULR_Q_32_L:
6909         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]);
6910         tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]);
6911         gen_mulr_q(cpu_gpr_d[r3], temp, temp2, n);
6912         break;
6913     case OPC2_32_RR1_MULR_Q_32_U:
6914         tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16);
6915         tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16);
6916         gen_mulr_q(cpu_gpr_d[r3], temp, temp2, n);
6917         break;
6918     default:
6919         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6920     }
6921     tcg_temp_free(temp);
6922     tcg_temp_free(temp2);
6923 }
6924 
6925 /* RR2 format */
6926 static void decode_rr2_mul(DisasContext *ctx)
6927 {
6928     uint32_t op2;
6929     int r1, r2, r3;
6930 
6931     op2 = MASK_OP_RR2_OP2(ctx->opcode);
6932     r1  = MASK_OP_RR2_S1(ctx->opcode);
6933     r2  = MASK_OP_RR2_S2(ctx->opcode);
6934     r3  = MASK_OP_RR2_D(ctx->opcode);
6935     switch (op2) {
6936     case OPC2_32_RR2_MUL_32:
6937         gen_mul_i32s(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6938         break;
6939     case OPC2_32_RR2_MUL_64:
6940         CHECK_REG_PAIR(r3);
6941         gen_mul_i64s(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1],
6942                      cpu_gpr_d[r2]);
6943         break;
6944     case OPC2_32_RR2_MULS_32:
6945         gen_helper_mul_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
6946                             cpu_gpr_d[r2]);
6947         break;
6948     case OPC2_32_RR2_MUL_U_64:
6949         CHECK_REG_PAIR(r3);
6950         gen_mul_i64u(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1],
6951                      cpu_gpr_d[r2]);
6952         break;
6953     case OPC2_32_RR2_MULS_U_32:
6954         gen_helper_mul_suov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
6955                             cpu_gpr_d[r2]);
6956         break;
6957     default:
6958         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6959     }
6960 }
6961 
6962 /* RRPW format */
6963 static void decode_rrpw_extract_insert(DisasContext *ctx)
6964 {
6965     uint32_t op2;
6966     int r1, r2, r3;
6967     int32_t pos, width;
6968     TCGv temp;
6969 
6970     op2 = MASK_OP_RRPW_OP2(ctx->opcode);
6971     r1 = MASK_OP_RRPW_S1(ctx->opcode);
6972     r2 = MASK_OP_RRPW_S2(ctx->opcode);
6973     r3 = MASK_OP_RRPW_D(ctx->opcode);
6974     pos = MASK_OP_RRPW_POS(ctx->opcode);
6975     width = MASK_OP_RRPW_WIDTH(ctx->opcode);
6976 
6977     switch (op2) {
6978     case OPC2_32_RRPW_EXTR:
6979         if (width == 0) {
6980                 tcg_gen_movi_tl(cpu_gpr_d[r3], 0);
6981                 break;
6982         }
6983 
6984         if (pos + width <= 32) {
6985             /* optimize special cases */
6986             if ((pos == 0) && (width == 8)) {
6987                 tcg_gen_ext8s_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]);
6988             } else if ((pos == 0) && (width == 16)) {
6989                 tcg_gen_ext16s_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]);
6990             } else {
6991                 tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], 32 - pos - width);
6992                 tcg_gen_sari_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], 32 - width);
6993             }
6994         }
6995         break;
6996     case OPC2_32_RRPW_EXTR_U:
6997         if (width == 0) {
6998             tcg_gen_movi_tl(cpu_gpr_d[r3], 0);
6999         } else {
7000             tcg_gen_shri_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], pos);
7001             tcg_gen_andi_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], ~0u >> (32-width));
7002         }
7003         break;
7004     case OPC2_32_RRPW_IMASK:
7005         CHECK_REG_PAIR(r3);
7006 
7007         if (pos + width <= 32) {
7008             temp = tcg_temp_new();
7009             tcg_gen_movi_tl(temp, ((1u << width) - 1) << pos);
7010             tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r2], pos);
7011             tcg_gen_mov_tl(cpu_gpr_d[r3 + 1], temp);
7012             tcg_temp_free(temp);
7013         }
7014 
7015         break;
7016     case OPC2_32_RRPW_INSERT:
7017         if (pos + width <= 32) {
7018             tcg_gen_deposit_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
7019                                pos, width);
7020         }
7021         break;
7022     default:
7023         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
7024     }
7025 }
7026 
7027 /* RRR format */
7028 static void decode_rrr_cond_select(DisasContext *ctx)
7029 {
7030     uint32_t op2;
7031     int r1, r2, r3, r4;
7032     TCGv temp;
7033 
7034     op2 = MASK_OP_RRR_OP2(ctx->opcode);
7035     r1  = MASK_OP_RRR_S1(ctx->opcode);
7036     r2  = MASK_OP_RRR_S2(ctx->opcode);
7037     r3  = MASK_OP_RRR_S3(ctx->opcode);
7038     r4  = MASK_OP_RRR_D(ctx->opcode);
7039 
7040     switch (op2) {
7041     case OPC2_32_RRR_CADD:
7042         gen_cond_add(TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[r2],
7043                      cpu_gpr_d[r4], cpu_gpr_d[r3]);
7044         break;
7045     case OPC2_32_RRR_CADDN:
7046         gen_cond_add(TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[r2], cpu_gpr_d[r4],
7047                      cpu_gpr_d[r3]);
7048         break;
7049     case OPC2_32_RRR_CSUB:
7050         gen_cond_sub(TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[r2], cpu_gpr_d[r4],
7051                      cpu_gpr_d[r3]);
7052         break;
7053     case OPC2_32_RRR_CSUBN:
7054         gen_cond_sub(TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[r2], cpu_gpr_d[r4],
7055                      cpu_gpr_d[r3]);
7056         break;
7057     case OPC2_32_RRR_SEL:
7058         temp = tcg_const_i32(0);
7059         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr_d[r4], cpu_gpr_d[r3], temp,
7060                            cpu_gpr_d[r1], cpu_gpr_d[r2]);
7061         tcg_temp_free(temp);
7062         break;
7063     case OPC2_32_RRR_SELN:
7064         temp = tcg_const_i32(0);
7065         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr_d[r4], cpu_gpr_d[r3], temp,
7066                            cpu_gpr_d[r1], cpu_gpr_d[r2]);
7067         tcg_temp_free(temp);
7068         break;
7069     default:
7070         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
7071     }
7072 }
7073 
7074 static void decode_rrr_divide(DisasContext *ctx)
7075 {
7076     uint32_t op2;
7077 
7078     int r1, r2, r3, r4;
7079 
7080     op2 = MASK_OP_RRR_OP2(ctx->opcode);
7081     r1 = MASK_OP_RRR_S1(ctx->opcode);
7082     r2 = MASK_OP_RRR_S2(ctx->opcode);
7083     r3 = MASK_OP_RRR_S3(ctx->opcode);
7084     r4 = MASK_OP_RRR_D(ctx->opcode);
7085 
7086     switch (op2) {
7087     case OPC2_32_RRR_DVADJ:
7088         CHECK_REG_PAIR(r3);
7089         CHECK_REG_PAIR(r4);
7090         GEN_HELPER_RRR(dvadj, cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7091                        cpu_gpr_d[r3+1], cpu_gpr_d[r2]);
7092         break;
7093     case OPC2_32_RRR_DVSTEP:
7094         CHECK_REG_PAIR(r3);
7095         CHECK_REG_PAIR(r4);
7096         GEN_HELPER_RRR(dvstep, cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7097                        cpu_gpr_d[r3+1], cpu_gpr_d[r2]);
7098         break;
7099     case OPC2_32_RRR_DVSTEP_U:
7100         CHECK_REG_PAIR(r3);
7101         CHECK_REG_PAIR(r4);
7102         GEN_HELPER_RRR(dvstep_u, cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7103                        cpu_gpr_d[r3+1], cpu_gpr_d[r2]);
7104         break;
7105     case OPC2_32_RRR_IXMAX:
7106         CHECK_REG_PAIR(r3);
7107         CHECK_REG_PAIR(r4);
7108         GEN_HELPER_RRR(ixmax, cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7109                        cpu_gpr_d[r3+1], cpu_gpr_d[r2]);
7110         break;
7111     case OPC2_32_RRR_IXMAX_U:
7112         CHECK_REG_PAIR(r3);
7113         CHECK_REG_PAIR(r4);
7114         GEN_HELPER_RRR(ixmax_u, cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7115                        cpu_gpr_d[r3+1], cpu_gpr_d[r2]);
7116         break;
7117     case OPC2_32_RRR_IXMIN:
7118         CHECK_REG_PAIR(r3);
7119         CHECK_REG_PAIR(r4);
7120         GEN_HELPER_RRR(ixmin, cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7121                        cpu_gpr_d[r3+1], cpu_gpr_d[r2]);
7122         break;
7123     case OPC2_32_RRR_IXMIN_U:
7124         CHECK_REG_PAIR(r3);
7125         CHECK_REG_PAIR(r4);
7126         GEN_HELPER_RRR(ixmin_u, cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7127                        cpu_gpr_d[r3+1], cpu_gpr_d[r2]);
7128         break;
7129     case OPC2_32_RRR_PACK:
7130         CHECK_REG_PAIR(r3);
7131         gen_helper_pack(cpu_gpr_d[r4], cpu_PSW_C, cpu_gpr_d[r3],
7132                         cpu_gpr_d[r3+1], cpu_gpr_d[r1]);
7133         break;
7134     case OPC2_32_RRR_ADD_F:
7135         gen_helper_fadd(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r3]);
7136         break;
7137     case OPC2_32_RRR_SUB_F:
7138         gen_helper_fsub(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r3]);
7139         break;
7140     case OPC2_32_RRR_MADD_F:
7141         gen_helper_fmadd(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1],
7142                          cpu_gpr_d[r2], cpu_gpr_d[r3]);
7143         break;
7144     case OPC2_32_RRR_MSUB_F:
7145         gen_helper_fmsub(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1],
7146                          cpu_gpr_d[r2], cpu_gpr_d[r3]);
7147         break;
7148     default:
7149         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
7150     }
7151 }
7152 
7153 /* RRR2 format */
7154 static void decode_rrr2_madd(DisasContext *ctx)
7155 {
7156     uint32_t op2;
7157     uint32_t r1, r2, r3, r4;
7158 
7159     op2 = MASK_OP_RRR2_OP2(ctx->opcode);
7160     r1 = MASK_OP_RRR2_S1(ctx->opcode);
7161     r2 = MASK_OP_RRR2_S2(ctx->opcode);
7162     r3 = MASK_OP_RRR2_S3(ctx->opcode);
7163     r4 = MASK_OP_RRR2_D(ctx->opcode);
7164     switch (op2) {
7165     case OPC2_32_RRR2_MADD_32:
7166         gen_madd32_d(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3],
7167                      cpu_gpr_d[r2]);
7168         break;
7169     case OPC2_32_RRR2_MADD_64:
7170         CHECK_REG_PAIR(r4);
7171         CHECK_REG_PAIR(r3);
7172         gen_madd64_d(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1],
7173                      cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r2]);
7174         break;
7175     case OPC2_32_RRR2_MADDS_32:
7176         gen_helper_madd32_ssov(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1],
7177                                cpu_gpr_d[r3], cpu_gpr_d[r2]);
7178         break;
7179     case OPC2_32_RRR2_MADDS_64:
7180         CHECK_REG_PAIR(r4);
7181         CHECK_REG_PAIR(r3);
7182         gen_madds_64(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1],
7183                      cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r2]);
7184         break;
7185     case OPC2_32_RRR2_MADD_U_64:
7186         CHECK_REG_PAIR(r4);
7187         CHECK_REG_PAIR(r3);
7188         gen_maddu64_d(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1],
7189                       cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r2]);
7190         break;
7191     case OPC2_32_RRR2_MADDS_U_32:
7192         gen_helper_madd32_suov(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1],
7193                                cpu_gpr_d[r3], cpu_gpr_d[r2]);
7194         break;
7195     case OPC2_32_RRR2_MADDS_U_64:
7196         CHECK_REG_PAIR(r4);
7197         CHECK_REG_PAIR(r3);
7198         gen_maddsu_64(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1],
7199                       cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r2]);
7200         break;
7201     default:
7202         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
7203     }
7204 }
7205 
7206 static void decode_rrr2_msub(DisasContext *ctx)
7207 {
7208     uint32_t op2;
7209     uint32_t r1, r2, r3, r4;
7210 
7211     op2 = MASK_OP_RRR2_OP2(ctx->opcode);
7212     r1 = MASK_OP_RRR2_S1(ctx->opcode);
7213     r2 = MASK_OP_RRR2_S2(ctx->opcode);
7214     r3 = MASK_OP_RRR2_S3(ctx->opcode);
7215     r4 = MASK_OP_RRR2_D(ctx->opcode);
7216 
7217     switch (op2) {
7218     case OPC2_32_RRR2_MSUB_32:
7219         gen_msub32_d(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3],
7220                       cpu_gpr_d[r2]);
7221         break;
7222     case OPC2_32_RRR2_MSUB_64:
7223         CHECK_REG_PAIR(r4);
7224         CHECK_REG_PAIR(r3);
7225         gen_msub64_d(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1],
7226                      cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r2]);
7227         break;
7228     case OPC2_32_RRR2_MSUBS_32:
7229         gen_helper_msub32_ssov(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1],
7230                                cpu_gpr_d[r3], cpu_gpr_d[r2]);
7231         break;
7232     case OPC2_32_RRR2_MSUBS_64:
7233         CHECK_REG_PAIR(r4);
7234         CHECK_REG_PAIR(r3);
7235         gen_msubs_64(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1],
7236                      cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r2]);
7237         break;
7238     case OPC2_32_RRR2_MSUB_U_64:
7239         gen_msubu64_d(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1],
7240                       cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r2]);
7241         break;
7242     case OPC2_32_RRR2_MSUBS_U_32:
7243         gen_helper_msub32_suov(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1],
7244                                cpu_gpr_d[r3], cpu_gpr_d[r2]);
7245         break;
7246     case OPC2_32_RRR2_MSUBS_U_64:
7247         CHECK_REG_PAIR(r4);
7248         CHECK_REG_PAIR(r3);
7249         gen_msubsu_64(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1],
7250                       cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r2]);
7251         break;
7252     default:
7253         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
7254     }
7255 }
7256 
7257 /* RRR1 format */
7258 static void decode_rrr1_madd(DisasContext *ctx)
7259 {
7260     uint32_t op2;
7261     uint32_t r1, r2, r3, r4, n;
7262 
7263     op2 = MASK_OP_RRR1_OP2(ctx->opcode);
7264     r1 = MASK_OP_RRR1_S1(ctx->opcode);
7265     r2 = MASK_OP_RRR1_S2(ctx->opcode);
7266     r3 = MASK_OP_RRR1_S3(ctx->opcode);
7267     r4 = MASK_OP_RRR1_D(ctx->opcode);
7268     n = MASK_OP_RRR1_N(ctx->opcode);
7269 
7270     switch (op2) {
7271     case OPC2_32_RRR1_MADD_H_LL:
7272         CHECK_REG_PAIR(r4);
7273         CHECK_REG_PAIR(r3);
7274         gen_madd_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7275                    cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LL);
7276         break;
7277     case OPC2_32_RRR1_MADD_H_LU:
7278         CHECK_REG_PAIR(r4);
7279         CHECK_REG_PAIR(r3);
7280         gen_madd_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7281                    cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LU);
7282         break;
7283     case OPC2_32_RRR1_MADD_H_UL:
7284         CHECK_REG_PAIR(r4);
7285         CHECK_REG_PAIR(r3);
7286         gen_madd_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7287                    cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UL);
7288         break;
7289     case OPC2_32_RRR1_MADD_H_UU:
7290         CHECK_REG_PAIR(r4);
7291         CHECK_REG_PAIR(r3);
7292         gen_madd_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7293                    cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UU);
7294         break;
7295     case OPC2_32_RRR1_MADDS_H_LL:
7296         CHECK_REG_PAIR(r4);
7297         CHECK_REG_PAIR(r3);
7298         gen_madds_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7299                     cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LL);
7300         break;
7301     case OPC2_32_RRR1_MADDS_H_LU:
7302         CHECK_REG_PAIR(r4);
7303         CHECK_REG_PAIR(r3);
7304         gen_madds_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7305                     cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LU);
7306         break;
7307     case OPC2_32_RRR1_MADDS_H_UL:
7308         CHECK_REG_PAIR(r4);
7309         CHECK_REG_PAIR(r3);
7310         gen_madds_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7311                     cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UL);
7312         break;
7313     case OPC2_32_RRR1_MADDS_H_UU:
7314         CHECK_REG_PAIR(r4);
7315         CHECK_REG_PAIR(r3);
7316         gen_madds_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7317                     cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UU);
7318         break;
7319     case OPC2_32_RRR1_MADDM_H_LL:
7320         CHECK_REG_PAIR(r4);
7321         CHECK_REG_PAIR(r3);
7322         gen_maddm_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7323                     cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LL);
7324         break;
7325     case OPC2_32_RRR1_MADDM_H_LU:
7326         CHECK_REG_PAIR(r4);
7327         CHECK_REG_PAIR(r3);
7328         gen_maddm_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7329                     cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LU);
7330         break;
7331     case OPC2_32_RRR1_MADDM_H_UL:
7332         CHECK_REG_PAIR(r4);
7333         CHECK_REG_PAIR(r3);
7334         gen_maddm_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7335                     cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UL);
7336         break;
7337     case OPC2_32_RRR1_MADDM_H_UU:
7338         CHECK_REG_PAIR(r4);
7339         CHECK_REG_PAIR(r3);
7340         gen_maddm_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7341                     cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UU);
7342         break;
7343     case OPC2_32_RRR1_MADDMS_H_LL:
7344         CHECK_REG_PAIR(r4);
7345         CHECK_REG_PAIR(r3);
7346         gen_maddms_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7347                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LL);
7348         break;
7349     case OPC2_32_RRR1_MADDMS_H_LU:
7350         CHECK_REG_PAIR(r4);
7351         CHECK_REG_PAIR(r3);
7352         gen_maddms_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7353                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LU);
7354         break;
7355     case OPC2_32_RRR1_MADDMS_H_UL:
7356         CHECK_REG_PAIR(r4);
7357         CHECK_REG_PAIR(r3);
7358         gen_maddms_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7359                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UL);
7360         break;
7361     case OPC2_32_RRR1_MADDMS_H_UU:
7362         CHECK_REG_PAIR(r4);
7363         CHECK_REG_PAIR(r3);
7364         gen_maddms_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7365                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UU);
7366         break;
7367     case OPC2_32_RRR1_MADDR_H_LL:
7368         gen_maddr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7369                       cpu_gpr_d[r2], n, MODE_LL);
7370         break;
7371     case OPC2_32_RRR1_MADDR_H_LU:
7372         gen_maddr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7373                       cpu_gpr_d[r2], n, MODE_LU);
7374         break;
7375     case OPC2_32_RRR1_MADDR_H_UL:
7376         gen_maddr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7377                       cpu_gpr_d[r2], n, MODE_UL);
7378         break;
7379     case OPC2_32_RRR1_MADDR_H_UU:
7380         gen_maddr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7381                       cpu_gpr_d[r2], n, MODE_UU);
7382         break;
7383     case OPC2_32_RRR1_MADDRS_H_LL:
7384         gen_maddr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7385                        cpu_gpr_d[r2], n, MODE_LL);
7386         break;
7387     case OPC2_32_RRR1_MADDRS_H_LU:
7388         gen_maddr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7389                        cpu_gpr_d[r2], n, MODE_LU);
7390         break;
7391     case OPC2_32_RRR1_MADDRS_H_UL:
7392         gen_maddr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7393                        cpu_gpr_d[r2], n, MODE_UL);
7394         break;
7395     case OPC2_32_RRR1_MADDRS_H_UU:
7396         gen_maddr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7397                        cpu_gpr_d[r2], n, MODE_UU);
7398         break;
7399     default:
7400         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
7401     }
7402 }
7403 
7404 static void decode_rrr1_maddq_h(DisasContext *ctx)
7405 {
7406     uint32_t op2;
7407     uint32_t r1, r2, r3, r4, n;
7408     TCGv temp, temp2;
7409 
7410     op2 = MASK_OP_RRR1_OP2(ctx->opcode);
7411     r1 = MASK_OP_RRR1_S1(ctx->opcode);
7412     r2 = MASK_OP_RRR1_S2(ctx->opcode);
7413     r3 = MASK_OP_RRR1_S3(ctx->opcode);
7414     r4 = MASK_OP_RRR1_D(ctx->opcode);
7415     n = MASK_OP_RRR1_N(ctx->opcode);
7416 
7417     temp = tcg_const_i32(n);
7418     temp2 = tcg_temp_new();
7419 
7420     switch (op2) {
7421     case OPC2_32_RRR1_MADD_Q_32:
7422         gen_madd32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7423                      cpu_gpr_d[r2], n, 32);
7424         break;
7425     case OPC2_32_RRR1_MADD_Q_64:
7426         CHECK_REG_PAIR(r4);
7427         CHECK_REG_PAIR(r3);
7428         gen_madd64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7429                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
7430                      n);
7431         break;
7432     case OPC2_32_RRR1_MADD_Q_32_L:
7433         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]);
7434         gen_madd32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7435                      temp, n, 16);
7436         break;
7437     case OPC2_32_RRR1_MADD_Q_64_L:
7438         CHECK_REG_PAIR(r4);
7439         CHECK_REG_PAIR(r3);
7440         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]);
7441         gen_madd64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7442                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp,
7443                      n);
7444         break;
7445     case OPC2_32_RRR1_MADD_Q_32_U:
7446         tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16);
7447         gen_madd32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7448                      temp, n, 16);
7449         break;
7450     case OPC2_32_RRR1_MADD_Q_64_U:
7451         CHECK_REG_PAIR(r4);
7452         CHECK_REG_PAIR(r3);
7453         tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16);
7454         gen_madd64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7455                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp,
7456                      n);
7457         break;
7458     case OPC2_32_RRR1_MADD_Q_32_LL:
7459         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]);
7460         tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]);
7461         gen_m16add32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n);
7462         break;
7463     case OPC2_32_RRR1_MADD_Q_64_LL:
7464         CHECK_REG_PAIR(r4);
7465         CHECK_REG_PAIR(r3);
7466         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]);
7467         tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]);
7468         gen_m16add64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7469                        cpu_gpr_d[r3+1], temp, temp2, n);
7470         break;
7471     case OPC2_32_RRR1_MADD_Q_32_UU:
7472         tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16);
7473         tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16);
7474         gen_m16add32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n);
7475         break;
7476     case OPC2_32_RRR1_MADD_Q_64_UU:
7477         CHECK_REG_PAIR(r4);
7478         CHECK_REG_PAIR(r3);
7479         tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16);
7480         tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16);
7481         gen_m16add64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7482                        cpu_gpr_d[r3+1], temp, temp2, n);
7483         break;
7484     case OPC2_32_RRR1_MADDS_Q_32:
7485         gen_madds32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7486                       cpu_gpr_d[r2], n, 32);
7487         break;
7488     case OPC2_32_RRR1_MADDS_Q_64:
7489         CHECK_REG_PAIR(r4);
7490         CHECK_REG_PAIR(r3);
7491         gen_madds64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7492                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
7493                       n);
7494         break;
7495     case OPC2_32_RRR1_MADDS_Q_32_L:
7496         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]);
7497         gen_madds32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7498                       temp, n, 16);
7499         break;
7500     case OPC2_32_RRR1_MADDS_Q_64_L:
7501         CHECK_REG_PAIR(r4);
7502         CHECK_REG_PAIR(r3);
7503         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]);
7504         gen_madds64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7505                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp,
7506                       n);
7507         break;
7508     case OPC2_32_RRR1_MADDS_Q_32_U:
7509         tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16);
7510         gen_madds32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7511                       temp, n, 16);
7512         break;
7513     case OPC2_32_RRR1_MADDS_Q_64_U:
7514         CHECK_REG_PAIR(r4);
7515         CHECK_REG_PAIR(r3);
7516         tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16);
7517         gen_madds64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7518                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp,
7519                       n);
7520         break;
7521     case OPC2_32_RRR1_MADDS_Q_32_LL:
7522         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]);
7523         tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]);
7524         gen_m16adds32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n);
7525         break;
7526     case OPC2_32_RRR1_MADDS_Q_64_LL:
7527         CHECK_REG_PAIR(r4);
7528         CHECK_REG_PAIR(r3);
7529         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]);
7530         tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]);
7531         gen_m16adds64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7532                         cpu_gpr_d[r3+1], temp, temp2, n);
7533         break;
7534     case OPC2_32_RRR1_MADDS_Q_32_UU:
7535         tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16);
7536         tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16);
7537         gen_m16adds32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n);
7538         break;
7539     case OPC2_32_RRR1_MADDS_Q_64_UU:
7540         CHECK_REG_PAIR(r4);
7541         CHECK_REG_PAIR(r3);
7542         tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16);
7543         tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16);
7544         gen_m16adds64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7545                         cpu_gpr_d[r3+1], temp, temp2, n);
7546         break;
7547     case OPC2_32_RRR1_MADDR_H_64_UL:
7548         CHECK_REG_PAIR(r3);
7549         gen_maddr64_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r3+1],
7550                       cpu_gpr_d[r1], cpu_gpr_d[r2], n, 2);
7551         break;
7552     case OPC2_32_RRR1_MADDRS_H_64_UL:
7553         CHECK_REG_PAIR(r3);
7554         gen_maddr64s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r3+1],
7555                        cpu_gpr_d[r1], cpu_gpr_d[r2], n, 2);
7556         break;
7557     case OPC2_32_RRR1_MADDR_Q_32_LL:
7558         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]);
7559         tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]);
7560         gen_maddr_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n);
7561         break;
7562     case OPC2_32_RRR1_MADDR_Q_32_UU:
7563         tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16);
7564         tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16);
7565         gen_maddr_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n);
7566         break;
7567     case OPC2_32_RRR1_MADDRS_Q_32_LL:
7568         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]);
7569         tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]);
7570         gen_maddrs_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n);
7571         break;
7572     case OPC2_32_RRR1_MADDRS_Q_32_UU:
7573         tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16);
7574         tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16);
7575         gen_maddrs_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n);
7576         break;
7577     default:
7578         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
7579     }
7580     tcg_temp_free(temp);
7581     tcg_temp_free(temp2);
7582 }
7583 
7584 static void decode_rrr1_maddsu_h(DisasContext *ctx)
7585 {
7586     uint32_t op2;
7587     uint32_t r1, r2, r3, r4, n;
7588 
7589     op2 = MASK_OP_RRR1_OP2(ctx->opcode);
7590     r1 = MASK_OP_RRR1_S1(ctx->opcode);
7591     r2 = MASK_OP_RRR1_S2(ctx->opcode);
7592     r3 = MASK_OP_RRR1_S3(ctx->opcode);
7593     r4 = MASK_OP_RRR1_D(ctx->opcode);
7594     n = MASK_OP_RRR1_N(ctx->opcode);
7595 
7596     switch (op2) {
7597     case OPC2_32_RRR1_MADDSU_H_32_LL:
7598         CHECK_REG_PAIR(r4);
7599         CHECK_REG_PAIR(r3);
7600         gen_maddsu_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7601                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LL);
7602         break;
7603     case OPC2_32_RRR1_MADDSU_H_32_LU:
7604         CHECK_REG_PAIR(r4);
7605         CHECK_REG_PAIR(r3);
7606         gen_maddsu_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7607                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LU);
7608         break;
7609     case OPC2_32_RRR1_MADDSU_H_32_UL:
7610         CHECK_REG_PAIR(r4);
7611         CHECK_REG_PAIR(r3);
7612         gen_maddsu_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7613                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UL);
7614         break;
7615     case OPC2_32_RRR1_MADDSU_H_32_UU:
7616         CHECK_REG_PAIR(r4);
7617         CHECK_REG_PAIR(r3);
7618         gen_maddsu_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7619                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UU);
7620         break;
7621     case OPC2_32_RRR1_MADDSUS_H_32_LL:
7622         CHECK_REG_PAIR(r4);
7623         CHECK_REG_PAIR(r3);
7624         gen_maddsus_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7625                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
7626                       n, MODE_LL);
7627         break;
7628     case OPC2_32_RRR1_MADDSUS_H_32_LU:
7629         CHECK_REG_PAIR(r4);
7630         CHECK_REG_PAIR(r3);
7631         gen_maddsus_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7632                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
7633                       n, MODE_LU);
7634         break;
7635     case OPC2_32_RRR1_MADDSUS_H_32_UL:
7636         CHECK_REG_PAIR(r4);
7637         CHECK_REG_PAIR(r3);
7638         gen_maddsus_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7639                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
7640                       n, MODE_UL);
7641         break;
7642     case OPC2_32_RRR1_MADDSUS_H_32_UU:
7643         CHECK_REG_PAIR(r4);
7644         CHECK_REG_PAIR(r3);
7645         gen_maddsus_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7646                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
7647                       n, MODE_UU);
7648         break;
7649     case OPC2_32_RRR1_MADDSUM_H_64_LL:
7650         CHECK_REG_PAIR(r4);
7651         CHECK_REG_PAIR(r3);
7652         gen_maddsum_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7653                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
7654                       n, MODE_LL);
7655         break;
7656     case OPC2_32_RRR1_MADDSUM_H_64_LU:
7657         CHECK_REG_PAIR(r4);
7658         CHECK_REG_PAIR(r3);
7659         gen_maddsum_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7660                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
7661                       n, MODE_LU);
7662         break;
7663     case OPC2_32_RRR1_MADDSUM_H_64_UL:
7664         CHECK_REG_PAIR(r4);
7665         CHECK_REG_PAIR(r3);
7666         gen_maddsum_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7667                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
7668                       n, MODE_UL);
7669         break;
7670     case OPC2_32_RRR1_MADDSUM_H_64_UU:
7671         CHECK_REG_PAIR(r4);
7672         CHECK_REG_PAIR(r3);
7673         gen_maddsum_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7674                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
7675                       n, MODE_UU);
7676         break;
7677     case OPC2_32_RRR1_MADDSUMS_H_64_LL:
7678         CHECK_REG_PAIR(r4);
7679         CHECK_REG_PAIR(r3);
7680         gen_maddsums_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7681                        cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
7682                        n, MODE_LL);
7683         break;
7684     case OPC2_32_RRR1_MADDSUMS_H_64_LU:
7685         CHECK_REG_PAIR(r4);
7686         CHECK_REG_PAIR(r3);
7687         gen_maddsums_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7688                        cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
7689                        n, MODE_LU);
7690         break;
7691     case OPC2_32_RRR1_MADDSUMS_H_64_UL:
7692         CHECK_REG_PAIR(r4);
7693         CHECK_REG_PAIR(r3);
7694         gen_maddsums_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7695                        cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
7696                        n, MODE_UL);
7697         break;
7698     case OPC2_32_RRR1_MADDSUMS_H_64_UU:
7699         CHECK_REG_PAIR(r4);
7700         CHECK_REG_PAIR(r3);
7701         gen_maddsums_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7702                        cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
7703                        n, MODE_UU);
7704         break;
7705     case OPC2_32_RRR1_MADDSUR_H_16_LL:
7706         gen_maddsur32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7707                         cpu_gpr_d[r2], n, MODE_LL);
7708         break;
7709     case OPC2_32_RRR1_MADDSUR_H_16_LU:
7710         gen_maddsur32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7711                         cpu_gpr_d[r2], n, MODE_LU);
7712         break;
7713     case OPC2_32_RRR1_MADDSUR_H_16_UL:
7714         gen_maddsur32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7715                         cpu_gpr_d[r2], n, MODE_UL);
7716         break;
7717     case OPC2_32_RRR1_MADDSUR_H_16_UU:
7718         gen_maddsur32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7719                         cpu_gpr_d[r2], n, MODE_UU);
7720         break;
7721     case OPC2_32_RRR1_MADDSURS_H_16_LL:
7722         gen_maddsur32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7723                          cpu_gpr_d[r2], n, MODE_LL);
7724         break;
7725     case OPC2_32_RRR1_MADDSURS_H_16_LU:
7726         gen_maddsur32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7727                          cpu_gpr_d[r2], n, MODE_LU);
7728         break;
7729     case OPC2_32_RRR1_MADDSURS_H_16_UL:
7730         gen_maddsur32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7731                          cpu_gpr_d[r2], n, MODE_UL);
7732         break;
7733     case OPC2_32_RRR1_MADDSURS_H_16_UU:
7734         gen_maddsur32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7735                          cpu_gpr_d[r2], n, MODE_UU);
7736         break;
7737     default:
7738         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
7739     }
7740 }
7741 
7742 static void decode_rrr1_msub(DisasContext *ctx)
7743 {
7744     uint32_t op2;
7745     uint32_t r1, r2, r3, r4, n;
7746 
7747     op2 = MASK_OP_RRR1_OP2(ctx->opcode);
7748     r1 = MASK_OP_RRR1_S1(ctx->opcode);
7749     r2 = MASK_OP_RRR1_S2(ctx->opcode);
7750     r3 = MASK_OP_RRR1_S3(ctx->opcode);
7751     r4 = MASK_OP_RRR1_D(ctx->opcode);
7752     n = MASK_OP_RRR1_N(ctx->opcode);
7753 
7754     switch (op2) {
7755     case OPC2_32_RRR1_MSUB_H_LL:
7756         CHECK_REG_PAIR(r4);
7757         CHECK_REG_PAIR(r3);
7758         gen_msub_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7759                    cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LL);
7760         break;
7761     case OPC2_32_RRR1_MSUB_H_LU:
7762         CHECK_REG_PAIR(r4);
7763         CHECK_REG_PAIR(r3);
7764         gen_msub_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7765                    cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LU);
7766         break;
7767     case OPC2_32_RRR1_MSUB_H_UL:
7768         CHECK_REG_PAIR(r4);
7769         CHECK_REG_PAIR(r3);
7770         gen_msub_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7771                    cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UL);
7772         break;
7773     case OPC2_32_RRR1_MSUB_H_UU:
7774         CHECK_REG_PAIR(r4);
7775         CHECK_REG_PAIR(r3);
7776         gen_msub_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7777                    cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UU);
7778         break;
7779     case OPC2_32_RRR1_MSUBS_H_LL:
7780         CHECK_REG_PAIR(r4);
7781         CHECK_REG_PAIR(r3);
7782         gen_msubs_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7783                     cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LL);
7784         break;
7785     case OPC2_32_RRR1_MSUBS_H_LU:
7786         CHECK_REG_PAIR(r4);
7787         CHECK_REG_PAIR(r3);
7788         gen_msubs_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7789                     cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LU);
7790         break;
7791     case OPC2_32_RRR1_MSUBS_H_UL:
7792         CHECK_REG_PAIR(r4);
7793         CHECK_REG_PAIR(r3);
7794         gen_msubs_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7795                     cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UL);
7796         break;
7797     case OPC2_32_RRR1_MSUBS_H_UU:
7798         CHECK_REG_PAIR(r4);
7799         CHECK_REG_PAIR(r3);
7800         gen_msubs_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7801                     cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UU);
7802         break;
7803     case OPC2_32_RRR1_MSUBM_H_LL:
7804         CHECK_REG_PAIR(r4);
7805         CHECK_REG_PAIR(r3);
7806         gen_msubm_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7807                     cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LL);
7808         break;
7809     case OPC2_32_RRR1_MSUBM_H_LU:
7810         CHECK_REG_PAIR(r4);
7811         CHECK_REG_PAIR(r3);
7812         gen_msubm_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7813                     cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LU);
7814         break;
7815     case OPC2_32_RRR1_MSUBM_H_UL:
7816         CHECK_REG_PAIR(r4);
7817         CHECK_REG_PAIR(r3);
7818         gen_msubm_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7819                     cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UL);
7820         break;
7821     case OPC2_32_RRR1_MSUBM_H_UU:
7822         CHECK_REG_PAIR(r4);
7823         CHECK_REG_PAIR(r3);
7824         gen_msubm_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7825                     cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UU);
7826         break;
7827     case OPC2_32_RRR1_MSUBMS_H_LL:
7828         CHECK_REG_PAIR(r4);
7829         CHECK_REG_PAIR(r3);
7830         gen_msubms_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7831                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LL);
7832         break;
7833     case OPC2_32_RRR1_MSUBMS_H_LU:
7834         CHECK_REG_PAIR(r4);
7835         CHECK_REG_PAIR(r3);
7836         gen_msubms_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7837                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LU);
7838         break;
7839     case OPC2_32_RRR1_MSUBMS_H_UL:
7840         CHECK_REG_PAIR(r4);
7841         CHECK_REG_PAIR(r3);
7842         gen_msubms_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7843                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UL);
7844         break;
7845     case OPC2_32_RRR1_MSUBMS_H_UU:
7846         CHECK_REG_PAIR(r4);
7847         CHECK_REG_PAIR(r3);
7848         gen_msubms_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7849                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UU);
7850         break;
7851     case OPC2_32_RRR1_MSUBR_H_LL:
7852         gen_msubr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7853                       cpu_gpr_d[r2], n, MODE_LL);
7854         break;
7855     case OPC2_32_RRR1_MSUBR_H_LU:
7856         gen_msubr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7857                       cpu_gpr_d[r2], n, MODE_LU);
7858         break;
7859     case OPC2_32_RRR1_MSUBR_H_UL:
7860         gen_msubr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7861                       cpu_gpr_d[r2], n, MODE_UL);
7862         break;
7863     case OPC2_32_RRR1_MSUBR_H_UU:
7864         gen_msubr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7865                       cpu_gpr_d[r2], n, MODE_UU);
7866         break;
7867     case OPC2_32_RRR1_MSUBRS_H_LL:
7868         gen_msubr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7869                        cpu_gpr_d[r2], n, MODE_LL);
7870         break;
7871     case OPC2_32_RRR1_MSUBRS_H_LU:
7872         gen_msubr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7873                        cpu_gpr_d[r2], n, MODE_LU);
7874         break;
7875     case OPC2_32_RRR1_MSUBRS_H_UL:
7876         gen_msubr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7877                        cpu_gpr_d[r2], n, MODE_UL);
7878         break;
7879     case OPC2_32_RRR1_MSUBRS_H_UU:
7880         gen_msubr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7881                        cpu_gpr_d[r2], n, MODE_UU);
7882         break;
7883     default:
7884         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
7885     }
7886 }
7887 
7888 static void decode_rrr1_msubq_h(DisasContext *ctx)
7889 {
7890     uint32_t op2;
7891     uint32_t r1, r2, r3, r4, n;
7892     TCGv temp, temp2;
7893 
7894     op2 = MASK_OP_RRR1_OP2(ctx->opcode);
7895     r1 = MASK_OP_RRR1_S1(ctx->opcode);
7896     r2 = MASK_OP_RRR1_S2(ctx->opcode);
7897     r3 = MASK_OP_RRR1_S3(ctx->opcode);
7898     r4 = MASK_OP_RRR1_D(ctx->opcode);
7899     n = MASK_OP_RRR1_N(ctx->opcode);
7900 
7901     temp = tcg_const_i32(n);
7902     temp2 = tcg_temp_new();
7903 
7904     switch (op2) {
7905     case OPC2_32_RRR1_MSUB_Q_32:
7906         gen_msub32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7907                      cpu_gpr_d[r2], n, 32);
7908         break;
7909     case OPC2_32_RRR1_MSUB_Q_64:
7910         CHECK_REG_PAIR(r4);
7911         CHECK_REG_PAIR(r3);
7912         gen_msub64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7913                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
7914                      n);
7915         break;
7916     case OPC2_32_RRR1_MSUB_Q_32_L:
7917         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]);
7918         gen_msub32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7919                      temp, n, 16);
7920         break;
7921     case OPC2_32_RRR1_MSUB_Q_64_L:
7922         CHECK_REG_PAIR(r4);
7923         CHECK_REG_PAIR(r3);
7924         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]);
7925         gen_msub64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7926                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp,
7927                      n);
7928         break;
7929     case OPC2_32_RRR1_MSUB_Q_32_U:
7930         tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16);
7931         gen_msub32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7932                      temp, n, 16);
7933         break;
7934     case OPC2_32_RRR1_MSUB_Q_64_U:
7935         CHECK_REG_PAIR(r4);
7936         CHECK_REG_PAIR(r3);
7937         tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16);
7938         gen_msub64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7939                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp,
7940                      n);
7941         break;
7942     case OPC2_32_RRR1_MSUB_Q_32_LL:
7943         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]);
7944         tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]);
7945         gen_m16sub32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n);
7946         break;
7947     case OPC2_32_RRR1_MSUB_Q_64_LL:
7948         CHECK_REG_PAIR(r4);
7949         CHECK_REG_PAIR(r3);
7950         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]);
7951         tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]);
7952         gen_m16sub64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7953                        cpu_gpr_d[r3+1], temp, temp2, n);
7954         break;
7955     case OPC2_32_RRR1_MSUB_Q_32_UU:
7956         tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16);
7957         tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16);
7958         gen_m16sub32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n);
7959         break;
7960     case OPC2_32_RRR1_MSUB_Q_64_UU:
7961         CHECK_REG_PAIR(r4);
7962         CHECK_REG_PAIR(r3);
7963         tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16);
7964         tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16);
7965         gen_m16sub64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7966                        cpu_gpr_d[r3+1], temp, temp2, n);
7967         break;
7968     case OPC2_32_RRR1_MSUBS_Q_32:
7969         gen_msubs32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7970                       cpu_gpr_d[r2], n, 32);
7971         break;
7972     case OPC2_32_RRR1_MSUBS_Q_64:
7973         CHECK_REG_PAIR(r4);
7974         CHECK_REG_PAIR(r3);
7975         gen_msubs64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7976                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
7977                       n);
7978         break;
7979     case OPC2_32_RRR1_MSUBS_Q_32_L:
7980         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]);
7981         gen_msubs32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7982                       temp, n, 16);
7983         break;
7984     case OPC2_32_RRR1_MSUBS_Q_64_L:
7985         CHECK_REG_PAIR(r4);
7986         CHECK_REG_PAIR(r3);
7987         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]);
7988         gen_msubs64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
7989                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp,
7990                       n);
7991         break;
7992     case OPC2_32_RRR1_MSUBS_Q_32_U:
7993         tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16);
7994         gen_msubs32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
7995                       temp, n, 16);
7996         break;
7997     case OPC2_32_RRR1_MSUBS_Q_64_U:
7998         CHECK_REG_PAIR(r4);
7999         CHECK_REG_PAIR(r3);
8000         tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16);
8001         gen_msubs64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8002                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp,
8003                       n);
8004         break;
8005     case OPC2_32_RRR1_MSUBS_Q_32_LL:
8006         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]);
8007         tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]);
8008         gen_m16subs32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n);
8009         break;
8010     case OPC2_32_RRR1_MSUBS_Q_64_LL:
8011         CHECK_REG_PAIR(r4);
8012         CHECK_REG_PAIR(r3);
8013         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]);
8014         tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]);
8015         gen_m16subs64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8016                         cpu_gpr_d[r3+1], temp, temp2, n);
8017         break;
8018     case OPC2_32_RRR1_MSUBS_Q_32_UU:
8019         tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16);
8020         tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16);
8021         gen_m16subs32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n);
8022         break;
8023     case OPC2_32_RRR1_MSUBS_Q_64_UU:
8024         CHECK_REG_PAIR(r4);
8025         CHECK_REG_PAIR(r3);
8026         tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16);
8027         tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16);
8028         gen_m16subs64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8029                         cpu_gpr_d[r3+1], temp, temp2, n);
8030         break;
8031     case OPC2_32_RRR1_MSUBR_H_64_UL:
8032         CHECK_REG_PAIR(r3);
8033         gen_msubr64_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r3+1],
8034                       cpu_gpr_d[r1], cpu_gpr_d[r2], n, 2);
8035         break;
8036     case OPC2_32_RRR1_MSUBRS_H_64_UL:
8037         CHECK_REG_PAIR(r3);
8038         gen_msubr64s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r3+1],
8039                        cpu_gpr_d[r1], cpu_gpr_d[r2], n, 2);
8040         break;
8041     case OPC2_32_RRR1_MSUBR_Q_32_LL:
8042         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]);
8043         tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]);
8044         gen_msubr_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n);
8045         break;
8046     case OPC2_32_RRR1_MSUBR_Q_32_UU:
8047         tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16);
8048         tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16);
8049         gen_msubr_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n);
8050         break;
8051     case OPC2_32_RRR1_MSUBRS_Q_32_LL:
8052         tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]);
8053         tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]);
8054         gen_msubrs_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n);
8055         break;
8056     case OPC2_32_RRR1_MSUBRS_Q_32_UU:
8057         tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16);
8058         tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16);
8059         gen_msubrs_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n);
8060         break;
8061     default:
8062         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
8063     }
8064     tcg_temp_free(temp);
8065     tcg_temp_free(temp2);
8066 }
8067 
8068 static void decode_rrr1_msubad_h(DisasContext *ctx)
8069 {
8070     uint32_t op2;
8071     uint32_t r1, r2, r3, r4, n;
8072 
8073     op2 = MASK_OP_RRR1_OP2(ctx->opcode);
8074     r1 = MASK_OP_RRR1_S1(ctx->opcode);
8075     r2 = MASK_OP_RRR1_S2(ctx->opcode);
8076     r3 = MASK_OP_RRR1_S3(ctx->opcode);
8077     r4 = MASK_OP_RRR1_D(ctx->opcode);
8078     n = MASK_OP_RRR1_N(ctx->opcode);
8079 
8080     switch (op2) {
8081     case OPC2_32_RRR1_MSUBAD_H_32_LL:
8082         CHECK_REG_PAIR(r4);
8083         CHECK_REG_PAIR(r3);
8084         gen_msubad_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8085                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LL);
8086         break;
8087     case OPC2_32_RRR1_MSUBAD_H_32_LU:
8088         CHECK_REG_PAIR(r4);
8089         CHECK_REG_PAIR(r3);
8090         gen_msubad_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8091                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LU);
8092         break;
8093     case OPC2_32_RRR1_MSUBAD_H_32_UL:
8094         CHECK_REG_PAIR(r4);
8095         CHECK_REG_PAIR(r3);
8096         gen_msubad_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8097                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UL);
8098         break;
8099     case OPC2_32_RRR1_MSUBAD_H_32_UU:
8100         CHECK_REG_PAIR(r4);
8101         CHECK_REG_PAIR(r3);
8102         gen_msubad_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8103                      cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_UU);
8104         break;
8105     case OPC2_32_RRR1_MSUBADS_H_32_LL:
8106         CHECK_REG_PAIR(r4);
8107         CHECK_REG_PAIR(r3);
8108         gen_msubads_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8109                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
8110                       n, MODE_LL);
8111         break;
8112     case OPC2_32_RRR1_MSUBADS_H_32_LU:
8113         CHECK_REG_PAIR(r4);
8114         CHECK_REG_PAIR(r3);
8115         gen_msubads_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8116                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
8117                       n, MODE_LU);
8118         break;
8119     case OPC2_32_RRR1_MSUBADS_H_32_UL:
8120         CHECK_REG_PAIR(r4);
8121         CHECK_REG_PAIR(r3);
8122         gen_msubads_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8123                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
8124                       n, MODE_UL);
8125         break;
8126     case OPC2_32_RRR1_MSUBADS_H_32_UU:
8127         CHECK_REG_PAIR(r4);
8128         CHECK_REG_PAIR(r3);
8129         gen_msubads_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8130                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
8131                       n, MODE_UU);
8132         break;
8133     case OPC2_32_RRR1_MSUBADM_H_64_LL:
8134         CHECK_REG_PAIR(r4);
8135         CHECK_REG_PAIR(r3);
8136         gen_msubadm_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8137                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
8138                       n, MODE_LL);
8139         break;
8140     case OPC2_32_RRR1_MSUBADM_H_64_LU:
8141         CHECK_REG_PAIR(r4);
8142         CHECK_REG_PAIR(r3);
8143         gen_msubadm_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8144                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
8145                       n, MODE_LU);
8146         break;
8147     case OPC2_32_RRR1_MSUBADM_H_64_UL:
8148         CHECK_REG_PAIR(r4);
8149         CHECK_REG_PAIR(r3);
8150         gen_msubadm_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8151                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
8152                       n, MODE_UL);
8153         break;
8154     case OPC2_32_RRR1_MSUBADM_H_64_UU:
8155         CHECK_REG_PAIR(r4);
8156         CHECK_REG_PAIR(r3);
8157         gen_msubadm_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8158                       cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
8159                       n, MODE_UU);
8160         break;
8161     case OPC2_32_RRR1_MSUBADMS_H_64_LL:
8162         CHECK_REG_PAIR(r4);
8163         CHECK_REG_PAIR(r3);
8164         gen_msubadms_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8165                        cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
8166                        n, MODE_LL);
8167         break;
8168     case OPC2_32_RRR1_MSUBADMS_H_64_LU:
8169         CHECK_REG_PAIR(r4);
8170         CHECK_REG_PAIR(r3);
8171         gen_msubadms_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8172                        cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
8173                        n, MODE_LU);
8174         break;
8175     case OPC2_32_RRR1_MSUBADMS_H_64_UL:
8176         CHECK_REG_PAIR(r4);
8177         CHECK_REG_PAIR(r3);
8178         gen_msubadms_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8179                        cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
8180                        n, MODE_UL);
8181         break;
8182     case OPC2_32_RRR1_MSUBADMS_H_64_UU:
8183         CHECK_REG_PAIR(r4);
8184         CHECK_REG_PAIR(r3);
8185         gen_msubadms_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3],
8186                        cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2],
8187                        n, MODE_UU);
8188         break;
8189     case OPC2_32_RRR1_MSUBADR_H_16_LL:
8190         gen_msubadr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
8191                         cpu_gpr_d[r2], n, MODE_LL);
8192         break;
8193     case OPC2_32_RRR1_MSUBADR_H_16_LU:
8194         gen_msubadr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
8195                         cpu_gpr_d[r2], n, MODE_LU);
8196         break;
8197     case OPC2_32_RRR1_MSUBADR_H_16_UL:
8198         gen_msubadr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
8199                         cpu_gpr_d[r2], n, MODE_UL);
8200         break;
8201     case OPC2_32_RRR1_MSUBADR_H_16_UU:
8202         gen_msubadr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
8203                         cpu_gpr_d[r2], n, MODE_UU);
8204         break;
8205     case OPC2_32_RRR1_MSUBADRS_H_16_LL:
8206         gen_msubadr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
8207                          cpu_gpr_d[r2], n, MODE_LL);
8208         break;
8209     case OPC2_32_RRR1_MSUBADRS_H_16_LU:
8210         gen_msubadr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
8211                          cpu_gpr_d[r2], n, MODE_LU);
8212         break;
8213     case OPC2_32_RRR1_MSUBADRS_H_16_UL:
8214         gen_msubadr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
8215                          cpu_gpr_d[r2], n, MODE_UL);
8216         break;
8217     case OPC2_32_RRR1_MSUBADRS_H_16_UU:
8218         gen_msubadr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1],
8219                          cpu_gpr_d[r2], n, MODE_UU);
8220         break;
8221     default:
8222         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
8223     }
8224 }
8225 
8226 /* RRRR format */
8227 static void decode_rrrr_extract_insert(DisasContext *ctx)
8228 {
8229     uint32_t op2;
8230     int r1, r2, r3, r4;
8231     TCGv tmp_width, tmp_pos;
8232 
8233     r1 = MASK_OP_RRRR_S1(ctx->opcode);
8234     r2 = MASK_OP_RRRR_S2(ctx->opcode);
8235     r3 = MASK_OP_RRRR_S3(ctx->opcode);
8236     r4 = MASK_OP_RRRR_D(ctx->opcode);
8237     op2 = MASK_OP_RRRR_OP2(ctx->opcode);
8238 
8239     tmp_pos = tcg_temp_new();
8240     tmp_width = tcg_temp_new();
8241 
8242     switch (op2) {
8243     case OPC2_32_RRRR_DEXTR:
8244         tcg_gen_andi_tl(tmp_pos, cpu_gpr_d[r3], 0x1f);
8245         if (r1 == r2) {
8246             tcg_gen_rotl_tl(cpu_gpr_d[r4], cpu_gpr_d[r1], tmp_pos);
8247         } else {
8248             tcg_gen_shl_tl(tmp_width, cpu_gpr_d[r1], tmp_pos);
8249             tcg_gen_subfi_tl(tmp_pos, 32, tmp_pos);
8250             tcg_gen_shr_tl(tmp_pos, cpu_gpr_d[r2], tmp_pos);
8251             tcg_gen_or_tl(cpu_gpr_d[r4], tmp_width, tmp_pos);
8252         }
8253         break;
8254     case OPC2_32_RRRR_EXTR:
8255     case OPC2_32_RRRR_EXTR_U:
8256         CHECK_REG_PAIR(r3);
8257         tcg_gen_andi_tl(tmp_width, cpu_gpr_d[r3+1], 0x1f);
8258         tcg_gen_andi_tl(tmp_pos, cpu_gpr_d[r3], 0x1f);
8259         tcg_gen_add_tl(tmp_pos, tmp_pos, tmp_width);
8260         tcg_gen_subfi_tl(tmp_pos, 32, tmp_pos);
8261         tcg_gen_shl_tl(cpu_gpr_d[r4], cpu_gpr_d[r1], tmp_pos);
8262         tcg_gen_subfi_tl(tmp_width, 32, tmp_width);
8263         if (op2 == OPC2_32_RRRR_EXTR) {
8264             tcg_gen_sar_tl(cpu_gpr_d[r4], cpu_gpr_d[r4], tmp_width);
8265         } else {
8266             tcg_gen_shr_tl(cpu_gpr_d[r4], cpu_gpr_d[r4], tmp_width);
8267         }
8268         break;
8269     case OPC2_32_RRRR_INSERT:
8270         CHECK_REG_PAIR(r3);
8271         tcg_gen_andi_tl(tmp_width, cpu_gpr_d[r3+1], 0x1f);
8272         tcg_gen_andi_tl(tmp_pos, cpu_gpr_d[r3], 0x1f);
8273         gen_insert(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r2], tmp_width,
8274                    tmp_pos);
8275         break;
8276     default:
8277         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
8278     }
8279     tcg_temp_free(tmp_pos);
8280     tcg_temp_free(tmp_width);
8281 }
8282 
8283 /* RRRW format */
8284 static void decode_rrrw_extract_insert(DisasContext *ctx)
8285 {
8286     uint32_t op2;
8287     int r1, r2, r3, r4;
8288     int32_t width;
8289 
8290     TCGv temp, temp2;
8291 
8292     op2 = MASK_OP_RRRW_OP2(ctx->opcode);
8293     r1  = MASK_OP_RRRW_S1(ctx->opcode);
8294     r2  = MASK_OP_RRRW_S2(ctx->opcode);
8295     r3  = MASK_OP_RRRW_S3(ctx->opcode);
8296     r4  = MASK_OP_RRRW_D(ctx->opcode);
8297     width = MASK_OP_RRRW_WIDTH(ctx->opcode);
8298 
8299     temp = tcg_temp_new();
8300 
8301     switch (op2) {
8302     case OPC2_32_RRRW_EXTR:
8303         tcg_gen_andi_tl(temp, cpu_gpr_d[r3], 0x1f);
8304         tcg_gen_addi_tl(temp, temp, width);
8305         tcg_gen_subfi_tl(temp, 32, temp);
8306         tcg_gen_shl_tl(cpu_gpr_d[r4], cpu_gpr_d[r1], temp);
8307         tcg_gen_sari_tl(cpu_gpr_d[r4], cpu_gpr_d[r4], 32 - width);
8308         break;
8309     case OPC2_32_RRRW_EXTR_U:
8310         if (width == 0) {
8311             tcg_gen_movi_tl(cpu_gpr_d[r4], 0);
8312         } else {
8313             tcg_gen_andi_tl(temp, cpu_gpr_d[r3], 0x1f);
8314             tcg_gen_shr_tl(cpu_gpr_d[r4], cpu_gpr_d[r1], temp);
8315             tcg_gen_andi_tl(cpu_gpr_d[r4], cpu_gpr_d[r4], ~0u >> (32-width));
8316         }
8317         break;
8318     case OPC2_32_RRRW_IMASK:
8319         temp2 = tcg_temp_new();
8320 
8321         tcg_gen_andi_tl(temp, cpu_gpr_d[r3], 0x1f);
8322         tcg_gen_movi_tl(temp2, (1 << width) - 1);
8323         tcg_gen_shl_tl(temp2, temp2, temp);
8324         tcg_gen_shl_tl(cpu_gpr_d[r4], cpu_gpr_d[r2], temp);
8325         tcg_gen_mov_tl(cpu_gpr_d[r4+1], temp2);
8326 
8327         tcg_temp_free(temp2);
8328         break;
8329     case OPC2_32_RRRW_INSERT:
8330         temp2 = tcg_temp_new();
8331 
8332         tcg_gen_movi_tl(temp, width);
8333         tcg_gen_andi_tl(temp2, cpu_gpr_d[r3], 0x1f);
8334         gen_insert(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r2], temp, temp2);
8335 
8336         tcg_temp_free(temp2);
8337         break;
8338     default:
8339         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
8340     }
8341     tcg_temp_free(temp);
8342 }
8343 
8344 /* SYS Format*/
8345 static void decode_sys_interrupts(DisasContext *ctx)
8346 {
8347     uint32_t op2;
8348     uint32_t r1;
8349     TCGLabel *l1;
8350     TCGv tmp;
8351 
8352     op2 = MASK_OP_SYS_OP2(ctx->opcode);
8353     r1  = MASK_OP_SYS_S1D(ctx->opcode);
8354 
8355     switch (op2) {
8356     case OPC2_32_SYS_DEBUG:
8357         /* raise EXCP_DEBUG */
8358         break;
8359     case OPC2_32_SYS_DISABLE:
8360         tcg_gen_andi_tl(cpu_ICR, cpu_ICR, ~MASK_ICR_IE_1_3);
8361         break;
8362     case OPC2_32_SYS_DSYNC:
8363         break;
8364     case OPC2_32_SYS_ENABLE:
8365         tcg_gen_ori_tl(cpu_ICR, cpu_ICR, MASK_ICR_IE_1_3);
8366         break;
8367     case OPC2_32_SYS_ISYNC:
8368         break;
8369     case OPC2_32_SYS_NOP:
8370         break;
8371     case OPC2_32_SYS_RET:
8372         gen_compute_branch(ctx, op2, 0, 0, 0, 0);
8373         break;
8374     case OPC2_32_SYS_FRET:
8375         gen_fret(ctx);
8376         break;
8377     case OPC2_32_SYS_RFE:
8378         gen_helper_rfe(cpu_env);
8379         tcg_gen_exit_tb(NULL, 0);
8380         ctx->base.is_jmp = DISAS_NORETURN;
8381         break;
8382     case OPC2_32_SYS_RFM:
8383         if ((ctx->hflags & TRICORE_HFLAG_KUU) == TRICORE_HFLAG_SM) {
8384             tmp = tcg_temp_new();
8385             l1 = gen_new_label();
8386 
8387             tcg_gen_ld32u_tl(tmp, cpu_env, offsetof(CPUTriCoreState, DBGSR));
8388             tcg_gen_andi_tl(tmp, tmp, MASK_DBGSR_DE);
8389             tcg_gen_brcondi_tl(TCG_COND_NE, tmp, 1, l1);
8390             gen_helper_rfm(cpu_env);
8391             gen_set_label(l1);
8392             tcg_gen_exit_tb(NULL, 0);
8393             ctx->base.is_jmp = DISAS_NORETURN;
8394             tcg_temp_free(tmp);
8395         } else {
8396             /* generate privilege trap */
8397         }
8398         break;
8399     case OPC2_32_SYS_RSLCX:
8400         gen_helper_rslcx(cpu_env);
8401         break;
8402     case OPC2_32_SYS_SVLCX:
8403         gen_helper_svlcx(cpu_env);
8404         break;
8405     case OPC2_32_SYS_RESTORE:
8406         if (has_feature(ctx, TRICORE_FEATURE_16)) {
8407             if ((ctx->hflags & TRICORE_HFLAG_KUU) == TRICORE_HFLAG_SM ||
8408                 (ctx->hflags & TRICORE_HFLAG_KUU) == TRICORE_HFLAG_UM1) {
8409                 tcg_gen_deposit_tl(cpu_ICR, cpu_ICR, cpu_gpr_d[r1], 8, 1);
8410             } /* else raise privilege trap */
8411         } else {
8412             generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
8413         }
8414         break;
8415     case OPC2_32_SYS_TRAPSV:
8416         l1 = gen_new_label();
8417         tcg_gen_brcondi_tl(TCG_COND_GE, cpu_PSW_SV, 0, l1);
8418         generate_trap(ctx, TRAPC_ASSERT, TIN5_SOVF);
8419         gen_set_label(l1);
8420         break;
8421     case OPC2_32_SYS_TRAPV:
8422         l1 = gen_new_label();
8423         tcg_gen_brcondi_tl(TCG_COND_GE, cpu_PSW_V, 0, l1);
8424         generate_trap(ctx, TRAPC_ASSERT, TIN5_OVF);
8425         gen_set_label(l1);
8426         break;
8427     default:
8428         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
8429     }
8430 }
8431 
8432 static void decode_32Bit_opc(DisasContext *ctx)
8433 {
8434     int op1;
8435     int32_t r1, r2, r3;
8436     int32_t address, const16;
8437     int8_t b, const4;
8438     int32_t bpos;
8439     TCGv temp, temp2, temp3;
8440 
8441     op1 = MASK_OP_MAJOR(ctx->opcode);
8442 
8443     /* handle JNZ.T opcode only being 7 bit long */
8444     if (unlikely((op1 & 0x7f) == OPCM_32_BRN_JTT)) {
8445         op1 = OPCM_32_BRN_JTT;
8446     }
8447 
8448     switch (op1) {
8449 /* ABS-format */
8450     case OPCM_32_ABS_LDW:
8451         decode_abs_ldw(ctx);
8452         break;
8453     case OPCM_32_ABS_LDB:
8454         decode_abs_ldb(ctx);
8455         break;
8456     case OPCM_32_ABS_LDMST_SWAP:
8457         decode_abs_ldst_swap(ctx);
8458         break;
8459     case OPCM_32_ABS_LDST_CONTEXT:
8460         decode_abs_ldst_context(ctx);
8461         break;
8462     case OPCM_32_ABS_STORE:
8463         decode_abs_store(ctx);
8464         break;
8465     case OPCM_32_ABS_STOREB_H:
8466         decode_abs_storeb_h(ctx);
8467         break;
8468     case OPC1_32_ABS_STOREQ:
8469         address = MASK_OP_ABS_OFF18(ctx->opcode);
8470         r1 = MASK_OP_ABS_S1D(ctx->opcode);
8471         temp = tcg_const_i32(EA_ABS_FORMAT(address));
8472         temp2 = tcg_temp_new();
8473 
8474         tcg_gen_shri_tl(temp2, cpu_gpr_d[r1], 16);
8475         tcg_gen_qemu_st_tl(temp2, temp, ctx->mem_idx, MO_LEUW);
8476 
8477         tcg_temp_free(temp2);
8478         tcg_temp_free(temp);
8479         break;
8480     case OPC1_32_ABS_LD_Q:
8481         address = MASK_OP_ABS_OFF18(ctx->opcode);
8482         r1 = MASK_OP_ABS_S1D(ctx->opcode);
8483         temp = tcg_const_i32(EA_ABS_FORMAT(address));
8484 
8485         tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LEUW);
8486         tcg_gen_shli_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 16);
8487 
8488         tcg_temp_free(temp);
8489         break;
8490     case OPC1_32_ABS_LEA:
8491         address = MASK_OP_ABS_OFF18(ctx->opcode);
8492         r1 = MASK_OP_ABS_S1D(ctx->opcode);
8493         tcg_gen_movi_tl(cpu_gpr_a[r1], EA_ABS_FORMAT(address));
8494         break;
8495 /* ABSB-format */
8496     case OPC1_32_ABSB_ST_T:
8497         address = MASK_OP_ABS_OFF18(ctx->opcode);
8498         b = MASK_OP_ABSB_B(ctx->opcode);
8499         bpos = MASK_OP_ABSB_BPOS(ctx->opcode);
8500 
8501         temp = tcg_const_i32(EA_ABS_FORMAT(address));
8502         temp2 = tcg_temp_new();
8503 
8504         tcg_gen_qemu_ld_tl(temp2, temp, ctx->mem_idx, MO_UB);
8505         tcg_gen_andi_tl(temp2, temp2, ~(0x1u << bpos));
8506         tcg_gen_ori_tl(temp2, temp2, (b << bpos));
8507         tcg_gen_qemu_st_tl(temp2, temp, ctx->mem_idx, MO_UB);
8508 
8509         tcg_temp_free(temp);
8510         tcg_temp_free(temp2);
8511         break;
8512 /* B-format */
8513     case OPC1_32_B_CALL:
8514     case OPC1_32_B_CALLA:
8515     case OPC1_32_B_FCALL:
8516     case OPC1_32_B_FCALLA:
8517     case OPC1_32_B_J:
8518     case OPC1_32_B_JA:
8519     case OPC1_32_B_JL:
8520     case OPC1_32_B_JLA:
8521         address = MASK_OP_B_DISP24_SEXT(ctx->opcode);
8522         gen_compute_branch(ctx, op1, 0, 0, 0, address);
8523         break;
8524 /* Bit-format */
8525     case OPCM_32_BIT_ANDACC:
8526         decode_bit_andacc(ctx);
8527         break;
8528     case OPCM_32_BIT_LOGICAL_T1:
8529         decode_bit_logical_t(ctx);
8530         break;
8531     case OPCM_32_BIT_INSERT:
8532         decode_bit_insert(ctx);
8533         break;
8534     case OPCM_32_BIT_LOGICAL_T2:
8535         decode_bit_logical_t2(ctx);
8536         break;
8537     case OPCM_32_BIT_ORAND:
8538         decode_bit_orand(ctx);
8539         break;
8540     case OPCM_32_BIT_SH_LOGIC1:
8541         decode_bit_sh_logic1(ctx);
8542         break;
8543     case OPCM_32_BIT_SH_LOGIC2:
8544         decode_bit_sh_logic2(ctx);
8545         break;
8546     /* BO Format */
8547     case OPCM_32_BO_ADDRMODE_POST_PRE_BASE:
8548         decode_bo_addrmode_post_pre_base(ctx);
8549         break;
8550     case OPCM_32_BO_ADDRMODE_BITREVERSE_CIRCULAR:
8551         decode_bo_addrmode_bitreverse_circular(ctx);
8552         break;
8553     case OPCM_32_BO_ADDRMODE_LD_POST_PRE_BASE:
8554         decode_bo_addrmode_ld_post_pre_base(ctx);
8555         break;
8556     case OPCM_32_BO_ADDRMODE_LD_BITREVERSE_CIRCULAR:
8557         decode_bo_addrmode_ld_bitreverse_circular(ctx);
8558         break;
8559     case OPCM_32_BO_ADDRMODE_STCTX_POST_PRE_BASE:
8560         decode_bo_addrmode_stctx_post_pre_base(ctx);
8561         break;
8562     case OPCM_32_BO_ADDRMODE_LDMST_BITREVERSE_CIRCULAR:
8563         decode_bo_addrmode_ldmst_bitreverse_circular(ctx);
8564         break;
8565 /* BOL-format */
8566     case OPC1_32_BOL_LD_A_LONGOFF:
8567     case OPC1_32_BOL_LD_W_LONGOFF:
8568     case OPC1_32_BOL_LEA_LONGOFF:
8569     case OPC1_32_BOL_ST_W_LONGOFF:
8570     case OPC1_32_BOL_ST_A_LONGOFF:
8571     case OPC1_32_BOL_LD_B_LONGOFF:
8572     case OPC1_32_BOL_LD_BU_LONGOFF:
8573     case OPC1_32_BOL_LD_H_LONGOFF:
8574     case OPC1_32_BOL_LD_HU_LONGOFF:
8575     case OPC1_32_BOL_ST_B_LONGOFF:
8576     case OPC1_32_BOL_ST_H_LONGOFF:
8577         decode_bol_opc(ctx, op1);
8578         break;
8579 /* BRC Format */
8580     case OPCM_32_BRC_EQ_NEQ:
8581     case OPCM_32_BRC_GE:
8582     case OPCM_32_BRC_JLT:
8583     case OPCM_32_BRC_JNE:
8584         const4 = MASK_OP_BRC_CONST4_SEXT(ctx->opcode);
8585         address = MASK_OP_BRC_DISP15_SEXT(ctx->opcode);
8586         r1 = MASK_OP_BRC_S1(ctx->opcode);
8587         gen_compute_branch(ctx, op1, r1, 0, const4, address);
8588         break;
8589 /* BRN Format */
8590     case OPCM_32_BRN_JTT:
8591         address = MASK_OP_BRN_DISP15_SEXT(ctx->opcode);
8592         r1 = MASK_OP_BRN_S1(ctx->opcode);
8593         gen_compute_branch(ctx, op1, r1, 0, 0, address);
8594         break;
8595 /* BRR Format */
8596     case OPCM_32_BRR_EQ_NEQ:
8597     case OPCM_32_BRR_ADDR_EQ_NEQ:
8598     case OPCM_32_BRR_GE:
8599     case OPCM_32_BRR_JLT:
8600     case OPCM_32_BRR_JNE:
8601     case OPCM_32_BRR_JNZ:
8602     case OPCM_32_BRR_LOOP:
8603         address = MASK_OP_BRR_DISP15_SEXT(ctx->opcode);
8604         r2 = MASK_OP_BRR_S2(ctx->opcode);
8605         r1 = MASK_OP_BRR_S1(ctx->opcode);
8606         gen_compute_branch(ctx, op1, r1, r2, 0, address);
8607         break;
8608 /* RC Format */
8609     case OPCM_32_RC_LOGICAL_SHIFT:
8610         decode_rc_logical_shift(ctx);
8611         break;
8612     case OPCM_32_RC_ACCUMULATOR:
8613         decode_rc_accumulator(ctx);
8614         break;
8615     case OPCM_32_RC_SERVICEROUTINE:
8616         decode_rc_serviceroutine(ctx);
8617         break;
8618     case OPCM_32_RC_MUL:
8619         decode_rc_mul(ctx);
8620         break;
8621 /* RCPW Format */
8622     case OPCM_32_RCPW_MASK_INSERT:
8623         decode_rcpw_insert(ctx);
8624         break;
8625 /* RCRR Format */
8626     case OPC1_32_RCRR_INSERT:
8627         r1 = MASK_OP_RCRR_S1(ctx->opcode);
8628         r2 = MASK_OP_RCRR_S3(ctx->opcode);
8629         r3 = MASK_OP_RCRR_D(ctx->opcode);
8630         const16 = MASK_OP_RCRR_CONST4(ctx->opcode);
8631         temp = tcg_const_i32(const16);
8632         temp2 = tcg_temp_new(); /* width*/
8633         temp3 = tcg_temp_new(); /* pos */
8634 
8635         CHECK_REG_PAIR(r3);
8636 
8637         tcg_gen_andi_tl(temp2, cpu_gpr_d[r3+1], 0x1f);
8638         tcg_gen_andi_tl(temp3, cpu_gpr_d[r3], 0x1f);
8639 
8640         gen_insert(cpu_gpr_d[r2], cpu_gpr_d[r1], temp, temp2, temp3);
8641 
8642         tcg_temp_free(temp);
8643         tcg_temp_free(temp2);
8644         tcg_temp_free(temp3);
8645         break;
8646 /* RCRW Format */
8647     case OPCM_32_RCRW_MASK_INSERT:
8648         decode_rcrw_insert(ctx);
8649         break;
8650 /* RCR Format */
8651     case OPCM_32_RCR_COND_SELECT:
8652         decode_rcr_cond_select(ctx);
8653         break;
8654     case OPCM_32_RCR_MADD:
8655         decode_rcr_madd(ctx);
8656         break;
8657     case OPCM_32_RCR_MSUB:
8658         decode_rcr_msub(ctx);
8659         break;
8660 /* RLC Format */
8661     case OPC1_32_RLC_ADDI:
8662     case OPC1_32_RLC_ADDIH:
8663     case OPC1_32_RLC_ADDIH_A:
8664     case OPC1_32_RLC_MFCR:
8665     case OPC1_32_RLC_MOV:
8666     case OPC1_32_RLC_MOV_64:
8667     case OPC1_32_RLC_MOV_U:
8668     case OPC1_32_RLC_MOV_H:
8669     case OPC1_32_RLC_MOVH_A:
8670     case OPC1_32_RLC_MTCR:
8671         decode_rlc_opc(ctx, op1);
8672         break;
8673 /* RR Format */
8674     case OPCM_32_RR_ACCUMULATOR:
8675         decode_rr_accumulator(ctx);
8676         break;
8677     case OPCM_32_RR_LOGICAL_SHIFT:
8678         decode_rr_logical_shift(ctx);
8679         break;
8680     case OPCM_32_RR_ADDRESS:
8681         decode_rr_address(ctx);
8682         break;
8683     case OPCM_32_RR_IDIRECT:
8684         decode_rr_idirect(ctx);
8685         break;
8686     case OPCM_32_RR_DIVIDE:
8687         decode_rr_divide(ctx);
8688         break;
8689 /* RR1 Format */
8690     case OPCM_32_RR1_MUL:
8691         decode_rr1_mul(ctx);
8692         break;
8693     case OPCM_32_RR1_MULQ:
8694         decode_rr1_mulq(ctx);
8695         break;
8696 /* RR2 format */
8697     case OPCM_32_RR2_MUL:
8698         decode_rr2_mul(ctx);
8699         break;
8700 /* RRPW format */
8701     case OPCM_32_RRPW_EXTRACT_INSERT:
8702         decode_rrpw_extract_insert(ctx);
8703         break;
8704     case OPC1_32_RRPW_DEXTR:
8705         r1 = MASK_OP_RRPW_S1(ctx->opcode);
8706         r2 = MASK_OP_RRPW_S2(ctx->opcode);
8707         r3 = MASK_OP_RRPW_D(ctx->opcode);
8708         const16 = MASK_OP_RRPW_POS(ctx->opcode);
8709         if (r1 == r2) {
8710             tcg_gen_rotli_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], const16);
8711         } else {
8712             temp = tcg_temp_new();
8713             tcg_gen_shli_tl(temp, cpu_gpr_d[r1], const16);
8714             tcg_gen_shri_tl(cpu_gpr_d[r3], cpu_gpr_d[r2], 32 - const16);
8715             tcg_gen_or_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], temp);
8716             tcg_temp_free(temp);
8717         }
8718         break;
8719 /* RRR Format */
8720     case OPCM_32_RRR_COND_SELECT:
8721         decode_rrr_cond_select(ctx);
8722         break;
8723     case OPCM_32_RRR_DIVIDE:
8724         decode_rrr_divide(ctx);
8725         break;
8726 /* RRR2 Format */
8727     case OPCM_32_RRR2_MADD:
8728         decode_rrr2_madd(ctx);
8729         break;
8730     case OPCM_32_RRR2_MSUB:
8731         decode_rrr2_msub(ctx);
8732         break;
8733 /* RRR1 format */
8734     case OPCM_32_RRR1_MADD:
8735         decode_rrr1_madd(ctx);
8736         break;
8737     case OPCM_32_RRR1_MADDQ_H:
8738         decode_rrr1_maddq_h(ctx);
8739         break;
8740     case OPCM_32_RRR1_MADDSU_H:
8741         decode_rrr1_maddsu_h(ctx);
8742         break;
8743     case OPCM_32_RRR1_MSUB_H:
8744         decode_rrr1_msub(ctx);
8745         break;
8746     case OPCM_32_RRR1_MSUB_Q:
8747         decode_rrr1_msubq_h(ctx);
8748         break;
8749     case OPCM_32_RRR1_MSUBAD_H:
8750         decode_rrr1_msubad_h(ctx);
8751         break;
8752 /* RRRR format */
8753     case OPCM_32_RRRR_EXTRACT_INSERT:
8754         decode_rrrr_extract_insert(ctx);
8755         break;
8756 /* RRRW format */
8757     case OPCM_32_RRRW_EXTRACT_INSERT:
8758         decode_rrrw_extract_insert(ctx);
8759         break;
8760 /* SYS format */
8761     case OPCM_32_SYS_INTERRUPTS:
8762         decode_sys_interrupts(ctx);
8763         break;
8764     case OPC1_32_SYS_RSTV:
8765         tcg_gen_movi_tl(cpu_PSW_V, 0);
8766         tcg_gen_mov_tl(cpu_PSW_SV, cpu_PSW_V);
8767         tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V);
8768         tcg_gen_mov_tl(cpu_PSW_SAV, cpu_PSW_V);
8769         break;
8770     default:
8771         generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
8772     }
8773 }
8774 
8775 static bool tricore_insn_is_16bit(uint32_t insn)
8776 {
8777     return (insn & 0x1) == 0;
8778 }
8779 
8780 static void tricore_tr_init_disas_context(DisasContextBase *dcbase,
8781                                           CPUState *cs)
8782 {
8783     DisasContext *ctx = container_of(dcbase, DisasContext, base);
8784     CPUTriCoreState *env = cs->env_ptr;
8785     ctx->mem_idx = cpu_mmu_index(env, false);
8786     ctx->hflags = (uint32_t)ctx->base.tb->flags;
8787     ctx->features = env->features;
8788 }
8789 
8790 static void tricore_tr_tb_start(DisasContextBase *db, CPUState *cpu)
8791 {
8792 }
8793 
8794 static void tricore_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu)
8795 {
8796     DisasContext *ctx = container_of(dcbase, DisasContext, base);
8797 
8798     tcg_gen_insn_start(ctx->base.pc_next);
8799 }
8800 
8801 static bool insn_crosses_page(CPUTriCoreState *env, DisasContext *ctx)
8802 {
8803     /*
8804      * Return true if the insn at ctx->base.pc_next might cross a page boundary.
8805      * (False positives are OK, false negatives are not.)
8806      * Our caller ensures we are only called if dc->base.pc_next is less than
8807      * 4 bytes from the page boundary, so we cross the page if the first
8808      * 16 bits indicate that this is a 32 bit insn.
8809      */
8810     uint16_t insn = cpu_lduw_code(env, ctx->base.pc_next);
8811 
8812     return !tricore_insn_is_16bit(insn);
8813 }
8814 
8815 
8816 static void tricore_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
8817 {
8818     DisasContext *ctx = container_of(dcbase, DisasContext, base);
8819     CPUTriCoreState *env = cpu->env_ptr;
8820     uint16_t insn_lo;
8821     bool is_16bit;
8822 
8823     insn_lo = cpu_lduw_code(env, ctx->base.pc_next);
8824     is_16bit = tricore_insn_is_16bit(insn_lo);
8825     if (is_16bit) {
8826         ctx->opcode = insn_lo;
8827         ctx->pc_succ_insn = ctx->base.pc_next + 2;
8828         decode_16Bit_opc(ctx);
8829     } else {
8830         uint32_t insn_hi = cpu_lduw_code(env, ctx->base.pc_next + 2);
8831         ctx->opcode = insn_hi << 16 | insn_lo;
8832         ctx->pc_succ_insn = ctx->base.pc_next + 4;
8833         decode_32Bit_opc(ctx);
8834     }
8835     ctx->base.pc_next = ctx->pc_succ_insn;
8836 
8837     if (ctx->base.is_jmp == DISAS_NEXT) {
8838         target_ulong page_start;
8839 
8840         page_start = ctx->base.pc_first & TARGET_PAGE_MASK;
8841         if (ctx->base.pc_next - page_start >= TARGET_PAGE_SIZE
8842             || (ctx->base.pc_next - page_start >= TARGET_PAGE_SIZE - 3
8843                 && insn_crosses_page(env, ctx))) {
8844             ctx->base.is_jmp = DISAS_TOO_MANY;
8845         }
8846     }
8847 }
8848 
8849 static void tricore_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
8850 {
8851     DisasContext *ctx = container_of(dcbase, DisasContext, base);
8852 
8853     switch (ctx->base.is_jmp) {
8854     case DISAS_TOO_MANY:
8855         gen_goto_tb(ctx, 0, ctx->base.pc_next);
8856         break;
8857     case DISAS_NORETURN:
8858         break;
8859     default:
8860         g_assert_not_reached();
8861     }
8862 }
8863 
8864 static void tricore_tr_disas_log(const DisasContextBase *dcbase, CPUState *cpu)
8865 {
8866     qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
8867     log_target_disas(cpu, dcbase->pc_first, dcbase->tb->size);
8868 }
8869 
8870 static const TranslatorOps tricore_tr_ops = {
8871     .init_disas_context = tricore_tr_init_disas_context,
8872     .tb_start           = tricore_tr_tb_start,
8873     .insn_start         = tricore_tr_insn_start,
8874     .translate_insn     = tricore_tr_translate_insn,
8875     .tb_stop            = tricore_tr_tb_stop,
8876     .disas_log          = tricore_tr_disas_log,
8877 };
8878 
8879 
8880 void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
8881 {
8882     DisasContext ctx;
8883     translator_loop(&tricore_tr_ops, &ctx.base, cs, tb, max_insns);
8884 }
8885 
8886 void
8887 restore_state_to_opc(CPUTriCoreState *env, TranslationBlock *tb,
8888                      target_ulong *data)
8889 {
8890     env->PC = data[0];
8891 }
8892 /*
8893  *
8894  * Initialization
8895  *
8896  */
8897 
8898 void cpu_state_reset(CPUTriCoreState *env)
8899 {
8900     /* Reset Regs to Default Value */
8901     env->PSW = 0xb80;
8902     fpu_set_state(env);
8903 }
8904 
8905 static void tricore_tcg_init_csfr(void)
8906 {
8907     cpu_PCXI = tcg_global_mem_new(cpu_env,
8908                           offsetof(CPUTriCoreState, PCXI), "PCXI");
8909     cpu_PSW = tcg_global_mem_new(cpu_env,
8910                           offsetof(CPUTriCoreState, PSW), "PSW");
8911     cpu_PC = tcg_global_mem_new(cpu_env,
8912                           offsetof(CPUTriCoreState, PC), "PC");
8913     cpu_ICR = tcg_global_mem_new(cpu_env,
8914                           offsetof(CPUTriCoreState, ICR), "ICR");
8915 }
8916 
8917 void tricore_tcg_init(void)
8918 {
8919     int i;
8920 
8921     /* reg init */
8922     for (i = 0 ; i < 16 ; i++) {
8923         cpu_gpr_a[i] = tcg_global_mem_new(cpu_env,
8924                                           offsetof(CPUTriCoreState, gpr_a[i]),
8925                                           regnames_a[i]);
8926     }
8927     for (i = 0 ; i < 16 ; i++) {
8928         cpu_gpr_d[i] = tcg_global_mem_new(cpu_env,
8929                                   offsetof(CPUTriCoreState, gpr_d[i]),
8930                                            regnames_d[i]);
8931     }
8932     tricore_tcg_init_csfr();
8933     /* init PSW flag cache */
8934     cpu_PSW_C = tcg_global_mem_new(cpu_env,
8935                                    offsetof(CPUTriCoreState, PSW_USB_C),
8936                                    "PSW_C");
8937     cpu_PSW_V = tcg_global_mem_new(cpu_env,
8938                                    offsetof(CPUTriCoreState, PSW_USB_V),
8939                                    "PSW_V");
8940     cpu_PSW_SV = tcg_global_mem_new(cpu_env,
8941                                     offsetof(CPUTriCoreState, PSW_USB_SV),
8942                                     "PSW_SV");
8943     cpu_PSW_AV = tcg_global_mem_new(cpu_env,
8944                                     offsetof(CPUTriCoreState, PSW_USB_AV),
8945                                     "PSW_AV");
8946     cpu_PSW_SAV = tcg_global_mem_new(cpu_env,
8947                                      offsetof(CPUTriCoreState, PSW_USB_SAV),
8948                                      "PSW_SAV");
8949 }
8950