translate.c (06c060d9e5bad5c5317cb158fcce2e2ae3f942a8) | translate.c (287b11520bd4dafd58e42ccff7010f8c4bbafcf9) |
---|---|
1/* 2 SPARC translation 3 4 Copyright (C) 2003 Thomas M. Ogrisegg <tom@fnord.at> 5 Copyright (C) 2003-2005 Fabrice Bellard 6 7 This library is free software; you can redistribute it and/or 8 modify it under the terms of the GNU Lesser General Public --- 2092 unchanged lines hidden (view full) --- 2101 } 2102 } 2103#endif 2104 2105 done: 2106 return (DisasASI){ type, asi, mem_idx, memop }; 2107} 2108 | 1/* 2 SPARC translation 3 4 Copyright (C) 2003 Thomas M. Ogrisegg <tom@fnord.at> 5 Copyright (C) 2003-2005 Fabrice Bellard 6 7 This library is free software; you can redistribute it and/or 8 modify it under the terms of the GNU Lesser General Public --- 2092 unchanged lines hidden (view full) --- 2101 } 2102 } 2103#endif 2104 2105 done: 2106 return (DisasASI){ type, asi, mem_idx, memop }; 2107} 2108 |
2109static DisasASI get_asi(DisasContext *dc, int insn, MemOp memop) 2110{ 2111 int asi = IS_IMM ? -2 : GET_FIELD(insn, 19, 26); 2112 return resolve_asi(dc, asi, memop); 2113} 2114 | |
2115#if defined(CONFIG_USER_ONLY) && !defined(TARGET_SPARC64) 2116static void gen_helper_ld_asi(TCGv_i64 r, TCGv_env e, TCGv a, 2117 TCGv_i32 asi, TCGv_i32 mop) 2118{ 2119 g_assert_not_reached(); 2120} 2121 2122static void gen_helper_st_asi(TCGv_env e, TCGv a, TCGv_i64 r, --- 170 unchanged lines hidden (view full) --- 2293 2294 /* End the TB. */ 2295 dc->npc = DYNAMIC_PC; 2296 } 2297 break; 2298 } 2299} 2300 | 2109#if defined(CONFIG_USER_ONLY) && !defined(TARGET_SPARC64) 2110static void gen_helper_ld_asi(TCGv_i64 r, TCGv_env e, TCGv a, 2111 TCGv_i32 asi, TCGv_i32 mop) 2112{ 2113 g_assert_not_reached(); 2114} 2115 2116static void gen_helper_st_asi(TCGv_env e, TCGv a, TCGv_i64 r, --- 170 unchanged lines hidden (view full) --- 2287 2288 /* End the TB. */ 2289 dc->npc = DYNAMIC_PC; 2290 } 2291 break; 2292 } 2293} 2294 |
2301static void gen_ldf_asi0(DisasContext *dc, DisasASI *da, MemOp orig_size, 2302 TCGv addr, int rd) | 2295static void gen_ldf_asi(DisasContext *dc, DisasASI *da, MemOp orig_size, 2296 TCGv addr, int rd) |
2303{ 2304 MemOp memop = da->memop; 2305 MemOp size = memop & MO_SIZE; 2306 TCGv_i32 d32; 2307 TCGv_i64 d64; | 2297{ 2298 MemOp memop = da->memop; 2299 MemOp size = memop & MO_SIZE; 2300 TCGv_i32 d32; 2301 TCGv_i64 d64; |
2302 TCGv addr_tmp; |
|
2308 2309 /* TODO: Use 128-bit load/store below. */ 2310 if (size == MO_128) { 2311 memop = (memop & ~MO_SIZE) | MO_64; 2312 } 2313 2314 switch (da->type) { 2315 case GET_ASI_EXCP: --- 10 unchanged lines hidden (view full) --- 2326 2327 case MO_64: 2328 tcg_gen_qemu_ld_i64(cpu_fpr[rd / 2], addr, da->mem_idx, memop); 2329 break; 2330 2331 case MO_128: 2332 d64 = tcg_temp_new_i64(); 2333 tcg_gen_qemu_ld_i64(d64, addr, da->mem_idx, memop); | 2303 2304 /* TODO: Use 128-bit load/store below. */ 2305 if (size == MO_128) { 2306 memop = (memop & ~MO_SIZE) | MO_64; 2307 } 2308 2309 switch (da->type) { 2310 case GET_ASI_EXCP: --- 10 unchanged lines hidden (view full) --- 2321 2322 case MO_64: 2323 tcg_gen_qemu_ld_i64(cpu_fpr[rd / 2], addr, da->mem_idx, memop); 2324 break; 2325 2326 case MO_128: 2327 d64 = tcg_temp_new_i64(); 2328 tcg_gen_qemu_ld_i64(d64, addr, da->mem_idx, memop); |
2334 tcg_gen_addi_tl(addr, addr, 8); 2335 tcg_gen_qemu_ld_i64(cpu_fpr[rd / 2 + 1], addr, da->mem_idx, memop); | 2329 addr_tmp = tcg_temp_new(); 2330 tcg_gen_addi_tl(addr_tmp, addr, 8); 2331 tcg_gen_qemu_ld_i64(cpu_fpr[rd / 2 + 1], addr_tmp, da->mem_idx, memop); |
2336 tcg_gen_mov_i64(cpu_fpr[rd / 2], d64); 2337 break; 2338 default: 2339 g_assert_not_reached(); 2340 } 2341 break; 2342 2343 case GET_ASI_BLOCK: 2344 /* Valid for lddfa on aligned registers only. */ 2345 if (orig_size == MO_64 && (rd & 7) == 0) { | 2332 tcg_gen_mov_i64(cpu_fpr[rd / 2], d64); 2333 break; 2334 default: 2335 g_assert_not_reached(); 2336 } 2337 break; 2338 2339 case GET_ASI_BLOCK: 2340 /* Valid for lddfa on aligned registers only. */ 2341 if (orig_size == MO_64 && (rd & 7) == 0) { |
2346 TCGv eight; 2347 int i; 2348 | |
2349 /* The first operation checks required alignment. */ | 2342 /* The first operation checks required alignment. */ |
2350 eight = tcg_constant_tl(8); 2351 for (i = 0; ; ++i) { | 2343 addr_tmp = tcg_temp_new(); 2344 for (int i = 0; ; ++i) { |
2352 tcg_gen_qemu_ld_i64(cpu_fpr[rd / 2 + i], addr, da->mem_idx, 2353 memop | (i == 0 ? MO_ALIGN_64 : 0)); 2354 if (i == 7) { 2355 break; 2356 } | 2345 tcg_gen_qemu_ld_i64(cpu_fpr[rd / 2 + i], addr, da->mem_idx, 2346 memop | (i == 0 ? MO_ALIGN_64 : 0)); 2347 if (i == 7) { 2348 break; 2349 } |
2357 tcg_gen_add_tl(addr, addr, eight); | 2350 tcg_gen_addi_tl(addr_tmp, addr, 8); 2351 addr = addr_tmp; |
2358 } 2359 } else { 2360 gen_exception(dc, TT_ILL_INSN); 2361 } 2362 break; 2363 2364 case GET_ASI_SHORT: 2365 /* Valid for lddfa only. */ --- 25 unchanged lines hidden (view full) --- 2391 break; 2392 case MO_64: 2393 gen_helper_ld_asi(cpu_fpr[rd / 2], tcg_env, addr, 2394 r_asi, r_mop); 2395 break; 2396 case MO_128: 2397 d64 = tcg_temp_new_i64(); 2398 gen_helper_ld_asi(d64, tcg_env, addr, r_asi, r_mop); | 2352 } 2353 } else { 2354 gen_exception(dc, TT_ILL_INSN); 2355 } 2356 break; 2357 2358 case GET_ASI_SHORT: 2359 /* Valid for lddfa only. */ --- 25 unchanged lines hidden (view full) --- 2385 break; 2386 case MO_64: 2387 gen_helper_ld_asi(cpu_fpr[rd / 2], tcg_env, addr, 2388 r_asi, r_mop); 2389 break; 2390 case MO_128: 2391 d64 = tcg_temp_new_i64(); 2392 gen_helper_ld_asi(d64, tcg_env, addr, r_asi, r_mop); |
2399 tcg_gen_addi_tl(addr, addr, 8); 2400 gen_helper_ld_asi(cpu_fpr[rd / 2 + 1], tcg_env, addr, | 2393 addr_tmp = tcg_temp_new(); 2394 tcg_gen_addi_tl(addr_tmp, addr, 8); 2395 gen_helper_ld_asi(cpu_fpr[rd / 2 + 1], tcg_env, addr_tmp, |
2401 r_asi, r_mop); 2402 tcg_gen_mov_i64(cpu_fpr[rd / 2], d64); 2403 break; 2404 default: 2405 g_assert_not_reached(); 2406 } 2407 } 2408 break; 2409 } 2410} 2411 | 2396 r_asi, r_mop); 2397 tcg_gen_mov_i64(cpu_fpr[rd / 2], d64); 2398 break; 2399 default: 2400 g_assert_not_reached(); 2401 } 2402 } 2403 break; 2404 } 2405} 2406 |
2412static void __attribute__((unused)) 2413gen_ldf_asi(DisasContext *dc, TCGv addr, int insn, int size, int rd) | 2407static void gen_stf_asi(DisasContext *dc, DisasASI *da, MemOp orig_size, 2408 TCGv addr, int rd) |
2414{ | 2409{ |
2415 MemOp sz = ctz32(size); 2416 DisasASI da = get_asi(dc, insn, MO_TE | sz); 2417 2418 gen_address_mask(dc, addr); 2419 gen_ldf_asi0(dc, &da, sz, addr, rd); 2420} 2421 2422static void gen_stf_asi0(DisasContext *dc, DisasASI *da, MemOp orig_size, 2423 TCGv addr, int rd) 2424{ | |
2425 MemOp memop = da->memop; 2426 MemOp size = memop & MO_SIZE; 2427 TCGv_i32 d32; | 2410 MemOp memop = da->memop; 2411 MemOp size = memop & MO_SIZE; 2412 TCGv_i32 d32; |
2413 TCGv addr_tmp; |
|
2428 2429 /* TODO: Use 128-bit load/store below. */ 2430 if (size == MO_128) { 2431 memop = (memop & ~MO_SIZE) | MO_64; 2432 } 2433 2434 switch (da->type) { 2435 case GET_ASI_EXCP: --- 13 unchanged lines hidden (view full) --- 2449 case MO_128: 2450 /* Only 4-byte alignment required. However, it is legal for the 2451 cpu to signal the alignment fault, and the OS trap handler is 2452 required to fix it up. Requiring 16-byte alignment here avoids 2453 having to probe the second page before performing the first 2454 write. */ 2455 tcg_gen_qemu_st_i64(cpu_fpr[rd / 2], addr, da->mem_idx, 2456 memop | MO_ALIGN_16); | 2414 2415 /* TODO: Use 128-bit load/store below. */ 2416 if (size == MO_128) { 2417 memop = (memop & ~MO_SIZE) | MO_64; 2418 } 2419 2420 switch (da->type) { 2421 case GET_ASI_EXCP: --- 13 unchanged lines hidden (view full) --- 2435 case MO_128: 2436 /* Only 4-byte alignment required. However, it is legal for the 2437 cpu to signal the alignment fault, and the OS trap handler is 2438 required to fix it up. Requiring 16-byte alignment here avoids 2439 having to probe the second page before performing the first 2440 write. */ 2441 tcg_gen_qemu_st_i64(cpu_fpr[rd / 2], addr, da->mem_idx, 2442 memop | MO_ALIGN_16); |
2457 tcg_gen_addi_tl(addr, addr, 8); 2458 tcg_gen_qemu_st_i64(cpu_fpr[rd / 2 + 1], addr, da->mem_idx, memop); | 2443 addr_tmp = tcg_temp_new(); 2444 tcg_gen_addi_tl(addr_tmp, addr, 8); 2445 tcg_gen_qemu_st_i64(cpu_fpr[rd / 2 + 1], addr_tmp, da->mem_idx, memop); |
2459 break; 2460 default: 2461 g_assert_not_reached(); 2462 } 2463 break; 2464 2465 case GET_ASI_BLOCK: 2466 /* Valid for stdfa on aligned registers only. */ 2467 if (orig_size == MO_64 && (rd & 7) == 0) { | 2446 break; 2447 default: 2448 g_assert_not_reached(); 2449 } 2450 break; 2451 2452 case GET_ASI_BLOCK: 2453 /* Valid for stdfa on aligned registers only. */ 2454 if (orig_size == MO_64 && (rd & 7) == 0) { |
2468 TCGv eight; 2469 int i; 2470 | |
2471 /* The first operation checks required alignment. */ | 2455 /* The first operation checks required alignment. */ |
2472 eight = tcg_constant_tl(8); 2473 for (i = 0; ; ++i) { | 2456 addr_tmp = tcg_temp_new(); 2457 for (int i = 0; ; ++i) { |
2474 tcg_gen_qemu_st_i64(cpu_fpr[rd / 2 + i], addr, da->mem_idx, 2475 memop | (i == 0 ? MO_ALIGN_64 : 0)); 2476 if (i == 7) { 2477 break; 2478 } | 2458 tcg_gen_qemu_st_i64(cpu_fpr[rd / 2 + i], addr, da->mem_idx, 2459 memop | (i == 0 ? MO_ALIGN_64 : 0)); 2460 if (i == 7) { 2461 break; 2462 } |
2479 tcg_gen_add_tl(addr, addr, eight); | 2463 tcg_gen_addi_tl(addr_tmp, addr, 8); 2464 addr = addr_tmp; |
2480 } 2481 } else { 2482 gen_exception(dc, TT_ILL_INSN); 2483 } 2484 break; 2485 2486 case GET_ASI_SHORT: 2487 /* Valid for stdfa only. */ --- 9 unchanged lines hidden (view full) --- 2497 /* According to the table in the UA2011 manual, the only 2498 other asis that are valid for ldfa/lddfa/ldqfa are 2499 the PST* asis, which aren't currently handled. */ 2500 gen_exception(dc, TT_ILL_INSN); 2501 break; 2502 } 2503} 2504 | 2465 } 2466 } else { 2467 gen_exception(dc, TT_ILL_INSN); 2468 } 2469 break; 2470 2471 case GET_ASI_SHORT: 2472 /* Valid for stdfa only. */ --- 9 unchanged lines hidden (view full) --- 2482 /* According to the table in the UA2011 manual, the only 2483 other asis that are valid for ldfa/lddfa/ldqfa are 2484 the PST* asis, which aren't currently handled. */ 2485 gen_exception(dc, TT_ILL_INSN); 2486 break; 2487 } 2488} 2489 |
2505static void __attribute__((unused)) 2506gen_stf_asi(DisasContext *dc, TCGv addr, int insn, int size, int rd) 2507{ 2508 MemOp sz = ctz32(size); 2509 DisasASI da = get_asi(dc, insn, MO_TE | sz); 2510 2511 gen_address_mask(dc, addr); 2512 gen_stf_asi0(dc, &da, sz, addr, rd); 2513} 2514 | |
2515static void gen_ldda_asi(DisasContext *dc, DisasASI *da, TCGv addr, int rd) 2516{ 2517 TCGv hi = gen_dest_gpr(dc, rd); 2518 TCGv lo = gen_dest_gpr(dc, rd + 1); 2519 2520 switch (da->type) { 2521 case GET_ASI_EXCP: 2522 return; --- 2122 unchanged lines hidden (view full) --- 4645 } 4646 if (gen_trap_ifnofpu(dc)) { 4647 return true; 4648 } 4649 if (sz == MO_128 && gen_trap_float128(dc)) { 4650 return true; 4651 } 4652 da = resolve_asi(dc, a->asi, MO_TE | sz); | 2490static void gen_ldda_asi(DisasContext *dc, DisasASI *da, TCGv addr, int rd) 2491{ 2492 TCGv hi = gen_dest_gpr(dc, rd); 2493 TCGv lo = gen_dest_gpr(dc, rd + 1); 2494 2495 switch (da->type) { 2496 case GET_ASI_EXCP: 2497 return; --- 2122 unchanged lines hidden (view full) --- 4620 } 4621 if (gen_trap_ifnofpu(dc)) { 4622 return true; 4623 } 4624 if (sz == MO_128 && gen_trap_float128(dc)) { 4625 return true; 4626 } 4627 da = resolve_asi(dc, a->asi, MO_TE | sz); |
4653 gen_ldf_asi0(dc, &da, sz, addr, a->rd); | 4628 gen_ldf_asi(dc, &da, sz, addr, a->rd); |
4654 gen_update_fprs_dirty(dc, a->rd); 4655 return advance_pc(dc); 4656} 4657 4658TRANS(LDF, ALL, do_ld_fpr, a, MO_32) 4659TRANS(LDDF, ALL, do_ld_fpr, a, MO_64) 4660TRANS(LDQF, ALL, do_ld_fpr, a, MO_128) 4661 | 4629 gen_update_fprs_dirty(dc, a->rd); 4630 return advance_pc(dc); 4631} 4632 4633TRANS(LDF, ALL, do_ld_fpr, a, MO_32) 4634TRANS(LDDF, ALL, do_ld_fpr, a, MO_64) 4635TRANS(LDQF, ALL, do_ld_fpr, a, MO_128) 4636 |
4637TRANS(LDFA, 64, do_ld_fpr, a, MO_32) 4638TRANS(LDDFA, 64, do_ld_fpr, a, MO_64) 4639TRANS(LDQFA, 64, do_ld_fpr, a, MO_128) 4640 |
|
4662static bool do_st_fpr(DisasContext *dc, arg_r_r_ri_asi *a, MemOp sz) 4663{ 4664 TCGv addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm); 4665 DisasASI da; 4666 4667 if (addr == NULL) { 4668 return false; 4669 } 4670 if (gen_trap_ifnofpu(dc)) { 4671 return true; 4672 } 4673 if (sz == MO_128 && gen_trap_float128(dc)) { 4674 return true; 4675 } 4676 da = resolve_asi(dc, a->asi, MO_TE | sz); | 4641static bool do_st_fpr(DisasContext *dc, arg_r_r_ri_asi *a, MemOp sz) 4642{ 4643 TCGv addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm); 4644 DisasASI da; 4645 4646 if (addr == NULL) { 4647 return false; 4648 } 4649 if (gen_trap_ifnofpu(dc)) { 4650 return true; 4651 } 4652 if (sz == MO_128 && gen_trap_float128(dc)) { 4653 return true; 4654 } 4655 da = resolve_asi(dc, a->asi, MO_TE | sz); |
4677 gen_stf_asi0(dc, &da, sz, addr, a->rd); | 4656 gen_stf_asi(dc, &da, sz, addr, a->rd); |
4678 return advance_pc(dc); 4679} 4680 4681TRANS(STF, ALL, do_st_fpr, a, MO_32) 4682TRANS(STDF, ALL, do_st_fpr, a, MO_64) 4683TRANS(STQF, ALL, do_st_fpr, a, MO_128) 4684 | 4657 return advance_pc(dc); 4658} 4659 4660TRANS(STF, ALL, do_st_fpr, a, MO_32) 4661TRANS(STDF, ALL, do_st_fpr, a, MO_64) 4662TRANS(STQF, ALL, do_st_fpr, a, MO_128) 4663 |
4664TRANS(STFA, 64, do_st_fpr, a, MO_32) 4665TRANS(STDFA, 64, do_st_fpr, a, MO_64) 4666TRANS(STQFA, 64, do_st_fpr, a, MO_128) 4667 |
|
4685static bool trans_STDFQ(DisasContext *dc, arg_STDFQ *a) 4686{ 4687 if (!avail_32(dc)) { 4688 return false; 4689 } 4690 if (!supervisor(dc)) { 4691 return raise_priv(dc); 4692 } --- 817 unchanged lines hidden (view full) --- 5510 rs2 = GET_FIELD(insn, 27, 31); 5511 if (rs2 != 0) { 5512 tcg_gen_add_tl(cpu_addr, cpu_addr, gen_load_gpr(dc, rs2)); 5513 } 5514 } 5515 if (xop < 4 || (xop > 7 && xop < 0x14 && xop != 0x0e) || 5516 (xop > 0x17 && xop <= 0x1d ) || 5517 (xop > 0x2c && xop <= 0x33) || xop == 0x1f || xop == 0x3d) { | 4668static bool trans_STDFQ(DisasContext *dc, arg_STDFQ *a) 4669{ 4670 if (!avail_32(dc)) { 4671 return false; 4672 } 4673 if (!supervisor(dc)) { 4674 return raise_priv(dc); 4675 } --- 817 unchanged lines hidden (view full) --- 5493 rs2 = GET_FIELD(insn, 27, 31); 5494 if (rs2 != 0) { 5495 tcg_gen_add_tl(cpu_addr, cpu_addr, gen_load_gpr(dc, rs2)); 5496 } 5497 } 5498 if (xop < 4 || (xop > 7 && xop < 0x14 && xop != 0x0e) || 5499 (xop > 0x17 && xop <= 0x1d ) || 5500 (xop > 0x2c && xop <= 0x33) || xop == 0x1f || xop == 0x3d) { |
5518 TCGv cpu_val = gen_dest_gpr(dc, rd); 5519 5520 switch (xop) { 5521 case 0x0: /* ld, V9 lduw, load unsigned word */ 5522 case 0x1: /* ldub, load unsigned byte */ 5523 case 0x2: /* lduh, load unsigned halfword */ 5524 case 0x3: /* ldd, load double word */ 5525 case 0x9: /* ldsb, load signed byte */ 5526 case 0xa: /* ldsh, load signed halfword */ 5527 case 0xd: /* ldstub */ 5528 case 0x0f: /* swap */ 5529 case 0x10: /* lda, V9 lduwa, load word alternate */ 5530 case 0x11: /* lduba, load unsigned byte alternate */ 5531 case 0x12: /* lduha, load unsigned halfword alternate */ 5532 case 0x13: /* ldda, load double word alternate */ 5533 case 0x19: /* ldsba, load signed byte alternate */ 5534 case 0x1a: /* ldsha, load signed halfword alternate */ 5535 case 0x1d: /* ldstuba */ 5536 case 0x1f: /* swapa */ 5537 g_assert_not_reached(); /* in decodetree */ 5538 case 0x08: /* V9 ldsw */ 5539 case 0x0b: /* V9 ldx */ 5540 case 0x18: /* V9 ldswa */ 5541 case 0x1b: /* V9 ldxa */ 5542 case 0x2d: /* V9 prefetch */ 5543 case 0x3d: /* V9 prefetcha */ 5544 goto illegal_insn; /* in decodetree */ 5545#ifdef TARGET_SPARC64 5546 case 0x30: /* V9 ldfa */ 5547 if (gen_trap_ifnofpu(dc)) { 5548 goto jmp_insn; 5549 } 5550 gen_ldf_asi(dc, cpu_addr, insn, 4, rd); 5551 gen_update_fprs_dirty(dc, rd); 5552 goto skip_move; 5553 case 0x33: /* V9 lddfa */ 5554 if (gen_trap_ifnofpu(dc)) { 5555 goto jmp_insn; 5556 } 5557 gen_ldf_asi(dc, cpu_addr, insn, 8, DFPREG(rd)); 5558 gen_update_fprs_dirty(dc, DFPREG(rd)); 5559 goto skip_move; 5560 case 0x32: /* V9 ldqfa */ 5561 CHECK_FPU_FEATURE(dc, FLOAT128); 5562 if (gen_trap_ifnofpu(dc)) { 5563 goto jmp_insn; 5564 } 5565 gen_ldf_asi(dc, cpu_addr, insn, 16, QFPREG(rd)); 5566 gen_update_fprs_dirty(dc, QFPREG(rd)); 5567 goto skip_move; 5568#endif 5569 default: 5570 goto illegal_insn; 5571 } 5572 gen_store_gpr(dc, rd, cpu_val); 5573#if defined(TARGET_SPARC64) 5574 skip_move: ; 5575#endif | 5501 goto illegal_insn; /* in decodetree */ |
5576 } else if (xop >= 0x20 && xop < 0x24) { 5577 if (gen_trap_ifnofpu(dc)) { 5578 goto jmp_insn; 5579 } 5580 switch (xop) { 5581 case 0x20: /* ldf, load fpreg */ 5582 case 0x22: /* ldqf, load quad fpreg */ 5583 case 0x23: /* lddf, load double fpreg */ --- 39 unchanged lines hidden (view full) --- 5623 tcg_gen_qemu_st_tl(cpu_fsr, cpu_addr, 5624 dc->mem_idx, MO_TEUL | MO_ALIGN); 5625 } 5626 break; 5627 default: 5628 goto illegal_insn; 5629 } 5630 } else if (xop > 0x33 && xop < 0x3f) { | 5502 } else if (xop >= 0x20 && xop < 0x24) { 5503 if (gen_trap_ifnofpu(dc)) { 5504 goto jmp_insn; 5505 } 5506 switch (xop) { 5507 case 0x20: /* ldf, load fpreg */ 5508 case 0x22: /* ldqf, load quad fpreg */ 5509 case 0x23: /* lddf, load double fpreg */ --- 39 unchanged lines hidden (view full) --- 5549 tcg_gen_qemu_st_tl(cpu_fsr, cpu_addr, 5550 dc->mem_idx, MO_TEUL | MO_ALIGN); 5551 } 5552 break; 5553 default: 5554 goto illegal_insn; 5555 } 5556 } else if (xop > 0x33 && xop < 0x3f) { |
5631 switch (xop) { 5632#ifdef TARGET_SPARC64 5633 case 0x34: /* V9 stfa */ 5634 if (gen_trap_ifnofpu(dc)) { 5635 goto jmp_insn; 5636 } 5637 gen_stf_asi(dc, cpu_addr, insn, 4, rd); 5638 break; 5639 case 0x36: /* V9 stqfa */ 5640 { 5641 CHECK_FPU_FEATURE(dc, FLOAT128); 5642 if (gen_trap_ifnofpu(dc)) { 5643 goto jmp_insn; 5644 } 5645 gen_stf_asi(dc, cpu_addr, insn, 16, QFPREG(rd)); 5646 } 5647 break; 5648 case 0x37: /* V9 stdfa */ 5649 if (gen_trap_ifnofpu(dc)) { 5650 goto jmp_insn; 5651 } 5652 gen_stf_asi(dc, cpu_addr, insn, 8, DFPREG(rd)); 5653 break; 5654#endif 5655 case 0x3e: /* V9 casxa */ 5656 case 0x3c: /* V9 or LEON3 casa */ 5657 goto illegal_insn; /* in decodetree */ 5658 default: 5659 goto illegal_insn; 5660 } | 5557 goto illegal_insn; /* in decodetree */ |
5661 } else { 5662 goto illegal_insn; 5663 } 5664 } 5665 break; 5666 } 5667 advance_pc(dc); 5668 jmp_insn: --- 287 unchanged lines hidden --- | 5558 } else { 5559 goto illegal_insn; 5560 } 5561 } 5562 break; 5563 } 5564 advance_pc(dc); 5565 jmp_insn: --- 287 unchanged lines hidden --- |