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,7 +131,7 @@ void OPPROTO op_print_mem_EA (void)
131 /* set_Rc0 */ 131 /* set_Rc0 */
132 void OPPROTO op_set_Rc0 (void) 132 void OPPROTO op_set_Rc0 (void)
133 { 133 {
134 - env->crf[0] = T0 | xer_ov; 134 + env->crf[0] = T0 | xer_so;
135 RETURN(); 135 RETURN();
136 } 136 }
137 137
@@ -731,8 +731,8 @@ void OPPROTO op_check_addo (void) @@ -731,8 +731,8 @@ void OPPROTO op_check_addo (void)
731 ((uint32_t)T2 ^ (uint32_t)T0) & (1UL << 31)))) { 731 ((uint32_t)T2 ^ (uint32_t)T0) & (1UL << 31)))) {
732 xer_ov = 0; 732 xer_ov = 0;
733 } else { 733 } else {
734 - xer_so = 1;  
735 xer_ov = 1; 734 xer_ov = 1;
  735 + xer_so = 1;
736 } 736 }
737 RETURN(); 737 RETURN();
738 } 738 }
@@ -744,8 +744,8 @@ void OPPROTO op_check_addo_64 (void) @@ -744,8 +744,8 @@ void OPPROTO op_check_addo_64 (void)
744 ((uint64_t)T2 ^ (uint64_t)T0) & (1ULL << 63)))) { 744 ((uint64_t)T2 ^ (uint64_t)T0) & (1ULL << 63)))) {
745 xer_ov = 0; 745 xer_ov = 0;
746 } else { 746 } else {
747 - xer_so = 1;  
748 xer_ov = 1; 747 xer_ov = 1;
  748 + xer_so = 1;
749 } 749 }
750 RETURN(); 750 RETURN();
751 } 751 }
@@ -1028,8 +1028,8 @@ void OPPROTO op_check_subfo (void) @@ -1028,8 +1028,8 @@ void OPPROTO op_check_subfo (void)
1028 ((uint32_t)(~T2) ^ (uint32_t)T0) & (1UL << 31)))) { 1028 ((uint32_t)(~T2) ^ (uint32_t)T0) & (1UL << 31)))) {
1029 xer_ov = 0; 1029 xer_ov = 0;
1030 } else { 1030 } else {
1031 - xer_so = 1;  
1032 xer_ov = 1; 1031 xer_ov = 1;
  1032 + xer_so = 1;
1033 } 1033 }
1034 RETURN(); 1034 RETURN();
1035 } 1035 }
@@ -1041,8 +1041,8 @@ void OPPROTO op_check_subfo_64 (void) @@ -1041,8 +1041,8 @@ void OPPROTO op_check_subfo_64 (void)
1041 ((uint64_t)(~T2) ^ (uint64_t)T0) & (1ULL << 63)))) { 1041 ((uint64_t)(~T2) ^ (uint64_t)T0) & (1ULL << 63)))) {
1042 xer_ov = 0; 1042 xer_ov = 0;
1043 } else { 1043 } else {
1044 - xer_so = 1;  
1045 xer_ov = 1; 1044 xer_ov = 1;
  1045 + xer_so = 1;
1046 } 1046 }
1047 RETURN(); 1047 RETURN();
1048 } 1048 }
@@ -1196,6 +1196,7 @@ void OPPROTO op_cmp (void) @@ -1196,6 +1196,7 @@ void OPPROTO op_cmp (void)
1196 } else { 1196 } else {
1197 T0 = 0x02; 1197 T0 = 0x02;
1198 } 1198 }
  1199 + T0 |= xer_so;
1199 RETURN(); 1200 RETURN();
1200 } 1201 }
1201 1202
@@ -1209,6 +1210,7 @@ void OPPROTO op_cmp_64 (void) @@ -1209,6 +1210,7 @@ void OPPROTO op_cmp_64 (void)
1209 } else { 1210 } else {
1210 T0 = 0x02; 1211 T0 = 0x02;
1211 } 1212 }
  1213 + T0 |= xer_so;
