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_LEUQ); 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_LEUQ); 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 gen_goto_tb(DisasContext *ctx, int n, target_ulong dest) 3229 { 3230 if (translator_use_goto_tb(&ctx->base, dest)) { 3231 tcg_gen_goto_tb(n); 3232 gen_save_pc(dest); 3233 tcg_gen_exit_tb(ctx->base.tb, n); 3234 } else { 3235 gen_save_pc(dest); 3236 tcg_gen_lookup_and_goto_ptr(); 3237 } 3238 } 3239 3240 static void generate_trap(DisasContext *ctx, int class, int tin) 3241 { 3242 TCGv_i32 classtemp = tcg_const_i32(class); 3243 TCGv_i32 tintemp = tcg_const_i32(tin); 3244 3245 gen_save_pc(ctx->base.pc_next); 3246 gen_helper_raise_exception_sync(cpu_env, classtemp, tintemp); 3247 ctx->base.is_jmp = DISAS_NORETURN; 3248 3249 tcg_temp_free(classtemp); 3250 tcg_temp_free(tintemp); 3251 } 3252 3253 static inline void gen_branch_cond(DisasContext *ctx, TCGCond cond, TCGv r1, 3254 TCGv r2, int16_t address) 3255 { 3256 TCGLabel *jumpLabel = gen_new_label(); 3257 tcg_gen_brcond_tl(cond, r1, r2, jumpLabel); 3258 3259 gen_goto_tb(ctx, 1, ctx->pc_succ_insn); 3260 3261 gen_set_label(jumpLabel); 3262 gen_goto_tb(ctx, 0, ctx->base.pc_next + address * 2); 3263 } 3264 3265 static inline void gen_branch_condi(DisasContext *ctx, TCGCond cond, TCGv r1, 3266 int r2, int16_t address) 3267 { 3268 TCGv temp = tcg_const_i32(r2); 3269 gen_branch_cond(ctx, cond, r1, temp, address); 3270 tcg_temp_free(temp); 3271 } 3272 3273 static void gen_loop(DisasContext *ctx, int r1, int32_t offset) 3274 { 3275 TCGLabel *l1 = gen_new_label(); 3276 3277 tcg_gen_subi_tl(cpu_gpr_a[r1], cpu_gpr_a[r1], 1); 3278 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr_a[r1], -1, l1); 3279 gen_goto_tb(ctx, 1, ctx->base.pc_next + offset); 3280 gen_set_label(l1); 3281 gen_goto_tb(ctx, 0, ctx->pc_succ_insn); 3282 } 3283 3284 static void gen_fcall_save_ctx(DisasContext *ctx) 3285 { 3286 TCGv temp = tcg_temp_new(); 3287 3288 tcg_gen_addi_tl(temp, cpu_gpr_a[10], -4); 3289 tcg_gen_qemu_st_tl(cpu_gpr_a[11], temp, ctx->mem_idx, MO_LESL); 3290 tcg_gen_movi_tl(cpu_gpr_a[11], ctx->pc_succ_insn); 3291 tcg_gen_mov_tl(cpu_gpr_a[10], temp); 3292 3293 tcg_temp_free(temp); 3294 } 3295 3296 static void gen_fret(DisasContext *ctx) 3297 { 3298 TCGv temp = tcg_temp_new(); 3299 3300 tcg_gen_andi_tl(temp, cpu_gpr_a[11], ~0x1); 3301 tcg_gen_qemu_ld_tl(cpu_gpr_a[11], cpu_gpr_a[10], ctx->mem_idx, MO_LESL); 3302 tcg_gen_addi_tl(cpu_gpr_a[10], cpu_gpr_a[10], 4); 3303 tcg_gen_mov_tl(cpu_PC, temp); 3304 tcg_gen_exit_tb(NULL, 0); 3305 ctx->base.is_jmp = DISAS_NORETURN; 3306 3307 tcg_temp_free(temp); 3308 } 3309 3310 static void gen_compute_branch(DisasContext *ctx, uint32_t opc, int r1, 3311 int r2 , int32_t constant , int32_t offset) 3312 { 3313 TCGv temp, temp2; 3314 int n; 3315 3316 switch (opc) { 3317 /* SB-format jumps */ 3318 case OPC1_16_SB_J: 3319 case OPC1_32_B_J: 3320 gen_goto_tb(ctx, 0, ctx->base.pc_next + offset * 2); 3321 break; 3322 case OPC1_32_B_CALL: 3323 case OPC1_16_SB_CALL: 3324 gen_helper_1arg(call, ctx->pc_succ_insn); 3325 gen_goto_tb(ctx, 0, ctx->base.pc_next + offset * 2); 3326 break; 3327 case OPC1_16_SB_JZ: 3328 gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_d[15], 0, offset); 3329 break; 3330 case OPC1_16_SB_JNZ: 3331 gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_d[15], 0, offset); 3332 break; 3333 /* SBC-format jumps */ 3334 case OPC1_16_SBC_JEQ: 3335 gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_d[15], constant, offset); 3336 break; 3337 case OPC1_16_SBC_JEQ2: 3338 gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_d[15], constant, 3339 offset + 16); 3340 break; 3341 case OPC1_16_SBC_JNE: 3342 gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_d[15], constant, offset); 3343 break; 3344 case OPC1_16_SBC_JNE2: 3345 gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_d[15], 3346 constant, offset + 16); 3347 break; 3348 /* SBRN-format jumps */ 3349 case OPC1_16_SBRN_JZ_T: 3350 temp = tcg_temp_new(); 3351 tcg_gen_andi_tl(temp, cpu_gpr_d[15], 0x1u << constant); 3352 gen_branch_condi(ctx, TCG_COND_EQ, temp, 0, offset); 3353 tcg_temp_free(temp); 3354 break; 3355 case OPC1_16_SBRN_JNZ_T: 3356 temp = tcg_temp_new(); 3357 tcg_gen_andi_tl(temp, cpu_gpr_d[15], 0x1u << constant); 3358 gen_branch_condi(ctx, TCG_COND_NE, temp, 0, offset); 3359 tcg_temp_free(temp); 3360 break; 3361 /* SBR-format jumps */ 3362 case OPC1_16_SBR_JEQ: 3363 gen_branch_cond(ctx, TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[15], 3364 offset); 3365 break; 3366 case OPC1_16_SBR_JEQ2: 3367 gen_branch_cond(ctx, TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[15], 3368 offset + 16); 3369 break; 3370 case OPC1_16_SBR_JNE: 3371 gen_branch_cond(ctx, TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[15], 3372 offset); 3373 break; 3374 case OPC1_16_SBR_JNE2: 3375 gen_branch_cond(ctx, TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[15], 3376 offset + 16); 3377 break; 3378 case OPC1_16_SBR_JNZ: 3379 gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_d[r1], 0, offset); 3380 break; 3381 case OPC1_16_SBR_JNZ_A: 3382 gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_a[r1], 0, offset); 3383 break; 3384 case OPC1_16_SBR_JGEZ: 3385 gen_branch_condi(ctx, TCG_COND_GE, cpu_gpr_d[r1], 0, offset); 3386 break; 3387 case OPC1_16_SBR_JGTZ: 3388 gen_branch_condi(ctx, TCG_COND_GT, cpu_gpr_d[r1], 0, offset); 3389 break; 3390 case OPC1_16_SBR_JLEZ: 3391 gen_branch_condi(ctx, TCG_COND_LE, cpu_gpr_d[r1], 0, offset); 3392 break; 3393 case OPC1_16_SBR_JLTZ: 3394 gen_branch_condi(ctx, TCG_COND_LT, cpu_gpr_d[r1], 0, offset); 3395 break; 3396 case OPC1_16_SBR_JZ: 3397 gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_d[r1], 0, offset); 3398 break; 3399 case OPC1_16_SBR_JZ_A: 3400 gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_a[r1], 0, offset); 3401 break; 3402 case OPC1_16_SBR_LOOP: 3403 gen_loop(ctx, r1, offset * 2 - 32); 3404 break; 3405 /* SR-format jumps */ 3406 case OPC1_16_SR_JI: 3407 tcg_gen_andi_tl(cpu_PC, cpu_gpr_a[r1], 0xfffffffe); 3408 tcg_gen_exit_tb(NULL, 0); 3409 break; 3410 case OPC2_32_SYS_RET: 3411 case OPC2_16_SR_RET: 3412 gen_helper_ret(cpu_env); 3413 tcg_gen_exit_tb(NULL, 0); 3414 break; 3415 /* B-format */ 3416 case OPC1_32_B_CALLA: 3417 gen_helper_1arg(call, ctx->pc_succ_insn); 3418 gen_goto_tb(ctx, 0, EA_B_ABSOLUT(offset)); 3419 break; 3420 case OPC1_32_B_FCALL: 3421 gen_fcall_save_ctx(ctx); 3422 gen_goto_tb(ctx, 0, ctx->base.pc_next + offset * 2); 3423 break; 3424 case OPC1_32_B_FCALLA: 3425 gen_fcall_save_ctx(ctx); 3426 gen_goto_tb(ctx, 0, EA_B_ABSOLUT(offset)); 3427 break; 3428 case OPC1_32_B_JLA: 3429 tcg_gen_movi_tl(cpu_gpr_a[11], ctx->pc_succ_insn); 3430 /* fall through */ 3431 case OPC1_32_B_JA: 3432 gen_goto_tb(ctx, 0, EA_B_ABSOLUT(offset)); 3433 break; 3434 case OPC1_32_B_JL: 3435 tcg_gen_movi_tl(cpu_gpr_a[11], ctx->pc_succ_insn); 3436 gen_goto_tb(ctx, 0, ctx->base.pc_next + offset * 2); 3437 break; 3438 /* BOL format */ 3439 case OPCM_32_BRC_EQ_NEQ: 3440 if (MASK_OP_BRC_OP2(ctx->opcode) == OPC2_32_BRC_JEQ) { 3441 gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_d[r1], constant, offset); 3442 } else { 3443 gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_d[r1], constant, offset); 3444 } 3445 break; 3446 case OPCM_32_BRC_GE: 3447 if (MASK_OP_BRC_OP2(ctx->opcode) == OP2_32_BRC_JGE) { 3448 gen_branch_condi(ctx, TCG_COND_GE, cpu_gpr_d[r1], constant, offset); 3449 } else { 3450 constant = MASK_OP_BRC_CONST4(ctx->opcode); 3451 gen_branch_condi(ctx, TCG_COND_GEU, cpu_gpr_d[r1], constant, 3452 offset); 3453 } 3454 break; 3455 case OPCM_32_BRC_JLT: 3456 if (MASK_OP_BRC_OP2(ctx->opcode) == OPC2_32_BRC_JLT) { 3457 gen_branch_condi(ctx, TCG_COND_LT, cpu_gpr_d[r1], constant, offset); 3458 } else { 3459 constant = MASK_OP_BRC_CONST4(ctx->opcode); 3460 gen_branch_condi(ctx, TCG_COND_LTU, cpu_gpr_d[r1], constant, 3461 offset); 3462 } 3463 break; 3464 case OPCM_32_BRC_JNE: 3465 temp = tcg_temp_new(); 3466 if (MASK_OP_BRC_OP2(ctx->opcode) == OPC2_32_BRC_JNED) { 3467 tcg_gen_mov_tl(temp, cpu_gpr_d[r1]); 3468 /* subi is unconditional */ 3469 tcg_gen_subi_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 1); 3470 gen_branch_condi(ctx, TCG_COND_NE, temp, constant, offset); 3471 } else { 3472 tcg_gen_mov_tl(temp, cpu_gpr_d[r1]); 3473 /* addi is unconditional */ 3474 tcg_gen_addi_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 1); 3475 gen_branch_condi(ctx, TCG_COND_NE, temp, constant, offset); 3476 } 3477 tcg_temp_free(temp); 3478 break; 3479 /* BRN format */ 3480 case OPCM_32_BRN_JTT: 3481 n = MASK_OP_BRN_N(ctx->opcode); 3482 3483 temp = tcg_temp_new(); 3484 tcg_gen_andi_tl(temp, cpu_gpr_d[r1], (1 << n)); 3485 3486 if (MASK_OP_BRN_OP2(ctx->opcode) == OPC2_32_BRN_JNZ_T) { 3487 gen_branch_condi(ctx, TCG_COND_NE, temp, 0, offset); 3488 } else { 3489 gen_branch_condi(ctx, TCG_COND_EQ, temp, 0, offset); 3490 } 3491 tcg_temp_free(temp); 3492 break; 3493 /* BRR Format */ 3494 case OPCM_32_BRR_EQ_NEQ: 3495 if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_JEQ) { 3496 gen_branch_cond(ctx, TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[r2], 3497 offset); 3498 } else { 3499 gen_branch_cond(ctx, TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[r2], 3500 offset); 3501 } 3502 break; 3503 case OPCM_32_BRR_ADDR_EQ_NEQ: 3504 if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_JEQ_A) { 3505 gen_branch_cond(ctx, TCG_COND_EQ, cpu_gpr_a[r1], cpu_gpr_a[r2], 3506 offset); 3507 } else { 3508 gen_branch_cond(ctx, TCG_COND_NE, cpu_gpr_a[r1], cpu_gpr_a[r2], 3509 offset); 3510 } 3511 break; 3512 case OPCM_32_BRR_GE: 3513 if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_JGE) { 3514 gen_branch_cond(ctx, TCG_COND_GE, cpu_gpr_d[r1], cpu_gpr_d[r2], 3515 offset); 3516 } else { 3517 gen_branch_cond(ctx, TCG_COND_GEU, cpu_gpr_d[r1], cpu_gpr_d[r2], 3518 offset); 3519 } 3520 break; 3521 case OPCM_32_BRR_JLT: 3522 if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_JLT) { 3523 gen_branch_cond(ctx, TCG_COND_LT, cpu_gpr_d[r1], cpu_gpr_d[r2], 3524 offset); 3525 } else { 3526 gen_branch_cond(ctx, TCG_COND_LTU, cpu_gpr_d[r1], cpu_gpr_d[r2], 3527 offset); 3528 } 3529 break; 3530 case OPCM_32_BRR_LOOP: 3531 if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_LOOP) { 3532 gen_loop(ctx, r2, offset * 2); 3533 } else { 3534 /* OPC2_32_BRR_LOOPU */ 3535 gen_goto_tb(ctx, 0, ctx->base.pc_next + offset * 2); 3536 } 3537 break; 3538 case OPCM_32_BRR_JNE: 3539 temp = tcg_temp_new(); 3540 temp2 = tcg_temp_new(); 3541 if (MASK_OP_BRC_OP2(ctx->opcode) == OPC2_32_BRR_JNED) { 3542 tcg_gen_mov_tl(temp, cpu_gpr_d[r1]); 3543 /* also save r2, in case of r1 == r2, so r2 is not decremented */ 3544 tcg_gen_mov_tl(temp2, cpu_gpr_d[r2]); 3545 /* subi is unconditional */ 3546 tcg_gen_subi_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 1); 3547 gen_branch_cond(ctx, TCG_COND_NE, temp, temp2, offset); 3548 } else { 3549 tcg_gen_mov_tl(temp, cpu_gpr_d[r1]); 3550 /* also save r2, in case of r1 == r2, so r2 is not decremented */ 3551 tcg_gen_mov_tl(temp2, cpu_gpr_d[r2]); 3552 /* addi is unconditional */ 3553 tcg_gen_addi_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 1); 3554 gen_branch_cond(ctx, TCG_COND_NE, temp, temp2, offset); 3555 } 3556 tcg_temp_free(temp); 3557 tcg_temp_free(temp2); 3558 break; 3559 case OPCM_32_BRR_JNZ: 3560 if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_JNZ_A) { 3561 gen_branch_condi(ctx, TCG_COND_NE, cpu_gpr_a[r1], 0, offset); 3562 } else { 3563 gen_branch_condi(ctx, TCG_COND_EQ, cpu_gpr_a[r1], 0, offset); 3564 } 3565 break; 3566 default: 3567 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 3568 } 3569 ctx->base.is_jmp = DISAS_NORETURN; 3570 } 3571 3572 3573 /* 3574 * Functions for decoding instructions 3575 */ 3576 3577 static void decode_src_opc(DisasContext *ctx, int op1) 3578 { 3579 int r1; 3580 int32_t const4; 3581 TCGv temp, temp2; 3582 3583 r1 = MASK_OP_SRC_S1D(ctx->opcode); 3584 const4 = MASK_OP_SRC_CONST4_SEXT(ctx->opcode); 3585 3586 switch (op1) { 3587 case OPC1_16_SRC_ADD: 3588 gen_addi_d(cpu_gpr_d[r1], cpu_gpr_d[r1], const4); 3589 break; 3590 case OPC1_16_SRC_ADD_A15: 3591 gen_addi_d(cpu_gpr_d[r1], cpu_gpr_d[15], const4); 3592 break; 3593 case OPC1_16_SRC_ADD_15A: 3594 gen_addi_d(cpu_gpr_d[15], cpu_gpr_d[r1], const4); 3595 break; 3596 case OPC1_16_SRC_ADD_A: 3597 tcg_gen_addi_tl(cpu_gpr_a[r1], cpu_gpr_a[r1], const4); 3598 break; 3599 case OPC1_16_SRC_CADD: 3600 gen_condi_add(TCG_COND_NE, cpu_gpr_d[r1], const4, cpu_gpr_d[r1], 3601 cpu_gpr_d[15]); 3602 break; 3603 case OPC1_16_SRC_CADDN: 3604 gen_condi_add(TCG_COND_EQ, cpu_gpr_d[r1], const4, cpu_gpr_d[r1], 3605 cpu_gpr_d[15]); 3606 break; 3607 case OPC1_16_SRC_CMOV: 3608 temp = tcg_const_tl(0); 3609 temp2 = tcg_const_tl(const4); 3610 tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[15], temp, 3611 temp2, cpu_gpr_d[r1]); 3612 tcg_temp_free(temp); 3613 tcg_temp_free(temp2); 3614 break; 3615 case OPC1_16_SRC_CMOVN: 3616 temp = tcg_const_tl(0); 3617 temp2 = tcg_const_tl(const4); 3618 tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[15], temp, 3619 temp2, cpu_gpr_d[r1]); 3620 tcg_temp_free(temp); 3621 tcg_temp_free(temp2); 3622 break; 3623 case OPC1_16_SRC_EQ: 3624 tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_gpr_d[15], cpu_gpr_d[r1], 3625 const4); 3626 break; 3627 case OPC1_16_SRC_LT: 3628 tcg_gen_setcondi_tl(TCG_COND_LT, cpu_gpr_d[15], cpu_gpr_d[r1], 3629 const4); 3630 break; 3631 case OPC1_16_SRC_MOV: 3632 tcg_gen_movi_tl(cpu_gpr_d[r1], const4); 3633 break; 3634 case OPC1_16_SRC_MOV_A: 3635 const4 = MASK_OP_SRC_CONST4(ctx->opcode); 3636 tcg_gen_movi_tl(cpu_gpr_a[r1], const4); 3637 break; 3638 case OPC1_16_SRC_MOV_E: 3639 if (has_feature(ctx, TRICORE_FEATURE_16)) { 3640 tcg_gen_movi_tl(cpu_gpr_d[r1], const4); 3641 tcg_gen_sari_tl(cpu_gpr_d[r1+1], cpu_gpr_d[r1], 31); 3642 } else { 3643 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 3644 } 3645 break; 3646 case OPC1_16_SRC_SH: 3647 gen_shi(cpu_gpr_d[r1], cpu_gpr_d[r1], const4); 3648 break; 3649 case OPC1_16_SRC_SHA: 3650 gen_shaci(cpu_gpr_d[r1], cpu_gpr_d[r1], const4); 3651 break; 3652 default: 3653 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 3654 } 3655 } 3656 3657 static void decode_srr_opc(DisasContext *ctx, int op1) 3658 { 3659 int r1, r2; 3660 TCGv temp; 3661 3662 r1 = MASK_OP_SRR_S1D(ctx->opcode); 3663 r2 = MASK_OP_SRR_S2(ctx->opcode); 3664 3665 switch (op1) { 3666 case OPC1_16_SRR_ADD: 3667 gen_add_d(cpu_gpr_d[r1], cpu_gpr_d[r1], cpu_gpr_d[r2]); 3668 break; 3669 case OPC1_16_SRR_ADD_A15: 3670 gen_add_d(cpu_gpr_d[r1], cpu_gpr_d[15], cpu_gpr_d[r2]); 3671 break; 3672 case OPC1_16_SRR_ADD_15A: 3673 gen_add_d(cpu_gpr_d[15], cpu_gpr_d[r1], cpu_gpr_d[r2]); 3674 break; 3675 case OPC1_16_SRR_ADD_A: 3676 tcg_gen_add_tl(cpu_gpr_a[r1], cpu_gpr_a[r1], cpu_gpr_a[r2]); 3677 break; 3678 case OPC1_16_SRR_ADDS: 3679 gen_adds(cpu_gpr_d[r1], cpu_gpr_d[r1], cpu_gpr_d[r2]); 3680 break; 3681 case OPC1_16_SRR_AND: 3682 tcg_gen_and_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], cpu_gpr_d[r2]); 3683 break; 3684 case OPC1_16_SRR_CMOV: 3685 temp = tcg_const_tl(0); 3686 tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[15], temp, 3687 cpu_gpr_d[r2], cpu_gpr_d[r1]); 3688 tcg_temp_free(temp); 3689 break; 3690 case OPC1_16_SRR_CMOVN: 3691 temp = tcg_const_tl(0); 3692 tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[15], temp, 3693 cpu_gpr_d[r2], cpu_gpr_d[r1]); 3694 tcg_temp_free(temp); 3695 break; 3696 case OPC1_16_SRR_EQ: 3697 tcg_gen_setcond_tl(TCG_COND_EQ, cpu_gpr_d[15], cpu_gpr_d[r1], 3698 cpu_gpr_d[r2]); 3699 break; 3700 case OPC1_16_SRR_LT: 3701 tcg_gen_setcond_tl(TCG_COND_LT, cpu_gpr_d[15], cpu_gpr_d[r1], 3702 cpu_gpr_d[r2]); 3703 break; 3704 case OPC1_16_SRR_MOV: 3705 tcg_gen_mov_tl(cpu_gpr_d[r1], cpu_gpr_d[r2]); 3706 break; 3707 case OPC1_16_SRR_MOV_A: 3708 tcg_gen_mov_tl(cpu_gpr_a[r1], cpu_gpr_d[r2]); 3709 break; 3710 case OPC1_16_SRR_MOV_AA: 3711 tcg_gen_mov_tl(cpu_gpr_a[r1], cpu_gpr_a[r2]); 3712 break; 3713 case OPC1_16_SRR_MOV_D: 3714 tcg_gen_mov_tl(cpu_gpr_d[r1], cpu_gpr_a[r2]); 3715 break; 3716 case OPC1_16_SRR_MUL: 3717 gen_mul_i32s(cpu_gpr_d[r1], cpu_gpr_d[r1], cpu_gpr_d[r2]); 3718 break; 3719 case OPC1_16_SRR_OR: 3720 tcg_gen_or_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], cpu_gpr_d[r2]); 3721 break; 3722 case OPC1_16_SRR_SUB: 3723 gen_sub_d(cpu_gpr_d[r1], cpu_gpr_d[r1], cpu_gpr_d[r2]); 3724 break; 3725 case OPC1_16_SRR_SUB_A15B: 3726 gen_sub_d(cpu_gpr_d[r1], cpu_gpr_d[15], cpu_gpr_d[r2]); 3727 break; 3728 case OPC1_16_SRR_SUB_15AB: 3729 gen_sub_d(cpu_gpr_d[15], cpu_gpr_d[r1], cpu_gpr_d[r2]); 3730 break; 3731 case OPC1_16_SRR_SUBS: 3732 gen_subs(cpu_gpr_d[r1], cpu_gpr_d[r1], cpu_gpr_d[r2]); 3733 break; 3734 case OPC1_16_SRR_XOR: 3735 tcg_gen_xor_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], cpu_gpr_d[r2]); 3736 break; 3737 default: 3738 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 3739 } 3740 } 3741 3742 static void decode_ssr_opc(DisasContext *ctx, int op1) 3743 { 3744 int r1, r2; 3745 3746 r1 = MASK_OP_SSR_S1(ctx->opcode); 3747 r2 = MASK_OP_SSR_S2(ctx->opcode); 3748 3749 switch (op1) { 3750 case OPC1_16_SSR_ST_A: 3751 tcg_gen_qemu_st_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LEUL); 3752 break; 3753 case OPC1_16_SSR_ST_A_POSTINC: 3754 tcg_gen_qemu_st_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LEUL); 3755 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 4); 3756 break; 3757 case OPC1_16_SSR_ST_B: 3758 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_UB); 3759 break; 3760 case OPC1_16_SSR_ST_B_POSTINC: 3761 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_UB); 3762 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 1); 3763 break; 3764 case OPC1_16_SSR_ST_H: 3765 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LEUW); 3766 break; 3767 case OPC1_16_SSR_ST_H_POSTINC: 3768 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LEUW); 3769 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 2); 3770 break; 3771 case OPC1_16_SSR_ST_W: 3772 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LEUL); 3773 break; 3774 case OPC1_16_SSR_ST_W_POSTINC: 3775 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LEUL); 3776 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 4); 3777 break; 3778 default: 3779 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 3780 } 3781 } 3782 3783 static void decode_sc_opc(DisasContext *ctx, int op1) 3784 { 3785 int32_t const16; 3786 3787 const16 = MASK_OP_SC_CONST8(ctx->opcode); 3788 3789 switch (op1) { 3790 case OPC1_16_SC_AND: 3791 tcg_gen_andi_tl(cpu_gpr_d[15], cpu_gpr_d[15], const16); 3792 break; 3793 case OPC1_16_SC_BISR: 3794 gen_helper_1arg(bisr, const16 & 0xff); 3795 break; 3796 case OPC1_16_SC_LD_A: 3797 gen_offset_ld(ctx, cpu_gpr_a[15], cpu_gpr_a[10], const16 * 4, MO_LESL); 3798 break; 3799 case OPC1_16_SC_LD_W: 3800 gen_offset_ld(ctx, cpu_gpr_d[15], cpu_gpr_a[10], const16 * 4, MO_LESL); 3801 break; 3802 case OPC1_16_SC_MOV: 3803 tcg_gen_movi_tl(cpu_gpr_d[15], const16); 3804 break; 3805 case OPC1_16_SC_OR: 3806 tcg_gen_ori_tl(cpu_gpr_d[15], cpu_gpr_d[15], const16); 3807 break; 3808 case OPC1_16_SC_ST_A: 3809 gen_offset_st(ctx, cpu_gpr_a[15], cpu_gpr_a[10], const16 * 4, MO_LESL); 3810 break; 3811 case OPC1_16_SC_ST_W: 3812 gen_offset_st(ctx, cpu_gpr_d[15], cpu_gpr_a[10], const16 * 4, MO_LESL); 3813 break; 3814 case OPC1_16_SC_SUB_A: 3815 tcg_gen_subi_tl(cpu_gpr_a[10], cpu_gpr_a[10], const16); 3816 break; 3817 default: 3818 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 3819 } 3820 } 3821 3822 static void decode_slr_opc(DisasContext *ctx, int op1) 3823 { 3824 int r1, r2; 3825 3826 r1 = MASK_OP_SLR_D(ctx->opcode); 3827 r2 = MASK_OP_SLR_S2(ctx->opcode); 3828 3829 switch (op1) { 3830 /* SLR-format */ 3831 case OPC1_16_SLR_LD_A: 3832 tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESL); 3833 break; 3834 case OPC1_16_SLR_LD_A_POSTINC: 3835 tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESL); 3836 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 4); 3837 break; 3838 case OPC1_16_SLR_LD_BU: 3839 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_UB); 3840 break; 3841 case OPC1_16_SLR_LD_BU_POSTINC: 3842 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_UB); 3843 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 1); 3844 break; 3845 case OPC1_16_SLR_LD_H: 3846 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESW); 3847 break; 3848 case OPC1_16_SLR_LD_H_POSTINC: 3849 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESW); 3850 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 2); 3851 break; 3852 case OPC1_16_SLR_LD_W: 3853 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESL); 3854 break; 3855 case OPC1_16_SLR_LD_W_POSTINC: 3856 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, MO_LESL); 3857 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], 4); 3858 break; 3859 default: 3860 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 3861 } 3862 } 3863 3864 static void decode_sro_opc(DisasContext *ctx, int op1) 3865 { 3866 int r2; 3867 int32_t address; 3868 3869 r2 = MASK_OP_SRO_S2(ctx->opcode); 3870 address = MASK_OP_SRO_OFF4(ctx->opcode); 3871 3872 /* SRO-format */ 3873 switch (op1) { 3874 case OPC1_16_SRO_LD_A: 3875 gen_offset_ld(ctx, cpu_gpr_a[15], cpu_gpr_a[r2], address * 4, MO_LESL); 3876 break; 3877 case OPC1_16_SRO_LD_BU: 3878 gen_offset_ld(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address, MO_UB); 3879 break; 3880 case OPC1_16_SRO_LD_H: 3881 gen_offset_ld(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address, MO_LESW); 3882 break; 3883 case OPC1_16_SRO_LD_W: 3884 gen_offset_ld(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address * 4, MO_LESL); 3885 break; 3886 case OPC1_16_SRO_ST_A: 3887 gen_offset_st(ctx, cpu_gpr_a[15], cpu_gpr_a[r2], address * 4, MO_LESL); 3888 break; 3889 case OPC1_16_SRO_ST_B: 3890 gen_offset_st(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address, MO_UB); 3891 break; 3892 case OPC1_16_SRO_ST_H: 3893 gen_offset_st(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address * 2, MO_LESW); 3894 break; 3895 case OPC1_16_SRO_ST_W: 3896 gen_offset_st(ctx, cpu_gpr_d[15], cpu_gpr_a[r2], address * 4, MO_LESL); 3897 break; 3898 default: 3899 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 3900 } 3901 } 3902 3903 static void decode_sr_system(DisasContext *ctx) 3904 { 3905 uint32_t op2; 3906 op2 = MASK_OP_SR_OP2(ctx->opcode); 3907 3908 switch (op2) { 3909 case OPC2_16_SR_NOP: 3910 break; 3911 case OPC2_16_SR_RET: 3912 gen_compute_branch(ctx, op2, 0, 0, 0, 0); 3913 break; 3914 case OPC2_16_SR_RFE: 3915 gen_helper_rfe(cpu_env); 3916 tcg_gen_exit_tb(NULL, 0); 3917 ctx->base.is_jmp = DISAS_NORETURN; 3918 break; 3919 case OPC2_16_SR_DEBUG: 3920 /* raise EXCP_DEBUG */ 3921 break; 3922 case OPC2_16_SR_FRET: 3923 gen_fret(ctx); 3924 break; 3925 default: 3926 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 3927 } 3928 } 3929 3930 static void decode_sr_accu(DisasContext *ctx) 3931 { 3932 uint32_t op2; 3933 uint32_t r1; 3934 TCGv temp; 3935 3936 r1 = MASK_OP_SR_S1D(ctx->opcode); 3937 op2 = MASK_OP_SR_OP2(ctx->opcode); 3938 3939 switch (op2) { 3940 case OPC2_16_SR_RSUB: 3941 /* overflow only if r1 = -0x80000000 */ 3942 temp = tcg_const_i32(-0x80000000); 3943 /* calc V bit */ 3944 tcg_gen_setcond_tl(TCG_COND_EQ, cpu_PSW_V, cpu_gpr_d[r1], temp); 3945 tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31); 3946 /* calc SV bit */ 3947 tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V); 3948 /* sub */ 3949 tcg_gen_neg_tl(cpu_gpr_d[r1], cpu_gpr_d[r1]); 3950 /* calc av */ 3951 tcg_gen_add_tl(cpu_PSW_AV, cpu_gpr_d[r1], cpu_gpr_d[r1]); 3952 tcg_gen_xor_tl(cpu_PSW_AV, cpu_gpr_d[r1], cpu_PSW_AV); 3953 /* calc sav */ 3954 tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); 3955 tcg_temp_free(temp); 3956 break; 3957 case OPC2_16_SR_SAT_B: 3958 gen_saturate(cpu_gpr_d[r1], cpu_gpr_d[r1], 0x7f, -0x80); 3959 break; 3960 case OPC2_16_SR_SAT_BU: 3961 gen_saturate_u(cpu_gpr_d[r1], cpu_gpr_d[r1], 0xff); 3962 break; 3963 case OPC2_16_SR_SAT_H: 3964 gen_saturate(cpu_gpr_d[r1], cpu_gpr_d[r1], 0x7fff, -0x8000); 3965 break; 3966 case OPC2_16_SR_SAT_HU: 3967 gen_saturate_u(cpu_gpr_d[r1], cpu_gpr_d[r1], 0xffff); 3968 break; 3969 default: 3970 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 3971 } 3972 } 3973 3974 static void decode_16Bit_opc(DisasContext *ctx) 3975 { 3976 int op1; 3977 int r1, r2; 3978 int32_t const16; 3979 int32_t address; 3980 TCGv temp; 3981 3982 op1 = MASK_OP_MAJOR(ctx->opcode); 3983 3984 /* handle ADDSC.A opcode only being 6 bit long */ 3985 if (unlikely((op1 & 0x3f) == OPC1_16_SRRS_ADDSC_A)) { 3986 op1 = OPC1_16_SRRS_ADDSC_A; 3987 } 3988 3989 switch (op1) { 3990 case OPC1_16_SRC_ADD: 3991 case OPC1_16_SRC_ADD_A15: 3992 case OPC1_16_SRC_ADD_15A: 3993 case OPC1_16_SRC_ADD_A: 3994 case OPC1_16_SRC_CADD: 3995 case OPC1_16_SRC_CADDN: 3996 case OPC1_16_SRC_CMOV: 3997 case OPC1_16_SRC_CMOVN: 3998 case OPC1_16_SRC_EQ: 3999 case OPC1_16_SRC_LT: 4000 case OPC1_16_SRC_MOV: 4001 case OPC1_16_SRC_MOV_A: 4002 case OPC1_16_SRC_MOV_E: 4003 case OPC1_16_SRC_SH: 4004 case OPC1_16_SRC_SHA: 4005 decode_src_opc(ctx, op1); 4006 break; 4007 /* SRR-format */ 4008 case OPC1_16_SRR_ADD: 4009 case OPC1_16_SRR_ADD_A15: 4010 case OPC1_16_SRR_ADD_15A: 4011 case OPC1_16_SRR_ADD_A: 4012 case OPC1_16_SRR_ADDS: 4013 case OPC1_16_SRR_AND: 4014 case OPC1_16_SRR_CMOV: 4015 case OPC1_16_SRR_CMOVN: 4016 case OPC1_16_SRR_EQ: 4017 case OPC1_16_SRR_LT: 4018 case OPC1_16_SRR_MOV: 4019 case OPC1_16_SRR_MOV_A: 4020 case OPC1_16_SRR_MOV_AA: 4021 case OPC1_16_SRR_MOV_D: 4022 case OPC1_16_SRR_MUL: 4023 case OPC1_16_SRR_OR: 4024 case OPC1_16_SRR_SUB: 4025 case OPC1_16_SRR_SUB_A15B: 4026 case OPC1_16_SRR_SUB_15AB: 4027 case OPC1_16_SRR_SUBS: 4028 case OPC1_16_SRR_XOR: 4029 decode_srr_opc(ctx, op1); 4030 break; 4031 /* SSR-format */ 4032 case OPC1_16_SSR_ST_A: 4033 case OPC1_16_SSR_ST_A_POSTINC: 4034 case OPC1_16_SSR_ST_B: 4035 case OPC1_16_SSR_ST_B_POSTINC: 4036 case OPC1_16_SSR_ST_H: 4037 case OPC1_16_SSR_ST_H_POSTINC: 4038 case OPC1_16_SSR_ST_W: 4039 case OPC1_16_SSR_ST_W_POSTINC: 4040 decode_ssr_opc(ctx, op1); 4041 break; 4042 /* SRRS-format */ 4043 case OPC1_16_SRRS_ADDSC_A: 4044 r2 = MASK_OP_SRRS_S2(ctx->opcode); 4045 r1 = MASK_OP_SRRS_S1D(ctx->opcode); 4046 const16 = MASK_OP_SRRS_N(ctx->opcode); 4047 temp = tcg_temp_new(); 4048 tcg_gen_shli_tl(temp, cpu_gpr_d[15], const16); 4049 tcg_gen_add_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], temp); 4050 tcg_temp_free(temp); 4051 break; 4052 /* SLRO-format */ 4053 case OPC1_16_SLRO_LD_A: 4054 r1 = MASK_OP_SLRO_D(ctx->opcode); 4055 const16 = MASK_OP_SLRO_OFF4(ctx->opcode); 4056 gen_offset_ld(ctx, cpu_gpr_a[r1], cpu_gpr_a[15], const16 * 4, MO_LESL); 4057 break; 4058 case OPC1_16_SLRO_LD_BU: 4059 r1 = MASK_OP_SLRO_D(ctx->opcode); 4060 const16 = MASK_OP_SLRO_OFF4(ctx->opcode); 4061 gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16, MO_UB); 4062 break; 4063 case OPC1_16_SLRO_LD_H: 4064 r1 = MASK_OP_SLRO_D(ctx->opcode); 4065 const16 = MASK_OP_SLRO_OFF4(ctx->opcode); 4066 gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16 * 2, MO_LESW); 4067 break; 4068 case OPC1_16_SLRO_LD_W: 4069 r1 = MASK_OP_SLRO_D(ctx->opcode); 4070 const16 = MASK_OP_SLRO_OFF4(ctx->opcode); 4071 gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16 * 4, MO_LESL); 4072 break; 4073 /* SB-format */ 4074 case OPC1_16_SB_CALL: 4075 case OPC1_16_SB_J: 4076 case OPC1_16_SB_JNZ: 4077 case OPC1_16_SB_JZ: 4078 address = MASK_OP_SB_DISP8_SEXT(ctx->opcode); 4079 gen_compute_branch(ctx, op1, 0, 0, 0, address); 4080 break; 4081 /* SBC-format */ 4082 case OPC1_16_SBC_JEQ: 4083 case OPC1_16_SBC_JNE: 4084 address = MASK_OP_SBC_DISP4(ctx->opcode); 4085 const16 = MASK_OP_SBC_CONST4_SEXT(ctx->opcode); 4086 gen_compute_branch(ctx, op1, 0, 0, const16, address); 4087 break; 4088 case OPC1_16_SBC_JEQ2: 4089 case OPC1_16_SBC_JNE2: 4090 if (has_feature(ctx, TRICORE_FEATURE_16)) { 4091 address = MASK_OP_SBC_DISP4(ctx->opcode); 4092 const16 = MASK_OP_SBC_CONST4_SEXT(ctx->opcode); 4093 gen_compute_branch(ctx, op1, 0, 0, const16, address); 4094 } else { 4095 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4096 } 4097 break; 4098 /* SBRN-format */ 4099 case OPC1_16_SBRN_JNZ_T: 4100 case OPC1_16_SBRN_JZ_T: 4101 address = MASK_OP_SBRN_DISP4(ctx->opcode); 4102 const16 = MASK_OP_SBRN_N(ctx->opcode); 4103 gen_compute_branch(ctx, op1, 0, 0, const16, address); 4104 break; 4105 /* SBR-format */ 4106 case OPC1_16_SBR_JEQ2: 4107 case OPC1_16_SBR_JNE2: 4108 if (has_feature(ctx, TRICORE_FEATURE_16)) { 4109 r1 = MASK_OP_SBR_S2(ctx->opcode); 4110 address = MASK_OP_SBR_DISP4(ctx->opcode); 4111 gen_compute_branch(ctx, op1, r1, 0, 0, address); 4112 } else { 4113 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4114 } 4115 break; 4116 case OPC1_16_SBR_JEQ: 4117 case OPC1_16_SBR_JGEZ: 4118 case OPC1_16_SBR_JGTZ: 4119 case OPC1_16_SBR_JLEZ: 4120 case OPC1_16_SBR_JLTZ: 4121 case OPC1_16_SBR_JNE: 4122 case OPC1_16_SBR_JNZ: 4123 case OPC1_16_SBR_JNZ_A: 4124 case OPC1_16_SBR_JZ: 4125 case OPC1_16_SBR_JZ_A: 4126 case OPC1_16_SBR_LOOP: 4127 r1 = MASK_OP_SBR_S2(ctx->opcode); 4128 address = MASK_OP_SBR_DISP4(ctx->opcode); 4129 gen_compute_branch(ctx, op1, r1, 0, 0, address); 4130 break; 4131 /* SC-format */ 4132 case OPC1_16_SC_AND: 4133 case OPC1_16_SC_BISR: 4134 case OPC1_16_SC_LD_A: 4135 case OPC1_16_SC_LD_W: 4136 case OPC1_16_SC_MOV: 4137 case OPC1_16_SC_OR: 4138 case OPC1_16_SC_ST_A: 4139 case OPC1_16_SC_ST_W: 4140 case OPC1_16_SC_SUB_A: 4141 decode_sc_opc(ctx, op1); 4142 break; 4143 /* SLR-format */ 4144 case OPC1_16_SLR_LD_A: 4145 case OPC1_16_SLR_LD_A_POSTINC: 4146 case OPC1_16_SLR_LD_BU: 4147 case OPC1_16_SLR_LD_BU_POSTINC: 4148 case OPC1_16_SLR_LD_H: 4149 case OPC1_16_SLR_LD_H_POSTINC: 4150 case OPC1_16_SLR_LD_W: 4151 case OPC1_16_SLR_LD_W_POSTINC: 4152 decode_slr_opc(ctx, op1); 4153 break; 4154 /* SRO-format */ 4155 case OPC1_16_SRO_LD_A: 4156 case OPC1_16_SRO_LD_BU: 4157 case OPC1_16_SRO_LD_H: 4158 case OPC1_16_SRO_LD_W: 4159 case OPC1_16_SRO_ST_A: 4160 case OPC1_16_SRO_ST_B: 4161 case OPC1_16_SRO_ST_H: 4162 case OPC1_16_SRO_ST_W: 4163 decode_sro_opc(ctx, op1); 4164 break; 4165 /* SSRO-format */ 4166 case OPC1_16_SSRO_ST_A: 4167 r1 = MASK_OP_SSRO_S1(ctx->opcode); 4168 const16 = MASK_OP_SSRO_OFF4(ctx->opcode); 4169 gen_offset_st(ctx, cpu_gpr_a[r1], cpu_gpr_a[15], const16 * 4, MO_LESL); 4170 break; 4171 case OPC1_16_SSRO_ST_B: 4172 r1 = MASK_OP_SSRO_S1(ctx->opcode); 4173 const16 = MASK_OP_SSRO_OFF4(ctx->opcode); 4174 gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16, MO_UB); 4175 break; 4176 case OPC1_16_SSRO_ST_H: 4177 r1 = MASK_OP_SSRO_S1(ctx->opcode); 4178 const16 = MASK_OP_SSRO_OFF4(ctx->opcode); 4179 gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16 * 2, MO_LESW); 4180 break; 4181 case OPC1_16_SSRO_ST_W: 4182 r1 = MASK_OP_SSRO_S1(ctx->opcode); 4183 const16 = MASK_OP_SSRO_OFF4(ctx->opcode); 4184 gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[15], const16 * 4, MO_LESL); 4185 break; 4186 /* SR-format */ 4187 case OPCM_16_SR_SYSTEM: 4188 decode_sr_system(ctx); 4189 break; 4190 case OPCM_16_SR_ACCU: 4191 decode_sr_accu(ctx); 4192 break; 4193 case OPC1_16_SR_JI: 4194 r1 = MASK_OP_SR_S1D(ctx->opcode); 4195 gen_compute_branch(ctx, op1, r1, 0, 0, 0); 4196 break; 4197 case OPC1_16_SR_NOT: 4198 r1 = MASK_OP_SR_S1D(ctx->opcode); 4199 tcg_gen_not_tl(cpu_gpr_d[r1], cpu_gpr_d[r1]); 4200 break; 4201 default: 4202 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4203 } 4204 } 4205 4206 /* 4207 * 32 bit instructions 4208 */ 4209 4210 /* ABS-format */ 4211 static void decode_abs_ldw(DisasContext *ctx) 4212 { 4213 int32_t op2; 4214 int32_t r1; 4215 uint32_t address; 4216 TCGv temp; 4217 4218 r1 = MASK_OP_ABS_S1D(ctx->opcode); 4219 address = MASK_OP_ABS_OFF18(ctx->opcode); 4220 op2 = MASK_OP_ABS_OP2(ctx->opcode); 4221 4222 temp = tcg_const_i32(EA_ABS_FORMAT(address)); 4223 4224 switch (op2) { 4225 case OPC2_32_ABS_LD_A: 4226 tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], temp, ctx->mem_idx, MO_LESL); 4227 break; 4228 case OPC2_32_ABS_LD_D: 4229 CHECK_REG_PAIR(r1); 4230 gen_ld_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], temp, ctx); 4231 break; 4232 case OPC2_32_ABS_LD_DA: 4233 CHECK_REG_PAIR(r1); 4234 gen_ld_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], temp, ctx); 4235 break; 4236 case OPC2_32_ABS_LD_W: 4237 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LESL); 4238 break; 4239 default: 4240 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4241 } 4242 4243 tcg_temp_free(temp); 4244 } 4245 4246 static void decode_abs_ldb(DisasContext *ctx) 4247 { 4248 int32_t op2; 4249 int32_t r1; 4250 uint32_t address; 4251 TCGv temp; 4252 4253 r1 = MASK_OP_ABS_S1D(ctx->opcode); 4254 address = MASK_OP_ABS_OFF18(ctx->opcode); 4255 op2 = MASK_OP_ABS_OP2(ctx->opcode); 4256 4257 temp = tcg_const_i32(EA_ABS_FORMAT(address)); 4258 4259 switch (op2) { 4260 case OPC2_32_ABS_LD_B: 4261 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_SB); 4262 break; 4263 case OPC2_32_ABS_LD_BU: 4264 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_UB); 4265 break; 4266 case OPC2_32_ABS_LD_H: 4267 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LESW); 4268 break; 4269 case OPC2_32_ABS_LD_HU: 4270 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LEUW); 4271 break; 4272 default: 4273 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4274 } 4275 4276 tcg_temp_free(temp); 4277 } 4278 4279 static void decode_abs_ldst_swap(DisasContext *ctx) 4280 { 4281 int32_t op2; 4282 int32_t r1; 4283 uint32_t address; 4284 TCGv temp; 4285 4286 r1 = MASK_OP_ABS_S1D(ctx->opcode); 4287 address = MASK_OP_ABS_OFF18(ctx->opcode); 4288 op2 = MASK_OP_ABS_OP2(ctx->opcode); 4289 4290 temp = tcg_const_i32(EA_ABS_FORMAT(address)); 4291 4292 switch (op2) { 4293 case OPC2_32_ABS_LDMST: 4294 gen_ldmst(ctx, r1, temp); 4295 break; 4296 case OPC2_32_ABS_SWAP_W: 4297 gen_swap(ctx, r1, temp); 4298 break; 4299 default: 4300 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4301 } 4302 4303 tcg_temp_free(temp); 4304 } 4305 4306 static void decode_abs_ldst_context(DisasContext *ctx) 4307 { 4308 uint32_t op2; 4309 int32_t off18; 4310 4311 off18 = MASK_OP_ABS_OFF18(ctx->opcode); 4312 op2 = MASK_OP_ABS_OP2(ctx->opcode); 4313 4314 switch (op2) { 4315 case OPC2_32_ABS_LDLCX: 4316 gen_helper_1arg(ldlcx, EA_ABS_FORMAT(off18)); 4317 break; 4318 case OPC2_32_ABS_LDUCX: 4319 gen_helper_1arg(lducx, EA_ABS_FORMAT(off18)); 4320 break; 4321 case OPC2_32_ABS_STLCX: 4322 gen_helper_1arg(stlcx, EA_ABS_FORMAT(off18)); 4323 break; 4324 case OPC2_32_ABS_STUCX: 4325 gen_helper_1arg(stucx, EA_ABS_FORMAT(off18)); 4326 break; 4327 default: 4328 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4329 } 4330 } 4331 4332 static void decode_abs_store(DisasContext *ctx) 4333 { 4334 int32_t op2; 4335 int32_t r1; 4336 uint32_t address; 4337 TCGv temp; 4338 4339 r1 = MASK_OP_ABS_S1D(ctx->opcode); 4340 address = MASK_OP_ABS_OFF18(ctx->opcode); 4341 op2 = MASK_OP_ABS_OP2(ctx->opcode); 4342 4343 temp = tcg_const_i32(EA_ABS_FORMAT(address)); 4344 4345 switch (op2) { 4346 case OPC2_32_ABS_ST_A: 4347 tcg_gen_qemu_st_tl(cpu_gpr_a[r1], temp, ctx->mem_idx, MO_LESL); 4348 break; 4349 case OPC2_32_ABS_ST_D: 4350 CHECK_REG_PAIR(r1); 4351 gen_st_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], temp, ctx); 4352 break; 4353 case OPC2_32_ABS_ST_DA: 4354 CHECK_REG_PAIR(r1); 4355 gen_st_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], temp, ctx); 4356 break; 4357 case OPC2_32_ABS_ST_W: 4358 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LESL); 4359 break; 4360 default: 4361 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4362 } 4363 tcg_temp_free(temp); 4364 } 4365 4366 static void decode_abs_storeb_h(DisasContext *ctx) 4367 { 4368 int32_t op2; 4369 int32_t r1; 4370 uint32_t address; 4371 TCGv temp; 4372 4373 r1 = MASK_OP_ABS_S1D(ctx->opcode); 4374 address = MASK_OP_ABS_OFF18(ctx->opcode); 4375 op2 = MASK_OP_ABS_OP2(ctx->opcode); 4376 4377 temp = tcg_const_i32(EA_ABS_FORMAT(address)); 4378 4379 switch (op2) { 4380 case OPC2_32_ABS_ST_B: 4381 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_UB); 4382 break; 4383 case OPC2_32_ABS_ST_H: 4384 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LEUW); 4385 break; 4386 default: 4387 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4388 } 4389 tcg_temp_free(temp); 4390 } 4391 4392 /* Bit-format */ 4393 4394 static void decode_bit_andacc(DisasContext *ctx) 4395 { 4396 uint32_t op2; 4397 int r1, r2, r3; 4398 int pos1, pos2; 4399 4400 r1 = MASK_OP_BIT_S1(ctx->opcode); 4401 r2 = MASK_OP_BIT_S2(ctx->opcode); 4402 r3 = MASK_OP_BIT_D(ctx->opcode); 4403 pos1 = MASK_OP_BIT_POS1(ctx->opcode); 4404 pos2 = MASK_OP_BIT_POS2(ctx->opcode); 4405 op2 = MASK_OP_BIT_OP2(ctx->opcode); 4406 4407 4408 switch (op2) { 4409 case OPC2_32_BIT_AND_AND_T: 4410 gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4411 pos1, pos2, &tcg_gen_and_tl, &tcg_gen_and_tl); 4412 break; 4413 case OPC2_32_BIT_AND_ANDN_T: 4414 gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4415 pos1, pos2, &tcg_gen_andc_tl, &tcg_gen_and_tl); 4416 break; 4417 case OPC2_32_BIT_AND_NOR_T: 4418 if (TCG_TARGET_HAS_andc_i32) { 4419 gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4420 pos1, pos2, &tcg_gen_or_tl, &tcg_gen_andc_tl); 4421 } else { 4422 gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4423 pos1, pos2, &tcg_gen_nor_tl, &tcg_gen_and_tl); 4424 } 4425 break; 4426 case OPC2_32_BIT_AND_OR_T: 4427 gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4428 pos1, pos2, &tcg_gen_or_tl, &tcg_gen_and_tl); 4429 break; 4430 default: 4431 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4432 } 4433 } 4434 4435 static void decode_bit_logical_t(DisasContext *ctx) 4436 { 4437 uint32_t op2; 4438 int r1, r2, r3; 4439 int pos1, pos2; 4440 r1 = MASK_OP_BIT_S1(ctx->opcode); 4441 r2 = MASK_OP_BIT_S2(ctx->opcode); 4442 r3 = MASK_OP_BIT_D(ctx->opcode); 4443 pos1 = MASK_OP_BIT_POS1(ctx->opcode); 4444 pos2 = MASK_OP_BIT_POS2(ctx->opcode); 4445 op2 = MASK_OP_BIT_OP2(ctx->opcode); 4446 4447 switch (op2) { 4448 case OPC2_32_BIT_AND_T: 4449 gen_bit_1op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4450 pos1, pos2, &tcg_gen_and_tl); 4451 break; 4452 case OPC2_32_BIT_ANDN_T: 4453 gen_bit_1op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4454 pos1, pos2, &tcg_gen_andc_tl); 4455 break; 4456 case OPC2_32_BIT_NOR_T: 4457 gen_bit_1op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4458 pos1, pos2, &tcg_gen_nor_tl); 4459 break; 4460 case OPC2_32_BIT_OR_T: 4461 gen_bit_1op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4462 pos1, pos2, &tcg_gen_or_tl); 4463 break; 4464 default: 4465 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4466 } 4467 } 4468 4469 static void decode_bit_insert(DisasContext *ctx) 4470 { 4471 uint32_t op2; 4472 int r1, r2, r3; 4473 int pos1, pos2; 4474 TCGv temp; 4475 op2 = MASK_OP_BIT_OP2(ctx->opcode); 4476 r1 = MASK_OP_BIT_S1(ctx->opcode); 4477 r2 = MASK_OP_BIT_S2(ctx->opcode); 4478 r3 = MASK_OP_BIT_D(ctx->opcode); 4479 pos1 = MASK_OP_BIT_POS1(ctx->opcode); 4480 pos2 = MASK_OP_BIT_POS2(ctx->opcode); 4481 4482 temp = tcg_temp_new(); 4483 4484 tcg_gen_shri_tl(temp, cpu_gpr_d[r2], pos2); 4485 if (op2 == OPC2_32_BIT_INSN_T) { 4486 tcg_gen_not_tl(temp, temp); 4487 } 4488 tcg_gen_deposit_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], temp, pos1, 1); 4489 tcg_temp_free(temp); 4490 } 4491 4492 static void decode_bit_logical_t2(DisasContext *ctx) 4493 { 4494 uint32_t op2; 4495 4496 int r1, r2, r3; 4497 int pos1, pos2; 4498 4499 op2 = MASK_OP_BIT_OP2(ctx->opcode); 4500 r1 = MASK_OP_BIT_S1(ctx->opcode); 4501 r2 = MASK_OP_BIT_S2(ctx->opcode); 4502 r3 = MASK_OP_BIT_D(ctx->opcode); 4503 pos1 = MASK_OP_BIT_POS1(ctx->opcode); 4504 pos2 = MASK_OP_BIT_POS2(ctx->opcode); 4505 4506 switch (op2) { 4507 case OPC2_32_BIT_NAND_T: 4508 gen_bit_1op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4509 pos1, pos2, &tcg_gen_nand_tl); 4510 break; 4511 case OPC2_32_BIT_ORN_T: 4512 gen_bit_1op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4513 pos1, pos2, &tcg_gen_orc_tl); 4514 break; 4515 case OPC2_32_BIT_XNOR_T: 4516 gen_bit_1op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4517 pos1, pos2, &tcg_gen_eqv_tl); 4518 break; 4519 case OPC2_32_BIT_XOR_T: 4520 gen_bit_1op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4521 pos1, pos2, &tcg_gen_xor_tl); 4522 break; 4523 default: 4524 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4525 } 4526 } 4527 4528 static void decode_bit_orand(DisasContext *ctx) 4529 { 4530 uint32_t op2; 4531 4532 int r1, r2, r3; 4533 int pos1, pos2; 4534 4535 op2 = MASK_OP_BIT_OP2(ctx->opcode); 4536 r1 = MASK_OP_BIT_S1(ctx->opcode); 4537 r2 = MASK_OP_BIT_S2(ctx->opcode); 4538 r3 = MASK_OP_BIT_D(ctx->opcode); 4539 pos1 = MASK_OP_BIT_POS1(ctx->opcode); 4540 pos2 = MASK_OP_BIT_POS2(ctx->opcode); 4541 4542 switch (op2) { 4543 case OPC2_32_BIT_OR_AND_T: 4544 gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4545 pos1, pos2, &tcg_gen_and_tl, &tcg_gen_or_tl); 4546 break; 4547 case OPC2_32_BIT_OR_ANDN_T: 4548 gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4549 pos1, pos2, &tcg_gen_andc_tl, &tcg_gen_or_tl); 4550 break; 4551 case OPC2_32_BIT_OR_NOR_T: 4552 if (TCG_TARGET_HAS_orc_i32) { 4553 gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4554 pos1, pos2, &tcg_gen_or_tl, &tcg_gen_orc_tl); 4555 } else { 4556 gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4557 pos1, pos2, &tcg_gen_nor_tl, &tcg_gen_or_tl); 4558 } 4559 break; 4560 case OPC2_32_BIT_OR_OR_T: 4561 gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 4562 pos1, pos2, &tcg_gen_or_tl, &tcg_gen_or_tl); 4563 break; 4564 default: 4565 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4566 } 4567 } 4568 4569 static void decode_bit_sh_logic1(DisasContext *ctx) 4570 { 4571 uint32_t op2; 4572 int r1, r2, r3; 4573 int pos1, pos2; 4574 TCGv temp; 4575 4576 op2 = MASK_OP_BIT_OP2(ctx->opcode); 4577 r1 = MASK_OP_BIT_S1(ctx->opcode); 4578 r2 = MASK_OP_BIT_S2(ctx->opcode); 4579 r3 = MASK_OP_BIT_D(ctx->opcode); 4580 pos1 = MASK_OP_BIT_POS1(ctx->opcode); 4581 pos2 = MASK_OP_BIT_POS2(ctx->opcode); 4582 4583 temp = tcg_temp_new(); 4584 4585 switch (op2) { 4586 case OPC2_32_BIT_SH_AND_T: 4587 gen_bit_1op(temp, cpu_gpr_d[r1], cpu_gpr_d[r2], 4588 pos1, pos2, &tcg_gen_and_tl); 4589 break; 4590 case OPC2_32_BIT_SH_ANDN_T: 4591 gen_bit_1op(temp, cpu_gpr_d[r1], cpu_gpr_d[r2], 4592 pos1, pos2, &tcg_gen_andc_tl); 4593 break; 4594 case OPC2_32_BIT_SH_NOR_T: 4595 gen_bit_1op(temp, cpu_gpr_d[r1], cpu_gpr_d[r2], 4596 pos1, pos2, &tcg_gen_nor_tl); 4597 break; 4598 case OPC2_32_BIT_SH_OR_T: 4599 gen_bit_1op(temp, cpu_gpr_d[r1], cpu_gpr_d[r2], 4600 pos1, pos2, &tcg_gen_or_tl); 4601 break; 4602 default: 4603 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4604 } 4605 tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], 1); 4606 tcg_gen_add_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], temp); 4607 tcg_temp_free(temp); 4608 } 4609 4610 static void decode_bit_sh_logic2(DisasContext *ctx) 4611 { 4612 uint32_t op2; 4613 int r1, r2, r3; 4614 int pos1, pos2; 4615 TCGv temp; 4616 4617 op2 = MASK_OP_BIT_OP2(ctx->opcode); 4618 r1 = MASK_OP_BIT_S1(ctx->opcode); 4619 r2 = MASK_OP_BIT_S2(ctx->opcode); 4620 r3 = MASK_OP_BIT_D(ctx->opcode); 4621 pos1 = MASK_OP_BIT_POS1(ctx->opcode); 4622 pos2 = MASK_OP_BIT_POS2(ctx->opcode); 4623 4624 temp = tcg_temp_new(); 4625 4626 switch (op2) { 4627 case OPC2_32_BIT_SH_NAND_T: 4628 gen_bit_1op(temp, cpu_gpr_d[r1] , cpu_gpr_d[r2] , 4629 pos1, pos2, &tcg_gen_nand_tl); 4630 break; 4631 case OPC2_32_BIT_SH_ORN_T: 4632 gen_bit_1op(temp, cpu_gpr_d[r1], cpu_gpr_d[r2], 4633 pos1, pos2, &tcg_gen_orc_tl); 4634 break; 4635 case OPC2_32_BIT_SH_XNOR_T: 4636 gen_bit_1op(temp, cpu_gpr_d[r1], cpu_gpr_d[r2], 4637 pos1, pos2, &tcg_gen_eqv_tl); 4638 break; 4639 case OPC2_32_BIT_SH_XOR_T: 4640 gen_bit_1op(temp, cpu_gpr_d[r1], cpu_gpr_d[r2], 4641 pos1, pos2, &tcg_gen_xor_tl); 4642 break; 4643 default: 4644 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4645 } 4646 tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], 1); 4647 tcg_gen_add_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], temp); 4648 tcg_temp_free(temp); 4649 } 4650 4651 /* BO-format */ 4652 4653 4654 static void decode_bo_addrmode_post_pre_base(DisasContext *ctx) 4655 { 4656 uint32_t op2; 4657 uint32_t off10; 4658 int32_t r1, r2; 4659 TCGv temp; 4660 4661 r1 = MASK_OP_BO_S1D(ctx->opcode); 4662 r2 = MASK_OP_BO_S2(ctx->opcode); 4663 off10 = MASK_OP_BO_OFF10_SEXT(ctx->opcode); 4664 op2 = MASK_OP_BO_OP2(ctx->opcode); 4665 4666 switch (op2) { 4667 case OPC2_32_BO_CACHEA_WI_SHORTOFF: 4668 case OPC2_32_BO_CACHEA_W_SHORTOFF: 4669 case OPC2_32_BO_CACHEA_I_SHORTOFF: 4670 /* instruction to access the cache */ 4671 break; 4672 case OPC2_32_BO_CACHEA_WI_POSTINC: 4673 case OPC2_32_BO_CACHEA_W_POSTINC: 4674 case OPC2_32_BO_CACHEA_I_POSTINC: 4675 /* instruction to access the cache, but we still need to handle 4676 the addressing mode */ 4677 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 4678 break; 4679 case OPC2_32_BO_CACHEA_WI_PREINC: 4680 case OPC2_32_BO_CACHEA_W_PREINC: 4681 case OPC2_32_BO_CACHEA_I_PREINC: 4682 /* instruction to access the cache, but we still need to handle 4683 the addressing mode */ 4684 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 4685 break; 4686 case OPC2_32_BO_CACHEI_WI_SHORTOFF: 4687 case OPC2_32_BO_CACHEI_W_SHORTOFF: 4688 if (!has_feature(ctx, TRICORE_FEATURE_131)) { 4689 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4690 } 4691 break; 4692 case OPC2_32_BO_CACHEI_W_POSTINC: 4693 case OPC2_32_BO_CACHEI_WI_POSTINC: 4694 if (has_feature(ctx, TRICORE_FEATURE_131)) { 4695 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 4696 } else { 4697 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4698 } 4699 break; 4700 case OPC2_32_BO_CACHEI_W_PREINC: 4701 case OPC2_32_BO_CACHEI_WI_PREINC: 4702 if (has_feature(ctx, TRICORE_FEATURE_131)) { 4703 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 4704 } else { 4705 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4706 } 4707 break; 4708 case OPC2_32_BO_ST_A_SHORTOFF: 4709 gen_offset_st(ctx, cpu_gpr_a[r1], cpu_gpr_a[r2], off10, MO_LESL); 4710 break; 4711 case OPC2_32_BO_ST_A_POSTINC: 4712 tcg_gen_qemu_st_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], ctx->mem_idx, 4713 MO_LESL); 4714 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 4715 break; 4716 case OPC2_32_BO_ST_A_PREINC: 4717 gen_st_preincr(ctx, cpu_gpr_a[r1], cpu_gpr_a[r2], off10, MO_LESL); 4718 break; 4719 case OPC2_32_BO_ST_B_SHORTOFF: 4720 gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_UB); 4721 break; 4722 case OPC2_32_BO_ST_B_POSTINC: 4723 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, 4724 MO_UB); 4725 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 4726 break; 4727 case OPC2_32_BO_ST_B_PREINC: 4728 gen_st_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_UB); 4729 break; 4730 case OPC2_32_BO_ST_D_SHORTOFF: 4731 CHECK_REG_PAIR(r1); 4732 gen_offset_st_2regs(cpu_gpr_d[r1+1], cpu_gpr_d[r1], cpu_gpr_a[r2], 4733 off10, ctx); 4734 break; 4735 case OPC2_32_BO_ST_D_POSTINC: 4736 CHECK_REG_PAIR(r1); 4737 gen_st_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], cpu_gpr_a[r2], ctx); 4738 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 4739 break; 4740 case OPC2_32_BO_ST_D_PREINC: 4741 CHECK_REG_PAIR(r1); 4742 temp = tcg_temp_new(); 4743 tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10); 4744 gen_st_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], temp, ctx); 4745 tcg_gen_mov_tl(cpu_gpr_a[r2], temp); 4746 tcg_temp_free(temp); 4747 break; 4748 case OPC2_32_BO_ST_DA_SHORTOFF: 4749 CHECK_REG_PAIR(r1); 4750 gen_offset_st_2regs(cpu_gpr_a[r1+1], cpu_gpr_a[r1], cpu_gpr_a[r2], 4751 off10, ctx); 4752 break; 4753 case OPC2_32_BO_ST_DA_POSTINC: 4754 CHECK_REG_PAIR(r1); 4755 gen_st_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], cpu_gpr_a[r2], ctx); 4756 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 4757 break; 4758 case OPC2_32_BO_ST_DA_PREINC: 4759 CHECK_REG_PAIR(r1); 4760 temp = tcg_temp_new(); 4761 tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10); 4762 gen_st_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], temp, ctx); 4763 tcg_gen_mov_tl(cpu_gpr_a[r2], temp); 4764 tcg_temp_free(temp); 4765 break; 4766 case OPC2_32_BO_ST_H_SHORTOFF: 4767 gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUW); 4768 break; 4769 case OPC2_32_BO_ST_H_POSTINC: 4770 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, 4771 MO_LEUW); 4772 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 4773 break; 4774 case OPC2_32_BO_ST_H_PREINC: 4775 gen_st_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUW); 4776 break; 4777 case OPC2_32_BO_ST_Q_SHORTOFF: 4778 temp = tcg_temp_new(); 4779 tcg_gen_shri_tl(temp, cpu_gpr_d[r1], 16); 4780 gen_offset_st(ctx, temp, cpu_gpr_a[r2], off10, MO_LEUW); 4781 tcg_temp_free(temp); 4782 break; 4783 case OPC2_32_BO_ST_Q_POSTINC: 4784 temp = tcg_temp_new(); 4785 tcg_gen_shri_tl(temp, cpu_gpr_d[r1], 16); 4786 tcg_gen_qemu_st_tl(temp, cpu_gpr_a[r2], ctx->mem_idx, 4787 MO_LEUW); 4788 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 4789 tcg_temp_free(temp); 4790 break; 4791 case OPC2_32_BO_ST_Q_PREINC: 4792 temp = tcg_temp_new(); 4793 tcg_gen_shri_tl(temp, cpu_gpr_d[r1], 16); 4794 gen_st_preincr(ctx, temp, cpu_gpr_a[r2], off10, MO_LEUW); 4795 tcg_temp_free(temp); 4796 break; 4797 case OPC2_32_BO_ST_W_SHORTOFF: 4798 gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUL); 4799 break; 4800 case OPC2_32_BO_ST_W_POSTINC: 4801 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, 4802 MO_LEUL); 4803 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 4804 break; 4805 case OPC2_32_BO_ST_W_PREINC: 4806 gen_st_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUL); 4807 break; 4808 default: 4809 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4810 } 4811 } 4812 4813 static void decode_bo_addrmode_bitreverse_circular(DisasContext *ctx) 4814 { 4815 uint32_t op2; 4816 uint32_t off10; 4817 int32_t r1, r2; 4818 TCGv temp, temp2, temp3; 4819 4820 r1 = MASK_OP_BO_S1D(ctx->opcode); 4821 r2 = MASK_OP_BO_S2(ctx->opcode); 4822 off10 = MASK_OP_BO_OFF10_SEXT(ctx->opcode); 4823 op2 = MASK_OP_BO_OP2(ctx->opcode); 4824 4825 temp = tcg_temp_new(); 4826 temp2 = tcg_temp_new(); 4827 temp3 = tcg_const_i32(off10); 4828 CHECK_REG_PAIR(r2); 4829 tcg_gen_ext16u_tl(temp, cpu_gpr_a[r2+1]); 4830 tcg_gen_add_tl(temp2, cpu_gpr_a[r2], temp); 4831 4832 switch (op2) { 4833 case OPC2_32_BO_CACHEA_WI_BR: 4834 case OPC2_32_BO_CACHEA_W_BR: 4835 case OPC2_32_BO_CACHEA_I_BR: 4836 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 4837 break; 4838 case OPC2_32_BO_CACHEA_WI_CIRC: 4839 case OPC2_32_BO_CACHEA_W_CIRC: 4840 case OPC2_32_BO_CACHEA_I_CIRC: 4841 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 4842 break; 4843 case OPC2_32_BO_ST_A_BR: 4844 tcg_gen_qemu_st_tl(cpu_gpr_a[r1], temp2, ctx->mem_idx, MO_LEUL); 4845 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 4846 break; 4847 case OPC2_32_BO_ST_A_CIRC: 4848 tcg_gen_qemu_st_tl(cpu_gpr_a[r1], temp2, ctx->mem_idx, MO_LEUL); 4849 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 4850 break; 4851 case OPC2_32_BO_ST_B_BR: 4852 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_UB); 4853 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 4854 break; 4855 case OPC2_32_BO_ST_B_CIRC: 4856 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_UB); 4857 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 4858 break; 4859 case OPC2_32_BO_ST_D_BR: 4860 CHECK_REG_PAIR(r1); 4861 gen_st_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], temp2, ctx); 4862 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 4863 break; 4864 case OPC2_32_BO_ST_D_CIRC: 4865 CHECK_REG_PAIR(r1); 4866 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUL); 4867 tcg_gen_shri_tl(temp2, cpu_gpr_a[r2+1], 16); 4868 tcg_gen_addi_tl(temp, temp, 4); 4869 tcg_gen_rem_tl(temp, temp, temp2); 4870 tcg_gen_add_tl(temp2, cpu_gpr_a[r2], temp); 4871 tcg_gen_qemu_st_tl(cpu_gpr_d[r1+1], temp2, ctx->mem_idx, MO_LEUL); 4872 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 4873 break; 4874 case OPC2_32_BO_ST_DA_BR: 4875 CHECK_REG_PAIR(r1); 4876 gen_st_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], temp2, ctx); 4877 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 4878 break; 4879 case OPC2_32_BO_ST_DA_CIRC: 4880 CHECK_REG_PAIR(r1); 4881 tcg_gen_qemu_st_tl(cpu_gpr_a[r1], temp2, ctx->mem_idx, MO_LEUL); 4882 tcg_gen_shri_tl(temp2, cpu_gpr_a[r2+1], 16); 4883 tcg_gen_addi_tl(temp, temp, 4); 4884 tcg_gen_rem_tl(temp, temp, temp2); 4885 tcg_gen_add_tl(temp2, cpu_gpr_a[r2], temp); 4886 tcg_gen_qemu_st_tl(cpu_gpr_a[r1+1], temp2, ctx->mem_idx, MO_LEUL); 4887 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 4888 break; 4889 case OPC2_32_BO_ST_H_BR: 4890 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUW); 4891 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 4892 break; 4893 case OPC2_32_BO_ST_H_CIRC: 4894 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUW); 4895 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 4896 break; 4897 case OPC2_32_BO_ST_Q_BR: 4898 tcg_gen_shri_tl(temp, cpu_gpr_d[r1], 16); 4899 tcg_gen_qemu_st_tl(temp, temp2, ctx->mem_idx, MO_LEUW); 4900 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 4901 break; 4902 case OPC2_32_BO_ST_Q_CIRC: 4903 tcg_gen_shri_tl(temp, cpu_gpr_d[r1], 16); 4904 tcg_gen_qemu_st_tl(temp, temp2, ctx->mem_idx, MO_LEUW); 4905 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 4906 break; 4907 case OPC2_32_BO_ST_W_BR: 4908 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUL); 4909 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 4910 break; 4911 case OPC2_32_BO_ST_W_CIRC: 4912 tcg_gen_qemu_st_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUL); 4913 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 4914 break; 4915 default: 4916 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 4917 } 4918 tcg_temp_free(temp); 4919 tcg_temp_free(temp2); 4920 tcg_temp_free(temp3); 4921 } 4922 4923 static void decode_bo_addrmode_ld_post_pre_base(DisasContext *ctx) 4924 { 4925 uint32_t op2; 4926 uint32_t off10; 4927 int32_t r1, r2; 4928 TCGv temp; 4929 4930 r1 = MASK_OP_BO_S1D(ctx->opcode); 4931 r2 = MASK_OP_BO_S2(ctx->opcode); 4932 off10 = MASK_OP_BO_OFF10_SEXT(ctx->opcode); 4933 op2 = MASK_OP_BO_OP2(ctx->opcode); 4934 4935 switch (op2) { 4936 case OPC2_32_BO_LD_A_SHORTOFF: 4937 gen_offset_ld(ctx, cpu_gpr_a[r1], cpu_gpr_a[r2], off10, MO_LEUL); 4938 break; 4939 case OPC2_32_BO_LD_A_POSTINC: 4940 tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], ctx->mem_idx, 4941 MO_LEUL); 4942 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 4943 break; 4944 case OPC2_32_BO_LD_A_PREINC: 4945 gen_ld_preincr(ctx, cpu_gpr_a[r1], cpu_gpr_a[r2], off10, MO_LEUL); 4946 break; 4947 case OPC2_32_BO_LD_B_SHORTOFF: 4948 gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_SB); 4949 break; 4950 case OPC2_32_BO_LD_B_POSTINC: 4951 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, 4952 MO_SB); 4953 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 4954 break; 4955 case OPC2_32_BO_LD_B_PREINC: 4956 gen_ld_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_SB); 4957 break; 4958 case OPC2_32_BO_LD_BU_SHORTOFF: 4959 gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_UB); 4960 break; 4961 case OPC2_32_BO_LD_BU_POSTINC: 4962 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, 4963 MO_UB); 4964 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 4965 break; 4966 case OPC2_32_BO_LD_BU_PREINC: 4967 gen_ld_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_SB); 4968 break; 4969 case OPC2_32_BO_LD_D_SHORTOFF: 4970 CHECK_REG_PAIR(r1); 4971 gen_offset_ld_2regs(cpu_gpr_d[r1+1], cpu_gpr_d[r1], cpu_gpr_a[r2], 4972 off10, ctx); 4973 break; 4974 case OPC2_32_BO_LD_D_POSTINC: 4975 CHECK_REG_PAIR(r1); 4976 gen_ld_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], cpu_gpr_a[r2], ctx); 4977 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 4978 break; 4979 case OPC2_32_BO_LD_D_PREINC: 4980 CHECK_REG_PAIR(r1); 4981 temp = tcg_temp_new(); 4982 tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10); 4983 gen_ld_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], temp, ctx); 4984 tcg_gen_mov_tl(cpu_gpr_a[r2], temp); 4985 tcg_temp_free(temp); 4986 break; 4987 case OPC2_32_BO_LD_DA_SHORTOFF: 4988 CHECK_REG_PAIR(r1); 4989 gen_offset_ld_2regs(cpu_gpr_a[r1+1], cpu_gpr_a[r1], cpu_gpr_a[r2], 4990 off10, ctx); 4991 break; 4992 case OPC2_32_BO_LD_DA_POSTINC: 4993 CHECK_REG_PAIR(r1); 4994 gen_ld_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], cpu_gpr_a[r2], ctx); 4995 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 4996 break; 4997 case OPC2_32_BO_LD_DA_PREINC: 4998 CHECK_REG_PAIR(r1); 4999 temp = tcg_temp_new(); 5000 tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10); 5001 gen_ld_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], temp, ctx); 5002 tcg_gen_mov_tl(cpu_gpr_a[r2], temp); 5003 tcg_temp_free(temp); 5004 break; 5005 case OPC2_32_BO_LD_H_SHORTOFF: 5006 gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LESW); 5007 break; 5008 case OPC2_32_BO_LD_H_POSTINC: 5009 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, 5010 MO_LESW); 5011 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 5012 break; 5013 case OPC2_32_BO_LD_H_PREINC: 5014 gen_ld_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LESW); 5015 break; 5016 case OPC2_32_BO_LD_HU_SHORTOFF: 5017 gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUW); 5018 break; 5019 case OPC2_32_BO_LD_HU_POSTINC: 5020 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, 5021 MO_LEUW); 5022 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 5023 break; 5024 case OPC2_32_BO_LD_HU_PREINC: 5025 gen_ld_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUW); 5026 break; 5027 case OPC2_32_BO_LD_Q_SHORTOFF: 5028 gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUW); 5029 tcg_gen_shli_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 16); 5030 break; 5031 case OPC2_32_BO_LD_Q_POSTINC: 5032 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, 5033 MO_LEUW); 5034 tcg_gen_shli_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 16); 5035 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 5036 break; 5037 case OPC2_32_BO_LD_Q_PREINC: 5038 gen_ld_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUW); 5039 tcg_gen_shli_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 16); 5040 break; 5041 case OPC2_32_BO_LD_W_SHORTOFF: 5042 gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUL); 5043 break; 5044 case OPC2_32_BO_LD_W_POSTINC: 5045 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], cpu_gpr_a[r2], ctx->mem_idx, 5046 MO_LEUL); 5047 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 5048 break; 5049 case OPC2_32_BO_LD_W_PREINC: 5050 gen_ld_preincr(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUL); 5051 break; 5052 default: 5053 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5054 } 5055 } 5056 5057 static void decode_bo_addrmode_ld_bitreverse_circular(DisasContext *ctx) 5058 { 5059 uint32_t op2; 5060 uint32_t off10; 5061 int r1, r2; 5062 5063 TCGv temp, temp2, temp3; 5064 5065 r1 = MASK_OP_BO_S1D(ctx->opcode); 5066 r2 = MASK_OP_BO_S2(ctx->opcode); 5067 off10 = MASK_OP_BO_OFF10_SEXT(ctx->opcode); 5068 op2 = MASK_OP_BO_OP2(ctx->opcode); 5069 5070 temp = tcg_temp_new(); 5071 temp2 = tcg_temp_new(); 5072 temp3 = tcg_const_i32(off10); 5073 CHECK_REG_PAIR(r2); 5074 tcg_gen_ext16u_tl(temp, cpu_gpr_a[r2+1]); 5075 tcg_gen_add_tl(temp2, cpu_gpr_a[r2], temp); 5076 5077 5078 switch (op2) { 5079 case OPC2_32_BO_LD_A_BR: 5080 tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], temp2, ctx->mem_idx, MO_LEUL); 5081 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 5082 break; 5083 case OPC2_32_BO_LD_A_CIRC: 5084 tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], temp2, ctx->mem_idx, MO_LEUL); 5085 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 5086 break; 5087 case OPC2_32_BO_LD_B_BR: 5088 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_SB); 5089 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 5090 break; 5091 case OPC2_32_BO_LD_B_CIRC: 5092 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_SB); 5093 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 5094 break; 5095 case OPC2_32_BO_LD_BU_BR: 5096 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_UB); 5097 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 5098 break; 5099 case OPC2_32_BO_LD_BU_CIRC: 5100 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_UB); 5101 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 5102 break; 5103 case OPC2_32_BO_LD_D_BR: 5104 CHECK_REG_PAIR(r1); 5105 gen_ld_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], temp2, ctx); 5106 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 5107 break; 5108 case OPC2_32_BO_LD_D_CIRC: 5109 CHECK_REG_PAIR(r1); 5110 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUL); 5111 tcg_gen_shri_tl(temp2, cpu_gpr_a[r2+1], 16); 5112 tcg_gen_addi_tl(temp, temp, 4); 5113 tcg_gen_rem_tl(temp, temp, temp2); 5114 tcg_gen_add_tl(temp2, cpu_gpr_a[r2], temp); 5115 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1+1], temp2, ctx->mem_idx, MO_LEUL); 5116 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 5117 break; 5118 case OPC2_32_BO_LD_DA_BR: 5119 CHECK_REG_PAIR(r1); 5120 gen_ld_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], temp2, ctx); 5121 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 5122 break; 5123 case OPC2_32_BO_LD_DA_CIRC: 5124 CHECK_REG_PAIR(r1); 5125 tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], temp2, ctx->mem_idx, MO_LEUL); 5126 tcg_gen_shri_tl(temp2, cpu_gpr_a[r2+1], 16); 5127 tcg_gen_addi_tl(temp, temp, 4); 5128 tcg_gen_rem_tl(temp, temp, temp2); 5129 tcg_gen_add_tl(temp2, cpu_gpr_a[r2], temp); 5130 tcg_gen_qemu_ld_tl(cpu_gpr_a[r1+1], temp2, ctx->mem_idx, MO_LEUL); 5131 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 5132 break; 5133 case OPC2_32_BO_LD_H_BR: 5134 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LESW); 5135 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 5136 break; 5137 case OPC2_32_BO_LD_H_CIRC: 5138 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LESW); 5139 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 5140 break; 5141 case OPC2_32_BO_LD_HU_BR: 5142 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUW); 5143 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 5144 break; 5145 case OPC2_32_BO_LD_HU_CIRC: 5146 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUW); 5147 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 5148 break; 5149 case OPC2_32_BO_LD_Q_BR: 5150 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUW); 5151 tcg_gen_shli_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 16); 5152 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 5153 break; 5154 case OPC2_32_BO_LD_Q_CIRC: 5155 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUW); 5156 tcg_gen_shli_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 16); 5157 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 5158 break; 5159 case OPC2_32_BO_LD_W_BR: 5160 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUL); 5161 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 5162 break; 5163 case OPC2_32_BO_LD_W_CIRC: 5164 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp2, ctx->mem_idx, MO_LEUL); 5165 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 5166 break; 5167 default: 5168 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5169 } 5170 tcg_temp_free(temp); 5171 tcg_temp_free(temp2); 5172 tcg_temp_free(temp3); 5173 } 5174 5175 static void decode_bo_addrmode_stctx_post_pre_base(DisasContext *ctx) 5176 { 5177 uint32_t op2; 5178 uint32_t off10; 5179 int r1, r2; 5180 5181 TCGv temp, temp2; 5182 5183 r1 = MASK_OP_BO_S1D(ctx->opcode); 5184 r2 = MASK_OP_BO_S2(ctx->opcode); 5185 off10 = MASK_OP_BO_OFF10_SEXT(ctx->opcode); 5186 op2 = MASK_OP_BO_OP2(ctx->opcode); 5187 5188 5189 temp = tcg_temp_new(); 5190 temp2 = tcg_temp_new(); 5191 5192 switch (op2) { 5193 case OPC2_32_BO_LDLCX_SHORTOFF: 5194 tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10); 5195 gen_helper_ldlcx(cpu_env, temp); 5196 break; 5197 case OPC2_32_BO_LDMST_SHORTOFF: 5198 tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10); 5199 gen_ldmst(ctx, r1, temp); 5200 break; 5201 case OPC2_32_BO_LDMST_POSTINC: 5202 gen_ldmst(ctx, r1, cpu_gpr_a[r2]); 5203 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 5204 break; 5205 case OPC2_32_BO_LDMST_PREINC: 5206 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 5207 gen_ldmst(ctx, r1, cpu_gpr_a[r2]); 5208 break; 5209 case OPC2_32_BO_LDUCX_SHORTOFF: 5210 tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10); 5211 gen_helper_lducx(cpu_env, temp); 5212 break; 5213 case OPC2_32_BO_LEA_SHORTOFF: 5214 tcg_gen_addi_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], off10); 5215 break; 5216 case OPC2_32_BO_STLCX_SHORTOFF: 5217 tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10); 5218 gen_helper_stlcx(cpu_env, temp); 5219 break; 5220 case OPC2_32_BO_STUCX_SHORTOFF: 5221 tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10); 5222 gen_helper_stucx(cpu_env, temp); 5223 break; 5224 case OPC2_32_BO_SWAP_W_SHORTOFF: 5225 tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10); 5226 gen_swap(ctx, r1, temp); 5227 break; 5228 case OPC2_32_BO_SWAP_W_POSTINC: 5229 gen_swap(ctx, r1, cpu_gpr_a[r2]); 5230 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 5231 break; 5232 case OPC2_32_BO_SWAP_W_PREINC: 5233 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 5234 gen_swap(ctx, r1, cpu_gpr_a[r2]); 5235 break; 5236 case OPC2_32_BO_CMPSWAP_W_SHORTOFF: 5237 tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10); 5238 gen_cmpswap(ctx, r1, temp); 5239 break; 5240 case OPC2_32_BO_CMPSWAP_W_POSTINC: 5241 gen_cmpswap(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_CMPSWAP_W_PREINC: 5245 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 5246 gen_cmpswap(ctx, r1, cpu_gpr_a[r2]); 5247 break; 5248 case OPC2_32_BO_SWAPMSK_W_SHORTOFF: 5249 tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10); 5250 gen_swapmsk(ctx, r1, temp); 5251 break; 5252 case OPC2_32_BO_SWAPMSK_W_POSTINC: 5253 gen_swapmsk(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_SWAPMSK_W_PREINC: 5257 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); 5258 gen_swapmsk(ctx, r1, cpu_gpr_a[r2]); 5259 break; 5260 default: 5261 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5262 } 5263 tcg_temp_free(temp); 5264 tcg_temp_free(temp2); 5265 } 5266 5267 static void decode_bo_addrmode_ldmst_bitreverse_circular(DisasContext *ctx) 5268 { 5269 uint32_t op2; 5270 uint32_t off10; 5271 int r1, r2; 5272 5273 TCGv temp, temp2, temp3; 5274 5275 r1 = MASK_OP_BO_S1D(ctx->opcode); 5276 r2 = MASK_OP_BO_S2(ctx->opcode); 5277 off10 = MASK_OP_BO_OFF10_SEXT(ctx->opcode); 5278 op2 = MASK_OP_BO_OP2(ctx->opcode); 5279 5280 temp = tcg_temp_new(); 5281 temp2 = tcg_temp_new(); 5282 temp3 = tcg_const_i32(off10); 5283 CHECK_REG_PAIR(r2); 5284 tcg_gen_ext16u_tl(temp, cpu_gpr_a[r2+1]); 5285 tcg_gen_add_tl(temp2, cpu_gpr_a[r2], temp); 5286 5287 switch (op2) { 5288 case OPC2_32_BO_LDMST_BR: 5289 gen_ldmst(ctx, r1, temp2); 5290 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 5291 break; 5292 case OPC2_32_BO_LDMST_CIRC: 5293 gen_ldmst(ctx, r1, temp2); 5294 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 5295 break; 5296 case OPC2_32_BO_SWAP_W_BR: 5297 gen_swap(ctx, r1, temp2); 5298 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 5299 break; 5300 case OPC2_32_BO_SWAP_W_CIRC: 5301 gen_swap(ctx, r1, temp2); 5302 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 5303 break; 5304 case OPC2_32_BO_CMPSWAP_W_BR: 5305 gen_cmpswap(ctx, r1, temp2); 5306 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 5307 break; 5308 case OPC2_32_BO_CMPSWAP_W_CIRC: 5309 gen_cmpswap(ctx, r1, temp2); 5310 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 5311 break; 5312 case OPC2_32_BO_SWAPMSK_W_BR: 5313 gen_swapmsk(ctx, r1, temp2); 5314 gen_helper_br_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1]); 5315 break; 5316 case OPC2_32_BO_SWAPMSK_W_CIRC: 5317 gen_swapmsk(ctx, r1, temp2); 5318 gen_helper_circ_update(cpu_gpr_a[r2+1], cpu_gpr_a[r2+1], temp3); 5319 break; 5320 default: 5321 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5322 } 5323 5324 tcg_temp_free(temp); 5325 tcg_temp_free(temp2); 5326 tcg_temp_free(temp3); 5327 } 5328 5329 static void decode_bol_opc(DisasContext *ctx, int32_t op1) 5330 { 5331 int r1, r2; 5332 int32_t address; 5333 TCGv temp; 5334 5335 r1 = MASK_OP_BOL_S1D(ctx->opcode); 5336 r2 = MASK_OP_BOL_S2(ctx->opcode); 5337 address = MASK_OP_BOL_OFF16_SEXT(ctx->opcode); 5338 5339 switch (op1) { 5340 case OPC1_32_BOL_LD_A_LONGOFF: 5341 temp = tcg_temp_new(); 5342 tcg_gen_addi_tl(temp, cpu_gpr_a[r2], address); 5343 tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], temp, ctx->mem_idx, MO_LEUL); 5344 tcg_temp_free(temp); 5345 break; 5346 case OPC1_32_BOL_LD_W_LONGOFF: 5347 temp = tcg_temp_new(); 5348 tcg_gen_addi_tl(temp, cpu_gpr_a[r2], address); 5349 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LEUL); 5350 tcg_temp_free(temp); 5351 break; 5352 case OPC1_32_BOL_LEA_LONGOFF: 5353 tcg_gen_addi_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], address); 5354 break; 5355 case OPC1_32_BOL_ST_A_LONGOFF: 5356 if (has_feature(ctx, TRICORE_FEATURE_16)) { 5357 gen_offset_st(ctx, cpu_gpr_a[r1], cpu_gpr_a[r2], address, MO_LEUL); 5358 } else { 5359 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5360 } 5361 break; 5362 case OPC1_32_BOL_ST_W_LONGOFF: 5363 gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_LEUL); 5364 break; 5365 case OPC1_32_BOL_LD_B_LONGOFF: 5366 if (has_feature(ctx, TRICORE_FEATURE_16)) { 5367 gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_SB); 5368 } else { 5369 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5370 } 5371 break; 5372 case OPC1_32_BOL_LD_BU_LONGOFF: 5373 if (has_feature(ctx, TRICORE_FEATURE_16)) { 5374 gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_UB); 5375 } else { 5376 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5377 } 5378 break; 5379 case OPC1_32_BOL_LD_H_LONGOFF: 5380 if (has_feature(ctx, TRICORE_FEATURE_16)) { 5381 gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_LESW); 5382 } else { 5383 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5384 } 5385 break; 5386 case OPC1_32_BOL_LD_HU_LONGOFF: 5387 if (has_feature(ctx, TRICORE_FEATURE_16)) { 5388 gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_LEUW); 5389 } else { 5390 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5391 } 5392 break; 5393 case OPC1_32_BOL_ST_B_LONGOFF: 5394 if (has_feature(ctx, TRICORE_FEATURE_16)) { 5395 gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_SB); 5396 } else { 5397 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5398 } 5399 break; 5400 case OPC1_32_BOL_ST_H_LONGOFF: 5401 if (has_feature(ctx, TRICORE_FEATURE_16)) { 5402 gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], address, MO_LESW); 5403 } else { 5404 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5405 } 5406 break; 5407 default: 5408 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5409 } 5410 } 5411 5412 /* RC format */ 5413 static void decode_rc_logical_shift(DisasContext *ctx) 5414 { 5415 uint32_t op2; 5416 int r1, r2; 5417 int32_t const9; 5418 TCGv temp; 5419 5420 r2 = MASK_OP_RC_D(ctx->opcode); 5421 r1 = MASK_OP_RC_S1(ctx->opcode); 5422 const9 = MASK_OP_RC_CONST9(ctx->opcode); 5423 op2 = MASK_OP_RC_OP2(ctx->opcode); 5424 5425 temp = tcg_temp_new(); 5426 5427 switch (op2) { 5428 case OPC2_32_RC_AND: 5429 tcg_gen_andi_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5430 break; 5431 case OPC2_32_RC_ANDN: 5432 tcg_gen_andi_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], ~const9); 5433 break; 5434 case OPC2_32_RC_NAND: 5435 tcg_gen_movi_tl(temp, const9); 5436 tcg_gen_nand_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], temp); 5437 break; 5438 case OPC2_32_RC_NOR: 5439 tcg_gen_movi_tl(temp, const9); 5440 tcg_gen_nor_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], temp); 5441 break; 5442 case OPC2_32_RC_OR: 5443 tcg_gen_ori_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5444 break; 5445 case OPC2_32_RC_ORN: 5446 tcg_gen_ori_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], ~const9); 5447 break; 5448 case OPC2_32_RC_SH: 5449 const9 = sextract32(const9, 0, 6); 5450 gen_shi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5451 break; 5452 case OPC2_32_RC_SH_H: 5453 const9 = sextract32(const9, 0, 5); 5454 gen_sh_hi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5455 break; 5456 case OPC2_32_RC_SHA: 5457 const9 = sextract32(const9, 0, 6); 5458 gen_shaci(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5459 break; 5460 case OPC2_32_RC_SHA_H: 5461 const9 = sextract32(const9, 0, 5); 5462 gen_sha_hi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5463 break; 5464 case OPC2_32_RC_SHAS: 5465 gen_shasi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5466 break; 5467 case OPC2_32_RC_XNOR: 5468 tcg_gen_xori_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5469 tcg_gen_not_tl(cpu_gpr_d[r2], cpu_gpr_d[r2]); 5470 break; 5471 case OPC2_32_RC_XOR: 5472 tcg_gen_xori_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5473 break; 5474 default: 5475 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5476 } 5477 tcg_temp_free(temp); 5478 } 5479 5480 static void decode_rc_accumulator(DisasContext *ctx) 5481 { 5482 uint32_t op2; 5483 int r1, r2; 5484 int16_t const9; 5485 5486 TCGv temp; 5487 5488 r2 = MASK_OP_RC_D(ctx->opcode); 5489 r1 = MASK_OP_RC_S1(ctx->opcode); 5490 const9 = MASK_OP_RC_CONST9_SEXT(ctx->opcode); 5491 5492 op2 = MASK_OP_RC_OP2(ctx->opcode); 5493 5494 temp = tcg_temp_new(); 5495 5496 switch (op2) { 5497 case OPC2_32_RC_ABSDIF: 5498 gen_absdifi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5499 break; 5500 case OPC2_32_RC_ABSDIFS: 5501 gen_absdifsi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5502 break; 5503 case OPC2_32_RC_ADD: 5504 gen_addi_d(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5505 break; 5506 case OPC2_32_RC_ADDC: 5507 gen_addci_CC(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5508 break; 5509 case OPC2_32_RC_ADDS: 5510 gen_addsi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5511 break; 5512 case OPC2_32_RC_ADDS_U: 5513 gen_addsui(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5514 break; 5515 case OPC2_32_RC_ADDX: 5516 gen_addi_CC(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5517 break; 5518 case OPC2_32_RC_AND_EQ: 5519 gen_accumulating_condi(TCG_COND_EQ, cpu_gpr_d[r2], cpu_gpr_d[r1], 5520 const9, &tcg_gen_and_tl); 5521 break; 5522 case OPC2_32_RC_AND_GE: 5523 gen_accumulating_condi(TCG_COND_GE, cpu_gpr_d[r2], cpu_gpr_d[r1], 5524 const9, &tcg_gen_and_tl); 5525 break; 5526 case OPC2_32_RC_AND_GE_U: 5527 const9 = MASK_OP_RC_CONST9(ctx->opcode); 5528 gen_accumulating_condi(TCG_COND_GEU, cpu_gpr_d[r2], cpu_gpr_d[r1], 5529 const9, &tcg_gen_and_tl); 5530 break; 5531 case OPC2_32_RC_AND_LT: 5532 gen_accumulating_condi(TCG_COND_LT, cpu_gpr_d[r2], cpu_gpr_d[r1], 5533 const9, &tcg_gen_and_tl); 5534 break; 5535 case OPC2_32_RC_AND_LT_U: 5536 const9 = MASK_OP_RC_CONST9(ctx->opcode); 5537 gen_accumulating_condi(TCG_COND_LTU, cpu_gpr_d[r2], cpu_gpr_d[r1], 5538 const9, &tcg_gen_and_tl); 5539 break; 5540 case OPC2_32_RC_AND_NE: 5541 gen_accumulating_condi(TCG_COND_NE, cpu_gpr_d[r2], cpu_gpr_d[r1], 5542 const9, &tcg_gen_and_tl); 5543 break; 5544 case OPC2_32_RC_EQ: 5545 tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5546 break; 5547 case OPC2_32_RC_EQANY_B: 5548 gen_eqany_bi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5549 break; 5550 case OPC2_32_RC_EQANY_H: 5551 gen_eqany_hi(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5552 break; 5553 case OPC2_32_RC_GE: 5554 tcg_gen_setcondi_tl(TCG_COND_GE, cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5555 break; 5556 case OPC2_32_RC_GE_U: 5557 const9 = MASK_OP_RC_CONST9(ctx->opcode); 5558 tcg_gen_setcondi_tl(TCG_COND_GEU, cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5559 break; 5560 case OPC2_32_RC_LT: 5561 tcg_gen_setcondi_tl(TCG_COND_LT, cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5562 break; 5563 case OPC2_32_RC_LT_U: 5564 const9 = MASK_OP_RC_CONST9(ctx->opcode); 5565 tcg_gen_setcondi_tl(TCG_COND_LTU, cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5566 break; 5567 case OPC2_32_RC_MAX: 5568 tcg_gen_movi_tl(temp, const9); 5569 tcg_gen_movcond_tl(TCG_COND_GT, cpu_gpr_d[r2], cpu_gpr_d[r1], temp, 5570 cpu_gpr_d[r1], temp); 5571 break; 5572 case OPC2_32_RC_MAX_U: 5573 tcg_gen_movi_tl(temp, MASK_OP_RC_CONST9(ctx->opcode)); 5574 tcg_gen_movcond_tl(TCG_COND_GTU, cpu_gpr_d[r2], cpu_gpr_d[r1], temp, 5575 cpu_gpr_d[r1], temp); 5576 break; 5577 case OPC2_32_RC_MIN: 5578 tcg_gen_movi_tl(temp, const9); 5579 tcg_gen_movcond_tl(TCG_COND_LT, cpu_gpr_d[r2], cpu_gpr_d[r1], temp, 5580 cpu_gpr_d[r1], temp); 5581 break; 5582 case OPC2_32_RC_MIN_U: 5583 tcg_gen_movi_tl(temp, MASK_OP_RC_CONST9(ctx->opcode)); 5584 tcg_gen_movcond_tl(TCG_COND_LTU, cpu_gpr_d[r2], cpu_gpr_d[r1], temp, 5585 cpu_gpr_d[r1], temp); 5586 break; 5587 case OPC2_32_RC_NE: 5588 tcg_gen_setcondi_tl(TCG_COND_NE, cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5589 break; 5590 case OPC2_32_RC_OR_EQ: 5591 gen_accumulating_condi(TCG_COND_EQ, cpu_gpr_d[r2], cpu_gpr_d[r1], 5592 const9, &tcg_gen_or_tl); 5593 break; 5594 case OPC2_32_RC_OR_GE: 5595 gen_accumulating_condi(TCG_COND_GE, cpu_gpr_d[r2], cpu_gpr_d[r1], 5596 const9, &tcg_gen_or_tl); 5597 break; 5598 case OPC2_32_RC_OR_GE_U: 5599 const9 = MASK_OP_RC_CONST9(ctx->opcode); 5600 gen_accumulating_condi(TCG_COND_GEU, cpu_gpr_d[r2], cpu_gpr_d[r1], 5601 const9, &tcg_gen_or_tl); 5602 break; 5603 case OPC2_32_RC_OR_LT: 5604 gen_accumulating_condi(TCG_COND_LT, cpu_gpr_d[r2], cpu_gpr_d[r1], 5605 const9, &tcg_gen_or_tl); 5606 break; 5607 case OPC2_32_RC_OR_LT_U: 5608 const9 = MASK_OP_RC_CONST9(ctx->opcode); 5609 gen_accumulating_condi(TCG_COND_LTU, cpu_gpr_d[r2], cpu_gpr_d[r1], 5610 const9, &tcg_gen_or_tl); 5611 break; 5612 case OPC2_32_RC_OR_NE: 5613 gen_accumulating_condi(TCG_COND_NE, cpu_gpr_d[r2], cpu_gpr_d[r1], 5614 const9, &tcg_gen_or_tl); 5615 break; 5616 case OPC2_32_RC_RSUB: 5617 tcg_gen_movi_tl(temp, const9); 5618 gen_sub_d(cpu_gpr_d[r2], temp, cpu_gpr_d[r1]); 5619 break; 5620 case OPC2_32_RC_RSUBS: 5621 tcg_gen_movi_tl(temp, const9); 5622 gen_subs(cpu_gpr_d[r2], temp, cpu_gpr_d[r1]); 5623 break; 5624 case OPC2_32_RC_RSUBS_U: 5625 tcg_gen_movi_tl(temp, const9); 5626 gen_subsu(cpu_gpr_d[r2], temp, cpu_gpr_d[r1]); 5627 break; 5628 case OPC2_32_RC_SH_EQ: 5629 gen_sh_condi(TCG_COND_EQ, cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5630 break; 5631 case OPC2_32_RC_SH_GE: 5632 gen_sh_condi(TCG_COND_GE, cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5633 break; 5634 case OPC2_32_RC_SH_GE_U: 5635 const9 = MASK_OP_RC_CONST9(ctx->opcode); 5636 gen_sh_condi(TCG_COND_GEU, cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5637 break; 5638 case OPC2_32_RC_SH_LT: 5639 gen_sh_condi(TCG_COND_LT, cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5640 break; 5641 case OPC2_32_RC_SH_LT_U: 5642 const9 = MASK_OP_RC_CONST9(ctx->opcode); 5643 gen_sh_condi(TCG_COND_LTU, cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5644 break; 5645 case OPC2_32_RC_SH_NE: 5646 gen_sh_condi(TCG_COND_NE, cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5647 break; 5648 case OPC2_32_RC_XOR_EQ: 5649 gen_accumulating_condi(TCG_COND_EQ, cpu_gpr_d[r2], cpu_gpr_d[r1], 5650 const9, &tcg_gen_xor_tl); 5651 break; 5652 case OPC2_32_RC_XOR_GE: 5653 gen_accumulating_condi(TCG_COND_GE, cpu_gpr_d[r2], cpu_gpr_d[r1], 5654 const9, &tcg_gen_xor_tl); 5655 break; 5656 case OPC2_32_RC_XOR_GE_U: 5657 const9 = MASK_OP_RC_CONST9(ctx->opcode); 5658 gen_accumulating_condi(TCG_COND_GEU, cpu_gpr_d[r2], cpu_gpr_d[r1], 5659 const9, &tcg_gen_xor_tl); 5660 break; 5661 case OPC2_32_RC_XOR_LT: 5662 gen_accumulating_condi(TCG_COND_LT, cpu_gpr_d[r2], cpu_gpr_d[r1], 5663 const9, &tcg_gen_xor_tl); 5664 break; 5665 case OPC2_32_RC_XOR_LT_U: 5666 const9 = MASK_OP_RC_CONST9(ctx->opcode); 5667 gen_accumulating_condi(TCG_COND_LTU, cpu_gpr_d[r2], cpu_gpr_d[r1], 5668 const9, &tcg_gen_xor_tl); 5669 break; 5670 case OPC2_32_RC_XOR_NE: 5671 gen_accumulating_condi(TCG_COND_NE, cpu_gpr_d[r2], cpu_gpr_d[r1], 5672 const9, &tcg_gen_xor_tl); 5673 break; 5674 default: 5675 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5676 } 5677 tcg_temp_free(temp); 5678 } 5679 5680 static void decode_rc_serviceroutine(DisasContext *ctx) 5681 { 5682 uint32_t op2; 5683 uint32_t const9; 5684 5685 op2 = MASK_OP_RC_OP2(ctx->opcode); 5686 const9 = MASK_OP_RC_CONST9(ctx->opcode); 5687 5688 switch (op2) { 5689 case OPC2_32_RC_BISR: 5690 gen_helper_1arg(bisr, const9); 5691 break; 5692 case OPC2_32_RC_SYSCALL: 5693 /* TODO: Add exception generation */ 5694 break; 5695 default: 5696 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5697 } 5698 } 5699 5700 static void decode_rc_mul(DisasContext *ctx) 5701 { 5702 uint32_t op2; 5703 int r1, r2; 5704 int16_t const9; 5705 5706 r2 = MASK_OP_RC_D(ctx->opcode); 5707 r1 = MASK_OP_RC_S1(ctx->opcode); 5708 const9 = MASK_OP_RC_CONST9_SEXT(ctx->opcode); 5709 5710 op2 = MASK_OP_RC_OP2(ctx->opcode); 5711 5712 switch (op2) { 5713 case OPC2_32_RC_MUL_32: 5714 gen_muli_i32s(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5715 break; 5716 case OPC2_32_RC_MUL_64: 5717 CHECK_REG_PAIR(r2); 5718 gen_muli_i64s(cpu_gpr_d[r2], cpu_gpr_d[r2+1], cpu_gpr_d[r1], const9); 5719 break; 5720 case OPC2_32_RC_MULS_32: 5721 gen_mulsi_i32(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5722 break; 5723 case OPC2_32_RC_MUL_U_64: 5724 const9 = MASK_OP_RC_CONST9(ctx->opcode); 5725 CHECK_REG_PAIR(r2); 5726 gen_muli_i64u(cpu_gpr_d[r2], cpu_gpr_d[r2+1], cpu_gpr_d[r1], const9); 5727 break; 5728 case OPC2_32_RC_MULS_U_32: 5729 const9 = MASK_OP_RC_CONST9(ctx->opcode); 5730 gen_mulsui_i32(cpu_gpr_d[r2], cpu_gpr_d[r1], const9); 5731 break; 5732 default: 5733 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5734 } 5735 } 5736 5737 /* RCPW format */ 5738 static void decode_rcpw_insert(DisasContext *ctx) 5739 { 5740 uint32_t op2; 5741 int r1, r2; 5742 int32_t pos, width, const4; 5743 5744 TCGv temp; 5745 5746 op2 = MASK_OP_RCPW_OP2(ctx->opcode); 5747 r1 = MASK_OP_RCPW_S1(ctx->opcode); 5748 r2 = MASK_OP_RCPW_D(ctx->opcode); 5749 const4 = MASK_OP_RCPW_CONST4(ctx->opcode); 5750 width = MASK_OP_RCPW_WIDTH(ctx->opcode); 5751 pos = MASK_OP_RCPW_POS(ctx->opcode); 5752 5753 switch (op2) { 5754 case OPC2_32_RCPW_IMASK: 5755 CHECK_REG_PAIR(r2); 5756 /* if pos + width > 32 undefined result */ 5757 if (pos + width <= 32) { 5758 tcg_gen_movi_tl(cpu_gpr_d[r2+1], ((1u << width) - 1) << pos); 5759 tcg_gen_movi_tl(cpu_gpr_d[r2], (const4 << pos)); 5760 } 5761 break; 5762 case OPC2_32_RCPW_INSERT: 5763 /* if pos + width > 32 undefined result */ 5764 if (pos + width <= 32) { 5765 temp = tcg_const_i32(const4); 5766 tcg_gen_deposit_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], temp, pos, width); 5767 tcg_temp_free(temp); 5768 } 5769 break; 5770 default: 5771 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5772 } 5773 } 5774 5775 /* RCRW format */ 5776 5777 static void decode_rcrw_insert(DisasContext *ctx) 5778 { 5779 uint32_t op2; 5780 int r1, r3, r4; 5781 int32_t width, const4; 5782 5783 TCGv temp, temp2, temp3; 5784 5785 op2 = MASK_OP_RCRW_OP2(ctx->opcode); 5786 r1 = MASK_OP_RCRW_S1(ctx->opcode); 5787 r3 = MASK_OP_RCRW_S3(ctx->opcode); 5788 r4 = MASK_OP_RCRW_D(ctx->opcode); 5789 width = MASK_OP_RCRW_WIDTH(ctx->opcode); 5790 const4 = MASK_OP_RCRW_CONST4(ctx->opcode); 5791 5792 temp = tcg_temp_new(); 5793 temp2 = tcg_temp_new(); 5794 5795 switch (op2) { 5796 case OPC2_32_RCRW_IMASK: 5797 tcg_gen_andi_tl(temp, cpu_gpr_d[r4], 0x1f); 5798 tcg_gen_movi_tl(temp2, (1 << width) - 1); 5799 tcg_gen_shl_tl(cpu_gpr_d[r3 + 1], temp2, temp); 5800 tcg_gen_movi_tl(temp2, const4); 5801 tcg_gen_shl_tl(cpu_gpr_d[r3], temp2, temp); 5802 break; 5803 case OPC2_32_RCRW_INSERT: 5804 temp3 = tcg_temp_new(); 5805 5806 tcg_gen_movi_tl(temp, width); 5807 tcg_gen_movi_tl(temp2, const4); 5808 tcg_gen_andi_tl(temp3, cpu_gpr_d[r4], 0x1f); 5809 gen_insert(cpu_gpr_d[r3], cpu_gpr_d[r1], temp2, temp, temp3); 5810 5811 tcg_temp_free(temp3); 5812 break; 5813 default: 5814 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5815 } 5816 tcg_temp_free(temp); 5817 tcg_temp_free(temp2); 5818 } 5819 5820 /* RCR format */ 5821 5822 static void decode_rcr_cond_select(DisasContext *ctx) 5823 { 5824 uint32_t op2; 5825 int r1, r3, r4; 5826 int32_t const9; 5827 5828 TCGv temp, temp2; 5829 5830 op2 = MASK_OP_RCR_OP2(ctx->opcode); 5831 r1 = MASK_OP_RCR_S1(ctx->opcode); 5832 const9 = MASK_OP_RCR_CONST9_SEXT(ctx->opcode); 5833 r3 = MASK_OP_RCR_S3(ctx->opcode); 5834 r4 = MASK_OP_RCR_D(ctx->opcode); 5835 5836 switch (op2) { 5837 case OPC2_32_RCR_CADD: 5838 gen_condi_add(TCG_COND_NE, cpu_gpr_d[r1], const9, cpu_gpr_d[r4], 5839 cpu_gpr_d[r3]); 5840 break; 5841 case OPC2_32_RCR_CADDN: 5842 gen_condi_add(TCG_COND_EQ, cpu_gpr_d[r1], const9, cpu_gpr_d[r4], 5843 cpu_gpr_d[r3]); 5844 break; 5845 case OPC2_32_RCR_SEL: 5846 temp = tcg_const_i32(0); 5847 temp2 = tcg_const_i32(const9); 5848 tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr_d[r4], cpu_gpr_d[r3], temp, 5849 cpu_gpr_d[r1], temp2); 5850 tcg_temp_free(temp); 5851 tcg_temp_free(temp2); 5852 break; 5853 case OPC2_32_RCR_SELN: 5854 temp = tcg_const_i32(0); 5855 temp2 = tcg_const_i32(const9); 5856 tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr_d[r4], cpu_gpr_d[r3], temp, 5857 cpu_gpr_d[r1], temp2); 5858 tcg_temp_free(temp); 5859 tcg_temp_free(temp2); 5860 break; 5861 default: 5862 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5863 } 5864 } 5865 5866 static void decode_rcr_madd(DisasContext *ctx) 5867 { 5868 uint32_t op2; 5869 int r1, r3, r4; 5870 int32_t const9; 5871 5872 5873 op2 = MASK_OP_RCR_OP2(ctx->opcode); 5874 r1 = MASK_OP_RCR_S1(ctx->opcode); 5875 const9 = MASK_OP_RCR_CONST9_SEXT(ctx->opcode); 5876 r3 = MASK_OP_RCR_S3(ctx->opcode); 5877 r4 = MASK_OP_RCR_D(ctx->opcode); 5878 5879 switch (op2) { 5880 case OPC2_32_RCR_MADD_32: 5881 gen_maddi32_d(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], const9); 5882 break; 5883 case OPC2_32_RCR_MADD_64: 5884 CHECK_REG_PAIR(r4); 5885 CHECK_REG_PAIR(r3); 5886 gen_maddi64_d(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1], 5887 cpu_gpr_d[r3], cpu_gpr_d[r3+1], const9); 5888 break; 5889 case OPC2_32_RCR_MADDS_32: 5890 gen_maddsi_32(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], const9); 5891 break; 5892 case OPC2_32_RCR_MADDS_64: 5893 CHECK_REG_PAIR(r4); 5894 CHECK_REG_PAIR(r3); 5895 gen_maddsi_64(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1], 5896 cpu_gpr_d[r3], cpu_gpr_d[r3+1], const9); 5897 break; 5898 case OPC2_32_RCR_MADD_U_64: 5899 CHECK_REG_PAIR(r4); 5900 CHECK_REG_PAIR(r3); 5901 const9 = MASK_OP_RCR_CONST9(ctx->opcode); 5902 gen_maddui64_d(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1], 5903 cpu_gpr_d[r3], cpu_gpr_d[r3+1], const9); 5904 break; 5905 case OPC2_32_RCR_MADDS_U_32: 5906 const9 = MASK_OP_RCR_CONST9(ctx->opcode); 5907 gen_maddsui_32(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], const9); 5908 break; 5909 case OPC2_32_RCR_MADDS_U_64: 5910 CHECK_REG_PAIR(r4); 5911 CHECK_REG_PAIR(r3); 5912 const9 = MASK_OP_RCR_CONST9(ctx->opcode); 5913 gen_maddsui_64(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1], 5914 cpu_gpr_d[r3], cpu_gpr_d[r3+1], const9); 5915 break; 5916 default: 5917 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5918 } 5919 } 5920 5921 static void decode_rcr_msub(DisasContext *ctx) 5922 { 5923 uint32_t op2; 5924 int r1, r3, r4; 5925 int32_t const9; 5926 5927 5928 op2 = MASK_OP_RCR_OP2(ctx->opcode); 5929 r1 = MASK_OP_RCR_S1(ctx->opcode); 5930 const9 = MASK_OP_RCR_CONST9_SEXT(ctx->opcode); 5931 r3 = MASK_OP_RCR_S3(ctx->opcode); 5932 r4 = MASK_OP_RCR_D(ctx->opcode); 5933 5934 switch (op2) { 5935 case OPC2_32_RCR_MSUB_32: 5936 gen_msubi32_d(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], const9); 5937 break; 5938 case OPC2_32_RCR_MSUB_64: 5939 CHECK_REG_PAIR(r4); 5940 CHECK_REG_PAIR(r3); 5941 gen_msubi64_d(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1], 5942 cpu_gpr_d[r3], cpu_gpr_d[r3+1], const9); 5943 break; 5944 case OPC2_32_RCR_MSUBS_32: 5945 gen_msubsi_32(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], const9); 5946 break; 5947 case OPC2_32_RCR_MSUBS_64: 5948 CHECK_REG_PAIR(r4); 5949 CHECK_REG_PAIR(r3); 5950 gen_msubsi_64(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1], 5951 cpu_gpr_d[r3], cpu_gpr_d[r3+1], const9); 5952 break; 5953 case OPC2_32_RCR_MSUB_U_64: 5954 CHECK_REG_PAIR(r4); 5955 CHECK_REG_PAIR(r3); 5956 const9 = MASK_OP_RCR_CONST9(ctx->opcode); 5957 gen_msubui64_d(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1], 5958 cpu_gpr_d[r3], cpu_gpr_d[r3+1], const9); 5959 break; 5960 case OPC2_32_RCR_MSUBS_U_32: 5961 const9 = MASK_OP_RCR_CONST9(ctx->opcode); 5962 gen_msubsui_32(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], const9); 5963 break; 5964 case OPC2_32_RCR_MSUBS_U_64: 5965 CHECK_REG_PAIR(r4); 5966 CHECK_REG_PAIR(r3); 5967 const9 = MASK_OP_RCR_CONST9(ctx->opcode); 5968 gen_msubsui_64(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1], 5969 cpu_gpr_d[r3], cpu_gpr_d[r3+1], const9); 5970 break; 5971 default: 5972 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 5973 } 5974 } 5975 5976 /* RLC format */ 5977 5978 static void decode_rlc_opc(DisasContext *ctx, 5979 uint32_t op1) 5980 { 5981 int32_t const16; 5982 int r1, r2; 5983 5984 const16 = MASK_OP_RLC_CONST16_SEXT(ctx->opcode); 5985 r1 = MASK_OP_RLC_S1(ctx->opcode); 5986 r2 = MASK_OP_RLC_D(ctx->opcode); 5987 5988 switch (op1) { 5989 case OPC1_32_RLC_ADDI: 5990 gen_addi_d(cpu_gpr_d[r2], cpu_gpr_d[r1], const16); 5991 break; 5992 case OPC1_32_RLC_ADDIH: 5993 gen_addi_d(cpu_gpr_d[r2], cpu_gpr_d[r1], const16 << 16); 5994 break; 5995 case OPC1_32_RLC_ADDIH_A: 5996 tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r1], const16 << 16); 5997 break; 5998 case OPC1_32_RLC_MFCR: 5999 const16 = MASK_OP_RLC_CONST16(ctx->opcode); 6000 gen_mfcr(ctx, cpu_gpr_d[r2], const16); 6001 break; 6002 case OPC1_32_RLC_MOV: 6003 tcg_gen_movi_tl(cpu_gpr_d[r2], const16); 6004 break; 6005 case OPC1_32_RLC_MOV_64: 6006 if (has_feature(ctx, TRICORE_FEATURE_16)) { 6007 CHECK_REG_PAIR(r2); 6008 tcg_gen_movi_tl(cpu_gpr_d[r2], const16); 6009 tcg_gen_movi_tl(cpu_gpr_d[r2+1], const16 >> 15); 6010 } else { 6011 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 6012 } 6013 break; 6014 case OPC1_32_RLC_MOV_U: 6015 const16 = MASK_OP_RLC_CONST16(ctx->opcode); 6016 tcg_gen_movi_tl(cpu_gpr_d[r2], const16); 6017 break; 6018 case OPC1_32_RLC_MOV_H: 6019 tcg_gen_movi_tl(cpu_gpr_d[r2], const16 << 16); 6020 break; 6021 case OPC1_32_RLC_MOVH_A: 6022 tcg_gen_movi_tl(cpu_gpr_a[r2], const16 << 16); 6023 break; 6024 case OPC1_32_RLC_MTCR: 6025 const16 = MASK_OP_RLC_CONST16(ctx->opcode); 6026 gen_mtcr(ctx, cpu_gpr_d[r1], const16); 6027 break; 6028 default: 6029 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 6030 } 6031 } 6032 6033 /* RR format */ 6034 static void decode_rr_accumulator(DisasContext *ctx) 6035 { 6036 uint32_t op2; 6037 int r3, r2, r1; 6038 6039 TCGv temp; 6040 6041 r3 = MASK_OP_RR_D(ctx->opcode); 6042 r2 = MASK_OP_RR_S2(ctx->opcode); 6043 r1 = MASK_OP_RR_S1(ctx->opcode); 6044 op2 = MASK_OP_RR_OP2(ctx->opcode); 6045 6046 switch (op2) { 6047 case OPC2_32_RR_ABS: 6048 gen_abs(cpu_gpr_d[r3], cpu_gpr_d[r2]); 6049 break; 6050 case OPC2_32_RR_ABS_B: 6051 gen_helper_abs_b(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r2]); 6052 break; 6053 case OPC2_32_RR_ABS_H: 6054 gen_helper_abs_h(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r2]); 6055 break; 6056 case OPC2_32_RR_ABSDIF: 6057 gen_absdif(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6058 break; 6059 case OPC2_32_RR_ABSDIF_B: 6060 gen_helper_absdif_b(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], 6061 cpu_gpr_d[r2]); 6062 break; 6063 case OPC2_32_RR_ABSDIF_H: 6064 gen_helper_absdif_h(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], 6065 cpu_gpr_d[r2]); 6066 break; 6067 case OPC2_32_RR_ABSDIFS: 6068 gen_helper_absdif_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], 6069 cpu_gpr_d[r2]); 6070 break; 6071 case OPC2_32_RR_ABSDIFS_H: 6072 gen_helper_absdif_h_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], 6073 cpu_gpr_d[r2]); 6074 break; 6075 case OPC2_32_RR_ABSS: 6076 gen_helper_abs_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r2]); 6077 break; 6078 case OPC2_32_RR_ABSS_H: 6079 gen_helper_abs_h_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r2]); 6080 break; 6081 case OPC2_32_RR_ADD: 6082 gen_add_d(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6083 break; 6084 case OPC2_32_RR_ADD_B: 6085 gen_helper_add_b(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]); 6086 break; 6087 case OPC2_32_RR_ADD_H: 6088 gen_helper_add_h(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]); 6089 break; 6090 case OPC2_32_RR_ADDC: 6091 gen_addc_CC(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6092 break; 6093 case OPC2_32_RR_ADDS: 6094 gen_adds(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6095 break; 6096 case OPC2_32_RR_ADDS_H: 6097 gen_helper_add_h_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], 6098 cpu_gpr_d[r2]); 6099 break; 6100 case OPC2_32_RR_ADDS_HU: 6101 gen_helper_add_h_suov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], 6102 cpu_gpr_d[r2]); 6103 break; 6104 case OPC2_32_RR_ADDS_U: 6105 gen_helper_add_suov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], 6106 cpu_gpr_d[r2]); 6107 break; 6108 case OPC2_32_RR_ADDX: 6109 gen_add_CC(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6110 break; 6111 case OPC2_32_RR_AND_EQ: 6112 gen_accumulating_cond(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1], 6113 cpu_gpr_d[r2], &tcg_gen_and_tl); 6114 break; 6115 case OPC2_32_RR_AND_GE: 6116 gen_accumulating_cond(TCG_COND_GE, cpu_gpr_d[r3], cpu_gpr_d[r1], 6117 cpu_gpr_d[r2], &tcg_gen_and_tl); 6118 break; 6119 case OPC2_32_RR_AND_GE_U: 6120 gen_accumulating_cond(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_d[r1], 6121 cpu_gpr_d[r2], &tcg_gen_and_tl); 6122 break; 6123 case OPC2_32_RR_AND_LT: 6124 gen_accumulating_cond(TCG_COND_LT, 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_LT_U: 6128 gen_accumulating_cond(TCG_COND_LTU, 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_NE: 6132 gen_accumulating_cond(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_d[r1], 6133 cpu_gpr_d[r2], &tcg_gen_and_tl); 6134 break; 6135 case OPC2_32_RR_EQ: 6136 tcg_gen_setcond_tl(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1], 6137 cpu_gpr_d[r2]); 6138 break; 6139 case OPC2_32_RR_EQ_B: 6140 gen_helper_eq_b(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6141 break; 6142 case OPC2_32_RR_EQ_H: 6143 gen_helper_eq_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6144 break; 6145 case OPC2_32_RR_EQ_W: 6146 gen_cond_w(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6147 break; 6148 case OPC2_32_RR_EQANY_B: 6149 gen_helper_eqany_b(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6150 break; 6151 case OPC2_32_RR_EQANY_H: 6152 gen_helper_eqany_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6153 break; 6154 case OPC2_32_RR_GE: 6155 tcg_gen_setcond_tl(TCG_COND_GE, cpu_gpr_d[r3], cpu_gpr_d[r1], 6156 cpu_gpr_d[r2]); 6157 break; 6158 case OPC2_32_RR_GE_U: 6159 tcg_gen_setcond_tl(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_d[r1], 6160 cpu_gpr_d[r2]); 6161 break; 6162 case OPC2_32_RR_LT: 6163 tcg_gen_setcond_tl(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1], 6164 cpu_gpr_d[r2]); 6165 break; 6166 case OPC2_32_RR_LT_U: 6167 tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1], 6168 cpu_gpr_d[r2]); 6169 break; 6170 case OPC2_32_RR_LT_B: 6171 gen_helper_lt_b(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6172 break; 6173 case OPC2_32_RR_LT_BU: 6174 gen_helper_lt_bu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6175 break; 6176 case OPC2_32_RR_LT_H: 6177 gen_helper_lt_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6178 break; 6179 case OPC2_32_RR_LT_HU: 6180 gen_helper_lt_hu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6181 break; 6182 case OPC2_32_RR_LT_W: 6183 gen_cond_w(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6184 break; 6185 case OPC2_32_RR_LT_WU: 6186 gen_cond_w(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6187 break; 6188 case OPC2_32_RR_MAX: 6189 tcg_gen_movcond_tl(TCG_COND_GT, cpu_gpr_d[r3], cpu_gpr_d[r1], 6190 cpu_gpr_d[r2], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6191 break; 6192 case OPC2_32_RR_MAX_U: 6193 tcg_gen_movcond_tl(TCG_COND_GTU, cpu_gpr_d[r3], cpu_gpr_d[r1], 6194 cpu_gpr_d[r2], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6195 break; 6196 case OPC2_32_RR_MAX_B: 6197 gen_helper_max_b(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6198 break; 6199 case OPC2_32_RR_MAX_BU: 6200 gen_helper_max_bu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6201 break; 6202 case OPC2_32_RR_MAX_H: 6203 gen_helper_max_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6204 break; 6205 case OPC2_32_RR_MAX_HU: 6206 gen_helper_max_hu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6207 break; 6208 case OPC2_32_RR_MIN: 6209 tcg_gen_movcond_tl(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1], 6210 cpu_gpr_d[r2], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6211 break; 6212 case OPC2_32_RR_MIN_U: 6213 tcg_gen_movcond_tl(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1], 6214 cpu_gpr_d[r2], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6215 break; 6216 case OPC2_32_RR_MIN_B: 6217 gen_helper_min_b(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6218 break; 6219 case OPC2_32_RR_MIN_BU: 6220 gen_helper_min_bu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6221 break; 6222 case OPC2_32_RR_MIN_H: 6223 gen_helper_min_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6224 break; 6225 case OPC2_32_RR_MIN_HU: 6226 gen_helper_min_hu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6227 break; 6228 case OPC2_32_RR_MOV: 6229 tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r2]); 6230 break; 6231 case OPC2_32_RR_MOV_64: 6232 if (has_feature(ctx, TRICORE_FEATURE_16)) { 6233 temp = tcg_temp_new(); 6234 6235 CHECK_REG_PAIR(r3); 6236 tcg_gen_mov_tl(temp, cpu_gpr_d[r1]); 6237 tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r2]); 6238 tcg_gen_mov_tl(cpu_gpr_d[r3 + 1], temp); 6239 6240 tcg_temp_free(temp); 6241 } else { 6242 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 6243 } 6244 break; 6245 case OPC2_32_RR_MOVS_64: 6246 if (has_feature(ctx, TRICORE_FEATURE_16)) { 6247 CHECK_REG_PAIR(r3); 6248 tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r2]); 6249 tcg_gen_sari_tl(cpu_gpr_d[r3 + 1], cpu_gpr_d[r2], 31); 6250 } else { 6251 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 6252 } 6253 break; 6254 case OPC2_32_RR_NE: 6255 tcg_gen_setcond_tl(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_d[r1], 6256 cpu_gpr_d[r2]); 6257 break; 6258 case OPC2_32_RR_OR_EQ: 6259 gen_accumulating_cond(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1], 6260 cpu_gpr_d[r2], &tcg_gen_or_tl); 6261 break; 6262 case OPC2_32_RR_OR_GE: 6263 gen_accumulating_cond(TCG_COND_GE, cpu_gpr_d[r3], cpu_gpr_d[r1], 6264 cpu_gpr_d[r2], &tcg_gen_or_tl); 6265 break; 6266 case OPC2_32_RR_OR_GE_U: 6267 gen_accumulating_cond(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_d[r1], 6268 cpu_gpr_d[r2], &tcg_gen_or_tl); 6269 break; 6270 case OPC2_32_RR_OR_LT: 6271 gen_accumulating_cond(TCG_COND_LT, 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_LT_U: 6275 gen_accumulating_cond(TCG_COND_LTU, 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_NE: 6279 gen_accumulating_cond(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_d[r1], 6280 cpu_gpr_d[r2], &tcg_gen_or_tl); 6281 break; 6282 case OPC2_32_RR_SAT_B: 6283 gen_saturate(cpu_gpr_d[r3], cpu_gpr_d[r1], 0x7f, -0x80); 6284 break; 6285 case OPC2_32_RR_SAT_BU: 6286 gen_saturate_u(cpu_gpr_d[r3], cpu_gpr_d[r1], 0xff); 6287 break; 6288 case OPC2_32_RR_SAT_H: 6289 gen_saturate(cpu_gpr_d[r3], cpu_gpr_d[r1], 0x7fff, -0x8000); 6290 break; 6291 case OPC2_32_RR_SAT_HU: 6292 gen_saturate_u(cpu_gpr_d[r3], cpu_gpr_d[r1], 0xffff); 6293 break; 6294 case OPC2_32_RR_SH_EQ: 6295 gen_sh_cond(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1], 6296 cpu_gpr_d[r2]); 6297 break; 6298 case OPC2_32_RR_SH_GE: 6299 gen_sh_cond(TCG_COND_GE, cpu_gpr_d[r3], cpu_gpr_d[r1], 6300 cpu_gpr_d[r2]); 6301 break; 6302 case OPC2_32_RR_SH_GE_U: 6303 gen_sh_cond(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_d[r1], 6304 cpu_gpr_d[r2]); 6305 break; 6306 case OPC2_32_RR_SH_LT: 6307 gen_sh_cond(TCG_COND_LT, cpu_gpr_d[r3], cpu_gpr_d[r1], 6308 cpu_gpr_d[r2]); 6309 break; 6310 case OPC2_32_RR_SH_LT_U: 6311 gen_sh_cond(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_d[r1], 6312 cpu_gpr_d[r2]); 6313 break; 6314 case OPC2_32_RR_SH_NE: 6315 gen_sh_cond(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_d[r1], 6316 cpu_gpr_d[r2]); 6317 break; 6318 case OPC2_32_RR_SUB: 6319 gen_sub_d(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6320 break; 6321 case OPC2_32_RR_SUB_B: 6322 gen_helper_sub_b(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]); 6323 break; 6324 case OPC2_32_RR_SUB_H: 6325 gen_helper_sub_h(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]); 6326 break; 6327 case OPC2_32_RR_SUBC: 6328 gen_subc_CC(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6329 break; 6330 case OPC2_32_RR_SUBS: 6331 gen_subs(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6332 break; 6333 case OPC2_32_RR_SUBS_U: 6334 gen_subsu(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6335 break; 6336 case OPC2_32_RR_SUBS_H: 6337 gen_helper_sub_h_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], 6338 cpu_gpr_d[r2]); 6339 break; 6340 case OPC2_32_RR_SUBS_HU: 6341 gen_helper_sub_h_suov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], 6342 cpu_gpr_d[r2]); 6343 break; 6344 case OPC2_32_RR_SUBX: 6345 gen_sub_CC(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6346 break; 6347 case OPC2_32_RR_XOR_EQ: 6348 gen_accumulating_cond(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_d[r1], 6349 cpu_gpr_d[r2], &tcg_gen_xor_tl); 6350 break; 6351 case OPC2_32_RR_XOR_GE: 6352 gen_accumulating_cond(TCG_COND_GE, cpu_gpr_d[r3], cpu_gpr_d[r1], 6353 cpu_gpr_d[r2], &tcg_gen_xor_tl); 6354 break; 6355 case OPC2_32_RR_XOR_GE_U: 6356 gen_accumulating_cond(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_d[r1], 6357 cpu_gpr_d[r2], &tcg_gen_xor_tl); 6358 break; 6359 case OPC2_32_RR_XOR_LT: 6360 gen_accumulating_cond(TCG_COND_LT, 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_LT_U: 6364 gen_accumulating_cond(TCG_COND_LTU, 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_NE: 6368 gen_accumulating_cond(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_d[r1], 6369 cpu_gpr_d[r2], &tcg_gen_xor_tl); 6370 break; 6371 default: 6372 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 6373 } 6374 } 6375 6376 static void decode_rr_logical_shift(DisasContext *ctx) 6377 { 6378 uint32_t op2; 6379 int r3, r2, r1; 6380 TCGv temp; 6381 6382 r3 = MASK_OP_RR_D(ctx->opcode); 6383 r2 = MASK_OP_RR_S2(ctx->opcode); 6384 r1 = MASK_OP_RR_S1(ctx->opcode); 6385 6386 temp = tcg_temp_new(); 6387 op2 = MASK_OP_RR_OP2(ctx->opcode); 6388 6389 switch (op2) { 6390 case OPC2_32_RR_AND: 6391 tcg_gen_and_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6392 break; 6393 case OPC2_32_RR_ANDN: 6394 tcg_gen_andc_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6395 break; 6396 case OPC2_32_RR_CLO: 6397 tcg_gen_not_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]); 6398 tcg_gen_clzi_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], TARGET_LONG_BITS); 6399 break; 6400 case OPC2_32_RR_CLO_H: 6401 gen_helper_clo_h(cpu_gpr_d[r3], cpu_gpr_d[r1]); 6402 break; 6403 case OPC2_32_RR_CLS: 6404 tcg_gen_clrsb_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]); 6405 break; 6406 case OPC2_32_RR_CLS_H: 6407 gen_helper_cls_h(cpu_gpr_d[r3], cpu_gpr_d[r1]); 6408 break; 6409 case OPC2_32_RR_CLZ: 6410 tcg_gen_clzi_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], TARGET_LONG_BITS); 6411 break; 6412 case OPC2_32_RR_CLZ_H: 6413 gen_helper_clz_h(cpu_gpr_d[r3], cpu_gpr_d[r1]); 6414 break; 6415 case OPC2_32_RR_NAND: 6416 tcg_gen_nand_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6417 break; 6418 case OPC2_32_RR_NOR: 6419 tcg_gen_nor_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6420 break; 6421 case OPC2_32_RR_OR: 6422 tcg_gen_or_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6423 break; 6424 case OPC2_32_RR_ORN: 6425 tcg_gen_orc_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6426 break; 6427 case OPC2_32_RR_SH: 6428 gen_helper_sh(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6429 break; 6430 case OPC2_32_RR_SH_H: 6431 gen_helper_sh_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6432 break; 6433 case OPC2_32_RR_SHA: 6434 gen_helper_sha(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]); 6435 break; 6436 case OPC2_32_RR_SHA_H: 6437 gen_helper_sha_h(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6438 break; 6439 case OPC2_32_RR_SHAS: 6440 gen_shas(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6441 break; 6442 case OPC2_32_RR_XNOR: 6443 tcg_gen_eqv_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6444 break; 6445 case OPC2_32_RR_XOR: 6446 tcg_gen_xor_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6447 break; 6448 default: 6449 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 6450 } 6451 tcg_temp_free(temp); 6452 } 6453 6454 static void decode_rr_address(DisasContext *ctx) 6455 { 6456 uint32_t op2, n; 6457 int r1, r2, r3; 6458 TCGv temp; 6459 6460 op2 = MASK_OP_RR_OP2(ctx->opcode); 6461 r3 = MASK_OP_RR_D(ctx->opcode); 6462 r2 = MASK_OP_RR_S2(ctx->opcode); 6463 r1 = MASK_OP_RR_S1(ctx->opcode); 6464 n = MASK_OP_RR_N(ctx->opcode); 6465 6466 switch (op2) { 6467 case OPC2_32_RR_ADD_A: 6468 tcg_gen_add_tl(cpu_gpr_a[r3], cpu_gpr_a[r1], cpu_gpr_a[r2]); 6469 break; 6470 case OPC2_32_RR_ADDSC_A: 6471 temp = tcg_temp_new(); 6472 tcg_gen_shli_tl(temp, cpu_gpr_d[r1], n); 6473 tcg_gen_add_tl(cpu_gpr_a[r3], cpu_gpr_a[r2], temp); 6474 tcg_temp_free(temp); 6475 break; 6476 case OPC2_32_RR_ADDSC_AT: 6477 temp = tcg_temp_new(); 6478 tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 3); 6479 tcg_gen_add_tl(temp, cpu_gpr_a[r2], temp); 6480 tcg_gen_andi_tl(cpu_gpr_a[r3], temp, 0xFFFFFFFC); 6481 tcg_temp_free(temp); 6482 break; 6483 case OPC2_32_RR_EQ_A: 6484 tcg_gen_setcond_tl(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_a[r1], 6485 cpu_gpr_a[r2]); 6486 break; 6487 case OPC2_32_RR_EQZ: 6488 tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_a[r1], 0); 6489 break; 6490 case OPC2_32_RR_GE_A: 6491 tcg_gen_setcond_tl(TCG_COND_GEU, cpu_gpr_d[r3], cpu_gpr_a[r1], 6492 cpu_gpr_a[r2]); 6493 break; 6494 case OPC2_32_RR_LT_A: 6495 tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr_d[r3], cpu_gpr_a[r1], 6496 cpu_gpr_a[r2]); 6497 break; 6498 case OPC2_32_RR_MOV_A: 6499 tcg_gen_mov_tl(cpu_gpr_a[r3], cpu_gpr_d[r2]); 6500 break; 6501 case OPC2_32_RR_MOV_AA: 6502 tcg_gen_mov_tl(cpu_gpr_a[r3], cpu_gpr_a[r2]); 6503 break; 6504 case OPC2_32_RR_MOV_D: 6505 tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_a[r2]); 6506 break; 6507 case OPC2_32_RR_NE_A: 6508 tcg_gen_setcond_tl(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_a[r1], 6509 cpu_gpr_a[r2]); 6510 break; 6511 case OPC2_32_RR_NEZ_A: 6512 tcg_gen_setcondi_tl(TCG_COND_NE, cpu_gpr_d[r3], cpu_gpr_a[r1], 0); 6513 break; 6514 case OPC2_32_RR_SUB_A: 6515 tcg_gen_sub_tl(cpu_gpr_a[r3], cpu_gpr_a[r1], cpu_gpr_a[r2]); 6516 break; 6517 default: 6518 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 6519 } 6520 } 6521 6522 static void decode_rr_idirect(DisasContext *ctx) 6523 { 6524 uint32_t op2; 6525 int r1; 6526 6527 op2 = MASK_OP_RR_OP2(ctx->opcode); 6528 r1 = MASK_OP_RR_S1(ctx->opcode); 6529 6530 switch (op2) { 6531 case OPC2_32_RR_JI: 6532 tcg_gen_andi_tl(cpu_PC, cpu_gpr_a[r1], ~0x1); 6533 break; 6534 case OPC2_32_RR_JLI: 6535 tcg_gen_movi_tl(cpu_gpr_a[11], ctx->pc_succ_insn); 6536 tcg_gen_andi_tl(cpu_PC, cpu_gpr_a[r1], ~0x1); 6537 break; 6538 case OPC2_32_RR_CALLI: 6539 gen_helper_1arg(call, ctx->pc_succ_insn); 6540 tcg_gen_andi_tl(cpu_PC, cpu_gpr_a[r1], ~0x1); 6541 break; 6542 case OPC2_32_RR_FCALLI: 6543 gen_fcall_save_ctx(ctx); 6544 tcg_gen_andi_tl(cpu_PC, cpu_gpr_a[r1], ~0x1); 6545 break; 6546 default: 6547 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 6548 } 6549 tcg_gen_exit_tb(NULL, 0); 6550 ctx->base.is_jmp = DISAS_NORETURN; 6551 } 6552 6553 static void decode_rr_divide(DisasContext *ctx) 6554 { 6555 uint32_t op2; 6556 int r1, r2, r3; 6557 6558 TCGv temp, temp2, temp3; 6559 6560 op2 = MASK_OP_RR_OP2(ctx->opcode); 6561 r3 = MASK_OP_RR_D(ctx->opcode); 6562 r2 = MASK_OP_RR_S2(ctx->opcode); 6563 r1 = MASK_OP_RR_S1(ctx->opcode); 6564 6565 switch (op2) { 6566 case OPC2_32_RR_BMERGE: 6567 gen_helper_bmerge(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6568 break; 6569 case OPC2_32_RR_BSPLIT: 6570 CHECK_REG_PAIR(r3); 6571 gen_bsplit(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1]); 6572 break; 6573 case OPC2_32_RR_DVINIT_B: 6574 CHECK_REG_PAIR(r3); 6575 gen_dvinit_b(ctx, cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1], 6576 cpu_gpr_d[r2]); 6577 break; 6578 case OPC2_32_RR_DVINIT_BU: 6579 temp = tcg_temp_new(); 6580 temp2 = tcg_temp_new(); 6581 temp3 = tcg_temp_new(); 6582 CHECK_REG_PAIR(r3); 6583 tcg_gen_shri_tl(temp3, cpu_gpr_d[r1], 8); 6584 /* reset av */ 6585 tcg_gen_movi_tl(cpu_PSW_AV, 0); 6586 if (!has_feature(ctx, TRICORE_FEATURE_131)) { 6587 /* overflow = (abs(D[r3+1]) >= abs(D[r2])) */ 6588 tcg_gen_abs_tl(temp, temp3); 6589 tcg_gen_abs_tl(temp2, cpu_gpr_d[r2]); 6590 tcg_gen_setcond_tl(TCG_COND_GE, cpu_PSW_V, temp, temp2); 6591 } else { 6592 /* overflow = (D[b] == 0) */ 6593 tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, cpu_gpr_d[r2], 0); 6594 } 6595 tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31); 6596 /* sv */ 6597 tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V); 6598 /* write result */ 6599 tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], 24); 6600 tcg_gen_mov_tl(cpu_gpr_d[r3+1], temp3); 6601 6602 tcg_temp_free(temp); 6603 tcg_temp_free(temp2); 6604 tcg_temp_free(temp3); 6605 break; 6606 case OPC2_32_RR_DVINIT_H: 6607 CHECK_REG_PAIR(r3); 6608 gen_dvinit_h(ctx, cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1], 6609 cpu_gpr_d[r2]); 6610 break; 6611 case OPC2_32_RR_DVINIT_HU: 6612 temp = tcg_temp_new(); 6613 temp2 = tcg_temp_new(); 6614 temp3 = tcg_temp_new(); 6615 CHECK_REG_PAIR(r3); 6616 tcg_gen_shri_tl(temp3, cpu_gpr_d[r1], 16); 6617 /* reset av */ 6618 tcg_gen_movi_tl(cpu_PSW_AV, 0); 6619 if (!has_feature(ctx, TRICORE_FEATURE_131)) { 6620 /* overflow = (abs(D[r3+1]) >= abs(D[r2])) */ 6621 tcg_gen_abs_tl(temp, temp3); 6622 tcg_gen_abs_tl(temp2, cpu_gpr_d[r2]); 6623 tcg_gen_setcond_tl(TCG_COND_GE, cpu_PSW_V, temp, temp2); 6624 } else { 6625 /* overflow = (D[b] == 0) */ 6626 tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, cpu_gpr_d[r2], 0); 6627 } 6628 tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31); 6629 /* sv */ 6630 tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V); 6631 /* write result */ 6632 tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], 16); 6633 tcg_gen_mov_tl(cpu_gpr_d[r3+1], temp3); 6634 tcg_temp_free(temp); 6635 tcg_temp_free(temp2); 6636 tcg_temp_free(temp3); 6637 break; 6638 case OPC2_32_RR_DVINIT: 6639 temp = tcg_temp_new(); 6640 temp2 = tcg_temp_new(); 6641 CHECK_REG_PAIR(r3); 6642 /* overflow = ((D[b] == 0) || 6643 ((D[b] == 0xFFFFFFFF) && (D[a] == 0x80000000))) */ 6644 tcg_gen_setcondi_tl(TCG_COND_EQ, temp, cpu_gpr_d[r2], 0xffffffff); 6645 tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, cpu_gpr_d[r1], 0x80000000); 6646 tcg_gen_and_tl(temp, temp, temp2); 6647 tcg_gen_setcondi_tl(TCG_COND_EQ, temp2, cpu_gpr_d[r2], 0); 6648 tcg_gen_or_tl(cpu_PSW_V, temp, temp2); 6649 tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31); 6650 /* sv */ 6651 tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V); 6652 /* reset av */ 6653 tcg_gen_movi_tl(cpu_PSW_AV, 0); 6654 /* write result */ 6655 tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]); 6656 /* sign extend to high reg */ 6657 tcg_gen_sari_tl(cpu_gpr_d[r3+1], cpu_gpr_d[r1], 31); 6658 tcg_temp_free(temp); 6659 tcg_temp_free(temp2); 6660 break; 6661 case OPC2_32_RR_DVINIT_U: 6662 /* overflow = (D[b] == 0) */ 6663 tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_PSW_V, cpu_gpr_d[r2], 0); 6664 tcg_gen_shli_tl(cpu_PSW_V, cpu_PSW_V, 31); 6665 /* sv */ 6666 tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_SV, cpu_PSW_V); 6667 /* reset av */ 6668 tcg_gen_movi_tl(cpu_PSW_AV, 0); 6669 /* write result */ 6670 tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]); 6671 /* zero extend to high reg*/ 6672 tcg_gen_movi_tl(cpu_gpr_d[r3+1], 0); 6673 break; 6674 case OPC2_32_RR_PARITY: 6675 gen_helper_parity(cpu_gpr_d[r3], cpu_gpr_d[r1]); 6676 break; 6677 case OPC2_32_RR_UNPACK: 6678 CHECK_REG_PAIR(r3); 6679 gen_unpack(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1]); 6680 break; 6681 case OPC2_32_RR_CRC32: 6682 if (has_feature(ctx, TRICORE_FEATURE_161)) { 6683 gen_helper_crc32(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6684 } else { 6685 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 6686 } 6687 break; 6688 case OPC2_32_RR_DIV: 6689 if (has_feature(ctx, TRICORE_FEATURE_16)) { 6690 GEN_HELPER_RR(divide, cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1], 6691 cpu_gpr_d[r2]); 6692 } else { 6693 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 6694 } 6695 break; 6696 case OPC2_32_RR_DIV_U: 6697 if (has_feature(ctx, TRICORE_FEATURE_16)) { 6698 GEN_HELPER_RR(divide_u, cpu_gpr_d[r3], cpu_gpr_d[r3+1], 6699 cpu_gpr_d[r1], cpu_gpr_d[r2]); 6700 } else { 6701 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 6702 } 6703 break; 6704 case OPC2_32_RR_MUL_F: 6705 gen_helper_fmul(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]); 6706 break; 6707 case OPC2_32_RR_DIV_F: 6708 gen_helper_fdiv(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]); 6709 break; 6710 case OPC2_32_RR_CMP_F: 6711 gen_helper_fcmp(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]); 6712 break; 6713 case OPC2_32_RR_FTOI: 6714 gen_helper_ftoi(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]); 6715 break; 6716 case OPC2_32_RR_ITOF: 6717 gen_helper_itof(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]); 6718 break; 6719 case OPC2_32_RR_FTOUZ: 6720 gen_helper_ftouz(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]); 6721 break; 6722 case OPC2_32_RR_UPDFL: 6723 gen_helper_updfl(cpu_env, cpu_gpr_d[r1]); 6724 break; 6725 case OPC2_32_RR_UTOF: 6726 gen_helper_utof(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]); 6727 break; 6728 case OPC2_32_RR_FTOIZ: 6729 gen_helper_ftoiz(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]); 6730 break; 6731 case OPC2_32_RR_QSEED_F: 6732 gen_helper_qseed(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]); 6733 break; 6734 default: 6735 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 6736 } 6737 } 6738 6739 /* RR1 Format */ 6740 static void decode_rr1_mul(DisasContext *ctx) 6741 { 6742 uint32_t op2; 6743 6744 int r1, r2, r3; 6745 TCGv n; 6746 TCGv_i64 temp64; 6747 6748 r1 = MASK_OP_RR1_S1(ctx->opcode); 6749 r2 = MASK_OP_RR1_S2(ctx->opcode); 6750 r3 = MASK_OP_RR1_D(ctx->opcode); 6751 n = tcg_const_i32(MASK_OP_RR1_N(ctx->opcode)); 6752 op2 = MASK_OP_RR1_OP2(ctx->opcode); 6753 6754 switch (op2) { 6755 case OPC2_32_RR1_MUL_H_32_LL: 6756 temp64 = tcg_temp_new_i64(); 6757 CHECK_REG_PAIR(r3); 6758 GEN_HELPER_LL(mul_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n); 6759 tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64); 6760 gen_calc_usb_mul_h(cpu_gpr_d[r3], cpu_gpr_d[r3+1]); 6761 tcg_temp_free_i64(temp64); 6762 break; 6763 case OPC2_32_RR1_MUL_H_32_LU: 6764 temp64 = tcg_temp_new_i64(); 6765 CHECK_REG_PAIR(r3); 6766 GEN_HELPER_LU(mul_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n); 6767 tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64); 6768 gen_calc_usb_mul_h(cpu_gpr_d[r3], cpu_gpr_d[r3+1]); 6769 tcg_temp_free_i64(temp64); 6770 break; 6771 case OPC2_32_RR1_MUL_H_32_UL: 6772 temp64 = tcg_temp_new_i64(); 6773 CHECK_REG_PAIR(r3); 6774 GEN_HELPER_UL(mul_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n); 6775 tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64); 6776 gen_calc_usb_mul_h(cpu_gpr_d[r3], cpu_gpr_d[r3+1]); 6777 tcg_temp_free_i64(temp64); 6778 break; 6779 case OPC2_32_RR1_MUL_H_32_UU: 6780 temp64 = tcg_temp_new_i64(); 6781 CHECK_REG_PAIR(r3); 6782 GEN_HELPER_UU(mul_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n); 6783 tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64); 6784 gen_calc_usb_mul_h(cpu_gpr_d[r3], cpu_gpr_d[r3+1]); 6785 tcg_temp_free_i64(temp64); 6786 break; 6787 case OPC2_32_RR1_MULM_H_64_LL: 6788 temp64 = tcg_temp_new_i64(); 6789 CHECK_REG_PAIR(r3); 6790 GEN_HELPER_LL(mulm_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n); 6791 tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64); 6792 /* reset V bit */ 6793 tcg_gen_movi_tl(cpu_PSW_V, 0); 6794 /* reset AV bit */ 6795 tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V); 6796 tcg_temp_free_i64(temp64); 6797 break; 6798 case OPC2_32_RR1_MULM_H_64_LU: 6799 temp64 = tcg_temp_new_i64(); 6800 CHECK_REG_PAIR(r3); 6801 GEN_HELPER_LU(mulm_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n); 6802 tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64); 6803 /* reset V bit */ 6804 tcg_gen_movi_tl(cpu_PSW_V, 0); 6805 /* reset AV bit */ 6806 tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V); 6807 tcg_temp_free_i64(temp64); 6808 break; 6809 case OPC2_32_RR1_MULM_H_64_UL: 6810 temp64 = tcg_temp_new_i64(); 6811 CHECK_REG_PAIR(r3); 6812 GEN_HELPER_UL(mulm_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n); 6813 tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64); 6814 /* reset V bit */ 6815 tcg_gen_movi_tl(cpu_PSW_V, 0); 6816 /* reset AV bit */ 6817 tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V); 6818 tcg_temp_free_i64(temp64); 6819 break; 6820 case OPC2_32_RR1_MULM_H_64_UU: 6821 temp64 = tcg_temp_new_i64(); 6822 CHECK_REG_PAIR(r3); 6823 GEN_HELPER_UU(mulm_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n); 6824 tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64); 6825 /* reset V bit */ 6826 tcg_gen_movi_tl(cpu_PSW_V, 0); 6827 /* reset AV bit */ 6828 tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V); 6829 tcg_temp_free_i64(temp64); 6830 6831 break; 6832 case OPC2_32_RR1_MULR_H_16_LL: 6833 GEN_HELPER_LL(mulr_h, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], n); 6834 gen_calc_usb_mulr_h(cpu_gpr_d[r3]); 6835 break; 6836 case OPC2_32_RR1_MULR_H_16_LU: 6837 GEN_HELPER_LU(mulr_h, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], n); 6838 gen_calc_usb_mulr_h(cpu_gpr_d[r3]); 6839 break; 6840 case OPC2_32_RR1_MULR_H_16_UL: 6841 GEN_HELPER_UL(mulr_h, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], n); 6842 gen_calc_usb_mulr_h(cpu_gpr_d[r3]); 6843 break; 6844 case OPC2_32_RR1_MULR_H_16_UU: 6845 GEN_HELPER_UU(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 default: 6849 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 6850 } 6851 tcg_temp_free(n); 6852 } 6853 6854 static void decode_rr1_mulq(DisasContext *ctx) 6855 { 6856 uint32_t op2; 6857 int r1, r2, r3; 6858 uint32_t n; 6859 6860 TCGv temp, temp2; 6861 6862 r1 = MASK_OP_RR1_S1(ctx->opcode); 6863 r2 = MASK_OP_RR1_S2(ctx->opcode); 6864 r3 = MASK_OP_RR1_D(ctx->opcode); 6865 n = MASK_OP_RR1_N(ctx->opcode); 6866 op2 = MASK_OP_RR1_OP2(ctx->opcode); 6867 6868 temp = tcg_temp_new(); 6869 temp2 = tcg_temp_new(); 6870 6871 switch (op2) { 6872 case OPC2_32_RR1_MUL_Q_32: 6873 gen_mul_q(cpu_gpr_d[r3], temp, cpu_gpr_d[r1], cpu_gpr_d[r2], n, 32); 6874 break; 6875 case OPC2_32_RR1_MUL_Q_64: 6876 CHECK_REG_PAIR(r3); 6877 gen_mul_q(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 6878 n, 0); 6879 break; 6880 case OPC2_32_RR1_MUL_Q_32_L: 6881 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]); 6882 gen_mul_q(cpu_gpr_d[r3], temp, cpu_gpr_d[r1], temp, n, 16); 6883 break; 6884 case OPC2_32_RR1_MUL_Q_64_L: 6885 CHECK_REG_PAIR(r3); 6886 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]); 6887 gen_mul_q(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp, n, 0); 6888 break; 6889 case OPC2_32_RR1_MUL_Q_32_U: 6890 tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16); 6891 gen_mul_q(cpu_gpr_d[r3], temp, cpu_gpr_d[r1], temp, n, 16); 6892 break; 6893 case OPC2_32_RR1_MUL_Q_64_U: 6894 CHECK_REG_PAIR(r3); 6895 tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16); 6896 gen_mul_q(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp, n, 0); 6897 break; 6898 case OPC2_32_RR1_MUL_Q_32_LL: 6899 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]); 6900 tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]); 6901 gen_mul_q_16(cpu_gpr_d[r3], temp, temp2, n); 6902 break; 6903 case OPC2_32_RR1_MUL_Q_32_UU: 6904 tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16); 6905 tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16); 6906 gen_mul_q_16(cpu_gpr_d[r3], temp, temp2, n); 6907 break; 6908 case OPC2_32_RR1_MULR_Q_32_L: 6909 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]); 6910 tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]); 6911 gen_mulr_q(cpu_gpr_d[r3], temp, temp2, n); 6912 break; 6913 case OPC2_32_RR1_MULR_Q_32_U: 6914 tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16); 6915 tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16); 6916 gen_mulr_q(cpu_gpr_d[r3], temp, temp2, n); 6917 break; 6918 default: 6919 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 6920 } 6921 tcg_temp_free(temp); 6922 tcg_temp_free(temp2); 6923 } 6924 6925 /* RR2 format */ 6926 static void decode_rr2_mul(DisasContext *ctx) 6927 { 6928 uint32_t op2; 6929 int r1, r2, r3; 6930 6931 op2 = MASK_OP_RR2_OP2(ctx->opcode); 6932 r1 = MASK_OP_RR2_S1(ctx->opcode); 6933 r2 = MASK_OP_RR2_S2(ctx->opcode); 6934 r3 = MASK_OP_RR2_D(ctx->opcode); 6935 switch (op2) { 6936 case OPC2_32_RR2_MUL_32: 6937 gen_mul_i32s(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2]); 6938 break; 6939 case OPC2_32_RR2_MUL_64: 6940 CHECK_REG_PAIR(r3); 6941 gen_mul_i64s(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1], 6942 cpu_gpr_d[r2]); 6943 break; 6944 case OPC2_32_RR2_MULS_32: 6945 gen_helper_mul_ssov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], 6946 cpu_gpr_d[r2]); 6947 break; 6948 case OPC2_32_RR2_MUL_U_64: 6949 CHECK_REG_PAIR(r3); 6950 gen_mul_i64u(cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r1], 6951 cpu_gpr_d[r2]); 6952 break; 6953 case OPC2_32_RR2_MULS_U_32: 6954 gen_helper_mul_suov(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], 6955 cpu_gpr_d[r2]); 6956 break; 6957 default: 6958 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 6959 } 6960 } 6961 6962 /* RRPW format */ 6963 static void decode_rrpw_extract_insert(DisasContext *ctx) 6964 { 6965 uint32_t op2; 6966 int r1, r2, r3; 6967 int32_t pos, width; 6968 TCGv temp; 6969 6970 op2 = MASK_OP_RRPW_OP2(ctx->opcode); 6971 r1 = MASK_OP_RRPW_S1(ctx->opcode); 6972 r2 = MASK_OP_RRPW_S2(ctx->opcode); 6973 r3 = MASK_OP_RRPW_D(ctx->opcode); 6974 pos = MASK_OP_RRPW_POS(ctx->opcode); 6975 width = MASK_OP_RRPW_WIDTH(ctx->opcode); 6976 6977 switch (op2) { 6978 case OPC2_32_RRPW_EXTR: 6979 if (width == 0) { 6980 tcg_gen_movi_tl(cpu_gpr_d[r3], 0); 6981 break; 6982 } 6983 6984 if (pos + width <= 32) { 6985 /* optimize special cases */ 6986 if ((pos == 0) && (width == 8)) { 6987 tcg_gen_ext8s_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]); 6988 } else if ((pos == 0) && (width == 16)) { 6989 tcg_gen_ext16s_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]); 6990 } else { 6991 tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], 32 - pos - width); 6992 tcg_gen_sari_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], 32 - width); 6993 } 6994 } 6995 break; 6996 case OPC2_32_RRPW_EXTR_U: 6997 if (width == 0) { 6998 tcg_gen_movi_tl(cpu_gpr_d[r3], 0); 6999 } else { 7000 tcg_gen_shri_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], pos); 7001 tcg_gen_andi_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], ~0u >> (32-width)); 7002 } 7003 break; 7004 case OPC2_32_RRPW_IMASK: 7005 CHECK_REG_PAIR(r3); 7006 7007 if (pos + width <= 32) { 7008 temp = tcg_temp_new(); 7009 tcg_gen_movi_tl(temp, ((1u << width) - 1) << pos); 7010 tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r2], pos); 7011 tcg_gen_mov_tl(cpu_gpr_d[r3 + 1], temp); 7012 tcg_temp_free(temp); 7013 } 7014 7015 break; 7016 case OPC2_32_RRPW_INSERT: 7017 if (pos + width <= 32) { 7018 tcg_gen_deposit_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], 7019 pos, width); 7020 } 7021 break; 7022 default: 7023 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 7024 } 7025 } 7026 7027 /* RRR format */ 7028 static void decode_rrr_cond_select(DisasContext *ctx) 7029 { 7030 uint32_t op2; 7031 int r1, r2, r3, r4; 7032 TCGv temp; 7033 7034 op2 = MASK_OP_RRR_OP2(ctx->opcode); 7035 r1 = MASK_OP_RRR_S1(ctx->opcode); 7036 r2 = MASK_OP_RRR_S2(ctx->opcode); 7037 r3 = MASK_OP_RRR_S3(ctx->opcode); 7038 r4 = MASK_OP_RRR_D(ctx->opcode); 7039 7040 switch (op2) { 7041 case OPC2_32_RRR_CADD: 7042 gen_cond_add(TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[r2], 7043 cpu_gpr_d[r4], cpu_gpr_d[r3]); 7044 break; 7045 case OPC2_32_RRR_CADDN: 7046 gen_cond_add(TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[r2], cpu_gpr_d[r4], 7047 cpu_gpr_d[r3]); 7048 break; 7049 case OPC2_32_RRR_CSUB: 7050 gen_cond_sub(TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[r2], cpu_gpr_d[r4], 7051 cpu_gpr_d[r3]); 7052 break; 7053 case OPC2_32_RRR_CSUBN: 7054 gen_cond_sub(TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[r2], cpu_gpr_d[r4], 7055 cpu_gpr_d[r3]); 7056 break; 7057 case OPC2_32_RRR_SEL: 7058 temp = tcg_const_i32(0); 7059 tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr_d[r4], cpu_gpr_d[r3], temp, 7060 cpu_gpr_d[r1], cpu_gpr_d[r2]); 7061 tcg_temp_free(temp); 7062 break; 7063 case OPC2_32_RRR_SELN: 7064 temp = tcg_const_i32(0); 7065 tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr_d[r4], cpu_gpr_d[r3], temp, 7066 cpu_gpr_d[r1], cpu_gpr_d[r2]); 7067 tcg_temp_free(temp); 7068 break; 7069 default: 7070 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 7071 } 7072 } 7073 7074 static void decode_rrr_divide(DisasContext *ctx) 7075 { 7076 uint32_t op2; 7077 7078 int r1, r2, r3, r4; 7079 7080 op2 = MASK_OP_RRR_OP2(ctx->opcode); 7081 r1 = MASK_OP_RRR_S1(ctx->opcode); 7082 r2 = MASK_OP_RRR_S2(ctx->opcode); 7083 r3 = MASK_OP_RRR_S3(ctx->opcode); 7084 r4 = MASK_OP_RRR_D(ctx->opcode); 7085 7086 switch (op2) { 7087 case OPC2_32_RRR_DVADJ: 7088 CHECK_REG_PAIR(r3); 7089 CHECK_REG_PAIR(r4); 7090 GEN_HELPER_RRR(dvadj, cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7091 cpu_gpr_d[r3+1], cpu_gpr_d[r2]); 7092 break; 7093 case OPC2_32_RRR_DVSTEP: 7094 CHECK_REG_PAIR(r3); 7095 CHECK_REG_PAIR(r4); 7096 GEN_HELPER_RRR(dvstep, cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7097 cpu_gpr_d[r3+1], cpu_gpr_d[r2]); 7098 break; 7099 case OPC2_32_RRR_DVSTEP_U: 7100 CHECK_REG_PAIR(r3); 7101 CHECK_REG_PAIR(r4); 7102 GEN_HELPER_RRR(dvstep_u, 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_IXMAX: 7106 CHECK_REG_PAIR(r3); 7107 CHECK_REG_PAIR(r4); 7108 GEN_HELPER_RRR(ixmax, 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_IXMAX_U: 7112 CHECK_REG_PAIR(r3); 7113 CHECK_REG_PAIR(r4); 7114 GEN_HELPER_RRR(ixmax_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_IXMIN: 7118 CHECK_REG_PAIR(r3); 7119 CHECK_REG_PAIR(r4); 7120 GEN_HELPER_RRR(ixmin, 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_IXMIN_U: 7124 CHECK_REG_PAIR(r3); 7125 CHECK_REG_PAIR(r4); 7126 GEN_HELPER_RRR(ixmin_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_PACK: 7130 CHECK_REG_PAIR(r3); 7131 gen_helper_pack(cpu_gpr_d[r4], cpu_PSW_C, cpu_gpr_d[r3], 7132 cpu_gpr_d[r3+1], cpu_gpr_d[r1]); 7133 break; 7134 case OPC2_32_RRR_ADD_F: 7135 gen_helper_fadd(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r3]); 7136 break; 7137 case OPC2_32_RRR_SUB_F: 7138 gen_helper_fsub(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r3]); 7139 break; 7140 case OPC2_32_RRR_MADD_F: 7141 gen_helper_fmadd(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1], 7142 cpu_gpr_d[r2], cpu_gpr_d[r3]); 7143 break; 7144 case OPC2_32_RRR_MSUB_F: 7145 gen_helper_fmsub(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1], 7146 cpu_gpr_d[r2], cpu_gpr_d[r3]); 7147 break; 7148 default: 7149 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 7150 } 7151 } 7152 7153 /* RRR2 format */ 7154 static void decode_rrr2_madd(DisasContext *ctx) 7155 { 7156 uint32_t op2; 7157 uint32_t r1, r2, r3, r4; 7158 7159 op2 = MASK_OP_RRR2_OP2(ctx->opcode); 7160 r1 = MASK_OP_RRR2_S1(ctx->opcode); 7161 r2 = MASK_OP_RRR2_S2(ctx->opcode); 7162 r3 = MASK_OP_RRR2_S3(ctx->opcode); 7163 r4 = MASK_OP_RRR2_D(ctx->opcode); 7164 switch (op2) { 7165 case OPC2_32_RRR2_MADD_32: 7166 gen_madd32_d(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], 7167 cpu_gpr_d[r2]); 7168 break; 7169 case OPC2_32_RRR2_MADD_64: 7170 CHECK_REG_PAIR(r4); 7171 CHECK_REG_PAIR(r3); 7172 gen_madd64_d(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1], 7173 cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r2]); 7174 break; 7175 case OPC2_32_RRR2_MADDS_32: 7176 gen_helper_madd32_ssov(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1], 7177 cpu_gpr_d[r3], cpu_gpr_d[r2]); 7178 break; 7179 case OPC2_32_RRR2_MADDS_64: 7180 CHECK_REG_PAIR(r4); 7181 CHECK_REG_PAIR(r3); 7182 gen_madds_64(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1], 7183 cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r2]); 7184 break; 7185 case OPC2_32_RRR2_MADD_U_64: 7186 CHECK_REG_PAIR(r4); 7187 CHECK_REG_PAIR(r3); 7188 gen_maddu64_d(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1], 7189 cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r2]); 7190 break; 7191 case OPC2_32_RRR2_MADDS_U_32: 7192 gen_helper_madd32_suov(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1], 7193 cpu_gpr_d[r3], cpu_gpr_d[r2]); 7194 break; 7195 case OPC2_32_RRR2_MADDS_U_64: 7196 CHECK_REG_PAIR(r4); 7197 CHECK_REG_PAIR(r3); 7198 gen_maddsu_64(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1], 7199 cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r2]); 7200 break; 7201 default: 7202 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 7203 } 7204 } 7205 7206 static void decode_rrr2_msub(DisasContext *ctx) 7207 { 7208 uint32_t op2; 7209 uint32_t r1, r2, r3, r4; 7210 7211 op2 = MASK_OP_RRR2_OP2(ctx->opcode); 7212 r1 = MASK_OP_RRR2_S1(ctx->opcode); 7213 r2 = MASK_OP_RRR2_S2(ctx->opcode); 7214 r3 = MASK_OP_RRR2_S3(ctx->opcode); 7215 r4 = MASK_OP_RRR2_D(ctx->opcode); 7216 7217 switch (op2) { 7218 case OPC2_32_RRR2_MSUB_32: 7219 gen_msub32_d(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], 7220 cpu_gpr_d[r2]); 7221 break; 7222 case OPC2_32_RRR2_MSUB_64: 7223 CHECK_REG_PAIR(r4); 7224 CHECK_REG_PAIR(r3); 7225 gen_msub64_d(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1], 7226 cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r2]); 7227 break; 7228 case OPC2_32_RRR2_MSUBS_32: 7229 gen_helper_msub32_ssov(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1], 7230 cpu_gpr_d[r3], cpu_gpr_d[r2]); 7231 break; 7232 case OPC2_32_RRR2_MSUBS_64: 7233 CHECK_REG_PAIR(r4); 7234 CHECK_REG_PAIR(r3); 7235 gen_msubs_64(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1], 7236 cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r2]); 7237 break; 7238 case OPC2_32_RRR2_MSUB_U_64: 7239 gen_msubu64_d(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1], 7240 cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r2]); 7241 break; 7242 case OPC2_32_RRR2_MSUBS_U_32: 7243 gen_helper_msub32_suov(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1], 7244 cpu_gpr_d[r3], cpu_gpr_d[r2]); 7245 break; 7246 case OPC2_32_RRR2_MSUBS_U_64: 7247 CHECK_REG_PAIR(r4); 7248 CHECK_REG_PAIR(r3); 7249 gen_msubsu_64(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r1], 7250 cpu_gpr_d[r3], cpu_gpr_d[r3+1], cpu_gpr_d[r2]); 7251 break; 7252 default: 7253 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 7254 } 7255 } 7256 7257 /* RRR1 format */ 7258 static void decode_rrr1_madd(DisasContext *ctx) 7259 { 7260 uint32_t op2; 7261 uint32_t r1, r2, r3, r4, n; 7262 7263 op2 = MASK_OP_RRR1_OP2(ctx->opcode); 7264 r1 = MASK_OP_RRR1_S1(ctx->opcode); 7265 r2 = MASK_OP_RRR1_S2(ctx->opcode); 7266 r3 = MASK_OP_RRR1_S3(ctx->opcode); 7267 r4 = MASK_OP_RRR1_D(ctx->opcode); 7268 n = MASK_OP_RRR1_N(ctx->opcode); 7269 7270 switch (op2) { 7271 case OPC2_32_RRR1_MADD_H_LL: 7272 CHECK_REG_PAIR(r4); 7273 CHECK_REG_PAIR(r3); 7274 gen_madd_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7275 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LL); 7276 break; 7277 case OPC2_32_RRR1_MADD_H_LU: 7278 CHECK_REG_PAIR(r4); 7279 CHECK_REG_PAIR(r3); 7280 gen_madd_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7281 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LU); 7282 break; 7283 case OPC2_32_RRR1_MADD_H_UL: 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_UL); 7288 break; 7289 case OPC2_32_RRR1_MADD_H_UU: 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_UU); 7294 break; 7295 case OPC2_32_RRR1_MADDS_H_LL: 7296 CHECK_REG_PAIR(r4); 7297 CHECK_REG_PAIR(r3); 7298 gen_madds_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_LL); 7300 break; 7301 case OPC2_32_RRR1_MADDS_H_LU: 7302 CHECK_REG_PAIR(r4); 7303 CHECK_REG_PAIR(r3); 7304 gen_madds_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_LU); 7306 break; 7307 case OPC2_32_RRR1_MADDS_H_UL: 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_UL); 7312 break; 7313 case OPC2_32_RRR1_MADDS_H_UU: 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_UU); 7318 break; 7319 case OPC2_32_RRR1_MADDM_H_LL: 7320 CHECK_REG_PAIR(r4); 7321 CHECK_REG_PAIR(r3); 7322 gen_maddm_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_LL); 7324 break; 7325 case OPC2_32_RRR1_MADDM_H_LU: 7326 CHECK_REG_PAIR(r4); 7327 CHECK_REG_PAIR(r3); 7328 gen_maddm_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_LU); 7330 break; 7331 case OPC2_32_RRR1_MADDM_H_UL: 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_UL); 7336 break; 7337 case OPC2_32_RRR1_MADDM_H_UU: 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_UU); 7342 break; 7343 case OPC2_32_RRR1_MADDMS_H_LL: 7344 CHECK_REG_PAIR(r4); 7345 CHECK_REG_PAIR(r3); 7346 gen_maddms_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_LL); 7348 break; 7349 case OPC2_32_RRR1_MADDMS_H_LU: 7350 CHECK_REG_PAIR(r4); 7351 CHECK_REG_PAIR(r3); 7352 gen_maddms_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_LU); 7354 break; 7355 case OPC2_32_RRR1_MADDMS_H_UL: 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_UL); 7360 break; 7361 case OPC2_32_RRR1_MADDMS_H_UU: 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_UU); 7366 break; 7367 case OPC2_32_RRR1_MADDR_H_LL: 7368 gen_maddr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7369 cpu_gpr_d[r2], n, MODE_LL); 7370 break; 7371 case OPC2_32_RRR1_MADDR_H_LU: 7372 gen_maddr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7373 cpu_gpr_d[r2], n, MODE_LU); 7374 break; 7375 case OPC2_32_RRR1_MADDR_H_UL: 7376 gen_maddr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7377 cpu_gpr_d[r2], n, MODE_UL); 7378 break; 7379 case OPC2_32_RRR1_MADDR_H_UU: 7380 gen_maddr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7381 cpu_gpr_d[r2], n, MODE_UU); 7382 break; 7383 case OPC2_32_RRR1_MADDRS_H_LL: 7384 gen_maddr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7385 cpu_gpr_d[r2], n, MODE_LL); 7386 break; 7387 case OPC2_32_RRR1_MADDRS_H_LU: 7388 gen_maddr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7389 cpu_gpr_d[r2], n, MODE_LU); 7390 break; 7391 case OPC2_32_RRR1_MADDRS_H_UL: 7392 gen_maddr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7393 cpu_gpr_d[r2], n, MODE_UL); 7394 break; 7395 case OPC2_32_RRR1_MADDRS_H_UU: 7396 gen_maddr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7397 cpu_gpr_d[r2], n, MODE_UU); 7398 break; 7399 default: 7400 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 7401 } 7402 } 7403 7404 static void decode_rrr1_maddq_h(DisasContext *ctx) 7405 { 7406 uint32_t op2; 7407 uint32_t r1, r2, r3, r4, n; 7408 TCGv temp, temp2; 7409 7410 op2 = MASK_OP_RRR1_OP2(ctx->opcode); 7411 r1 = MASK_OP_RRR1_S1(ctx->opcode); 7412 r2 = MASK_OP_RRR1_S2(ctx->opcode); 7413 r3 = MASK_OP_RRR1_S3(ctx->opcode); 7414 r4 = MASK_OP_RRR1_D(ctx->opcode); 7415 n = MASK_OP_RRR1_N(ctx->opcode); 7416 7417 temp = tcg_const_i32(n); 7418 temp2 = tcg_temp_new(); 7419 7420 switch (op2) { 7421 case OPC2_32_RRR1_MADD_Q_32: 7422 gen_madd32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7423 cpu_gpr_d[r2], n, 32); 7424 break; 7425 case OPC2_32_RRR1_MADD_Q_64: 7426 CHECK_REG_PAIR(r4); 7427 CHECK_REG_PAIR(r3); 7428 gen_madd64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7429 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 7430 n); 7431 break; 7432 case OPC2_32_RRR1_MADD_Q_32_L: 7433 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]); 7434 gen_madd32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7435 temp, n, 16); 7436 break; 7437 case OPC2_32_RRR1_MADD_Q_64_L: 7438 CHECK_REG_PAIR(r4); 7439 CHECK_REG_PAIR(r3); 7440 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]); 7441 gen_madd64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7442 cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp, 7443 n); 7444 break; 7445 case OPC2_32_RRR1_MADD_Q_32_U: 7446 tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16); 7447 gen_madd32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7448 temp, n, 16); 7449 break; 7450 case OPC2_32_RRR1_MADD_Q_64_U: 7451 CHECK_REG_PAIR(r4); 7452 CHECK_REG_PAIR(r3); 7453 tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16); 7454 gen_madd64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7455 cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp, 7456 n); 7457 break; 7458 case OPC2_32_RRR1_MADD_Q_32_LL: 7459 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]); 7460 tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]); 7461 gen_m16add32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n); 7462 break; 7463 case OPC2_32_RRR1_MADD_Q_64_LL: 7464 CHECK_REG_PAIR(r4); 7465 CHECK_REG_PAIR(r3); 7466 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]); 7467 tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]); 7468 gen_m16add64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7469 cpu_gpr_d[r3+1], temp, temp2, n); 7470 break; 7471 case OPC2_32_RRR1_MADD_Q_32_UU: 7472 tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16); 7473 tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16); 7474 gen_m16add32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n); 7475 break; 7476 case OPC2_32_RRR1_MADD_Q_64_UU: 7477 CHECK_REG_PAIR(r4); 7478 CHECK_REG_PAIR(r3); 7479 tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16); 7480 tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16); 7481 gen_m16add64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7482 cpu_gpr_d[r3+1], temp, temp2, n); 7483 break; 7484 case OPC2_32_RRR1_MADDS_Q_32: 7485 gen_madds32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7486 cpu_gpr_d[r2], n, 32); 7487 break; 7488 case OPC2_32_RRR1_MADDS_Q_64: 7489 CHECK_REG_PAIR(r4); 7490 CHECK_REG_PAIR(r3); 7491 gen_madds64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7492 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 7493 n); 7494 break; 7495 case OPC2_32_RRR1_MADDS_Q_32_L: 7496 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]); 7497 gen_madds32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7498 temp, n, 16); 7499 break; 7500 case OPC2_32_RRR1_MADDS_Q_64_L: 7501 CHECK_REG_PAIR(r4); 7502 CHECK_REG_PAIR(r3); 7503 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]); 7504 gen_madds64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7505 cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp, 7506 n); 7507 break; 7508 case OPC2_32_RRR1_MADDS_Q_32_U: 7509 tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16); 7510 gen_madds32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7511 temp, n, 16); 7512 break; 7513 case OPC2_32_RRR1_MADDS_Q_64_U: 7514 CHECK_REG_PAIR(r4); 7515 CHECK_REG_PAIR(r3); 7516 tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16); 7517 gen_madds64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7518 cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp, 7519 n); 7520 break; 7521 case OPC2_32_RRR1_MADDS_Q_32_LL: 7522 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]); 7523 tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]); 7524 gen_m16adds32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n); 7525 break; 7526 case OPC2_32_RRR1_MADDS_Q_64_LL: 7527 CHECK_REG_PAIR(r4); 7528 CHECK_REG_PAIR(r3); 7529 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]); 7530 tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]); 7531 gen_m16adds64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7532 cpu_gpr_d[r3+1], temp, temp2, n); 7533 break; 7534 case OPC2_32_RRR1_MADDS_Q_32_UU: 7535 tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16); 7536 tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16); 7537 gen_m16adds32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n); 7538 break; 7539 case OPC2_32_RRR1_MADDS_Q_64_UU: 7540 CHECK_REG_PAIR(r4); 7541 CHECK_REG_PAIR(r3); 7542 tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16); 7543 tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16); 7544 gen_m16adds64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7545 cpu_gpr_d[r3+1], temp, temp2, n); 7546 break; 7547 case OPC2_32_RRR1_MADDR_H_64_UL: 7548 CHECK_REG_PAIR(r3); 7549 gen_maddr64_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r3+1], 7550 cpu_gpr_d[r1], cpu_gpr_d[r2], n, 2); 7551 break; 7552 case OPC2_32_RRR1_MADDRS_H_64_UL: 7553 CHECK_REG_PAIR(r3); 7554 gen_maddr64s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r3+1], 7555 cpu_gpr_d[r1], cpu_gpr_d[r2], n, 2); 7556 break; 7557 case OPC2_32_RRR1_MADDR_Q_32_LL: 7558 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]); 7559 tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]); 7560 gen_maddr_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n); 7561 break; 7562 case OPC2_32_RRR1_MADDR_Q_32_UU: 7563 tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16); 7564 tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16); 7565 gen_maddr_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n); 7566 break; 7567 case OPC2_32_RRR1_MADDRS_Q_32_LL: 7568 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]); 7569 tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]); 7570 gen_maddrs_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n); 7571 break; 7572 case OPC2_32_RRR1_MADDRS_Q_32_UU: 7573 tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16); 7574 tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16); 7575 gen_maddrs_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n); 7576 break; 7577 default: 7578 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 7579 } 7580 tcg_temp_free(temp); 7581 tcg_temp_free(temp2); 7582 } 7583 7584 static void decode_rrr1_maddsu_h(DisasContext *ctx) 7585 { 7586 uint32_t op2; 7587 uint32_t r1, r2, r3, r4, n; 7588 7589 op2 = MASK_OP_RRR1_OP2(ctx->opcode); 7590 r1 = MASK_OP_RRR1_S1(ctx->opcode); 7591 r2 = MASK_OP_RRR1_S2(ctx->opcode); 7592 r3 = MASK_OP_RRR1_S3(ctx->opcode); 7593 r4 = MASK_OP_RRR1_D(ctx->opcode); 7594 n = MASK_OP_RRR1_N(ctx->opcode); 7595 7596 switch (op2) { 7597 case OPC2_32_RRR1_MADDSU_H_32_LL: 7598 CHECK_REG_PAIR(r4); 7599 CHECK_REG_PAIR(r3); 7600 gen_maddsu_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7601 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LL); 7602 break; 7603 case OPC2_32_RRR1_MADDSU_H_32_LU: 7604 CHECK_REG_PAIR(r4); 7605 CHECK_REG_PAIR(r3); 7606 gen_maddsu_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7607 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LU); 7608 break; 7609 case OPC2_32_RRR1_MADDSU_H_32_UL: 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_UL); 7614 break; 7615 case OPC2_32_RRR1_MADDSU_H_32_UU: 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_UU); 7620 break; 7621 case OPC2_32_RRR1_MADDSUS_H_32_LL: 7622 CHECK_REG_PAIR(r4); 7623 CHECK_REG_PAIR(r3); 7624 gen_maddsus_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], 7626 n, MODE_LL); 7627 break; 7628 case OPC2_32_RRR1_MADDSUS_H_32_LU: 7629 CHECK_REG_PAIR(r4); 7630 CHECK_REG_PAIR(r3); 7631 gen_maddsus_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7632 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 7633 n, MODE_LU); 7634 break; 7635 case OPC2_32_RRR1_MADDSUS_H_32_UL: 7636 CHECK_REG_PAIR(r4); 7637 CHECK_REG_PAIR(r3); 7638 gen_maddsus_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7639 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 7640 n, MODE_UL); 7641 break; 7642 case OPC2_32_RRR1_MADDSUS_H_32_UU: 7643 CHECK_REG_PAIR(r4); 7644 CHECK_REG_PAIR(r3); 7645 gen_maddsus_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7646 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 7647 n, MODE_UU); 7648 break; 7649 case OPC2_32_RRR1_MADDSUM_H_64_LL: 7650 CHECK_REG_PAIR(r4); 7651 CHECK_REG_PAIR(r3); 7652 gen_maddsum_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7653 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 7654 n, MODE_LL); 7655 break; 7656 case OPC2_32_RRR1_MADDSUM_H_64_LU: 7657 CHECK_REG_PAIR(r4); 7658 CHECK_REG_PAIR(r3); 7659 gen_maddsum_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7660 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 7661 n, MODE_LU); 7662 break; 7663 case OPC2_32_RRR1_MADDSUM_H_64_UL: 7664 CHECK_REG_PAIR(r4); 7665 CHECK_REG_PAIR(r3); 7666 gen_maddsum_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7667 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 7668 n, MODE_UL); 7669 break; 7670 case OPC2_32_RRR1_MADDSUM_H_64_UU: 7671 CHECK_REG_PAIR(r4); 7672 CHECK_REG_PAIR(r3); 7673 gen_maddsum_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7674 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 7675 n, MODE_UU); 7676 break; 7677 case OPC2_32_RRR1_MADDSUMS_H_64_LL: 7678 CHECK_REG_PAIR(r4); 7679 CHECK_REG_PAIR(r3); 7680 gen_maddsums_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7681 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 7682 n, MODE_LL); 7683 break; 7684 case OPC2_32_RRR1_MADDSUMS_H_64_LU: 7685 CHECK_REG_PAIR(r4); 7686 CHECK_REG_PAIR(r3); 7687 gen_maddsums_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7688 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 7689 n, MODE_LU); 7690 break; 7691 case OPC2_32_RRR1_MADDSUMS_H_64_UL: 7692 CHECK_REG_PAIR(r4); 7693 CHECK_REG_PAIR(r3); 7694 gen_maddsums_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7695 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 7696 n, MODE_UL); 7697 break; 7698 case OPC2_32_RRR1_MADDSUMS_H_64_UU: 7699 CHECK_REG_PAIR(r4); 7700 CHECK_REG_PAIR(r3); 7701 gen_maddsums_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7702 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 7703 n, MODE_UU); 7704 break; 7705 case OPC2_32_RRR1_MADDSUR_H_16_LL: 7706 gen_maddsur32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7707 cpu_gpr_d[r2], n, MODE_LL); 7708 break; 7709 case OPC2_32_RRR1_MADDSUR_H_16_LU: 7710 gen_maddsur32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7711 cpu_gpr_d[r2], n, MODE_LU); 7712 break; 7713 case OPC2_32_RRR1_MADDSUR_H_16_UL: 7714 gen_maddsur32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7715 cpu_gpr_d[r2], n, MODE_UL); 7716 break; 7717 case OPC2_32_RRR1_MADDSUR_H_16_UU: 7718 gen_maddsur32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7719 cpu_gpr_d[r2], n, MODE_UU); 7720 break; 7721 case OPC2_32_RRR1_MADDSURS_H_16_LL: 7722 gen_maddsur32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7723 cpu_gpr_d[r2], n, MODE_LL); 7724 break; 7725 case OPC2_32_RRR1_MADDSURS_H_16_LU: 7726 gen_maddsur32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7727 cpu_gpr_d[r2], n, MODE_LU); 7728 break; 7729 case OPC2_32_RRR1_MADDSURS_H_16_UL: 7730 gen_maddsur32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7731 cpu_gpr_d[r2], n, MODE_UL); 7732 break; 7733 case OPC2_32_RRR1_MADDSURS_H_16_UU: 7734 gen_maddsur32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7735 cpu_gpr_d[r2], n, MODE_UU); 7736 break; 7737 default: 7738 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 7739 } 7740 } 7741 7742 static void decode_rrr1_msub(DisasContext *ctx) 7743 { 7744 uint32_t op2; 7745 uint32_t r1, r2, r3, r4, n; 7746 7747 op2 = MASK_OP_RRR1_OP2(ctx->opcode); 7748 r1 = MASK_OP_RRR1_S1(ctx->opcode); 7749 r2 = MASK_OP_RRR1_S2(ctx->opcode); 7750 r3 = MASK_OP_RRR1_S3(ctx->opcode); 7751 r4 = MASK_OP_RRR1_D(ctx->opcode); 7752 n = MASK_OP_RRR1_N(ctx->opcode); 7753 7754 switch (op2) { 7755 case OPC2_32_RRR1_MSUB_H_LL: 7756 CHECK_REG_PAIR(r4); 7757 CHECK_REG_PAIR(r3); 7758 gen_msub_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7759 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LL); 7760 break; 7761 case OPC2_32_RRR1_MSUB_H_LU: 7762 CHECK_REG_PAIR(r4); 7763 CHECK_REG_PAIR(r3); 7764 gen_msub_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7765 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LU); 7766 break; 7767 case OPC2_32_RRR1_MSUB_H_UL: 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_UL); 7772 break; 7773 case OPC2_32_RRR1_MSUB_H_UU: 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_UU); 7778 break; 7779 case OPC2_32_RRR1_MSUBS_H_LL: 7780 CHECK_REG_PAIR(r4); 7781 CHECK_REG_PAIR(r3); 7782 gen_msubs_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_LL); 7784 break; 7785 case OPC2_32_RRR1_MSUBS_H_LU: 7786 CHECK_REG_PAIR(r4); 7787 CHECK_REG_PAIR(r3); 7788 gen_msubs_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_LU); 7790 break; 7791 case OPC2_32_RRR1_MSUBS_H_UL: 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_UL); 7796 break; 7797 case OPC2_32_RRR1_MSUBS_H_UU: 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_UU); 7802 break; 7803 case OPC2_32_RRR1_MSUBM_H_LL: 7804 CHECK_REG_PAIR(r4); 7805 CHECK_REG_PAIR(r3); 7806 gen_msubm_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_LL); 7808 break; 7809 case OPC2_32_RRR1_MSUBM_H_LU: 7810 CHECK_REG_PAIR(r4); 7811 CHECK_REG_PAIR(r3); 7812 gen_msubm_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_LU); 7814 break; 7815 case OPC2_32_RRR1_MSUBM_H_UL: 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_UL); 7820 break; 7821 case OPC2_32_RRR1_MSUBM_H_UU: 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_UU); 7826 break; 7827 case OPC2_32_RRR1_MSUBMS_H_LL: 7828 CHECK_REG_PAIR(r4); 7829 CHECK_REG_PAIR(r3); 7830 gen_msubms_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_LL); 7832 break; 7833 case OPC2_32_RRR1_MSUBMS_H_LU: 7834 CHECK_REG_PAIR(r4); 7835 CHECK_REG_PAIR(r3); 7836 gen_msubms_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_LU); 7838 break; 7839 case OPC2_32_RRR1_MSUBMS_H_UL: 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_UL); 7844 break; 7845 case OPC2_32_RRR1_MSUBMS_H_UU: 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_UU); 7850 break; 7851 case OPC2_32_RRR1_MSUBR_H_LL: 7852 gen_msubr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7853 cpu_gpr_d[r2], n, MODE_LL); 7854 break; 7855 case OPC2_32_RRR1_MSUBR_H_LU: 7856 gen_msubr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7857 cpu_gpr_d[r2], n, MODE_LU); 7858 break; 7859 case OPC2_32_RRR1_MSUBR_H_UL: 7860 gen_msubr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7861 cpu_gpr_d[r2], n, MODE_UL); 7862 break; 7863 case OPC2_32_RRR1_MSUBR_H_UU: 7864 gen_msubr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7865 cpu_gpr_d[r2], n, MODE_UU); 7866 break; 7867 case OPC2_32_RRR1_MSUBRS_H_LL: 7868 gen_msubr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7869 cpu_gpr_d[r2], n, MODE_LL); 7870 break; 7871 case OPC2_32_RRR1_MSUBRS_H_LU: 7872 gen_msubr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7873 cpu_gpr_d[r2], n, MODE_LU); 7874 break; 7875 case OPC2_32_RRR1_MSUBRS_H_UL: 7876 gen_msubr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7877 cpu_gpr_d[r2], n, MODE_UL); 7878 break; 7879 case OPC2_32_RRR1_MSUBRS_H_UU: 7880 gen_msubr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7881 cpu_gpr_d[r2], n, MODE_UU); 7882 break; 7883 default: 7884 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 7885 } 7886 } 7887 7888 static void decode_rrr1_msubq_h(DisasContext *ctx) 7889 { 7890 uint32_t op2; 7891 uint32_t r1, r2, r3, r4, n; 7892 TCGv temp, temp2; 7893 7894 op2 = MASK_OP_RRR1_OP2(ctx->opcode); 7895 r1 = MASK_OP_RRR1_S1(ctx->opcode); 7896 r2 = MASK_OP_RRR1_S2(ctx->opcode); 7897 r3 = MASK_OP_RRR1_S3(ctx->opcode); 7898 r4 = MASK_OP_RRR1_D(ctx->opcode); 7899 n = MASK_OP_RRR1_N(ctx->opcode); 7900 7901 temp = tcg_const_i32(n); 7902 temp2 = tcg_temp_new(); 7903 7904 switch (op2) { 7905 case OPC2_32_RRR1_MSUB_Q_32: 7906 gen_msub32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7907 cpu_gpr_d[r2], n, 32); 7908 break; 7909 case OPC2_32_RRR1_MSUB_Q_64: 7910 CHECK_REG_PAIR(r4); 7911 CHECK_REG_PAIR(r3); 7912 gen_msub64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7913 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 7914 n); 7915 break; 7916 case OPC2_32_RRR1_MSUB_Q_32_L: 7917 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]); 7918 gen_msub32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7919 temp, n, 16); 7920 break; 7921 case OPC2_32_RRR1_MSUB_Q_64_L: 7922 CHECK_REG_PAIR(r4); 7923 CHECK_REG_PAIR(r3); 7924 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]); 7925 gen_msub64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7926 cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp, 7927 n); 7928 break; 7929 case OPC2_32_RRR1_MSUB_Q_32_U: 7930 tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16); 7931 gen_msub32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7932 temp, n, 16); 7933 break; 7934 case OPC2_32_RRR1_MSUB_Q_64_U: 7935 CHECK_REG_PAIR(r4); 7936 CHECK_REG_PAIR(r3); 7937 tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16); 7938 gen_msub64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7939 cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp, 7940 n); 7941 break; 7942 case OPC2_32_RRR1_MSUB_Q_32_LL: 7943 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]); 7944 tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]); 7945 gen_m16sub32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n); 7946 break; 7947 case OPC2_32_RRR1_MSUB_Q_64_LL: 7948 CHECK_REG_PAIR(r4); 7949 CHECK_REG_PAIR(r3); 7950 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]); 7951 tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]); 7952 gen_m16sub64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7953 cpu_gpr_d[r3+1], temp, temp2, n); 7954 break; 7955 case OPC2_32_RRR1_MSUB_Q_32_UU: 7956 tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16); 7957 tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16); 7958 gen_m16sub32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n); 7959 break; 7960 case OPC2_32_RRR1_MSUB_Q_64_UU: 7961 CHECK_REG_PAIR(r4); 7962 CHECK_REG_PAIR(r3); 7963 tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16); 7964 tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16); 7965 gen_m16sub64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7966 cpu_gpr_d[r3+1], temp, temp2, n); 7967 break; 7968 case OPC2_32_RRR1_MSUBS_Q_32: 7969 gen_msubs32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7970 cpu_gpr_d[r2], n, 32); 7971 break; 7972 case OPC2_32_RRR1_MSUBS_Q_64: 7973 CHECK_REG_PAIR(r4); 7974 CHECK_REG_PAIR(r3); 7975 gen_msubs64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7976 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 7977 n); 7978 break; 7979 case OPC2_32_RRR1_MSUBS_Q_32_L: 7980 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]); 7981 gen_msubs32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7982 temp, n, 16); 7983 break; 7984 case OPC2_32_RRR1_MSUBS_Q_64_L: 7985 CHECK_REG_PAIR(r4); 7986 CHECK_REG_PAIR(r3); 7987 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r2]); 7988 gen_msubs64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 7989 cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp, 7990 n); 7991 break; 7992 case OPC2_32_RRR1_MSUBS_Q_32_U: 7993 tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16); 7994 gen_msubs32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 7995 temp, n, 16); 7996 break; 7997 case OPC2_32_RRR1_MSUBS_Q_64_U: 7998 CHECK_REG_PAIR(r4); 7999 CHECK_REG_PAIR(r3); 8000 tcg_gen_sari_tl(temp, cpu_gpr_d[r2], 16); 8001 gen_msubs64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 8002 cpu_gpr_d[r3+1], cpu_gpr_d[r1], temp, 8003 n); 8004 break; 8005 case OPC2_32_RRR1_MSUBS_Q_32_LL: 8006 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]); 8007 tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]); 8008 gen_m16subs32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n); 8009 break; 8010 case OPC2_32_RRR1_MSUBS_Q_64_LL: 8011 CHECK_REG_PAIR(r4); 8012 CHECK_REG_PAIR(r3); 8013 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]); 8014 tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]); 8015 gen_m16subs64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 8016 cpu_gpr_d[r3+1], temp, temp2, n); 8017 break; 8018 case OPC2_32_RRR1_MSUBS_Q_32_UU: 8019 tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16); 8020 tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16); 8021 gen_m16subs32_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n); 8022 break; 8023 case OPC2_32_RRR1_MSUBS_Q_64_UU: 8024 CHECK_REG_PAIR(r4); 8025 CHECK_REG_PAIR(r3); 8026 tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16); 8027 tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16); 8028 gen_m16subs64_q(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 8029 cpu_gpr_d[r3+1], temp, temp2, n); 8030 break; 8031 case OPC2_32_RRR1_MSUBR_H_64_UL: 8032 CHECK_REG_PAIR(r3); 8033 gen_msubr64_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r3+1], 8034 cpu_gpr_d[r1], cpu_gpr_d[r2], n, 2); 8035 break; 8036 case OPC2_32_RRR1_MSUBRS_H_64_UL: 8037 CHECK_REG_PAIR(r3); 8038 gen_msubr64s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r3+1], 8039 cpu_gpr_d[r1], cpu_gpr_d[r2], n, 2); 8040 break; 8041 case OPC2_32_RRR1_MSUBR_Q_32_LL: 8042 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]); 8043 tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]); 8044 gen_msubr_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n); 8045 break; 8046 case OPC2_32_RRR1_MSUBR_Q_32_UU: 8047 tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16); 8048 tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16); 8049 gen_msubr_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n); 8050 break; 8051 case OPC2_32_RRR1_MSUBRS_Q_32_LL: 8052 tcg_gen_ext16s_tl(temp, cpu_gpr_d[r1]); 8053 tcg_gen_ext16s_tl(temp2, cpu_gpr_d[r2]); 8054 gen_msubrs_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n); 8055 break; 8056 case OPC2_32_RRR1_MSUBRS_Q_32_UU: 8057 tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 16); 8058 tcg_gen_sari_tl(temp2, cpu_gpr_d[r2], 16); 8059 gen_msubrs_q(cpu_gpr_d[r4], cpu_gpr_d[r3], temp, temp2, n); 8060 break; 8061 default: 8062 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 8063 } 8064 tcg_temp_free(temp); 8065 tcg_temp_free(temp2); 8066 } 8067 8068 static void decode_rrr1_msubad_h(DisasContext *ctx) 8069 { 8070 uint32_t op2; 8071 uint32_t r1, r2, r3, r4, n; 8072 8073 op2 = MASK_OP_RRR1_OP2(ctx->opcode); 8074 r1 = MASK_OP_RRR1_S1(ctx->opcode); 8075 r2 = MASK_OP_RRR1_S2(ctx->opcode); 8076 r3 = MASK_OP_RRR1_S3(ctx->opcode); 8077 r4 = MASK_OP_RRR1_D(ctx->opcode); 8078 n = MASK_OP_RRR1_N(ctx->opcode); 8079 8080 switch (op2) { 8081 case OPC2_32_RRR1_MSUBAD_H_32_LL: 8082 CHECK_REG_PAIR(r4); 8083 CHECK_REG_PAIR(r3); 8084 gen_msubad_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 8085 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LL); 8086 break; 8087 case OPC2_32_RRR1_MSUBAD_H_32_LU: 8088 CHECK_REG_PAIR(r4); 8089 CHECK_REG_PAIR(r3); 8090 gen_msubad_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 8091 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], n, MODE_LU); 8092 break; 8093 case OPC2_32_RRR1_MSUBAD_H_32_UL: 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_UL); 8098 break; 8099 case OPC2_32_RRR1_MSUBAD_H_32_UU: 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_UU); 8104 break; 8105 case OPC2_32_RRR1_MSUBADS_H_32_LL: 8106 CHECK_REG_PAIR(r4); 8107 CHECK_REG_PAIR(r3); 8108 gen_msubads_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], 8110 n, MODE_LL); 8111 break; 8112 case OPC2_32_RRR1_MSUBADS_H_32_LU: 8113 CHECK_REG_PAIR(r4); 8114 CHECK_REG_PAIR(r3); 8115 gen_msubads_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 8116 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 8117 n, MODE_LU); 8118 break; 8119 case OPC2_32_RRR1_MSUBADS_H_32_UL: 8120 CHECK_REG_PAIR(r4); 8121 CHECK_REG_PAIR(r3); 8122 gen_msubads_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 8123 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 8124 n, MODE_UL); 8125 break; 8126 case OPC2_32_RRR1_MSUBADS_H_32_UU: 8127 CHECK_REG_PAIR(r4); 8128 CHECK_REG_PAIR(r3); 8129 gen_msubads_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 8130 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 8131 n, MODE_UU); 8132 break; 8133 case OPC2_32_RRR1_MSUBADM_H_64_LL: 8134 CHECK_REG_PAIR(r4); 8135 CHECK_REG_PAIR(r3); 8136 gen_msubadm_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 8137 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 8138 n, MODE_LL); 8139 break; 8140 case OPC2_32_RRR1_MSUBADM_H_64_LU: 8141 CHECK_REG_PAIR(r4); 8142 CHECK_REG_PAIR(r3); 8143 gen_msubadm_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 8144 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 8145 n, MODE_LU); 8146 break; 8147 case OPC2_32_RRR1_MSUBADM_H_64_UL: 8148 CHECK_REG_PAIR(r4); 8149 CHECK_REG_PAIR(r3); 8150 gen_msubadm_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 8151 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 8152 n, MODE_UL); 8153 break; 8154 case OPC2_32_RRR1_MSUBADM_H_64_UU: 8155 CHECK_REG_PAIR(r4); 8156 CHECK_REG_PAIR(r3); 8157 gen_msubadm_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 8158 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 8159 n, MODE_UU); 8160 break; 8161 case OPC2_32_RRR1_MSUBADMS_H_64_LL: 8162 CHECK_REG_PAIR(r4); 8163 CHECK_REG_PAIR(r3); 8164 gen_msubadms_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 8165 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 8166 n, MODE_LL); 8167 break; 8168 case OPC2_32_RRR1_MSUBADMS_H_64_LU: 8169 CHECK_REG_PAIR(r4); 8170 CHECK_REG_PAIR(r3); 8171 gen_msubadms_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 8172 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 8173 n, MODE_LU); 8174 break; 8175 case OPC2_32_RRR1_MSUBADMS_H_64_UL: 8176 CHECK_REG_PAIR(r4); 8177 CHECK_REG_PAIR(r3); 8178 gen_msubadms_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 8179 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 8180 n, MODE_UL); 8181 break; 8182 case OPC2_32_RRR1_MSUBADMS_H_64_UU: 8183 CHECK_REG_PAIR(r4); 8184 CHECK_REG_PAIR(r3); 8185 gen_msubadms_h(cpu_gpr_d[r4], cpu_gpr_d[r4+1], cpu_gpr_d[r3], 8186 cpu_gpr_d[r3+1], cpu_gpr_d[r1], cpu_gpr_d[r2], 8187 n, MODE_UU); 8188 break; 8189 case OPC2_32_RRR1_MSUBADR_H_16_LL: 8190 gen_msubadr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 8191 cpu_gpr_d[r2], n, MODE_LL); 8192 break; 8193 case OPC2_32_RRR1_MSUBADR_H_16_LU: 8194 gen_msubadr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 8195 cpu_gpr_d[r2], n, MODE_LU); 8196 break; 8197 case OPC2_32_RRR1_MSUBADR_H_16_UL: 8198 gen_msubadr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 8199 cpu_gpr_d[r2], n, MODE_UL); 8200 break; 8201 case OPC2_32_RRR1_MSUBADR_H_16_UU: 8202 gen_msubadr32_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 8203 cpu_gpr_d[r2], n, MODE_UU); 8204 break; 8205 case OPC2_32_RRR1_MSUBADRS_H_16_LL: 8206 gen_msubadr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 8207 cpu_gpr_d[r2], n, MODE_LL); 8208 break; 8209 case OPC2_32_RRR1_MSUBADRS_H_16_LU: 8210 gen_msubadr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 8211 cpu_gpr_d[r2], n, MODE_LU); 8212 break; 8213 case OPC2_32_RRR1_MSUBADRS_H_16_UL: 8214 gen_msubadr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 8215 cpu_gpr_d[r2], n, MODE_UL); 8216 break; 8217 case OPC2_32_RRR1_MSUBADRS_H_16_UU: 8218 gen_msubadr32s_h(cpu_gpr_d[r4], cpu_gpr_d[r3], cpu_gpr_d[r1], 8219 cpu_gpr_d[r2], n, MODE_UU); 8220 break; 8221 default: 8222 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 8223 } 8224 } 8225 8226 /* RRRR format */ 8227 static void decode_rrrr_extract_insert(DisasContext *ctx) 8228 { 8229 uint32_t op2; 8230 int r1, r2, r3, r4; 8231 TCGv tmp_width, tmp_pos; 8232 8233 r1 = MASK_OP_RRRR_S1(ctx->opcode); 8234 r2 = MASK_OP_RRRR_S2(ctx->opcode); 8235 r3 = MASK_OP_RRRR_S3(ctx->opcode); 8236 r4 = MASK_OP_RRRR_D(ctx->opcode); 8237 op2 = MASK_OP_RRRR_OP2(ctx->opcode); 8238 8239 tmp_pos = tcg_temp_new(); 8240 tmp_width = tcg_temp_new(); 8241 8242 switch (op2) { 8243 case OPC2_32_RRRR_DEXTR: 8244 tcg_gen_andi_tl(tmp_pos, cpu_gpr_d[r3], 0x1f); 8245 if (r1 == r2) { 8246 tcg_gen_rotl_tl(cpu_gpr_d[r4], cpu_gpr_d[r1], tmp_pos); 8247 } else { 8248 tcg_gen_shl_tl(tmp_width, cpu_gpr_d[r1], tmp_pos); 8249 tcg_gen_subfi_tl(tmp_pos, 32, tmp_pos); 8250 tcg_gen_shr_tl(tmp_pos, cpu_gpr_d[r2], tmp_pos); 8251 tcg_gen_or_tl(cpu_gpr_d[r4], tmp_width, tmp_pos); 8252 } 8253 break; 8254 case OPC2_32_RRRR_EXTR: 8255 case OPC2_32_RRRR_EXTR_U: 8256 CHECK_REG_PAIR(r3); 8257 tcg_gen_andi_tl(tmp_width, cpu_gpr_d[r3+1], 0x1f); 8258 tcg_gen_andi_tl(tmp_pos, cpu_gpr_d[r3], 0x1f); 8259 tcg_gen_add_tl(tmp_pos, tmp_pos, tmp_width); 8260 tcg_gen_subfi_tl(tmp_pos, 32, tmp_pos); 8261 tcg_gen_shl_tl(cpu_gpr_d[r4], cpu_gpr_d[r1], tmp_pos); 8262 tcg_gen_subfi_tl(tmp_width, 32, tmp_width); 8263 if (op2 == OPC2_32_RRRR_EXTR) { 8264 tcg_gen_sar_tl(cpu_gpr_d[r4], cpu_gpr_d[r4], tmp_width); 8265 } else { 8266 tcg_gen_shr_tl(cpu_gpr_d[r4], cpu_gpr_d[r4], tmp_width); 8267 } 8268 break; 8269 case OPC2_32_RRRR_INSERT: 8270 CHECK_REG_PAIR(r3); 8271 tcg_gen_andi_tl(tmp_width, cpu_gpr_d[r3+1], 0x1f); 8272 tcg_gen_andi_tl(tmp_pos, cpu_gpr_d[r3], 0x1f); 8273 gen_insert(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r2], tmp_width, 8274 tmp_pos); 8275 break; 8276 default: 8277 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 8278 } 8279 tcg_temp_free(tmp_pos); 8280 tcg_temp_free(tmp_width); 8281 } 8282 8283 /* RRRW format */ 8284 static void decode_rrrw_extract_insert(DisasContext *ctx) 8285 { 8286 uint32_t op2; 8287 int r1, r2, r3, r4; 8288 int32_t width; 8289 8290 TCGv temp, temp2; 8291 8292 op2 = MASK_OP_RRRW_OP2(ctx->opcode); 8293 r1 = MASK_OP_RRRW_S1(ctx->opcode); 8294 r2 = MASK_OP_RRRW_S2(ctx->opcode); 8295 r3 = MASK_OP_RRRW_S3(ctx->opcode); 8296 r4 = MASK_OP_RRRW_D(ctx->opcode); 8297 width = MASK_OP_RRRW_WIDTH(ctx->opcode); 8298 8299 temp = tcg_temp_new(); 8300 8301 switch (op2) { 8302 case OPC2_32_RRRW_EXTR: 8303 tcg_gen_andi_tl(temp, cpu_gpr_d[r3], 0x1f); 8304 tcg_gen_addi_tl(temp, temp, width); 8305 tcg_gen_subfi_tl(temp, 32, temp); 8306 tcg_gen_shl_tl(cpu_gpr_d[r4], cpu_gpr_d[r1], temp); 8307 tcg_gen_sari_tl(cpu_gpr_d[r4], cpu_gpr_d[r4], 32 - width); 8308 break; 8309 case OPC2_32_RRRW_EXTR_U: 8310 if (width == 0) { 8311 tcg_gen_movi_tl(cpu_gpr_d[r4], 0); 8312 } else { 8313 tcg_gen_andi_tl(temp, cpu_gpr_d[r3], 0x1f); 8314 tcg_gen_shr_tl(cpu_gpr_d[r4], cpu_gpr_d[r1], temp); 8315 tcg_gen_andi_tl(cpu_gpr_d[r4], cpu_gpr_d[r4], ~0u >> (32-width)); 8316 } 8317 break; 8318 case OPC2_32_RRRW_IMASK: 8319 temp2 = tcg_temp_new(); 8320 8321 tcg_gen_andi_tl(temp, cpu_gpr_d[r3], 0x1f); 8322 tcg_gen_movi_tl(temp2, (1 << width) - 1); 8323 tcg_gen_shl_tl(temp2, temp2, temp); 8324 tcg_gen_shl_tl(cpu_gpr_d[r4], cpu_gpr_d[r2], temp); 8325 tcg_gen_mov_tl(cpu_gpr_d[r4+1], temp2); 8326 8327 tcg_temp_free(temp2); 8328 break; 8329 case OPC2_32_RRRW_INSERT: 8330 temp2 = tcg_temp_new(); 8331 8332 tcg_gen_movi_tl(temp, width); 8333 tcg_gen_andi_tl(temp2, cpu_gpr_d[r3], 0x1f); 8334 gen_insert(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r2], temp, temp2); 8335 8336 tcg_temp_free(temp2); 8337 break; 8338 default: 8339 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 8340 } 8341 tcg_temp_free(temp); 8342 } 8343 8344 /* SYS Format*/ 8345 static void decode_sys_interrupts(DisasContext *ctx) 8346 { 8347 uint32_t op2; 8348 uint32_t r1; 8349 TCGLabel *l1; 8350 TCGv tmp; 8351 8352 op2 = MASK_OP_SYS_OP2(ctx->opcode); 8353 r1 = MASK_OP_SYS_S1D(ctx->opcode); 8354 8355 switch (op2) { 8356 case OPC2_32_SYS_DEBUG: 8357 /* raise EXCP_DEBUG */ 8358 break; 8359 case OPC2_32_SYS_DISABLE: 8360 tcg_gen_andi_tl(cpu_ICR, cpu_ICR, ~MASK_ICR_IE_1_3); 8361 break; 8362 case OPC2_32_SYS_DSYNC: 8363 break; 8364 case OPC2_32_SYS_ENABLE: 8365 tcg_gen_ori_tl(cpu_ICR, cpu_ICR, MASK_ICR_IE_1_3); 8366 break; 8367 case OPC2_32_SYS_ISYNC: 8368 break; 8369 case OPC2_32_SYS_NOP: 8370 break; 8371 case OPC2_32_SYS_RET: 8372 gen_compute_branch(ctx, op2, 0, 0, 0, 0); 8373 break; 8374 case OPC2_32_SYS_FRET: 8375 gen_fret(ctx); 8376 break; 8377 case OPC2_32_SYS_RFE: 8378 gen_helper_rfe(cpu_env); 8379 tcg_gen_exit_tb(NULL, 0); 8380 ctx->base.is_jmp = DISAS_NORETURN; 8381 break; 8382 case OPC2_32_SYS_RFM: 8383 if ((ctx->hflags & TRICORE_HFLAG_KUU) == TRICORE_HFLAG_SM) { 8384 tmp = tcg_temp_new(); 8385 l1 = gen_new_label(); 8386 8387 tcg_gen_ld32u_tl(tmp, cpu_env, offsetof(CPUTriCoreState, DBGSR)); 8388 tcg_gen_andi_tl(tmp, tmp, MASK_DBGSR_DE); 8389 tcg_gen_brcondi_tl(TCG_COND_NE, tmp, 1, l1); 8390 gen_helper_rfm(cpu_env); 8391 gen_set_label(l1); 8392 tcg_gen_exit_tb(NULL, 0); 8393 ctx->base.is_jmp = DISAS_NORETURN; 8394 tcg_temp_free(tmp); 8395 } else { 8396 /* generate privilege trap */ 8397 } 8398 break; 8399 case OPC2_32_SYS_RSLCX: 8400 gen_helper_rslcx(cpu_env); 8401 break; 8402 case OPC2_32_SYS_SVLCX: 8403 gen_helper_svlcx(cpu_env); 8404 break; 8405 case OPC2_32_SYS_RESTORE: 8406 if (has_feature(ctx, TRICORE_FEATURE_16)) { 8407 if ((ctx->hflags & TRICORE_HFLAG_KUU) == TRICORE_HFLAG_SM || 8408 (ctx->hflags & TRICORE_HFLAG_KUU) == TRICORE_HFLAG_UM1) { 8409 tcg_gen_deposit_tl(cpu_ICR, cpu_ICR, cpu_gpr_d[r1], 8, 1); 8410 } /* else raise privilege trap */ 8411 } else { 8412 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 8413 } 8414 break; 8415 case OPC2_32_SYS_TRAPSV: 8416 l1 = gen_new_label(); 8417 tcg_gen_brcondi_tl(TCG_COND_GE, cpu_PSW_SV, 0, l1); 8418 generate_trap(ctx, TRAPC_ASSERT, TIN5_SOVF); 8419 gen_set_label(l1); 8420 break; 8421 case OPC2_32_SYS_TRAPV: 8422 l1 = gen_new_label(); 8423 tcg_gen_brcondi_tl(TCG_COND_GE, cpu_PSW_V, 0, l1); 8424 generate_trap(ctx, TRAPC_ASSERT, TIN5_OVF); 8425 gen_set_label(l1); 8426 break; 8427 default: 8428 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 8429 } 8430 } 8431 8432 static void decode_32Bit_opc(DisasContext *ctx) 8433 { 8434 int op1; 8435 int32_t r1, r2, r3; 8436 int32_t address, const16; 8437 int8_t b, const4; 8438 int32_t bpos; 8439 TCGv temp, temp2, temp3; 8440 8441 op1 = MASK_OP_MAJOR(ctx->opcode); 8442 8443 /* handle JNZ.T opcode only being 7 bit long */ 8444 if (unlikely((op1 & 0x7f) == OPCM_32_BRN_JTT)) { 8445 op1 = OPCM_32_BRN_JTT; 8446 } 8447 8448 switch (op1) { 8449 /* ABS-format */ 8450 case OPCM_32_ABS_LDW: 8451 decode_abs_ldw(ctx); 8452 break; 8453 case OPCM_32_ABS_LDB: 8454 decode_abs_ldb(ctx); 8455 break; 8456 case OPCM_32_ABS_LDMST_SWAP: 8457 decode_abs_ldst_swap(ctx); 8458 break; 8459 case OPCM_32_ABS_LDST_CONTEXT: 8460 decode_abs_ldst_context(ctx); 8461 break; 8462 case OPCM_32_ABS_STORE: 8463 decode_abs_store(ctx); 8464 break; 8465 case OPCM_32_ABS_STOREB_H: 8466 decode_abs_storeb_h(ctx); 8467 break; 8468 case OPC1_32_ABS_STOREQ: 8469 address = MASK_OP_ABS_OFF18(ctx->opcode); 8470 r1 = MASK_OP_ABS_S1D(ctx->opcode); 8471 temp = tcg_const_i32(EA_ABS_FORMAT(address)); 8472 temp2 = tcg_temp_new(); 8473 8474 tcg_gen_shri_tl(temp2, cpu_gpr_d[r1], 16); 8475 tcg_gen_qemu_st_tl(temp2, temp, ctx->mem_idx, MO_LEUW); 8476 8477 tcg_temp_free(temp2); 8478 tcg_temp_free(temp); 8479 break; 8480 case OPC1_32_ABS_LD_Q: 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 8485 tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LEUW); 8486 tcg_gen_shli_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 16); 8487 8488 tcg_temp_free(temp); 8489 break; 8490 case OPC1_32_ABS_LEA: 8491 address = MASK_OP_ABS_OFF18(ctx->opcode); 8492 r1 = MASK_OP_ABS_S1D(ctx->opcode); 8493 tcg_gen_movi_tl(cpu_gpr_a[r1], EA_ABS_FORMAT(address)); 8494 break; 8495 /* ABSB-format */ 8496 case OPC1_32_ABSB_ST_T: 8497 address = MASK_OP_ABS_OFF18(ctx->opcode); 8498 b = MASK_OP_ABSB_B(ctx->opcode); 8499 bpos = MASK_OP_ABSB_BPOS(ctx->opcode); 8500 8501 temp = tcg_const_i32(EA_ABS_FORMAT(address)); 8502 temp2 = tcg_temp_new(); 8503 8504 tcg_gen_qemu_ld_tl(temp2, temp, ctx->mem_idx, MO_UB); 8505 tcg_gen_andi_tl(temp2, temp2, ~(0x1u << bpos)); 8506 tcg_gen_ori_tl(temp2, temp2, (b << bpos)); 8507 tcg_gen_qemu_st_tl(temp2, temp, ctx->mem_idx, MO_UB); 8508 8509 tcg_temp_free(temp); 8510 tcg_temp_free(temp2); 8511 break; 8512 /* B-format */ 8513 case OPC1_32_B_CALL: 8514 case OPC1_32_B_CALLA: 8515 case OPC1_32_B_FCALL: 8516 case OPC1_32_B_FCALLA: 8517 case OPC1_32_B_J: 8518 case OPC1_32_B_JA: 8519 case OPC1_32_B_JL: 8520 case OPC1_32_B_JLA: 8521 address = MASK_OP_B_DISP24_SEXT(ctx->opcode); 8522 gen_compute_branch(ctx, op1, 0, 0, 0, address); 8523 break; 8524 /* Bit-format */ 8525 case OPCM_32_BIT_ANDACC: 8526 decode_bit_andacc(ctx); 8527 break; 8528 case OPCM_32_BIT_LOGICAL_T1: 8529 decode_bit_logical_t(ctx); 8530 break; 8531 case OPCM_32_BIT_INSERT: 8532 decode_bit_insert(ctx); 8533 break; 8534 case OPCM_32_BIT_LOGICAL_T2: 8535 decode_bit_logical_t2(ctx); 8536 break; 8537 case OPCM_32_BIT_ORAND: 8538 decode_bit_orand(ctx); 8539 break; 8540 case OPCM_32_BIT_SH_LOGIC1: 8541 decode_bit_sh_logic1(ctx); 8542 break; 8543 case OPCM_32_BIT_SH_LOGIC2: 8544 decode_bit_sh_logic2(ctx); 8545 break; 8546 /* BO Format */ 8547 case OPCM_32_BO_ADDRMODE_POST_PRE_BASE: 8548 decode_bo_addrmode_post_pre_base(ctx); 8549 break; 8550 case OPCM_32_BO_ADDRMODE_BITREVERSE_CIRCULAR: 8551 decode_bo_addrmode_bitreverse_circular(ctx); 8552 break; 8553 case OPCM_32_BO_ADDRMODE_LD_POST_PRE_BASE: 8554 decode_bo_addrmode_ld_post_pre_base(ctx); 8555 break; 8556 case OPCM_32_BO_ADDRMODE_LD_BITREVERSE_CIRCULAR: 8557 decode_bo_addrmode_ld_bitreverse_circular(ctx); 8558 break; 8559 case OPCM_32_BO_ADDRMODE_STCTX_POST_PRE_BASE: 8560 decode_bo_addrmode_stctx_post_pre_base(ctx); 8561 break; 8562 case OPCM_32_BO_ADDRMODE_LDMST_BITREVERSE_CIRCULAR: 8563 decode_bo_addrmode_ldmst_bitreverse_circular(ctx); 8564 break; 8565 /* BOL-format */ 8566 case OPC1_32_BOL_LD_A_LONGOFF: 8567 case OPC1_32_BOL_LD_W_LONGOFF: 8568 case OPC1_32_BOL_LEA_LONGOFF: 8569 case OPC1_32_BOL_ST_W_LONGOFF: 8570 case OPC1_32_BOL_ST_A_LONGOFF: 8571 case OPC1_32_BOL_LD_B_LONGOFF: 8572 case OPC1_32_BOL_LD_BU_LONGOFF: 8573 case OPC1_32_BOL_LD_H_LONGOFF: 8574 case OPC1_32_BOL_LD_HU_LONGOFF: 8575 case OPC1_32_BOL_ST_B_LONGOFF: 8576 case OPC1_32_BOL_ST_H_LONGOFF: 8577 decode_bol_opc(ctx, op1); 8578 break; 8579 /* BRC Format */ 8580 case OPCM_32_BRC_EQ_NEQ: 8581 case OPCM_32_BRC_GE: 8582 case OPCM_32_BRC_JLT: 8583 case OPCM_32_BRC_JNE: 8584 const4 = MASK_OP_BRC_CONST4_SEXT(ctx->opcode); 8585 address = MASK_OP_BRC_DISP15_SEXT(ctx->opcode); 8586 r1 = MASK_OP_BRC_S1(ctx->opcode); 8587 gen_compute_branch(ctx, op1, r1, 0, const4, address); 8588 break; 8589 /* BRN Format */ 8590 case OPCM_32_BRN_JTT: 8591 address = MASK_OP_BRN_DISP15_SEXT(ctx->opcode); 8592 r1 = MASK_OP_BRN_S1(ctx->opcode); 8593 gen_compute_branch(ctx, op1, r1, 0, 0, address); 8594 break; 8595 /* BRR Format */ 8596 case OPCM_32_BRR_EQ_NEQ: 8597 case OPCM_32_BRR_ADDR_EQ_NEQ: 8598 case OPCM_32_BRR_GE: 8599 case OPCM_32_BRR_JLT: 8600 case OPCM_32_BRR_JNE: 8601 case OPCM_32_BRR_JNZ: 8602 case OPCM_32_BRR_LOOP: 8603 address = MASK_OP_BRR_DISP15_SEXT(ctx->opcode); 8604 r2 = MASK_OP_BRR_S2(ctx->opcode); 8605 r1 = MASK_OP_BRR_S1(ctx->opcode); 8606 gen_compute_branch(ctx, op1, r1, r2, 0, address); 8607 break; 8608 /* RC Format */ 8609 case OPCM_32_RC_LOGICAL_SHIFT: 8610 decode_rc_logical_shift(ctx); 8611 break; 8612 case OPCM_32_RC_ACCUMULATOR: 8613 decode_rc_accumulator(ctx); 8614 break; 8615 case OPCM_32_RC_SERVICEROUTINE: 8616 decode_rc_serviceroutine(ctx); 8617 break; 8618 case OPCM_32_RC_MUL: 8619 decode_rc_mul(ctx); 8620 break; 8621 /* RCPW Format */ 8622 case OPCM_32_RCPW_MASK_INSERT: 8623 decode_rcpw_insert(ctx); 8624 break; 8625 /* RCRR Format */ 8626 case OPC1_32_RCRR_INSERT: 8627 r1 = MASK_OP_RCRR_S1(ctx->opcode); 8628 r2 = MASK_OP_RCRR_S3(ctx->opcode); 8629 r3 = MASK_OP_RCRR_D(ctx->opcode); 8630 const16 = MASK_OP_RCRR_CONST4(ctx->opcode); 8631 temp = tcg_const_i32(const16); 8632 temp2 = tcg_temp_new(); /* width*/ 8633 temp3 = tcg_temp_new(); /* pos */ 8634 8635 CHECK_REG_PAIR(r3); 8636 8637 tcg_gen_andi_tl(temp2, cpu_gpr_d[r3+1], 0x1f); 8638 tcg_gen_andi_tl(temp3, cpu_gpr_d[r3], 0x1f); 8639 8640 gen_insert(cpu_gpr_d[r2], cpu_gpr_d[r1], temp, temp2, temp3); 8641 8642 tcg_temp_free(temp); 8643 tcg_temp_free(temp2); 8644 tcg_temp_free(temp3); 8645 break; 8646 /* RCRW Format */ 8647 case OPCM_32_RCRW_MASK_INSERT: 8648 decode_rcrw_insert(ctx); 8649 break; 8650 /* RCR Format */ 8651 case OPCM_32_RCR_COND_SELECT: 8652 decode_rcr_cond_select(ctx); 8653 break; 8654 case OPCM_32_RCR_MADD: 8655 decode_rcr_madd(ctx); 8656 break; 8657 case OPCM_32_RCR_MSUB: 8658 decode_rcr_msub(ctx); 8659 break; 8660 /* RLC Format */ 8661 case OPC1_32_RLC_ADDI: 8662 case OPC1_32_RLC_ADDIH: 8663 case OPC1_32_RLC_ADDIH_A: 8664 case OPC1_32_RLC_MFCR: 8665 case OPC1_32_RLC_MOV: 8666 case OPC1_32_RLC_MOV_64: 8667 case OPC1_32_RLC_MOV_U: 8668 case OPC1_32_RLC_MOV_H: 8669 case OPC1_32_RLC_MOVH_A: 8670 case OPC1_32_RLC_MTCR: 8671 decode_rlc_opc(ctx, op1); 8672 break; 8673 /* RR Format */ 8674 case OPCM_32_RR_ACCUMULATOR: 8675 decode_rr_accumulator(ctx); 8676 break; 8677 case OPCM_32_RR_LOGICAL_SHIFT: 8678 decode_rr_logical_shift(ctx); 8679 break; 8680 case OPCM_32_RR_ADDRESS: 8681 decode_rr_address(ctx); 8682 break; 8683 case OPCM_32_RR_IDIRECT: 8684 decode_rr_idirect(ctx); 8685 break; 8686 case OPCM_32_RR_DIVIDE: 8687 decode_rr_divide(ctx); 8688 break; 8689 /* RR1 Format */ 8690 case OPCM_32_RR1_MUL: 8691 decode_rr1_mul(ctx); 8692 break; 8693 case OPCM_32_RR1_MULQ: 8694 decode_rr1_mulq(ctx); 8695 break; 8696 /* RR2 format */ 8697 case OPCM_32_RR2_MUL: 8698 decode_rr2_mul(ctx); 8699 break; 8700 /* RRPW format */ 8701 case OPCM_32_RRPW_EXTRACT_INSERT: 8702 decode_rrpw_extract_insert(ctx); 8703 break; 8704 case OPC1_32_RRPW_DEXTR: 8705 r1 = MASK_OP_RRPW_S1(ctx->opcode); 8706 r2 = MASK_OP_RRPW_S2(ctx->opcode); 8707 r3 = MASK_OP_RRPW_D(ctx->opcode); 8708 const16 = MASK_OP_RRPW_POS(ctx->opcode); 8709 if (r1 == r2) { 8710 tcg_gen_rotli_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], const16); 8711 } else { 8712 temp = tcg_temp_new(); 8713 tcg_gen_shli_tl(temp, cpu_gpr_d[r1], const16); 8714 tcg_gen_shri_tl(cpu_gpr_d[r3], cpu_gpr_d[r2], 32 - const16); 8715 tcg_gen_or_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], temp); 8716 tcg_temp_free(temp); 8717 } 8718 break; 8719 /* RRR Format */ 8720 case OPCM_32_RRR_COND_SELECT: 8721 decode_rrr_cond_select(ctx); 8722 break; 8723 case OPCM_32_RRR_DIVIDE: 8724 decode_rrr_divide(ctx); 8725 break; 8726 /* RRR2 Format */ 8727 case OPCM_32_RRR2_MADD: 8728 decode_rrr2_madd(ctx); 8729 break; 8730 case OPCM_32_RRR2_MSUB: 8731 decode_rrr2_msub(ctx); 8732 break; 8733 /* RRR1 format */ 8734 case OPCM_32_RRR1_MADD: 8735 decode_rrr1_madd(ctx); 8736 break; 8737 case OPCM_32_RRR1_MADDQ_H: 8738 decode_rrr1_maddq_h(ctx); 8739 break; 8740 case OPCM_32_RRR1_MADDSU_H: 8741 decode_rrr1_maddsu_h(ctx); 8742 break; 8743 case OPCM_32_RRR1_MSUB_H: 8744 decode_rrr1_msub(ctx); 8745 break; 8746 case OPCM_32_RRR1_MSUB_Q: 8747 decode_rrr1_msubq_h(ctx); 8748 break; 8749 case OPCM_32_RRR1_MSUBAD_H: 8750 decode_rrr1_msubad_h(ctx); 8751 break; 8752 /* RRRR format */ 8753 case OPCM_32_RRRR_EXTRACT_INSERT: 8754 decode_rrrr_extract_insert(ctx); 8755 break; 8756 /* RRRW format */ 8757 case OPCM_32_RRRW_EXTRACT_INSERT: 8758 decode_rrrw_extract_insert(ctx); 8759 break; 8760 /* SYS format */ 8761 case OPCM_32_SYS_INTERRUPTS: 8762 decode_sys_interrupts(ctx); 8763 break; 8764 case OPC1_32_SYS_RSTV: 8765 tcg_gen_movi_tl(cpu_PSW_V, 0); 8766 tcg_gen_mov_tl(cpu_PSW_SV, cpu_PSW_V); 8767 tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V); 8768 tcg_gen_mov_tl(cpu_PSW_SAV, cpu_PSW_V); 8769 break; 8770 default: 8771 generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); 8772 } 8773 } 8774 8775 static bool tricore_insn_is_16bit(uint32_t insn) 8776 { 8777 return (insn & 0x1) == 0; 8778 } 8779 8780 static void tricore_tr_init_disas_context(DisasContextBase *dcbase, 8781 CPUState *cs) 8782 { 8783 DisasContext *ctx = container_of(dcbase, DisasContext, base); 8784 CPUTriCoreState *env = cs->env_ptr; 8785 ctx->mem_idx = cpu_mmu_index(env, false); 8786 ctx->hflags = (uint32_t)ctx->base.tb->flags; 8787 ctx->features = env->features; 8788 } 8789 8790 static void tricore_tr_tb_start(DisasContextBase *db, CPUState *cpu) 8791 { 8792 } 8793 8794 static void tricore_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu) 8795 { 8796 DisasContext *ctx = container_of(dcbase, DisasContext, base); 8797 8798 tcg_gen_insn_start(ctx->base.pc_next); 8799 } 8800 8801 static bool insn_crosses_page(CPUTriCoreState *env, DisasContext *ctx) 8802 { 8803 /* 8804 * Return true if the insn at ctx->base.pc_next might cross a page boundary. 8805 * (False positives are OK, false negatives are not.) 8806 * Our caller ensures we are only called if dc->base.pc_next is less than 8807 * 4 bytes from the page boundary, so we cross the page if the first 8808 * 16 bits indicate that this is a 32 bit insn. 8809 */ 8810 uint16_t insn = cpu_lduw_code(env, ctx->base.pc_next); 8811 8812 return !tricore_insn_is_16bit(insn); 8813 } 8814 8815 8816 static void tricore_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu) 8817 { 8818 DisasContext *ctx = container_of(dcbase, DisasContext, base); 8819 CPUTriCoreState *env = cpu->env_ptr; 8820 uint16_t insn_lo; 8821 bool is_16bit; 8822 8823 insn_lo = cpu_lduw_code(env, ctx->base.pc_next); 8824 is_16bit = tricore_insn_is_16bit(insn_lo); 8825 if (is_16bit) { 8826 ctx->opcode = insn_lo; 8827 ctx->pc_succ_insn = ctx->base.pc_next + 2; 8828 decode_16Bit_opc(ctx); 8829 } else { 8830 uint32_t insn_hi = cpu_lduw_code(env, ctx->base.pc_next + 2); 8831 ctx->opcode = insn_hi << 16 | insn_lo; 8832 ctx->pc_succ_insn = ctx->base.pc_next + 4; 8833 decode_32Bit_opc(ctx); 8834 } 8835 ctx->base.pc_next = ctx->pc_succ_insn; 8836 8837 if (ctx->base.is_jmp == DISAS_NEXT) { 8838 target_ulong page_start; 8839 8840 page_start = ctx->base.pc_first & TARGET_PAGE_MASK; 8841 if (ctx->base.pc_next - page_start >= TARGET_PAGE_SIZE 8842 || (ctx->base.pc_next - page_start >= TARGET_PAGE_SIZE - 3 8843 && insn_crosses_page(env, ctx))) { 8844 ctx->base.is_jmp = DISAS_TOO_MANY; 8845 } 8846 } 8847 } 8848 8849 static void tricore_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu) 8850 { 8851 DisasContext *ctx = container_of(dcbase, DisasContext, base); 8852 8853 switch (ctx->base.is_jmp) { 8854 case DISAS_TOO_MANY: 8855 gen_goto_tb(ctx, 0, ctx->base.pc_next); 8856 break; 8857 case DISAS_NORETURN: 8858 break; 8859 default: 8860 g_assert_not_reached(); 8861 } 8862 } 8863 8864 static void tricore_tr_disas_log(const DisasContextBase *dcbase, 8865 CPUState *cpu, FILE *logfile) 8866 { 8867 fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first)); 8868 target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size); 8869 } 8870 8871 static const TranslatorOps tricore_tr_ops = { 8872 .init_disas_context = tricore_tr_init_disas_context, 8873 .tb_start = tricore_tr_tb_start, 8874 .insn_start = tricore_tr_insn_start, 8875 .translate_insn = tricore_tr_translate_insn, 8876 .tb_stop = tricore_tr_tb_stop, 8877 .disas_log = tricore_tr_disas_log, 8878 }; 8879 8880 8881 void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns, 8882 target_ulong pc, void *host_pc) 8883 { 8884 DisasContext ctx; 8885 translator_loop(cs, tb, max_insns, pc, host_pc, 8886 &tricore_tr_ops, &ctx.base); 8887 } 8888 8889 void 8890 restore_state_to_opc(CPUTriCoreState *env, TranslationBlock *tb, 8891 target_ulong *data) 8892 { 8893 env->PC = data[0]; 8894 } 8895 /* 8896 * 8897 * Initialization 8898 * 8899 */ 8900 8901 void cpu_state_reset(CPUTriCoreState *env) 8902 { 8903 /* Reset Regs to Default Value */ 8904 env->PSW = 0xb80; 8905 fpu_set_state(env); 8906 } 8907 8908 static void tricore_tcg_init_csfr(void) 8909 { 8910 cpu_PCXI = tcg_global_mem_new(cpu_env, 8911 offsetof(CPUTriCoreState, PCXI), "PCXI"); 8912 cpu_PSW = tcg_global_mem_new(cpu_env, 8913 offsetof(CPUTriCoreState, PSW), "PSW"); 8914 cpu_PC = tcg_global_mem_new(cpu_env, 8915 offsetof(CPUTriCoreState, PC), "PC"); 8916 cpu_ICR = tcg_global_mem_new(cpu_env, 8917 offsetof(CPUTriCoreState, ICR), "ICR"); 8918 } 8919 8920 void tricore_tcg_init(void) 8921 { 8922 int i; 8923 8924 /* reg init */ 8925 for (i = 0 ; i < 16 ; i++) { 8926 cpu_gpr_a[i] = tcg_global_mem_new(cpu_env, 8927 offsetof(CPUTriCoreState, gpr_a[i]), 8928 regnames_a[i]); 8929 } 8930 for (i = 0 ; i < 16 ; i++) { 8931 cpu_gpr_d[i] = tcg_global_mem_new(cpu_env, 8932 offsetof(CPUTriCoreState, gpr_d[i]), 8933 regnames_d[i]); 8934 } 8935 tricore_tcg_init_csfr(); 8936 /* init PSW flag cache */ 8937 cpu_PSW_C = tcg_global_mem_new(cpu_env, 8938 offsetof(CPUTriCoreState, PSW_USB_C), 8939 "PSW_C"); 8940 cpu_PSW_V = tcg_global_mem_new(cpu_env, 8941 offsetof(CPUTriCoreState, PSW_USB_V), 8942 "PSW_V"); 8943 cpu_PSW_SV = tcg_global_mem_new(cpu_env, 8944 offsetof(CPUTriCoreState, PSW_USB_SV), 8945 "PSW_SV"); 8946 cpu_PSW_AV = tcg_global_mem_new(cpu_env, 8947 offsetof(CPUTriCoreState, PSW_USB_AV), 8948 "PSW_AV"); 8949 cpu_PSW_SAV = tcg_global_mem_new(cpu_env, 8950 offsetof(CPUTriCoreState, PSW_USB_SAV), 8951 "PSW_SAV"); 8952 } 8953