Revision dfaa8583

b/target-alpha/translate.c
378 378
        tcg_gen_movi_i64(cpu_T[0], 0);
379 379
    if (islit)
380 380
        tcg_gen_movi_i64(cpu_T[1], lit);
381
    else if (rb != 31)
382
        tcg_gen_mov_i64(cpu_T[1], cpu_ir[rb]);
383 381
    else
384
        tcg_gen_movi_i64(cpu_T[1], 0);
382
        tcg_gen_mov_i64(cpu_T[1], cpu_ir[rb]);
385 383
    (*gen_arith_op)();
386 384
    if (rc != 31)
387 385
        tcg_gen_mov_i64(cpu_ir[rc], cpu_T[0]);
......
416 414

  
417 415
    if (islit)
418 416
        tcg_gen_movi_i64(cpu_ir[rc], lit);
419
    else if (rb != 31)
420
        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
421 417
    else
422
        tcg_gen_movi_i64(cpu_ir[rc], 0);
418
        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
423 419
    gen_set_label(l1);
424 420
}
425 421

  
......
483 479
        return;
484 480

  
485 481
    if (ra != 31) {
486
        if (islit)
487
            tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 64 - ((lit & 7) * 8));
488
        else if (rb != 31) {
482
        if (islit) {
483
            if (lit != 0)
484
                tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 64 - ((lit & 7) * 8));
485
            else
486
                tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
487
	} else {
489 488
            TCGv tmp1, tmp2;
490 489
            tmp1 = tcg_temp_new(TCG_TYPE_I64);
491 490
            tcg_gen_andi_i64(tmp1, cpu_ir[rb], 7);
......
493 492
            tmp2 = tcg_const_i64(64);
494 493
            tcg_gen_sub_i64(tmp1, tmp2, tmp1);
495 494
            tcg_temp_free(tmp2);
496
            if (tcg_gen_ext_i64) {
497
                tcg_gen_shl_i64(tmp1, cpu_ir[ra], tmp1);
498
                tcg_gen_ext_i64(cpu_ir[rc], tmp1);
499
            } else
500
                tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], tmp1);
495
            tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], tmp1);
501 496
            tcg_temp_free(tmp1);
502
        } else
503
            tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
497
        }
498
        if (tcg_gen_ext_i64)
499
            tcg_gen_ext_i64(cpu_ir[rc], cpu_ir[rc]);
504 500
    } else
505 501
        tcg_gen_movi_i64(cpu_ir[rc], 0);
506 502
}
......
514 510
        return;
515 511

  
516 512
    if (ra != 31) {
517
        if (islit)
518
            tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], (lit & 7) * 8);
519
        else if (rb != 31) {
513
        if (islit) {
514
                tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], (lit & 7) * 8);
515
        } else {
520 516
            TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
521 517
            tcg_gen_andi_i64(tmp, cpu_ir[rb], 7);
522 518
            tcg_gen_shli_i64(tmp, tmp, 3);
523
            if (tcg_gen_ext_i64) {
524
                tcg_gen_shr_i64(tmp, cpu_ir[ra], tmp);
525
                tcg_gen_ext_i64(cpu_ir[rc], tmp);
526
            } else
527
                tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], tmp);
519
            tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], tmp);
528 520
            tcg_temp_free(tmp);
529
        } else
530
            tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
521
	}
522
        if (tcg_gen_ext_i64)
523
            tcg_gen_ext_i64(cpu_ir[rc], cpu_ir[rc]);
531 524
    } else
532 525
        tcg_gen_movi_i64(cpu_ir[rc], 0);
533 526
}
......
547 540
        return;