1212 RETURN(); 1214 RETURN();
1213 } 1215 }
1214 #endif 1216 #endif
@@ -1223,6 +1225,7 @@ void OPPROTO op_cmpi (void) @@ -1223,6 +1225,7 @@ void OPPROTO op_cmpi (void)
1223 } else { 1225 } else {
1224 T0 = 0x02; 1226 T0 = 0x02;
1225 } 1227 }
  1228 + T0 |= xer_so;
1226 RETURN(); 1229 RETURN();
1227 } 1230 }
1228 1231
@@ -1236,6 +1239,7 @@ void OPPROTO op_cmpi_64 (void) @@ -1236,6 +1239,7 @@ void OPPROTO op_cmpi_64 (void)
1236 } else { 1239 } else {
1237 T0 = 0x02; 1240 T0 = 0x02;
1238 } 1241 }
  1242 + T0 |= xer_so;
1239 RETURN(); 1243 RETURN();
1240 } 1244 }
1241 #endif 1245 #endif
@@ -1250,6 +1254,7 @@ void OPPROTO op_cmpl (void) @@ -1250,6 +1254,7 @@ void OPPROTO op_cmpl (void)
1250 } else { 1254 } else {
1251 T0 = 0x02; 1255 T0 = 0x02;
1252 } 1256 }
  1257 + T0 |= xer_so;
1253 RETURN(); 1258 RETURN();
1254 } 1259 }
1255 1260
@@ -1263,6 +1268,7 @@ void OPPROTO op_cmpl_64 (void) @@ -1263,6 +1268,7 @@ void OPPROTO op_cmpl_64 (void)
1263 } else { 1268 } else {
1264 T0 = 0x02; 1269 T0 = 0x02;
1265 } 1270 }
  1271 + T0 |= xer_so;
1266 RETURN(); 1272 RETURN();
1267 } 1273 }
1268 #endif 1274 #endif
@@ -1277,6 +1283,7 @@ void OPPROTO op_cmpli (void) @@ -1277,6 +1283,7 @@ void OPPROTO op_cmpli (void)
1277 } else { 1283 } else {
1278 T0 = 0x02; 1284 T0 = 0x02;
1279 } 1285 }
  1286 + T0 |= xer_so;
1280 RETURN(); 1287 RETURN();
1281 } 1288 }
1282 1289
@@ -1290,6 +1297,7 @@ void OPPROTO op_cmpli_64 (void) @@ -1290,6 +1297,7 @@ void OPPROTO op_cmpli_64 (void)
1290 } else { 1297 } else {
1291 T0 = 0x02; 1298 T0 = 0x02;
1292 } 1299 }
  1300 + T0 |= xer_so;
