Revision 4af984a7 target-sparc/translate.c

b/target-sparc/translate.c
471 471
    gen_set_label(l1);
472 472
}
473 473

  
474
static inline void gen_op_add_T1_T0_cc(void)
474
static inline void gen_op_add_cc(TCGv dst, TCGv src1, TCGv src2)
475 475
{
476
    tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
477
    tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
476
    tcg_gen_mov_tl(cpu_cc_src, src1);
477
    tcg_gen_add_tl(dst, src1, src2);
478 478
    gen_cc_clear_icc();
479
    gen_cc_NZ_icc(cpu_T[0]);
480
    gen_cc_C_add_icc(cpu_T[0], cpu_cc_src);
481
    gen_cc_V_add_icc(cpu_T[0], cpu_cc_src, cpu_T[1]);
479
    gen_cc_NZ_icc(dst);
480
    gen_cc_C_add_icc(dst, cpu_cc_src);
481
    gen_cc_V_add_icc(dst, cpu_cc_src, src2);
482 482
#ifdef TARGET_SPARC64
483 483
    gen_cc_clear_xcc();
484
    gen_cc_NZ_xcc(cpu_T[0]);
485
    gen_cc_C_add_xcc(cpu_T[0], cpu_cc_src);
486
    gen_cc_V_add_xcc(cpu_T[0], cpu_cc_src, cpu_T[1]);
484
    gen_cc_NZ_xcc(dst);
485
    gen_cc_C_add_xcc(dst, cpu_cc_src);
486
    gen_cc_V_add_xcc(dst, cpu_cc_src, src2);
487 487
#endif
488 488
}
489 489

  
490
static inline void gen_op_addx_T1_T0_cc(void)
490
static inline void gen_op_addx_cc(TCGv dst, TCGv src1, TCGv src2)
491 491
{
492
    tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
492
    tcg_gen_mov_tl(cpu_cc_src, src1);
493 493
    gen_mov_reg_C(cpu_tmp0, cpu_psr);
494
    tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_tmp0);
494
    tcg_gen_add_tl(dst, src1, cpu_tmp0);
495 495
    gen_cc_clear_icc();
496
    gen_cc_C_add_icc(cpu_T[0], cpu_cc_src);
496
    gen_cc_C_add_icc(dst, cpu_cc_src);
497 497
#ifdef TARGET_SPARC64
498 498
    gen_cc_clear_xcc();
499
    gen_cc_C_add_xcc(cpu_T[0], cpu_cc_src);
499
    gen_cc_C_add_xcc(dst, cpu_cc_src);
500 500
#endif
501
    tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
502
    gen_cc_NZ_icc(cpu_T[0]);
503
    gen_cc_C_add_icc(cpu_T[0], cpu_cc_src);
504
    gen_cc_V_add_icc(cpu_T[0], cpu_cc_src, cpu_T[1]);
501
    tcg_gen_add_tl(dst, dst, src2);
502
    gen_cc_NZ_icc(dst);
503
    gen_cc_C_add_icc(dst, cpu_cc_src);
504
    gen_cc_V_add_icc(dst, cpu_cc_src, src2);
505 505
#ifdef TARGET_SPARC64
506
    gen_cc_NZ_xcc(cpu_T[0]);
507
    gen_cc_C_add_xcc(cpu_T[0], cpu_cc_src);
508
    gen_cc_V_add_xcc(cpu_T[0], cpu_cc_src, cpu_T[1]);
506
    gen_cc_NZ_xcc(dst);
507
    gen_cc_C_add_xcc(dst, cpu_cc_src);
508
    gen_cc_V_add_xcc(dst, cpu_cc_src, src2);
509 509
#endif
510 510
}
511 511

  
512
static inline void gen_op_tadd_T1_T0_cc(void)
512
static inline void gen_op_tadd_cc(TCGv dst, TCGv src1, TCGv src2)
513 513
{
514
    tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
515
    tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
514
    tcg_gen_mov_tl(cpu_cc_src, src1);
515
    tcg_gen_add_tl(dst, src1, src2);
516 516
    gen_cc_clear_icc();
517
    gen_cc_NZ_icc(cpu_T[0]);
518
    gen_cc_C_add_icc(cpu_T[0], cpu_cc_src);
519
    gen_cc_V_add_icc(cpu_T[0], cpu_cc_src, cpu_T[1]);
520
    gen_cc_V_tag(cpu_cc_src, cpu_T[1]);
517
    gen_cc_NZ_icc(dst);
518
    gen_cc_C_add_icc(dst, cpu_cc_src);
519
    gen_cc_V_add_icc(dst, cpu_cc_src, src2);
520
    gen_cc_V_tag(cpu_cc_src, src2);
521 521
#ifdef TARGET_SPARC64
522 522
    gen_cc_clear_xcc();
523
    gen_cc_NZ_xcc(cpu_T[0]);
524
    gen_cc_C_add_xcc(cpu_T[0], cpu_cc_src);
525
    gen_cc_V_add_xcc(cpu_T[0], cpu_cc_src, cpu_T[1]);
523
    gen_cc_NZ_xcc(dst);
524
    gen_cc_C_add_xcc(dst, cpu_cc_src);
525
    gen_cc_V_add_xcc(dst, cpu_cc_src, src2);
526 526
#endif
527 527
}
528 528

  
529
static inline void gen_op_tadd_T1_T0_ccTV(void)
529
static inline void gen_op_tadd_ccTV(TCGv dst, TCGv src1, TCGv src2)
530 530
{
531
    gen_tag_tv(cpu_T[0], cpu_T[1]);
532
    tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
533
    tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
534
    gen_add_tv(cpu_T[0], cpu_cc_src, cpu_T[1]);
531
    gen_tag_tv(src1, src2);
532
    tcg_gen_mov_tl(cpu_cc_src, src1);
533
    tcg_gen_add_tl(dst, src1, src2);
534
    gen_add_tv(dst, cpu_cc_src, src2);
535 535
    gen_cc_clear_icc();
536
    gen_cc_NZ_icc(cpu_T[0]);
537
    gen_cc_C_add_icc(cpu_T[0], cpu_cc_src);
536
    gen_cc_NZ_icc(dst);
537
    gen_cc_C_add_icc(dst, cpu_cc_src);
538 538
#ifdef TARGET_SPARC64
539 539
    gen_cc_clear_xcc();
540
    gen_cc_NZ_xcc(cpu_T[0]);
541
    gen_cc_C_add_xcc(cpu_T[0], cpu_cc_src);
542
    gen_cc_V_add_xcc(cpu_T[0], cpu_cc_src, cpu_T[1]);
540
    gen_cc_NZ_xcc(dst);
541
    gen_cc_C_add_xcc(dst, cpu_cc_src);
542
    gen_cc_V_add_xcc(dst, cpu_cc_src, src2);
543 543
#endif
544 544
}
545 545

  
......
632 632
    tcg_gen_discard_tl(r_temp);
633 633
}
634 634

  
635
static inline void gen_op_sub_T1_T0_cc(void)
635
static inline void gen_op_sub_cc(TCGv dst, TCGv src1, TCGv src2)
636 636
{
637
    tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
638
    tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
637
    tcg_gen_mov_tl(cpu_cc_src, src1);
638
    tcg_gen_sub_tl(dst, src1, src2);
639 639
    gen_cc_clear_icc();
640
    gen_cc_NZ_icc(cpu_T[0]);
641
    gen_cc_C_sub_icc(cpu_cc_src, cpu_T[1]);
642
    gen_cc_V_sub_icc(cpu_T[0], cpu_cc_src, cpu_T[1]);
640
    gen_cc_NZ_icc(dst);
641
    gen_cc_C_sub_icc(cpu_cc_src, src2);
642
    gen_cc_V_sub_icc(dst, cpu_cc_src, src2);
643 643
#ifdef TARGET_SPARC64
644 644
    gen_cc_clear_xcc();
645
    gen_cc_NZ_xcc(cpu_T[0]);
646
    gen_cc_C_sub_xcc(cpu_cc_src, cpu_T[1]);
647
    gen_cc_V_sub_xcc(cpu_T[0], cpu_cc_src, cpu_T[1]);
645
    gen_cc_NZ_xcc(dst);
646
    gen_cc_C_sub_xcc(cpu_cc_src, src2);
647
    gen_cc_V_sub_xcc(dst, cpu_cc_src, src2);
648 648
#endif
649 649
}
650 650

  
651
static inline void gen_op_subx_T1_T0_cc(void)
651
static inline void gen_op_subx_cc(TCGv dst, TCGv src1, TCGv src2)
652 652
{
653
    tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
653
    tcg_gen_mov_tl(cpu_cc_src, src1);
654 654
    gen_mov_reg_C(cpu_tmp0, cpu_psr);
655
    tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_tmp0);
655
    tcg_gen_sub_tl(dst, src1, cpu_tmp0);
656 656
    gen_cc_clear_icc();
657
    gen_cc_C_sub_icc(cpu_T[0], cpu_cc_src);
657
    gen_cc_C_sub_icc(dst, cpu_cc_src);
658 658
#ifdef TARGET_SPARC64
659 659
    gen_cc_clear_xcc();
660
    gen_cc_C_sub_xcc(cpu_T[0], cpu_cc_src);
660
    gen_cc_C_sub_xcc(dst, cpu_cc_src);
661 661
#endif
662
    tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
663
    gen_cc_NZ_icc(cpu_T[0]);
664
    gen_cc_C_sub_icc(cpu_T[0], cpu_cc_src);
665
    gen_cc_V_sub_icc(cpu_T[0], cpu_cc_src, cpu_T[1]);
662
    tcg_gen_sub_tl(dst, dst, src2);
663
    gen_cc_NZ_icc(dst);
664
    gen_cc_C_sub_icc(dst, cpu_cc_src);
665
    gen_cc_V_sub_icc(dst, cpu_cc_src, src2);