548 541

  
549 542
    if (ra != 31) {
550
        if (islit || rb == 31) {
551
            TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
552
            if (islit)
553
                tcg_gen_movi_i64(tmp, lit);
554
            else
555
                tcg_gen_movi_i64(tmp, 0);
543
        if (islit) {
544
            TCGv tmp = tcg_const_i64(lit);
556 545
            tcg_gen_helper_1_2(helper, cpu_ir[rc], cpu_ir[ra], tmp);
557 546
            tcg_temp_free(tmp);
558 547
        } else
......
581 570
        tmp = tcg_const_i64(0);
582 571
    if (islit)
583 572
        tcg_gen_brcondi_i64(cond, tmp, lit, l1);
584
    else if (rb != 31)
585
        tcg_gen_brcond_i64(cond, tmp, cpu_ir[rb], l1);
586 573
    else
587
        tcg_gen_brcondi_i64(cond, tmp, 0, l1);
574
        tcg_gen_brcond_i64(cond, tmp, cpu_ir[rb], l1);
588 575

  
589 576
    tcg_gen_movi_i64(cpu_ir[rc], 0);
590 577
    tcg_gen_br(l2);
......
609 596
    rc = insn & 0x1F;
610 597
    sbz = (insn >> 13) & 0x07;
611 598
    islit = (insn >> 12) & 1;
612
    lit = (insn >> 13) & 0xFF;
599
    if (rb == 31 && !islit) {
600
        islit = 1;
601
        lit = 0;
602
    } else
603
        lit = (insn >> 13) & 0xFF;
613 604
    palcode = insn & 0x03FFFFFF;
614 605
    disp21 = ((int32_t)((insn & 0x001FFFFF) << 11)) >> 11;
615 606
    disp16 = (int16_t)(insn & 0x0000FFFF);
......
726 717
                    if (islit) {
727 718
                        tcg_gen_addi_i64(cpu_ir[rc], cpu_ir[ra], lit);
728 719
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
729
                    } else if (rb != 31) {
720
                    } else {
730 721
                        tcg_gen_add_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
731 722
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
732
                    } else
733
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[ra]);
723
                    }
734 724
                } else {
735 725
                    if (islit)
736
                        tcg_gen_movi_i64(cpu_ir[rc], (int32_t)lit);
737
                    else if (rb != 31)
738
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
726
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
739 727
                    else
740
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
728
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
741 729
                }
742 730
            }
743 731
            break;
......
745 733
            /* S4ADDL */
746 734
            if (likely(rc != 31)) {
747 735
                if (ra != 31) {
748
                    if (islit || rb != 31) {
749
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
750
                        tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
751
                        if (islit)
752
                            tcg_gen_addi_i64(tmp, tmp, lit);
753
                        else
754
                            tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
755
                        tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
756
                        tcg_temp_free(tmp);
757
                    } else {
758
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 2);
759
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
760
                    }
736
                    TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
737
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
738
                    if (islit)
739
                        tcg_gen_addi_i64(tmp, tmp, lit);
740
                    else
741
                        tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
742
                    tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
743
                    tcg_temp_free(tmp);
761 744
                } else {
762 745
                    if (islit)
763 746
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
764
                    else if (rb != 31)
765
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
766 747
                    else
767
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
748
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
768 749
                }
769 750
            }
770 751
            break;
......
772 753
            /* SUBL */
773 754
            if (likely(rc != 31)) {
774 755
                if (ra != 31) {
775
                    if (islit) {
756
                    if (islit)
776 757
                        tcg_gen_subi_i64(cpu_ir[rc], cpu_ir[ra], lit);
777
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
778
                    } else if (rb != 31) {
758
                    else
779 759
                        tcg_gen_sub_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
780
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
781
                    } else
782
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[ra]);
760
                    tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
783 761
                } else {
784 762
                    if (islit)
785 763
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
786
                    else if (rb != 31) {
764
                    else {
787 765
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
788 766
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
789
                    } else
790
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
791 767
                }
792 768
            }
793 769
            break;
......
795 771
            /* S4SUBL */
