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