666 666
#ifdef TARGET_SPARC64
667
    gen_cc_NZ_xcc(cpu_T[0]);
668
    gen_cc_C_sub_xcc(cpu_T[0], cpu_cc_src);
669
    gen_cc_V_sub_xcc(cpu_T[0], cpu_cc_src, cpu_T[1]);
667
    gen_cc_NZ_xcc(dst);
668
    gen_cc_C_sub_xcc(dst, cpu_cc_src);
669
    gen_cc_V_sub_xcc(dst, cpu_cc_src, src2);
670 670
#endif
671 671
}
672 672

  
673
static inline void gen_op_tsub_T1_T0_cc(void)
673
static inline void gen_op_tsub_cc(TCGv dst, TCGv src1, TCGv src2)
674 674
{
675
    tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
676
    tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
675
    tcg_gen_mov_tl(cpu_cc_src, src1);
676
    tcg_gen_sub_tl(dst, src1, src2);
677 677
    gen_cc_clear_icc();
678
    gen_cc_NZ_icc(cpu_T[0]);
679
    gen_cc_C_sub_icc(cpu_cc_src, cpu_T[1]);
680
    gen_cc_V_sub_icc(cpu_T[0], cpu_cc_src, cpu_T[1]);
681
    gen_cc_V_tag(cpu_cc_src, cpu_T[1]);
678
    gen_cc_NZ_icc(dst);
679
    gen_cc_C_sub_icc(cpu_cc_src, src2);
680
    gen_cc_V_sub_icc(dst, cpu_cc_src, src2);
681
    gen_cc_V_tag(cpu_cc_src, src2);
682 682
#ifdef TARGET_SPARC64
683 683
    gen_cc_clear_xcc();
684
    gen_cc_NZ_xcc(cpu_T[0]);
685
    gen_cc_C_sub_xcc(cpu_cc_src, cpu_T[1]);
686
    gen_cc_V_sub_xcc(cpu_T[0], cpu_cc_src, cpu_T[1]);
684
    gen_cc_NZ_xcc(dst);
685
    gen_cc_C_sub_xcc(cpu_cc_src, src2);
686
    gen_cc_V_sub_xcc(dst, cpu_cc_src, src2);
687 687
#endif
688 688
}
689 689

  
690
static inline void gen_op_tsub_T1_T0_ccTV(void)
690
static inline void gen_op_tsub_ccTV(TCGv dst, TCGv src1, TCGv src2)
691 691
{
692
    gen_tag_tv(cpu_T[0], cpu_T[1]);
693
    tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
694
    tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
695
    gen_sub_tv(cpu_T[0], cpu_cc_src, cpu_T[1]);
692
    gen_tag_tv(src1, src2);
693
    tcg_gen_mov_tl(cpu_cc_src, src1);
694
    tcg_gen_sub_tl(dst, src1, src2);
695
    gen_sub_tv(dst, cpu_cc_src, src2);
696 696
    gen_cc_clear_icc();
697
    gen_cc_NZ_icc(cpu_T[0]);
698
    gen_cc_C_sub_icc(cpu_cc_src, cpu_T[1]);
697
    gen_cc_NZ_icc(dst);
698
    gen_cc_C_sub_icc(cpu_cc_src, src2);
699 699
#ifdef TARGET_SPARC64
700 700
    gen_cc_clear_xcc();
701
    gen_cc_NZ_xcc(cpu_T[0]);
702
    gen_cc_C_sub_xcc(cpu_cc_src, cpu_T[1]);
703
    gen_cc_V_sub_xcc(cpu_T[0], cpu_cc_src, cpu_T[1]);
701
    gen_cc_NZ_xcc(dst);
702
    gen_cc_C_sub_xcc(cpu_cc_src, src2);
703
    gen_cc_V_sub_xcc(dst, cpu_cc_src, src2);
704 704
#endif
705 705
}
706 706

  
707
static inline void gen_op_mulscc_T1_T0(void)
707
static inline void gen_op_mulscc(TCGv dst, TCGv src1, TCGv src2)
708 708
{
709 709
    TCGv r_temp, r_temp2;
710 710
    int l1, l2;
......
722 722
    tcg_gen_trunc_tl_i32(r_temp2, r_temp);
723 723
    tcg_gen_andi_i32(r_temp2, r_temp2, 0x1);
724 724
    tcg_gen_brcond_i32(TCG_COND_EQ, r_temp2, tcg_const_i32(0), l1);
725
    tcg_gen_mov_tl(cpu_cc_src2, cpu_T[1]);
725
    tcg_gen_mov_tl(cpu_cc_src2, src2);
726 726
    tcg_gen_br(l2);
727 727
    gen_set_label(l1);
728 728
    tcg_gen_movi_tl(cpu_cc_src2, 0);
......
730 730

  
731 731
    // b2 = T0 & 1;
732 732
    // env->y = (b2 << 31) | (env->y >> 1);
733
    tcg_gen_trunc_tl_i32(r_temp2, cpu_T[0]);
733
    tcg_gen_trunc_tl_i32(r_temp2, src1);
734 734
    tcg_gen_andi_i32(r_temp2, r_temp2, 0x1);
735 735
    tcg_gen_shli_i32(r_temp2, r_temp2, 31);
736 736
    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, y));
......
746 746
    // T0 = (b1 << 31) | (T0 >> 1);
747 747
    // src1 = T0;
748 748
    tcg_gen_shli_tl(cpu_tmp0, cpu_tmp0, 31);
749
    tcg_gen_shri_tl(cpu_cc_src, cpu_T[0], 1);
749
    tcg_gen_shri_tl(cpu_cc_src, src1, 1);
750 750
    tcg_gen_or_tl(cpu_cc_src, cpu_cc_src, cpu_tmp0);
751 751

  
752 752
    /* do addition and update flags */
753
    tcg_gen_add_tl(cpu_T[0], cpu_cc_src, cpu_cc_src2);
753
    tcg_gen_add_tl(dst, cpu_cc_src, cpu_cc_src2);
754 754
    tcg_gen_discard_tl(r_temp);
755 755

  
756 756
    gen_cc_clear_icc();
757
    gen_cc_NZ_icc(cpu_T[0]);
758
    gen_cc_V_add_icc(cpu_T[0], cpu_cc_src, cpu_cc_src2);
759
    gen_cc_C_add_icc(cpu_T[0], cpu_cc_src);
757
    gen_cc_NZ_icc(dst);
758
    gen_cc_V_add_icc(dst, cpu_cc_src, cpu_cc_src2);
759
    gen_cc_C_add_icc(dst, cpu_cc_src);
760 760
}
761 761

  
762
static inline void gen_op_umul_T1_T0(void)
762
static inline void gen_op_umul(TCGv dst, TCGv src1, TCGv src2)
763 763
{
764 764
    TCGv r_temp, r_temp2;
765 765

  
766 766
    r_temp = tcg_temp_new(TCG_TYPE_I64);
767 767
    r_temp2 = tcg_temp_new(TCG_TYPE_I64);
768 768

  
769
    tcg_gen_extu_tl_i64(r_temp, cpu_T[1]);
770
    tcg_gen_extu_tl_i64(r_temp2, cpu_T[0]);
769
    tcg_gen_extu_tl_i64(r_temp, src2);
770
    tcg_gen_extu_tl_i64(r_temp2, src1);
771 771
    tcg_gen_mul_i64(r_temp2, r_temp, r_temp2);
772 772

  
773 773
    tcg_gen_shri_i64(r_temp, r_temp2, 32);
774 774
    tcg_gen_trunc_i64_i32(r_temp, r_temp);
775 775
    tcg_gen_st_i32(r_temp, cpu_env, offsetof(CPUSPARCState, y));
776 776
#ifdef TARGET_SPARC64
777
    tcg_gen_mov_i64(cpu_T[0], r_temp2);
777
    tcg_gen_mov_i64(dst, r_temp2);
778 778
#else
779
    tcg_gen_trunc_i64_tl(cpu_T[0], r_temp2);
779
    tcg_gen_trunc_i64_tl(dst, r_temp2);
780 780
#endif
781 781

  
782 782
    tcg_gen_discard_i64(r_temp);
783 783
    tcg_gen_discard_i64(r_temp2);
784 784
}
785 785

  
786
static inline void gen_op_smul_T1_T0(void)
786
static inline void gen_op_smul(TCGv dst, TCGv src1, TCGv src2)
787 787
{
788 788
    TCGv r_temp, r_temp2;
789 789

  
790 790
    r_temp = tcg_temp_new(TCG_TYPE_I64);
791 791
    r_temp2 = tcg_temp_new(TCG_TYPE_I64);
792 792

  
793
    tcg_gen_ext_tl_i64(r_temp, cpu_T[1]);
794
    tcg_gen_ext_tl_i64(r_temp2, cpu_T[0]);
793
    tcg_gen_ext_tl_i64(r_temp, src2);
794
    tcg_gen_ext_tl_i64(r_temp2, src1);
795 795
    tcg_gen_mul_i64(r_temp2, r_temp, r_temp2);
796 796

  
797 797
    tcg_gen_shri_i64(r_temp, r_temp2, 32);
798 798
    tcg_gen_trunc_i64_i32(r_temp, r_temp);
799 799
    tcg_gen_st_i32(r_temp, cpu_env, offsetof(CPUSPARCState, y));
800 800
#ifdef TARGET_SPARC64
801
    tcg_gen_mov_i64(cpu_T[0], r_temp2);
801
    tcg_gen_mov_i64(dst, r_temp2);
802 802
#else
803
    tcg_gen_trunc_i64_tl(cpu_T[0], r_temp2);
803
    tcg_gen_trunc_i64_tl(dst, r_temp2);
804 804
#endif
805 805

  
806 806
    tcg_gen_discard_i64(r_temp);
......
818 818
    gen_set_label(l1);
819 819
}
820 820

  
821
static inline void gen_op_sdivx_T1_T0(void)
821
static inline void gen_op_sdivx(TCGv dst, TCGv src1, TCGv src2)
822 822
{
823 823
    int l1, l2;
824 824

  
825 825
    l1 = gen_new_label();
826 826
    l2 = gen_new_label();
827
    gen_trap_ifdivzero_tl(cpu_T[1]);
828
    tcg_gen_brcond_tl(TCG_COND_NE, cpu_T[0], tcg_const_tl(INT64_MIN), l1);
829
    tcg_gen_brcond_tl(TCG_COND_NE, cpu_T[1], tcg_const_tl(-1), l1);
830
    tcg_gen_movi_i64(cpu_T[0], INT64_MIN);
827
    gen_trap_ifdivzero_tl(src2);
828
    tcg_gen_brcond_tl(TCG_COND_NE, src1, tcg_const_tl(INT64_MIN), l1);
829
    tcg_gen_brcond_tl(TCG_COND_NE, src2, tcg_const_tl(-1), l1);
830
    tcg_gen_movi_i64(dst, INT64_MIN);
831 831
    tcg_gen_br(l2);
832 832
    gen_set_label(l1);
833
    tcg_gen_div_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
833
    tcg_gen_div_i64(dst, src1, src2);
834 834
    gen_set_label(l2);
835 835
}
836 836
#endif
837 837

  
838
static inline void gen_op_div_cc(void)
838
static inline void gen_op_div_cc(TCGv dst)
839 839
{
840 840
    int l1;
841 841

  
842 842
    gen_cc_clear_icc();
843
    gen_cc_NZ_icc(cpu_T[0]);
843
    gen_cc_NZ_icc(dst);
844 844
    l1 = gen_new_label();
845 845
    tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, cc_src2));
