Commit 0425bee563a2748341488bd4ce4bdf33dd7e6fea
1 parent
a768e4b2
Discard unused data, use less temps
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4073 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
237 additions
and
365 deletions
target-sparc/translate.c
| ... | ... | @@ -362,11 +362,8 @@ static inline void gen_mov_reg_C(TCGv reg, TCGv src) |
| 362 | 362 | |
| 363 | 363 | static inline void gen_op_exception(int exception) |
| 364 | 364 | { |
| 365 | - TCGv r_except; | |
| 366 | - | |
| 367 | - r_except = tcg_temp_new(TCG_TYPE_I32); | |
| 368 | - tcg_gen_movi_i32(r_except, exception); | |
| 369 | - tcg_gen_helper_0_1(raise_exception, r_except); | |
| 365 | + tcg_gen_movi_i32(cpu_tmp0, exception); | |
| 366 | + tcg_gen_helper_0_1(raise_exception, cpu_tmp0); | |
| 370 | 367 | } |
| 371 | 368 | |
| 372 | 369 | static inline void gen_cc_clear(void) |
| ... | ... | @@ -386,15 +383,13 @@ static inline void gen_cc_clear(void) |
| 386 | 383 | static inline void gen_cc_NZ(TCGv dst) |
| 387 | 384 | { |
| 388 | 385 | int l1, l2; |
| 389 | - TCGv r_zero; | |
| 390 | 386 | |
| 391 | 387 | l1 = gen_new_label(); |
| 392 | 388 | l2 = gen_new_label(); |
| 393 | - r_zero = tcg_const_tl(0); | |
| 394 | - tcg_gen_brcond_i32(TCG_COND_NE, dst, r_zero, l1); | |
| 389 | + tcg_gen_brcond_i32(TCG_COND_NE, dst, tcg_const_i32(0), l1); | |
| 395 | 390 | tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_ZERO); |
| 396 | 391 | gen_set_label(l1); |
| 397 | - tcg_gen_brcond_i32(TCG_COND_GE, dst, r_zero, l2); | |
| 392 | + tcg_gen_brcond_i32(TCG_COND_GE, dst, tcg_const_i32(0), l2); | |
| 398 | 393 | tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_NEG); |
| 399 | 394 | gen_set_label(l2); |
| 400 | 395 | #ifdef TARGET_SPARC64 |
| ... | ... | @@ -403,10 +398,10 @@ static inline void gen_cc_NZ(TCGv dst) |
| 403 | 398 | |
| 404 | 399 | l3 = gen_new_label(); |
| 405 | 400 | l4 = gen_new_label(); |
| 406 | - tcg_gen_brcond_tl(TCG_COND_NE, dst, r_zero, l3); | |
| 401 | + tcg_gen_brcond_tl(TCG_COND_NE, dst, tcg_const_tl(0), l3); | |
| 407 | 402 | tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_ZERO); |
| 408 | 403 | gen_set_label(l3); |
| 409 | - tcg_gen_brcond_tl(TCG_COND_GE, dst, r_zero, l4); | |
| 404 | + tcg_gen_brcond_tl(TCG_COND_GE, dst, tcg_const_tl(0), l4); | |
| 410 | 405 | tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_NEG); |
| 411 | 406 | gen_set_label(l4); |
| 412 | 407 | } |
| ... | ... | @@ -443,21 +438,18 @@ static inline void gen_cc_C_add(TCGv dst, TCGv src1) |
| 443 | 438 | */ |
| 444 | 439 | static inline void gen_cc_V_add(TCGv dst, TCGv src1, TCGv src2) |
| 445 | 440 | { |
| 446 | - TCGv r_temp, r_temp2, r_temp3, r_zero; | |
| 441 | + TCGv r_temp; | |
| 447 | 442 | int l1; |
| 448 | 443 | |
| 449 | 444 | l1 = gen_new_label(); |
| 450 | 445 | |
| 451 | 446 | r_temp = tcg_temp_new(TCG_TYPE_TL); |
| 452 | - r_temp2 = tcg_temp_new(TCG_TYPE_TL); | |
| 453 | - r_temp3 = tcg_temp_new(TCG_TYPE_TL); | |
| 454 | - r_zero = tcg_const_tl(0); | |
| 455 | 447 | tcg_gen_xor_tl(r_temp, src1, src2); |
| 456 | 448 | tcg_gen_xori_tl(r_temp, r_temp, -1); |
| 457 | - tcg_gen_xor_tl(r_temp2, src1, dst); | |
| 458 | - tcg_gen_and_tl(r_temp, r_temp, r_temp2); | |
| 459 | - tcg_gen_andi_tl(r_temp3, r_temp, (1 << 31)); | |
| 460 | - tcg_gen_brcond_i32(TCG_COND_EQ, r_temp3, r_zero, l1); | |
| 449 | + tcg_gen_xor_tl(cpu_tmp0, src1, dst); | |
| 450 | + tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); | |
| 451 | + tcg_gen_andi_tl(r_temp, r_temp, (1 << 31)); | |
| 452 | + tcg_gen_brcond_i32(TCG_COND_EQ, r_temp, tcg_const_i32(0), l1); | |
| 461 | 453 | tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF); |
| 462 | 454 | gen_set_label(l1); |
| 463 | 455 | #ifdef TARGET_SPARC64 |
| ... | ... | @@ -467,33 +459,31 @@ static inline void gen_cc_V_add(TCGv dst, TCGv src1, TCGv src2) |
| 467 | 459 | l2 = gen_new_label(); |
| 468 | 460 | tcg_gen_xor_tl(r_temp, src1, src2); |
| 469 | 461 | tcg_gen_xori_tl(r_temp, r_temp, -1); |
| 470 | - tcg_gen_xor_tl(r_temp2, src1, dst); | |
| 471 | - tcg_gen_and_tl(r_temp, r_temp, r_temp2); | |
| 472 | - tcg_gen_andi_tl(r_temp3, r_temp, (1ULL << 63)); | |
| 473 | - tcg_gen_brcond_tl(TCG_COND_EQ, r_temp3, r_zero, l2); | |
| 462 | + tcg_gen_xor_tl(cpu_tmp0, src1, dst); | |
| 463 | + tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); | |
| 464 | + tcg_gen_andi_tl(r_temp, r_temp, (1ULL << 63)); | |
| 465 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l2); | |
| 474 | 466 | tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_OVF); |
| 475 | 467 | gen_set_label(l2); |
| 476 | 468 | } |
| 477 | 469 | #endif |
| 470 | + tcg_gen_discard_tl(r_temp); | |
| 478 | 471 | } |
| 479 | 472 | |
| 480 | 473 | static inline void gen_add_tv(TCGv dst, TCGv src1, TCGv src2) |
| 481 | 474 | { |
| 482 | - TCGv r_temp, r_temp2, r_temp3, r_zero; | |
| 475 | + TCGv r_temp; | |
| 483 | 476 | int l1; |
| 484 | 477 | |
| 485 | 478 | l1 = gen_new_label(); |
| 486 | 479 | |
| 487 | 480 | r_temp = tcg_temp_new(TCG_TYPE_TL); |
| 488 | - r_temp2 = tcg_temp_new(TCG_TYPE_TL); | |
| 489 | - r_temp3 = tcg_temp_new(TCG_TYPE_TL); | |
| 490 | - r_zero = tcg_const_tl(0); | |
| 491 | 481 | tcg_gen_xor_tl(r_temp, src1, src2); |
| 492 | 482 | tcg_gen_xori_tl(r_temp, r_temp, -1); |
| 493 | - tcg_gen_xor_tl(r_temp2, src1, dst); | |
| 494 | - tcg_gen_and_tl(r_temp, r_temp, r_temp2); | |
| 495 | - tcg_gen_andi_tl(r_temp3, r_temp, (1 << 31)); | |
| 496 | - tcg_gen_brcond_i32(TCG_COND_EQ, r_temp3, r_zero, l1); | |
| 483 | + tcg_gen_xor_tl(cpu_tmp0, src1, dst); | |
| 484 | + tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); | |
| 485 | + tcg_gen_andi_tl(r_temp, r_temp, (1 << 31)); | |
| 486 | + tcg_gen_brcond_i32(TCG_COND_EQ, r_temp, tcg_const_i32(0), l1); | |
| 497 | 487 | gen_op_exception(TT_TOVF); |
| 498 | 488 | gen_set_label(l1); |
| 499 | 489 | #ifdef TARGET_SPARC64 |
| ... | ... | @@ -503,27 +493,25 @@ static inline void gen_add_tv(TCGv dst, TCGv src1, TCGv src2) |
| 503 | 493 | l2 = gen_new_label(); |
| 504 | 494 | tcg_gen_xor_tl(r_temp, src1, src2); |
| 505 | 495 | tcg_gen_xori_tl(r_temp, r_temp, -1); |
| 506 | - tcg_gen_xor_tl(r_temp2, src1, dst); | |
| 507 | - tcg_gen_and_tl(r_temp, r_temp, r_temp2); | |
| 508 | - tcg_gen_andi_tl(r_temp3, r_temp, (1ULL << 63)); | |
| 509 | - tcg_gen_brcond_tl(TCG_COND_EQ, r_temp3, r_zero, l2); | |
| 496 | + tcg_gen_xor_tl(cpu_tmp0, src1, dst); | |
| 497 | + tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); | |
| 498 | + tcg_gen_andi_tl(r_temp, r_temp, (1ULL << 63)); | |
| 499 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l2); | |
| 510 | 500 | gen_op_exception(TT_TOVF); |
| 511 | 501 | gen_set_label(l2); |
| 512 | 502 | } |
| 513 | 503 | #endif |
| 504 | + tcg_gen_discard_tl(r_temp); | |
| 514 | 505 | } |
| 515 | 506 | |
| 516 | 507 | static inline void gen_cc_V_tag(TCGv src1, TCGv src2) |
| 517 | 508 | { |
| 518 | 509 | int l1; |
| 519 | - TCGv r_zero, r_temp; | |
| 520 | 510 | |
| 521 | 511 | l1 = gen_new_label(); |
| 522 | - r_zero = tcg_const_tl(0); | |
| 523 | - r_temp = tcg_temp_new(TCG_TYPE_TL); | |
| 524 | - tcg_gen_or_tl(r_temp, src1, src2); | |
| 525 | - tcg_gen_andi_tl(r_temp, r_temp, 0x3); | |
| 526 | - tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, r_zero, l1); | |
| 512 | + tcg_gen_or_tl(cpu_tmp0, src1, src2); | |
| 513 | + tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, 0x3); | |
| 514 | + tcg_gen_brcond_tl(TCG_COND_EQ, cpu_tmp0, tcg_const_tl(0), l1); | |
| 527 | 515 | tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF); |
| 528 | 516 | gen_set_label(l1); |
| 529 | 517 | } |
| ... | ... | @@ -531,14 +519,11 @@ static inline void gen_cc_V_tag(TCGv src1, TCGv src2) |
| 531 | 519 | static inline void gen_tag_tv(TCGv src1, TCGv src2) |
| 532 | 520 | { |
| 533 | 521 | int l1; |
| 534 | - TCGv r_zero, r_temp; | |
| 535 | 522 | |
| 536 | 523 | l1 = gen_new_label(); |
| 537 | - r_zero = tcg_const_tl(0); | |
| 538 | - r_temp = tcg_temp_new(TCG_TYPE_TL); | |
| 539 | - tcg_gen_or_tl(r_temp, src1, src2); | |
| 540 | - tcg_gen_andi_tl(r_temp, r_temp, 0x3); | |
| 541 | - tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, r_zero, l1); | |
| 524 | + tcg_gen_or_tl(cpu_tmp0, src1, src2); | |
| 525 | + tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, 0x3); | |
| 526 | + tcg_gen_brcond_tl(TCG_COND_EQ, cpu_tmp0, tcg_const_tl(0), l1); | |
| 542 | 527 | gen_op_exception(TT_TOVF); |
| 543 | 528 | gen_set_label(l1); |
| 544 | 529 | } |
| ... | ... | @@ -618,20 +603,17 @@ static inline void gen_cc_C_sub(TCGv src1, TCGv src2) |
| 618 | 603 | */ |
| 619 | 604 | static inline void gen_cc_V_sub(TCGv dst, TCGv src1, TCGv src2) |
| 620 | 605 | { |
| 621 | - TCGv r_temp, r_temp2, r_temp3, r_zero; | |
| 606 | + TCGv r_temp; | |
| 622 | 607 | int l1; |
| 623 | 608 | |
| 624 | 609 | l1 = gen_new_label(); |
| 625 | 610 | |
| 626 | 611 | r_temp = tcg_temp_new(TCG_TYPE_TL); |
| 627 | - r_temp2 = tcg_temp_new(TCG_TYPE_TL); | |
| 628 | - r_temp3 = tcg_temp_new(TCG_TYPE_TL); | |
| 629 | - r_zero = tcg_const_tl(0); | |
| 630 | 612 | tcg_gen_xor_tl(r_temp, src1, src2); |
| 631 | - tcg_gen_xor_tl(r_temp2, src1, dst); | |
| 632 | - tcg_gen_and_tl(r_temp, r_temp, r_temp2); | |
| 633 | - tcg_gen_andi_tl(r_temp3, r_temp, (1 << 31)); | |
| 634 | - tcg_gen_brcond_i32(TCG_COND_EQ, r_temp3, r_zero, l1); | |
| 613 | + tcg_gen_xor_tl(cpu_tmp0, src1, dst); | |
| 614 | + tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); | |
| 615 | + tcg_gen_andi_tl(r_temp, r_temp, (1 << 31)); | |
| 616 | + tcg_gen_brcond_i32(TCG_COND_EQ, r_temp, tcg_const_i32(0), l1); | |
| 635 | 617 | tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF); |
| 636 | 618 | gen_set_label(l1); |
| 637 | 619 | #ifdef TARGET_SPARC64 |
| ... | ... | @@ -640,32 +622,30 @@ static inline void gen_cc_V_sub(TCGv dst, TCGv src1, TCGv src2) |
| 640 | 622 | |
| 641 | 623 | l2 = gen_new_label(); |
| 642 | 624 | tcg_gen_xor_tl(r_temp, src1, src2); |
| 643 | - tcg_gen_xor_tl(r_temp2, src1, dst); | |
| 644 | - tcg_gen_and_tl(r_temp, r_temp, r_temp2); | |
| 645 | - tcg_gen_andi_tl(r_temp3, r_temp, (1ULL << 63)); | |
| 646 | - tcg_gen_brcond_tl(TCG_COND_EQ, r_temp3, r_zero, l2); | |
| 625 | + tcg_gen_xor_tl(cpu_tmp0, src1, dst); | |
| 626 | + tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); | |
| 627 | + tcg_gen_andi_tl(r_temp, r_temp, (1ULL << 63)); | |
| 628 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l2); | |
| 647 | 629 | tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_OVF); |
| 648 | 630 | gen_set_label(l2); |
| 649 | 631 | } |
| 650 | 632 | #endif |
| 633 | + tcg_gen_discard_tl(r_temp); | |
| 651 | 634 | } |
| 652 | 635 | |
| 653 | 636 | static inline void gen_sub_tv(TCGv dst, TCGv src1, TCGv src2) |
| 654 | 637 | { |
| 655 | - TCGv r_temp, r_temp2, r_temp3, r_zero; | |
| 638 | + TCGv r_temp; | |
| 656 | 639 | int l1; |
| 657 | 640 | |
| 658 | 641 | l1 = gen_new_label(); |
| 659 | 642 | |
| 660 | 643 | r_temp = tcg_temp_new(TCG_TYPE_TL); |
| 661 | - r_temp2 = tcg_temp_new(TCG_TYPE_TL); | |
| 662 | - r_temp3 = tcg_temp_new(TCG_TYPE_TL); | |
| 663 | - r_zero = tcg_const_tl(0); | |
| 664 | 644 | tcg_gen_xor_tl(r_temp, src1, src2); |
| 665 | - tcg_gen_xor_tl(r_temp2, src1, dst); | |
| 666 | - tcg_gen_and_tl(r_temp, r_temp, r_temp2); | |
| 667 | - tcg_gen_andi_tl(r_temp3, r_temp, (1 << 31)); | |
| 668 | - tcg_gen_brcond_i32(TCG_COND_EQ, r_temp3, r_zero, l1); | |
| 645 | + tcg_gen_xor_tl(cpu_tmp0, src1, dst); | |
| 646 | + tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); | |
| 647 | + tcg_gen_andi_tl(r_temp, r_temp, (1 << 31)); | |
| 648 | + tcg_gen_brcond_i32(TCG_COND_EQ, r_temp, tcg_const_i32(0), l1); | |
| 669 | 649 | gen_op_exception(TT_TOVF); |
| 670 | 650 | gen_set_label(l1); |
| 671 | 651 | #ifdef TARGET_SPARC64 |
| ... | ... | @@ -674,14 +654,15 @@ static inline void gen_sub_tv(TCGv dst, TCGv src1, TCGv src2) |
| 674 | 654 | |
| 675 | 655 | l2 = gen_new_label(); |
| 676 | 656 | tcg_gen_xor_tl(r_temp, src1, src2); |
| 677 | - tcg_gen_xor_tl(r_temp2, src1, dst); | |
| 678 | - tcg_gen_and_tl(r_temp, r_temp, r_temp2); | |
| 679 | - tcg_gen_andi_tl(r_temp3, r_temp, (1ULL << 63)); | |
| 680 | - tcg_gen_brcond_tl(TCG_COND_EQ, r_temp3, r_zero, l2); | |
| 657 | + tcg_gen_xor_tl(cpu_tmp0, src1, dst); | |
| 658 | + tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); | |
| 659 | + tcg_gen_andi_tl(r_temp, r_temp, (1ULL << 63)); | |
| 660 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l2); | |
| 681 | 661 | gen_op_exception(TT_TOVF); |
| 682 | 662 | gen_set_label(l2); |
| 683 | 663 | } |
| 684 | 664 | #endif |
| 665 | + tcg_gen_discard_tl(r_temp); | |
| 685 | 666 | } |
| 686 | 667 | |
| 687 | 668 | static inline void gen_op_sub_T1_T0_cc(void) |
| ... | ... | @@ -760,13 +741,11 @@ static inline void gen_op_sdivx_T1_T0(void) |
| 760 | 741 | static inline void gen_op_div_cc(void) |
| 761 | 742 | { |
| 762 | 743 | int l1; |
| 763 | - TCGv r_zero; | |
| 764 | 744 | |
| 765 | 745 | gen_cc_clear(); |
| 766 | 746 | gen_cc_NZ(cpu_T[0]); |
| 767 | 747 | l1 = gen_new_label(); |
| 768 | - r_zero = tcg_const_tl(0); | |
| 769 | - tcg_gen_brcond_i32(TCG_COND_EQ, cpu_T[1], r_zero, l1); | |
| 748 | + tcg_gen_brcond_i32(TCG_COND_EQ, cpu_T[1], tcg_const_i32(0), l1); | |
| 770 | 749 | tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF); |
| 771 | 750 | gen_set_label(l1); |
| 772 | 751 | } |
| ... | ... | @@ -792,36 +771,27 @@ static inline void gen_op_eval_be(TCGv dst, TCGv src) |
| 792 | 771 | // Z | (N ^ V) |
| 793 | 772 | static inline void gen_op_eval_ble(TCGv dst, TCGv src) |
| 794 | 773 | { |
| 795 | - TCGv r_flag; | |
| 796 | - | |
| 797 | - r_flag = tcg_temp_new(TCG_TYPE_TL); | |
| 798 | - gen_mov_reg_N(r_flag, src); | |
| 774 | + gen_mov_reg_N(cpu_tmp0, src); | |
| 799 | 775 | gen_mov_reg_V(dst, src); |
| 800 | - tcg_gen_xor_tl(dst, dst, r_flag); | |
| 801 | - gen_mov_reg_Z(r_flag, src); | |
| 802 | - tcg_gen_or_tl(dst, dst, r_flag); | |
| 776 | + tcg_gen_xor_tl(dst, dst, cpu_tmp0); | |
| 777 | + gen_mov_reg_Z(cpu_tmp0, src); | |
| 778 | + tcg_gen_or_tl(dst, dst, cpu_tmp0); | |
| 803 | 779 | } |
| 804 | 780 | |
| 805 | 781 | // N ^ V |
| 806 | 782 | static inline void gen_op_eval_bl(TCGv dst, TCGv src) |
| 807 | 783 | { |
| 808 | - TCGv r_V; | |
| 809 | - | |
| 810 | - r_V = tcg_temp_new(TCG_TYPE_TL); | |
| 811 | - gen_mov_reg_V(r_V, src); | |
| 784 | + gen_mov_reg_V(cpu_tmp0, src); | |
| 812 | 785 | gen_mov_reg_N(dst, src); |
| 813 | - tcg_gen_xor_tl(dst, dst, r_V); | |
| 786 | + tcg_gen_xor_tl(dst, dst, cpu_tmp0); | |
| 814 | 787 | } |
| 815 | 788 | |
| 816 | 789 | // C | Z |
| 817 | 790 | static inline void gen_op_eval_bleu(TCGv dst, TCGv src) |
| 818 | 791 | { |
| 819 | - TCGv r_Z; | |
| 820 | - | |
| 821 | - r_Z = tcg_temp_new(TCG_TYPE_TL); | |
| 822 | - gen_mov_reg_Z(r_Z, src); | |
| 792 | + gen_mov_reg_Z(cpu_tmp0, src); | |
| 823 | 793 | gen_mov_reg_C(dst, src); |
| 824 | - tcg_gen_or_tl(dst, dst, r_Z); | |
| 794 | + tcg_gen_or_tl(dst, dst, cpu_tmp0); | |
| 825 | 795 | } |
| 826 | 796 | |
| 827 | 797 | // C |
| ... | ... | @@ -858,38 +828,29 @@ static inline void gen_op_eval_bne(TCGv dst, TCGv src) |
| 858 | 828 | // !(Z | (N ^ V)) |
| 859 | 829 | static inline void gen_op_eval_bg(TCGv dst, TCGv src) |
| 860 | 830 | { |
| 861 | - TCGv r_flag; | |
| 862 | - | |
| 863 | - r_flag = tcg_temp_new(TCG_TYPE_TL); | |
| 864 | - gen_mov_reg_N(r_flag, src); | |
| 831 | + gen_mov_reg_N(cpu_tmp0, src); | |
| 865 | 832 | gen_mov_reg_V(dst, src); |
| 866 | - tcg_gen_xor_tl(dst, dst, r_flag); | |
| 867 | - gen_mov_reg_Z(r_flag, src); | |
| 868 | - tcg_gen_or_tl(dst, dst, r_flag); | |
| 833 | + tcg_gen_xor_tl(dst, dst, cpu_tmp0); | |
| 834 | + gen_mov_reg_Z(cpu_tmp0, src); | |
| 835 | + tcg_gen_or_tl(dst, dst, cpu_tmp0); | |
| 869 | 836 | tcg_gen_xori_tl(dst, dst, 0x1); |
| 870 | 837 | } |
| 871 | 838 | |
| 872 | 839 | // !(N ^ V) |
| 873 | 840 | static inline void gen_op_eval_bge(TCGv dst, TCGv src) |
| 874 | 841 | { |
| 875 | - TCGv r_V; | |
| 876 | - | |
| 877 | - r_V = tcg_temp_new(TCG_TYPE_TL); | |
| 878 | - gen_mov_reg_V(r_V, src); | |
| 842 | + gen_mov_reg_V(cpu_tmp0, src); | |
| 879 | 843 | gen_mov_reg_N(dst, src); |
| 880 | - tcg_gen_xor_tl(dst, dst, r_V); | |
| 844 | + tcg_gen_xor_tl(dst, dst, cpu_tmp0); | |
| 881 | 845 | tcg_gen_xori_tl(dst, dst, 0x1); |
| 882 | 846 | } |
| 883 | 847 | |
| 884 | 848 | // !(C | Z) |
| 885 | 849 | static inline void gen_op_eval_bgu(TCGv dst, TCGv src) |
| 886 | 850 | { |
| 887 | - TCGv r_Z; | |
| 888 | - | |
| 889 | - r_Z = tcg_temp_new(TCG_TYPE_TL); | |
| 890 | - gen_mov_reg_Z(r_Z, src); | |
| 851 | + gen_mov_reg_Z(cpu_tmp0, src); | |
| 891 | 852 | gen_mov_reg_C(dst, src); |
| 892 | - tcg_gen_or_tl(dst, dst, r_Z); | |
| 853 | + tcg_gen_or_tl(dst, dst, cpu_tmp0); | |
| 893 | 854 | tcg_gen_xori_tl(dst, dst, 0x1); |
| 894 | 855 | } |
| 895 | 856 | |
| ... | ... | @@ -939,24 +900,18 @@ static inline void gen_mov_reg_FCC1(TCGv reg, TCGv src, |
| 939 | 900 | static inline void gen_op_eval_fbne(TCGv dst, TCGv src, |
| 940 | 901 | unsigned int fcc_offset) |
| 941 | 902 | { |
| 942 | - TCGv r_fcc1; | |
| 943 | - | |
| 944 | - r_fcc1 = tcg_temp_new(TCG_TYPE_TL); | |
| 945 | 903 | gen_mov_reg_FCC0(dst, src, fcc_offset); |
| 946 | - gen_mov_reg_FCC1(r_fcc1, src, fcc_offset); | |
| 947 | - tcg_gen_or_tl(dst, dst, r_fcc1); | |
| 904 | + gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); | |
| 905 | + tcg_gen_or_tl(dst, dst, cpu_tmp0); | |
| 948 | 906 | } |
| 949 | 907 | |
| 950 | 908 | // 1 or 2: FCC0 ^ FCC1 |
| 951 | 909 | static inline void gen_op_eval_fblg(TCGv dst, TCGv src, |
| 952 | 910 | unsigned int fcc_offset) |
| 953 | 911 | { |
| 954 | - TCGv r_fcc1; | |
| 955 | - | |
| 956 | - r_fcc1 = tcg_temp_new(TCG_TYPE_TL); | |
| 957 | 912 | gen_mov_reg_FCC0(dst, src, fcc_offset); |
| 958 | - gen_mov_reg_FCC1(r_fcc1, src, fcc_offset); | |
| 959 | - tcg_gen_xor_tl(dst, dst, r_fcc1); | |
| 913 | + gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); | |
| 914 | + tcg_gen_xor_tl(dst, dst, cpu_tmp0); | |
| 960 | 915 | } |
| 961 | 916 | |
| 962 | 917 | // 1 or 3: FCC0 |
| ... | ... | @@ -970,13 +925,10 @@ static inline void gen_op_eval_fbul(TCGv dst, TCGv src, |
| 970 | 925 | static inline void gen_op_eval_fbl(TCGv dst, TCGv src, |
| 971 | 926 | unsigned int fcc_offset) |
| 972 | 927 | { |
| 973 | - TCGv r_fcc1; | |
| 974 | - | |
| 975 | - r_fcc1 = tcg_temp_new(TCG_TYPE_TL); | |
| 976 | 928 | gen_mov_reg_FCC0(dst, src, fcc_offset); |
| 977 | - gen_mov_reg_FCC1(r_fcc1, src, fcc_offset); | |
| 978 | - tcg_gen_xori_tl(r_fcc1, r_fcc1, 0x1); | |
| 979 | - tcg_gen_and_tl(dst, dst, r_fcc1); | |
| 929 | + gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); | |
| 930 | + tcg_gen_xori_tl(cpu_tmp0, cpu_tmp0, 0x1); | |
| 931 | + tcg_gen_and_tl(dst, dst, cpu_tmp0); | |
| 980 | 932 | } |
| 981 | 933 | |
| 982 | 934 | // 2 or 3: FCC1 |
| ... | ... | @@ -990,37 +942,28 @@ static inline void gen_op_eval_fbug(TCGv dst, TCGv src, |
| 990 | 942 | static inline void gen_op_eval_fbg(TCGv dst, TCGv src, |
| 991 | 943 | unsigned int fcc_offset) |
| 992 | 944 | { |
| 993 | - TCGv r_fcc1; | |
| 994 | - | |
| 995 | - r_fcc1 = tcg_temp_new(TCG_TYPE_TL); | |
| 996 | 945 | gen_mov_reg_FCC0(dst, src, fcc_offset); |
| 997 | 946 | tcg_gen_xori_tl(dst, dst, 0x1); |
| 998 | - gen_mov_reg_FCC1(r_fcc1, src, fcc_offset); | |
| 999 | - tcg_gen_and_tl(dst, dst, r_fcc1); | |
| 947 | + gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); | |
| 948 | + tcg_gen_and_tl(dst, dst, cpu_tmp0); | |
| 1000 | 949 | } |
| 1001 | 950 | |
| 1002 | 951 | // 3: FCC0 & FCC1 |
| 1003 | 952 | static inline void gen_op_eval_fbu(TCGv dst, TCGv src, |
| 1004 | 953 | unsigned int fcc_offset) |
| 1005 | 954 | { |
| 1006 | - TCGv r_fcc1; | |
| 1007 | - | |
| 1008 | - r_fcc1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1009 | 955 | gen_mov_reg_FCC0(dst, src, fcc_offset); |
| 1010 | - gen_mov_reg_FCC1(r_fcc1, src, fcc_offset); | |
| 1011 | - tcg_gen_and_tl(dst, dst, r_fcc1); | |
| 956 | + gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); | |
| 957 | + tcg_gen_and_tl(dst, dst, cpu_tmp0); | |
| 1012 | 958 | } |
| 1013 | 959 | |
| 1014 | 960 | // 0: !(FCC0 | FCC1) |
| 1015 | 961 | static inline void gen_op_eval_fbe(TCGv dst, TCGv src, |
| 1016 | 962 | unsigned int fcc_offset) |
| 1017 | 963 | { |
| 1018 | - TCGv r_fcc1; | |
| 1019 | - | |
| 1020 | - r_fcc1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1021 | 964 | gen_mov_reg_FCC0(dst, src, fcc_offset); |
| 1022 | - gen_mov_reg_FCC1(r_fcc1, src, fcc_offset); | |
| 1023 | - tcg_gen_or_tl(dst, dst, r_fcc1); | |
| 965 | + gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); | |
| 966 | + tcg_gen_or_tl(dst, dst, cpu_tmp0); | |
| 1024 | 967 | tcg_gen_xori_tl(dst, dst, 0x1); |
| 1025 | 968 | } |
| 1026 | 969 | |
| ... | ... | @@ -1028,12 +971,9 @@ static inline void gen_op_eval_fbe(TCGv dst, TCGv src, |
| 1028 | 971 | static inline void gen_op_eval_fbue(TCGv dst, TCGv src, |
| 1029 | 972 | unsigned int fcc_offset) |
| 1030 | 973 | { |
| 1031 | - TCGv r_fcc1; | |
| 1032 | - | |
| 1033 | - r_fcc1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1034 | 974 | gen_mov_reg_FCC0(dst, src, fcc_offset); |
| 1035 | - gen_mov_reg_FCC1(r_fcc1, src, fcc_offset); | |
| 1036 | - tcg_gen_xor_tl(dst, dst, r_fcc1); | |
| 975 | + gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); | |
| 976 | + tcg_gen_xor_tl(dst, dst, cpu_tmp0); | |
| 1037 | 977 | tcg_gen_xori_tl(dst, dst, 0x1); |
| 1038 | 978 | } |
| 1039 | 979 | |
| ... | ... | @@ -1049,13 +989,10 @@ static inline void gen_op_eval_fbge(TCGv dst, TCGv src, |
| 1049 | 989 | static inline void gen_op_eval_fbuge(TCGv dst, TCGv src, |
| 1050 | 990 | unsigned int fcc_offset) |
| 1051 | 991 | { |
| 1052 | - TCGv r_fcc1; | |
| 1053 | - | |
| 1054 | - r_fcc1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1055 | 992 | gen_mov_reg_FCC0(dst, src, fcc_offset); |
| 1056 | - gen_mov_reg_FCC1(r_fcc1, src, fcc_offset); | |
| 1057 | - tcg_gen_xori_tl(r_fcc1, r_fcc1, 0x1); | |
| 1058 | - tcg_gen_and_tl(dst, dst, r_fcc1); | |
| 993 | + gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); | |
| 994 | + tcg_gen_xori_tl(cpu_tmp0, cpu_tmp0, 0x1); | |
| 995 | + tcg_gen_and_tl(dst, dst, cpu_tmp0); | |
| 1059 | 996 | tcg_gen_xori_tl(dst, dst, 0x1); |
| 1060 | 997 | } |
| 1061 | 998 | |
| ... | ... | @@ -1071,13 +1008,10 @@ static inline void gen_op_eval_fble(TCGv dst, TCGv src, |
| 1071 | 1008 | static inline void gen_op_eval_fbule(TCGv dst, TCGv src, |
| 1072 | 1009 | unsigned int fcc_offset) |
| 1073 | 1010 | { |
| 1074 | - TCGv r_fcc1; | |
| 1075 | - | |
| 1076 | - r_fcc1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1077 | 1011 | gen_mov_reg_FCC0(dst, src, fcc_offset); |
| 1078 | 1012 | tcg_gen_xori_tl(dst, dst, 0x1); |
| 1079 | - gen_mov_reg_FCC1(r_fcc1, src, fcc_offset); | |
| 1080 | - tcg_gen_and_tl(dst, dst, r_fcc1); | |
| 1013 | + gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); | |
| 1014 | + tcg_gen_and_tl(dst, dst, cpu_tmp0); | |
| 1081 | 1015 | tcg_gen_xori_tl(dst, dst, 0x1); |
| 1082 | 1016 | } |
| 1083 | 1017 | |
| ... | ... | @@ -1085,25 +1019,20 @@ static inline void gen_op_eval_fbule(TCGv dst, TCGv src, |
| 1085 | 1019 | static inline void gen_op_eval_fbo(TCGv dst, TCGv src, |
| 1086 | 1020 | unsigned int fcc_offset) |
| 1087 | 1021 | { |
| 1088 | - TCGv r_fcc1; | |
| 1089 | - | |
| 1090 | - r_fcc1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1091 | 1022 | gen_mov_reg_FCC0(dst, src, fcc_offset); |
| 1092 | - gen_mov_reg_FCC1(r_fcc1, src, fcc_offset); | |
| 1093 | - tcg_gen_and_tl(dst, dst, r_fcc1); | |
| 1023 | + gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); | |
| 1024 | + tcg_gen_and_tl(dst, dst, cpu_tmp0); | |
| 1094 | 1025 | tcg_gen_xori_tl(dst, dst, 0x1); |
| 1095 | 1026 | } |
| 1096 | 1027 | |
| 1097 | 1028 | static inline void gen_branch2(DisasContext *dc, target_ulong pc1, |
| 1098 | 1029 | target_ulong pc2, TCGv r_cond) |
| 1099 | 1030 | { |
| 1100 | - TCGv r_zero; | |
| 1101 | 1031 | int l1; |
| 1102 | 1032 | |
| 1103 | 1033 | l1 = gen_new_label(); |
| 1104 | - r_zero = tcg_const_tl(0); | |
| 1105 | 1034 | |
| 1106 | - tcg_gen_brcond_tl(TCG_COND_EQ, r_cond, r_zero, l1); | |
| 1035 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_cond, tcg_const_tl(0), l1); | |
| 1107 | 1036 | |
| 1108 | 1037 | gen_goto_tb(dc, 0, pc1, pc1 + 4); |
| 1109 | 1038 | |
| ... | ... | @@ -1114,13 +1043,11 @@ static inline void gen_branch2(DisasContext *dc, target_ulong pc1, |
| 1114 | 1043 | static inline void gen_branch_a(DisasContext *dc, target_ulong pc1, |
| 1115 | 1044 | target_ulong pc2, TCGv r_cond) |
| 1116 | 1045 | { |
| 1117 | - TCGv r_zero; | |
| 1118 | 1046 | int l1; |
| 1119 | 1047 | |
| 1120 | 1048 | l1 = gen_new_label(); |
| 1121 | - r_zero = tcg_const_tl(0); | |
| 1122 | 1049 | |
| 1123 | - tcg_gen_brcond_tl(TCG_COND_EQ, r_cond, r_zero, l1); | |
| 1050 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_cond, tcg_const_tl(0), l1); | |
| 1124 | 1051 | |
| 1125 | 1052 | gen_goto_tb(dc, 0, pc2, pc1); |
| 1126 | 1053 | |
| ... | ... | @@ -1137,14 +1064,12 @@ static inline void gen_branch(DisasContext *dc, target_ulong pc, |
| 1137 | 1064 | static inline void gen_generic_branch(target_ulong npc1, target_ulong npc2, |
| 1138 | 1065 | TCGv r_cond) |
| 1139 | 1066 | { |
| 1140 | - TCGv r_zero; | |
| 1141 | 1067 | int l1, l2; |
| 1142 | 1068 | |
| 1143 | 1069 | l1 = gen_new_label(); |
| 1144 | 1070 | l2 = gen_new_label(); |
| 1145 | - r_zero = tcg_const_tl(0); | |
| 1146 | 1071 | |
| 1147 | - tcg_gen_brcond_tl(TCG_COND_EQ, r_cond, r_zero, l1); | |
| 1072 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_cond, tcg_const_tl(0), l1); | |
| 1148 | 1073 | |
| 1149 | 1074 | gen_movl_npc_im(npc1); |
| 1150 | 1075 | gen_op_jmp_label(l2); |
| ... | ... | @@ -1354,13 +1279,11 @@ static const int gen_tcg_cond_reg[8] = { |
| 1354 | 1279 | |
| 1355 | 1280 | static inline void gen_cond_reg(TCGv r_dst, int cond) |
| 1356 | 1281 | { |
| 1357 | - TCGv r_zero; | |
| 1358 | 1282 | int l1; |
| 1359 | 1283 | |
| 1360 | 1284 | l1 = gen_new_label(); |
| 1361 | - r_zero = tcg_const_tl(0); | |
| 1362 | - tcg_gen_mov_tl(r_dst, r_zero); | |
| 1363 | - tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_T[0], r_zero, l1); | |
| 1285 | + tcg_gen_movi_tl(r_dst, 0); | |
| 1286 | + tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_T[0], tcg_const_tl(0), l1); | |
| 1364 | 1287 | tcg_gen_movi_tl(r_dst, 1); |
| 1365 | 1288 | gen_set_label(l1); |
| 1366 | 1289 | } |
| ... | ... | @@ -1614,175 +1537,134 @@ static inline void gen_clear_float_exceptions(void) |
| 1614 | 1537 | |
| 1615 | 1538 | /* asi moves */ |
| 1616 | 1539 | #ifdef TARGET_SPARC64 |
| 1617 | -static inline void gen_ld_asi(int insn, int size, int sign) | |
| 1540 | +static inline TCGv gen_get_asi(int insn, TCGv r_addr) | |
| 1618 | 1541 | { |
| 1619 | 1542 | int asi, offset; |
| 1620 | - TCGv r_size, r_sign; | |
| 1543 | + TCGv r_asi; | |
| 1621 | 1544 | |
| 1622 | - r_size = tcg_temp_new(TCG_TYPE_I32); | |
| 1623 | - r_sign = tcg_temp_new(TCG_TYPE_I32); | |
| 1624 | - tcg_gen_movi_i32(r_size, size); | |
| 1625 | - tcg_gen_movi_i32(r_sign, sign); | |
| 1626 | 1545 | if (IS_IMM) { |
| 1546 | + r_asi = tcg_temp_new(TCG_TYPE_I32); | |
| 1627 | 1547 | offset = GET_FIELD(insn, 25, 31); |
| 1628 | - tcg_gen_addi_tl(cpu_T[0], cpu_T[0], offset); | |
| 1629 | - tcg_gen_ld_i32(cpu_T[1], cpu_env, offsetof(CPUSPARCState, asi)); | |
| 1548 | + tcg_gen_addi_tl(r_addr, r_addr, offset); | |
| 1549 | + tcg_gen_ld_i32(r_asi, cpu_env, offsetof(CPUSPARCState, asi)); | |
| 1630 | 1550 | } else { |
| 1631 | 1551 | asi = GET_FIELD(insn, 19, 26); |
| 1632 | - tcg_gen_movi_i32(cpu_T[1], asi); | |
| 1552 | + r_asi = tcg_const_i32(asi); | |
| 1633 | 1553 | } |
| 1634 | - tcg_gen_helper_1_4(helper_ld_asi, cpu_T[1], cpu_T[0], cpu_T[1], r_size, | |
| 1635 | - r_sign); | |
| 1554 | + return r_asi; | |
| 1555 | +} | |
| 1556 | + | |
| 1557 | +static inline void gen_ld_asi(int insn, int size, int sign) | |
| 1558 | +{ | |
| 1559 | + TCGv r_asi; | |
| 1560 | + | |
| 1561 | + r_asi = gen_get_asi(insn, cpu_T[0]); | |
| 1562 | + tcg_gen_helper_1_4(helper_ld_asi, cpu_T[1], cpu_T[0], r_asi, | |
| 1563 | + tcg_const_i32(size), tcg_const_i32(sign)); | |
| 1564 | + tcg_gen_discard_i32(r_asi); | |
| 1636 | 1565 | } |
| 1637 | 1566 | |
| 1638 | 1567 | static inline void gen_st_asi(int insn, int size) |
| 1639 | 1568 | { |
| 1640 | - int asi, offset; | |
| 1641 | - TCGv r_asi, r_size; | |
| 1569 | + TCGv r_asi; | |
| 1642 | 1570 | |
| 1643 | - r_asi = tcg_temp_new(TCG_TYPE_I32); | |
| 1644 | - r_size = tcg_temp_new(TCG_TYPE_I32); | |
| 1645 | - tcg_gen_movi_i32(r_size, size); | |
| 1646 | - if (IS_IMM) { | |
| 1647 | - offset = GET_FIELD(insn, 25, 31); | |
| 1648 | - tcg_gen_addi_tl(cpu_T[0], cpu_T[0], offset); | |
| 1649 | - tcg_gen_ld_i32(r_asi, cpu_env, offsetof(CPUSPARCState, asi)); | |
| 1650 | - } else { | |
| 1651 | - asi = GET_FIELD(insn, 19, 26); | |
| 1652 | - tcg_gen_movi_i32(r_asi, asi); | |
| 1653 | - } | |
| 1654 | - tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], cpu_T[1], r_asi, r_size); | |
| 1571 | + r_asi = gen_get_asi(insn, cpu_T[0]); | |
| 1572 | + tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], cpu_T[1], r_asi, | |
| 1573 | + tcg_const_i32(size)); | |
| 1574 | + tcg_gen_discard_i32(r_asi); | |
| 1655 | 1575 | } |
| 1656 | 1576 | |
| 1657 | 1577 | static inline void gen_ldf_asi(int insn, int size, int rd) |
| 1658 | 1578 | { |
| 1659 | - int asi, offset; | |
| 1660 | - TCGv r_asi, r_size, r_rd; | |
| 1579 | + TCGv r_asi; | |
| 1661 | 1580 | |
| 1662 | - r_asi = tcg_temp_new(TCG_TYPE_I32); | |
| 1663 | - r_size = tcg_temp_new(TCG_TYPE_I32); | |
| 1664 | - r_rd = tcg_temp_new(TCG_TYPE_I32); | |
| 1665 | - tcg_gen_movi_i32(r_size, size); | |
| 1666 | - tcg_gen_movi_i32(r_rd, rd); | |
| 1667 | - if (IS_IMM) { | |
| 1668 | - offset = GET_FIELD(insn, 25, 31); | |
| 1669 | - tcg_gen_addi_tl(cpu_T[0], cpu_T[0], offset); | |
| 1670 | - tcg_gen_ld_i32(r_asi, cpu_env, offsetof(CPUSPARCState, asi)); | |
| 1671 | - } else { | |
| 1672 | - asi = GET_FIELD(insn, 19, 26); | |
| 1673 | - tcg_gen_movi_i32(r_asi, asi); | |
| 1674 | - } | |
| 1675 | - tcg_gen_helper_0_4(helper_ldf_asi, cpu_T[0], r_asi, r_size, r_rd); | |
| 1581 | + r_asi = gen_get_asi(insn, cpu_T[0]); | |
| 1582 | + tcg_gen_helper_0_4(helper_ldf_asi, cpu_T[0], r_asi, tcg_const_i32(size), | |
| 1583 | + tcg_const_i32(rd)); | |
| 1584 | + tcg_gen_discard_i32(r_asi); | |
| 1676 | 1585 | } |
| 1677 | 1586 | |
| 1678 | 1587 | static inline void gen_stf_asi(int insn, int size, int rd) |
| 1679 | 1588 | { |
| 1680 | - int asi, offset; | |
| 1681 | - TCGv r_asi, r_size, r_rd; | |
| 1589 | + TCGv r_asi; | |
| 1682 | 1590 | |
| 1683 | - r_asi = tcg_temp_new(TCG_TYPE_I32); | |
| 1684 | - r_size = tcg_temp_new(TCG_TYPE_I32); | |
| 1685 | - r_rd = tcg_temp_new(TCG_TYPE_I32); | |
| 1686 | - tcg_gen_movi_i32(r_size, size); | |
| 1687 | - tcg_gen_movi_i32(r_rd, rd); | |
| 1688 | - if (IS_IMM) { | |
| 1689 | - offset = GET_FIELD(insn, 25, 31); | |
| 1690 | - tcg_gen_addi_tl(cpu_T[0], cpu_T[0], offset); | |
| 1691 | - tcg_gen_ld_i32(r_asi, cpu_env, offsetof(CPUSPARCState, asi)); | |
| 1692 | - } else { | |
| 1693 | - asi = GET_FIELD(insn, 19, 26); | |
| 1694 | - tcg_gen_movi_i32(r_asi, asi); | |
| 1695 | - } | |
| 1696 | - tcg_gen_helper_0_4(helper_stf_asi, cpu_T[0], r_asi, r_size, r_rd); | |
| 1591 | + r_asi = gen_get_asi(insn, cpu_T[0]); | |
| 1592 | + tcg_gen_helper_0_4(helper_stf_asi, cpu_T[0], r_asi, tcg_const_i32(size), | |
| 1593 | + tcg_const_i32(rd)); | |
| 1594 | + tcg_gen_discard_i32(r_asi); | |
| 1697 | 1595 | } |
| 1698 | 1596 | |
| 1699 | 1597 | static inline void gen_swap_asi(int insn) |
| 1700 | 1598 | { |
| 1701 | - int asi, offset; | |
| 1702 | - TCGv r_size, r_sign, r_temp; | |
| 1599 | + TCGv r_temp, r_asi; | |
| 1703 | 1600 | |
| 1704 | - r_size = tcg_temp_new(TCG_TYPE_I32); | |
| 1705 | - r_sign = tcg_temp_new(TCG_TYPE_I32); | |
| 1706 | 1601 | r_temp = tcg_temp_new(TCG_TYPE_I32); |
| 1707 | - tcg_gen_movi_i32(r_size, 4); | |
| 1708 | - tcg_gen_movi_i32(r_sign, 0); | |
| 1709 | - if (IS_IMM) { | |
| 1710 | - offset = GET_FIELD(insn, 25, 31); | |
| 1711 | - tcg_gen_addi_tl(cpu_T[0], cpu_T[0], offset); | |
| 1712 | - tcg_gen_ld_i32(cpu_T[1], cpu_env, offsetof(CPUSPARCState, asi)); | |
| 1713 | - } else { | |
| 1714 | - asi = GET_FIELD(insn, 19, 26); | |
| 1715 | - tcg_gen_movi_i32(cpu_T[1], asi); | |
| 1716 | - } | |
| 1717 | - tcg_gen_helper_1_4(helper_ld_asi, r_temp, cpu_T[0], cpu_T[1], r_size, | |
| 1718 | - r_sign); | |
| 1719 | - tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], cpu_T[1], r_size, r_sign); | |
| 1602 | + r_asi = gen_get_asi(insn, cpu_T[0]); | |
| 1603 | + tcg_gen_helper_1_4(helper_ld_asi, r_temp, cpu_T[0], r_asi, | |
| 1604 | + tcg_const_i32(4), tcg_const_i32(0)); | |
| 1605 | + tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], r_temp, r_asi, | |
| 1606 | + tcg_const_i32(4)); | |
| 1720 | 1607 | tcg_gen_mov_i32(cpu_T[1], r_temp); |
| 1608 | + tcg_gen_discard_i32(r_asi); | |
| 1609 | + tcg_gen_discard_i32(r_temp); | |
| 1721 | 1610 | } |
| 1722 | 1611 | |
| 1723 | 1612 | static inline void gen_ldda_asi(int insn) |
| 1724 | 1613 | { |
| 1725 | - int asi, offset; | |
| 1726 | - TCGv r_size, r_sign, r_dword; | |
| 1614 | + TCGv r_dword, r_asi; | |
| 1727 | 1615 | |
| 1728 | - r_size = tcg_temp_new(TCG_TYPE_I32); | |
| 1729 | - r_sign = tcg_temp_new(TCG_TYPE_I32); | |
| 1730 | 1616 | r_dword = tcg_temp_new(TCG_TYPE_I64); |
| 1731 | - tcg_gen_movi_i32(r_size, 8); | |
| 1732 | - tcg_gen_movi_i32(r_sign, 0); | |
| 1733 | - if (IS_IMM) { | |
| 1734 | - offset = GET_FIELD(insn, 25, 31); | |
| 1735 | - tcg_gen_addi_tl(cpu_T[0], cpu_T[0], offset); | |
| 1736 | - tcg_gen_ld_i32(cpu_T[1], cpu_env, offsetof(CPUSPARCState, asi)); | |
| 1737 | - } else { | |
| 1738 | - asi = GET_FIELD(insn, 19, 26); | |
| 1739 | - tcg_gen_movi_i32(cpu_T[1], asi); | |
| 1740 | - } | |
| 1741 | - tcg_gen_helper_1_4(helper_ld_asi, r_dword, cpu_T[0], cpu_T[1], r_size, | |
| 1742 | - r_sign); | |
| 1617 | + r_asi = gen_get_asi(insn, cpu_T[0]); | |
| 1618 | + tcg_gen_helper_1_4(helper_ld_asi, r_dword, cpu_T[0], r_asi, | |
| 1619 | + tcg_const_i32(8), tcg_const_i32(0)); | |
| 1743 | 1620 | tcg_gen_trunc_i64_i32(cpu_T[0], r_dword); |
| 1744 | 1621 | tcg_gen_shri_i64(r_dword, r_dword, 32); |
| 1745 | 1622 | tcg_gen_trunc_i64_i32(cpu_T[1], r_dword); |
| 1623 | + tcg_gen_discard_i32(r_asi); | |
| 1624 | + tcg_gen_discard_i64(r_dword); | |
| 1625 | +} | |
| 1626 | + | |
| 1627 | +static inline void gen_stda_asi(int insn, int rd) | |
| 1628 | +{ | |
| 1629 | + TCGv r_dword, r_temp, r_asi; | |
| 1630 | + | |
| 1631 | + r_dword = tcg_temp_new(TCG_TYPE_I64); | |
| 1632 | + r_temp = tcg_temp_new(TCG_TYPE_I32); | |
| 1633 | + gen_movl_reg_TN(rd + 1, r_temp); | |
| 1634 | + tcg_gen_helper_1_2(helper_pack64, r_dword, cpu_T[1], | |
| 1635 | + r_temp); | |
| 1636 | + r_asi = gen_get_asi(insn, cpu_T[0]); | |
| 1637 | + tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], r_dword, r_asi, | |
| 1638 | + tcg_const_i32(8)); | |
| 1639 | + tcg_gen_discard_i32(r_asi); | |
| 1640 | + tcg_gen_discard_i32(r_temp); | |
| 1641 | + tcg_gen_discard_i64(r_dword); | |
| 1746 | 1642 | } |
| 1747 | 1643 | |
| 1748 | 1644 | static inline void gen_cas_asi(int insn, int rd) |
| 1749 | 1645 | { |
| 1750 | - int asi, offset; | |
| 1751 | 1646 | TCGv r_val1, r_asi; |
| 1752 | 1647 | |
| 1753 | 1648 | r_val1 = tcg_temp_new(TCG_TYPE_I32); |
| 1754 | - r_asi = tcg_temp_new(TCG_TYPE_I32); | |
| 1755 | 1649 | gen_movl_reg_TN(rd, r_val1); |
| 1756 | - if (IS_IMM) { | |
| 1757 | - offset = GET_FIELD(insn, 25, 31); | |
| 1758 | - tcg_gen_addi_tl(cpu_T[0], cpu_T[0], offset); | |
| 1759 | - tcg_gen_ld_i32(r_asi, cpu_env, offsetof(CPUSPARCState, asi)); | |
| 1760 | - } else { | |
| 1761 | - asi = GET_FIELD(insn, 19, 26); | |
| 1762 | - tcg_gen_movi_i32(r_asi, asi); | |
| 1763 | - } | |
| 1650 | + r_asi = gen_get_asi(insn, cpu_T[0]); | |
| 1764 | 1651 | tcg_gen_helper_1_4(helper_cas_asi, cpu_T[1], cpu_T[0], r_val1, cpu_T[1], |
| 1765 | 1652 | r_asi); |
| 1653 | + tcg_gen_discard_i32(r_asi); | |
| 1654 | + tcg_gen_discard_i32(r_val1); | |
| 1766 | 1655 | } |
| 1767 | 1656 | |
| 1768 | 1657 | static inline void gen_casx_asi(int insn, int rd) |
| 1769 | 1658 | { |
| 1770 | - int asi, offset; | |
| 1771 | 1659 | TCGv r_val1, r_asi; |
| 1772 | 1660 | |
| 1773 | 1661 | r_val1 = tcg_temp_new(TCG_TYPE_I64); |
| 1774 | - r_asi = tcg_temp_new(TCG_TYPE_I32); | |
| 1775 | 1662 | gen_movl_reg_TN(rd, r_val1); |
| 1776 | - if (IS_IMM) { | |
| 1777 | - offset = GET_FIELD(insn, 25, 31); | |
| 1778 | - tcg_gen_addi_tl(cpu_T[0], cpu_T[0], offset); | |
| 1779 | - tcg_gen_ld_i32(r_asi, cpu_env, offsetof(CPUSPARCState, asi)); | |
| 1780 | - } else { | |
| 1781 | - asi = GET_FIELD(insn, 19, 26); | |
| 1782 | - tcg_gen_movi_i32(r_asi, asi); | |
| 1783 | - } | |
| 1663 | + r_asi = gen_get_asi(insn, cpu_T[0]); | |
| 1784 | 1664 | tcg_gen_helper_1_4(helper_casx_asi, cpu_T[1], cpu_T[0], r_val1, cpu_T[1], |
| 1785 | 1665 | r_asi); |
| 1666 | + tcg_gen_discard_i32(r_asi); | |
| 1667 | + tcg_gen_discard_i32(r_val1); | |
| 1786 | 1668 | } |
| 1787 | 1669 | |
| 1788 | 1670 | #elif !defined(CONFIG_USER_ONLY) |
| ... | ... | @@ -1790,70 +1672,72 @@ static inline void gen_casx_asi(int insn, int rd) |
| 1790 | 1672 | static inline void gen_ld_asi(int insn, int size, int sign) |
| 1791 | 1673 | { |
| 1792 | 1674 | int asi; |
| 1793 | - TCGv r_size, r_sign, r_dword; | |
| 1675 | + TCGv r_dword; | |
| 1794 | 1676 | |
| 1795 | - r_size = tcg_temp_new(TCG_TYPE_I32); | |
| 1796 | - r_sign = tcg_temp_new(TCG_TYPE_I32); | |
| 1797 | 1677 | r_dword = tcg_temp_new(TCG_TYPE_I64); |
| 1798 | - tcg_gen_movi_i32(r_size, size); | |
| 1799 | - tcg_gen_movi_i32(r_sign, sign); | |
| 1800 | 1678 | asi = GET_FIELD(insn, 19, 26); |
| 1801 | - tcg_gen_movi_i32(cpu_T[1], asi); | |
| 1802 | - tcg_gen_helper_1_4(helper_ld_asi, r_dword, cpu_T[0], cpu_T[1], r_size, | |
| 1803 | - r_sign); | |
| 1679 | + tcg_gen_helper_1_4(helper_ld_asi, r_dword, cpu_T[0], tcg_const_i32(asi), | |
| 1680 | + tcg_const_i32(size), tcg_const_i32(sign)); | |
| 1804 | 1681 | tcg_gen_trunc_i64_i32(cpu_T[1], r_dword); |
| 1682 | + tcg_gen_discard_i64(r_dword); | |
| 1805 | 1683 | } |
| 1806 | 1684 | |
| 1807 | 1685 | static inline void gen_st_asi(int insn, int size) |
| 1808 | 1686 | { |
| 1809 | 1687 | int asi; |
| 1810 | - TCGv r_dword, r_asi, r_size; | |
| 1688 | + TCGv r_dword; | |
| 1811 | 1689 | |
| 1812 | 1690 | r_dword = tcg_temp_new(TCG_TYPE_I64); |
| 1813 | 1691 | tcg_gen_extu_i32_i64(r_dword, cpu_T[1]); |
| 1814 | - r_asi = tcg_temp_new(TCG_TYPE_I32); | |
| 1815 | - r_size = tcg_temp_new(TCG_TYPE_I32); | |
| 1816 | 1692 | asi = GET_FIELD(insn, 19, 26); |
| 1817 | - tcg_gen_movi_i32(r_asi, asi); | |
| 1818 | - tcg_gen_movi_i32(r_size, size); | |
| 1819 | - tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], r_dword, r_asi, r_size); | |
| 1693 | + tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], r_dword, tcg_const_i32(asi), | |
| 1694 | + tcg_const_i32(size)); | |
| 1695 | + tcg_gen_discard_i64(r_dword); | |
| 1820 | 1696 | } |
| 1821 | 1697 | |
| 1822 | 1698 | static inline void gen_swap_asi(int insn) |
| 1823 | 1699 | { |
| 1824 | 1700 | int asi; |
| 1825 | - TCGv r_size, r_sign, r_temp; | |
| 1701 | + TCGv r_temp; | |
| 1826 | 1702 | |
| 1827 | - r_size = tcg_temp_new(TCG_TYPE_I32); | |
| 1828 | - r_sign = tcg_temp_new(TCG_TYPE_I32); | |
| 1829 | 1703 | r_temp = tcg_temp_new(TCG_TYPE_I32); |
| 1830 | - tcg_gen_movi_i32(r_size, 4); | |
| 1831 | - tcg_gen_movi_i32(r_sign, 0); | |
| 1832 | 1704 | asi = GET_FIELD(insn, 19, 26); |
| 1833 | - tcg_gen_movi_i32(cpu_T[1], asi); | |
| 1834 | - tcg_gen_helper_1_4(helper_ld_asi, r_temp, cpu_T[0], cpu_T[1], r_size, | |
| 1835 | - r_sign); | |
| 1836 | - tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], cpu_T[1], r_size, r_sign); | |
| 1705 | + tcg_gen_helper_1_4(helper_ld_asi, r_temp, cpu_T[0], tcg_const_i32(asi), | |
| 1706 | + tcg_const_i32(4), tcg_const_i32(0)); | |
| 1707 | + tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], cpu_T[1], tcg_const_i32(asi), | |
| 1708 | + tcg_const_i32(4)); | |
| 1837 | 1709 | tcg_gen_mov_i32(cpu_T[1], r_temp); |
| 1710 | + tcg_gen_discard_i32(r_temp); | |
| 1838 | 1711 | } |
| 1839 | 1712 | |
| 1840 | 1713 | static inline void gen_ldda_asi(int insn) |
| 1841 | 1714 | { |
| 1842 | 1715 | int asi; |
| 1843 | - TCGv r_size, r_sign, r_dword; | |
| 1716 | + TCGv r_dword; | |
| 1844 | 1717 | |
| 1845 | - r_size = tcg_temp_new(TCG_TYPE_I32); | |
| 1846 | - r_sign = tcg_temp_new(TCG_TYPE_I32); | |
| 1847 | 1718 | r_dword = tcg_temp_new(TCG_TYPE_I64); |
| 1848 | - tcg_gen_movi_i32(r_size, 8); | |
| 1849 | - tcg_gen_movi_i32(r_sign, 0); | |
| 1850 | 1719 | asi = GET_FIELD(insn, 19, 26); |
| 1851 | - tcg_gen_movi_i32(cpu_T[1], asi); | |
| 1852 | - tcg_gen_helper_1_4(helper_ld_asi, r_dword, cpu_T[0], cpu_T[1], r_size, | |
| 1853 | - r_sign); | |
| 1720 | + tcg_gen_helper_1_4(helper_ld_asi, r_dword, cpu_T[0], tcg_const_i32(asi), | |
| 1721 | + tcg_const_i32(8), tcg_const_i32(0)); | |
| 1854 | 1722 | tcg_gen_trunc_i64_i32(cpu_T[0], r_dword); |
| 1855 | 1723 | tcg_gen_shri_i64(r_dword, r_dword, 32); |
| 1856 | 1724 | tcg_gen_trunc_i64_i32(cpu_T[1], r_dword); |
| 1725 | + tcg_gen_discard_i64(r_dword); | |
| 1726 | +} | |
| 1727 | + | |
| 1728 | +static inline void gen_stda_asi(int insn, int rd) | |
| 1729 | +{ | |
| 1730 | + int asi; | |
| 1731 | + TCGv r_dword, r_temp; | |
| 1732 | + | |
| 1733 | + r_dword = tcg_temp_new(TCG_TYPE_I64); | |
| 1734 | + r_temp = tcg_temp_new(TCG_TYPE_I32); | |
| 1735 | + gen_movl_reg_TN(rd + 1, r_temp); | |
| 1736 | + tcg_gen_helper_1_2(helper_pack64, r_dword, cpu_T[1], r_temp); | |
| 1737 | + asi = GET_FIELD(insn, 19, 26); | |
| 1738 | + tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], r_dword, tcg_const_i32(asi), | |
| 1739 | + tcg_const_i32(8)); | |
| 1740 | + tcg_gen_discard_i64(r_dword); | |
| 1857 | 1741 | } |
| 1858 | 1742 | #endif |
| 1859 | 1743 | |
| ... | ... | @@ -1861,18 +1745,12 @@ static inline void gen_ldda_asi(int insn) |
| 1861 | 1745 | static inline void gen_ldstub_asi(int insn) |
| 1862 | 1746 | { |
| 1863 | 1747 | int asi; |
| 1864 | - TCGv r_dword, r_asi, r_size; | |
| 1865 | 1748 | |
| 1866 | 1749 | gen_ld_asi(insn, 1, 0); |
| 1867 | 1750 | |
| 1868 | - r_dword = tcg_temp_new(TCG_TYPE_I64); | |
| 1869 | - r_asi = tcg_temp_new(TCG_TYPE_I32); | |
| 1870 | - r_size = tcg_temp_new(TCG_TYPE_I32); | |
| 1871 | 1751 | asi = GET_FIELD(insn, 19, 26); |
| 1872 | - tcg_gen_movi_i32(r_dword, 0xff); | |
| 1873 | - tcg_gen_movi_i32(r_asi, asi); | |
| 1874 | - tcg_gen_movi_i32(r_size, 1); | |
| 1875 | - tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], r_dword, r_asi, r_size); | |
| 1752 | + tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], tcg_const_i64(0xff), | |
| 1753 | + tcg_const_i32(asi), tcg_const_i32(1)); | |
| 1876 | 1754 | } |
| 1877 | 1755 | #endif |
| 1878 | 1756 | |
| ... | ... | @@ -2028,6 +1906,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2028 | 1906 | gen_cond(r_cond, 0, cond); |
| 2029 | 1907 | #endif |
| 2030 | 1908 | tcg_gen_helper_0_2(helper_trapcc, cpu_T[0], r_cond); |
| 1909 | + tcg_gen_discard_tl(r_cond); | |
| 2031 | 1910 | } |
| 2032 | 1911 | gen_op_next_insn(); |
| 2033 | 1912 | tcg_gen_exit_tb(0); |
| ... | ... | @@ -2069,6 +1948,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2069 | 1948 | tcg_gen_helper_1_1(helper_tick_get_count, cpu_T[0], |
| 2070 | 1949 | r_tickptr); |
| 2071 | 1950 | gen_movl_T0_reg(rd); |
| 1951 | + tcg_gen_discard_ptr(r_tickptr); | |
| 2072 | 1952 | } |
| 2073 | 1953 | break; |
| 2074 | 1954 | case 0x5: /* V9 rdpc */ |
| ... | ... | @@ -2101,6 +1981,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2101 | 1981 | tcg_gen_helper_1_1(helper_tick_get_count, cpu_T[0], |
| 2102 | 1982 | r_tickptr); |
| 2103 | 1983 | gen_movl_T0_reg(rd); |
| 1984 | + tcg_gen_discard_ptr(r_tickptr); | |
| 2104 | 1985 | } |
| 2105 | 1986 | break; |
| 2106 | 1987 | case 0x19: /* System tick compare */ |
| ... | ... | @@ -2167,6 +2048,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2167 | 2048 | offsetof(CPUState, tsptr)); |
| 2168 | 2049 | tcg_gen_ld_tl(cpu_T[0], r_tsptr, |
| 2169 | 2050 | offsetof(trap_state, tpc)); |
| 2051 | + tcg_gen_discard_ptr(r_tsptr); | |
| 2170 | 2052 | } |
| 2171 | 2053 | break; |
| 2172 | 2054 | case 1: // tnpc |
| ... | ... | @@ -2178,6 +2060,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2178 | 2060 | offsetof(CPUState, tsptr)); |
| 2179 | 2061 | tcg_gen_ld_tl(cpu_T[0], r_tsptr, |
| 2180 | 2062 | offsetof(trap_state, tnpc)); |
| 2063 | + tcg_gen_discard_ptr(r_tsptr); | |
| 2181 | 2064 | } |
| 2182 | 2065 | break; |
| 2183 | 2066 | case 2: // tstate |
| ... | ... | @@ -2189,6 +2072,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2189 | 2072 | offsetof(CPUState, tsptr)); |
| 2190 | 2073 | tcg_gen_ld_tl(cpu_T[0], r_tsptr, |
| 2191 | 2074 | offsetof(trap_state, tstate)); |
| 2075 | + tcg_gen_discard_ptr(r_tsptr); | |
| 2192 | 2076 | } |
| 2193 | 2077 | break; |
| 2194 | 2078 | case 3: // tt |
| ... | ... | @@ -2200,6 +2084,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2200 | 2084 | offsetof(CPUState, tsptr)); |
| 2201 | 2085 | tcg_gen_ld_i32(cpu_T[0], r_tsptr, |
| 2202 | 2086 | offsetof(trap_state, tt)); |
| 2087 | + tcg_gen_discard_ptr(r_tsptr); | |
| 2203 | 2088 | } |
| 2204 | 2089 | break; |
| 2205 | 2090 | case 4: // tick |
| ... | ... | @@ -2212,6 +2097,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2212 | 2097 | tcg_gen_helper_1_1(helper_tick_get_count, cpu_T[0], |
| 2213 | 2098 | r_tickptr); |
| 2214 | 2099 | gen_movl_T0_reg(rd); |
| 2100 | + tcg_gen_discard_ptr(r_tickptr); | |
| 2215 | 2101 | } |
| 2216 | 2102 | break; |
| 2217 | 2103 | case 5: // tba |
| ... | ... | @@ -2659,44 +2545,41 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2659 | 2545 | xop = GET_FIELD(insn, 18, 26); |
| 2660 | 2546 | #ifdef TARGET_SPARC64 |
| 2661 | 2547 | if ((xop & 0x11f) == 0x005) { // V9 fmovsr |
| 2662 | - TCGv r_zero; | |
| 2663 | 2548 | int l1; |
| 2664 | 2549 | |
| 2665 | 2550 | l1 = gen_new_label(); |
| 2666 | - r_zero = tcg_const_tl(0); | |
| 2667 | 2551 | cond = GET_FIELD_SP(insn, 14, 17); |
| 2668 | 2552 | rs1 = GET_FIELD(insn, 13, 17); |
| 2669 | 2553 | gen_movl_reg_T0(rs1); |
| 2670 | - tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_T[0], r_zero, l1); | |
| 2554 | + tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_T[0], | |
| 2555 | + tcg_const_tl(0), l1); | |
| 2671 | 2556 | gen_op_load_fpr_FT0(rs2); |
| 2672 | 2557 | gen_op_store_FT0_fpr(rd); |
| 2673 | 2558 | gen_set_label(l1); |
| 2674 | 2559 | break; |
| 2675 | 2560 | } else if ((xop & 0x11f) == 0x006) { // V9 fmovdr |
| 2676 | - TCGv r_zero; | |
| 2677 | 2561 | int l1; |
| 2678 | 2562 | |
| 2679 | 2563 | l1 = gen_new_label(); |
| 2680 | - r_zero = tcg_const_tl(0); | |
| 2681 | 2564 | cond = GET_FIELD_SP(insn, 14, 17); |
| 2682 | 2565 | rs1 = GET_FIELD(insn, 13, 17); |
| 2683 | 2566 | gen_movl_reg_T0(rs1); |
| 2684 | - tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_T[0], r_zero, l1); | |
| 2567 | + tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_T[0], | |
| 2568 | + tcg_const_tl(0), l1); | |
| 2685 | 2569 | gen_op_load_fpr_DT0(DFPREG(rs2)); |
| 2686 | 2570 | gen_op_store_DT0_fpr(DFPREG(rd)); |
| 2687 | 2571 | gen_set_label(l1); |
| 2688 | 2572 | break; |
| 2689 | 2573 | } else if ((xop & 0x11f) == 0x007) { // V9 fmovqr |
| 2690 | 2574 | #if defined(CONFIG_USER_ONLY) |
| 2691 | - TCGv r_zero; | |
| 2692 | 2575 | int l1; |
| 2693 | 2576 | |
| 2694 | 2577 | l1 = gen_new_label(); |
| 2695 | - r_zero = tcg_const_tl(0); | |
| 2696 | 2578 | cond = GET_FIELD_SP(insn, 14, 17); |
| 2697 | 2579 | rs1 = GET_FIELD(insn, 13, 17); |
| 2698 | 2580 | gen_movl_reg_T0(rs1); |
| 2699 | - tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_T[0], r_zero, l1); | |
| 2581 | + tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_T[0], | |
| 2582 | + tcg_const_tl(0), l1); | |
| 2700 | 2583 | gen_op_load_fpr_QT0(QFPREG(rs2)); |
| 2701 | 2584 | gen_op_store_QT0_fpr(QFPREG(rd)); |
| 2702 | 2585 | gen_set_label(l1); |
| ... | ... | @@ -2710,18 +2593,19 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2710 | 2593 | #ifdef TARGET_SPARC64 |
| 2711 | 2594 | #define FMOVCC(size_FDQ, fcc) \ |
| 2712 | 2595 | { \ |
| 2713 | - TCGv r_zero, r_cond; \ | |
| 2596 | + TCGv r_cond; \ | |
| 2714 | 2597 | int l1; \ |
| 2715 | 2598 | \ |
| 2716 | 2599 | l1 = gen_new_label(); \ |
| 2717 | - r_zero = tcg_const_tl(0); \ | |
| 2718 | 2600 | r_cond = tcg_temp_new(TCG_TYPE_TL); \ |
| 2719 | 2601 | cond = GET_FIELD_SP(insn, 14, 17); \ |
| 2720 | 2602 | gen_fcond(r_cond, fcc, cond); \ |
| 2721 | - tcg_gen_brcond_tl(TCG_COND_EQ, r_cond, r_zero, l1); \ | |
| 2603 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_cond, \ | |
| 2604 | + tcg_const_tl(0), l1); \ | |
| 2722 | 2605 | glue(glue(gen_op_load_fpr_, size_FDQ), T0)(glue(size_FDQ, FPREG(rs2))); \ |
| 2723 | 2606 | glue(glue(gen_op_store_, size_FDQ), T0_fpr)(glue(size_FDQ, FPREG(rd))); \ |
| 2724 | 2607 | gen_set_label(l1); \ |
| 2608 | + tcg_gen_discard_tl(r_cond); \ | |
| 2725 | 2609 | } |
| 2726 | 2610 | case 0x001: /* V9 fmovscc %fcc0 */ |
| 2727 | 2611 | FMOVCC(F, 0); |
| ... | ... | @@ -2778,18 +2662,19 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2778 | 2662 | #undef FMOVCC |
| 2779 | 2663 | #define FMOVCC(size_FDQ, icc) \ |
| 2780 | 2664 | { \ |
| 2781 | - TCGv r_zero, r_cond; \ | |
| 2665 | + TCGv r_cond; \ | |
| 2782 | 2666 | int l1; \ |
| 2783 | 2667 | \ |
| 2784 | 2668 | l1 = gen_new_label(); \ |
| 2785 | - r_zero = tcg_const_tl(0); \ | |
| 2786 | 2669 | r_cond = tcg_temp_new(TCG_TYPE_TL); \ |
| 2787 | 2670 | cond = GET_FIELD_SP(insn, 14, 17); \ |
| 2788 | 2671 | gen_cond(r_cond, icc, cond); \ |
| 2789 | - tcg_gen_brcond_tl(TCG_COND_EQ, r_cond, r_zero, l1); \ | |
| 2672 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_cond, \ | |
| 2673 | + tcg_const_tl(0), l1); \ | |
| 2790 | 2674 | glue(glue(gen_op_load_fpr_, size_FDQ), T0)(glue(size_FDQ, FPREG(rs2))); \ |
| 2791 | 2675 | glue(glue(gen_op_store_, size_FDQ), T0_fpr)(glue(size_FDQ, FPREG(rd))); \ |
| 2792 | 2676 | gen_set_label(l1); \ |
| 2677 | + tcg_gen_discard_tl(r_cond); \ | |
| 2793 | 2678 | } |
| 2794 | 2679 | |
| 2795 | 2680 | case 0x101: /* V9 fmovscc %icc */ |
| ... | ... | @@ -3178,6 +3063,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3178 | 3063 | offsetof(CPUState, tick)); |
| 3179 | 3064 | tcg_gen_helper_0_2(helper_tick_set_limit, |
| 3180 | 3065 | r_tickptr, cpu_T[0]); |
| 3066 | + tcg_gen_discard_ptr(r_tickptr); | |
| 3181 | 3067 | } |
| 3182 | 3068 | break; |
| 3183 | 3069 | case 0x18: /* System tick */ |
| ... | ... | @@ -3194,6 +3080,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3194 | 3080 | offsetof(CPUState, stick)); |
| 3195 | 3081 | tcg_gen_helper_0_2(helper_tick_set_count, |
| 3196 | 3082 | r_tickptr, cpu_T[0]); |
| 3083 | + tcg_gen_discard_ptr(r_tickptr); | |
| 3197 | 3084 | } |
| 3198 | 3085 | break; |
| 3199 | 3086 | case 0x19: /* System tick compare */ |
| ... | ... | @@ -3212,6 +3099,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3212 | 3099 | offsetof(CPUState, stick)); |
| 3213 | 3100 | tcg_gen_helper_0_2(helper_tick_set_limit, |
| 3214 | 3101 | r_tickptr, cpu_T[0]); |
| 3102 | + tcg_gen_discard_ptr(r_tickptr); | |
| 3215 | 3103 | } |
| 3216 | 3104 | break; |
| 3217 | 3105 | |
| ... | ... | @@ -3274,6 +3162,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3274 | 3162 | offsetof(CPUState, tsptr)); |
| 3275 | 3163 | tcg_gen_st_tl(cpu_T[0], r_tsptr, |
| 3276 | 3164 | offsetof(trap_state, tpc)); |
| 3165 | + tcg_gen_discard_ptr(r_tsptr); | |
| 3277 | 3166 | } |
| 3278 | 3167 | break; |
| 3279 | 3168 | case 1: // tnpc |
| ... | ... | @@ -3285,6 +3174,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3285 | 3174 | offsetof(CPUState, tsptr)); |
| 3286 | 3175 | tcg_gen_st_tl(cpu_T[0], r_tsptr, |
| 3287 | 3176 | offsetof(trap_state, tnpc)); |
| 3177 | + tcg_gen_discard_ptr(r_tsptr); | |
| 3288 | 3178 | } |
| 3289 | 3179 | break; |
| 3290 | 3180 | case 2: // tstate |
| ... | ... | @@ -3296,6 +3186,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3296 | 3186 | offsetof(CPUState, tsptr)); |
| 3297 | 3187 | tcg_gen_st_tl(cpu_T[0], r_tsptr, |
| 3298 | 3188 | offsetof(trap_state, tstate)); |
| 3189 | + tcg_gen_discard_ptr(r_tsptr); | |
| 3299 | 3190 | } |
| 3300 | 3191 | break; |
| 3301 | 3192 | case 3: // tt |
| ... | ... | @@ -3307,6 +3198,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3307 | 3198 | offsetof(CPUState, tsptr)); |
| 3308 | 3199 | tcg_gen_st_i32(cpu_T[0], r_tsptr, |
| 3309 | 3200 | offsetof(trap_state, tt)); |
| 3201 | + tcg_gen_discard_ptr(r_tsptr); | |
| 3310 | 3202 | } |
| 3311 | 3203 | break; |
| 3312 | 3204 | case 4: // tick |
| ... | ... | @@ -3318,6 +3210,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3318 | 3210 | offsetof(CPUState, tick)); |
| 3319 | 3211 | tcg_gen_helper_0_2(helper_tick_set_count, |
| 3320 | 3212 | r_tickptr, cpu_T[0]); |
| 3213 | + tcg_gen_discard_ptr(r_tickptr); | |
| 3321 | 3214 | } |
| 3322 | 3215 | break; |
| 3323 | 3216 | case 5: // tba |
| ... | ... | @@ -3410,6 +3303,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3410 | 3303 | offsetof(CPUState, hstick)); |
| 3411 | 3304 | tcg_gen_helper_0_2(helper_tick_set_limit, |
| 3412 | 3305 | r_tickptr, cpu_T[0]); |
| 3306 | + tcg_gen_discard_ptr(r_tickptr); | |
| 3413 | 3307 | } |
| 3414 | 3308 | break; |
| 3415 | 3309 | case 6: // hver readonly |
| ... | ... | @@ -3453,6 +3347,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3453 | 3347 | } |
| 3454 | 3348 | gen_movl_T1_reg(rd); |
| 3455 | 3349 | gen_set_label(l1); |
| 3350 | + tcg_gen_discard_tl(r_cond); | |
| 3456 | 3351 | break; |
| 3457 | 3352 | } |
| 3458 | 3353 | case 0x2d: /* V9 sdivx */ |
| ... | ... | @@ -3477,7 +3372,6 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3477 | 3372 | case 0x2f: /* V9 movr */ |
| 3478 | 3373 | { |
| 3479 | 3374 | int cond = GET_FIELD_SP(insn, 10, 12); |
| 3480 | - TCGv r_zero; | |
| 3481 | 3375 | int l1; |
| 3482 | 3376 | |
| 3483 | 3377 | rs1 = GET_FIELD(insn, 13, 17); |
| ... | ... | @@ -3485,8 +3379,8 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3485 | 3379 | |
| 3486 | 3380 | l1 = gen_new_label(); |
| 3487 | 3381 | |
| 3488 | - r_zero = tcg_const_tl(0); | |
| 3489 | - tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_T[0], r_zero, l1); | |
| 3382 | + tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_T[0], | |
| 3383 | + tcg_const_tl(0), l1); | |
| 3490 | 3384 | if (IS_IMM) { /* immediate */ |
| 3491 | 3385 | rs2 = GET_FIELD_SPs(insn, 0, 9); |
| 3492 | 3386 | gen_movl_simm_T1(rs2); |
| ... | ... | @@ -4077,6 +3971,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 4077 | 3971 | gen_movl_T0_reg(rd + 1); |
| 4078 | 3972 | tcg_gen_shri_i64(r_dword, r_dword, 32); |
| 4079 | 3973 | tcg_gen_trunc_i64_i32(cpu_T[1], r_dword); |
| 3974 | + tcg_gen_discard_i64(r_dword); | |
| 4080 | 3975 | } |
| 4081 | 3976 | break; |
| 4082 | 3977 | case 0x9: /* load signed byte */ |
| ... | ... | @@ -4302,6 +4197,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 4302 | 4197 | tcg_gen_helper_1_2(helper_pack64, r_dword, cpu_T[1], |
| 4303 | 4198 | r_low); |
| 4304 | 4199 | tcg_gen_qemu_st64(r_dword, cpu_T[0], dc->mem_idx); |
| 4200 | + tcg_gen_discard_i64(r_dword); | |
| 4305 | 4201 | } |
| 4306 | 4202 | #else /* __i386__ */ |
| 4307 | 4203 | gen_op_check_align_T0_7(); |
| ... | ... | @@ -4350,32 +4246,8 @@ static void disas_sparc_insn(DisasContext * dc) |
| 4350 | 4246 | if (rd & 1) |
| 4351 | 4247 | goto illegal_insn; |
| 4352 | 4248 | else { |
| 4353 | - int asi; | |
| 4354 | - TCGv r_dword, r_temp, r_size; | |
| 4355 | - | |
| 4356 | 4249 | gen_op_check_align_T0_7(); |
| 4357 | - r_dword = tcg_temp_new(TCG_TYPE_I64); | |
| 4358 | - r_temp = tcg_temp_new(TCG_TYPE_I32); | |
| 4359 | - r_size = tcg_temp_new(TCG_TYPE_I32); | |
| 4360 | - gen_movl_reg_TN(rd + 1, r_temp); | |
| 4361 | - tcg_gen_helper_1_2(helper_pack64, r_dword, cpu_T[1], | |
| 4362 | - r_temp); | |
| 4363 | -#ifdef TARGET_SPARC64 | |
| 4364 | - if (IS_IMM) { | |
| 4365 | - int offset; | |
| 4366 | - | |
| 4367 | - offset = GET_FIELD(insn, 25, 31); | |
| 4368 | - tcg_gen_addi_tl(cpu_T[0], cpu_T[0], offset); | |
| 4369 | - tcg_gen_ld_i32(r_dword, cpu_env, offsetof(CPUSPARCState, asi)); | |
| 4370 | - } else { | |
| 4371 | -#endif | |
| 4372 | - asi = GET_FIELD(insn, 19, 26); | |
| 4373 | - tcg_gen_movi_i32(r_temp, asi); | |
| 4374 | -#ifdef TARGET_SPARC64 | |
| 4375 | - } | |
| 4376 | -#endif | |
| 4377 | - tcg_gen_movi_i32(r_size, 8); | |
| 4378 | - tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], r_dword, r_temp, r_size); | |
| 4250 | + gen_stda_asi(insn, rd); | |
| 4379 | 4251 | } |
| 4380 | 4252 | break; |
| 4381 | 4253 | #endif | ... | ... |