796 772
            if (likely(rc != 31)) {
797 773
                if (ra != 31) {
798
                    if (islit || rb != 31) {
799
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
800
                        tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
801
                        if (islit)
802
                            tcg_gen_subi_i64(tmp, tmp, lit);
803
                        else
804
                            tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
805
                        tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
806
                        tcg_temp_free(tmp);
807
                    } else {
808
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 2);
809
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
810
                    }
774
                    TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
775
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
776
                    if (islit)
777
                        tcg_gen_subi_i64(tmp, tmp, lit);
778
                    else
779
                        tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
780
                    tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
781
                    tcg_temp_free(tmp);
811 782
                } else {
812 783
                    if (islit)
813 784
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
814
                    else if (rb != 31) {
785
                    else {
815 786
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
816 787
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
817
                    } else
818
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
788
                    }
819 789
                }
820 790
            }
821 791
            break;
......
827 797
            /* S8ADDL */
828 798
            if (likely(rc != 31)) {
829 799
                if (ra != 31) {
830
                    if (islit || rb != 31) {
831
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
832
                        tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
833
                        if (islit)
834
                            tcg_gen_addi_i64(tmp, tmp, lit);
835
                        else
836
                            tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
837
                        tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
838
                        tcg_temp_free(tmp);
839
                    } else {
840
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 3);
841
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
842
                    }
800
                    TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
801
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
802
                    if (islit)
803
                        tcg_gen_addi_i64(tmp, tmp, lit);
804
                    else
805
                        tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
806
                    tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
807
                    tcg_temp_free(tmp);
843 808
                } else {
844 809
                    if (islit)
845 810
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
846
                    else if (rb != 31)
847
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
848 811
                    else
849
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
812
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
850 813
                }
851 814
            }
852 815
            break;
......
854 817
            /* S8SUBL */
855 818
            if (likely(rc != 31)) {
856 819
                if (ra != 31) {
857
                    if (islit || rb != 31) {
858
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
859
                        tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
860
                        if (islit)
861
                            tcg_gen_subi_i64(tmp, tmp, lit);
862
                        else
863
                            tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
864
                        tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
865
                        tcg_temp_free(tmp);
866
                    } else {
867
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 3);
868
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
869
                    }
820
                    TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
821
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
822
                    if (islit)
823
                        tcg_gen_subi_i64(tmp, tmp, lit);
824
                    else
825
                       tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
826
                    tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
827
                    tcg_temp_free(tmp);
870 828
                } else {
871 829
                    if (islit)
872 830
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
873
                    else if (rb != 31) {
831
                    else
874 832
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
875 833
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
876
                    } else
877
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
834
                    }
878 835
                }
879 836
            }
880 837
            break;
......
888 845
                if (ra != 31) {
889 846
                    if (islit)
890 847
                        tcg_gen_addi_i64(cpu_ir[rc], cpu_ir[ra], lit);
891
                    else if (rb != 31)
892
                        tcg_gen_add_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
893 848
                    else
894
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
849
                        tcg_gen_add_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
895 850
                } else {
896 851
                    if (islit)
897 852
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
898
                    else if (rb != 31)
899
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
900 853
                    else
901
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
854
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
902 855
                }
903 856
            }
904 857
            break;
......
906 859
            /* S4ADDQ */
907 860
            if (likely(rc != 31)) {
908 861
                if (ra != 31) {
909
                    if (islit || rb != 31) {
910
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
911
                        tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
912
                        if (islit)
913
                            tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
914
                        else
915
                            tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
916
                        tcg_temp_free(tmp);
917
                    } else
918
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 2);
862
                    TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
863
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
864
                    if (islit)
865
                        tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
866
                    else
867
                        tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
868
                    tcg_temp_free(tmp);
919 869
                } else {
920 870
                    if (islit)
921 871
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
922
                    else if (rb != 31)
923
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
924 872
                    else
925
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
873
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
926 874
                }
927 875
            }
928 876
            break;