846 846
    tcg_gen_brcond_tl(TCG_COND_EQ, cpu_tmp0, tcg_const_tl(0), l1);
......
848 848
    gen_set_label(l1);
849 849
}
850 850

  
851
static inline void gen_op_logic_T0_cc(void)
851
static inline void gen_op_logic_cc(TCGv dst)
852 852
{
853 853
    gen_cc_clear_icc();
854
    gen_cc_NZ_icc(cpu_T[0]);
854
    gen_cc_NZ_icc(dst);
855 855
#ifdef TARGET_SPARC64
856 856
    gen_cc_clear_xcc();
857
    gen_cc_NZ_xcc(cpu_T[0]);
857
    gen_cc_NZ_xcc(dst);
858 858
#endif
859 859
}
860 860

  
......
1177 1177
    gen_set_label(l2);
1178 1178
}
1179 1179

  
1180
/* call this function before using T2 as it may have been set for a jump */
1181
static inline void flush_T2(DisasContext * dc)
1180
/* call this function before using the condition register as it may
1181
   have been set for a jump */
1182
static inline void flush_cond(DisasContext *dc, TCGv cond)
1182 1183
{
1183 1184
    if (dc->npc == JUMP_PC) {
1184
        gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1], cpu_T[2]);
1185
        gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1], cond);
1185 1186
        dc->npc = DYNAMIC_PC;
1186 1187
    }
1187 1188
}
1188 1189

  
1189
static inline void save_npc(DisasContext * dc)
1190
static inline void save_npc(DisasContext *dc, TCGv cond)
1190 1191
{
1191 1192
    if (dc->npc == JUMP_PC) {
1192
        gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1], cpu_T[2]);
1193
        gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1], cond);
1193 1194
        dc->npc = DYNAMIC_PC;
1194 1195
    } else if (dc->npc != DYNAMIC_PC) {
1195 1196
        tcg_gen_movi_tl(cpu_npc, dc->npc);
1196 1197
    }
1197 1198
}
1198 1199

  
1199
static inline void save_state(DisasContext * dc)
1200
static inline void save_state(DisasContext *dc, TCGv cond)
1200 1201
{
1201 1202
    tcg_gen_movi_tl(cpu_pc, dc->pc);
1202
    save_npc(dc);
1203
    save_npc(dc, cond);
1203 1204
}
1204 1205

  
1205
static inline void gen_mov_pc_npc(DisasContext * dc)
1206
static inline void gen_mov_pc_npc(DisasContext *dc, TCGv cond)
1206 1207
{
1207 1208
    if (dc->npc == JUMP_PC) {
1208
        gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1], cpu_T[2]);
1209
        gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1], cond);
1209 1210
        tcg_gen_mov_tl(cpu_pc, cpu_npc);
1210 1211
        dc->pc = DYNAMIC_PC;
1211 1212
    } else if (dc->npc == DYNAMIC_PC) {
......
1371 1372
    TCG_COND_LT,
1372 1373
};
1373 1374

  
1374
static inline void gen_cond_reg(TCGv r_dst, int cond)
1375
static inline void gen_cond_reg(TCGv r_dst, int cond, TCGv r_src)
1375 1376
{
1376 1377
    int l1;
1377 1378

  
1378 1379
    l1 = gen_new_label();
1379 1380
    tcg_gen_movi_tl(r_dst, 0);
1380
    tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_T[0], tcg_const_tl(0), l1);
1381
    tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], r_src, tcg_const_tl(0), l1);
1381 1382
    tcg_gen_movi_tl(r_dst, 1);
1382 1383
    gen_set_label(l1);
1383 1384
}
1384 1385
#endif
1385 1386

  
1386 1387
/* XXX: potentially incorrect if dynamic npc */
1387
static void do_branch(DisasContext * dc, int32_t offset, uint32_t insn, int cc)
1388
static void do_branch(DisasContext *dc, int32_t offset, uint32_t insn, int cc,
1389
                      TCGv r_cond)
1388 1390
{
1389 1391
    unsigned int cond = GET_FIELD(insn, 3, 6), a = (insn & (1 << 29));
1390 1392
    target_ulong target = dc->pc + offset;
......
1408 1410
            dc->npc = target;
1409 1411
        }
