]> git.proxmox.com Git - mirror_qemu.git/commitdiff
Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging
authorPeter Maydell <peter.maydell@linaro.org>
Fri, 9 Jan 2015 16:29:36 +0000 (16:29 +0000)
committerPeter Maydell <peter.maydell@linaro.org>
Fri, 9 Jan 2015 16:29:36 +0000 (16:29 +0000)
More migration fixes and more record/replay preparations.  Also moves
the sdhci-pci device id to make space for the rocker device.

# gpg: Signature made Sat 03 Jan 2015 08:22:36 GMT using RSA key ID 78C7AE83
# gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>"
# gpg:                 aka "Paolo Bonzini <pbonzini@redhat.com>"
# gpg: WARNING: This key is not certified with sufficiently trusted signatures!
# gpg:          It is not certain that the signature belongs to the owner.
# Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4  E2F7 7E15 100C CD36 69B1
#      Subkey fingerprint: F133 3857 4B66 2389 866C  7682 BFFB D25F 78C7 AE83

* remotes/bonzini/tags/for-upstream:
  pci: move REDHAT_SDHCI device ID to make room for Rocker
  block/iscsi: fix uninitialized variable
  pckbd: set bits 2-3-6-7 of the output port by default
  serial: refine serial_thr_ipending_needed
  gen-icount: check cflags instead of use_icount global
  translate: check cflags instead of use_icount global
  cpu-exec: add a new CF_USE_ICOUNT cflag
  target-ppc: pass DisasContext to SPR generator functions
  atomic: fix position of volatile qualifier

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
1  2 
target-tricore/translate.c