......
932 880
                if (ra != 31) {
933 881
                    if (islit)
934 882
                        tcg_gen_subi_i64(cpu_ir[rc], cpu_ir[ra], lit);
935
                    else if (rb != 31)
936
                        tcg_gen_sub_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
937 883
                    else
938
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
884
                        tcg_gen_sub_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
939 885
                } else {
940 886
                    if (islit)
941 887
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
942
                    else if (rb != 31)
943
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
944 888
                    else
945
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
889
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
946 890
                }
947 891
            }
948 892
            break;
......
950 894
            /* S4SUBQ */
951 895
            if (likely(rc != 31)) {
952 896
                if (ra != 31) {
953
                    if (islit || rb != 31) {
954
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
955
                        tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
956
                        if (islit)
957
                            tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
958
                        else
959
                            tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
960
                        tcg_temp_free(tmp);
961
                    } else
962
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 2);
897
                    TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
898
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
899
                    if (islit)
900
                        tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
901
                    else
902
                        tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
903
                    tcg_temp_free(tmp);
963 904
                } else {
964 905
                    if (islit)
965 906
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
966
                    else if (rb != 31)
967
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
968 907
                    else
969
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
908
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
970 909
                }
971 910
            }
972 911
            break;
......
978 917
            /* S8ADDQ */
979 918
            if (likely(rc != 31)) {
980 919
                if (ra != 31) {
981
                    if (islit || rb != 31) {
982
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
983
                        tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
984
                        if (islit)
985
                            tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
986
                        else
987
                            tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
988
                        tcg_temp_free(tmp);
989
                    } else
990
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 3);
920
                    TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
921
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
922
                    if (islit)
923
                        tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
924
                    else
925
                        tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
926
                    tcg_temp_free(tmp);
991 927
                } else {
992 928
                    if (islit)
993 929
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
994
                    else if (rb != 31)
995
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
996 930
                    else
997
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
931
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
998 932
                }
999 933
            }
1000 934
            break;
......
1002 936
            /* S8SUBQ */
1003 937
            if (likely(rc != 31)) {
1004 938
                if (ra != 31) {
1005
                    if (islit || rb != 31) {
1006
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
1007
                        tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
1008
                        if (islit)
1009
                            tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
1010
                        else
1011
                            tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
1012
                        tcg_temp_free(tmp);
1013
                    } else
1014
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 3);
939
                    TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
940
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
941
                    if (islit)
942
                        tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
943
                    else
944
                        tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
945
                    tcg_temp_free(tmp);
1015 946
                } else {
1016 947
                    if (islit)
1017 948
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
1018
                    else if (rb != 31)
1019
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
1020 949
                    else
1021
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
950
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
1022 951
                }
1023 952
            }
1024 953
            break;
......
1059 988
        case 0x00:
1060 989
            /* AND */
1061 990
            if (likely(rc != 31)) {
1062
                if (ra == 31 || (rb == 31 && !islit))
991
                if (ra == 31)
1063 992
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1064 993
                else if (islit)
1065 994
                    tcg_gen_andi_i64(cpu_ir[rc], cpu_ir[ra], lit);
......
1073 1002
                if (ra != 31) {
1074 1003
                    if (islit)
1075 1004
                        tcg_gen_andi_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1076
                    else if (rb != 31) {
1005
                    else {
1077 1006
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
1078 1007
                        tcg_gen_not_i64(tmp, cpu_ir[rb]);
1079 1008
                        tcg_gen_and_i64(cpu_ir[rc], cpu_ir[ra], tmp);
1080 1009
                        tcg_temp_free(tmp);
1081
                    } else
1082
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
1010
                    }
1083 1011
                } else
1084 1012
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1085 1013
            }
......
1098 1026
                if (ra != 31) {
1099 1027
                    if (islit)
1100 1028
                        tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], lit);
1101
                    else if (rb != 31)
1029
		    else
1102 1030
                        tcg_gen_or_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1103
                    else
1104
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
1105 1031
                } else {
1106 1032
                    if (islit)
1107 1033
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
1108
                    else if (rb != 31)
1109
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1110 1034
                    else
1111
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
1035
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1112 1036
                }