1410 1412
    } else {
1411
        flush_T2(dc);
1412
        gen_cond(cpu_T[2], cc, cond);
1413
        flush_cond(dc, r_cond);
1414
        gen_cond(r_cond, cc, cond);
1413 1415
        if (a) {
1414
            gen_branch_a(dc, target, dc->npc, cpu_T[2]);
1416
            gen_branch_a(dc, target, dc->npc, r_cond);
1415 1417
            dc->is_br = 1;
1416 1418
        } else {
1417 1419
            dc->pc = dc->npc;
......
1423 1425
}
1424 1426

  
1425 1427
/* XXX: potentially incorrect if dynamic npc */
1426
static void do_fbranch(DisasContext * dc, int32_t offset, uint32_t insn, int cc)
1428
static void do_fbranch(DisasContext *dc, int32_t offset, uint32_t insn, int cc,
1429
                      TCGv r_cond)
1427 1430
{
1428 1431
    unsigned int cond = GET_FIELD(insn, 3, 6), a = (insn & (1 << 29));
1429 1432
    target_ulong target = dc->pc + offset;
......
1447 1450
            dc->npc = target;
1448 1451
        }
1449 1452
    } else {
1450
        flush_T2(dc);
1451
        gen_fcond(cpu_T[2], cc, cond);
1453
        flush_cond(dc, r_cond);
1454
        gen_fcond(r_cond, cc, cond);
1452 1455
        if (a) {
1453
            gen_branch_a(dc, target, dc->npc, cpu_T[2]);
1456
            gen_branch_a(dc, target, dc->npc, r_cond);
1454 1457
            dc->is_br = 1;
1455 1458
        } else {
1456 1459
            dc->pc = dc->npc;
......
1463 1466

  
1464 1467
#ifdef TARGET_SPARC64
1465 1468
/* XXX: potentially incorrect if dynamic npc */
1466
static void do_branch_reg(DisasContext * dc, int32_t offset, uint32_t insn)
1469
static void do_branch_reg(DisasContext *dc, int32_t offset, uint32_t insn,
1470
                          TCGv r_cond, TCGv r_reg)
1467 1471
{
1468 1472
    unsigned int cond = GET_FIELD_SP(insn, 25, 27), a = (insn & (1 << 29));
1469 1473
    target_ulong target = dc->pc + offset;
1470 1474

  
1471
    flush_T2(dc);
1472
    gen_cond_reg(cpu_T[2], cond);
1475
    flush_cond(dc, r_cond);
1476
    gen_cond_reg(r_cond, cond, r_reg);
1473 1477
    if (a) {
1474
        gen_branch_a(dc, target, dc->npc, cpu_T[2]);
1478
        gen_branch_a(dc, target, dc->npc, r_cond);
1475 1479
        dc->is_br = 1;
1476 1480
    } else {
1477 1481
        dc->pc = dc->npc;
......
1606 1610
    tcg_gen_helper_0_1(raise_exception, tcg_const_i32(TT_FP_EXCP));
1607 1611
}
1608 1612

  
1609
static int gen_trap_ifnofpu(DisasContext * dc)
1613
static int gen_trap_ifnofpu(DisasContext *dc, TCGv r_cond)
1610 1614
{
1611 1615
#if !defined(CONFIG_USER_ONLY)
1612 1616
    if (!dc->fpu_enabled) {
1613
        save_state(dc);
1617
        save_state(dc, r_cond);
1614 1618
        tcg_gen_helper_0_1(raise_exception, tcg_const_i32(TT_NFPU_INSN));
1615 1619
        dc->is_br = 1;
1616 1620
        return 1;
......
1629 1633
    tcg_gen_helper_0_0(helper_clear_float_exceptions);
1630 1634
}
1631 1635

  
1632
static inline void gen_check_align(TCGv r_addr, int align)
1633
{
1634
    tcg_gen_helper_0_2(helper_check_align, r_addr, tcg_const_i32(align));
1635
}
1636

  
1637
static inline void gen_op_check_align_T0_1(void)
1638
{
1639
    gen_check_align(cpu_T[0], 1);
1640
}
1641

  
1642
static inline void gen_op_check_align_T0_3(void)
1643
{
1644
    gen_check_align(cpu_T[0], 3);
1645
}
1646

  
1647
static inline void gen_op_check_align_T0_7(void)
1648
{
1649
    gen_check_align(cpu_T[0], 7);
1650
}
1651

  
1652 1636
/* asi moves */
1653 1637
#ifdef TARGET_SPARC64
1654 1638
static inline TCGv gen_get_asi(int insn, TCGv r_addr)
......
1668 1652
    return r_asi;
1669 1653
}
1670 1654

  
1671
static inline void gen_ld_asi(int insn, int size, int sign)
1655
static inline void gen_ld_asi(TCGv dst, TCGv addr, int insn, int size, int sign)
1672 1656
{
1673 1657
    TCGv r_asi;
1674 1658

  
1675
    r_asi = gen_get_asi(insn, cpu_T[0]);
1676
    tcg_gen_helper_1_4(helper_ld_asi, cpu_T[1], cpu_T[0], r_asi,
1659
    r_asi = gen_get_asi(insn, addr);
1660
    tcg_gen_helper_1_4(helper_ld_asi, dst, addr, r_asi,
1677 1661
                       tcg_const_i32(size), tcg_const_i32(sign));
1678 1662
    tcg_gen_discard_i32(r_asi);
1679 1663
}
1680 1664

  
1681
static inline void gen_st_asi(int insn, int size)
1665
static inline void gen_st_asi(TCGv src, TCGv addr, int insn, int size)
1682 1666
{
1683 1667
    TCGv r_asi;
1684 1668

  
1685
    r_asi = gen_get_asi(insn, cpu_T[0]);
1686
    tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], cpu_T[1], r_asi,
1687
                       tcg_const_i32(size));
1669
    r_asi = gen_get_asi(insn, addr);
1670
    tcg_gen_helper_0_4(helper_st_asi, addr, src, r_asi, tcg_const_i32(size));
1688 1671
    tcg_gen_discard_i32(r_asi);
1689 1672
}
1690 1673

  
1691
static inline void gen_ldf_asi(int insn, int size, int rd)
1674
static inline void gen_ldf_asi(TCGv addr, int insn, int size, int rd)
1692 1675
{
1693 1676
    TCGv r_asi;
1694 1677

  
1695
    r_asi = gen_get_asi(insn, cpu_T[0]);
1696
    tcg_gen_helper_0_4(helper_ldf_asi, cpu_T[0], r_asi, tcg_const_i32(size),
1678
    r_asi = gen_get_asi(insn, addr);
1679
    tcg_gen_helper_0_4(helper_ldf_asi, addr, r_asi, tcg_const_i32(size),
1697 1680
                       tcg_const_i32(rd));
1698 1681
    tcg_gen_discard_i32(r_asi);
1699 1682
}
1700 1683

  
1701
static inline void gen_stf_asi(int insn, int size, int rd)
1684
static inline void gen_stf_asi(TCGv addr, int insn, int size, int rd)
1702 1685
{
1703 1686
    TCGv r_asi;
1704 1687

  
......
1708 1691
    tcg_gen_discard_i32(r_asi);
1709 1692
}
1710 1693

  
1711
static inline void gen_swap_asi(int insn)
1694
static inline void gen_swap_asi(TCGv dst, TCGv addr, int insn)
1712 1695
{
1713 1696
    TCGv r_temp, r_asi;
1714 1697

  
1715 1698
    r_temp = tcg_temp_new(TCG_TYPE_I32);
1716
    r_asi = gen_get_asi(insn, cpu_T[0]);
1717
    tcg_gen_helper_1_4(helper_ld_asi, r_temp, cpu_T[0], r_asi,
1699
    r_asi = gen_get_asi(insn, addr);
1700
    tcg_gen_helper_1_4(helper_ld_asi, r_temp, addr, r_asi,
1718 1701
                       tcg_const_i32(4), tcg_const_i32(0));
1719
    tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], r_temp, r_asi,
1702
    tcg_gen_helper_0_4(helper_st_asi, addr, dst, r_asi,
1720 1703
                       tcg_const_i32(4));
1721
    tcg_gen_extu_i32_tl(cpu_T[1], r_temp);
1704
    tcg_gen_extu_i32_tl(dst, r_temp);
1722 1705
    tcg_gen_discard_i32(r_asi);
1723 1706
    tcg_gen_discard_i32(r_temp);
1724 1707
}
1725 1708

  
1726
static inline void gen_ldda_asi(int insn)
1709
static inline void gen_ldda_asi(TCGv lo, TCGv hi, TCGv addr, int insn)
1727 1710
{
1728 1711
    TCGv r_asi;
1729 1712

  
1730
    r_asi = gen_get_asi(insn, cpu_T[0]);
1731
    tcg_gen_helper_1_4(helper_ld_asi, cpu_tmp64, cpu_T[0], r_asi,
1713
    r_asi = gen_get_asi(insn, addr);
1714
    tcg_gen_helper_1_4(helper_ld_asi, cpu_tmp64, addr, r_asi,
1732 1715
                       tcg_const_i32(8), tcg_const_i32(0));
1733
    tcg_gen_andi_i64(cpu_T[0], cpu_tmp64, 0xffffffffULL);
1716
    tcg_gen_andi_i64(lo, cpu_tmp64, 0xffffffffULL);
1734 1717
    tcg_gen_shri_i64(cpu_tmp64, cpu_tmp64, 32);
1735
    tcg_gen_andi_i64(cpu_T[1], cpu_tmp64, 0xffffffffULL);
1718
    tcg_gen_andi_i64(hi, cpu_tmp64, 0xffffffffULL);
1736 1719
    tcg_gen_discard_i32(r_asi);
1737 1720
}
1738 1721

  
1739
static inline void gen_stda_asi(int insn, int rd)
1722
static inline void gen_stda_asi(TCGv hi, TCGv addr, int insn, int rd)
1740 1723
{
1741 1724
    TCGv r_temp, r_asi;
1742 1725

  
1743 1726
    r_temp = tcg_temp_new(TCG_TYPE_I32);
1744 1727
    gen_movl_reg_TN(rd + 1, r_temp);
1745
    tcg_gen_helper_1_2(helper_pack64, cpu_tmp64, cpu_T[1],
1728
    tcg_gen_helper_1_2(helper_pack64, cpu_tmp64, hi,
1746 1729
                       r_temp);
1747
    r_asi = gen_get_asi(insn, cpu_T[0]);
1748
    tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], cpu_tmp64, r_asi,
1730
    r_asi = gen_get_asi(insn, addr);
1731
    tcg_gen_helper_0_4(helper_st_asi, addr, cpu_tmp64, r_asi,
1749 1732
                       tcg_const_i32(8));
1750 1733
    tcg_gen_discard_i32(r_asi);
1751 1734
    tcg_gen_discard_i32(r_temp);
1752 1735
}
1753 1736

  
1754
static inline void gen_cas_asi(int insn, int rd)
1737
static inline void gen_cas_asi(TCGv dst, TCGv addr, TCGv val2, int insn, int rd)
1755 1738
{
1756 1739
    TCGv r_val1, r_asi;
1757 1740

  
1758 1741
    r_val1 = tcg_temp_new(TCG_TYPE_I32);
1759 1742
    gen_movl_reg_TN(rd, r_val1);
1760
    r_asi = gen_get_asi(insn, cpu_T[0]);
1761
    tcg_gen_helper_1_4(helper_cas_asi, cpu_T[1], cpu_T[0], r_val1, cpu_T[1],
1762
                       r_asi);
1743
    r_asi = gen_get_asi(insn, addr);
1744
    tcg_gen_helper_1_4(helper_cas_asi, dst, addr, r_val1, val2, r_asi);
1763 1745
    tcg_gen_discard_i32(r_asi);
1764 1746
    tcg_gen_discard_i32(r_val1);
1765 1747
}
1766 1748

  
1767
static inline void gen_casx_asi(int insn, int rd)
1749
static inline void gen_casx_asi(TCGv dst, TCGv addr, TCGv val2, int insn, int rd)
1768 1750
{
1769 1751
    TCGv r_asi;
1770 1752

  
1771 1753
    gen_movl_reg_TN(rd, cpu_tmp64);
1772
    r_asi = gen_get_asi(insn, cpu_T[0]);
1773
    tcg_gen_helper_1_4(helper_casx_asi, cpu_T[1], cpu_T[0], cpu_tmp64, cpu_T[1],
1774
                       r_asi);
1754
    r_asi = gen_get_asi(insn, addr);
1755
    tcg_gen_helper_1_4(helper_casx_asi, dst, addr, cpu_tmp64, val2, r_asi);
1775 1756
    tcg_gen_discard_i32(r_asi);
1776 1757
}
1777 1758

  
1778 1759
#elif !defined(CONFIG_USER_ONLY)
1779 1760

  
1780
static inline void gen_ld_asi(int insn, int size, int sign)
1761
static inline void gen_ld_asi(TCGv dst, TCGv addr, int insn, int size, int sign)
1781 1762
{
1782 1763
    int asi;
1783 1764

  
1784 1765
    asi = GET_FIELD(insn, 19, 26);
1785
    tcg_gen_helper_1_4(helper_ld_asi, cpu_tmp64, cpu_T[0], tcg_const_i32(asi),
1766
    tcg_gen_helper_1_4(helper_ld_asi, cpu_tmp64, addr, tcg_const_i32(asi),
1786 1767
                       tcg_const_i32(size), tcg_const_i32(sign));
1787
    tcg_gen_trunc_i64_tl(cpu_T[1], cpu_tmp64);
1768
    tcg_gen_trunc_i64_tl(dst, cpu_tmp64);
1788 1769
}
1789 1770

  
1790
static inline void gen_st_asi(int insn, int size)
1771
static inline void gen_st_asi(TCGv src, TCGv addr, int insn, int size)
1791 1772
{
1792 1773
    int asi;
1793 1774

  
1794
    tcg_gen_extu_tl_i64(cpu_tmp64, cpu_T[1]);
1775
    tcg_gen_extu_tl_i64(cpu_tmp64, src);
1795 1776
    asi = GET_FIELD(insn, 19, 26);
1796
    tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], cpu_tmp64, tcg_const_i32(asi),
1777
    tcg_gen_helper_0_4(helper_st_asi, addr, cpu_tmp64, tcg_const_i32(asi),
1797 1778
                       tcg_const_i32(size));
1798 1779
}
1799 1780

  
1800
static inline void gen_swap_asi(int insn)
1781
static inline void gen_swap_asi(TCGv dst, TCGv addr, int insn)
1801 1782
{
1802 1783
    int asi;
1803 1784
    TCGv r_temp;
1804 1785

  
1805 1786
    r_temp = tcg_temp_new(TCG_TYPE_I32);
1806 1787
    asi = GET_FIELD(insn, 19, 26);
1807
    tcg_gen_helper_1_4(helper_ld_asi, r_temp, cpu_T[0], tcg_const_i32(asi),
1788
    tcg_gen_helper_1_4(helper_ld_asi, r_temp, addr, tcg_const_i32(asi),
1808 1789
                       tcg_const_i32(4), tcg_const_i32(0));
1809
    tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], cpu_T[1], tcg_const_i32(asi),
1790
    tcg_gen_helper_0_4(helper_st_asi, addr, dst, tcg_const_i32(asi),
1810 1791
                       tcg_const_i32(4));
1811
    tcg_gen_extu_i32_tl(cpu_T[1], r_temp);
1792
    tcg_gen_extu_i32_tl(dst, r_temp);
1812 1793
    tcg_gen_discard_i32(r_temp);
1813 1794
}
1814 1795

  
1815
static inline void gen_ldda_asi(int insn)
1796
static inline void gen_ldda_asi(TCGv lo, TCGv hi, TCGv addr, int insn)
1816 1797
{
1817 1798
    int asi;
1818 1799

  
1819 1800
    asi = GET_FIELD(insn, 19, 26);
1820
    tcg_gen_helper_1_4(helper_ld_asi, cpu_tmp64, cpu_T[0], tcg_const_i32(asi),
1801
    tcg_gen_helper_1_4(helper_ld_asi, cpu_tmp64, addr, tcg_const_i32(asi),
1821 1802
                       tcg_const_i32(8), tcg_const_i32(0));
1822
    tcg_gen_trunc_i64_tl(cpu_T[0], cpu_tmp64);
1803
    tcg_gen_trunc_i64_tl(lo, cpu_tmp64);
1823 1804
    tcg_gen_shri_i64(cpu_tmp64, cpu_tmp64, 32);
1824
    tcg_gen_trunc_i64_tl(cpu_T[1], cpu_tmp64);
1805
    tcg_gen_trunc_i64_tl(hi, cpu_tmp64);
1825 1806
}
1826 1807

  
1827
static inline void gen_stda_asi(int insn, int rd)
1808
static inline void gen_stda_asi(TCGv hi, TCGv addr, int insn, int rd)
1828 1809
{
1829 1810
    int asi;
1830 1811
    TCGv r_temp;
1831 1812

  
1832 1813
    r_temp = tcg_temp_new(TCG_TYPE_I32);
1833 1814
    gen_movl_reg_TN(rd + 1, r_temp);
1834
    tcg_gen_helper_1_2(helper_pack64, cpu_tmp64, cpu_T[1], r_temp);
1815
    tcg_gen_helper_1_2(helper_pack64, cpu_tmp64, hi, r_temp);
1835 1816
    asi = GET_FIELD(insn, 19, 26);
1836
    tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], cpu_tmp64, tcg_const_i32(asi),
1817
    tcg_gen_helper_0_4(helper_st_asi, addr, cpu_tmp64, tcg_const_i32(asi),
1837 1818
                       tcg_const_i32(8));
1838 1819
}
1839 1820
#endif
1840 1821

  
1841 1822
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64)
1842
static inline void gen_ldstub_asi(int insn)
1823
static inline void gen_ldstub_asi(TCGv dst, TCGv addr, int insn)
1843 1824
{
1844 1825
    int asi;
1845 1826

  
1846
    gen_ld_asi(insn, 1, 0);
1827
    gen_ld_asi(dst, addr, insn, 1, 0);
1847 1828

  
1848 1829
    asi = GET_FIELD(insn, 19, 26);
1849
    tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], tcg_const_i64(0xffULL),
1830
    tcg_gen_helper_0_4(helper_st_asi, addr, tcg_const_i64(0xffULL),
1850 1831
                       tcg_const_i32(asi), tcg_const_i32(1));
1851 1832
}
1852 1833
#endif
......
1876 1857
                    target <<= 2;
1877 1858
                    cc = GET_FIELD_SP(insn, 20, 21);
1878 1859
                    if (cc == 0)
1879
                        do_branch(dc, target, insn, 0);
1860
                        do_branch(dc, target, insn, 0, cpu_T[2]);
1880 1861
                    else if (cc == 2)
1881
                        do_branch(dc, target, insn, 1);
1862
                        do_branch(dc, target, insn, 1, cpu_T[2]);
1882 1863
                    else
1883 1864
                        goto illegal_insn;
1884 1865
                    goto jmp_insn;
......
1891 1872
                    target <<= 2;
1892 1873
                    rs1 = GET_FIELD(insn, 13, 17);
1893 1874
                    gen_movl_reg_TN(rs1, cpu_T[0]);
1894
                    do_branch_reg(dc, target, insn);
1875
                    do_branch_reg(dc, target, insn, cpu_T[2], cpu_T[0]);
1895 1876
                    goto jmp_insn;
1896 1877
                }
1897 1878
            case 0x5:           /* V9 FBPcc */
1898 1879
                {
1899 1880
                    int cc = GET_FIELD_SP(insn, 20, 21);
1900
                    if (gen_trap_ifnofpu(dc))
1881
                    if (gen_trap_ifnofpu(dc, cpu_T[2]))
1901 1882
                        goto jmp_insn;
1902 1883
                    target = GET_FIELD_SP(insn, 0, 18);
1903 1884
                    target = sign_extend(target, 19);
1904 1885
                    target <<= 2;
1905
                    do_fbranch(dc, target, insn, cc);
1886
                    do_fbranch(dc, target, insn, cc, cpu_T[2]);
1906 1887
                    goto jmp_insn;
1907 1888
                }
1908 1889
#else
......
1916 1897
                    target = GET_FIELD(insn, 10, 31);
1917 1898
                    target = sign_extend(target, 22);
1918 1899
                    target <<= 2;
1919
                    do_branch(dc, target, insn, 0);
1900
                    do_branch(dc, target, insn, 0, cpu_T[2]);
1920 1901
                    goto jmp_insn;
1921 1902
                }
