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