index dbcf87e383e96f585c9cda13e2ec84589680bc6a,f57eb7e9c15a3eec11f50a02c7952d3e97c6795e..3b83782be274b0d60422c8735589ed7f7e6a301f
@@@ -85,31 -85,22 +85,31 @@@ void tricore_cpu_dump_state(CPUState *c
  {
      TriCoreCPU *cpu = TRICORE_CPU(cs);
      CPUTriCoreState *env = &cpu->env;
 +    uint32_t psw;
      int i;
  
 -    cpu_fprintf(f, "PC=%08x\n", env->PC);
 +    psw = psw_read(env);
 +
 +    cpu_fprintf(f, "PC: " TARGET_FMT_lx, env->PC);
 +    cpu_fprintf(f, " PSW: " TARGET_FMT_lx, psw);
 +    cpu_fprintf(f, " ICR: " TARGET_FMT_lx, env->ICR);
 +    cpu_fprintf(f, "\nPCXI: " TARGET_FMT_lx, env->PCXI);
 +    cpu_fprintf(f, " FCX: " TARGET_FMT_lx, env->FCX);
 +    cpu_fprintf(f, " LCX: " TARGET_FMT_lx, env->LCX);
 +
      for (i = 0; i < 16; ++i) {
          if ((i & 3) == 0) {
 -            cpu_fprintf(f, "GPR A%02d:", i);
 +            cpu_fprintf(f, "\nGPR A%02d:", i);
          }
 -        cpu_fprintf(f, " %s " TARGET_FMT_lx, regnames_a[i], env->gpr_a[i]);
 +        cpu_fprintf(f, " " TARGET_FMT_lx, env->gpr_a[i]);
      }
      for (i = 0; i < 16; ++i) {
          if ((i & 3) == 0) {
 -            cpu_fprintf(f, "GPR D%02d:", i);
 +            cpu_fprintf(f, "\nGPR D%02d:", i);
          }
 -        cpu_fprintf(f, " %s " TARGET_FMT_lx, regnames_d[i], env->gpr_d[i]);
 +        cpu_fprintf(f, " " TARGET_FMT_lx, env->gpr_d[i]);
      }
 -
 +    cpu_fprintf(f, "\n");
  }
  
  /*
      tcg_temp_free_i32(helper_tmp);                                \
      } while (0)
  
 +#define GEN_HELPER_LL(name, ret, arg0, arg1, n) do {         \
 +    TCGv arg00 = tcg_temp_new();                             \
 +    TCGv arg01 = tcg_temp_new();                             \
 +    TCGv arg11 = tcg_temp_new();                             \
 +    tcg_gen_sari_tl(arg00, arg0, 16);                        \
 +    tcg_gen_ext16s_tl(arg01, arg0);                          \
 +    tcg_gen_ext16s_tl(arg11, arg1);                          \
 +    gen_helper_##name(ret, arg00, arg01, arg11, arg11, n);   \
 +    tcg_temp_free(arg00);                                    \
 +    tcg_temp_free(arg01);                                    \
 +    tcg_temp_free(arg11);                                    \
 +} while (0)
 +
 +#define GEN_HELPER_LU(name, ret, arg0, arg1, n) do {         \
 +    TCGv arg00 = tcg_temp_new();                             \
 +    TCGv arg01 = tcg_temp_new();                             \
 +    TCGv arg10 = tcg_temp_new();                             \
 +    TCGv arg11 = tcg_temp_new();                             \
 +    tcg_gen_sari_tl(arg00, arg0, 16);                        \
 +    tcg_gen_ext16s_tl(arg01, arg0);                          \
 +    tcg_gen_sari_tl(arg11, arg1, 16);                        \
 +    tcg_gen_ext16s_tl(arg10, arg1);                          \
 +    gen_helper_##name(ret, arg00, arg01, arg10, arg11, n);   \
 +    tcg_temp_free(arg00);                                    \
 +    tcg_temp_free(arg01);                                    \
 +    tcg_temp_free(arg10);                                    \
 +    tcg_temp_free(arg11);                                    \
 +} while (0)
 +
 +#define GEN_HELPER_UL(name, ret, arg0, arg1, n) do {         \
 +    TCGv arg00 = tcg_temp_new();                             \
 +    TCGv arg01 = tcg_temp_new();                             \
 +    TCGv arg10 = tcg_temp_new();                             \
 +    TCGv arg11 = tcg_temp_new();                             \
 +    tcg_gen_sari_tl(arg00, arg0, 16);                        \
 +    tcg_gen_ext16s_tl(arg01, arg0);                          \
 +    tcg_gen_sari_tl(arg10, arg1, 16);                        \
 +    tcg_gen_ext16s_tl(arg11, arg1);                          \
 +    gen_helper_##name(ret, arg00, arg01, arg10, arg11, n);   \
 +    tcg_temp_free(arg00);                                    \
 +    tcg_temp_free(arg01);                                    \
 +    tcg_temp_free(arg10);                                    \
 +    tcg_temp_free(arg11);                                    \
 +} while (0)
 +
 +#define GEN_HELPER_UU(name, ret, arg0, arg1, n) do {         \
 +    TCGv arg00 = tcg_temp_new();                             \
 +    TCGv arg01 = tcg_temp_new();                             \
 +    TCGv arg11 = tcg_temp_new();                             \
 +    tcg_gen_sari_tl(arg01, arg0, 16);                        \
 +    tcg_gen_ext16s_tl(arg00, arg0);                          \
 +    tcg_gen_sari_tl(arg11, arg1, 16);                        \
 +    gen_helper_##name(ret, arg00, arg01, arg11, arg11, n);   \
 +    tcg_temp_free(arg00);                                    \
 +    tcg_temp_free(arg01);                                    \
 +    tcg_temp_free(arg11);                                    \
 +} while (0)
 +
  #define EA_ABS_FORMAT(con) (((con & 0x3C000) << 14) + (con & 0x3FFF))
  #define EA_B_ABSOLUT(con) (((offset & 0xf00000) << 8) | \
                             ((offset & 0x0fffff) << 1))
@@@ -786,62 -719,6 +786,62 @@@ static inline void gen_sub_d(TCGv ret, 
      tcg_temp_free(result);
  }
  
 +static inline void gen_sub_CC(TCGv ret, TCGv r1, TCGv r2)
 +{
 +    TCGv result = tcg_temp_new();
 +    TCGv temp = tcg_temp_new();
 +
 +    tcg_gen_sub_tl(result, r1, r2);
 +    /* calc C bit */
 +    tcg_gen_setcond_tl(TCG_COND_GEU, cpu_PSW_C, r1, r2);
 +    /* calc V bit */
 +    tcg_gen_xor_tl(cpu_PSW_V, result, r1);
 +    tcg_gen_xor_tl(temp, r1, r2);
 +    tcg_gen_and_tl(cpu_PSW_V, cpu_PSW_V, temp);
 +    /* calc SV bit */
 +    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
 +    /* Calc AV bit */
 +    tcg_gen_add_tl(cpu_PSW_AV, result, result);
 +    tcg_gen_xor_tl(cpu_PSW_AV, result, cpu_PSW_AV);
 +    /* calc SAV bit */
 +    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
 +    /* write back result */
 +    tcg_gen_mov_tl(ret, result);
 +
 +    tcg_temp_free(result);
 +    tcg_temp_free(temp);
 +}
 +
 +static inline void gen_subc_CC(TCGv ret, TCGv r1, TCGv r2)
 +{
 +    TCGv temp = tcg_temp_new();
 +    tcg_gen_not_tl(temp, r2);
 +    gen_addc_CC(ret, r1, temp);
 +    tcg_temp_free(temp);
 +}
 +
 +static inline void gen_abs(TCGv ret, TCGv r1)
 +{
 +    TCGv temp = tcg_temp_new();
 +    TCGv t0 = tcg_const_i32(0);
 +
 +    tcg_gen_neg_tl(temp, r1);
 +    tcg_gen_movcond_tl(TCG_COND_GE, ret, r1, t0, r1, temp);
 +    /* overflow can only happen, if r1 = 0x80000000 */
 +    tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, r1, 0x80000000);
 +    tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
 +    /* calc SV bit */
 +    tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
 +    /* Calc AV bit */
 +    tcg_gen_add_tl(cpu_PSW_AV, ret, ret);
 +    tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV);
 +    /* calc SAV bit */
 +    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
 +
 +    tcg_temp_free(temp);
 +    tcg_temp_free(t0);
 +}
 +
  static inline void gen_absdif(TCGv ret, TCGv r1, TCGv r2)
  {
      TCGv temp = tcg_temp_new_i32();
@@@ -1331,13 -1208,6 +1331,13 @@@ gen_accumulating_condi(int cond, TCGv r
      tcg_temp_free(temp);
  }
  
 +/* ret = (r1 cond r2) ? 0xFFFFFFFF ? 0x00000000;*/
 +static inline void gen_cond_w(TCGCond cond, TCGv ret, TCGv r1, TCGv r2)
 +{
 +    tcg_gen_setcond_tl(cond, ret, r1, r2);
 +    tcg_gen_neg_tl(ret, ret);
 +}
 +
  static inline void gen_eqany_bi(TCGv ret, TCGv r1, int32_t con)
  {
      TCGv b0 = tcg_temp_new();
@@@ -1414,86 -1284,6 +1414,86 @@@ static inline void gen_insert(TCGv ret
      tcg_temp_free(temp2);
  }
  
 +static inline void gen_bsplit(TCGv rl, TCGv rh, TCGv r1)
 +{
 +    TCGv_i64 temp = tcg_temp_new_i64();
 +
 +    gen_helper_bsplit(temp, r1);
 +    tcg_gen_extr_i64_i32(rl, rh, temp);
 +
 +    tcg_temp_free_i64(temp);
 +}
 +
 +static inline void gen_unpack(TCGv rl, TCGv rh, TCGv r1)
 +{
 +    TCGv_i64 temp = tcg_temp_new_i64();
 +
 +    gen_helper_unpack(temp, r1);
 +    tcg_gen_extr_i64_i32(rl, rh, temp);
 +
 +    tcg_temp_free_i64(temp);
 +}
 +
 +static inline void
 +gen_dvinit_b(CPUTriCoreState *env, TCGv rl, TCGv rh, TCGv r1, TCGv r2)
 +{
 +    TCGv_i64 ret = tcg_temp_new_i64();
 +
 +    if (!tricore_feature(env, TRICORE_FEATURE_131)) {
 +        gen_helper_dvinit_b_13(ret, cpu_env, r1, r2);
 +    } else {
 +        gen_helper_dvinit_b_131(ret, cpu_env, r1, r2);
 +    }
 +    tcg_gen_extr_i64_i32(rl, rh, ret);
 +
 +    tcg_temp_free_i64(ret);
 +}
 +
 +static inline void
 +gen_dvinit_h(CPUTriCoreState *env, TCGv rl, TCGv rh, TCGv r1, TCGv r2)
 +{
 +    TCGv_i64 ret = tcg_temp_new_i64();
 +
 +    if (!tricore_feature(env, TRICORE_FEATURE_131)) {
 +        gen_helper_dvinit_h_13(ret, cpu_env, r1, r2);
 +    } else {
 +        gen_helper_dvinit_h_131(ret, cpu_env, r1, r2);
 +    }
 +    tcg_gen_extr_i64_i32(rl, rh, ret);
 +
 +    tcg_temp_free_i64(ret);
 +}
 +
 +static void gen_calc_usb_mul_h(TCGv arg_low, TCGv arg_high)
 +{
 +    TCGv temp = tcg_temp_new();
 +    /* calc AV bit */
 +    tcg_gen_add_tl(temp, arg_low, arg_low);
 +    tcg_gen_xor_tl(temp, temp, arg_low);
 +    tcg_gen_add_tl(cpu_PSW_AV, arg_high, arg_high);
 +    tcg_gen_xor_tl(cpu_PSW_AV, cpu_PSW_AV, arg_high);
 +    tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp);
 +    /* calc SAV bit */
 +    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
 +    tcg_gen_movi_tl(cpu_PSW_V, 0);
 +    tcg_temp_free(temp);
 +}
 +
 +static void gen_calc_usb_mulr_h(TCGv arg)
 +{
 +    TCGv temp = tcg_temp_new();
 +    /* calc AV bit */
 +    tcg_gen_add_tl(temp, arg, arg);
 +    tcg_gen_xor_tl(temp, temp, arg);
 +    tcg_gen_shli_tl(cpu_PSW_AV, temp, 16);
 +    tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp);
 +    /* calc SAV bit */
 +    tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV);
 +    /* clear V bit */
 +    tcg_gen_movi_tl(cpu_PSW_V, 0);
 +    tcg_temp_free(temp);
 +}
 +
  /* helpers for generating program flow micro-ops */
  
  static inline void gen_save_pc(target_ulong pc)