1922 1903
            case 0x6:           /* FBN+x */
1923 1904
                {
1924
                    if (gen_trap_ifnofpu(dc))
1905
                    if (gen_trap_ifnofpu(dc, cpu_T[2]))
1925 1906
                        goto jmp_insn;
1926 1907
                    target = GET_FIELD(insn, 10, 31);
1927 1908
                    target = sign_extend(target, 22);
1928 1909
                    target <<= 2;
1929
                    do_fbranch(dc, target, insn, 0);
1910
                    do_fbranch(dc, target, insn, 0, cpu_T[2]);
1930 1911
                    goto jmp_insn;
1931 1912
                }
1932 1913
            case 0x4:           /* SETHI */
......
1954 1935

  
1955 1936
            gen_movl_TN_reg(15, tcg_const_tl(dc->pc));
1956 1937
            target += dc->pc;
1957
            gen_mov_pc_npc(dc);
1938
            gen_mov_pc_npc(dc, cpu_T[2]);
1958 1939
            dc->npc = target;
1959 1940
        }
1960 1941
        goto jmp_insn;
......
1982 1963
                }
1983 1964
                cond = GET_FIELD(insn, 3, 6);
1984 1965
                if (cond == 0x8) {
1985
                    save_state(dc);
1966
                    save_state(dc, cpu_T[2]);
1986 1967
                    tcg_gen_helper_0_1(helper_trap, cpu_T[0]);
1987 1968
                } else if (cond != 0) {
1988 1969
                    TCGv r_cond = tcg_temp_new(TCG_TYPE_TL);
......
1990 1971
                    /* V9 icc/xcc */
1991 1972
                    int cc = GET_FIELD_SP(insn, 11, 12);
1992 1973

  
1993
                    save_state(dc);
1974
                    save_state(dc, cpu_T[2]);
1994 1975
                    if (cc == 0)
1995 1976
                        gen_cond(r_cond, 0, cond);
1996 1977
                    else if (cc == 2)
......
1998 1979
                    else
1999 1980
                        goto illegal_insn;
2000 1981
#else
2001
                    save_state(dc);
1982
                    save_state(dc, cpu_T[2]);
2002 1983
                    gen_cond(r_cond, 0, cond);
2003 1984
#endif
2004 1985
                    tcg_gen_helper_0_2(helper_trapcc, cpu_T[0], r_cond);
......
2060 2041
                case 0xf: /* V9 membar */
2061 2042
                    break; /* no effect */
2062 2043
                case 0x13: /* Graphics Status */
2063
                    if (gen_trap_ifnofpu(dc))
2044
                    if (gen_trap_ifnofpu(dc, cpu_T[2]))
2064 2045
                        goto jmp_insn;
2065 2046
                    tcg_gen_ld_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState, gsr));
2066 2047
                    gen_movl_TN_reg(rd, cpu_T[0]);
