qemu/target/tricore/translate.c
<<
>>
Prefs
   1/*
   2 *  TriCore emulation for qemu: main translation routines.
   3 *
   4 *  Copyright (c) 2013-2014 Bastian Koppelmann C-Lab/University Paderborn
   5 *
   6 * This library is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU Lesser General Public
   8 * License as published by the Free Software Foundation; either
   9 * version 2 of the License, or (at your option) any later version.
  10 *
  11 * This library is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14 * Lesser General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU Lesser General Public
  17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  18 */
  19
  20
  21#include "qemu/osdep.h"
  22#include "cpu.h"
  23#include "disas/disas.h"
  24#include "exec/exec-all.h"
  25#include "tcg-op.h"
  26#include "exec/cpu_ldst.h"
  27
  28#include "exec/helper-proto.h"
  29#include "exec/helper-gen.h"
  30
  31#include "tricore-opcodes.h"
  32#include "exec/log.h"
  33
  34/*
  35 * TCG registers
  36 */
  37static TCGv cpu_PC;
  38static TCGv cpu_PCXI;
  39static TCGv cpu_PSW;
  40static TCGv cpu_ICR;
  41/* GPR registers */
  42static TCGv cpu_gpr_a[16];
  43static TCGv cpu_gpr_d[16];
  44/* PSW Flag cache */
  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/* CPU env */
  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    /* Routine used to access memory */
  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 * Functions to generate micro-ops
 127 */
 128
 129/* Makros for generating helpers */
 130
 131#define gen_helper_1arg(name, arg) do {                           \
 132    TCGv_i32 helper_tmp = tcg_const_i32(arg);                     \
 133    gen_helper_##name(cpu_env, helper_tmp);                       \
 134    tcg_temp_free_i32(helper_tmp);                                \
 135    } while (0)
 136
 137#define GEN_HELPER_LL(name, ret, arg0, arg1, n) do {         \
 138    TCGv arg00 = tcg_temp_new();                             \
 139    TCGv arg01 = tcg_temp_new();                             \
 140    TCGv arg11 = tcg_temp_new();                             \
 141    tcg_gen_sari_tl(arg00, arg0, 16);                        \
 142    tcg_gen_ext16s_tl(arg01, arg0);                          \
 143    tcg_gen_ext16s_tl(arg11, arg1);                          \
 144    gen_helper_##name(ret, arg00, arg01, arg11, arg11, n);   \
 145    tcg_temp_free(arg00);                                    \
 146    tcg_temp_free(arg01);                                    \
 147    tcg_temp_free(arg11);                                    \
 148} while (0)
 149
 150#define GEN_HELPER_LU(name, ret, arg0, arg1, n) do {         \
 151    TCGv arg00 = tcg_temp_new();                             \
 152    TCGv arg01 = tcg_temp_new();                             \
 153    TCGv arg10 = tcg_temp_new();                             \
 154    TCGv arg11 = tcg_temp_new();                             \
 155    tcg_gen_sari_tl(arg00, arg0, 16);                        \
 156    tcg_gen_ext16s_tl(arg01, arg0);                          \
 157    tcg_gen_sari_tl(arg11, arg1, 16);                        \
 158    tcg_gen_ext16s_tl(arg10, arg1);                          \
 159    gen_helper_##name(ret, arg00, arg01, arg10, arg11, n);   \
 160    tcg_temp_free(arg00);                                    \
 161    tcg_temp_free(arg01);                                    \
 162    tcg_temp_free(arg10);                                    \
 163    tcg_temp_free(arg11);                                    \
 164} while (0)
 165
 166#define GEN_HELPER_UL(name, ret, arg0, arg1, n) do {         \
 167    TCGv arg00 = tcg_temp_new();                             \
 168    TCGv arg01 = tcg_temp_new();                             \
 169    TCGv arg10 = tcg_temp_new();                             \
 170    TCGv arg11 = tcg_temp_new();                             \
 171    tcg_gen_sari_tl(arg00, arg0, 16);                        \
 172    tcg_gen_ext16s_tl(arg01, arg0);                          \
 173    tcg_gen_sari_tl(arg10, arg1, 16);                        \
 174    tcg_gen_ext16s_tl(arg11, arg1);                          \
 175    gen_helper_##name(ret, arg00, arg01, arg10, arg11, n);   \
 176    tcg_temp_free(arg00);                                    \
 177    tcg_temp_free(arg01);                                    \
 178    tcg_temp_free(arg10);                                    \
 179    tcg_temp_free(arg11);                                    \
 180} while (0)
 181
 182#define GEN_HELPER_UU(name, ret, arg0, arg1, n) do {         \
 183    TCGv arg00 = tcg_temp_new();                             \
 184    TCGv arg01 = tcg_temp_new();                             \
 185    TCGv arg11 = tcg_temp_new();                             \
 186    tcg_gen_sari_tl(arg01, arg0, 16);                        \
 187    tcg_gen_ext16s_tl(arg00, arg0);                          \
 188    tcg_gen_sari_tl(arg11, arg1, 16);                        \
 189    gen_helper_##name(ret, arg00, arg01, arg11, arg11, n);   \
 190    tcg_temp_free(arg00);                                    \
 191    tcg_temp_free(arg01);                                    \
 192    tcg_temp_free(arg11);                                    \
 193} while (0)
 194
 195#define GEN_HELPER_RRR(name, rl, rh, al1, ah1, arg2) do {    \
 196    TCGv_i64 ret = tcg_temp_new_i64();                       \
 197    TCGv_i64 arg1 = tcg_temp_new_i64();                      \
 198                                                             \
 199    tcg_gen_concat_i32_i64(arg1, al1, ah1);                  \
 200    gen_helper_##name(ret, arg1, arg2);                      \
 201    tcg_gen_extr_i64_i32(rl, rh, ret);                       \
 202                                                             \
 203    tcg_temp_free_i64(ret);                                  \
 204    tcg_temp_free_i64(arg1);                                 \
 205} while (0)
 206
 207#define GEN_HELPER_RR(name, rl, rh, arg1, arg2) do {        \
 208    TCGv_i64 ret = tcg_temp_new_i64();                      \
 209                                                            \
 210    gen_helper_##name(ret, cpu_env, arg1, arg2);            \
 211    tcg_gen_extr_i64_i32(rl, rh, ret);                      \
 212                                                            \
 213    tcg_temp_free_i64(ret);                                 \
 214} while (0)
 215
 216#define EA_ABS_FORMAT(con) (((con & 0x3C000) << 14) + (con & 0x3FFF))
 217#define EA_B_ABSOLUT(con) (((offset & 0xf00000) << 8) | \
 218                           ((offset & 0x0fffff) << 1))
 219
 220/* For two 32-bit registers used a 64-bit register, the first
 221   registernumber needs to be even. Otherwise we trap. */
 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/* Functions for load/save to/from memory */
 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    /* write back to two 32 bit regs */
 274    tcg_gen_extr_i64_i32(rl, rh, temp);
 275
 276    tcg_temp_free_i64(temp);
 277}
 278
 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/* M(EA, word) = (M(EA, word) & ~E[a][63:32]) | (E[a][31:0] & E[a][63:32]); */
 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    /* temp = (M(EA, word) */
 316    tcg_gen_qemu_ld_tl(temp, ea, ctx->mem_idx, MO_LEUL);
 317    /* temp = temp & ~E[a][63:32]) */
 318    tcg_gen_andc_tl(temp, temp, cpu_gpr_d[ereg+1]);
 319    /* temp2 = (E[a][31:0] & E[a][63:32]); */
 320    tcg_gen_and_tl(temp2, cpu_gpr_d[ereg], cpu_gpr_d[ereg+1]);
 321    /* temp = temp | temp2; */
 322    tcg_gen_or_tl(temp, temp, temp2);
 323    /* M(EA, word) = temp; */
 324    tcg_gen_qemu_st_tl(temp, ea, ctx->mem_idx, MO_LEUL);
 325
 326    tcg_temp_free(temp);
 327    tcg_temp_free(temp2);
 328}
 329
 330/* tmp = M(EA, word);
 331   M(EA, word) = D[a];
 332   D[a] = tmp[31:0];*/
 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/* We generate loads and store to core special function register (csfr) through
 378   the function gen_mfcr and gen_mtcr. To handle access permissions, we use 3
 379   makros R, A and E, which allow read-only, all and endinit protected access.
 380   These makros also specify in which ISA version the csfr was introduced. */
 381#define R(ADDRESS, REG, FEATURE)                                         \
 382    case ADDRESS:                                                        \
 383        if (tricore_feature(env, FEATURE)) {                             \
 384            tcg_gen_ld_tl(ret, cpu_env, offsetof(CPUTriCoreState, REG)); \
 385        }                                                                \
 386        break;
 387#define A(ADDRESS, REG, FEATURE) R(ADDRESS, REG, FEATURE)
 388#define E(ADDRESS, REG, FEATURE) R(ADDRESS, REG, FEATURE)
 389static inline void gen_mfcr(CPUTriCoreState *env, TCGv ret, int32_t offset)
 390{
 391    /* since we're caching PSW make this a special case */
 392    if (offset == 0xfe04) {
 393        gen_helper_psw_read(ret, cpu_env);
 394    } else {
 395        switch (offset) {
 396#include "csfr.def"
 397        }
 398    }
 399}
 400#undef R
 401#undef A
 402#undef E
 403
 404#define R(ADDRESS, REG, FEATURE) /* don't gen writes to read-only reg,
 405                                    since no execption occurs */
 406#define A(ADDRESS, REG, FEATURE) R(ADDRESS, REG, FEATURE)                \
 407    case ADDRESS:                                                        \
 408        if (tricore_feature(env, FEATURE)) {                             \
 409            tcg_gen_st_tl(r1, cpu_env, offsetof(CPUTriCoreState, REG));  \
 410        }                                                                \
 411        break;
 412/* Endinit protected registers
 413   TODO: Since the endinit bit is in a register of a not yet implemented
 414         watchdog device, we handle endinit protected registers like
 415         all-access registers for now. */
 416#define E(ADDRESS, REG, FEATURE) A(ADDRESS, REG, FEATURE)
 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        /* since we're caching PSW make this a special case */
 422        if (offset == 0xfe04) {
 423            gen_helper_psw_write(cpu_env, r1);
 424        } else {
 425            switch (offset) {
 426#include "csfr.def"
 427            }
 428        }
 429    } else {
 430        /* generate privilege trap */
 431    }
 432}
 433
 434/* Functions for arithmetic instructions  */
 435
 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    /* Addition and set V/SV bits */
 441    tcg_gen_add_tl(result, r1, r2);
 442    /* calc V bit */
 443    tcg_gen_xor_tl(cpu_PSW_V, result, r1);
 444    tcg_gen_xor_tl(t0, r1, r2);
 445    tcg_gen_andc_tl(cpu_PSW_V, cpu_PSW_V, t0);
 446    /* Calc SV bit */
 447    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
 448    /* Calc AV/SAV bits */
 449    tcg_gen_add_tl(cpu_PSW_AV, result, result);
 450    tcg_gen_xor_tl(cpu_PSW_AV, result, cpu_PSW_AV);
 451    /* calc SAV */
 452    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
 453    /* write back result */
 454    tcg_gen_mov_tl(ret, result);
 455
 456    tcg_temp_free(result);
 457    tcg_temp_free(t0);
 458}
 459
 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    /* calc v bit */
 470    tcg_gen_xor_i64(t1, result, r1);
 471    tcg_gen_xor_i64(t0, r1, r2);
 472    tcg_gen_andc_i64(t1, t1, t0);
 473    tcg_gen_extrh_i64_i32(cpu_PSW_V, t1);
 474    /* calc SV bit */
 475    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
 476    /* calc AV/SAV bits */
 477    tcg_gen_extrh_i64_i32(temp, result);
 478    tcg_gen_add_tl(cpu_PSW_AV, temp, temp);
 479    tcg_gen_xor_tl(cpu_PSW_AV, temp, cpu_PSW_AV);
 480    /* calc SAV */
 481    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
 482    /* write back result */
 483    tcg_gen_mov_i64(ret, result);
 484
 485    tcg_temp_free(temp);
 486    tcg_temp_free_i64(result);
 487    tcg_temp_free_i64(t0);
 488    tcg_temp_free_i64(t1);
 489}
 490
 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    /* calc V0 bit */
 503    tcg_gen_xor_tl(temp2, temp, r1_low);
 504    tcg_gen_xor_tl(temp3, r1_low, r2);
 505    if (op1 == tcg_gen_add_tl) {
 506        tcg_gen_andc_tl(temp2, temp2, temp3);
 507    } else {
 508        tcg_gen_and_tl(temp2, temp2, temp3);
 509    }
 510
 511    (*op2)(temp3, r1_high, r3);
 512    /* calc V1 bit */
 513    tcg_gen_xor_tl(cpu_PSW_V, temp3, r1_high);
 514    tcg_gen_xor_tl(temp4, r1_high, r3);
 515    if (op2 == tcg_gen_add_tl) {
 516        tcg_gen_andc_tl(cpu_PSW_V, cpu_PSW_V, temp4);
 517    } else {
 518        tcg_gen_and_tl(cpu_PSW_V, cpu_PSW_V, temp4);
 519    }
 520    /* combine V0/V1 bits */
 521    tcg_gen_or_tl(cpu_PSW_V, cpu_PSW_V, temp2);
 522    /* calc sv bit */
 523    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
 524    /* write result */
 525    tcg_gen_mov_tl(ret_low, temp);
 526    tcg_gen_mov_tl(ret_high, temp3);
 527    /* calc AV bit */
 528    tcg_gen_add_tl(temp, ret_low, ret_low);
 529    tcg_gen_xor_tl(temp, temp, ret_low);
 530    tcg_gen_add_tl(cpu_PSW_AV, ret_high, ret_high);
 531    tcg_gen_xor_tl(cpu_PSW_AV, cpu_PSW_AV, ret_high);
 532    tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp);
 533    /* calc SAV bit */
 534    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
 535
 536    tcg_temp_free(temp);
 537    tcg_temp_free(temp2);
 538    tcg_temp_free(temp3);
 539    tcg_temp_free(temp4);
 540}
 541
 542/* ret = r2 + (r1 * r3); */
 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    /* calc V
 558       t1 > 0x7fffffff */
 559    tcg_gen_setcondi_i64(TCG_COND_GT, t3, t1, 0x7fffffffLL);
 560    /* t1 < -0x80000000 */
 561    tcg_gen_setcondi_i64(TCG_COND_LT, t2, t1, -0x80000000LL);
 562    tcg_gen_or_i64(t2, t2, t3);
 563    tcg_gen_extrl_i64_i32(cpu_PSW_V, t2);
 564    tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
 565    /* Calc SV bit */
 566    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
 567    /* Calc AV/SAV bits */
 568    tcg_gen_add_tl(cpu_PSW_AV, ret, ret);
 569    tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV);
 570    /* calc SAV */
 571    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
 572
 573    tcg_temp_free_i64(t1);
 574    tcg_temp_free_i64(t2);
 575    tcg_temp_free_i64(t3);
 576}
 577
 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    /* only the add can overflow */
 596    tcg_gen_add2_tl(t3, t4, r2_low, r2_high, t1, t2);
 597    /* calc V bit */
 598    tcg_gen_xor_tl(cpu_PSW_V, t4, r2_high);
 599    tcg_gen_xor_tl(t1, r2_high, t2);
 600    tcg_gen_andc_tl(cpu_PSW_V, cpu_PSW_V, t1);
 601    /* Calc SV bit */
 602    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
 603    /* Calc AV/SAV bits */
 604    tcg_gen_add_tl(cpu_PSW_AV, t4, t4);
 605    tcg_gen_xor_tl(cpu_PSW_AV, t4, cpu_PSW_AV);
 606    /* calc SAV */
 607    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
 608    /* write back the result */
 609    tcg_gen_mov_tl(ret_low, t3);
 610    tcg_gen_mov_tl(ret_high, t4);
 611
 612    tcg_temp_free(t1);
 613    tcg_temp_free(t2);
 614    tcg_temp_free(t3);
 615    tcg_temp_free(t4);
 616}
 617
 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    /* write back result */
 633    tcg_gen_extr_i64_i32(ret_low, ret_high, t2);
 634    /* only the add overflows, if t2 < t1
 635       calc V bit */
 636    tcg_gen_setcond_i64(TCG_COND_LTU, t2, t2, t1);
 637    tcg_gen_extrl_i64_i32(cpu_PSW_V, t2);
 638    tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
 639    /* Calc SV bit */
 640    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
 641    /* Calc AV/SAV bits */
 642    tcg_gen_add_tl(cpu_PSW_AV, ret_high, ret_high);
 643    tcg_gen_xor_tl(cpu_PSW_AV, ret_high, cpu_PSW_AV);
 644    /* calc SAV */
 645    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
 646
 647    tcg_temp_free_i64(t1);
 648    tcg_temp_free_i64(t2);
 649    tcg_temp_free_i64(t3);
 650}
 651
 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); /* high */
 752    tcg_gen_ext32s_i64(temp64, temp64); /* low */
 753    tcg_gen_sub_i64(temp64, temp64_2, temp64);
 754    tcg_gen_shli_i64(temp64, temp64, 16);
 755
 756    gen_add64_d(temp64_2, temp64_3, temp64);
 757    /* write back result */
 758    tcg_gen_extr_i64_i32(ret_low, ret_high, temp64_2);
 759
 760    tcg_temp_free(temp);
 761    tcg_temp_free_i64(temp64);
 762    tcg_temp_free_i64(temp64_2);
 763    tcg_temp_free_i64(temp64_3);
 764}
 765
 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    /* combine v bits */
 797    tcg_gen_or_tl(cpu_PSW_V, cpu_PSW_V, temp);
 798    /* combine av bits */
 799    tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp3);
 800
 801    tcg_temp_free(temp);
 802    tcg_temp_free(temp2);
 803    tcg_temp_free(temp3);
 804    tcg_temp_free_i64(temp64);
 805
 806}
 807
 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    /* combine v bits */
 839    tcg_gen_or_tl(cpu_PSW_V, cpu_PSW_V, temp);
 840    /* combine av bits */
 841    tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp3);
 842
 843    tcg_temp_free(temp);
 844    tcg_temp_free(temp2);
 845    tcg_temp_free(temp3);
 846    tcg_temp_free_i64(temp64);
 847
 848}
 849
 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); /* high */
 873    tcg_gen_ext32s_i64(temp64, temp64); /* low */
 874    tcg_gen_sub_i64(temp64, temp64_2, temp64);
 875    tcg_gen_shli_i64(temp64, temp64, 16);
 876    tcg_gen_concat_i32_i64(temp64_2, r1_low, r1_high);
 877
 878    gen_helper_add64_ssov(temp64, cpu_env, temp64_2, temp64);
 879    tcg_gen_extr_i64_i32(ret_low, ret_high, temp64);
 880
 881    tcg_temp_free(temp);
 882    tcg_temp_free_i64(temp64);
 883    tcg_temp_free_i64(temp64_2);
 884}
 885
 886
 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    /* write back result */
 912    tcg_gen_extr_i64_i32(ret_low, ret_high, temp64_3);
 913
 914    tcg_temp_free(temp);
 915    tcg_temp_free_i64(temp64);
 916    tcg_temp_free_i64(temp64_2);
 917    tcg_temp_free_i64(temp64_3);
 918}
 919
 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    /* calc v bit */
