Commit 966439a67830239a6c520c5df6c55627b8153c8b
1 parent
36081602
PowerPC flags update/use fixes:
- fix confusion between overflow/summary overflow, as reported by S Bansal. - reset carry in addic. optimized case (as it was already done in addic). git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3179 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
41 additions
and
31 deletions
target-ppc/op.c
... | ... | @@ -131,7 +131,7 @@ void OPPROTO op_print_mem_EA (void) |
131 | 131 | /* set_Rc0 */ |
132 | 132 | void OPPROTO op_set_Rc0 (void) |
133 | 133 | { |
134 | - env->crf[0] = T0 | xer_ov; | |
134 | + env->crf[0] = T0 | xer_so; | |
135 | 135 | RETURN(); |
136 | 136 | } |
137 | 137 | |
... | ... | @@ -731,8 +731,8 @@ void OPPROTO op_check_addo (void) |
731 | 731 | ((uint32_t)T2 ^ (uint32_t)T0) & (1UL << 31)))) { |
732 | 732 | xer_ov = 0; |
733 | 733 | } else { |
734 | - xer_so = 1; | |
735 | 734 | xer_ov = 1; |
735 | + xer_so = 1; | |
736 | 736 | } |
737 | 737 | RETURN(); |
738 | 738 | } |
... | ... | @@ -744,8 +744,8 @@ void OPPROTO op_check_addo_64 (void) |
744 | 744 | ((uint64_t)T2 ^ (uint64_t)T0) & (1ULL << 63)))) { |
745 | 745 | xer_ov = 0; |
746 | 746 | } else { |
747 | - xer_so = 1; | |
748 | 747 | xer_ov = 1; |
748 | + xer_so = 1; | |
749 | 749 | } |
750 | 750 | RETURN(); |
751 | 751 | } |
... | ... | @@ -1028,8 +1028,8 @@ void OPPROTO op_check_subfo (void) |
1028 | 1028 | ((uint32_t)(~T2) ^ (uint32_t)T0) & (1UL << 31)))) { |
1029 | 1029 | xer_ov = 0; |
1030 | 1030 | } else { |
1031 | - xer_so = 1; | |
1032 | 1031 | xer_ov = 1; |
1032 | + xer_so = 1; | |
1033 | 1033 | } |
1034 | 1034 | RETURN(); |
1035 | 1035 | } |
... | ... | @@ -1041,8 +1041,8 @@ void OPPROTO op_check_subfo_64 (void) |
1041 | 1041 | ((uint64_t)(~T2) ^ (uint64_t)T0) & (1ULL << 63)))) { |
1042 | 1042 | xer_ov = 0; |
1043 | 1043 | } else { |
1044 | - xer_so = 1; | |
1045 | 1044 | xer_ov = 1; |
1045 | + xer_so = 1; | |
1046 | 1046 | } |
1047 | 1047 | RETURN(); |
1048 | 1048 | } |
... | ... | @@ -1196,6 +1196,7 @@ void OPPROTO op_cmp (void) |
1196 | 1196 | } else { |
1197 | 1197 | T0 = 0x02; |
1198 | 1198 | } |
1199 | + T0 |= xer_so; | |
1199 | 1200 | RETURN(); |
1200 | 1201 | } |
1201 | 1202 | |
... | ... | @@ -1209,6 +1210,7 @@ void OPPROTO op_cmp_64 (void) |
1209 | 1210 | } else { |
1210 | 1211 | T0 = 0x02; |
1211 | 1212 | } |
1213 | + T0 |= xer_so; | |
1212 | 1214 | RETURN(); |
1213 | 1215 | } |
1214 | 1216 | #endif |
... | ... | @@ -1223,6 +1225,7 @@ void OPPROTO op_cmpi (void) |
1223 | 1225 | } else { |
1224 | 1226 | T0 = 0x02; |
1225 | 1227 | } |
1228 | + T0 |= xer_so; | |
1226 | 1229 | RETURN(); |
1227 | 1230 | } |
1228 | 1231 | |
... | ... | @@ -1236,6 +1239,7 @@ void OPPROTO op_cmpi_64 (void) |
1236 | 1239 | } else { |
1237 | 1240 | T0 = 0x02; |
1238 | 1241 | } |
1242 | + T0 |= xer_so; | |
1239 | 1243 | RETURN(); |
1240 | 1244 | } |
1241 | 1245 | #endif |
... | ... | @@ -1250,6 +1254,7 @@ void OPPROTO op_cmpl (void) |
1250 | 1254 | } else { |
1251 | 1255 | T0 = 0x02; |
1252 | 1256 | } |
1257 | + T0 |= xer_so; | |
1253 | 1258 | RETURN(); |
1254 | 1259 | } |
1255 | 1260 | |
... | ... | @@ -1263,6 +1268,7 @@ void OPPROTO op_cmpl_64 (void) |
1263 | 1268 | } else { |
1264 | 1269 | T0 = 0x02; |
1265 | 1270 | } |
1271 | + T0 |= xer_so; | |
1266 | 1272 | RETURN(); |
1267 | 1273 | } |
1268 | 1274 | #endif |
... | ... | @@ -1277,6 +1283,7 @@ void OPPROTO op_cmpli (void) |
1277 | 1283 | } else { |
1278 | 1284 | T0 = 0x02; |
1279 | 1285 | } |
1286 | + T0 |= xer_so; | |
1280 | 1287 | RETURN(); |
1281 | 1288 | } |
1282 | 1289 | |
... | ... | @@ -1290,6 +1297,7 @@ void OPPROTO op_cmpli_64 (void) |
1290 | 1297 | } else { |
1291 | 1298 | T0 = 0x02; |
1292 | 1299 | } |
1300 | + T0 |= xer_so; | |
1293 | 1301 | RETURN(); |
1294 | 1302 | } |
1295 | 1303 | #endif | ... | ... |
target-ppc/op_helper.c
... | ... | @@ -311,8 +311,8 @@ void do_addmeo (void) |
311 | 311 | ((uint32_t)T1 ^ (uint32_t)T0) & (1UL << 31)))) { |
312 | 312 | xer_ov = 0; |
313 | 313 | } else { |
314 | - xer_so = 1; | |
315 | 314 | xer_ov = 1; |
315 | + xer_so = 1; | |
316 | 316 | } |
317 | 317 | if (likely(T1 != 0)) |
318 | 318 | xer_ca = 1; |
... | ... | @@ -327,8 +327,8 @@ void do_addmeo_64 (void) |
327 | 327 | ((uint64_t)T1 ^ (uint64_t)T0) & (1ULL << 63)))) { |
328 | 328 | xer_ov = 0; |
329 | 329 | } else { |
330 | - xer_so = 1; | |
331 | 330 | xer_ov = 1; |
331 | + xer_so = 1; | |
332 | 332 | } |
333 | 333 | if (likely(T1 != 0)) |
334 | 334 | xer_ca = 1; |
... | ... | @@ -342,8 +342,8 @@ void do_divwo (void) |
342 | 342 | xer_ov = 0; |
343 | 343 | T0 = (int32_t)T0 / (int32_t)T1; |
344 | 344 | } else { |
345 | - xer_so = 1; | |
346 | 345 | xer_ov = 1; |
346 | + xer_so = 1; | |
347 | 347 | T0 = (-1) * ((uint32_t)T0 >> 31); |
348 | 348 | } |
349 | 349 | } |
... | ... | @@ -356,8 +356,8 @@ void do_divdo (void) |
356 | 356 | xer_ov = 0; |
357 | 357 | T0 = (int64_t)T0 / (int64_t)T1; |
358 | 358 | } else { |
359 | - xer_so = 1; | |
360 | 359 | xer_ov = 1; |
360 | + xer_so = 1; | |
361 | 361 | T0 = (-1ULL) * ((uint64_t)T0 >> 63); |
362 | 362 | } |
363 | 363 | } |
... | ... | @@ -369,8 +369,8 @@ void do_divwuo (void) |
369 | 369 | xer_ov = 0; |
370 | 370 | T0 = (uint32_t)T0 / (uint32_t)T1; |
371 | 371 | } else { |
372 | - xer_so = 1; | |
373 | 372 | xer_ov = 1; |
373 | + xer_so = 1; | |
374 | 374 | T0 = 0; |
375 | 375 | } |
376 | 376 | } |
... | ... | @@ -382,8 +382,8 @@ void do_divduo (void) |
382 | 382 | xer_ov = 0; |
383 | 383 | T0 = (uint64_t)T0 / (uint64_t)T1; |
384 | 384 | } else { |
385 | - xer_so = 1; | |
386 | 385 | xer_ov = 1; |
386 | + xer_so = 1; | |
387 | 387 | T0 = 0; |
388 | 388 | } |
389 | 389 | } |
... | ... | @@ -475,8 +475,8 @@ void do_subfmeo (void) |
475 | 475 | (1UL << 31)))) { |
476 | 476 | xer_ov = 0; |
477 | 477 | } else { |
478 | - xer_so = 1; | |
479 | 478 | xer_ov = 1; |
479 | + xer_so = 1; | |
480 | 480 | } |
481 | 481 | if (likely((uint32_t)T1 != UINT32_MAX)) |
482 | 482 | xer_ca = 1; |
... | ... | @@ -491,8 +491,8 @@ void do_subfmeo_64 (void) |
491 | 491 | (1ULL << 63)))) { |
492 | 492 | xer_ov = 0; |
493 | 493 | } else { |
494 | - xer_so = 1; | |
495 | 494 | xer_ov = 1; |
495 | + xer_so = 1; | |
496 | 496 | } |
497 | 497 | if (likely((uint64_t)T1 != UINT64_MAX)) |
498 | 498 | xer_ca = 1; |
... | ... | @@ -1073,8 +1073,8 @@ void do_POWER_dozo (void) |
1073 | 1073 | T0 = T1 - T0; |
1074 | 1074 | if (((uint32_t)(~T2) ^ (uint32_t)T1 ^ UINT32_MAX) & |
1075 | 1075 | ((uint32_t)(~T2) ^ (uint32_t)T0) & (1UL << 31)) { |
1076 | - xer_so = 1; | |
1077 | 1076 | xer_ov = 1; |
1077 | + xer_so = 1; | |
1078 | 1078 | } else { |
1079 | 1079 | xer_ov = 0; |
1080 | 1080 | } |
... | ... | @@ -2499,7 +2499,7 @@ void do_4xx_tlbsx (void) |
2499 | 2499 | |
2500 | 2500 | void do_4xx_tlbsx_ (void) |
2501 | 2501 | { |
2502 | - int tmp = xer_ov; | |
2502 | + int tmp = xer_so; | |
2503 | 2503 | |
2504 | 2504 | T0 = ppcemb_tlb_search(env, T0, env->spr[SPR_40x_PID]); |
2505 | 2505 | if (T0 != -1) | ... | ... |
target-ppc/op_mem.h
... | ... | @@ -610,10 +610,10 @@ void OPPROTO glue(op_stwcx, MEMSUFFIX) (void) |
610 | 610 | do_raise_exception(EXCP_ALIGN); |
611 | 611 | } else { |
612 | 612 | if (unlikely(env->reserve != (uint32_t)T0)) { |
613 | - env->crf[0] = xer_ov; | |
613 | + env->crf[0] = xer_so; | |
614 | 614 | } else { |
615 | 615 | glue(stl, MEMSUFFIX)((uint32_t)T0, T1); |
616 | - env->crf[0] = xer_ov | 0x02; | |
616 | + env->crf[0] = xer_so | 0x02; | |
617 | 617 | } |
618 | 618 | } |
619 | 619 | env->reserve = -1; |
... | ... | @@ -627,10 +627,10 @@ void OPPROTO glue(op_stwcx_64, MEMSUFFIX) (void) |
627 | 627 | do_raise_exception(EXCP_ALIGN); |
628 | 628 | } else { |
629 | 629 | if (unlikely(env->reserve != (uint64_t)T0)) { |
630 | - env->crf[0] = xer_ov; | |
630 | + env->crf[0] = xer_so; | |
631 | 631 | } else { |
632 | 632 | glue(stl, MEMSUFFIX)((uint64_t)T0, T1); |
633 | - env->crf[0] = xer_ov | 0x02; | |
633 | + env->crf[0] = xer_so | 0x02; | |
634 | 634 | } |
635 | 635 | } |
636 | 636 | env->reserve = -1; |
... | ... | @@ -643,10 +643,10 @@ void OPPROTO glue(op_stdcx, MEMSUFFIX) (void) |
643 | 643 | do_raise_exception(EXCP_ALIGN); |
644 | 644 | } else { |
645 | 645 | if (unlikely(env->reserve != (uint32_t)T0)) { |
646 | - env->crf[0] = xer_ov; | |
646 | + env->crf[0] = xer_so; | |
647 | 647 | } else { |
648 | 648 | glue(stq, MEMSUFFIX)((uint32_t)T0, T1); |
649 | - env->crf[0] = xer_ov | 0x02; | |
649 | + env->crf[0] = xer_so | 0x02; | |
650 | 650 | } |
651 | 651 | } |
652 | 652 | env->reserve = -1; |
... | ... | @@ -659,10 +659,10 @@ void OPPROTO glue(op_stdcx_64, MEMSUFFIX) (void) |
659 | 659 | do_raise_exception(EXCP_ALIGN); |
660 | 660 | } else { |
661 | 661 | if (unlikely(env->reserve != (uint64_t)T0)) { |
662 | - env->crf[0] = xer_ov; | |
662 | + env->crf[0] = xer_so; | |
663 | 663 | } else { |
664 | 664 | glue(stq, MEMSUFFIX)((uint64_t)T0, T1); |
665 | - env->crf[0] = xer_ov | 0x02; | |
665 | + env->crf[0] = xer_so | 0x02; | |
666 | 666 | } |
667 | 667 | } |
668 | 668 | env->reserve = -1; |
... | ... | @@ -676,10 +676,10 @@ void OPPROTO glue(op_stwcx_le, MEMSUFFIX) (void) |
676 | 676 | do_raise_exception(EXCP_ALIGN); |
677 | 677 | } else { |
678 | 678 | if (unlikely(env->reserve != (uint32_t)T0)) { |
679 | - env->crf[0] = xer_ov; | |
679 | + env->crf[0] = xer_so; | |
680 | 680 | } else { |
681 | 681 | glue(st32r, MEMSUFFIX)((uint32_t)T0, T1); |
682 | - env->crf[0] = xer_ov | 0x02; | |
682 | + env->crf[0] = xer_so | 0x02; | |
683 | 683 | } |
684 | 684 | } |
685 | 685 | env->reserve = -1; |
... | ... | @@ -693,10 +693,10 @@ void OPPROTO glue(op_stwcx_le_64, MEMSUFFIX) (void) |
693 | 693 | do_raise_exception(EXCP_ALIGN); |
694 | 694 | } else { |
695 | 695 | if (unlikely(env->reserve != (uint64_t)T0)) { |
696 | - env->crf[0] = xer_ov; | |
696 | + env->crf[0] = xer_so; | |
697 | 697 | } else { |
698 | 698 | glue(st32r, MEMSUFFIX)((uint64_t)T0, T1); |
699 | - env->crf[0] = xer_ov | 0x02; | |
699 | + env->crf[0] = xer_so | 0x02; | |
700 | 700 | } |
701 | 701 | } |
702 | 702 | env->reserve = -1; |
... | ... | @@ -709,10 +709,10 @@ void OPPROTO glue(op_stdcx_le, MEMSUFFIX) (void) |
709 | 709 | do_raise_exception(EXCP_ALIGN); |
710 | 710 | } else { |
711 | 711 | if (unlikely(env->reserve != (uint32_t)T0)) { |
712 | - env->crf[0] = xer_ov; | |
712 | + env->crf[0] = xer_so; | |
713 | 713 | } else { |
714 | 714 | glue(st64r, MEMSUFFIX)((uint32_t)T0, T1); |
715 | - env->crf[0] = xer_ov | 0x02; | |
715 | + env->crf[0] = xer_so | 0x02; | |
716 | 716 | } |
717 | 717 | } |
718 | 718 | env->reserve = -1; |
... | ... | @@ -725,10 +725,10 @@ void OPPROTO glue(op_stdcx_le_64, MEMSUFFIX) (void) |
725 | 725 | do_raise_exception(EXCP_ALIGN); |
726 | 726 | } else { |
727 | 727 | if (unlikely(env->reserve != (uint64_t)T0)) { |
728 | - env->crf[0] = xer_ov; | |
728 | + env->crf[0] = xer_so; | |
729 | 729 | } else { |
730 | 730 | glue(st64r, MEMSUFFIX)((uint64_t)T0, T1); |
731 | - env->crf[0] = xer_ov | 0x02; | |
731 | + env->crf[0] = xer_so | 0x02; | |
732 | 732 | } |
733 | 733 | } |
734 | 734 | env->reserve = -1; | ... | ... |
target-ppc/translate.c