......
2275 2256
                break;
2276 2257
#endif
2277 2258
            } else if (xop == 0x34) {   /* FPU Operations */
2278
                if (gen_trap_ifnofpu(dc))
2259
                if (gen_trap_ifnofpu(dc, cpu_T[2]))
2279 2260
                    goto jmp_insn;
2280 2261
                gen_op_clear_ieee_excp_and_FTT();
2281 2262
                rs1 = GET_FIELD(insn, 13, 17);
......
2650 2631
#ifdef TARGET_SPARC64
2651 2632
                int cond;
2652 2633
#endif
2653
                if (gen_trap_ifnofpu(dc))
2634
                if (gen_trap_ifnofpu(dc, cpu_T[2]))
2654 2635
                    goto jmp_insn;
2655 2636
                gen_op_clear_ieee_excp_and_FTT();
2656 2637
                rs1 = GET_FIELD(insn, 13, 17);
......
2977 2958
                    switch (xop & ~0x10) {
2978 2959
                    case 0x0:
2979 2960
                        if (xop & 0x10)
2980
                            gen_op_add_T1_T0_cc();
2961
                            gen_op_add_cc(cpu_T[0], cpu_T[0], cpu_T[1]);
2981 2962
                        else
2982 2963
                            tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
2983 2964
                        break;
2984 2965
                    case 0x1:
2985 2966
                        tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
2986 2967
                        if (xop & 0x10)
2987
                            gen_op_logic_T0_cc();
2968
                            gen_op_logic_cc(cpu_T[0]);
2988 2969
                        break;
2989 2970
                    case 0x2:
2990 2971
                        tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
2991 2972
                        if (xop & 0x10)
2992
                            gen_op_logic_T0_cc();
2973
                            gen_op_logic_cc(cpu_T[0]);
2993 2974
                        break;
2994 2975
                    case 0x3:
2995 2976
                        tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
2996 2977
                        if (xop & 0x10)
2997
                            gen_op_logic_T0_cc();
2978
                            gen_op_logic_cc(cpu_T[0]);
2998 2979
                        break;
2999 2980
                    case 0x4:
3000 2981
                        if (xop & 0x10)
3001
                            gen_op_sub_T1_T0_cc();
2982
                            gen_op_sub_cc(cpu_T[0], cpu_T[0], cpu_T[1]);
3002 2983
                        else
3003 2984
                            tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
3004 2985
                        break;
......
3006 2987
                        tcg_gen_xori_tl(cpu_T[1], cpu_T[1], -1);
3007 2988
                        tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
3008 2989
                        if (xop & 0x10)
3009
                            gen_op_logic_T0_cc();
2990
                            gen_op_logic_cc(cpu_T[0]);
3010 2991
                        break;
3011 2992
                    case 0x6:
3012 2993
                        tcg_gen_xori_tl(cpu_T[1], cpu_T[1], -1);
3013 2994
                        tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
3014 2995
                        if (xop & 0x10)
3015
                            gen_op_logic_T0_cc();
2996
                            gen_op_logic_cc(cpu_T[0]);
3016 2997
                        break;
3017 2998
                    case 0x7:
3018 2999
                        tcg_gen_xori_tl(cpu_T[1], cpu_T[1], -1);
3019 3000
                        tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
3020 3001
                        if (xop & 0x10)
3021
                            gen_op_logic_T0_cc();
3002
                            gen_op_logic_cc(cpu_T[0]);
3022 3003
                        break;
3023 3004
                    case 0x8:
3024 3005
                        if (xop & 0x10)
3025
                            gen_op_addx_T1_T0_cc();
3006
                            gen_op_addx_cc(cpu_T[0], cpu_T[0], cpu_T[1]);
3026 3007
                        else {
3027 3008
                            gen_mov_reg_C(cpu_tmp0, cpu_psr);
3028 3009
                            tcg_gen_add_tl(cpu_T[1], cpu_T[1], cpu_tmp0);
......
3035 3016
                        break;
3036 3017
#endif
3037 3018
                    case 0xa:
3038
                        gen_op_umul_T1_T0();
3019
                        gen_op_umul(cpu_T[0], cpu_T[0], cpu_T[1]);
3039 3020
                        if (xop & 0x10)
3040
                            gen_op_logic_T0_cc();
3021
                            gen_op_logic_cc(cpu_T[0]);
3041 3022
                        break;
3042 3023
                    case 0xb:
3043
                        gen_op_smul_T1_T0();
3024
                        gen_op_smul(cpu_T[0], cpu_T[0], cpu_T[1]);
3044 3025
                        if (xop & 0x10)
3045
                            gen_op_logic_T0_cc();
3026
                            gen_op_logic_cc(cpu_T[0]);
3046 3027
                        break;
3047 3028
                    case 0xc:
3048 3029
                        if (xop & 0x10)
3049
                            gen_op_subx_T1_T0_cc();
3030
                            gen_op_subx_cc(cpu_T[0], cpu_T[0], cpu_T[1]);
3050 3031
                        else {
3051 3032
                            gen_mov_reg_C(cpu_tmp0, cpu_psr);
3052 3033
                            tcg_gen_add_tl(cpu_T[1], cpu_T[1], cpu_tmp0);
......
3062 3043
                    case 0xe:
3063 3044
                        tcg_gen_helper_1_2(helper_udiv, cpu_T[0], cpu_T[0], cpu_T[1]);
3064 3045
                        if (xop & 0x10)
3065
                            gen_op_div_cc();
3046
                            gen_op_div_cc(cpu_T[0]);
3066 3047
                        break;
3067 3048
                    case 0xf:
3068 3049
                        tcg_gen_helper_1_2(helper_sdiv, cpu_T[0], cpu_T[0], cpu_T[1]);
3069 3050
                        if (xop & 0x10)
3070
                            gen_op_div_cc();
3051
                            gen_op_div_cc(cpu_T[0]);
3071 3052
                        break;
3072 3053
                    default:
3073 3054
                        goto illegal_insn;
......
3076 3057
                } else {
3077 3058
                    switch (xop) {
3078 3059
                    case 0x20: /* taddcc */
3079
                        gen_op_tadd_T1_T0_cc();
3060
                        gen_op_tadd_cc(cpu_T[0], cpu_T[0], cpu_T[1]);
3080 3061
                        gen_movl_TN_reg(rd, cpu_T[0]);
3081 3062
                        break;
3082 3063
                    case 0x21: /* tsubcc */
3083
                        gen_op_tsub_T1_T0_cc();
3064
                        gen_op_tsub_cc(cpu_T[0], cpu_T[0], cpu_T[1]);
3084 3065
                        gen_movl_TN_reg(rd, cpu_T[0]);
3085 3066
                        break;
3086 3067
                    case 0x22: /* taddcctv */
3087
                        save_state(dc);
3088
                        gen_op_tadd_T1_T0_ccTV();
3068
                        save_state(dc, cpu_T[2]);
3069
                        gen_op_tadd_ccTV(cpu_T[0], cpu_T[0], cpu_T[1]);
3089 3070
                        gen_movl_TN_reg(rd, cpu_T[0]);
3090 3071
                        break;
3091 3072
                    case 0x23: /* tsubcctv */
3092
                        save_state(dc);
3093
                        gen_op_tsub_T1_T0_ccTV();
3073
                        save_state(dc, cpu_T[2]);
3074
                        gen_op_tsub_ccTV(cpu_T[0], cpu_T[0], cpu_T[1]);
3094 3075
                        gen_movl_TN_reg(rd, cpu_T[0]);
3095 3076
                        break;
3096 3077
                    case 0x24: /* mulscc */
3097
                        gen_op_mulscc_T1_T0();
3078
                        gen_op_mulscc(cpu_T[0], cpu_T[0], cpu_T[1]);
3098 3079
                        gen_movl_TN_reg(rd, cpu_T[0]);
3099 3080
                        break;
3100 3081
#ifndef TARGET_SPARC64
......
3145 3126
                                tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
3146 3127
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
3147 3128
                                tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fprs));
3148
                                save_state(dc);
3129
                                save_state(dc, cpu_T[2]);
3149 3130
                                gen_op_next_insn();
3150 3131
                                tcg_gen_exit_tb(0);
3151 3132
                                dc->is_br = 1;
......
3157 3138
#endif
3158 3139
                                break;
3159 3140
                            case 0x13: /* Graphics Status */
3160
                                if (gen_trap_ifnofpu(dc))
3141
                                if (gen_trap_ifnofpu(dc, cpu_T[2]))
3161 3142
                                    goto jmp_insn;
3162 3143
                                tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
3163 3144
                                tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState, gsr));
......
3257 3238
#else
3258 3239
                            tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
3259 3240
                            tcg_gen_helper_0_1(helper_wrpsr, cpu_T[0]);
3260
                            save_state(dc);
3241
                            save_state(dc, cpu_T[2]);
3261 3242
                            gen_op_next_insn();
3262 3243
                            tcg_gen_exit_tb(0);
3263 3244
                            dc->is_br = 1;
......
3335 3316
                                tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState, tbr));
3336 3317
                                break;
3337 3318
                            case 6: // pstate
3338
                                save_state(dc);
3319
                                save_state(dc, cpu_T[2]);
3339 3320
                                tcg_gen_helper_0_1(helper_wrpstate, cpu_T[0]);
3340 3321
                                gen_op_next_insn();
3341 3322
                                tcg_gen_exit_tb(0);
......
3406 3387
                            switch (rd) {
3407 3388
                            case 0: // hpstate
3408 3389
                                // XXX gen_op_wrhpstate();
3409
                                save_state(dc);
3390
                                save_state(dc, cpu_T[2]);
3410 3391
                                gen_op_next_insn();
3411 3392
                                tcg_gen_exit_tb(0);
3412 3393
                                dc->is_br = 1;
......
3481 3462
                            break;
3482 3463
                        }