1113 1037
            }
1114 1038
            break;
......
1123 1047
        case 0x28:
1124 1048
            /* ORNOT */
1125 1049
            if (likely(rc != 31)) {
1126
                if (rb == 31 && !islit)
1127
                    tcg_gen_movi_i64(cpu_ir[rc], ~0);
1128
                else if (ra != 31) {
1050
                if (ra != 31) {
1129 1051
                    if (islit)
1130 1052
                        tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1131 1053
                    else {
......
1148 1070
                if (ra != 31) {
1149 1071
                    if (islit)
1150 1072
                        tcg_gen_xori_i64(cpu_ir[rc], cpu_ir[ra], lit);
1151
                    else if (rb != 31)
1152
                        tcg_gen_xor_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1153 1073
                    else
1154
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
1074
                        tcg_gen_xor_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1155 1075
                } else {
1156 1076
                    if (islit)
1157 1077
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
1158
                    else if (rb != 31)
1159
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1160 1078
                    else
1161
                        tcg_gen_movi_i64(cpu_ir[rc], 0);
1079
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1162 1080
                }
1163 1081
            }
1164 1082
            break;
......
1176 1094
                if (ra != 31) {
1177 1095
                    if (islit)
1178 1096
                        tcg_gen_xori_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1179
                    else if (rb != 31) {
1097
                    else {
1180 1098
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
1181 1099
                        tcg_gen_not_i64(tmp, cpu_ir[rb]);
1182 1100
                        tcg_gen_xor_i64(cpu_ir[rc], cpu_ir[ra], tmp);
1183 1101
                        tcg_temp_free(tmp);
1184
                    } else
1185
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
1102
                    }
1186 1103
                } else {
1187 1104
                    if (islit)
1188 1105
                        tcg_gen_movi_i64(cpu_ir[rc], ~lit);
1189
                    else if (rb != 31)
1190
                        tcg_gen_not_i64(cpu_ir[rc], cpu_ir[rb]);
1191 1106
                    else
1192
                        tcg_gen_movi_i64(cpu_ir[rc], ~0);
1107
                        tcg_gen_not_i64(cpu_ir[rc], cpu_ir[rb]);
1193 1108
                }
1194 1109
            }
1195 1110
            break;
......
1198 1113
            if (likely(rc != 31)) {
1199 1114
                if (islit)
1200 1115
                    tcg_gen_movi_i64(cpu_ir[rc], helper_amask(lit));
1201
                else if (rb != 31)
1202
                    tcg_gen_helper_1_1(helper_amask, cpu_ir[rc], cpu_ir[rb]);
1203 1116
                else
1204
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1117
                    tcg_gen_helper_1_1(helper_amask, cpu_ir[rc], cpu_ir[rb]);
1205 1118
            }
1206 1119
            break;
1207 1120
        case 0x64:
......
1277 1190
                if (ra != 31) {
1278 1191
                    if (islit)
1279 1192
                        tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1280
                    else if (rb != 31) {
1193
                    else {
1281 1194
                        TCGv shift = tcg_temp_new(TCG_TYPE_I64);
1282 1195
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1283 1196
                        tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], shift);
1284 1197
                        tcg_temp_free(shift);
1285
                    } else
1286
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
1198
                    }
1287 1199
                } else
1288 1200
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1289 1201
            }
......
1298 1210
                if (ra != 31) {
1299 1211
                    if (islit)
1300 1212
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1301
                    else if (rb != 31) {
1213
                    else {
1302 1214
                        TCGv shift = tcg_temp_new(TCG_TYPE_I64);
1303 1215
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1304 1216
                        tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], shift);
1305 1217
                        tcg_temp_free(shift);
1306
                    } else
1307
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
1218
                    }
1308 1219
                } else
1309 1220
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1310 1221
            }
