Revision c3e10c7b
b/target-ppc/op.c | ||
---|---|---|
191 | 191 |
RETURN(); |
192 | 192 |
} |
193 | 193 |
|
194 |
void OPPROTO op_moven_T2_T0 (void) |
|
195 |
{ |
|
196 |
T2 = ~T0; |
|
197 |
RETURN(); |
|
198 |
} |
|
199 |
|
|
194 | 200 |
/* Generate exceptions */ |
195 | 201 |
void OPPROTO op_raise_exception_err (void) |
196 | 202 |
{ |
... | ... | |
847 | 853 |
|
848 | 854 |
void OPPROTO op_check_addo (void) |
849 | 855 |
{ |
850 |
if (likely(!(((uint32_t)T2 ^ (uint32_t)T1 ^ UINT32_MAX) & |
|
851 |
((uint32_t)T2 ^ (uint32_t)T0) & (1UL << 31)))) { |
|
852 |
xer_ov = 0; |
|
853 |
} else { |
|
854 |
xer_ov = 1; |
|
855 |
xer_so = 1; |
|
856 |
} |
|
856 |
xer_ov = (((uint32_t)T2 ^ (uint32_t)T1 ^ UINT32_MAX) & |
|
857 |
((uint32_t)T2 ^ (uint32_t)T0)) >> 31; |
|
858 |
xer_so |= xer_ov; |
|
857 | 859 |
RETURN(); |
858 | 860 |
} |
859 | 861 |
|
860 | 862 |
#if defined(TARGET_PPC64) |
861 | 863 |
void OPPROTO op_check_addo_64 (void) |
862 | 864 |
{ |
863 |
if (likely(!(((uint64_t)T2 ^ (uint64_t)T1 ^ UINT64_MAX) & |
|
864 |
((uint64_t)T2 ^ (uint64_t)T0) & (1ULL << 63)))) { |
|
865 |
xer_ov = 0; |
|
866 |
} else { |
|
867 |
xer_ov = 1; |
|
868 |
xer_so = 1; |
|
869 |
} |
|
865 |
xer_ov = (((uint64_t)T2 ^ (uint64_t)T1 ^ UINT64_MAX) & |
|
866 |
((uint64_t)T2 ^ (uint64_t)T0)) >> 63; |
|
867 |
xer_so |= xer_ov; |
|
870 | 868 |
RETURN(); |
871 | 869 |
} |
872 | 870 |
#endif |
... | ... | |
922 | 920 |
T0 += xer_ca + (-1); |
923 | 921 |
if (likely((uint32_t)T1 != 0)) |
924 | 922 |
xer_ca = 1; |
923 |
else |
|
924 |
xer_ca = 0; |
|
925 | 925 |
RETURN(); |
926 | 926 |
} |
927 | 927 |
|
... | ... | |
931 | 931 |
T0 += xer_ca + (-1); |
932 | 932 |
if (likely((uint64_t)T1 != 0)) |
933 | 933 |
xer_ca = 1; |
934 |
else |
|
935 |
xer_ca = 0; |
|
934 | 936 |
RETURN(); |
935 | 937 |
} |
936 | 938 |
#endif |
... | ... | |
1142 | 1144 |
RETURN(); |
1143 | 1145 |
} |
1144 | 1146 |
|
1145 |
void OPPROTO op_check_subfo (void) |
|
1146 |
{ |
|
1147 |
if (likely(!(((uint32_t)(~T2) ^ (uint32_t)T1 ^ UINT32_MAX) & |
|
1148 |
((uint32_t)(~T2) ^ (uint32_t)T0) & (1UL << 31)))) { |
|
1149 |
xer_ov = 0; |
|
1150 |
} else { |
|
1151 |
xer_ov = 1; |
|
1152 |
xer_so = 1; |
|
1153 |
} |
|
1154 |
RETURN(); |
|
1155 |
} |
|
1156 |
|
|
1157 |
#if defined(TARGET_PPC64) |
|
1158 |
void OPPROTO op_check_subfo_64 (void) |
|
1159 |
{ |
|
1160 |
if (likely(!(((uint64_t)(~T2) ^ (uint64_t)T1 ^ UINT64_MAX) & |
|
1161 |
((uint64_t)(~T2) ^ (uint64_t)T0) & (1ULL << 63)))) { |
|
1162 |
xer_ov = 0; |
|
1163 |
} else { |
|
1164 |
xer_ov = 1; |
|
1165 |
xer_so = 1; |
|
1166 |
} |
|
1167 |
RETURN(); |
|
1168 |
} |
|
1169 |
#endif |
|
1170 |
|
|
1171 | 1147 |
/* subtract from carrying */ |
1172 | 1148 |
void OPPROTO op_check_subfc (void) |
1173 | 1149 |
{ |
... | ... | |
1235 | 1211 |
void OPPROTO op_subfme (void) |
1236 | 1212 |
{ |
1237 | 1213 |
T0 = ~T0 + xer_ca - 1; |
1238 |
if (likely((uint32_t)T0 != (uint32_t)-1))
|
|
1214 |
if (likely((uint32_t)T0 != UINT32_MAX))
|
|
1239 | 1215 |
xer_ca = 1; |
1216 |
else |
|
1217 |
xer_ca = 0; |
|
1240 | 1218 |
RETURN(); |
1241 | 1219 |
} |
1242 | 1220 |
|
... | ... | |
1244 | 1222 |
void OPPROTO op_subfme_64 (void) |
1245 | 1223 |
{ |
1246 | 1224 |
T0 = ~T0 + xer_ca - 1; |
1247 |
if (likely((uint64_t)T0 != (uint64_t)-1))
|
|
1225 |
if (likely((uint64_t)T0 != UINT64_MAX))
|
|
1248 | 1226 |
xer_ca = 1; |
1227 |
else |
|
1228 |
xer_ca = 0; |
|
1249 | 1229 |
RETURN(); |
1250 | 1230 |
} |
1251 | 1231 |
#endif |
... | ... | |
2528 | 2508 |
RETURN(); |
2529 | 2509 |
} |
2530 | 2510 |
|
2531 |
void OPPROTO op_405_check_ov (void) |
|
2532 |
{ |
|
2533 |
do_405_check_ov(); |
|
2534 |
RETURN(); |
|
2535 |
} |
|
2536 |
|
|
2537 | 2511 |
void OPPROTO op_405_check_sat (void) |
2538 | 2512 |
{ |
2539 | 2513 |
do_405_check_sat(); |
b/target-ppc/op_helper.c | ||
---|---|---|
151 | 151 |
{ |
152 | 152 |
T1 = T0; |
153 | 153 |
T0 += xer_ca + (-1); |
154 |
if (likely(!((uint32_t)T1 & |
|
155 |
((uint32_t)T1 ^ (uint32_t)T0) & (1UL << 31)))) { |
|
156 |
xer_ov = 0; |
|
157 |
} else { |
|
158 |
xer_ov = 1; |
|
159 |
xer_so = 1; |
|
160 |
} |
|
154 |
xer_ov = ((uint32_t)T1 & ((uint32_t)T1 ^ (uint32_t)T0)) >> 31; |
|
155 |
xer_so |= xer_ov; |
|
161 | 156 |
if (likely(T1 != 0)) |
162 | 157 |
xer_ca = 1; |
158 |
else |
|
159 |
xer_ca = 0; |
|
163 | 160 |
} |
164 | 161 |
|
165 | 162 |
#if defined(TARGET_PPC64) |
... | ... | |
167 | 164 |
{ |
168 | 165 |
T1 = T0; |
169 | 166 |
T0 += xer_ca + (-1); |
170 |
if (likely(!((uint64_t)T1 & |
|
171 |
((uint64_t)T1 ^ (uint64_t)T0) & (1ULL << 63)))) { |
|
172 |
xer_ov = 0; |
|
173 |
} else { |
|
174 |
xer_ov = 1; |
|
175 |
xer_so = 1; |
|
176 |
} |
|
167 |
xer_ov = ((uint64_t)T1 & ((uint64_t)T1 ^ (uint64_t)T0)) >> 63; |
|
168 |
xer_so |= xer_ov; |
|
177 | 169 |
if (likely(T1 != 0)) |
178 | 170 |
xer_ca = 1; |
171 |
else |
|
172 |
xer_ca = 0; |
|
179 | 173 |
} |
180 | 174 |
#endif |
181 | 175 |
|
... | ... | |
316 | 310 |
{ |
317 | 311 |
T1 = T0; |
318 | 312 |
T0 = ~T0 + xer_ca - 1; |
319 |
if (likely(!((uint32_t)~T1 & ((uint32_t)~T1 ^ (uint32_t)T0) & |
|
320 |
(1UL << 31)))) { |
|
321 |
xer_ov = 0; |
|
322 |
} else { |
|
323 |
xer_ov = 1; |
|
324 |
xer_so = 1; |
|
325 |
} |
|
313 |
xer_ov = ((uint32_t)~T1 & ((uint32_t)~T1 ^ (uint32_t)T0)) >> 31; |
|
314 |
xer_so |= xer_ov; |
|
326 | 315 |
if (likely((uint32_t)T1 != UINT32_MAX)) |
327 | 316 |
xer_ca = 1; |
317 |
else |
|
318 |
xer_ca = 0; |
|
328 | 319 |
} |
329 | 320 |
|
330 | 321 |
#if defined(TARGET_PPC64) |
... | ... | |
332 | 323 |
{ |
333 | 324 |
T1 = T0; |
334 | 325 |
T0 = ~T0 + xer_ca - 1; |
335 |
if (likely(!((uint64_t)~T1 & ((uint64_t)~T1 ^ (uint64_t)T0) & |
|
336 |
(1ULL << 63)))) { |
|
337 |
xer_ov = 0; |
|
338 |
} else { |
|
339 |
xer_ov = 1; |
|
340 |
xer_so = 1; |
|
341 |
} |
|
326 |
xer_ov = ((uint64_t)~T1 & ((uint64_t)~T1 ^ (uint64_t)T0)) >> 63; |
|
327 |
xer_so |= xer_ov; |
|
342 | 328 |
if (likely((uint64_t)T1 != UINT64_MAX)) |
343 | 329 |
xer_ca = 1; |
330 |
else |
|
331 |
xer_ca = 0; |
|
344 | 332 |
} |
345 | 333 |
#endif |
346 | 334 |
|
... | ... | |
348 | 336 |
{ |
349 | 337 |
T1 = T0; |
350 | 338 |
T0 = ~T0 + xer_ca; |
351 |
if (likely(!(((uint32_t)~T1 ^ UINT32_MAX) & |
|
352 |
((uint32_t)(~T1) ^ (uint32_t)T0) & (1UL << 31)))) { |
|
353 |
xer_ov = 0; |
|
354 |
} else { |
|
355 |
xer_ov = 1; |
|
356 |
xer_so = 1; |
|
357 |
} |
|
339 |
xer_ov = (((uint32_t)~T1 ^ UINT32_MAX) & |
|
340 |
((uint32_t)(~T1) ^ (uint32_t)T0)) >> 31; |
|
341 |
xer_so |= xer_ov; |
|
358 | 342 |
if (likely((uint32_t)T0 >= (uint32_t)~T1)) { |
359 | 343 |
xer_ca = 0; |
360 | 344 |
} else { |
... | ... | |
367 | 351 |
{ |
368 | 352 |
T1 = T0; |
369 | 353 |
T0 = ~T0 + xer_ca; |
370 |
if (likely(!(((uint64_t)~T1 ^ UINT64_MAX) & |
|
371 |
((uint64_t)(~T1) ^ (uint64_t)T0) & (1ULL << 63)))) { |
|
372 |
xer_ov = 0; |
|
373 |
} else { |
|
374 |
xer_ov = 1; |
|
375 |
xer_so = 1; |
|
376 |
} |
|
354 |
xer_ov = (((uint64_t)~T1 ^ UINT64_MAX) & |
|
355 |
((uint64_t)(~T1) ^ (uint64_t)T0)) >> 63; |
|
356 |
xer_so |= xer_ov; |
|
377 | 357 |
if (likely((uint64_t)T0 >= (uint64_t)~T1)) { |
378 | 358 |
xer_ca = 0; |
379 | 359 |
} else { |
... | ... | |
1755 | 1735 |
|
1756 | 1736 |
/*****************************************************************************/ |
1757 | 1737 |
/* Embedded PowerPC specific helpers */ |
1758 |
void do_405_check_ov (void) |
|
1759 |
{ |
|
1760 |
if (likely((((uint32_t)T1 ^ (uint32_t)T2) >> 31) || |
|
1761 |
!(((uint32_t)T0 ^ (uint32_t)T2) >> 31))) { |
|
1762 |
xer_ov = 0; |
|
1763 |
} else { |
|
1764 |
xer_ov = 1; |
|
1765 |
xer_so = 1; |
|
1766 |
} |
|
1767 |
} |
|
1768 |
|
|
1769 | 1738 |
void do_405_check_sat (void) |
1770 | 1739 |
{ |
1771 | 1740 |
if (!likely((((uint32_t)T1 ^ (uint32_t)T2) >> 31) || |
b/target-ppc/op_helper.h | ||
---|---|---|
182 | 182 |
#endif |
183 | 183 |
|
184 | 184 |
/* PowerPC 4xx specific helpers */ |
185 |
void do_405_check_ov (void); |
|
186 | 185 |
void do_405_check_sat (void); |
187 | 186 |
void do_load_dcr (void); |
188 | 187 |
void do_store_dcr (void); |
b/target-ppc/translate.c | ||
---|---|---|
888 | 888 |
/* subf subf. subfo subfo. */ |
889 | 889 |
static always_inline void gen_op_subfo (void) |
890 | 890 |
{ |
891 |
gen_op_move_T2_T0(); |
|
891 |
gen_op_moven_T2_T0();
|
|
892 | 892 |
gen_op_subf(); |
893 |
gen_op_check_subfo();
|
|
893 |
gen_op_check_addo();
|
|
894 | 894 |
} |
895 | 895 |
#if defined(TARGET_PPC64) |
896 | 896 |
#define gen_op_subf_64 gen_op_subf |
897 | 897 |
static always_inline void gen_op_subfo_64 (void) |
898 | 898 |
{ |
899 |
gen_op_move_T2_T0(); |
|
899 |
gen_op_moven_T2_T0();
|
|
900 | 900 |
gen_op_subf(); |
901 |
gen_op_check_subfo_64();
|
|
901 |
gen_op_check_addo_64();
|
|
902 | 902 |
} |
903 | 903 |
#endif |
904 | 904 |
GEN_INT_ARITH2_64 (subf, 0x1F, 0x08, 0x01, PPC_INTEGER); |
... | ... | |
910 | 910 |
} |
911 | 911 |
static always_inline void gen_op_subfco (void) |
912 | 912 |
{ |
913 |
gen_op_move_T2_T0(); |
|
913 |
gen_op_moven_T2_T0();
|
|
914 | 914 |
gen_op_subf(); |
915 | 915 |
gen_op_check_subfc(); |
916 |
gen_op_check_subfo();
|
|
916 |
gen_op_check_addo();
|
|
917 | 917 |
} |
918 | 918 |
#if defined(TARGET_PPC64) |
919 | 919 |
static always_inline void gen_op_subfc_64 (void) |
... | ... | |
923 | 923 |
} |
924 | 924 |
static always_inline void gen_op_subfco_64 (void) |
925 | 925 |
{ |
926 |
gen_op_move_T2_T0(); |
|
926 |
gen_op_moven_T2_T0();
|
|
927 | 927 |
gen_op_subf(); |
928 | 928 |
gen_op_check_subfc_64(); |
929 |
gen_op_check_subfo_64();
|
|
929 |
gen_op_check_addo_64();
|
|
930 | 930 |
} |
931 | 931 |
#endif |
932 | 932 |
GEN_INT_ARITH2_64 (subfc, 0x1F, 0x08, 0x00, PPC_INTEGER); |
933 | 933 |
/* subfe subfe. subfeo subfeo. */ |
934 | 934 |
static always_inline void gen_op_subfeo (void) |
935 | 935 |
{ |
936 |
gen_op_move_T2_T0(); |
|
936 |
gen_op_moven_T2_T0();
|
|
937 | 937 |
gen_op_subfe(); |
938 |
gen_op_check_subfo();
|
|
938 |
gen_op_check_addo();
|
|
939 | 939 |
} |
940 | 940 |
#if defined(TARGET_PPC64) |
941 | 941 |
#define gen_op_subfe_64 gen_op_subfe |
942 | 942 |
static always_inline void gen_op_subfeo_64 (void) |
943 | 943 |
{ |
944 |
gen_op_move_T2_T0(); |
|
944 |
gen_op_moven_T2_T0();
|
|
945 | 945 |
gen_op_subfe_64(); |
946 |
gen_op_check_subfo_64();
|
|
946 |
gen_op_check_addo_64();
|
|
947 | 947 |
} |
948 | 948 |
#endif |
949 | 949 |
GEN_INT_ARITH2_64 (subfe, 0x1F, 0x08, 0x04, PPC_INTEGER); |
... | ... | |
5116 | 5116 |
if (opc3 & 0x10) { |
5117 | 5117 |
/* Check overflow */ |
5118 | 5118 |
if (opc3 & 0x01) |
5119 |
gen_op_405_check_ov();
|
|
5119 |
gen_op_check_addo();
|
|
5120 | 5120 |
else |
5121 | 5121 |
gen_op_405_check_ovu(); |
5122 | 5122 |
} |
Also available in: Unified diff