3483 3464
                    case 0x2d: /* V9 sdivx */
3484
                        gen_op_sdivx_T1_T0();
3465
                        gen_op_sdivx(cpu_T[0], cpu_T[0], cpu_T[1]);
3485 3466
                        gen_movl_TN_reg(rd, cpu_T[0]);
3486 3467
                        break;
3487 3468
                    case 0x2e: /* V9 popc */
......
3532 3513
                int opf = GET_FIELD_SP(insn, 5, 13);
3533 3514
                rs1 = GET_FIELD(insn, 13, 17);
3534 3515
                rs2 = GET_FIELD(insn, 27, 31);
3535
                if (gen_trap_ifnofpu(dc))
3516
                if (gen_trap_ifnofpu(dc, cpu_T[2]))
3536 3517
                    goto jmp_insn;
3537 3518

  
3538 3519
                switch (opf) {
......
3940 3921
#ifdef TARGET_SPARC64
3941 3922
            } else if (xop == 0x39) { /* V9 return */
3942 3923
                rs1 = GET_FIELD(insn, 13, 17);
3943
                save_state(dc);
3924
                save_state(dc, cpu_T[2]);
3944 3925
                gen_movl_reg_TN(rs1, cpu_T[0]);
3945 3926
                if (IS_IMM) {   /* immediate */
3946 3927
                    rs2 = GET_FIELDs(insn, 19, 31);
......
3957 3938
#endif
3958 3939
                }
3959 3940
                tcg_gen_helper_0_0(helper_restore);
3960
                gen_mov_pc_npc(dc);
3961
                gen_op_check_align_T0_3();
3941
                gen_mov_pc_npc(dc, cpu_T[2]);
3942
                tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3));
3962 3943
                tcg_gen_mov_tl(cpu_npc, cpu_T[0]);
3963 3944
                dc->npc = DYNAMIC_PC;
3964 3945
                goto jmp_insn;
......
3987 3968
                            tcg_gen_movi_tl(cpu_T[1], dc->pc);
3988 3969
                            gen_movl_TN_reg(rd, cpu_T[1]);
3989 3970
                        }
3990
                        gen_mov_pc_npc(dc);
3991
                        gen_op_check_align_T0_3();
3971
                        gen_mov_pc_npc(dc, cpu_T[2]);
3972
                        tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3));
3992 3973
                        tcg_gen_mov_tl(cpu_npc, cpu_T[0]);
3993 3974
                        dc->npc = DYNAMIC_PC;
3994 3975
                    }
......
3998 3979
                    {
3999 3980
                        if (!supervisor(dc))
4000 3981
                            goto priv_insn;
4001
                        gen_mov_pc_npc(dc);
4002
                        gen_op_check_align_T0_3();
3982
                        gen_mov_pc_npc(dc, cpu_T[2]);
3983
                        tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3));
4003 3984
                        tcg_gen_mov_tl(cpu_npc, cpu_T[0]);
4004 3985
                        dc->npc = DYNAMIC_PC;
4005 3986
                        tcg_gen_helper_0_0(helper_rett);
......
4010 3991
                    tcg_gen_helper_0_1(helper_flush, cpu_T[0]);
4011 3992
                    break;
4012 3993
                case 0x3c:      /* save */
4013
                    save_state(dc);
3994
                    save_state(dc, cpu_T[2]);
4014 3995
                    tcg_gen_helper_0_0(helper_save);
4015 3996
                    gen_movl_TN_reg(rd, cpu_T[0]);
4016 3997
                    break;
4017 3998
                case 0x3d:      /* restore */
4018
                    save_state(dc);
3999
                    save_state(dc, cpu_T[2]);
4019 4000
                    tcg_gen_helper_0_0(helper_restore);
4020 4001
                    gen_movl_TN_reg(rd, cpu_T[0]);
4021 4002
                    break;
......
4054 4035
        {
4055 4036
            unsigned int xop = GET_FIELD(insn, 7, 12);
4056 4037
            rs1 = GET_FIELD(insn, 13, 17);
4057
            save_state(dc);
4038
            save_state(dc, cpu_T[2]);
4058 4039
            gen_movl_reg_TN(rs1, cpu_T[0]);
4059 4040
            if (xop == 0x3c || xop == 0x3e)
4060 4041
            {
......
4080 4061
                (xop > 0x2c && xop <= 0x33) || xop == 0x1f || xop == 0x3d) {
4081 4062
                switch (xop) {
4082 4063
                case 0x0:       /* load unsigned word */
4083
                    gen_op_check_align_T0_3();
4064
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3));
4084 4065
                    ABI32_MASK(cpu_T[0]);
4085 4066
                    tcg_gen_qemu_ld32u(cpu_T[1], cpu_T[0], dc->mem_idx);
4086 4067
                    break;
......
4089 4070
                    tcg_gen_qemu_ld8u(cpu_T[1], cpu_T[0], dc->mem_idx);
4090 4071
                    break;
4091 4072
                case 0x2:       /* load unsigned halfword */
4092
                    gen_op_check_align_T0_1();
4073
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(1));
4093 4074
                    ABI32_MASK(cpu_T[0]);
4094 4075
                    tcg_gen_qemu_ld16u(cpu_T[1], cpu_T[0], dc->mem_idx);
4095 4076
                    break;
......
4097 4078
                    if (rd & 1)
4098 4079
                        goto illegal_insn;
4099 4080
                    else {
4100
                        gen_op_check_align_T0_7();
4081
                        tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(7));
4101 4082
                        ABI32_MASK(cpu_T[0]);
4102 4083
                        tcg_gen_qemu_ld64(cpu_tmp64, cpu_T[0], dc->mem_idx);
4103 4084
                        tcg_gen_trunc_i64_tl(cpu_T[0], cpu_tmp64);
......
4113 4094
                    tcg_gen_qemu_ld8s(cpu_T[1], cpu_T[0], dc->mem_idx);
4114 4095
                    break;
4115 4096
                case 0xa:       /* load signed halfword */
4116
                    gen_op_check_align_T0_1();
4097
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(1));
4117 4098
                    ABI32_MASK(cpu_T[0]);
4118 4099
                    tcg_gen_qemu_ld16s(cpu_T[1], cpu_T[0], dc->mem_idx);
4119 4100
                    break;
......
4123 4104
                    tcg_gen_qemu_st8(tcg_const_tl(0xff), cpu_T[0], dc->mem_idx);
4124 4105
                    break;
4125 4106
                case 0x0f:      /* swap register with memory. Also atomically */
4126
                    gen_op_check_align_T0_3();
4107
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3));
4127 4108
                    gen_movl_reg_TN(rd, cpu_T[1]);
4128 4109
                    ABI32_MASK(cpu_T[0]);
4129 4110
                    tcg_gen_qemu_ld32u(cpu_tmp32, cpu_T[0], dc->mem_idx);
......
4138 4119
                    if (!supervisor(dc))
4139 4120
                        goto priv_insn;
4140 4121
#endif
4141
                    gen_op_check_align_T0_3();
4142
                    gen_ld_asi(insn, 4, 0);
4122
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3));
4123
                    gen_ld_asi(cpu_T[1], cpu_T[0], insn, 4, 0);
4143 4124
                    break;
4144 4125
                case 0x11:      /* load unsigned byte alternate */
4145 4126
#ifndef TARGET_SPARC64
......
4148 4129
                    if (!supervisor(dc))
4149 4130
                        goto priv_insn;
4150 4131
#endif
4151
                    gen_ld_asi(insn, 1, 0);
4132
                    gen_ld_asi(cpu_T[1], cpu_T[0], insn, 1, 0);
4152 4133
                    break;
4153 4134
                case 0x12:      /* load unsigned halfword alternate */
4154 4135
#ifndef TARGET_SPARC64
......
4157 4138
                    if (!supervisor(dc))
4158 4139
                        goto priv_insn;
4159 4140
#endif
4160
                    gen_op_check_align_T0_1();
4161
                    gen_ld_asi(insn, 2, 0);
4141
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(1));
4142
                    gen_ld_asi(cpu_T[1], cpu_T[0], insn, 2, 0);
4162 4143
                    break;
4163 4144
                case 0x13:      /* load double word alternate */
4164 4145
#ifndef TARGET_SPARC64
......
4169 4150
#endif
4170 4151
                    if (rd & 1)
4171 4152
                        goto illegal_insn;
4172
                    gen_op_check_align_T0_7();
4173
                    gen_ldda_asi(insn);
4153
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(7));
4154
                    gen_ldda_asi(cpu_T[0], cpu_T[1], cpu_T[0], insn);
4174 4155
                    gen_movl_TN_reg(rd + 1, cpu_T[0]);
4175 4156
                    break;
4176 4157
                case 0x19:      /* load signed byte alternate */
......
4180 4161
                    if (!supervisor(dc))
4181 4162
                        goto priv_insn;
4182 4163
#endif
4183
                    gen_ld_asi(insn, 1, 1);
4164
                    gen_ld_asi(cpu_T[1], cpu_T[0], insn, 1, 1);
4184 4165
                    break;
4185 4166
                case 0x1a:      /* load signed halfword alternate */
4186 4167
#ifndef TARGET_SPARC64
......
4189 4170
                    if (!supervisor(dc))
4190 4171
                        goto priv_insn;
4191 4172
#endif
4192
                    gen_op_check_align_T0_1();
4193
                    gen_ld_asi(insn, 2, 1);
4173
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(1));
4174
                    gen_ld_asi(cpu_T[1], cpu_T[0], insn, 2, 1);
4194 4175
                    break;
4195 4176
                case 0x1d:      /* ldstuba -- XXX: should be atomically */
4196 4177
#ifndef TARGET_SPARC64
......
4199 4180
                    if (!supervisor(dc))
4200 4181
                        goto priv_insn;
4201 4182
#endif
4202
                    gen_ldstub_asi(insn);
