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