@@@ -3413,7 -3203,7 +3413,7 @@@ static void decode_bol_opc(CPUTriCoreSt
          tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], temp, ctx->mem_idx, MO_LEUL);
          tcg_temp_free(temp);
          break;
 -    case OPC1_32_BOL_LD_W_LONFOFF:
 +    case OPC1_32_BOL_LD_W_LONGOFF:
          temp = tcg_temp_new();
          tcg_gen_addi_tl(temp, cpu_gpr_a[r2], address);
          tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LEUL);
      case OPC1_32_BOL_ST_W_LONGOFF:
          gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_LEUL);
          break;
 +    case OPC1_32_BOL_LD_B_LONGOFF:
 +        if (tricore_feature(env, TRICORE_FEATURE_16)) {
 +            gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_SB);
 +        } else {
 +            /* raise illegal opcode trap */
 +        }
 +        break;
 +    case OPC1_32_BOL_LD_BU_LONGOFF:
 +        if (tricore_feature(env, TRICORE_FEATURE_16)) {
 +            gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_UB);
 +        } else {
 +            /* raise illegal opcode trap */
 +        }
 +        break;
 +    case OPC1_32_BOL_LD_H_LONGOFF:
 +        if (tricore_feature(env, TRICORE_FEATURE_16)) {
 +            gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_LESW);
 +        } else {
 +            /* raise illegal opcode trap */
 +        }
 +        break;
 +    case OPC1_32_BOL_LD_HU_LONGOFF:
 +        if (tricore_feature(env, TRICORE_FEATURE_16)) {
 +            gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_LEUW);
 +        } else {
 +            /* raise illegal opcode trap */
 +        }
 +        break;
 +    case OPC1_32_BOL_ST_B_LONGOFF:
 +        if (tricore_feature(env, TRICORE_FEATURE_16)) {
 +            gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_SB);
 +        } else {
 +            /* raise illegal opcode trap */
 +        }
 +        break;
 +    case OPC1_32_BOL_ST_H_LONGOFF:
 +        if (tricore_feature(env, TRICORE_FEATURE_16)) {
 +            gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_LESW);
 +        } else {
 +            /* raise illegal opcode trap */
 +        }
 +        break;
      }
 -
  }
  
  /* RC format */