1128    tcg_gen_setcondi_i64(TCG_COND_GT, t1, t3, 0x7fffffffLL);
1129    tcg_gen_setcondi_i64(TCG_COND_LT, t2, t3, -0x80000000LL);
1130    tcg_gen_or_i64(t1, t1, t2);
1131    tcg_gen_extrl_i64_i32(cpu_PSW_V, t1);
1132    tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
1133    /* We produce an overflow on the host if the mul before was
1134       (0x80000000 * 0x80000000) << 1). If this is the
1135       case, we negate the ovf. */
1136    if (n == 1) {
1137        tcg_gen_setcondi_tl(TCG_COND_EQ, temp, arg2, 0x80000000);
1138        tcg_gen_setcond_tl(TCG_COND_EQ, temp2, arg2, arg3);
1139        tcg_gen_and_tl(temp, temp, temp2);
1140        tcg_gen_shli_tl(temp, temp, 31);
1141        /* negate v bit, if special condition */
1142        tcg_gen_xor_tl(cpu_PSW_V, cpu_PSW_V, temp);
1143    }
1144    /* Calc SV bit */
1145    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1146    /* Calc AV/SAV bits */
1147    tcg_gen_add_tl(cpu_PSW_AV, temp3, temp3);
1148    tcg_gen_xor_tl(cpu_PSW_AV, temp3, cpu_PSW_AV);
1149    /* calc SAV */
1150    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1151    /* write back result */
1152    tcg_gen_mov_tl(ret, temp3);
1153
1154    tcg_temp_free(temp);
1155    tcg_temp_free(temp2);
1156    tcg_temp_free(temp3);
1157    tcg_temp_free_i64(t1);
1158    tcg_temp_free_i64(t2);
1159    tcg_temp_free_i64(t3);
1160}
1161
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 { /* n is expected to be 1 */
1170        tcg_gen_mul_tl(temp, arg2, arg3);
1171        tcg_gen_shli_tl(temp, temp, 1);
1172        /* catch special case r1 = r2 = 0x8000 */
1173        tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, temp, 0x80000000);
1174        tcg_gen_sub_tl(temp, temp, temp2);
1175    }
1176    gen_add_d(ret, arg1, temp);
1177
1178    tcg_temp_free(temp);
1179    tcg_temp_free(temp2);
1180}
1181
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 { /* n is expected to be 1 */
1190        tcg_gen_mul_tl(temp, arg2, arg3);
1191        tcg_gen_shli_tl(temp, temp, 1);
1192        /* catch special case r1 = r2 = 0x8000 */
1193        tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, temp, 0x80000000);
1194        tcg_gen_sub_tl(temp, temp, temp2);
1195    }
1196    gen_adds(ret, arg1, temp);
1197
1198    tcg_temp_free(temp);
1199    tcg_temp_free(temp2);
1200}
1201
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 { /* n is expected to be 1 */
1215        tcg_gen_mul_tl(temp, arg2, arg3);
1216        tcg_gen_shli_tl(temp, temp, 1);
1217        /* catch special case r1 = r2 = 0x8000 */
1218        tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, temp, 0x80000000);
1219        tcg_gen_sub_tl(temp, temp, temp2);
1220    }
1221    tcg_gen_ext_i32_i64(t2, temp);
1222    tcg_gen_shli_i64(t2, t2, 16);
1223    tcg_gen_concat_i32_i64(t1, arg1_low, arg1_high);
1224    gen_add64_d(t3, t1, t2);
1225    /* write back result */
1226    tcg_gen_extr_i64_i32(rl, rh, t3);
1227
1228    tcg_temp_free_i64(t1);
1229    tcg_temp_free_i64(t2);
1230    tcg_temp_free_i64(t3);
1231    tcg_temp_free(temp);
1232    tcg_temp_free(temp2);
1233}
1234
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 { /* n is expected to be 1 */
1247        tcg_gen_mul_tl(temp, arg2, arg3);
1248        tcg_gen_shli_tl(temp, temp, 1);
1249        /* catch special case r1 = r2 = 0x8000 */
1250        tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, temp, 0x80000000);
1251        tcg_gen_sub_tl(temp, temp, temp2);
1252    }
1253    tcg_gen_ext_i32_i64(t2, temp);
1254    tcg_gen_shli_i64(t2, t2, 16);
1255    tcg_gen_concat_i32_i64(t1, arg1_low, arg1_high);
1256
1257    gen_helper_add64_ssov(t1, cpu_env, t1, t2);
1258    tcg_gen_extr_i64_i32(rl, rh, t1);
1259
1260    tcg_temp_free(temp);
1261    tcg_temp_free(temp2);
1262    tcg_temp_free_i64(t1);
1263    tcg_temp_free_i64(t2);
1264}
1265
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    /* calc v bit */
1286    tcg_gen_xor_i64(t3, t4, t1);
1287    tcg_gen_xor_i64(t2, t1, t2);
1288    tcg_gen_andc_i64(t3, t3, t2);
1289    tcg_gen_extrh_i64_i32(cpu_PSW_V, t3);
1290    /* We produce an overflow on the host if the mul before was
1291       (0x80000000 * 0x80000000) << 1). If this is the
1292       case, we negate the ovf. */
1293    if (n == 1) {
1294        temp = tcg_temp_new();
1295        temp2 = tcg_temp_new();
1296        tcg_gen_setcondi_tl(TCG_COND_EQ, temp, arg2, 0x80000000);
1297        tcg_gen_setcond_tl(TCG_COND_EQ, temp2, arg2, arg3);
1298        tcg_gen_and_tl(temp, temp, temp2);
1299        tcg_gen_shli_tl(temp, temp, 31);
1300        /* negate v bit, if special condition */
1301        tcg_gen_xor_tl(cpu_PSW_V, cpu_PSW_V, temp);
1302
1303        tcg_temp_free(temp);
1304        tcg_temp_free(temp2);
1305    }
1306    /* write back result */
1307    tcg_gen_extr_i64_i32(rl, rh, t4);
1308    /* Calc SV bit */
1309    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1310    /* Calc AV/SAV bits */
1311    tcg_gen_add_tl(cpu_PSW_AV, rh, rh);
1312    tcg_gen_xor_tl(cpu_PSW_AV, rh, cpu_PSW_AV);
1313    /* calc SAV */
1314    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1315
1316    tcg_temp_free_i64(t1);
1317    tcg_temp_free_i64(t2);
1318    tcg_temp_free_i64(t3);
1319    tcg_temp_free_i64(t4);
1320}
1321
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/* ret = r2 - (r1 * r3); */
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    /* calc V
1374       t2 > 0x7fffffff */
1375    tcg_gen_setcondi_i64(TCG_COND_GT, t3, t1, 0x7fffffffLL);
1376    /* result < -0x80000000 */
1377    tcg_gen_setcondi_i64(TCG_COND_LT, t2, t1, -0x80000000LL);
1378    tcg_gen_or_i64(t2, t2, t3);
1379    tcg_gen_extrl_i64_i32(cpu_PSW_V, t2);
1380    tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
1381
1382    /* Calc SV bit */
1383    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1384    /* Calc AV/SAV bits */
1385    tcg_gen_add_tl(cpu_PSW_AV, ret, ret);
1386    tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV);
1387    /* calc SAV */
1388    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1389
1390    tcg_temp_free_i64(t1);
1391    tcg_temp_free_i64(t2);
1392    tcg_temp_free_i64(t3);
1393}
1394
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    /* only the sub can overflow */
1413    tcg_gen_sub2_tl(t3, t4, r2_low, r2_high, t1, t2);
1414    /* calc V bit */
1415    tcg_gen_xor_tl(cpu_PSW_V, t4, r2_high);
1416    tcg_gen_xor_tl(t1, r2_high, t2);
1417    tcg_gen_and_tl(cpu_PSW_V, cpu_PSW_V, t1);
1418    /* Calc SV bit */
1419    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1420    /* Calc AV/SAV bits */
1421    tcg_gen_add_tl(cpu_PSW_AV, t4, t4);
1422    tcg_gen_xor_tl(cpu_PSW_AV, t4, cpu_PSW_AV);
1423    /* calc SAV */
1424    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1425    /* write back the result */
1426    tcg_gen_mov_tl(ret_low, t3);
1427    tcg_gen_mov_tl(ret_high, t4);
1428
1429    tcg_temp_free(t1);
1430    tcg_temp_free(t2);
1431    tcg_temp_free(t3);
1432    tcg_temp_free(t4);
1433}
1434
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    /* calc V bit, only the sub can overflow, if t1 > t2 */
1460    tcg_gen_setcond_i64(TCG_COND_GTU, t1, t1, t2);
1461    tcg_gen_extrl_i64_i32(cpu_PSW_V, t1);
1462    tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
1463    /* Calc SV bit */
1464    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1465    /* Calc AV/SAV bits */
1466    tcg_gen_add_tl(cpu_PSW_AV, ret_high, ret_high);
1467    tcg_gen_xor_tl(cpu_PSW_AV, ret_high, cpu_PSW_AV);
1468    /* calc SAV */
1469    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1470
1471    tcg_temp_free_i64(t1);
1472    tcg_temp_free_i64(t2);
1473    tcg_temp_free_i64(t3);
1474}
1475
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/* calculate the carry bit too */
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    /* Addition and set C/V/SV bits */
1499    tcg_gen_add2_i32(result, cpu_PSW_C, r1, t0, r2, t0);
1500    /* calc V bit */
1501    tcg_gen_xor_tl(cpu_PSW_V, result, r1);
1502    tcg_gen_xor_tl(t0, r1, r2);
1503    tcg_gen_andc_tl(cpu_PSW_V, cpu_PSW_V, t0);
1504    /* Calc SV bit */
1505    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1506    /* Calc AV/SAV bits */
1507    tcg_gen_add_tl(cpu_PSW_AV, result, result);
1508    tcg_gen_xor_tl(cpu_PSW_AV, result, cpu_PSW_AV);
1509    /* calc SAV */
1510    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1511    /* write back result */
1512    tcg_gen_mov_tl(ret, result);
1513
1514    tcg_temp_free(result);
1515    tcg_temp_free(t0);
1516}
1517
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    /* Addition, carry and set C/V/SV bits */
1534    tcg_gen_add2_i32(result, cpu_PSW_C, r1, t0, carry, t0);
1535    tcg_gen_add2_i32(result, cpu_PSW_C, result, cpu_PSW_C, r2, t0);
1536    /* calc V bit */
1537    tcg_gen_xor_tl(cpu_PSW_V, result, r1);
1538    tcg_gen_xor_tl(t0, r1, r2);
1539    tcg_gen_andc_tl(cpu_PSW_V, cpu_PSW_V, t0);
1540    /* Calc SV bit */
1541    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1542    /* Calc AV/SAV bits */
1543    tcg_gen_add_tl(cpu_PSW_AV, result, result);
1544    tcg_gen_xor_tl(cpu_PSW_AV, result, cpu_PSW_AV);
1545    /* calc SAV */
1546    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1547    /* write back result */
1548    tcg_gen_mov_tl(ret, result);
1549
1550    tcg_temp_free(result);
1551    tcg_temp_free(t0);
1552    tcg_temp_free(carry);
1553}
1554
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    /* create mask for sticky bits */
1572    tcg_gen_setcond_tl(cond, mask, r4, t0);
1573    tcg_gen_shli_tl(mask, mask, 31);
1574
1575    tcg_gen_add_tl(result, r1, r2);
1576    /* Calc PSW_V */
1577    tcg_gen_xor_tl(temp, result, r1);
1578    tcg_gen_xor_tl(temp2, r1, r2);
1579    tcg_gen_andc_tl(temp, temp, temp2);
1580    tcg_gen_movcond_tl(cond, cpu_PSW_V, r4, t0, temp, cpu_PSW_V);
1581    /* Set PSW_SV */
1582    tcg_gen_and_tl(temp, temp, mask);
1583    tcg_gen_or_tl(cpu_PSW_SV, temp, cpu_PSW_SV);
1584    /* calc AV bit */
1585    tcg_gen_add_tl(temp, result, result);
1586    tcg_gen_xor_tl(temp, temp, result);
1587    tcg_gen_movcond_tl(cond, cpu_PSW_AV, r4, t0, temp, cpu_PSW_AV);
1588    /* calc SAV bit */
1589    tcg_gen_and_tl(temp, temp, mask);
1590    tcg_gen_or_tl(cpu_PSW_SAV, temp, cpu_PSW_SAV);
1591    /* write back result */
1592    tcg_gen_movcond_tl(cond, r3, r4, t0, result, r1);
1593
1594    tcg_temp_free(t0);
1595    tcg_temp_free(temp);
1596    tcg_temp_free(temp2);
1597    tcg_temp_free(result);
1598    tcg_temp_free(mask);
1599}
1600
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    /* calc V bit */
1616    tcg_gen_xor_tl(cpu_PSW_V, result, r1);
1617    tcg_gen_xor_tl(temp, r1, r2);
1618    tcg_gen_and_tl(cpu_PSW_V, cpu_PSW_V, temp);
1619    /* calc SV bit */
1620    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1621    /* Calc AV bit */
1622    tcg_gen_add_tl(cpu_PSW_AV, result, result);
1623    tcg_gen_xor_tl(cpu_PSW_AV, result, cpu_PSW_AV);
1624    /* calc SAV bit */
1625    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1626    /* write back result */
1627    tcg_gen_mov_tl(ret, result);
1628
1629    tcg_temp_free(temp);
1630    tcg_temp_free(result);
1631}
1632
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    /* calc v bit */
1643    tcg_gen_xor_i64(t1, result, r1);
1644    tcg_gen_xor_i64(t0, r1, r2);
1645    tcg_gen_and_i64(t1, t1, t0);
1646    tcg_gen_extrh_i64_i32(cpu_PSW_V, t1);
1647    /* calc SV bit */
1648    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1649    /* calc AV/SAV bits */
1650    tcg_gen_extrh_i64_i32(temp, result);
1651    tcg_gen_add_tl(cpu_PSW_AV, temp, temp);
1652    tcg_gen_xor_tl(cpu_PSW_AV, temp, cpu_PSW_AV);
1653    /* calc SAV */
1654    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1655    /* write back result */
1656    tcg_gen_mov_i64(ret, result);
1657
1658    tcg_temp_free(temp);
1659    tcg_temp_free_i64(result);
1660    tcg_temp_free_i64(t0);
1661    tcg_temp_free_i64(t1);
1662}
1663
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    /* calc C bit */
1671    tcg_gen_setcond_tl(TCG_COND_GEU, cpu_PSW_C, r1, r2);
1672    /* calc V bit */
1673    tcg_gen_xor_tl(cpu_PSW_V, result, r1);
1674    tcg_gen_xor_tl(temp, r1, r2);
1675    tcg_gen_and_tl(cpu_PSW_V, cpu_PSW_V, temp);
1676    /* calc SV bit */
1677    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1678    /* Calc AV bit */
1679    tcg_gen_add_tl(cpu_PSW_AV, result, result);
1680    tcg_gen_xor_tl(cpu_PSW_AV, result, cpu_PSW_AV);
1681    /* calc SAV bit */
1682    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
1683    /* write back result */
1684    tcg_gen_mov_tl(ret, result);
1685
1686    tcg_temp_free(result);
1687    tcg_temp_free(temp);
1688}
1689
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    /* create mask for sticky bits */
1708    tcg_gen_setcond_tl(cond, mask, r4, t0);
1709    tcg_gen_shli_tl(mask, mask, 31);
1710
1711    tcg_gen_sub_tl(result, r1, r2);
1712    /* Calc PSW_V */
1713    tcg_gen_xor_tl(temp, result, r1);
1714    tcg_gen_xor_tl(temp2, r1, r2);
1715    tcg_gen_and_tl(temp, temp, temp2);
1716    tcg_gen_movcond_tl(cond, cpu_PSW_V, r4, t0, temp, cpu_PSW_V);
1717    /* Set PSW_SV */
1718    tcg_gen_and_tl(temp, temp, mask);
1719    tcg_gen_or_tl(cpu_PSW_SV, temp, cpu_PSW_SV);
1720    /* calc AV bit */
1721    tcg_gen_add_tl(temp, result, result);
1722    tcg_gen_xor_tl(temp, temp, result);
1723    tcg_gen_movcond_tl(cond, cpu_PSW_AV, r4, t0, temp, cpu_PSW_AV);
1724    /* calc SAV bit */
1725    tcg_gen_and_tl(temp, temp, mask);
1726    tcg_gen_or_tl(cpu_PSW_SAV, temp, cpu_PSW_SAV);
1727    /* write back result */
1728    tcg_gen_movcond_tl(cond, r3, r4, t0, result, r1);
1729
1730    tcg_temp_free(t0);
1731    tcg_temp_free(temp);
1732    tcg_temp_free(temp2);
1733    tcg_temp_free(result);
1734    tcg_temp_free(mask);
1735}
1736
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    /* combine v bits */
1795    tcg_gen_or_tl(cpu_PSW_V, cpu_PSW_V, temp);
1796    /* combine av bits */
1797    tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp3);
1798
1799    tcg_temp_free(temp);
1800    tcg_temp_free(temp2);
1801    tcg_temp_free(temp3);
1802    tcg_temp_free_i64(temp64);
1803}
1804
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    /* write back result */
1830    tcg_gen_extr_i64_i32(ret_low, ret_high, temp64_3);
1831
1832    tcg_temp_free(temp);
1833    tcg_temp_free_i64(temp64);
1834    tcg_temp_free_i64(temp64_2);
1835    tcg_temp_free_i64(temp64_3);
1836}
1837
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    /* if we shift part of the fraction out, we need to round up */
1983    tcg_gen_andi_i64(t4, t2, (1ll << (up_shift - n)) - 1);
1984    tcg_gen_setcondi_i64(TCG_COND_NE, t4, t4, 0);
1985    tcg_gen_sari_i64(t2, t2, up_shift - n);
1986    tcg_gen_add_i64(t2, t2, t4);
1987
1988    tcg_gen_sub_i64(t3, t1, t2);
1989    tcg_gen_extrl_i64_i32(temp3, t3);
1990    /* calc v bit */
1991    tcg_gen_setcondi_i64(TCG_COND_GT, t1, t3, 0x7fffffffLL);
1992    tcg_gen_setcondi_i64(TCG_COND_LT, t2, t3, -0x80000000LL);
1993    tcg_gen_or_i64(t1, t1, t2);
1994    tcg_gen_extrl_i64_i32(cpu_PSW_V, t1);
1995    tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
1996    /* Calc SV bit */
1997    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
1998    /* Calc AV/SAV bits */
1999    tcg_gen_add_tl(cpu_PSW_AV, temp3, temp3);
2000    tcg_gen_xor_tl(cpu_PSW_AV, temp3, cpu_PSW_AV);
2001    /* calc SAV */
2002    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2003    /* write back result */
2004    tcg_gen_mov_tl(ret, temp3);
2005
2006    tcg_temp_free(temp);
2007    tcg_temp_free(temp2);
2008    tcg_temp_free(temp3);
2009    tcg_temp_free_i64(t1);
2010    tcg_temp_free_i64(t2);
2011    tcg_temp_free_i64(t3);
2012    tcg_temp_free_i64(t4);
2013}
2014
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 { /* n is expected to be 1 */
2023        tcg_gen_mul_tl(temp, arg2, arg3);
2024        tcg_gen_shli_tl(temp, temp, 1);
2025        /* catch special case r1 = r2 = 0x8000 */
2026        tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, temp, 0x80000000);
2027        tcg_gen_sub_tl(temp, temp, temp2);
2028    }
2029    gen_sub_d(ret, arg1, temp);
2030
2031    tcg_temp_free(temp);
2032    tcg_temp_free(temp2);
2033}
2034
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 { /* n is expected to be 1 */
2043        tcg_gen_mul_tl(temp, arg2, arg3);
2044        tcg_gen_shli_tl(temp, temp, 1);
2045        /* catch special case r1 = r2 = 0x8000 */
2046        tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, temp, 0x80000000);
2047        tcg_gen_sub_tl(temp, temp, temp2);
2048    }
2049    gen_subs(ret, arg1, temp);
2050
2051    tcg_temp_free(temp);
2052    tcg_temp_free(temp2);
2053}
2054
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 { /* n is expected to be 1 */
2068        tcg_gen_mul_tl(temp, arg2, arg3);
2069        tcg_gen_shli_tl(temp, temp, 1);
2070        /* catch special case r1 = r2 = 0x8000 */
2071        tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, temp, 0x80000000);
2072        tcg_gen_sub_tl(temp, temp, temp2);
2073    }
2074    tcg_gen_ext_i32_i64(t2, temp);
2075    tcg_gen_shli_i64(t2, t2, 16);
2076    tcg_gen_concat_i32_i64(t1, arg1_low, arg1_high);
2077    gen_sub64_d(t3, t1, t2);
2078    /* write back result */
2079    tcg_gen_extr_i64_i32(rl, rh, t3);
2080
2081    tcg_temp_free_i64(t1);
2082    tcg_temp_free_i64(t2);
2083    tcg_temp_free_i64(t3);
2084    tcg_temp_free(temp);
2085    tcg_temp_free(temp2);
2086}
2087
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 { /* n is expected to be 1 */
2100        tcg_gen_mul_tl(temp, arg2, arg3);
2101        tcg_gen_shli_tl(temp, temp, 1);
2102        /* catch special case r1 = r2 = 0x8000 */
2103        tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, temp, 0x80000000);
2104        tcg_gen_sub_tl(temp, temp, temp2);
2105    }
2106    tcg_gen_ext_i32_i64(t2, temp);
2107    tcg_gen_shli_i64(t2, t2, 16);
2108    tcg_gen_concat_i32_i64(t1, arg1_low, arg1_high);
2109
2110    gen_helper_sub64_ssov(t1, cpu_env, t1, t2);
2111    tcg_gen_extr_i64_i32(rl, rh, t1);
2112
2113    tcg_temp_free(temp);
2114    tcg_temp_free(temp2);
2115    tcg_temp_free_i64(t1);
2116    tcg_temp_free_i64(t2);
2117}
2118
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    /* calc v bit */
2139    tcg_gen_xor_i64(t3, t4, t1);
2140    tcg_gen_xor_i64(t2, t1, t2);
2141    tcg_gen_and_i64(t3, t3, t2);
2142    tcg_gen_extrh_i64_i32(cpu_PSW_V, t3);
2143    /* We produce an overflow on the host if the mul before was
2144       (0x80000000 * 0x80000000) << 1). If this is the
2145       case, we negate the ovf. */
2146    if (n == 1) {
2147        temp = tcg_temp_new();
2148        temp2 = tcg_temp_new();
2149        tcg_gen_setcondi_tl(TCG_COND_EQ, temp, arg2, 0x80000000);
2150        tcg_gen_setcond_tl(TCG_COND_EQ, temp2, arg2, arg3);
2151        tcg_gen_and_tl(temp, temp, temp2);
2152        tcg_gen_shli_tl(temp, temp, 31);
2153        /* negate v bit, if special condition */
2154        tcg_gen_xor_tl(cpu_PSW_V, cpu_PSW_V, temp);
2155
2156        tcg_temp_free(temp);
2157        tcg_temp_free(temp2);
2158    }
2159    /* write back result */
2160    tcg_gen_extr_i64_i32(rl, rh, t4);
2161    /* Calc SV bit */
2162    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
2163    /* Calc AV/SAV bits */
2164    tcg_gen_add_tl(cpu_PSW_AV, rh, rh);
2165    tcg_gen_xor_tl(cpu_PSW_AV, rh, cpu_PSW_AV);
2166    /* calc SAV */
2167    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2168
2169    tcg_temp_free_i64(t1);
2170    tcg_temp_free_i64(t2);
2171    tcg_temp_free_i64(t3);
2172    tcg_temp_free_i64(t4);
2173}
2174
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    /* if we shift part of the fraction out, we need to round up */
2190    tcg_gen_andi_i64(t4, t2, (1ll << (up_shift - n)) - 1);
2191    tcg_gen_setcondi_i64(TCG_COND_NE, t4, t4, 0);
2192    tcg_gen_sari_i64(t3, t2, up_shift - n);
2193    tcg_gen_add_i64(t3, t3, t4);
2194
2195    gen_helper_msub32_q_sub_ssov(ret, cpu_env, t1, t3);
2196
2197    tcg_temp_free_i64(t1);
2198    tcg_temp_free_i64(t2);
2199    tcg_temp_free_i64(t3);
2200    tcg_temp_free_i64(t4);
2201}
2202
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); /* high */
2271    tcg_gen_ext32s_i64(temp64, temp64); /* low */
2272    tcg_gen_sub_i64(temp64, temp64_2, temp64);
2273    tcg_gen_shli_i64(temp64, temp64, 16);
2274
2275    gen_sub64_d(temp64_2, temp64_3, temp64);
2276    /* write back result */
2277    tcg_gen_extr_i64_i32(ret_low, ret_high, temp64_2);
2278
2279    tcg_temp_free(temp);
2280    tcg_temp_free_i64(temp64);
2281    tcg_temp_free_i64(temp64_2);
2282    tcg_temp_free_i64(temp64_3);
2283}
2284
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    /* combine v bits */
2343    tcg_gen_or_tl(cpu_PSW_V, cpu_PSW_V, temp);
2344    /* combine av bits */
2345    tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp3);
2346
2347    tcg_temp_free(temp);
2348    tcg_temp_free(temp2);
2349    tcg_temp_free(temp3);
2350    tcg_temp_free_i64(temp64);
2351}
2352
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); /* high */
2376    tcg_gen_ext32s_i64(temp64, temp64); /* low */
2377    tcg_gen_sub_i64(temp64, temp64_2, temp64);
2378    tcg_gen_shli_i64(temp64, temp64, 16);
2379    tcg_gen_concat_i32_i64(temp64_2, r1_low, r1_high);
2380
2381    gen_helper_sub64_ssov(temp64, cpu_env, temp64_2, temp64);
2382    tcg_gen_extr_i64_i32(ret_low, ret_high, temp64);
2383
2384    tcg_temp_free(temp);
2385    tcg_temp_free_i64(temp64);
2386    tcg_temp_free_i64(temp64_2);
2387}
2388
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    /* overflow can only happen, if r1 = 0x80000000 */
2426    tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, r1, 0x80000000);
2427    tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
2428    /* calc SV bit */
2429    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
2430    /* Calc AV bit */
2431    tcg_gen_add_tl(cpu_PSW_AV, ret, ret);
2432    tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV);
2433    /* calc SAV bit */
2434    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2435
2436    tcg_temp_free(temp);
2437    tcg_temp_free(t0);
2438}
2439
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    /* calc V bit */
2450    tcg_gen_xor_tl(cpu_PSW_V, result, r1);
2451    tcg_gen_xor_tl(temp, result, r2);
2452    tcg_gen_movcond_tl(TCG_COND_GT, cpu_PSW_V, r1, r2, cpu_PSW_V, temp);
2453    tcg_gen_xor_tl(temp, r1, r2);
2454    tcg_gen_and_tl(cpu_PSW_V, cpu_PSW_V, temp);
2455    /* calc SV bit */
2456    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
2457    /* Calc AV bit */
2458    tcg_gen_add_tl(cpu_PSW_AV, result, result);
2459    tcg_gen_xor_tl(cpu_PSW_AV, result, cpu_PSW_AV);
2460    /* calc SAV bit */
2461    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2462    /* write back result */
2463    tcg_gen_mov_tl(ret, result);
2464
2465    tcg_temp_free(temp);
2466    tcg_temp_free(result);
2467}
2468
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    /* calc V bit */
2491    tcg_gen_sari_tl(low, low, 31);
2492    tcg_gen_setcond_tl(TCG_COND_NE, cpu_PSW_V, high, low);
2493    tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
2494    /* calc SV bit */
2495    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
2496    /* Calc AV bit */
2497    tcg_gen_add_tl(cpu_PSW_AV, ret, ret);
2498    tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV);
2499    /* calc SAV bit */
2500    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2501
2502    tcg_temp_free(high);
2503    tcg_temp_free(low);
2504}
2505
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    /* clear V bit */
2517    tcg_gen_movi_tl(cpu_PSW_V, 0);
2518    /* calc SV bit */
2519    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
2520    /* Calc AV bit */
2521    tcg_gen_add_tl(cpu_PSW_AV, ret_high, ret_high);
2522    tcg_gen_xor_tl(cpu_PSW_AV, ret_high, cpu_PSW_AV);
2523    /* calc SAV bit */
2524    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2525}
2526
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    /* clear V bit */
2539    tcg_gen_movi_tl(cpu_PSW_V, 0);
2540    /* calc SV bit */
2541    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
2542    /* Calc AV bit */
2543    tcg_gen_add_tl(cpu_PSW_AV, ret_high, ret_high);
2544    tcg_gen_xor_tl(cpu_PSW_AV, ret_high, cpu_PSW_AV);
2545    /* calc SAV bit */
2546    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2547}
2548
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/* gen_maddsi_32(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], const9); */
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        /* reset v bit */
2606        tcg_gen_movi_tl(cpu_PSW_V, 0);
2607    } else { /* n is expected to be 1 */
2608        tcg_gen_ext_i32_i64(temp_64, arg1);
2609        tcg_gen_ext_i32_i64(temp2_64, arg2);
2610
2611        tcg_gen_mul_i64(temp_64, temp_64, temp2_64);
2612
2613        if (up_shift == 0) {
2614            tcg_gen_shli_i64(temp_64, temp_64, 1);
2615        } else {
2616            tcg_gen_shri_i64(temp_64, temp_64, up_shift - 1);
2617        }
2618        tcg_gen_extr_i64_i32(rl, rh, temp_64);
2619        /* overflow only occurs if r1 = r2 = 0x8000 */
2620        if (up_shift == 0) {/* result is 64 bit */
2621            tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, rh,
2622                                0x80000000);
2623        } else { /* result is 32 bit */
2624            tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, rl,
2625                                0x80000000);
2626        }
2627        tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
2628        /* calc sv overflow bit */
2629        tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
2630    }
2631    /* calc av overflow bit */
2632    if (up_shift == 0) {
2633        tcg_gen_add_tl(cpu_PSW_AV, rh, rh);
2634        tcg_gen_xor_tl(cpu_PSW_AV, rh, cpu_PSW_AV);
2635    } else {
2636        tcg_gen_add_tl(cpu_PSW_AV, rl, rl);
2637        tcg_gen_xor_tl(cpu_PSW_AV, rl, cpu_PSW_AV);
2638    }
2639    /* calc sav overflow bit */
2640    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2641    tcg_temp_free(temp);
2642    tcg_temp_free_i64(temp_64);
2643    tcg_temp_free_i64(temp2_64);
2644}
2645
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 { /* n is expected to be 1 */
2653        tcg_gen_mul_tl(ret, arg1, arg2);
2654        tcg_gen_shli_tl(ret, ret, 1);
2655        /* catch special case r1 = r2 = 0x8000 */
2656        tcg_gen_setcondi_tl(TCG_COND_EQ, temp, ret, 0x80000000);
2657        tcg_gen_sub_tl(ret, ret, temp);
2658    }
2659    /* reset v bit */
2660    tcg_gen_movi_tl(cpu_PSW_V, 0);
2661    /* calc av overflow bit */
2662    tcg_gen_add_tl(cpu_PSW_AV, ret, ret);
2663    tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV);
2664    /* calc sav overflow bit */
2665    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2666
2667    tcg_temp_free(temp);
2668}
2669
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        /* catch special case r1 = r2 = 0x8000 */
2681        tcg_gen_setcondi_tl(TCG_COND_EQ, temp, ret, 0x80008000);
2682        tcg_gen_muli_tl(temp, temp, 0x8001);
2683        tcg_gen_sub_tl(ret, ret, temp);
2684    }
2685    /* reset v bit */
2686    tcg_gen_movi_tl(cpu_PSW_V, 0);
2687    /* calc av overflow bit */
2688    tcg_gen_add_tl(cpu_PSW_AV, ret, ret);
2689    tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV);
2690    /* calc sav overflow bit */
2691    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2692    /* cut halfword off */
2693    tcg_gen_andi_tl(ret, ret, 0xffff0000);
2694
2695    tcg_temp_free(temp);
2696}
2697
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    /* sat_neg = (arg < low ) ? low : arg; */
2798    tcg_gen_movcond_tl(TCG_COND_LT, sat_neg, arg, sat_neg, sat_neg, arg);
2799
2800    /* ret = (sat_neg > up ) ? up  : sat_neg; */
2801    tcg_gen_movcond_tl(TCG_COND_GT, ret, sat_neg, temp, temp, sat_neg);
2802
2803    tcg_temp_free(sat_neg);
2804    tcg_temp_free(temp);
2805}
2806
2807static void gen_saturate_u(TCGv ret, TCGv arg, int32_t up)
2808{
2809    TCGv temp = tcg_const_i32(up);
2810    /* sat_neg = (arg > up ) ? up : arg; */
2811    tcg_gen_movcond_tl(TCG_COND_GTU, ret, arg, temp, temp, arg);
2812    tcg_temp_free(temp);
2813}
2814
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        /* Clear PSW.C and PSW.V */
2856        tcg_gen_movi_tl(cpu_PSW_C, 0);
2857        tcg_gen_mov_tl(cpu_PSW_V, cpu_PSW_C);
2858        tcg_gen_mov_tl(ret, r1);
2859    } else if (shift_count == -32) {
2860        /* set PSW.C */
2861        tcg_gen_mov_tl(cpu_PSW_C, r1);
2862        /* fill ret completely with sign bit */
2863        tcg_gen_sari_tl(ret, r1, 31);
2864        /* clear PSW.V */
2865        tcg_gen_movi_tl(cpu_PSW_V, 0);
2866    } else if (shift_count > 0) {
2867        TCGv t_max = tcg_const_i32(0x7FFFFFFF >> shift_count);
2868        TCGv t_min = tcg_const_i32(((int32_t) -0x80000000) >> shift_count);
2869
2870        /* calc carry */
2871        msk_start = 32 - shift_count;
2872        msk = ((1 << shift_count) - 1) << msk_start;
2873        tcg_gen_andi_tl(cpu_PSW_C, r1, msk);
2874        /* calc v/sv bits */
2875        tcg_gen_setcond_tl(TCG_COND_GT, temp, r1, t_max);
2876        tcg_gen_setcond_tl(TCG_COND_LT, temp2, r1, t_min);
2877        tcg_gen_or_tl(cpu_PSW_V, temp, temp2);
2878        tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
2879        /* calc sv */
2880        tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_V, cpu_PSW_SV);
2881        /* do shift */
2882        tcg_gen_shli_tl(ret, r1, shift_count);
2883
2884        tcg_temp_free(t_max);
2885        tcg_temp_free(t_min);
2886    } else {
2887        /* clear PSW.V */
2888        tcg_gen_movi_tl(cpu_PSW_V, 0);
2889        /* calc carry */
2890        msk = (1 << -shift_count) - 1;
2891        tcg_gen_andi_tl(cpu_PSW_C, r1, msk);
2892        /* do shift */
2893        tcg_gen_sari_tl(ret, r1, -shift_count);
2894    }
2895    /* calc av overflow bit */
2896    tcg_gen_add_tl(cpu_PSW_AV, ret, ret);
2897    tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV);
2898    /* calc sav overflow bit */
2899    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
2900
2901    tcg_temp_free(temp);
2902    tcg_temp_free(temp2);
2903    tcg_temp_free(t_0);
2904}
2905
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/* ret = {ret[30:0], (r1 cond r2)}; */
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/* ret = r1[pos1] op1 r2[pos2]; */
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    /* temp = (arg1 cond arg2 )*/
3049    tcg_gen_setcond_tl(cond, temp, r1, r2);
3050    /* temp2 = ret[0]*/
3051    tcg_gen_andi_tl(temp2, ret, 0x1);
3052    /* temp = temp insn temp2 */
3053    (*op)(temp, temp, temp2);
3054    /* ret = {ret[31:1], temp} */
3055    tcg_gen_deposit_tl(ret, ret, temp, 0, 1);
3056
3057    tcg_temp_free(temp);
3058    tcg_temp_free(temp2);
3059}
3060
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/* ret = (r1 cond r2) ? 0xFFFFFFFF ? 0x00000000;*/
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    /* byte 0 */
3085    tcg_gen_andi_tl(b0, r1, 0xff);
3086    tcg_gen_setcondi_tl(TCG_COND_EQ, b0, b0, con & 0xff);
3087
3088    /* byte 1 */
3089    tcg_gen_andi_tl(b1, r1, 0xff00);
3090    tcg_gen_setcondi_tl(TCG_COND_EQ, b1, b1, con & 0xff00);
3091
3092    /* byte 2 */
3093    tcg_gen_andi_tl(b2, r1, 0xff0000);
3094    tcg_gen_setcondi_tl(TCG_COND_EQ, b2, b2, con & 0xff0000);
3095
3096    /* byte 3 */
3097    tcg_gen_andi_tl(b3, r1, 0xff000000);
3098    tcg_gen_setcondi_tl(TCG_COND_EQ, b3, b3, con & 0xff000000);
3099
3100    /* combine them */
3101    tcg_gen_or_tl(ret, b0, b1);
3102    tcg_gen_or_tl(ret, ret, b2);
3103    tcg_gen_or_tl(ret, ret, b3);
3104
3105    tcg_temp_free(b0);
3106    tcg_temp_free(b1);
3107    tcg_temp_free(b2);
3108    tcg_temp_free(b3);
3109}
3110
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    /* halfword 0 */
3117    tcg_gen_andi_tl(h0, r1, 0xffff);
3118    tcg_gen_setcondi_tl(TCG_COND_EQ, h0, h0, con & 0xffff);
3119
3120    /* halfword 1 */
3121    tcg_gen_andi_tl(h1, r1, 0xffff0000);
3122    tcg_gen_setcondi_tl(TCG_COND_EQ, h1, h1, con & 0xffff0000);
3123
3124    /* combine them */
3125    tcg_gen_or_tl(ret, h0, h1);
3126
3127    tcg_temp_free(h0);
3128    tcg_temp_free(h1);
3129}
3130/* mask = ((1 << width) -1) << pos;
3131   ret = (r1 & ~mask) | (r2 << pos) & mask); */
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    /* calc AV bit */
3207    tcg_gen_add_tl(temp, arg_low, arg_low);
3208    tcg_gen_xor_tl(temp, temp, arg_low);
3209    tcg_gen_add_tl(cpu_PSW_AV, arg_high, arg_high);
3210    tcg_gen_xor_tl(cpu_PSW_AV, cpu_PSW_AV, arg_high);
3211    tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp);
3212    /* calc SAV bit */
3213    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
3214    tcg_gen_movi_tl(cpu_PSW_V, 0);
3215    tcg_temp_free(temp);
3216}
3217
3218static void gen_calc_usb_mulr_h(TCGv arg)
3219{
3220    TCGv temp = tcg_temp_new();
3221    /* calc AV bit */
3222    tcg_gen_add_tl(temp, arg, arg);
3223    tcg_gen_xor_tl(temp, temp, arg);
3224    tcg_gen_shli_tl(cpu_PSW_AV, temp, 16);
3225    tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp);
3226    /* calc SAV bit */
3227    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
3228    /* clear V bit */
3229    tcg_gen_movi_tl(cpu_PSW_V, 0);
3230    tcg_temp_free(temp);
3231}
3232
3233/* helpers for generating program flow micro-ops */
3234
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            /* raise exception debug */
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/* SB-format jumps */
3346    case OPC1_16_SB_J:
3347    case OPC1_32_B_J:
3348        gen_goto_tb(ctx, 0, ctx->pc + offset * 2);
3349        break;
3350    case OPC1_32_B_CALL:
3351    case OPC1_16_SB_CALL:
3352        gen_helper_1arg(call, ctx->next_pc);
3353        gen_goto_tb(ctx, 0, ctx->pc + offset * 2);
3354        break;
3355    case OPC1_16_SB_JZ:
3356        gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_d[15], 0, offset);
3357        break;
3358    case OPC1_16_SB_JNZ:
3359        gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_d[15], 0, offset);
3360        break;
3361/* SBC-format jumps */
3362    case OPC1_16_SBC_JEQ:
3363        gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_d[15], constant, offset);
3364        break;
3365    case OPC1_16_SBC_JEQ2:
3366        gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_d[15], constant,
3367                         offset + 16);
3368        break;
3369    case OPC1_16_SBC_JNE:
3370        gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_d[15], constant, offset);
3371        break;
3372    case OPC1_16_SBC_JNE2:
3373        gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_d[15],
3374                         constant, offset + 16);
3375        break;
3376/* SBRN-format jumps */
3377    case OPC1_16_SBRN_JZ_T:
3378        temp = tcg_temp_new();
3379        tcg_gen_andi_tl(temp, cpu_gpr_d[15], 0x1u << constant);
3380        gen_branch_condi(ctx, TCG_COND_EQ, temp, 0, offset);
3381        tcg_temp_free(temp);
3382        break;
3383    case OPC1_16_SBRN_JNZ_T:
3384        temp = tcg_temp_new();
3385        tcg_gen_andi_tl(temp, cpu_gpr_d[15], 0x1u << constant);
3386        gen_branch_condi(ctx, TCG_COND_NE, temp, 0, offset);
3387        tcg_temp_free(temp);
3388        break;
3389/* SBR-format jumps */
3390    case OPC1_16_SBR_JEQ:
3391        gen_branch_cond(ctx, TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[15],
3392                        offset);
3393        break;
3394    case OPC1_16_SBR_JNE:
3395        gen_branch_cond(ctx, TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[15],
3396                        offset);
3397        break;
3398    case OPC1_16_SBR_JNZ:
3399        gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_d[r1], 0, offset);
3400        break;
3401    case OPC1_16_SBR_JNZ_A:
3402        gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_a[r1], 0, offset);
3403        break;
3404    case OPC1_16_SBR_JGEZ:
3405        gen_branch_condi(ctx, TCG_COND_GE, cpu_gpr_d[r1], 0, offset);
3406        break;
3407    case OPC1_16_SBR_JGTZ:
3408        gen_branch_condi(ctx, TCG_COND_GT, cpu_gpr_d[r1], 0, offset);
3409        break;
3410    case OPC1_16_SBR_JLEZ:
3411        gen_branch_condi(ctx, TCG_COND_LE, cpu_gpr_d[r1], 0, offset);
3412        break;
3413    case OPC1_16_SBR_JLTZ:
3414        gen_branch_condi(ctx, TCG_COND_LT, cpu_gpr_d[r1], 0, offset);
3415        break;
3416    case OPC1_16_SBR_JZ:
3417        gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_d[r1], 0, offset);
3418        break;
3419    case OPC1_16_SBR_JZ_A:
3420        gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_a[r1], 0, offset);
3421        break;
3422    case OPC1_16_SBR_LOOP:
3423        gen_loop(ctx, r1, offset * 2 - 32);
3424        break;
3425/* SR-format jumps */
3426    case OPC1_16_SR_JI:
3427        tcg_gen_andi_tl(cpu_PC, cpu_gpr_a[r1], 0xfffffffe);
3428        tcg_gen_exit_tb(0);
3429        break;
3430    case OPC2_32_SYS_RET:
3431    case OPC2_16_SR_RET:
3432        gen_helper_ret(cpu_env);
3433        tcg_gen_exit_tb(0);
3434        break;
3435/* B-format */
3436    case OPC1_32_B_CALLA:
3437        gen_helper_1arg(call, ctx->next_pc);
3438        gen_goto_tb(ctx, 0, EA_B_ABSOLUT(offset));
3439        break;
3440    case OPC1_32_B_FCALL:
3441        gen_fcall_save_ctx(ctx);
3442        gen_goto_tb(ctx, 0, ctx->pc + offset * 2);
3443        break;
3444    case OPC1_32_B_FCALLA:
3445        gen_fcall_save_ctx(ctx);
3446        gen_goto_tb(ctx, 0, EA_B_ABSOLUT(offset));
3447        break;
3448    case OPC1_32_B_JLA:
3449        tcg_gen_movi_tl(cpu_gpr_a[11], ctx->next_pc);
3450        /* fall through */
3451    case OPC1_32_B_JA:
3452        gen_goto_tb(ctx, 0, EA_B_ABSOLUT(offset));
3453        break;
3454    case OPC1_32_B_JL:
3455        tcg_gen_movi_tl(cpu_gpr_a[11], ctx->next_pc);
3456        gen_goto_tb(ctx, 0, ctx->pc + offset * 2);
3457        break;
3458/* BOL format */
3459    case OPCM_32_BRC_EQ_NEQ:
3460         if (MASK_OP_BRC_OP2(ctx->opcode) == OPC2_32_BRC_JEQ) {
3461            gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_d[r1], constant, offset);
3462         } else {
3463            gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_d[r1], constant, offset);
3464         }
3465         break;
3466    case OPCM_32_BRC_GE:
3467         if (MASK_OP_BRC_OP2(ctx->opcode) == OP2_32_BRC_JGE) {
3468            gen_branch_condi(ctx, TCG_COND_GE, cpu_gpr_d[r1], constant, offset);
3469         } else {
3470            constant = MASK_OP_BRC_CONST4(ctx->opcode);
3471            gen_branch_condi(ctx, TCG_COND_GEU, cpu_gpr_d[r1], constant,
3472                             offset);
3473         }
3474         break;
3475    case OPCM_32_BRC_JLT:
3476         if (MASK_OP_BRC_OP2(ctx->opcode) == OPC2_32_BRC_JLT) {
3477            gen_branch_condi(ctx, TCG_COND_LT, cpu_gpr_d[r1], constant, offset);
3478         } else {
3479            constant = MASK_OP_BRC_CONST4(ctx->opcode);
3480            gen_branch_condi(ctx, TCG_COND_LTU, cpu_gpr_d[r1], constant,
3481                             offset);
3482         }
3483         break;
3484    case OPCM_32_BRC_JNE:
3485        temp = tcg_temp_new();
3486        if (MASK_OP_BRC_OP2(ctx->opcode) == OPC2_32_BRC_JNED) {
3487            tcg_gen_mov_tl(temp, cpu_gpr_d[r1]);
3488            /* subi is unconditional */
3489            tcg_gen_subi_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 1);
3490            gen_branch_condi(ctx, TCG_COND_NE, temp, constant, offset);
3491        } else {
3492            tcg_gen_mov_tl(temp, cpu_gpr_d[r1]);
3493            /* addi is unconditional */
3494            tcg_gen_addi_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 1);
3495            gen_branch_condi(ctx, TCG_COND_NE, temp, constant, offset);
3496        }
3497        tcg_temp_free(temp);
3498        break;
3499/* BRN format */
3500    case OPCM_32_BRN_JTT:
3501        n = MASK_OP_BRN_N(ctx->opcode);
3502
3503        temp = tcg_temp_new();
3504        tcg_gen_andi_tl(temp, cpu_gpr_d[r1], (1 << n));
3505
3506        if (MASK_OP_BRN_OP2(ctx->opcode) == OPC2_32_BRN_JNZ_T) {
3507            gen_branch_condi(ctx, TCG_COND_NE, temp, 0, offset);
3508        } else {
3509            gen_branch_condi(ctx, TCG_COND_EQ, temp, 0, offset);
3510        }
3511        tcg_temp_free(temp);
3512        break;
3513/* BRR Format */
3514    case OPCM_32_BRR_EQ_NEQ:
3515        if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_JEQ) {
3516            gen_branch_cond(ctx, TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[r2],
3517                            offset);
3518        } else {
3519            gen_branch_cond(ctx, TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[r2],
3520                            offset);
3521        }
3522        break;
3523    case OPCM_32_BRR_ADDR_EQ_NEQ:
3524        if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_JEQ_A) {
3525            gen_branch_cond(ctx, TCG_COND_EQ, cpu_gpr_a[r1], cpu_gpr_a[r2],
3526                            offset);
3527        } else {
3528            gen_branch_cond(ctx, TCG_COND_NE, cpu_gpr_a[r1], cpu_gpr_a[r2],
3529                            offset);
3530        }
3531        break;
3532    case OPCM_32_BRR_GE:
3533        if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_JGE) {
3534            gen_branch_cond(ctx, TCG_COND_GE, cpu_gpr_d[r1], cpu_gpr_d[r2],
3535                            offset);
3536        } else {
3537            gen_branch_cond(ctx, TCG_COND_GEU, cpu_gpr_d[r1], cpu_gpr_d[r2],
3538                            offset);
3539        }
3540        break;
3541    case OPCM_32_BRR_JLT:
3542        if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_JLT) {
3543            gen_branch_cond(ctx, TCG_COND_LT, cpu_gpr_d[r1], cpu_gpr_d[r2],
3544                            offset);
3545        } else {
3546            gen_branch_cond(ctx, TCG_COND_LTU, cpu_gpr_d[r1], cpu_gpr_d[r2],
3547                            offset);
3548        }
3549        break;
3550    case OPCM_32_BRR_LOOP:
3551        if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_LOOP) {
3552            gen_loop(ctx, r2, offset * 2);
3553        } else {
3554            /* OPC2_32_BRR_LOOPU */
3555            gen_goto_tb(ctx, 0, ctx->pc + offset * 2);
3556        }
3557        break;
3558    case OPCM_32_BRR_JNE:
3559        temp = tcg_temp_new();
3560        temp2 = tcg_temp_new();
3561        if (MASK_OP_BRC_OP2(ctx->opcode) == OPC2_32_BRR_JNED) {
3562            tcg_gen_mov_tl(temp, cpu_gpr_d[r1]);
3563            /* also save r2, in case of r1 == r2, so r2 is not decremented */
3564            tcg_gen_mov_tl(temp2, cpu_gpr_d[r2]);
3565            /* subi is unconditional */
3566            tcg_gen_subi_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 1);
3567            gen_branch_cond(ctx, TCG_COND_NE, temp, temp2, offset);
3568        } else {
3569            tcg_gen_mov_tl(temp, cpu_gpr_d[r1]);
3570            /* also save r2, in case of r1 == r2, so r2 is not decremented */
3571            tcg_gen_mov_tl(temp2, cpu_gpr_d[r2]);
3572            /* addi is unconditional */
3573            tcg_gen_addi_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 1);
3574            gen_branch_cond(ctx, TCG_COND_NE, temp, temp2, offset);
3575        }
3576        tcg_temp_free(temp);
3577        tcg_temp_free(temp2);
3578        break;
3579    case OPCM_32_BRR_JNZ:
3580        if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_JNZ_A) {
3581            gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_a[r1], 0, offset);
3582        } else {
3583            gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_a[r1], 0, offset);
3584        }
3585        break;
3586    default:
3587        generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
3588    }
3589    ctx->bstate = BS_BRANCH;
3590}
3591
3592
3593/*
3594 * Functions for decoding instructions
3595 */
3596
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/* SLR-format */
3851    case OPC1_16_SLR_LD_A:
3852        tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESL);
3853        break;
3854    case OPC1_16_SLR_LD_A_POSTINC:
3855        tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESL);
3856        tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 4);
3857        break;
3858    case OPC1_16_SLR_LD_BU:
3859        tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_UB);
3860        break;
3861    case OPC1_16_SLR_LD_BU_POSTINC:
3862        tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_UB);
3863        tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 1);
3864        break;
3865    case OPC1_16_SLR_LD_H:
3866        tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESW);
3867        break;
3868    case OPC1_16_SLR_LD_H_POSTINC:
3869        tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESW);
3870        tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 2);
3871        break;
3872    case OPC1_16_SLR_LD_W:
3873        tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESL);
3874        break;
3875    case OPC1_16_SLR_LD_W_POSTINC:
3876        tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESL);
3877        tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 4);
3878        break;
3879    default:
3880        generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
3881    }
3882}
3883
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/* SRO-format */
3893    switch (op1) {
3894    case OPC1_16_SRO_LD_A:
3895        gen_offset_ld(ctx, cpu_gpr_a[15], cpu_gpr_a[r2], address * 4, MO_LESL);
3896        break;
3897    case OPC1_16_SRO_LD_BU:
3898        gen_offset_ld(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address, MO_UB);
3899        break;
3900    case OPC1_16_SRO_LD_H:
3901        gen_offset_ld(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address, MO_LESW);
3902        break;
3903    case OPC1_16_SRO_LD_W:
3904        gen_offset_ld(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address * 4, MO_LESL);
3905        break;
3906    case OPC1_16_SRO_ST_A:
3907        gen_offset_st(ctx, cpu_gpr_a[15], cpu_gpr_a[r2], address * 4, MO_LESL);
3908        break;
3909    case OPC1_16_SRO_ST_B:
3910        gen_offset_st(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address, MO_UB);
3911        break;
3912    case OPC1_16_SRO_ST_H:
3913        gen_offset_st(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address * 2, MO_LESW);
3914        break;
3915    case OPC1_16_SRO_ST_W:
3916        gen_offset_st(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address * 4, MO_LESL);
3917        break;
3918    default:
3919        generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
3920    }
3921}
3922
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        /* raise EXCP_DEBUG */
3941        break;
3942    case OPC2_16_SR_FRET:
3943        gen_fret(ctx);
3944        break;
3945    default:
3946        generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
3947    }
3948}
3949
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        /* overflow only if r1 = -0x80000000 */
3962        temp = tcg_const_i32(-0x80000000);
3963        /* calc V bit */
3964        tcg_gen_setcond_tl(TCG_COND_EQ, cpu_PSW_V, cpu_gpr_d[r1], temp);
3965        tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
3966        /* calc SV bit */
3967        tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
3968        /* sub */
3969        tcg_gen_neg_tl(cpu_gpr_d[r1], cpu_gpr_d[r1]);
3970        /* calc av */
3971        tcg_gen_add_tl(cpu_PSW_AV, cpu_gpr_d[r1], cpu_gpr_d[r1]);
3972        tcg_gen_xor_tl(cpu_PSW_AV, cpu_gpr_d[r1], cpu_PSW_AV);
3973        /* calc sav */
3974        tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
3975        tcg_temp_free(temp);
3976        break;
3977    case OPC2_16_SR_SAT_B:
3978        gen_saturate(cpu_gpr_d[r1], cpu_gpr_d[r1], 0x7f, -0x80);
3979        break;
3980    case OPC2_16_SR_SAT_BU:
3981        gen_saturate_u(cpu_gpr_d[r1], cpu_gpr_d[r1], 0xff);
3982        break;
3983    case OPC2_16_SR_SAT_H:
3984        gen_saturate(cpu_gpr_d[r1], cpu_gpr_d[r1], 0x7fff, -0x8000);
3985        break;
3986    case OPC2_16_SR_SAT_HU:
3987        gen_saturate_u(cpu_gpr_d[r1], cpu_gpr_d[r1], 0xffff);
3988        break;
3989    default:
3990        generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
3991    }
3992}
3993
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    /* handle ADDSC.A opcode only being 6 bit long */
4005    if (unlikely((op1 & 0x3f) == OPC1_16_SRRS_ADDSC_A)) {
4006        op1 = OPC1_16_SRRS_ADDSC_A;
4007    }
4008
4009    switch (op1) {
4010    case OPC1_16_SRC_ADD:
4011    case OPC1_16_SRC_ADD_A15:
4012    case OPC1_16_SRC_ADD_15A:
4013    case OPC1_16_SRC_ADD_A:
4014    case OPC1_16_SRC_CADD:
4015    case OPC1_16_SRC_CADDN:
4016    case OPC1_16_SRC_CMOV:
4017    case OPC1_16_SRC_CMOVN:
4018    case OPC1_16_SRC_EQ:
4019    case OPC1_16_SRC_LT:
4020    case OPC1_16_SRC_MOV:
4021    case OPC1_16_SRC_MOV_A:
4022    case OPC1_16_SRC_MOV_E:
4023    case OPC1_16_SRC_SH:
4024    case OPC1_16_SRC_SHA:
4025        decode_src_opc(env, ctx, op1);
4026        break;
4027/* SRR-format */
4028    case OPC1_16_SRR_ADD:
4029    case OPC1_16_SRR_ADD_A15:
4030    case OPC1_16_SRR_ADD_15A:
4031    case OPC1_16_SRR_ADD_A:
4032    case OPC1_16_SRR_ADDS:
4033    case OPC1_16_SRR_AND:
4034    case OPC1_16_SRR_CMOV:
4035    case OPC1_16_SRR_CMOVN:
4036    case OPC1_16_SRR_EQ:
4037    case OPC1_16_SRR_LT:
4038    case OPC1_16_SRR_MOV:
4039    case OPC1_16_SRR_MOV_A:
4040    case OPC1_16_SRR_MOV_AA:
4041    case OPC1_16_SRR_MOV_D:
4042    case OPC1_16_SRR_MUL:
4043    case OPC1_16_SRR_OR:
4044    case OPC1_16_SRR_SUB:
4045    case OPC1_16_SRR_SUB_A15B:
4046    case OPC1_16_SRR_SUB_15AB:
4047    case OPC1_16_SRR_SUBS:
4048    case OPC1_16_SRR_XOR:
4049        decode_srr_opc(ctx, op1);
4050        break;
4051/* SSR-format */
4052    case OPC1_16_SSR_ST_A:
4053    case OPC1_16_SSR_ST_A_POSTINC:
4054    case OPC1_16_SSR_ST_B:
4055    case OPC1_16_SSR_ST_B_POSTINC:
4056    case OPC1_16_SSR_ST_H:
4057    case OPC1_16_SSR_ST_H_POSTINC:
4058    case OPC1_16_SSR_ST_W:
4059    case OPC1_16_SSR_ST_W_POSTINC:
4060        decode_ssr_opc(ctx, op1);
4061        break;
4062/* SRRS-format */
4063    case OPC1_16_SRRS_ADDSC_A:
4064        r2 = MASK_OP_SRRS_S2(ctx->opcode);
4065        r1 = MASK_OP_SRRS_S1D(ctx->opcode);
4066        const16 = MASK_OP_SRRS_N(ctx->opcode);
4067        temp = tcg_temp_new();
4068        tcg_gen_shli_tl(temp, cpu_gpr_d[15], const16);
4069        tcg_gen_add_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], temp);
4070        tcg_temp_free(temp);
4071        break;
4072/* SLRO-format */
4073    case OPC1_16_SLRO_LD_A:
4074        r1 = MASK_OP_SLRO_D(ctx->opcode);
4075        const16 = MASK_OP_SLRO_OFF4(ctx->opcode);
4076        gen_offset_ld(ctx, cpu_gpr_a[r1], cpu_gpr_a[15], const16 * 4, MO_LESL);
4077        break;
4078    case OPC1_16_SLRO_LD_BU:
4079        r1 = MASK_OP_SLRO_D(ctx->opcode);
4080        const16 = MASK_OP_SLRO_OFF4(ctx->opcode);
4081        gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16, MO_UB);
4082        break;
4083    case OPC1_16_SLRO_LD_H:
4084        r1 = MASK_OP_SLRO_D(ctx->opcode);
4085        const16 = MASK_OP_SLRO_OFF4(ctx->opcode);
4086        gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16 * 2, MO_LESW);
4087        break;
4088    case OPC1_16_SLRO_LD_W:
4089        r1 = MASK_OP_SLRO_D(ctx->opcode);
4090        const16 = MASK_OP_SLRO_OFF4(ctx->opcode);
4091        gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16 * 4, MO_LESL);
4092        break;
4093/* SB-format */
4094    case OPC1_16_SB_CALL:
4095    case OPC1_16_SB_J:
4096    case OPC1_16_SB_JNZ:
4097    case OPC1_16_SB_JZ:
4098        address = MASK_OP_SB_DISP8_SEXT(ctx->opcode);
4099        gen_compute_branch(ctx, op1, 0, 0, 0, address);
4100        break;
4101/* SBC-format */
4102    case OPC1_16_SBC_JEQ:
4103    case OPC1_16_SBC_JNE:
4104        address = MASK_OP_SBC_DISP4(ctx->opcode);
4105        const16 = MASK_OP_SBC_CONST4_SEXT(ctx->opcode);
4106        gen_compute_branch(ctx, op1, 0, 0, const16, address);
4107        break;
4108    case OPC1_16_SBC_JEQ2:
4109    case OPC1_16_SBC_JNE2:
4110        if (tricore_feature(env, TRICORE_FEATURE_16)) {
4111            address = MASK_OP_SBC_DISP4(ctx->opcode);
4112            const16 = MASK_OP_SBC_CONST4_SEXT(ctx->opcode);
4113            gen_compute_branch(ctx, op1, 0, 0, const16, address);
4114        } else {
4115            generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4116        }
4117        break;
4118/* SBRN-format */
4119    case OPC1_16_SBRN_JNZ_T:
4120    case OPC1_16_SBRN_JZ_T:
4121        address = MASK_OP_SBRN_DISP4(ctx->opcode);
4122        const16 = MASK_OP_SBRN_N(ctx->opcode);
4123        gen_compute_branch(ctx, op1, 0, 0, const16, address);
4124        break;
4125/* SBR-format */
4126    case OPC1_16_SBR_JEQ:
4127    case OPC1_16_SBR_JGEZ:
4128    case OPC1_16_SBR_JGTZ:
4129    case OPC1_16_SBR_JLEZ:
4130    case OPC1_16_SBR_JLTZ:
4131    case OPC1_16_SBR_JNE:
4132    case OPC1_16_SBR_JNZ:
4133    case OPC1_16_SBR_JNZ_A:
4134    case OPC1_16_SBR_JZ:
4135    case OPC1_16_SBR_JZ_A:
4136    case OPC1_16_SBR_LOOP:
4137        r1 = MASK_OP_SBR_S2(ctx->opcode);
4138        address = MASK_OP_SBR_DISP4(ctx->opcode);
4139        gen_compute_branch(ctx, op1, r1, 0, 0, address);
4140        break;
4141/* SC-format */
4142    case OPC1_16_SC_AND:
4143    case OPC1_16_SC_BISR:
4144    case OPC1_16_SC_LD_A:
4145    case OPC1_16_SC_LD_W:
4146    case OPC1_16_SC_MOV:
4147    case OPC1_16_SC_OR:
4148    case OPC1_16_SC_ST_A:
4149    case OPC1_16_SC_ST_W:
4150    case OPC1_16_SC_SUB_A:
4151        decode_sc_opc(ctx, op1);
4152        break;
4153/* SLR-format */
4154    case OPC1_16_SLR_LD_A:
4155    case OPC1_16_SLR_LD_A_POSTINC:
4156    case OPC1_16_SLR_LD_BU:
4157    case OPC1_16_SLR_LD_BU_POSTINC:
4158    case OPC1_16_SLR_LD_H:
4159    case OPC1_16_SLR_LD_H_POSTINC:
4160    case OPC1_16_SLR_LD_W:
4161    case OPC1_16_SLR_LD_W_POSTINC:
4162        decode_slr_opc(ctx, op1);
4163        break;
4164/* SRO-format */
4165    case OPC1_16_SRO_LD_A:
4166    case OPC1_16_SRO_LD_BU:
4167    case OPC1_16_SRO_LD_H:
4168    case OPC1_16_SRO_LD_W:
4169    case OPC1_16_SRO_ST_A:
4170    case OPC1_16_SRO_ST_B:
4171    case OPC1_16_SRO_ST_H:
4172    case OPC1_16_SRO_ST_W:
4173        decode_sro_opc(ctx, op1);
4174        break;
4175/* SSRO-format */
4176    case OPC1_16_SSRO_ST_A:
4177        r1 = MASK_OP_SSRO_S1(ctx->opcode);
4178        const16 = MASK_OP_SSRO_OFF4(ctx->opcode);
4179        gen_offset_st(ctx, cpu_gpr_a[r1], cpu_gpr_a[15], const16 * 4, MO_LESL);
4180        break;
4181    case OPC1_16_SSRO_ST_B:
4182        r1 = MASK_OP_SSRO_S1(ctx->opcode);
4183        const16 = MASK_OP_SSRO_OFF4(ctx->opcode);
4184        gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16, MO_UB);
4185        break;
4186    case OPC1_16_SSRO_ST_H:
4187        r1 = MASK_OP_SSRO_S1(ctx->opcode);
4188        const16 = MASK_OP_SSRO_OFF4(ctx->opcode);
4189        gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16 * 2, MO_LESW);
4190        break;
4191    case OPC1_16_SSRO_ST_W:
4192        r1 = MASK_OP_SSRO_S1(ctx->opcode);
4193        const16 = MASK_OP_SSRO_OFF4(ctx->opcode);
4194        gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16 * 4, MO_LESL);
4195        break;
4196/* SR-format */
4197    case OPCM_16_SR_SYSTEM:
4198        decode_sr_system(env, ctx);
4199        break;
4200    case OPCM_16_SR_ACCU:
4201        decode_sr_accu(env, ctx);
4202        break;
4203    case OPC1_16_SR_JI:
4204        r1 = MASK_OP_SR_S1D(ctx->opcode);
4205        gen_compute_branch(ctx, op1, r1, 0, 0, 0);
4206        break;
4207    case OPC1_16_SR_NOT:
4208        r1 = MASK_OP_SR_S1D(ctx->opcode);
4209        tcg_gen_not_tl(cpu_gpr_d[r1], cpu_gpr_d[r1]);
4210        break;
4211    default:
4212        generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4213    }
4214}
4215
4216/*
4217 * 32 bit instructions
4218 */
4219
4220/* ABS-format */
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/* Bit-format */
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/* BO-format */
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        /* instruction to access the cache */
4682        break;
4683    case OPC2_32_BO_CACHEA_WI_POSTINC:
4684    case OPC2_32_BO_CACHEA_W_POSTINC:
4685    case OPC2_32_BO_CACHEA_I_POSTINC:
4686        /* instruction to access the cache, but we still need to handle
4687           the addressing mode */
4688        tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4689        break;
4690    case OPC2_32_BO_CACHEA_WI_PREINC:
4691    case OPC2_32_BO_CACHEA_W_PREINC:
4692    case OPC2_32_BO_CACHEA_I_PREINC:
4693        /* instruction to access the cache, but we still need to handle
4694           the addressing mode */
4695        tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4696        break;
4697    case OPC2_32_BO_CACHEI_WI_SHORTOFF:
4698    case OPC2_32_BO_CACHEI_W_SHORTOFF:
4699        if (!tricore_feature(env, TRICORE_FEATURE_131)) {
4700            generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4701        }
4702        break;
4703    case OPC2_32_BO_CACHEI_W_POSTINC:
4704    case OPC2_32_BO_CACHEI_WI_POSTINC:
4705        if (tricore_feature(env, TRICORE_FEATURE_131)) {
4706            tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4707        } else {
4708            generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4709        }
4710        break;
4711    case OPC2_32_BO_CACHEI_W_PREINC:
4712    case OPC2_32_BO_CACHEI_WI_PREINC:
4713        if (tricore_feature(env, TRICORE_FEATURE_131)) {
4714            tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4715        } else {
4716            generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4717        }
4718        break;
4719    case OPC2_32_BO_ST_A_SHORTOFF:
4720        gen_offset_st(ctx, cpu_gpr_a[r1], cpu_gpr_a[r2], off10, MO_LESL);
4721        break;
4722    case OPC2_32_BO_ST_A_POSTINC:
4723        tcg_gen_qemu_st_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], ctx->mem_idx,
4724                           MO_LESL);
4725        tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4726        break;
4727    case OPC2_32_BO_ST_A_PREINC:
4728        gen_st_preincr(ctx, cpu_gpr_a[r1], cpu_gpr_a[r2], off10, MO_LESL);
4729        break;
4730    case OPC2_32_BO_ST_B_SHORTOFF:
4731        gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_UB);
4732        break;
4733    case OPC2_32_BO_ST_B_POSTINC:
4734        tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx,
4735                           MO_UB);
4736        tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4737        break;
4738    case OPC2_32_BO_ST_B_PREINC:
4739        gen_st_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_UB);
4740        break;
4741    case OPC2_32_BO_ST_D_SHORTOFF:
4742        CHECK_REG_PAIR(r1);
4743        gen_offset_st_2regs(cpu_gpr_d[r1+1], cpu_gpr_d[r1], cpu_gpr_a[r2],
4744                            off10, ctx);
4745        break;
4746    case OPC2_32_BO_ST_D_POSTINC:
4747        CHECK_REG_PAIR(r1);
4748        gen_st_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], cpu_gpr_a[r2], ctx);
4749        tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4750        break;
4751    case OPC2_32_BO_ST_D_PREINC:
4752        CHECK_REG_PAIR(r1);
4753        temp = tcg_temp_new();
4754        tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10);
4755        gen_st_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], temp, ctx);
4756        tcg_gen_mov_tl(cpu_gpr_a[r2], temp);
4757        tcg_temp_free(temp);
4758        break;
4759    case OPC2_32_BO_ST_DA_SHORTOFF:
4760        CHECK_REG_PAIR(r1);
4761        gen_offset_st_2regs(cpu_gpr_a[r1+1], cpu_gpr_a[r1], cpu_gpr_a[r2],
4762                            off10, ctx);
4763        break;
4764    case OPC2_32_BO_ST_DA_POSTINC:
4765        CHECK_REG_PAIR(r1);
4766        gen_st_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], cpu_gpr_a[r2], ctx);
4767        tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4768        break;
4769    case OPC2_32_BO_ST_DA_PREINC:
4770        CHECK_REG_PAIR(r1);
4771        temp = tcg_temp_new();
4772        tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10);
4773        gen_st_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], temp, ctx);
4774        tcg_gen_mov_tl(cpu_gpr_a[r2], temp);
4775        tcg_temp_free(temp);
4776        break;
4777    case OPC2_32_BO_ST_H_SHORTOFF:
4778        gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUW);
4779        break;
4780    case OPC2_32_BO_ST_H_POSTINC:
4781        tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx,
4782                           MO_LEUW);
4783        tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4784        break;
4785    case OPC2_32_BO_ST_H_PREINC:
4786        gen_st_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUW);
4787        break;
4788    case OPC2_32_BO_ST_Q_SHORTOFF:
4789        temp = tcg_temp_new();
4790        tcg_gen_shri_tl(temp, cpu_gpr_d[r1], 16);
4791        gen_offset_st(ctx, temp, cpu_gpr_a[r2], off10, MO_LEUW);
4792        tcg_temp_free(temp);
4793        break;
4794    case OPC2_32_BO_ST_Q_POSTINC:
4795        temp = tcg_temp_new();
4796        tcg_gen_shri_tl(temp, cpu_gpr_d[r1], 16);
4797        tcg_gen_qemu_st_tl(temp, cpu_gpr_a[r2], ctx->mem_idx,
4798                           MO_LEUW);
4799        tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4800        tcg_temp_free(temp);
4801        break;
4802    case OPC2_32_BO_ST_Q_PREINC:
4803        temp = tcg_temp_new();
4804        tcg_gen_shri_tl(temp, cpu_gpr_d[r1], 16);
4805        gen_st_preincr(ctx, temp, cpu_gpr_a[r2], off10, MO_LEUW);
4806        tcg_temp_free(temp);
4807        break;
4808    case OPC2_32_BO_ST_W_SHORTOFF:
4809        gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUL);
4810        break;
4811    case OPC2_32_BO_ST_W_POSTINC:
4812        tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx,
4813                           MO_LEUL);
4814        tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10);
4815        break;
4816    case OPC2_32_BO_ST_W_PREINC:
4817        gen_st_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUL);
4818        break;
4819    default:
4820        generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
4821    }
4822}
4823
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/* RC format */
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        /* TODO: Add exception generation */
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/* RCPW format */
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        /* if pos + width > 31 undefined result */
5773        if (pos + width <= 31) {
5774            tcg_gen_movi_tl(cpu_gpr_d[r2+1], ((1u << width) - 1) << pos);
5775            tcg_gen_movi_tl(cpu_gpr_d[r2], (const4 << pos));
5776        }
5777        break;
5778    case OPC2_32_RCPW_INSERT:
5779        /* if pos + width > 32 undefined result */
5780        if (pos + width <= 32) {
5781            temp = tcg_const_i32(const4);
5782            tcg_gen_deposit_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], temp, pos, width);
5783            tcg_temp_free(temp);
5784        }
5785        break;
5786    default:
5787        generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
5788    }
5789}
5790
5791/* RCRW format */
5792
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/* RCR format */
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/* RLC format */
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/* RR format */
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        /* reset av */
6592        tcg_gen_movi_tl(cpu_PSW_AV, 0);
6593        if (!tricore_feature(env, TRICORE_FEATURE_131)) {
6594            /* overflow = (abs(D[r3+1]) >= abs(D[r2])) */
6595            tcg_gen_neg_tl(temp, temp3);
6596            /* use cpu_PSW_AV to compare against 0 */
6597            tcg_gen_movcond_tl(TCG_COND_LT, temp, temp3, cpu_PSW_AV,
6598                               temp, temp3);
6599            tcg_gen_neg_tl(temp2, cpu_gpr_d[r2]);
6600            tcg_gen_movcond_tl(TCG_COND_LT, temp2, cpu_gpr_d[r2], cpu_PSW_AV,
6601                               temp2, cpu_gpr_d[r2]);
6602            tcg_gen_setcond_tl(TCG_COND_GE, cpu_PSW_V, temp, temp2);
6603        } else {
6604            /* overflow = (D[b] == 0) */
6605            tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, cpu_gpr_d[r2], 0);
6606        }
6607        tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
6608        /* sv */
6609        tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
6610        /* write result */
6611        tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], 24);
6612        tcg_gen_mov_tl(cpu_gpr_d[r3+1], temp3);
6613
6614        tcg_temp_free(temp);
6615        tcg_temp_free(temp2);
6616        tcg_temp_free(temp3);
6617        break;
6618    case OPC2_32_RR_DVINIT_H:
6619        CHECK_REG_PAIR(r3);
6620        gen_dvinit_h(env, cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1],
6621                     cpu_gpr_d[r2]);
6622        break;
6623    case OPC2_32_RR_DVINIT_HU:
6624        temp = tcg_temp_new();
6625        temp2 = tcg_temp_new();
6626        temp3 = tcg_temp_new();
6627        CHECK_REG_PAIR(r3);
6628        tcg_gen_shri_tl(temp3, cpu_gpr_d[r1], 16);
6629        /* reset av */
6630        tcg_gen_movi_tl(cpu_PSW_AV, 0);
6631        if (!tricore_feature(env, TRICORE_FEATURE_131)) {
6632            /* overflow = (abs(D[r3+1]) >= abs(D[r2])) */
6633            tcg_gen_neg_tl(temp, temp3);
6634            /* use cpu_PSW_AV to compare against 0 */
6635            tcg_gen_movcond_tl(TCG_COND_LT, temp, temp3, cpu_PSW_AV,
6636                               temp, temp3);
6637            tcg_gen_neg_tl(temp2, cpu_gpr_d[r2]);
6638            tcg_gen_movcond_tl(TCG_COND_LT, temp2, cpu_gpr_d[r2], cpu_PSW_AV,
6639                               temp2, cpu_gpr_d[r2]);
6640            tcg_gen_setcond_tl(TCG_COND_GE, cpu_PSW_V, temp, temp2);
6641        } else {
6642            /* overflow = (D[b] == 0) */
6643            tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, cpu_gpr_d[r2], 0);
6644        }
6645        tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
6646        /* sv */
6647        tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
6648        /* write result */
6649        tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], 16);
6650        tcg_gen_mov_tl(cpu_gpr_d[r3+1], temp3);
6651        tcg_temp_free(temp);
6652        tcg_temp_free(temp2);
6653        tcg_temp_free(temp3);
6654        break;
6655    case OPC2_32_RR_DVINIT:
6656        temp = tcg_temp_new();
6657        temp2 = tcg_temp_new();
6658        CHECK_REG_PAIR(r3);
6659        /* overflow = ((D[b] == 0) ||
6660                      ((D[b] == 0xFFFFFFFF) && (D[a] == 0x80000000))) */
6661        tcg_gen_setcondi_tl(TCG_COND_EQ, temp, cpu_gpr_d[r2], 0xffffffff);
6662        tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, cpu_gpr_d[r1], 0x80000000);
6663        tcg_gen_and_tl(temp, temp, temp2);
6664        tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, cpu_gpr_d[r2], 0);
6665        tcg_gen_or_tl(cpu_PSW_V, temp, temp2);
6666        tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
6667        /* sv */
6668        tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
6669        /* reset av */
6670       tcg_gen_movi_tl(cpu_PSW_AV, 0);
6671        /* write result */
6672        tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]);
6673        /* sign extend to high reg */
6674        tcg_gen_sari_tl(cpu_gpr_d[r3+1], cpu_gpr_d[r1], 31);
6675        tcg_temp_free(temp);
6676        tcg_temp_free(temp2);
6677        break;
6678    case OPC2_32_RR_DVINIT_U:
6679        /* overflow = (D[b] == 0) */
6680        tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, cpu_gpr_d[r2], 0);
6681        tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
6682        /* sv */
6683        tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
6684        /* reset av */
6685        tcg_gen_movi_tl(cpu_PSW_AV, 0);
6686        /* write result */
6687        tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]);
6688        /* zero extend to high reg*/
6689        tcg_gen_movi_tl(cpu_gpr_d[r3+1], 0);
6690        break;
6691    case OPC2_32_RR_PARITY:
6692        gen_helper_parity(cpu_gpr_d[r3], cpu_gpr_d[r1]);
6693        break;
6694    case OPC2_32_RR_UNPACK:
6695        CHECK_REG_PAIR(r3);
6696        gen_unpack(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1]);
6697        break;
6698    case OPC2_32_RR_CRC32:
6699        if (tricore_feature(env, TRICORE_FEATURE_161)) {
6700            gen_helper_crc32(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
6701        } else {
6702            generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6703        }
6704        break;
6705    case OPC2_32_RR_DIV:
6706        if (tricore_feature(env, TRICORE_FEATURE_16)) {
6707            GEN_HELPER_RR(divide, cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1],
6708                          cpu_gpr_d[r2]);
6709        } else {
6710            generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6711        }
6712        break;
6713    case OPC2_32_RR_DIV_U:
6714        if (tricore_feature(env, TRICORE_FEATURE_16)) {
6715            GEN_HELPER_RR(divide_u, cpu_gpr_d[r3], cpu_gpr_d[r3+1],
6716                          cpu_gpr_d[r1], cpu_gpr_d[r2]);
6717        } else {
6718            generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6719        }
6720        break;
6721    case OPC2_32_RR_MUL_F:
6722        gen_helper_fmul(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
6723        break;
6724    case OPC2_32_RR_DIV_F:
6725        gen_helper_fdiv(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
6726        break;
6727    case OPC2_32_RR_CMP_F:
6728        gen_helper_fcmp(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
6729        break;
6730    case OPC2_32_RR_FTOI:
6731        gen_helper_ftoi(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
6732        break;
6733    case OPC2_32_RR_ITOF:
6734        gen_helper_itof(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
6735        break;
6736    case OPC2_32_RR_FTOUZ:
6737        gen_helper_ftouz(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
6738        break;
6739    case OPC2_32_RR_UPDFL:
6740        gen_helper_updfl(cpu_env, cpu_gpr_d[r1]);
6741        break;
6742    default:
6743        generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6744    }
6745}
6746
6747/* RR1 Format */
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        /* reset V bit */
6801        tcg_gen_movi_tl(cpu_PSW_V, 0);
6802        /* reset AV bit */
6803        tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V);
6804        tcg_temp_free_i64(temp64);
6805        break;
6806    case OPC2_32_RR1_MULM_H_64_LU:
6807        temp64 = tcg_temp_new_i64();
6808        CHECK_REG_PAIR(r3);
6809        GEN_HELPER_LU(mulm_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6810        tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
6811        /* reset V bit */
6812        tcg_gen_movi_tl(cpu_PSW_V, 0);
6813        /* reset AV bit */
6814        tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V);
6815        tcg_temp_free_i64(temp64);
6816        break;
6817    case OPC2_32_RR1_MULM_H_64_UL:
6818        temp64 = tcg_temp_new_i64();
6819        CHECK_REG_PAIR(r3);
6820        GEN_HELPER_UL(mulm_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6821        tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
6822        /* reset V bit */
6823        tcg_gen_movi_tl(cpu_PSW_V, 0);
6824        /* reset AV bit */
6825        tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V);
6826        tcg_temp_free_i64(temp64);
6827        break;
6828    case OPC2_32_RR1_MULM_H_64_UU:
6829        temp64 = tcg_temp_new_i64();
6830        CHECK_REG_PAIR(r3);
6831        GEN_HELPER_UU(mulm_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6832        tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
6833        /* reset V bit */
6834        tcg_gen_movi_tl(cpu_PSW_V, 0);
6835        /* reset AV bit */
6836        tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V);
6837        tcg_temp_free_i64(temp64);
6838
6839        break;
6840    case OPC2_32_RR1_MULR_H_16_LL:
6841        GEN_HELPER_LL(mulr_h, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6842        gen_calc_usb_mulr_h(cpu_gpr_d[r3]);
6843        break;
6844    case OPC2_32_RR1_MULR_H_16_LU:
6845        GEN_HELPER_LU(mulr_h, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6846        gen_calc_usb_mulr_h(cpu_gpr_d[r3]);
6847        break;
6848    case OPC2_32_RR1_MULR_H_16_UL:
6849        GEN_HELPER_UL(mulr_h, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6850        gen_calc_usb_mulr_h(cpu_gpr_d[r3]);
6851        break;
6852    case OPC2_32_RR1_MULR_H_16_UU:
6853        GEN_HELPER_UU(mulr_h, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], n);
6854        gen_calc_usb_mulr_h(cpu_gpr_d[r3]);
6855        break;
6856    default:
6857        generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
6858    }
6859    tcg_temp_free(n);
6860}
6861
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/* RR2 format */
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/* RRPW format */
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            /* optimize special cases */
6988            if ((pos == 0) && (width == 8)) {
6989                tcg_gen_ext8s_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]);
6990            } else if ((pos == 0) && (width == 16)) {
6991                tcg_gen_ext16s_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]);
6992            } else {
6993                tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], 32 - pos - width);
6994                tcg_gen_sari_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], 32 - width);
6995            }
6996        }
6997        break;
6998    case OPC2_32_RRPW_EXTR_U:
6999        if (width == 0) {
7000            tcg_gen_movi_tl(cpu_gpr_d[r3], 0);
7001        } else {
7002            tcg_gen_shri_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], pos);
7003            tcg_gen_andi_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], ~0u >> (32-width));
7004        }
7005        break;
7006    case OPC2_32_RRPW_IMASK:
7007        CHECK_REG_PAIR(r3);
7008        if (pos + width <= 31) {
7009            tcg_gen_movi_tl(cpu_gpr_d[r3+1], ((1u << width) - 1) << pos);
7010            tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r2], pos);
7011        }
7012        break;
7013    case OPC2_32_RRPW_INSERT:
7014        if (pos + width <= 31) {
7015            tcg_gen_deposit_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
7016                               width, pos);
7017        }
7018        break;
7019    default:
7020        generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
7021    }
7022}
7023
7024/* RRR format */
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/* RRR2 format */
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/* RRR1 format */
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/* RRRR format */
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/* RRRW format */
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/* SYS Format*/
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        /* raise EXCP_DEBUG */
8355        break;
8356    case OPC2_32_SYS_DISABLE:
8357        tcg_gen_andi_tl(cpu_ICR, cpu_ICR, ~MASK_ICR_IE);
8358        break;
8359    case OPC2_32_SYS_DSYNC:
8360        break;
8361    case OPC2_32_SYS_ENABLE:
8362        tcg_gen_ori_tl(cpu_ICR, cpu_ICR, MASK_ICR_IE);
8363        break;
8364    case OPC2_32_SYS_ISYNC:
8365        break;
8366    case OPC2_32_SYS_NOP:
8367        break;
8368    case OPC2_32_SYS_RET:
8369        gen_compute_branch(ctx, op2, 0, 0, 0, 0);
8370        break;
8371    case OPC2_32_SYS_FRET:
8372        gen_fret(ctx);
8373        break;
8374    case OPC2_32_SYS_RFE:
8375        gen_helper_rfe(cpu_env);
8376        tcg_gen_exit_tb(0);
8377        ctx->bstate = BS_BRANCH;
8378        break;
8379    case OPC2_32_SYS_RFM:
8380        if ((ctx->hflags & TRICORE_HFLAG_KUU) == TRICORE_HFLAG_SM) {
8381            tmp = tcg_temp_new();
8382            l1 = gen_new_label();
8383
8384            tcg_gen_ld32u_tl(tmp, cpu_env, offsetof(CPUTriCoreState, DBGSR));
8385            tcg_gen_andi_tl(tmp, tmp, MASK_DBGSR_DE);
8386            tcg_gen_brcondi_tl(TCG_COND_NE, tmp, 1, l1);
8387            gen_helper_rfm(cpu_env);
8388            gen_set_label(l1);
8389            tcg_gen_exit_tb(0);
8390            ctx->bstate = BS_BRANCH;
8391            tcg_temp_free(tmp);
8392        } else {
8393            /* generate privilege trap */
8394        }
8395        break;
8396    case OPC2_32_SYS_RSLCX:
8397        gen_helper_rslcx(cpu_env);
8398        break;
8399    case OPC2_32_SYS_SVLCX:
8400        gen_helper_svlcx(cpu_env);
8401        break;
8402    case OPC2_32_SYS_RESTORE:
8403        if (tricore_feature(env, TRICORE_FEATURE_16)) {
8404            if ((ctx->hflags & TRICORE_HFLAG_KUU) == TRICORE_HFLAG_SM ||
8405                (ctx->hflags & TRICORE_HFLAG_KUU) == TRICORE_HFLAG_UM1) {
8406                tcg_gen_deposit_tl(cpu_ICR, cpu_ICR, cpu_gpr_d[r1], 8, 1);
8407            } /* else raise privilege trap */
8408        } else {
8409            generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
8410        }
8411        break;
8412    case OPC2_32_SYS_TRAPSV:
8413        l1 = gen_new_label();
8414        tcg_gen_brcondi_tl(TCG_COND_GE, cpu_PSW_SV, 0, l1);
8415        generate_trap(ctx, TRAPC_ASSERT, TIN5_SOVF);
8416        gen_set_label(l1);
8417        break;
8418    case OPC2_32_SYS_TRAPV:
8419        l1 = gen_new_label();
8420        tcg_gen_brcondi_tl(TCG_COND_GE, cpu_PSW_V, 0, l1);
8421        generate_trap(ctx, TRAPC_ASSERT, TIN5_OVF);
8422        gen_set_label(l1);
8423        break;
8424    default:
8425        generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
8426    }
8427}
8428
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    /* handle JNZ.T opcode only being 7 bit long */
8441    if (unlikely((op1 & 0x7f) == OPCM_32_BRN_JTT)) {
8442        op1 = OPCM_32_BRN_JTT;
8443    }
8444
8445    switch (op1) {
8446/* ABS-format */
8447    case OPCM_32_ABS_LDW:
8448        decode_abs_ldw(env, ctx);
8449        break;
8450    case OPCM_32_ABS_LDB:
8451        decode_abs_ldb(env, ctx);
8452        break;
8453    case OPCM_32_ABS_LDMST_SWAP:
8454        decode_abs_ldst_swap(env, ctx);
8455        break;
8456    case OPCM_32_ABS_LDST_CONTEXT:
8457        decode_abs_ldst_context(env, ctx);
8458        break;
8459    case OPCM_32_ABS_STORE:
8460        decode_abs_store(env, ctx);
8461        break;
8462    case OPCM_32_ABS_STOREB_H:
8463        decode_abs_storeb_h(env, ctx);
8464        break;
8465    case OPC1_32_ABS_STOREQ:
8466        address = MASK_OP_ABS_OFF18(ctx->opcode);
8467        r1 = MASK_OP_ABS_S1D(ctx->opcode);
8468        temp = tcg_const_i32(EA_ABS_FORMAT(address));
8469        temp2 = tcg_temp_new();
8470
8471        tcg_gen_shri_tl(temp2, cpu_gpr_d[r1], 16);
8472        tcg_gen_qemu_st_tl(temp2, temp, ctx->mem_idx, MO_LEUW);
8473
8474        tcg_temp_free(temp2);
8475        tcg_temp_free(temp);
8476        break;
8477    case OPC1_32_ABS_LD_Q:
8478        address = MASK_OP_ABS_OFF18(ctx->opcode);
8479        r1 = MASK_OP_ABS_S1D(ctx->opcode);
8480        temp = tcg_const_i32(EA_ABS_FORMAT(address));
8481
8482        tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LEUW);
8483        tcg_gen_shli_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 16);
8484
8485        tcg_temp_free(temp);
8486        break;
8487    case OPC1_32_ABS_LEA:
8488        address = MASK_OP_ABS_OFF18(ctx->opcode);
8489        r1 = MASK_OP_ABS_S1D(ctx->opcode);
8490        tcg_gen_movi_tl(cpu_gpr_a[r1], EA_ABS_FORMAT(address));
8491        break;
8492/* ABSB-format */
8493    case OPC1_32_ABSB_ST_T:
8494        address = MASK_OP_ABS_OFF18(ctx->opcode);
8495        b = MASK_OP_ABSB_B(ctx->opcode);
8496        bpos = MASK_OP_ABSB_BPOS(ctx->opcode);
8497
8498        temp = tcg_const_i32(EA_ABS_FORMAT(address));
8499        temp2 = tcg_temp_new();
8500
8501        tcg_gen_qemu_ld_tl(temp2, temp, ctx->mem_idx, MO_UB);
8502        tcg_gen_andi_tl(temp2, temp2, ~(0x1u << bpos));
8503        tcg_gen_ori_tl(temp2, temp2, (b << bpos));
8504        tcg_gen_qemu_st_tl(temp2, temp, ctx->mem_idx, MO_UB);
8505
8506        tcg_temp_free(temp);
8507        tcg_temp_free(temp2);
8508        break;
8509/* B-format */
8510    case OPC1_32_B_CALL:
8511    case OPC1_32_B_CALLA:
8512    case OPC1_32_B_FCALL:
8513    case OPC1_32_B_FCALLA:
8514    case OPC1_32_B_J:
8515    case OPC1_32_B_JA:
8516    case OPC1_32_B_JL:
8517    case OPC1_32_B_JLA:
8518        address = MASK_OP_B_DISP24_SEXT(ctx->opcode);
8519        gen_compute_branch(ctx, op1, 0, 0, 0, address);
8520        break;
8521/* Bit-format */
8522    case OPCM_32_BIT_ANDACC:
8523        decode_bit_andacc(env, ctx);
8524        break;
8525    case OPCM_32_BIT_LOGICAL_T1:
8526        decode_bit_logical_t(env, ctx);
8527        break;
8528    case OPCM_32_BIT_INSERT:
8529        decode_bit_insert(env, ctx);
8530        break;
8531    case OPCM_32_BIT_LOGICAL_T2:
8532        decode_bit_logical_t2(env, ctx);
8533        break;
8534    case OPCM_32_BIT_ORAND:
8535        decode_bit_orand(env, ctx);
8536        break;
8537    case OPCM_32_BIT_SH_LOGIC1:
8538        decode_bit_sh_logic1(env, ctx);
8539        break;
8540    case OPCM_32_BIT_SH_LOGIC2:
8541        decode_bit_sh_logic2(env, ctx);
8542        break;
8543    /* BO Format */
8544    case OPCM_32_BO_ADDRMODE_POST_PRE_BASE:
8545        decode_bo_addrmode_post_pre_base(env, ctx);
8546        break;
8547    case OPCM_32_BO_ADDRMODE_BITREVERSE_CIRCULAR:
8548        decode_bo_addrmode_bitreverse_circular(env, ctx);
8549        break;
8550    case OPCM_32_BO_ADDRMODE_LD_POST_PRE_BASE:
8551        decode_bo_addrmode_ld_post_pre_base(env, ctx);
8552        break;
8553    case OPCM_32_BO_ADDRMODE_LD_BITREVERSE_CIRCULAR:
8554        decode_bo_addrmode_ld_bitreverse_circular(env, ctx);
8555        break;
8556    case OPCM_32_BO_ADDRMODE_STCTX_POST_PRE_BASE:
8557        decode_bo_addrmode_stctx_post_pre_base(env, ctx);
8558        break;
8559    case OPCM_32_BO_ADDRMODE_LDMST_BITREVERSE_CIRCULAR:
8560        decode_bo_addrmode_ldmst_bitreverse_circular(env, ctx);
8561        break;
8562/* BOL-format */
8563    case OPC1_32_BOL_LD_A_LONGOFF:
8564    case OPC1_32_BOL_LD_W_LONGOFF:
8565    case OPC1_32_BOL_LEA_LONGOFF:
8566    case OPC1_32_BOL_ST_W_LONGOFF:
8567    case OPC1_32_BOL_ST_A_LONGOFF:
8568    case OPC1_32_BOL_LD_B_LONGOFF:
8569    case OPC1_32_BOL_LD_BU_LONGOFF:
8570    case OPC1_32_BOL_LD_H_LONGOFF:
8571    case OPC1_32_BOL_LD_HU_LONGOFF:
8572    case OPC1_32_BOL_ST_B_LONGOFF:
8573    case OPC1_32_BOL_ST_H_LONGOFF:
8574        decode_bol_opc(env, ctx, op1);
8575        break;
8576/* BRC Format */
8577    case OPCM_32_BRC_EQ_NEQ:
8578    case OPCM_32_BRC_GE:
8579    case OPCM_32_BRC_JLT:
8580    case OPCM_32_BRC_JNE:
8581        const4 = MASK_OP_BRC_CONST4_SEXT(ctx->opcode);
8582        address = MASK_OP_BRC_DISP15_SEXT(ctx->opcode);
8583        r1 = MASK_OP_BRC_S1(ctx->opcode);
8584        gen_compute_branch(ctx, op1, r1, 0, const4, address);
8585        break;
8586/* BRN Format */
8587    case OPCM_32_BRN_JTT:
8588        address = MASK_OP_BRN_DISP15_SEXT(ctx->opcode);
8589        r1 = MASK_OP_BRN_S1(ctx->opcode);
8590        gen_compute_branch(ctx, op1, r1, 0, 0, address);
8591        break;
8592/* BRR Format */
8593    case OPCM_32_BRR_EQ_NEQ:
8594    case OPCM_32_BRR_ADDR_EQ_NEQ:
8595    case OPCM_32_BRR_GE:
8596    case OPCM_32_BRR_JLT:
8597    case OPCM_32_BRR_JNE:
8598    case OPCM_32_BRR_JNZ:
8599    case OPCM_32_BRR_LOOP:
8600        address = MASK_OP_BRR_DISP15_SEXT(ctx->opcode);
8601        r2 = MASK_OP_BRR_S2(ctx->opcode);
8602        r1 = MASK_OP_BRR_S1(ctx->opcode);
8603        gen_compute_branch(ctx, op1, r1, r2, 0, address);
8604        break;
8605/* RC Format */
8606    case OPCM_32_RC_LOGICAL_SHIFT:
8607        decode_rc_logical_shift(env, ctx);
8608        break;
8609    case OPCM_32_RC_ACCUMULATOR:
8610        decode_rc_accumulator(env, ctx);
8611        break;
8612    case OPCM_32_RC_SERVICEROUTINE:
8613        decode_rc_serviceroutine(env, ctx);
8614        break;
8615    case OPCM_32_RC_MUL:
8616        decode_rc_mul(env, ctx);
8617        break;
8618/* RCPW Format */
8619    case OPCM_32_RCPW_MASK_INSERT:
8620        decode_rcpw_insert(env, ctx);
8621        break;
8622/* RCRR Format */
8623    case OPC1_32_RCRR_INSERT:
8624        r1 = MASK_OP_RCRR_S1(ctx->opcode);
8625        r2 = MASK_OP_RCRR_S3(ctx->opcode);
8626        r3 = MASK_OP_RCRR_D(ctx->opcode);
8627        const16 = MASK_OP_RCRR_CONST4(ctx->opcode);
8628        temp = tcg_const_i32(const16);
8629        temp2 = tcg_temp_new(); /* width*/
8630        temp3 = tcg_temp_new(); /* pos */
8631
8632        CHECK_REG_PAIR(r3);
8633
8634        tcg_gen_andi_tl(temp2, cpu_gpr_d[r3+1], 0x1f);
8635        tcg_gen_andi_tl(temp3, cpu_gpr_d[r3], 0x1f);
8636
8637        gen_insert(cpu_gpr_d[r2], cpu_gpr_d[r1], temp, temp2, temp3);
8638
8639        tcg_temp_free(temp);
8640        tcg_temp_free(temp2);
8641        tcg_temp_free(temp3);
8642        break;
8643/* RCRW Format */
8644    case OPCM_32_RCRW_MASK_INSERT:
8645        decode_rcrw_insert(env, ctx);
8646        break;
8647/* RCR Format */
8648    case OPCM_32_RCR_COND_SELECT:
8649        decode_rcr_cond_select(env, ctx);
8650        break;
8651    case OPCM_32_RCR_MADD:
8652        decode_rcr_madd(env, ctx);
8653        break;
8654    case OPCM_32_RCR_MSUB:
8655        decode_rcr_msub(env, ctx);
8656        break;
8657/* RLC Format */
8658    case OPC1_32_RLC_ADDI:
8659    case OPC1_32_RLC_ADDIH:
8660    case OPC1_32_RLC_ADDIH_A:
8661    case OPC1_32_RLC_MFCR:
8662    case OPC1_32_RLC_MOV:
8663    case OPC1_32_RLC_MOV_64:
8664    case OPC1_32_RLC_MOV_U:
8665    case OPC1_32_RLC_MOV_H:
8666    case OPC1_32_RLC_MOVH_A:
8667    case OPC1_32_RLC_MTCR:
8668        decode_rlc_opc(env, ctx, op1);
8669        break;
8670/* RR Format */
8671    case OPCM_32_RR_ACCUMULATOR:
8672        decode_rr_accumulator(env, ctx);
8673        break;
8674    case OPCM_32_RR_LOGICAL_SHIFT:
8675        decode_rr_logical_shift(env, ctx);
8676        break;
8677    case OPCM_32_RR_ADDRESS:
8678        decode_rr_address(env, ctx);
8679        break;
8680    case OPCM_32_RR_IDIRECT:
8681        decode_rr_idirect(env, ctx);
8682        break;
8683    case OPCM_32_RR_DIVIDE:
8684        decode_rr_divide(env, ctx);
8685        break;
8686/* RR1 Format */
8687    case OPCM_32_RR1_MUL:
8688        decode_rr1_mul(env, ctx);
8689        break;
8690    case OPCM_32_RR1_MULQ:
8691        decode_rr1_mulq(env, ctx);
8692        break;
8693/* RR2 format */
8694    case OPCM_32_RR2_MUL:
8695        decode_rr2_mul(env, ctx);
8696        break;
8697/* RRPW format */
8698    case OPCM_32_RRPW_EXTRACT_INSERT:
8699        decode_rrpw_extract_insert(env, ctx);
8700        break;
8701    case OPC1_32_RRPW_DEXTR:
8702        r1 = MASK_OP_RRPW_S1(ctx->opcode);
8703        r2 = MASK_OP_RRPW_S2(ctx->opcode);
8704        r3 = MASK_OP_RRPW_D(ctx->opcode);
8705        const16 = MASK_OP_RRPW_POS(ctx->opcode);
8706        if (r1 == r2) {
8707            tcg_gen_rotli_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], const16);
8708        } else {
8709            temp = tcg_temp_new();
8710            tcg_gen_shli_tl(temp, cpu_gpr_d[r1], const16);
8711            tcg_gen_shri_tl(cpu_gpr_d[r3], cpu_gpr_d[r2], 32 - const16);
8712            tcg_gen_or_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], temp);
8713            tcg_temp_free(temp);
8714        }
8715        break;
8716/* RRR Format */
8717    case OPCM_32_RRR_COND_SELECT:
8718        decode_rrr_cond_select(env, ctx);
8719        break;
8720    case OPCM_32_RRR_DIVIDE:
8721        decode_rrr_divide(env, ctx);
8722        break;
8723/* RRR2 Format */
8724    case OPCM_32_RRR2_MADD:
8725        decode_rrr2_madd(env, ctx);
8726        break;
8727    case OPCM_32_RRR2_MSUB:
8728        decode_rrr2_msub(env, ctx);
8729        break;
8730/* RRR1 format */
8731    case OPCM_32_RRR1_MADD:
8732        decode_rrr1_madd(env, ctx);
8733        break;
8734    case OPCM_32_RRR1_MADDQ_H:
8735        decode_rrr1_maddq_h(env, ctx);
8736        break;
8737    case OPCM_32_RRR1_MADDSU_H:
8738        decode_rrr1_maddsu_h(env, ctx);
8739        break;
8740    case OPCM_32_RRR1_MSUB_H:
8741        decode_rrr1_msub(env, ctx);
8742        break;
8743    case OPCM_32_RRR1_MSUB_Q:
8744        decode_rrr1_msubq_h(env, ctx);
8745        break;
8746    case OPCM_32_RRR1_MSUBAD_H:
8747        decode_rrr1_msubad_h(env, ctx);
8748        break;
8749/* RRRR format */
8750    case OPCM_32_RRRR_EXTRACT_INSERT:
8751        decode_rrrr_extract_insert(env, ctx);
8752        break;
8753/* RRRW format */
8754    case OPCM_32_RRRW_EXTRACT_INSERT:
8755        decode_rrrw_extract_insert(env, ctx);
8756        break;
8757/* SYS format */
8758    case OPCM_32_SYS_INTERRUPTS:
8759        decode_sys_interrupts(env, ctx);
8760        break;
8761    case OPC1_32_SYS_RSTV:
8762        tcg_gen_movi_tl(cpu_PSW_V, 0);
8763        tcg_gen_mov_tl(cpu_PSW_SV, cpu_PSW_V);
8764        tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V);
8765        tcg_gen_mov_tl(cpu_PSW_SAV, cpu_PSW_V);
8766        break;
8767    default:
8768        generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
8769    }
8770}
8771
8772static void decode_opc(CPUTriCoreState *env, DisasContext *ctx, int *is_branch)
8773{
8774    /* 16-Bit Instruction */
8775    if ((ctx->opcode & 0x1) == 0) {
8776        ctx->next_pc = ctx->pc + 2;
8777        decode_16Bit_opc(env, ctx);
8778    /* 32-Bit Instruction */
8779    } else {
8780        ctx->next_pc = ctx->pc + 4;
8781        decode_32Bit_opc(env, ctx);
8782    }
8783}
8784
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 * Initialization
8858 *
8859 */
8860
8861void cpu_state_reset(CPUTriCoreState *env)
8862{
8863    /* Reset Regs to Default Value */
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    /* reg init */
8890    for (i = 0 ; i < 16 ; i++) {
8891        cpu_gpr_a[i] = tcg_global_mem_new(cpu_env,
8892                                          offsetof(CPUTriCoreState, gpr_a[i]),
8893                                          regnames_a[i]);
8894    }
8895    for (i = 0 ; i < 16 ; i++) {
8896        cpu_gpr_d[i] = tcg_global_mem_new(cpu_env,
8897                                  offsetof(CPUTriCoreState, gpr_d[i]),
8898                                           regnames_d[i]);
8899    }
8900    tricore_tcg_init_csfr();
8901    /* init PSW flag cache */
8902    cpu_PSW_C = tcg_global_mem_new(cpu_env,
8903                                   offsetof(CPUTriCoreState, PSW_USB_C),
8904                                   "PSW_C");
8905    cpu_PSW_V = tcg_global_mem_new(cpu_env,
8906                                   offsetof(CPUTriCoreState, PSW_USB_V),
8907                                   "PSW_V");
8908    cpu_PSW_SV = tcg_global_mem_new(cpu_env,
8909                                    offsetof(CPUTriCoreState, PSW_USB_SV),
8910                                    "PSW_SV");
8911    cpu_PSW_AV = tcg_global_mem_new(cpu_env,
8912                                    offsetof(CPUTriCoreState, PSW_USB_AV),
8913                                    "PSW_AV");
8914    cpu_PSW_SAV = tcg_global_mem_new(cpu_env,
8915                                     offsetof(CPUTriCoreState, PSW_USB_SAV),
8916                                     "PSW_SAV");
8917}
8918