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,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); |