1293 RETURN(); 1301 RETURN();
1294 } 1302 }
1295 #endif 1303 #endif
target-ppc/op_helper.c
@@ -311,8 +311,8 @@ void do_addmeo (void) @@ -311,8 +311,8 @@ void do_addmeo (void)
311 ((uint32_t)T1 ^ (uint32_t)T0) & (1UL << 31)))) { 311 ((uint32_t)T1 ^ (uint32_t)T0) & (1UL << 31)))) {
312 xer_ov = 0; 312 xer_ov = 0;
313 } else { 313 } else {
314 - xer_so = 1;  
315 xer_ov = 1; 314 xer_ov = 1;
  315 + xer_so = 1;
316 } 316 }
317 if (likely(T1 != 0)) 317 if (likely(T1 != 0))
318 xer_ca = 1; 318 xer_ca = 1;
@@ -327,8 +327,8 @@ void do_addmeo_64 (void) @@ -327,8 +327,8 @@ void do_addmeo_64 (void)
327 ((uint64_t)T1 ^ (uint64_t)T0) & (1ULL << 63)))) { 327 ((uint64_t)T1 ^ (uint64_t)T0) & (1ULL << 63)))) {
328 xer_ov = 0; 328 xer_ov = 0;
329 } else { 329 } else {
330 - xer_so = 1;  
331 xer_ov = 1; 330 xer_ov = 1;
  331 + xer_so = 1;
332 } 332 }
333 if (likely(T1 != 0)) 333 if (likely(T1 != 0))
334 xer_ca = 1; 334 xer_ca = 1;
@@ -342,8 +342,8 @@ void do_divwo (void) @@ -342,8 +342,8 @@ void do_divwo (void)
342 xer_ov = 0; 342 xer_ov = 0;
343 T0 = (int32_t)T0 / (int32_t)T1; 343 T0 = (int32_t)T0 / (int32_t)T1;
344 } else { 344 } else {
345 - xer_so = 1;  
346 xer_ov = 1; 345 xer_ov = 1;
  346 + xer_so = 1;
347 T0 = (-1) * ((uint32_t)T0 >> 31); 347 T0 = (-1) * ((uint32_t)T0 >> 31);
348 } 348 }
349 } 349 }
@@ -356,8 +356,8 @@ void do_divdo (void) @@ -356,8 +356,8 @@ void do_divdo (void)
356 xer_ov = 0; 356 xer_ov = 0;
357 T0 = (int64_t)T0 / (int64_t)T1; 357 T0 = (int64_t)T0 / (int64_t)T1;
358 } else { 358 } else {
359 - xer_so = 1;  
360 xer_ov = 1; 359 xer_ov = 1;
  360 + xer_so = 1;
361 T0 = (-1ULL) * ((uint64_t)T0 >> 63); 361 T0 = (-1ULL) * ((uint64_t)T0 >> 63);
362 } 362 }
363 } 363 }
@@ -369,8 +369,8 @@ void do_divwuo (void) @@ -369,8 +369,8 @@ void do_divwuo (void)
369 xer_ov = 0; 369 xer_ov = 0;
370 T0 = (uint32_t)T0 / (uint32_t)T1; 370 T0 = (uint32_t)T0 / (uint32_t)T1;
371 } else { 371 } else {
372 - xer_so = 1;  
373 xer_ov = 1; 372 xer_ov = 1;
  373 + xer_so = 1;
374 T0 = 0; 374 T0 = 0;
375 } 375 }
376 } 376 }
@@ -382,8 +382,8 @@ void do_divduo (void) @@ -382,8 +382,8 @@ void do_divduo (void)
382 xer_ov = 0; 382 xer_ov = 0;
383 T0 = (uint64_t)T0 / (uint64_t)T1; 383 T0 = (uint64_t)T0 / (uint64_t)T1;
384 } else { 384 } else {
385 - xer_so = 1;  
386 xer_ov = 1; 385 xer_ov = 1;
  386 + xer_so = 1;
387 T0 = 0; 387 T0 = 0;
388 } 388 }
389 } 389 }
@@ -475,8 +475,8 @@ void do_subfmeo (void) @@ -475,8 +475,8 @@ void do_subfmeo (void)
475 (1UL << 31)))) { 475 (1UL << 31)))) {
476 xer_ov = 0; 476 xer_ov = 0;
477 } else { 477 } else {
478 - xer_so = 1;  
479 xer_ov = 1; 478 xer_ov = 1;
  479 + xer_so = 1;
480 } 480 }
481 if (likely((uint32_t)T1 != UINT32_MAX)) 481 if (likely((uint32_t)T1 != UINT32_MAX))
482 xer_ca = 1; 482 xer_ca = 1;
@@ -491,8 +491,8 @@ void do_subfmeo_64 (void) @@ -491,8 +491,8 @@ void do_subfmeo_64 (void)
491 (1ULL << 63)))) { 491 (1ULL << 63)))) {
492 xer_ov = 0; 492 xer_ov = 0;
493 } else { 493 } else {
494 - xer_so = 1;  
495 xer_ov = 1; 494 xer_ov = 1;
  495 + xer_so = 1;
496 } 496 }
497 if (likely((uint64_t)T1 != UINT64_MAX)) 497 if (likely((uint64_t)T1 != UINT64_MAX))
498 xer_ca = 1; 498 xer_ca = 1;
@@ -1073,8 +1073,8 @@ void do_POWER_dozo (void) @@ -1073,8 +1073,8 @@ void do_POWER_dozo (void)
1073 T0 = T1 - T0; 1073 T0 = T1 - T0;
1074 if (((uint32_t)(~T2) ^ (uint32_t)T1 ^ UINT32_MAX) & 1074 if (((uint32_t)(~T2) ^ (uint32_t)T1 ^ UINT32_MAX) &
1075 ((uint32_t)(~T2) ^ (uint32_t)T0) & (1UL << 31)) { 1075 ((uint32_t)(~T2) ^ (uint32_t)T0) & (1UL << 31)) {
1076 - xer_so = 1;  
1077 xer_ov = 1; 1076 xer_ov = 1;
  1077 + xer_so = 1;
1078 } else { 1078 } else {
1079 xer_ov = 0; 1079 xer_ov = 0;
1080 } 1080 }
@@ -2499,7 +2499,7 @@ void do_4xx_tlbsx (void) @@ -2499,7 +2499,7 @@ void do_4xx_tlbsx (void)
2499 2499
2500 void do_4xx_tlbsx_ (void) 2500 void do_4xx_tlbsx_ (void)
2501 { 2501 {
2502 - int tmp = xer_ov; 2502 + int tmp = xer_so;
2503 2503
2504 T0 = ppcemb_tlb_search(env, T0, env->spr[SPR_40x_PID]); 2504 T0 = ppcemb_tlb_search(env, T0, env->spr[SPR_40x_PID]);
2505 if (T0 != -1) 2505 if (T0 != -1)
target-ppc/op_mem.h
@@ -610,10 +610,10 @@ void OPPROTO glue(op_stwcx, MEMSUFFIX) (void) @@ -610,10 +610,10 @@ void OPPROTO glue(op_stwcx, MEMSUFFIX) (void)
610 do_raise_exception(EXCP_ALIGN); 610 do_raise_exception(EXCP_ALIGN);
611 } else { 611 } else {
612 if (unlikely(env->reserve != (uint32_t)T0)) { 612 if (unlikely(env->reserve != (uint32_t)T0)) {
613 - env->crf[0] = xer_ov; 613 + env->crf[0] = xer_so;
614 } else { 614 } else {
615 glue(stl, MEMSUFFIX)((uint32_t)T0, T1); 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 env->reserve = -1; 619 env->reserve = -1;
@@ -627,10 +627,10 @@ void OPPROTO glue(op_stwcx_64, MEMSUFFIX) (void) @@ -627,10 +627,10 @@ void OPPROTO glue(op_stwcx_64, MEMSUFFIX) (void)
627 do_raise_exception(EXCP_ALIGN); 627 do_raise_exception(EXCP_ALIGN);
628 } else { 628 } else {
629 if (unlikely(env->reserve != (uint64_t)T0)) { 629 if (unlikely(env->reserve != (uint64_t)T0)) {
630 - env->crf[0] = xer_ov; 630 + env->crf[0] = xer_so;
631 } else { 631 } else {
632 glue(stl, MEMSUFFIX)((uint64_t)T0, T1); 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 env->reserve = -1; 636 env->reserve = -1;
@@ -643,10 +643,10 @@ void OPPROTO glue(op_stdcx, MEMSUFFIX) (void) @@ -643,10 +643,10 @@ void OPPROTO glue(op_stdcx, MEMSUFFIX) (void)
643 do_raise_exception(EXCP_ALIGN); 643 do_raise_exception(EXCP_ALIGN);
644 } else { 644 } else {
645 if (unlikely(env->reserve != (uint32_t)T0)) { 645 if (unlikely(env->reserve != (uint32_t)T0)) {
646 - env->crf[0] = xer_ov; 646 + env->crf[0] = xer_so;
647 } else { 647 } else {
648 glue(stq, MEMSUFFIX)((uint32_t)T0, T1); 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 env->reserve = -1; 652 env->reserve = -1;
@@ -659,10 +659,10 @@ void OPPROTO glue(op_stdcx_64, MEMSUFFIX) (void) @@ -659,10 +659,10 @@ void OPPROTO glue(op_stdcx_64, MEMSUFFIX) (void)
659 do_raise_exception(EXCP_ALIGN); 659 do_raise_exception(EXCP_ALIGN);
660 } else { 660 } else {
661 if (unlikely(env->reserve != (uint64_t)T0)) { 661 if (unlikely(env->reserve != (uint64_t)T0)) {
662 - env->crf[0] = xer_ov; 662 + env->crf[0] = xer_so;
663 } else { 663 } else {
664 glue(stq, MEMSUFFIX)((uint64_t)T0, T1); 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 env->reserve = -1; 668 env->reserve = -1;
@@ -676,10 +676,10 @@ void OPPROTO glue(op_stwcx_le, MEMSUFFIX) (void) @@ -676,10 +676,10 @@ void OPPROTO glue(op_stwcx_le, MEMSUFFIX) (void)
676 do_raise_exception(EXCP_ALIGN); 676 do_raise_exception(EXCP_ALIGN);
677 } else { 677 } else {
678 if (unlikely(env->reserve != (uint32_t)T0)) { 678 if (unlikely(env->reserve != (uint32_t)T0)) {
679 - env->crf[0] = xer_ov; 679 + env->crf[0] = xer_so;
680 } else { 680 } else {
681 glue(st32r, MEMSUFFIX)((uint32_t)T0, T1); 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 env->reserve = -1; 685 env->reserve = -1;
@@ -693,10 +693,10 @@ void OPPROTO glue(op_stwcx_le_64, MEMSUFFIX) (void) @@ -693,10 +693,10 @@ void OPPROTO glue(op_stwcx_le_64, MEMSUFFIX) (void)
693 do_raise_exception(EXCP_ALIGN); 693 do_raise_exception(EXCP_ALIGN);
694 } else { 694 } else {
695 if (unlikely(env->reserve != (uint64_t)T0)) { 695 if (unlikely(env->reserve != (uint64_t)T0)) {
696 - env->crf[0] = xer_ov; 696 + env->crf[0] = xer_so;
697 } else { 697 } else {
698 glue(st32r, MEMSUFFIX)((uint64_t)T0, T1); 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 env->reserve = -1; 702 env->reserve = -1;
@@ -709,10 +709,10 @@ void OPPROTO glue(op_stdcx_le, MEMSUFFIX) (void) @@ -709,10 +709,10 @@ void OPPROTO glue(op_stdcx_le, MEMSUFFIX) (void)
709 do_raise_exception(EXCP_ALIGN); 709 do_raise_exception(EXCP_ALIGN);
710 } else { 710 } else {
711 if (unlikely(env->reserve != (uint32_t)T0)) { 711 if (unlikely(env->reserve != (uint32_t)T0)) {
712 - env->crf[0] = xer_ov; 712 + env->crf[0] = xer_so;
713 } else { 713 } else {
714 glue(st64r, MEMSUFFIX)((uint32_t)T0, T1); 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 env->reserve = -1; 718 env->reserve = -1;
@@ -725,10 +725,10 @@ void OPPROTO glue(op_stdcx_le_64, MEMSUFFIX) (void) @@ -725,10 +725,10 @@ void OPPROTO glue(op_stdcx_le_64, MEMSUFFIX) (void)
725 do_raise_exception(EXCP_ALIGN); 725 do_raise_exception(EXCP_ALIGN);
726 } else { 726 } else {
727 if (unlikely(env->reserve != (uint64_t)T0)) { 727 if (unlikely(env->reserve != (uint64_t)T0)) {
728 - env->crf[0] = xer_ov; 728 + env->crf[0] = xer_so;
729 } else { 729 } else {
730 glue(st64r, MEMSUFFIX)((uint64_t)T0, T1); 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 env->reserve = -1; 734 env->reserve = -1;
target-ppc/translate.c
@@ -802,6 +802,8 @@ GEN_HANDLER(addic_, 0x0D, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) @@ -802,6 +802,8 @@ GEN_HANDLER(addic_, 0x0D, 0xFF, 0xFF, 0x00000000, PPC_INTEGER)
802 else 802 else
803 #endif 803 #endif
804 gen_op_check_addc(); 804 gen_op_check_addc();
  805 + } else {
  806 + gen_op_clear_xer_ca();
805 } 807 }
806 gen_op_store_T0_gpr(rD(ctx->opcode)); 808 gen_op_store_T0_gpr(rD(ctx->opcode));
807 gen_set_Rc0(ctx); 809 gen_set_Rc0(ctx);