Revision 3d7b417e target-ppc/op.c

b/target-ppc/op.c
58 58
    RETURN();
59 59
}
60 60

  
61
void OPPROTO op_load_xer_cr (void)
62
{
63
    T0 = (xer_so << 3) | (xer_ov << 2) | (xer_ca << 1);
64
    RETURN();
65
}
66

  
67
void OPPROTO op_clear_xer_ov (void)
68
{
69
    xer_so = 0;
70
    xer_ov = 0;
71
    RETURN();
72
}
73

  
74
void OPPROTO op_clear_xer_ca (void)
75
{
76
    xer_ca = 0;
77
    RETURN();
78
}
79

  
80
void OPPROTO op_load_xer_bc (void)
81
{
82
    T1 = xer_bc;
83
    RETURN();
84
}
85

  
86
void OPPROTO op_store_xer_bc (void)
87
{
88
    xer_bc = T0;
89
    RETURN();
90
}
91

  
92
void OPPROTO op_load_xer (void)
93
{
94
    T0 = hreg_load_xer(env);
95
    RETURN();
96
}
97

  
98
void OPPROTO op_store_xer (void)
99
{
100
    hreg_store_xer(env, T0);
101
    RETURN();
102
}
103

  
104 61
#if defined(TARGET_PPC64)
105 62
void OPPROTO op_store_pri (void)
106 63
{
......
574 531
/* add */
575 532
void OPPROTO op_check_addo (void)
576 533
{
577
    xer_ov = (((uint32_t)T2 ^ (uint32_t)T1 ^ UINT32_MAX) &
534
    int ov = (((uint32_t)T2 ^ (uint32_t)T1 ^ UINT32_MAX) &
578 535
              ((uint32_t)T2 ^ (uint32_t)T0)) >> 31;
579
    xer_so |= xer_ov;
536
    if (ov) {
537
        env->xer |= (1 << XER_OV) | (1 << XER_SO);
538
    } else {
539
        env->xer &= ~(1 << XER_OV);
540
    }
580 541
    RETURN();
581 542
}
582 543

  
583 544
#if defined(TARGET_PPC64)
584 545
void OPPROTO op_check_addo_64 (void)
585 546
{
586
    xer_ov = (((uint64_t)T2 ^ (uint64_t)T1 ^ UINT64_MAX) &
547
    int ov = (((uint64_t)T2 ^ (uint64_t)T1 ^ UINT64_MAX) &
587 548
              ((uint64_t)T2 ^ (uint64_t)T0)) >> 63;
588
    xer_so |= xer_ov;
549
    if (ov) {
550
        env->xer |= (1 << XER_OV) | (1 << XER_SO);
551
    } else {
552
        env->xer &= ~(1 << XER_OV);
553
    }
589 554
    RETURN();
590 555
}
591 556
#endif
......
594 559
void OPPROTO op_check_addc (void)
595 560
{
596 561
    if (likely((uint32_t)T0 >= (uint32_t)T2)) {
597
        xer_ca = 0;
562
        env->xer &= ~(1 << XER_CA);
598 563
    } else {
599
        xer_ca = 1;
564
        env->xer |= (1 << XER_CA);
600 565
    }
601 566
    RETURN();
602 567
}
......
605 570
void OPPROTO op_check_addc_64 (void)
606 571
{
607 572
    if (likely((uint64_t)T0 >= (uint64_t)T2)) {
608
        xer_ca = 0;
573
        env->xer &= ~(1 << XER_CA);
609 574
    } else {
610
        xer_ca = 1;
575
        env->xer |= (1 << XER_CA);
611 576
    }
612 577
    RETURN();
613 578
}
......
633 598
{
634 599
    T0 += xer_ca + (-1);
635 600
    if (likely((uint32_t)T1 != 0))
636
        xer_ca = 1;
601
        env->xer |= (1 << XER_CA);
637 602
    RETURN();
638 603
}
639 604

  
......
642 607
{
643 608
    T0 += xer_ca + (-1);
644 609
    if (likely((uint64_t)T1 != 0))
645
        xer_ca = 1;
610
        env->xer |= (1 << XER_CA);
646 611
    RETURN();
647 612
}
648 613
#endif
......
855 820
void OPPROTO op_check_subfc (void)
856 821
{
857 822
    if (likely((uint32_t)T0 > (uint32_t)T1)) {
858
        xer_ca = 0;
823
        env->xer &= ~(1 << XER_CA);
859 824
    } else {
860
        xer_ca = 1;
825
        env->xer |= (1 << XER_CA);
861 826
    }
862 827
    RETURN();
863 828
}
......
866 831
void OPPROTO op_check_subfc_64 (void)
867 832
{
868 833
    if (likely((uint64_t)T0 > (uint64_t)T1)) {
869
        xer_ca = 0;
834
        env->xer &= ~(1 << XER_CA);
870 835
    } else {
871
        xer_ca = 1;
836
        env->xer |= (1 << XER_CA);
872 837
    }
873 838
    RETURN();
874 839
}
......
894 859
{
895 860
    T0 = (int32_t)PARAM1 + ~T0 + 1;
896 861
    if ((uint32_t)T0 <= (uint32_t)PARAM1) {
897
        xer_ca = 1;
862
        env->xer |= (1 << XER_CA);
898 863
    } else {
899
        xer_ca = 0;
864
        env->xer &= ~(1 << XER_CA);
900 865
    }
901 866
    RETURN();
902 867
}
......
906 871
{
907 872
    T0 = (int64_t)PARAM1 + ~T0 + 1;
908 873
    if ((uint64_t)T0 <= (uint64_t)PARAM1) {
909
        xer_ca = 1;
874
        env->xer |= (1 << XER_CA);
910 875
    } else {
911
        xer_ca = 0;
876
        env->xer &= ~(1 << XER_CA);
912 877
    }
913 878
    RETURN();
914 879
}
......
919 884
{
920 885
    T0 = ~T0 + xer_ca - 1;
921 886
    if (likely((uint32_t)T0 != UINT32_MAX))
922
        xer_ca = 1;
887
        env->xer |= (1 << XER_CA);
923 888
    RETURN();
924 889
}
925 890

  
......
928 893
{
929 894
    T0 = ~T0 + xer_ca - 1;
930 895
    if (likely((uint64_t)T0 != UINT64_MAX))
931
        xer_ca = 1;
896
        env->xer |= (1 << XER_CA);
932 897
    RETURN();
933 898
}
934 899
#endif
......
953 918
    T1 = ~T0;
954 919
    T0 = T1 + xer_ca;
955 920
    if ((uint32_t)T0 < (uint32_t)T1) {
956
        xer_ca = 1;
921
        env->xer |= (1 << XER_CA);
957 922
    } else {
958
        xer_ca = 0;
923
        env->xer &= ~(1 << XER_CA);
959 924
    }
960 925
    RETURN();
961 926
}
......
966 931
    T1 = ~T0;
967 932
    T0 = T1 + xer_ca;
968 933
    if ((uint64_t)T0 < (uint64_t)T1) {
969
        xer_ca = 1;
934
        env->xer |= (1 << XER_CA);
970 935
    } else {
971
        xer_ca = 0;
936
        env->xer &= ~(1 << XER_CA);
972 937
    }
973 938
    RETURN();
974 939
}
......
1317 1282

  
1318 1283
    T0 = (int32_t)T0 >> PARAM1;
1319 1284
    if ((int32_t)T1 < 0 && (T1 & mask) != 0) {
1320
        xer_ca = 1;
1285
        env->xer |= (1 << XER_CA);
1321 1286
    } else {
1322
        xer_ca = 0;
1287
        env->xer &= ~(1 << XER_CA);
1323 1288
    }
1324 1289
    RETURN();
1325 1290
}
......
1331 1296

  
1332 1297
    T0 = (int64_t)T0 >> PARAM1;
1333 1298
    if ((int64_t)T1 < 0 && ((uint64_t)T1 & mask) != 0) {
1334
        xer_ca = 1;
1299
        env->xer |= (1 << XER_CA);
1335 1300
    } else {
1336
        xer_ca = 0;
1301
        env->xer &= ~(1 << XER_CA);
1337 1302
    }
1338 1303
    RETURN();
1339 1304
}
......
1975 1940
    /* nabs never overflows */
1976 1941
    if (T0 > 0)
1977 1942
        T0 = -T0;
1978
    xer_ov = 0;
1943
    env->xer &= ~(1 << XER_OV);
1979 1944
    RETURN();
1980 1945
}
1981 1946

  
......
2189 2154
void OPPROTO op_405_check_ovu (void)
2190 2155
{
2191 2156
    if (likely(T0 >= T2)) {
2192
        xer_ov = 0;
2157
        env->xer &= ~(1 << XER_OV);
2193 2158
    } else {
2194
        xer_ov = 1;
2195
        xer_so = 1;
2159
        env->xer |= (1 << XER_OV) | (1 << XER_SO);
2196 2160
    }
2197 2161
    RETURN();
2198 2162
}

Also available in: Unified diff