Commit 966439a67830239a6c520c5df6c55627b8153c8b

Authored by j_mayer
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
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
... ... @@ -802,6 +802,8 @@ GEN_HANDLER(addic_, 0x0D, 0xFF, 0xFF, 0x00000000, PPC_INTEGER)
802 802 else
803 803 #endif
804 804 gen_op_check_addc();
  805 + } else {
  806 + gen_op_clear_xer_ca();
805 807 }
806 808 gen_op_store_T0_gpr(rD(ctx->opcode));
807 809 gen_set_Rc0(ctx);
... ...