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