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