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