@@@ -4027,23 -3776,11 +4027,23 @@@ static void decode_rlc_opc(CPUTriCoreSt
          tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r1], const16 << 16);
          break;
      case OPC1_32_RLC_MFCR:
 +        const16 = MASK_OP_RLC_CONST16(ctx->opcode);
          gen_mfcr(env, cpu_gpr_d[r2], const16);
          break;
      case OPC1_32_RLC_MOV:
          tcg_gen_movi_tl(cpu_gpr_d[r2], const16);
          break;
 +    case OPC1_32_RLC_MOV_64:
 +        if (tricore_feature(env, TRICORE_FEATURE_16)) {
 +            if ((r2 & 0x1) != 0) {
 +                /* TODO: raise OPD trap */
 +            }
 +            tcg_gen_movi_tl(cpu_gpr_d[r2], const16);
 +            tcg_gen_movi_tl(cpu_gpr_d[r2+1], const16 >> 15);
 +        } else {
 +            /* TODO: raise illegal opcode trap */
 +        }
 +        break;
      case OPC1_32_RLC_MOV_U:
          const16 = MASK_OP_RLC_CONST16(ctx->opcode);
          tcg_gen_movi_tl(cpu_gpr_d[r2], const16);
          tcg_gen_movi_tl(cpu_gpr_a[r2], const16 << 16);
          break;
      case OPC1_32_RLC_MTCR:
 -        gen_mtcr(env, ctx, cpu_gpr_d[r2], const16);
 +        const16 = MASK_OP_RLC_CONST16(ctx->opcode);
 +        gen_mtcr(env, ctx, cpu_gpr_d[r1], const16);
          break;
      }
  }
  
 +/* RR format */
 +static void decode_rr_accumulator(CPUTriCoreState *env, DisasContext *ctx)
 +{
 +    uint32_t op2;
 +    int r3, r2, r1;
 +
 +    r3 = MASK_OP_RR_D(ctx->opcode);
 +    r2 = MASK_OP_RR_S2(ctx->opcode);
 +    r1 = MASK_OP_RR_S1(ctx->opcode);
 +    op2 = MASK_OP_RR_OP2(ctx->opcode);
 +
 +    switch (op2) {
 +    case OPC2_32_RR_ABS:
 +        gen_abs(cpu_gpr_d[r3], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ABS_B:
 +        gen_helper_abs_b(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ABS_H:
 +        gen_helper_abs_h(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ABSDIF:
 +        gen_absdif(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ABSDIF_B:
 +        gen_helper_absdif_b(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
 +                            cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ABSDIF_H:
 +        gen_helper_absdif_h(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
 +                            cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ABSDIFS:
 +        gen_helper_absdif_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
 +                               cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ABSDIFS_H:
 +        gen_helper_absdif_h_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
 +                                 cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ABSS:
 +        gen_helper_abs_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ABSS_H:
 +        gen_helper_abs_h_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ADD:
 +        gen_add_d(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ADD_B:
 +        gen_helper_add_b(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ADD_H:
 +        gen_helper_add_h(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ADDC:
 +        gen_addc_CC(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ADDS:
 +        gen_adds(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ADDS_H:
 +        gen_helper_add_h_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ADDS_HU:
 +        gen_helper_add_h_suov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ADDS_U:
 +        gen_helper_add_suov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
 +                            cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ADDX:
 +        gen_add_CC(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_AND_EQ:
 +        gen_accumulating_cond(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_and_tl);
 +        break;
 +    case OPC2_32_RR_AND_GE:
 +        gen_accumulating_cond(TCG_COND_GE, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_and_tl);
 +        break;
 +    case OPC2_32_RR_AND_GE_U:
 +        gen_accumulating_cond(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_and_tl);
 +        break;
 +    case OPC2_32_RR_AND_LT:
 +        gen_accumulating_cond(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_and_tl);
 +        break;
 +    case OPC2_32_RR_AND_LT_U:
 +        gen_accumulating_cond(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_and_tl);
 +        break;
 +    case OPC2_32_RR_AND_NE:
 +        gen_accumulating_cond(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_and_tl);
 +        break;
 +    case OPC2_32_RR_EQ:
 +        tcg_gen_setcond_tl(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                           cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_EQ_B:
 +        gen_helper_eq_b(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_EQ_H:
 +        gen_helper_eq_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_EQ_W:
 +        gen_cond_w(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_EQANY_B:
 +        gen_helper_eqany_b(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_EQANY_H:
 +        gen_helper_eqany_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_GE:
 +        tcg_gen_setcond_tl(TCG_COND_GE, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                           cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_GE_U:
 +        tcg_gen_setcond_tl(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                           cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_LT:
 +        tcg_gen_setcond_tl(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                           cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_LT_U:
 +        tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                           cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_LT_B:
 +        gen_helper_lt_b(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_LT_BU:
 +        gen_helper_lt_bu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_LT_H:
 +        gen_helper_lt_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_LT_HU:
 +        gen_helper_lt_hu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_LT_W:
 +        gen_cond_w(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_LT_WU:
 +        gen_cond_w(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_MAX:
 +        tcg_gen_movcond_tl(TCG_COND_GT, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                           cpu_gpr_d[r2], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_MAX_U:
 +        tcg_gen_movcond_tl(TCG_COND_GTU, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                           cpu_gpr_d[r2], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_MAX_B:
 +        gen_helper_max_b(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_MAX_BU:
 +        gen_helper_max_bu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_MAX_H:
 +        gen_helper_max_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_MAX_HU:
 +        gen_helper_max_hu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_MIN:
 +        tcg_gen_movcond_tl(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                           cpu_gpr_d[r2], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_MIN_U:
 +        tcg_gen_movcond_tl(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                           cpu_gpr_d[r2], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_MIN_B:
 +        gen_helper_min_b(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_MIN_BU:
 +        gen_helper_min_bu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_MIN_H:
 +        gen_helper_min_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_MIN_HU:
 +        gen_helper_min_hu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_MOV:
 +        tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_NE:
 +        tcg_gen_setcond_tl(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                           cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_OR_EQ:
 +        gen_accumulating_cond(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_or_tl);
 +        break;
 +    case OPC2_32_RR_OR_GE:
 +        gen_accumulating_cond(TCG_COND_GE, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_or_tl);
 +        break;
 +    case OPC2_32_RR_OR_GE_U:
 +        gen_accumulating_cond(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_or_tl);
 +        break;
 +    case OPC2_32_RR_OR_LT:
 +        gen_accumulating_cond(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_or_tl);
 +        break;
 +    case OPC2_32_RR_OR_LT_U:
 +        gen_accumulating_cond(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_or_tl);
 +        break;
 +    case OPC2_32_RR_OR_NE:
 +        gen_accumulating_cond(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_or_tl);
 +        break;
 +    case OPC2_32_RR_SAT_B:
 +        gen_saturate(cpu_gpr_d[r3], cpu_gpr_d[r1], 0x7f, -0x80);
 +        break;
 +    case OPC2_32_RR_SAT_BU:
 +        gen_saturate_u(cpu_gpr_d[r3], cpu_gpr_d[r1], 0xff);
 +        break;
 +    case OPC2_32_RR_SAT_H:
 +        gen_saturate(cpu_gpr_d[r3], cpu_gpr_d[r1], 0x7fff, -0x8000);
 +        break;
 +    case OPC2_32_RR_SAT_HU:
 +        gen_saturate_u(cpu_gpr_d[r3], cpu_gpr_d[r1], 0xffff);
 +        break;
 +    case OPC2_32_RR_SH_EQ:
 +        gen_sh_cond(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                    cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SH_GE:
 +        gen_sh_cond(TCG_COND_GE, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                    cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SH_GE_U:
 +        gen_sh_cond(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                    cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SH_LT:
 +        gen_sh_cond(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                    cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SH_LT_U:
 +        gen_sh_cond(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                    cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SH_NE:
 +        gen_sh_cond(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                    cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SUB:
 +        gen_sub_d(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SUB_B:
 +        gen_helper_sub_b(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SUB_H:
 +        gen_helper_sub_h(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SUBC:
 +        gen_subc_CC(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SUBS:
 +        gen_subs(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SUBS_U:
 +        gen_subsu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SUBS_H:
 +        gen_helper_sub_h_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SUBS_HU:
 +        gen_helper_sub_h_suov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SUBX:
 +        gen_sub_CC(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_XOR_EQ:
 +        gen_accumulating_cond(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_xor_tl);
 +        break;
 +    case OPC2_32_RR_XOR_GE:
 +        gen_accumulating_cond(TCG_COND_GE, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_xor_tl);
 +        break;
 +    case OPC2_32_RR_XOR_GE_U:
 +        gen_accumulating_cond(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_xor_tl);
 +        break;
 +    case OPC2_32_RR_XOR_LT:
 +        gen_accumulating_cond(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_xor_tl);
 +        break;
 +    case OPC2_32_RR_XOR_LT_U:
 +        gen_accumulating_cond(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_xor_tl);
 +        break;
 +    case OPC2_32_RR_XOR_NE:
 +        gen_accumulating_cond(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_d[r1],
 +                              cpu_gpr_d[r2], &tcg_gen_xor_tl);
 +        break;
 +    }
 +}
 +
 +static void decode_rr_logical_shift(CPUTriCoreState *env, DisasContext *ctx)
 +{
 +    uint32_t op2;
 +    int r3, r2, r1;
 +    TCGv temp;
 +
 +    r3 = MASK_OP_RR_D(ctx->opcode);
 +    r2 = MASK_OP_RR_S2(ctx->opcode);
 +    r1 = MASK_OP_RR_S1(ctx->opcode);
 +
 +    temp = tcg_temp_new();
 +    op2 = MASK_OP_RR_OP2(ctx->opcode);
 +
 +    switch (op2) {
 +    case OPC2_32_RR_AND:
 +        tcg_gen_and_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ANDN:
 +        tcg_gen_andc_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_CLO:
 +        gen_helper_clo(cpu_gpr_d[r3], cpu_gpr_d[r1]);
 +        break;
 +    case OPC2_32_RR_CLO_H:
 +        gen_helper_clo_h(cpu_gpr_d[r3], cpu_gpr_d[r1]);
 +        break;
 +    case OPC2_32_RR_CLS:
 +        gen_helper_cls(cpu_gpr_d[r3], cpu_gpr_d[r1]);
 +        break;
 +    case OPC2_32_RR_CLS_H:
 +        gen_helper_cls_h(cpu_gpr_d[r3], cpu_gpr_d[r1]);
 +        break;
 +    case OPC2_32_RR_CLZ:
 +        gen_helper_clz(cpu_gpr_d[r3], cpu_gpr_d[r1]);
 +        break;
 +    case OPC2_32_RR_CLZ_H:
 +        gen_helper_clz_h(cpu_gpr_d[r3], cpu_gpr_d[r1]);
 +        break;
 +    case OPC2_32_RR_NAND:
 +        tcg_gen_nand_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_NOR:
 +        tcg_gen_nor_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_OR:
 +        tcg_gen_or_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_ORN:
 +        tcg_gen_orc_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SH:
 +        gen_helper_sh(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SH_H:
 +        gen_helper_sh_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SHA:
 +        gen_helper_sha(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SHA_H:
 +        gen_helper_sha_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_SHAS:
 +        gen_shas(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_XNOR:
 +        tcg_gen_eqv_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_XOR:
 +        tcg_gen_xor_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    }
 +    tcg_temp_free(temp);
 +}
 +
 +static void decode_rr_address(CPUTriCoreState *env, DisasContext *ctx)
 +{
 +    uint32_t op2, n;
 +    int r1, r2, r3;
 +    TCGv temp;
 +
 +    op2 = MASK_OP_RR_OP2(ctx->opcode);
 +    r3 = MASK_OP_RR_D(ctx->opcode);
 +    r2 = MASK_OP_RR_S2(ctx->opcode);
 +    r1 = MASK_OP_RR_S1(ctx->opcode);
 +    n = MASK_OP_RR_N(ctx->opcode);
 +
 +    switch (op2) {
 +    case OPC2_32_RR_ADD_A:
 +        tcg_gen_add_tl(cpu_gpr_a[r3], cpu_gpr_a[r1], cpu_gpr_a[r2]);
 +        break;
 +    case OPC2_32_RR_ADDSC_A:
 +        temp = tcg_temp_new();
 +        tcg_gen_shli_tl(temp, cpu_gpr_d[r1], n);
 +        tcg_gen_add_tl(cpu_gpr_a[r3], cpu_gpr_a[r2], temp);
 +        tcg_temp_free(temp);
 +        break;
 +    case OPC2_32_RR_ADDSC_AT:
 +        temp = tcg_temp_new();
 +        tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 3);
 +        tcg_gen_add_tl(temp, cpu_gpr_a[r2], temp);
 +        tcg_gen_andi_tl(cpu_gpr_a[r3], temp, 0xFFFFFFFC);
 +        tcg_temp_free(temp);
 +        break;
 +    case OPC2_32_RR_EQ_A:
 +        tcg_gen_setcond_tl(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_a[r1],
 +                           cpu_gpr_a[r2]);
 +        break;
 +    case OPC2_32_RR_EQZ:
 +        tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_a[r1], 0);
 +        break;
 +    case OPC2_32_RR_GE_A:
 +        tcg_gen_setcond_tl(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_a[r1],
 +                           cpu_gpr_a[r2]);
 +        break;
 +    case OPC2_32_RR_LT_A:
 +        tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_a[r1],
 +                           cpu_gpr_a[r2]);
 +        break;
 +    case OPC2_32_RR_MOV_A:
 +        tcg_gen_mov_tl(cpu_gpr_a[r3], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_MOV_AA:
 +        tcg_gen_mov_tl(cpu_gpr_a[r3], cpu_gpr_a[r2]);
 +        break;
 +    case OPC2_32_RR_MOV_D:
 +        tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_a[r2]);
 +        break;
 +    case OPC2_32_RR_NE_A:
 +        tcg_gen_setcond_tl(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_a[r1],
 +                           cpu_gpr_a[r2]);
 +        break;
 +    case OPC2_32_RR_NEZ_A:
 +        tcg_gen_setcondi_tl(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_a[r1], 0);
 +        break;
 +    case OPC2_32_RR_SUB_A:
 +        tcg_gen_sub_tl(cpu_gpr_a[r3], cpu_gpr_a[r1], cpu_gpr_a[r2]);
 +        break;
 +    }
 +}
 +
 +static void decode_rr_idirect(CPUTriCoreState *env, DisasContext *ctx)
 +{
 +    uint32_t op2;
 +    int r1;
 +
 +    op2 = MASK_OP_RR_OP2(ctx->opcode);
 +    r1 = MASK_OP_RR_S1(ctx->opcode);
 +
 +    switch (op2) {
 +    case OPC2_32_RR_JI:
 +        tcg_gen_andi_tl(cpu_PC, cpu_gpr_a[r1], ~0x1);
 +        break;
 +    case OPC2_32_RR_JLI:
 +        tcg_gen_movi_tl(cpu_gpr_a[11], ctx->next_pc);
 +        tcg_gen_andi_tl(cpu_PC, cpu_gpr_a[r1], ~0x1);
 +        break;
 +    case OPC2_32_RR_CALLI:
 +        gen_helper_1arg(call, ctx->next_pc);
 +        tcg_gen_andi_tl(cpu_PC, cpu_gpr_a[r1], ~0x1);
 +        break;
 +    }
 +    tcg_gen_exit_tb(0);
 +    ctx->bstate = BS_BRANCH;
 +}
 +
 +static void decode_rr_divide(CPUTriCoreState *env, DisasContext *ctx)
 +{
 +    uint32_t op2;
 +    int r1, r2, r3;
 +
 +    TCGv temp, temp2;
 +
 +    op2 = MASK_OP_RR_OP2(ctx->opcode);
 +    r3 = MASK_OP_RR_D(ctx->opcode);
 +    r2 = MASK_OP_RR_S2(ctx->opcode);
 +    r1 = MASK_OP_RR_S1(ctx->opcode);
 +
 +    switch (op2) {
 +    case OPC2_32_RR_BMERGE:
 +        gen_helper_bmerge(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_BSPLIT:
 +        gen_bsplit(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1]);
 +        break;
 +    case OPC2_32_RR_DVINIT_B:
 +        gen_dvinit_b(env, cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1],
 +                     cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_DVINIT_BU:
 +        temp = tcg_temp_new();
 +        temp2 = tcg_temp_new();
 +        /* reset av */
 +        tcg_gen_movi_tl(cpu_PSW_AV, 0);
 +        if (!tricore_feature(env, TRICORE_FEATURE_131)) {
 +            /* overflow = (abs(D[r3+1]) >= abs(D[r2])) */
 +            tcg_gen_neg_tl(temp, cpu_gpr_d[r3+1]);
 +            /* use cpu_PSW_AV to compare against 0 */
 +            tcg_gen_movcond_tl(TCG_COND_LT, temp, cpu_gpr_d[r3+1], cpu_PSW_AV,
 +                               temp, cpu_gpr_d[r3+1]);
 +            tcg_gen_neg_tl(temp2, cpu_gpr_d[r2]);
 +            tcg_gen_movcond_tl(TCG_COND_LT, temp2, cpu_gpr_d[r2], cpu_PSW_AV,
 +                               temp2, cpu_gpr_d[r2]);
 +            tcg_gen_setcond_tl(TCG_COND_GE, cpu_PSW_V, temp, temp2);
 +        } else {
 +            /* overflow = (D[b] == 0) */
 +            tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, cpu_gpr_d[r2], 0);
 +        }
 +        tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
 +        /* sv */
 +        tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
 +        /* write result */
 +        tcg_gen_shri_tl(temp, cpu_gpr_d[r1], 8);
 +        tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], 24);
 +        tcg_gen_mov_tl(cpu_gpr_d[r3+1], temp);
 +
 +        tcg_temp_free(temp);
 +        tcg_temp_free(temp2);
 +        break;
 +    case OPC2_32_RR_DVINIT_H:
 +        gen_dvinit_h(env, cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1],
 +                     cpu_gpr_d[r2]);
 +        break;
 +    case OPC2_32_RR_DVINIT_HU:
 +        temp = tcg_temp_new();
 +        temp2 = tcg_temp_new();
 +        /* reset av */
 +        tcg_gen_movi_tl(cpu_PSW_AV, 0);
 +        if (!tricore_feature(env, TRICORE_FEATURE_131)) {
 +            /* overflow = (abs(D[r3+1]) >= abs(D[r2])) */
 +            tcg_gen_neg_tl(temp, cpu_gpr_d[r3+1]);
 +            /* use cpu_PSW_AV to compare against 0 */
 +            tcg_gen_movcond_tl(TCG_COND_LT, temp, cpu_gpr_d[r3+1], cpu_PSW_AV,
 +                               temp, cpu_gpr_d[r3+1]);
 +            tcg_gen_neg_tl(temp2, cpu_gpr_d[r2]);
 +            tcg_gen_movcond_tl(TCG_COND_LT, temp2, cpu_gpr_d[r2], cpu_PSW_AV,
 +                               temp2, cpu_gpr_d[r2]);
 +            tcg_gen_setcond_tl(TCG_COND_GE, cpu_PSW_V, temp, temp2);
 +        } else {
 +            /* overflow = (D[b] == 0) */
 +            tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, cpu_gpr_d[r2], 0);
 +        }
 +        tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
 +        /* sv */
 +        tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
 +        /* write result */
 +        tcg_gen_mov_tl(temp, cpu_gpr_d[r1]);
 +        tcg_gen_shri_tl(cpu_gpr_d[r3+1], temp, 16);
 +        tcg_gen_shli_tl(cpu_gpr_d[r3], temp, 16);
 +        tcg_temp_free(temp);
 +        tcg_temp_free(temp2);
 +        break;
 +    case OPC2_32_RR_DVINIT:
 +        temp = tcg_temp_new();
 +        temp2 = tcg_temp_new();
 +        /* overflow = ((D[b] == 0) ||
 +                      ((D[b] == 0xFFFFFFFF) && (D[a] == 0x80000000))) */
 +        tcg_gen_setcondi_tl(TCG_COND_EQ, temp, cpu_gpr_d[r2], 0xffffffff);
 +        tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, cpu_gpr_d[r1], 0x80000000);
 +        tcg_gen_and_tl(temp, temp, temp2);
 +        tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, cpu_gpr_d[r2], 0);
 +        tcg_gen_or_tl(cpu_PSW_V, temp, temp2);
 +        tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
 +        /* sv */
 +        tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
 +        /* reset av */
 +       tcg_gen_movi_tl(cpu_PSW_AV, 0);
 +        /* write result */
 +        tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]);
 +        /* sign extend to high reg */
 +        tcg_gen_sari_tl(cpu_gpr_d[r3+1], cpu_gpr_d[r1], 31);
 +        tcg_temp_free(temp);
 +        tcg_temp_free(temp2);
 +        break;
 +    case OPC2_32_RR_DVINIT_U:
 +        /* overflow = (D[b] == 0) */
 +        tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, cpu_gpr_d[r2], 0);
 +        tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31);
 +        /* sv */
 +        tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V);
 +        /* reset av */
 +        tcg_gen_movi_tl(cpu_PSW_AV, 0);
 +        /* write result */
 +        tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]);
 +        /* zero extend to high reg*/
 +        tcg_gen_movi_tl(cpu_gpr_d[r3+1], 0);
 +        break;
 +    case OPC2_32_RR_PARITY:
 +        gen_helper_parity(cpu_gpr_d[r3], cpu_gpr_d[r1]);
 +        break;
 +    case OPC2_32_RR_UNPACK:
 +        gen_unpack(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1]);
 +        break;
 +    }
 +}
 +
 +/* RR1 Format */
 +static void decode_rr1_mul(CPUTriCoreState *env, DisasContext *ctx)
 +{
 +    uint32_t op2;
 +
 +    int r1, r2, r3;
 +    TCGv n;
 +    TCGv_i64 temp64;
 +
 +    r1 = MASK_OP_RR1_S1(ctx->opcode);
 +    r2 = MASK_OP_RR1_S2(ctx->opcode);
 +    r3 = MASK_OP_RR1_D(ctx->opcode);
 +    n  = tcg_const_i32(MASK_OP_RR1_N(ctx->opcode));
 +    op2 = MASK_OP_RR1_OP2(ctx->opcode);
 +
 +    switch (op2) {
 +    case OPC2_32_RR1_MUL_H_32_LL:
 +        temp64 = tcg_temp_new_i64();
 +        GEN_HELPER_LL(mul_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
 +        tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
 +        gen_calc_usb_mul_h(cpu_gpr_d[r3], cpu_gpr_d[r3+1]);
 +        tcg_temp_free_i64(temp64);
 +        break;
 +    case OPC2_32_RR1_MUL_H_32_LU:
 +        temp64 = tcg_temp_new_i64();
 +        GEN_HELPER_LU(mul_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
 +        tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
 +        gen_calc_usb_mul_h(cpu_gpr_d[r3], cpu_gpr_d[r3+1]);
 +        tcg_temp_free_i64(temp64);
 +        break;
 +    case OPC2_32_RR1_MUL_H_32_UL:
 +        temp64 = tcg_temp_new_i64();
 +        GEN_HELPER_UL(mul_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
 +        tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
 +        gen_calc_usb_mul_h(cpu_gpr_d[r3], cpu_gpr_d[r3+1]);
 +        tcg_temp_free_i64(temp64);
 +        break;
 +    case OPC2_32_RR1_MUL_H_32_UU:
 +        temp64 = tcg_temp_new_i64();
 +        GEN_HELPER_UU(mul_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
 +        tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
 +        gen_calc_usb_mul_h(cpu_gpr_d[r3], cpu_gpr_d[r3+1]);
 +        tcg_temp_free_i64(temp64);
 +        break;
 +    case OPC2_32_RR1_MULM_H_64_LL:
 +        temp64 = tcg_temp_new_i64();
 +        GEN_HELPER_LL(mulm_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
 +        tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
 +        /* reset V bit */
 +        tcg_gen_movi_tl(cpu_PSW_V, 0);
 +        /* reset AV bit */
 +        tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V);
 +        tcg_temp_free_i64(temp64);
 +        break;
 +    case OPC2_32_RR1_MULM_H_64_LU:
 +        temp64 = tcg_temp_new_i64();
 +        GEN_HELPER_LU(mulm_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
 +        tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
 +        /* reset V bit */
 +        tcg_gen_movi_tl(cpu_PSW_V, 0);
 +        /* reset AV bit */
 +        tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V);
 +        tcg_temp_free_i64(temp64);
 +        break;
 +    case OPC2_32_RR1_MULM_H_64_UL:
 +        temp64 = tcg_temp_new_i64();
 +        GEN_HELPER_UL(mulm_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
 +        tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
 +        /* reset V bit */
 +        tcg_gen_movi_tl(cpu_PSW_V, 0);
 +        /* reset AV bit */
 +        tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V);
 +        tcg_temp_free_i64(temp64);
 +        break;
 +    case OPC2_32_RR1_MULM_H_64_UU:
 +        temp64 = tcg_temp_new_i64();
 +        GEN_HELPER_UU(mulm_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n);
 +        tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64);
 +        /* reset V bit */
 +        tcg_gen_movi_tl(cpu_PSW_V, 0);
 +        /* reset AV bit */
 +        tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V);
 +        tcg_temp_free_i64(temp64);
 +
 +        break;
 +    case OPC2_32_RR1_MULR_H_16_LL:
 +        GEN_HELPER_LL(mulr_h, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], n);
 +        gen_calc_usb_mulr_h(cpu_gpr_d[r3]);
 +        break;
 +    case OPC2_32_RR1_MULR_H_16_LU:
 +        GEN_HELPER_LU(mulr_h, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], n);
 +        gen_calc_usb_mulr_h(cpu_gpr_d[r3]);
 +        break;
 +    case OPC2_32_RR1_MULR_H_16_UL:
 +        GEN_HELPER_UL(mulr_h, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], n);
 +        gen_calc_usb_mulr_h(cpu_gpr_d[r3]);
 +        break;
 +    case OPC2_32_RR1_MULR_H_16_UU:
 +        GEN_HELPER_UU(mulr_h, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], n);
 +        gen_calc_usb_mulr_h(cpu_gpr_d[r3]);
 +        break;
 +    }
 +    tcg_temp_free(n);
 +}
 +
  static void decode_32Bit_opc(CPUTriCoreState *env, DisasContext *ctx)
  {
      int op1;
  
      op1 = MASK_OP_MAJOR(ctx->opcode);
  
 -    /* handle JNZ.T opcode only being 6 bit long */
 -    if (unlikely((op1 & 0x3f) == OPCM_32_BRN_JTT)) {
 +    /* handle JNZ.T opcode only being 7 bit long */
 +    if (unlikely((op1 & 0x7f) == OPCM_32_BRN_JTT)) {
          op1 = OPCM_32_BRN_JTT;
      }
  
      case OPC1_32_B_JA:
      case OPC1_32_B_JL:
      case OPC1_32_B_JLA:
 -        address = MASK_OP_B_DISP24(ctx->opcode);
 +        address = MASK_OP_B_DISP24_SEXT(ctx->opcode);
          gen_compute_branch(ctx, op1, 0, 0, 0, address);
          break;
  /* Bit-format */
          break;
  /* BOL-format */
      case OPC1_32_BOL_LD_A_LONGOFF:
 -    case OPC1_32_BOL_LD_W_LONFOFF:
 +    case OPC1_32_BOL_LD_W_LONGOFF:
      case OPC1_32_BOL_LEA_LONGOFF:
      case OPC1_32_BOL_ST_W_LONGOFF:
      case OPC1_32_BOL_ST_A_LONGOFF:
 +    case OPC1_32_BOL_LD_B_LONGOFF:
 +    case OPC1_32_BOL_LD_BU_LONGOFF:
 +    case OPC1_32_BOL_LD_H_LONGOFF:
 +    case OPC1_32_BOL_LD_HU_LONGOFF:
 +    case OPC1_32_BOL_ST_B_LONGOFF:
 +    case OPC1_32_BOL_ST_H_LONGOFF:
          decode_bol_opc(env, ctx, op1);
          break;
  /* BRC Format */
      case OPC1_32_RLC_ADDIH_A:
      case OPC1_32_RLC_MFCR:
      case OPC1_32_RLC_MOV:
 +    case OPC1_32_RLC_MOV_64:
      case OPC1_32_RLC_MOV_U:
      case OPC1_32_RLC_MOV_H:
      case OPC1_32_RLC_MOVH_A:
      case OPC1_32_RLC_MTCR:
          decode_rlc_opc(env, ctx, op1);
          break;
 +/* RR Format */
 +    case OPCM_32_RR_ACCUMULATOR:
 +        decode_rr_accumulator(env, ctx);
 +        break;
 +    case OPCM_32_RR_LOGICAL_SHIFT:
 +        decode_rr_logical_shift(env, ctx);
 +        break;
 +    case OPCM_32_RR_ADRESS:
 +        decode_rr_address(env, ctx);
 +        break;
 +    case OPCM_32_RR_IDIRECT:
 +        decode_rr_idirect(env, ctx);
 +        break;
 +    case OPCM_32_RR_DIVIDE:
 +        decode_rr_divide(env, ctx);
 +        break;
 +/* RR1 Format */
 +    case OPCM_32_RR1_MUL:
 +        decode_rr1_mul(env, ctx);
 +        break;
      }
  }
  
@@@ -5077,7 -4069,7 +5077,7 @@@ gen_intermediate_code_internal(TriCoreC
      ctx.mem_idx = cpu_mmu_index(env);
  
      tcg_clear_temp_count();
-     gen_tb_start();
+     gen_tb_start(tb);
      while (ctx.bstate == BS_NONE) {
          ctx.opcode = cpu_ldl_code(env, ctx.pc);
          decode_opc(env, &ctx, 0);