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