......
1319 1230
                if (ra != 31) {
1320 1231
                    if (islit)
1321 1232
                        tcg_gen_sari_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1322
                    else if (rb != 31) {
1233
                    else {
1323 1234
                        TCGv shift = tcg_temp_new(TCG_TYPE_I64);
1324 1235
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1325 1236
                        tcg_gen_sar_i64(cpu_ir[rc], cpu_ir[ra], shift);
1326 1237
                        tcg_temp_free(shift);
1327
                    } else
1328
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
1238
                    }
1329 1239
                } else
1330 1240
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1331 1241
            }
......
1375 1285
        case 0x00:
1376 1286
            /* MULL */
1377 1287
            if (likely(rc != 31)) {
1378
                if (ra == 31 || (rb == 31 && !islit))
1288
                if (ra == 31)
1379 1289
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1380 1290
                else {
1381 1291
                    if (islit)
......
1389 1299
        case 0x20:
1390 1300
            /* MULQ */
1391 1301
            if (likely(rc != 31)) {
1392
                if (ra == 31 || (rb == 31 && !islit))
1302
                if (ra == 31)
1393 1303
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1394 1304
                else if (islit)
1395 1305
                    tcg_gen_muli_i64(cpu_ir[rc], cpu_ir[ra], lit);
......
1908 1818
            if (likely(rc != 31)) {
1909 1819
                if (islit)
1910 1820
                    tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int8_t)lit));
1911
                else if (rb != 31)
1912
                    tcg_gen_ext8s_i64(cpu_ir[rc], cpu_ir[rb]);
1913 1821
                else
1914
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1822
                    tcg_gen_ext8s_i64(cpu_ir[rc], cpu_ir[rb]);
1915 1823
            }
1916 1824
            break;
1917 1825
        case 0x01:
......
1921 1829
            if (likely(rc != 31)) {
1922 1830
                if (islit)
1923 1831
                    tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int16_t)lit));
1924
                else if (rb != 31)
1925
                    tcg_gen_ext16s_i64(cpu_ir[rc], cpu_ir[rb]);
1926 1832
                else
1927
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1833
                    tcg_gen_ext16s_i64(cpu_ir[rc], cpu_ir[rb]);
1928 1834
            }
1929 1835
            break;
1930 1836
        case 0x30:
......
1934 1840
            if (likely(rc != 31)) {
1935 1841
                if (islit)
1936 1842
                    tcg_gen_movi_i64(cpu_ir[rc], ctpop64(lit));
1937
                else if (rb != 31)
1938
                    tcg_gen_helper_1_1(helper_ctpop, cpu_ir[rc], cpu_ir[rb]);
1939 1843
                else
1940
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1844
                    tcg_gen_helper_1_1(helper_ctpop, cpu_ir[rc], cpu_ir[rb]);
1941 1845
            }
1942 1846
            break;
1943 1847
        case 0x31:
......
1954 1858
            if (likely(rc != 31)) {
1955 1859
                if (islit)
1956 1860
                    tcg_gen_movi_i64(cpu_ir[rc], clz64(lit));
1957
                else if (rb != 31)
1958
                    tcg_gen_helper_1_1(helper_ctlz, cpu_ir[rc], cpu_ir[rb]);
1959 1861
                else
1960
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1862
                    tcg_gen_helper_1_1(helper_ctlz, cpu_ir[rc], cpu_ir[rb]);
1961 1863
            }
1962 1864
            break;
1963 1865
        case 0x33:
......
1967 1869
            if (likely(rc != 31)) {
1968 1870
                if (islit)
1969 1871
                    tcg_gen_movi_i64(cpu_ir[rc], ctz64(lit));
1970
                else if (rb != 31)
1971
                    tcg_gen_helper_1_1(helper_cttz, cpu_ir[rc], cpu_ir[rb]);
1972 1872
                else
1973
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1873
                    tcg_gen_helper_1_1(helper_cttz, cpu_ir[rc], cpu_ir[rb]);
1974 1874
            }
1975 1875
            break;
1976 1876
        case 0x34:

Also available in: Unified diff