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