4183
                    gen_ldstub_asi(cpu_T[1], cpu_T[0], insn);
4203 4184
                    break;
4204 4185
                case 0x1f:      /* swap reg with alt. memory. Also atomically */
4205 4186
#ifndef TARGET_SPARC64
......
4208 4189
                    if (!supervisor(dc))
4209 4190
                        goto priv_insn;
4210 4191
#endif
4211
                    gen_op_check_align_T0_3();
4192
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3));
4212 4193
                    gen_movl_reg_TN(rd, cpu_T[1]);
4213
                    gen_swap_asi(insn);
4194
                    gen_swap_asi(cpu_T[1], cpu_T[0], insn);
4214 4195
                    break;
4215 4196

  
4216 4197
#ifndef TARGET_SPARC64
......
4222 4203
#endif
4223 4204
#ifdef TARGET_SPARC64
4224 4205
                case 0x08: /* V9 ldsw */
4225
                    gen_op_check_align_T0_3();
4206
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3));
4226 4207
                    ABI32_MASK(cpu_T[0]);
4227 4208
                    tcg_gen_qemu_ld32s(cpu_T[1], cpu_T[0], dc->mem_idx);
4228 4209
                    break;
4229 4210
                case 0x0b: /* V9 ldx */
4230
                    gen_op_check_align_T0_7();
4211
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(7));
4231 4212
                    ABI32_MASK(cpu_T[0]);
4232 4213
                    tcg_gen_qemu_ld64(cpu_T[1], cpu_T[0], dc->mem_idx);
4233 4214
                    break;
4234 4215
                case 0x18: /* V9 ldswa */
4235
                    gen_op_check_align_T0_3();
4236
                    gen_ld_asi(insn, 4, 1);
4216
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3));
4217
                    gen_ld_asi(cpu_T[1], cpu_T[0], insn, 4, 1);
4237 4218
                    break;
4238 4219
                case 0x1b: /* V9 ldxa */
4239
                    gen_op_check_align_T0_7();
4240
                    gen_ld_asi(insn, 8, 0);
4220
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(7));
4221
                    gen_ld_asi(cpu_T[1], cpu_T[0], insn, 8, 0);
4241 4222
                    break;
4242 4223
                case 0x2d: /* V9 prefetch, no effect */
4243 4224
                    goto skip_move;
4244 4225
                case 0x30: /* V9 ldfa */
4245
                    gen_op_check_align_T0_3();
4246
                    gen_ldf_asi(insn, 4, rd);
4226
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3));
4227
                    gen_ldf_asi(cpu_T[0], insn, 4, rd);
4247 4228
                    goto skip_move;
4248 4229
                case 0x33: /* V9 lddfa */
4249
                    gen_op_check_align_T0_3();
4250
                    gen_ldf_asi(insn, 8, DFPREG(rd));
4230
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3));
4231
                    gen_ldf_asi(cpu_T[0], insn, 8, DFPREG(rd));
4251 4232
                    goto skip_move;
4252 4233
                case 0x3d: /* V9 prefetcha, no effect */
4253 4234
                    goto skip_move;
4254 4235
                case 0x32: /* V9 ldqfa */
4255 4236
#if defined(CONFIG_USER_ONLY)
4256
                    gen_op_check_align_T0_3();
4257
                    gen_ldf_asi(insn, 16, QFPREG(rd));
4237
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3));
4238
                    gen_ldf_asi(cpu_T[0], insn, 16, QFPREG(rd));
4258 4239
                    goto skip_move;
4259 4240
#else
4260 4241
                    goto nfpu_insn;
......
4268 4249
            skip_move: ;
4269 4250
#endif
4270 4251
            } else if (xop >= 0x20 && xop < 0x24) {
4271
                if (gen_trap_ifnofpu(dc))
4252
                if (gen_trap_ifnofpu(dc, cpu_T[2]))
4272 4253
                    goto jmp_insn;
4273 4254
                switch (xop) {
4274 4255
                case 0x20:      /* load fpreg */
4275
                    gen_op_check_align_T0_3();
4256
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3));
4276 4257
                    tcg_gen_qemu_ld32u(cpu_tmp32, cpu_T[0], dc->mem_idx);
4277 4258
                    tcg_gen_st_i32(cpu_tmp32, cpu_env,
4278 4259
                                   offsetof(CPUState, fpr[rd]));
4279 4260
                    break;
4280 4261
                case 0x21:      /* load fsr */
4281
                    gen_op_check_align_T0_3();
4262
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3));
4282 4263
                    tcg_gen_qemu_ld32u(cpu_tmp32, cpu_T[0], dc->mem_idx);
4283 4264
                    tcg_gen_st_i32(cpu_tmp32, cpu_env,
4284 4265
                                   offsetof(CPUState, ft0));
......
4286 4267
                    break;
4287 4268
                case 0x22:      /* load quad fpreg */
4288 4269
#if defined(CONFIG_USER_ONLY)
4289
                    gen_op_check_align_T0_7();
4270
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(7));
4290 4271
                    gen_op_ldst(ldqf);
4291 4272
                    gen_op_store_QT0_fpr(QFPREG(rd));
4292 4273
                    break;
......
4294 4275
                    goto nfpu_insn;
4295 4276
#endif
4296 4277
                case 0x23:      /* load double fpreg */
4297
                    gen_op_check_align_T0_7();
4278
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(7));
4298 4279
                    gen_op_ldst(lddf);
4299 4280
                    gen_op_store_DT0_fpr(DFPREG(rd));
4300 4281
                    break;
......
4306 4287
                gen_movl_reg_TN(rd, cpu_T[1]);
4307 4288
                switch (xop) {
4308 4289
                case 0x4: /* store word */
4309
                    gen_op_check_align_T0_3();
4290
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3));
4310 4291
                    ABI32_MASK(cpu_T[0]);
4311 4292
                    tcg_gen_qemu_st32(cpu_T[1], cpu_T[0], dc->mem_idx);
4312 4293
                    break;
......
4315 4296
                    tcg_gen_qemu_st8(cpu_T[1], cpu_T[0], dc->mem_idx);
4316 4297
                    break;
4317 4298
                case 0x6: /* store halfword */
4318
                    gen_op_check_align_T0_1();
4299
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(1));
4319 4300
                    ABI32_MASK(cpu_T[0]);
4320 4301
                    tcg_gen_qemu_st16(cpu_T[1], cpu_T[0], dc->mem_idx);
4321 4302
                    break;
......
4326 4307
                    else {
4327 4308
                        TCGv r_low;
4328 4309

  
4329
                        gen_op_check_align_T0_7();
4310
                        tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(7));
4330 4311
                        r_low = tcg_temp_new(TCG_TYPE_I32);
4331 4312
                        gen_movl_reg_TN(rd + 1, r_low);
4332 4313
                        tcg_gen_helper_1_2(helper_pack64, cpu_tmp64, cpu_T[1],
......
4334 4315
                        tcg_gen_qemu_st64(cpu_tmp64, cpu_T[0], dc->mem_idx);
4335 4316
                    }
4336 4317
#else /* __i386__ */
4337
                    gen_op_check_align_T0_7();
4338
                    flush_T2(dc);
4318
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(7));
4319
                    flush_cond(dc, cpu_T[2]);
4339 4320
                    gen_movl_reg_TN(rd + 1, cpu_T[2]);
4340 4321
                    gen_op_ldst(std);
4341 4322
#endif /* __i386__ */
......
4348 4329
                    if (!supervisor(dc))
4349 4330
                        goto priv_insn;
4350 4331
#endif
4351
                    gen_op_check_align_T0_3();
4352
                    gen_st_asi(insn, 4);
4332
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3));
4333
                    gen_st_asi(cpu_T[1], cpu_T[0], insn, 4);
4353 4334
                    break;
4354 4335
                case 0x15: /* store byte alternate */
4355 4336
#ifndef TARGET_SPARC64
......
4358 4339
                    if (!supervisor(dc))
4359 4340
                        goto priv_insn;
4360 4341
#endif
4361
                    gen_st_asi(insn, 1);
4342
                    gen_st_asi(cpu_T[1], cpu_T[0], insn, 1);
4362 4343
                    break;
4363 4344
                case 0x16: /* store halfword alternate */
4364 4345
#ifndef TARGET_SPARC64
......
4367 4348
                    if (!supervisor(dc))
4368 4349
                        goto priv_insn;
4369 4350
#endif
4370
                    gen_op_check_align_T0_1();
4371
                    gen_st_asi(insn, 2);
4351
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(1));
4352
                    gen_st_asi(cpu_T[1], cpu_T[0], insn, 2);
4372 4353
                    break;
4373 4354
                case 0x17: /* store double word alternate */
4374 4355
#ifndef TARGET_SPARC64
......
4380 4361
                    if (rd & 1)
4381 4362
                        goto illegal_insn;
4382 4363
                    else {
4383
                        gen_op_check_align_T0_7();
4384
                        gen_stda_asi(insn, rd);
4364
                        tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(7));
4365
                        gen_stda_asi(cpu_T[1], cpu_T[0], insn, rd);
4385 4366
                    }
4386 4367
                    break;
4387 4368
#endif
4388 4369
#ifdef TARGET_SPARC64
4389 4370
                case 0x0e: /* V9 stx */
4390
                    gen_op_check_align_T0_7();
4371
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(7));
4391 4372
                    ABI32_MASK(cpu_T[0]);
4392 4373
                    tcg_gen_qemu_st64(cpu_T[1], cpu_T[0], dc->mem_idx);
4393 4374
                    break;
4394 4375
                case 0x1e: /* V9 stxa */
4395
                    gen_op_check_align_T0_7();
4396
                    gen_st_asi(insn, 8);
4376
                    tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(7));
4377
                    gen_st_asi(cpu_T[1], cpu_T[0], insn, 8);
4397 4378
                    break;
4398 4379
#endif
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff