Commit e1571908a28b1707f63392541be30990160af31c
1 parent
bdffd4a9
target-ppc: convert crf related instructions to TCG
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5505 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
291 additions
and
383 deletions
target-ppc/cpu.h
| ... | ... | @@ -829,7 +829,13 @@ static inline void cpu_clone_regs(CPUState *env, target_ulong newsp) |
| 829 | 829 | #include "cpu-all.h" |
| 830 | 830 | |
| 831 | 831 | /*****************************************************************************/ |
| 832 | -/* Registers definitions */ | |
| 832 | +/* CRF definitions */ | |
| 833 | +#define CRF_LT 3 | |
| 834 | +#define CRF_GT 2 | |
| 835 | +#define CRF_EQ 1 | |
| 836 | +#define CRF_SO 0 | |
| 837 | + | |
| 838 | +/* XER definitions */ | |
| 833 | 839 | #define XER_SO 31 |
| 834 | 840 | #define XER_OV 30 |
| 835 | 841 | #define XER_CA 29 | ... | ... |
target-ppc/helper.h
| ... | ... | @@ -2,3 +2,8 @@ |
| 2 | 2 | #define DEF_HELPER(ret, name, params) ret name params; |
| 3 | 3 | #endif |
| 4 | 4 | |
| 5 | +DEF_HELPER(uint32_t, helper_fcmpo, (void)) | |
| 6 | +DEF_HELPER(uint32_t, helper_fcmpu, (void)) | |
| 7 | + | |
| 8 | +DEF_HELPER(uint32_t, helper_load_cr, (void)) | |
| 9 | +DEF_HELPER(void, helper_store_cr, (target_ulong, uint32_t)) | ... | ... |
target-ppc/op.c
| ... | ... | @@ -26,14 +26,6 @@ |
| 26 | 26 | #include "helper_regs.h" |
| 27 | 27 | #include "op_helper.h" |
| 28 | 28 | |
| 29 | -/* PowerPC state maintenance operations */ | |
| 30 | -/* set_Rc0 */ | |
| 31 | -void OPPROTO op_set_Rc0 (void) | |
| 32 | -{ | |
| 33 | - env->crf[0] = T0 | xer_so; | |
| 34 | - RETURN(); | |
| 35 | -} | |
| 36 | - | |
| 37 | 29 | /* Generate exceptions */ |
| 38 | 30 | void OPPROTO op_raise_exception_err (void) |
| 39 | 31 | { |
| ... | ... | @@ -46,18 +38,6 @@ void OPPROTO op_debug (void) |
| 46 | 38 | } |
| 47 | 39 | |
| 48 | 40 | /* Load/store special registers */ |
| 49 | -void OPPROTO op_load_cr (void) | |
| 50 | -{ | |
| 51 | - do_load_cr(); | |
| 52 | - RETURN(); | |
| 53 | -} | |
| 54 | - | |
| 55 | -void OPPROTO op_store_cr (void) | |
| 56 | -{ | |
| 57 | - do_store_cr(PARAM1); | |
| 58 | - RETURN(); | |
| 59 | -} | |
| 60 | - | |
| 61 | 41 | #if defined(TARGET_PPC64) |
| 62 | 42 | void OPPROTO op_store_pri (void) |
| 63 | 43 | { |
| ... | ... | @@ -337,18 +317,6 @@ void OPPROTO op_load_fpscr_FT0 (void) |
| 337 | 317 | RETURN(); |
| 338 | 318 | } |
| 339 | 319 | |
| 340 | -void OPPROTO op_load_fpscr_T0 (void) | |
| 341 | -{ | |
| 342 | - T0 = (env->fpscr >> PARAM1) & 0xF; | |
| 343 | - RETURN(); | |
| 344 | -} | |
| 345 | - | |
| 346 | -void OPPROTO op_load_fpcc (void) | |
| 347 | -{ | |
| 348 | - T0 = fpscr_fpcc; | |
| 349 | - RETURN(); | |
| 350 | -} | |
| 351 | - | |
| 352 | 320 | void OPPROTO op_fpscr_resetbit (void) |
| 353 | 321 | { |
| 354 | 322 | env->fpscr &= PARAM1; |
| ... | ... | @@ -953,132 +921,6 @@ void OPPROTO op_subfzeo_64 (void) |
| 953 | 921 | } |
| 954 | 922 | #endif |
| 955 | 923 | |
| 956 | -/*** Integer comparison ***/ | |
| 957 | -/* compare */ | |
| 958 | -void OPPROTO op_cmp (void) | |
| 959 | -{ | |
| 960 | - if ((int32_t)T0 < (int32_t)T1) { | |
| 961 | - T0 = 0x08; | |
| 962 | - } else if ((int32_t)T0 > (int32_t)T1) { | |
| 963 | - T0 = 0x04; | |
| 964 | - } else { | |
| 965 | - T0 = 0x02; | |
| 966 | - } | |
| 967 | - T0 |= xer_so; | |
| 968 | - RETURN(); | |
| 969 | -} | |
| 970 | - | |
| 971 | -#if defined(TARGET_PPC64) | |
| 972 | -void OPPROTO op_cmp_64 (void) | |
| 973 | -{ | |
| 974 | - if ((int64_t)T0 < (int64_t)T1) { | |
| 975 | - T0 = 0x08; | |
| 976 | - } else if ((int64_t)T0 > (int64_t)T1) { | |
| 977 | - T0 = 0x04; | |
| 978 | - } else { | |
| 979 | - T0 = 0x02; | |
| 980 | - } | |
| 981 | - T0 |= xer_so; | |
| 982 | - RETURN(); | |
| 983 | -} | |
| 984 | -#endif | |
| 985 | - | |
| 986 | -/* compare immediate */ | |
| 987 | -void OPPROTO op_cmpi (void) | |
| 988 | -{ | |
| 989 | - if ((int32_t)T0 < (int32_t)PARAM1) { | |
| 990 | - T0 = 0x08; | |
| 991 | - } else if ((int32_t)T0 > (int32_t)PARAM1) { | |
| 992 | - T0 = 0x04; | |
| 993 | - } else { | |
| 994 | - T0 = 0x02; | |
| 995 | - } | |
| 996 | - T0 |= xer_so; | |
| 997 | - RETURN(); | |
| 998 | -} | |
| 999 | - | |
| 1000 | -#if defined(TARGET_PPC64) | |
| 1001 | -void OPPROTO op_cmpi_64 (void) | |
| 1002 | -{ | |
| 1003 | - if ((int64_t)T0 < (int64_t)((int32_t)PARAM1)) { | |
| 1004 | - T0 = 0x08; | |
| 1005 | - } else if ((int64_t)T0 > (int64_t)((int32_t)PARAM1)) { | |
| 1006 | - T0 = 0x04; | |
| 1007 | - } else { | |
| 1008 | - T0 = 0x02; | |
| 1009 | - } | |
| 1010 | - T0 |= xer_so; | |
| 1011 | - RETURN(); | |
| 1012 | -} | |
| 1013 | -#endif | |
| 1014 | - | |
| 1015 | -/* compare logical */ | |
| 1016 | -void OPPROTO op_cmpl (void) | |
| 1017 | -{ | |
| 1018 | - if ((uint32_t)T0 < (uint32_t)T1) { | |
| 1019 | - T0 = 0x08; | |
| 1020 | - } else if ((uint32_t)T0 > (uint32_t)T1) { | |
| 1021 | - T0 = 0x04; | |
| 1022 | - } else { | |
| 1023 | - T0 = 0x02; | |
| 1024 | - } | |
| 1025 | - T0 |= xer_so; | |
| 1026 | - RETURN(); | |
| 1027 | -} | |
| 1028 | - | |
| 1029 | -#if defined(TARGET_PPC64) | |
| 1030 | -void OPPROTO op_cmpl_64 (void) | |
| 1031 | -{ | |
| 1032 | - if ((uint64_t)T0 < (uint64_t)T1) { | |
| 1033 | - T0 = 0x08; | |
| 1034 | - } else if ((uint64_t)T0 > (uint64_t)T1) { | |
| 1035 | - T0 = 0x04; | |
| 1036 | - } else { | |
| 1037 | - T0 = 0x02; | |
| 1038 | - } | |
| 1039 | - T0 |= xer_so; | |
| 1040 | - RETURN(); | |
| 1041 | -} | |
| 1042 | -#endif | |
| 1043 | - | |
| 1044 | -/* compare logical immediate */ | |
| 1045 | -void OPPROTO op_cmpli (void) | |
| 1046 | -{ | |
| 1047 | - if ((uint32_t)T0 < (uint32_t)PARAM1) { | |
| 1048 | - T0 = 0x08; | |
| 1049 | - } else if ((uint32_t)T0 > (uint32_t)PARAM1) { | |
| 1050 | - T0 = 0x04; | |
| 1051 | - } else { | |
| 1052 | - T0 = 0x02; | |
| 1053 | - } | |
| 1054 | - T0 |= xer_so; | |
| 1055 | - RETURN(); | |
| 1056 | -} | |
| 1057 | - | |
| 1058 | -#if defined(TARGET_PPC64) | |
| 1059 | -void OPPROTO op_cmpli_64 (void) | |
| 1060 | -{ | |
| 1061 | - if ((uint64_t)T0 < (uint64_t)PARAM1) { | |
| 1062 | - T0 = 0x08; | |
| 1063 | - } else if ((uint64_t)T0 > (uint64_t)PARAM1) { | |
| 1064 | - T0 = 0x04; | |
| 1065 | - } else { | |
| 1066 | - T0 = 0x02; | |
| 1067 | - } | |
| 1068 | - T0 |= xer_so; | |
| 1069 | - RETURN(); | |
| 1070 | -} | |
| 1071 | -#endif | |
| 1072 | - | |
| 1073 | -void OPPROTO op_isel (void) | |
| 1074 | -{ | |
| 1075 | - if (T0) | |
| 1076 | - T0 = T1; | |
| 1077 | - else | |
| 1078 | - T0 = T2; | |
| 1079 | - RETURN(); | |
| 1080 | -} | |
| 1081 | - | |
| 1082 | 924 | void OPPROTO op_popcntb (void) |
| 1083 | 925 | { |
| 1084 | 926 | do_popcntb(); |
| ... | ... | @@ -1339,12 +1181,6 @@ void OPPROTO op_sli_T0 (void) |
| 1339 | 1181 | RETURN(); |
| 1340 | 1182 | } |
| 1341 | 1183 | |
| 1342 | -void OPPROTO op_sli_T1 (void) | |
| 1343 | -{ | |
| 1344 | - T1 = T1 << PARAM1; | |
| 1345 | - RETURN(); | |
| 1346 | -} | |
| 1347 | - | |
| 1348 | 1184 | void OPPROTO op_srl_T0_T1 (void) |
| 1349 | 1185 | { |
| 1350 | 1186 | T0 = (uint32_t)T0 >> T1; |
| ... | ... | @@ -1579,21 +1415,6 @@ void OPPROTO op_frim (void) |
| 1579 | 1415 | RETURN(); |
| 1580 | 1416 | } |
| 1581 | 1417 | |
| 1582 | -/*** Floating-Point compare ***/ | |
| 1583 | -/* fcmpu */ | |
| 1584 | -void OPPROTO op_fcmpu (void) | |
| 1585 | -{ | |
| 1586 | - do_fcmpu(); | |
| 1587 | - RETURN(); | |
| 1588 | -} | |
| 1589 | - | |
| 1590 | -/* fcmpo */ | |
| 1591 | -void OPPROTO op_fcmpo (void) | |
| 1592 | -{ | |
| 1593 | - do_fcmpo(); | |
| 1594 | - RETURN(); | |
| 1595 | -} | |
| 1596 | - | |
| 1597 | 1418 | /*** Floating-point move ***/ |
| 1598 | 1419 | /* fabs */ |
| 1599 | 1420 | void OPPROTO op_fabs (void) | ... | ... |
target-ppc/op_helper.c
| ... | ... | @@ -62,25 +62,25 @@ void do_raise_exception (uint32_t exception) |
| 62 | 62 | |
| 63 | 63 | /*****************************************************************************/ |
| 64 | 64 | /* Registers load and stores */ |
| 65 | -void do_load_cr (void) | |
| 65 | +uint32_t helper_load_cr (void) | |
| 66 | 66 | { |
| 67 | - T0 = (env->crf[0] << 28) | | |
| 68 | - (env->crf[1] << 24) | | |
| 69 | - (env->crf[2] << 20) | | |
| 70 | - (env->crf[3] << 16) | | |
| 71 | - (env->crf[4] << 12) | | |
| 72 | - (env->crf[5] << 8) | | |
| 73 | - (env->crf[6] << 4) | | |
| 74 | - (env->crf[7] << 0); | |
| 67 | + return (env->crf[0] << 28) | | |
| 68 | + (env->crf[1] << 24) | | |
| 69 | + (env->crf[2] << 20) | | |
| 70 | + (env->crf[3] << 16) | | |
| 71 | + (env->crf[4] << 12) | | |
| 72 | + (env->crf[5] << 8) | | |
| 73 | + (env->crf[6] << 4) | | |
| 74 | + (env->crf[7] << 0); | |
| 75 | 75 | } |
| 76 | 76 | |
| 77 | -void do_store_cr (uint32_t mask) | |
| 77 | +void helper_store_cr (target_ulong val, uint32_t mask) | |
| 78 | 78 | { |
| 79 | 79 | int i, sh; |
| 80 | 80 | |
| 81 | 81 | for (i = 0, sh = 7; i < 8; i++, sh--) { |
| 82 | 82 | if (mask & (1 << sh)) |
| 83 | - env->crf[i] = (T0 >> (sh * 4)) & 0xFUL; | |
| 83 | + env->crf[i] = (val >> (sh * 4)) & 0xFUL; | |
| 84 | 84 | } |
| 85 | 85 | } |
| 86 | 86 | |
| ... | ... | @@ -1364,27 +1364,32 @@ void do_fsel (void) |
| 1364 | 1364 | FT0 = FT2; |
| 1365 | 1365 | } |
| 1366 | 1366 | |
| 1367 | -void do_fcmpu (void) | |
| 1367 | +uint32_t helper_fcmpu (void) | |
| 1368 | 1368 | { |
| 1369 | + uint32_t ret = 0; | |
| 1370 | + | |
| 1369 | 1371 | if (unlikely(float64_is_signaling_nan(FT0) || |
| 1370 | 1372 | float64_is_signaling_nan(FT1))) { |
| 1371 | 1373 | /* sNaN comparison */ |
| 1372 | 1374 | fload_invalid_op_excp(POWERPC_EXCP_FP_VXSNAN); |
| 1373 | 1375 | } else { |
| 1374 | 1376 | if (float64_lt(FT0, FT1, &env->fp_status)) { |
| 1375 | - T0 = 0x08UL; | |
| 1377 | + ret = 0x08UL; | |
| 1376 | 1378 | } else if (!float64_le(FT0, FT1, &env->fp_status)) { |
| 1377 | - T0 = 0x04UL; | |
| 1379 | + ret = 0x04UL; | |
| 1378 | 1380 | } else { |
| 1379 | - T0 = 0x02UL; | |
| 1381 | + ret = 0x02UL; | |
| 1380 | 1382 | } |
| 1381 | 1383 | } |
| 1382 | 1384 | env->fpscr &= ~(0x0F << FPSCR_FPRF); |
| 1383 | - env->fpscr |= T0 << FPSCR_FPRF; | |
| 1385 | + env->fpscr |= ret << FPSCR_FPRF; | |
| 1386 | + return ret; | |
| 1384 | 1387 | } |
| 1385 | 1388 | |
| 1386 | -void do_fcmpo (void) | |
| 1389 | +uint32_t helper_fcmpo (void) | |
| 1387 | 1390 | { |
| 1391 | + uint32_t ret = 0; | |
| 1392 | + | |
| 1388 | 1393 | if (unlikely(float64_is_nan(FT0) || |
| 1389 | 1394 | float64_is_nan(FT1))) { |
| 1390 | 1395 | if (float64_is_signaling_nan(FT0) || |
| ... | ... | @@ -1398,15 +1403,16 @@ void do_fcmpo (void) |
| 1398 | 1403 | } |
| 1399 | 1404 | } else { |
| 1400 | 1405 | if (float64_lt(FT0, FT1, &env->fp_status)) { |
| 1401 | - T0 = 0x08UL; | |
| 1406 | + ret = 0x08UL; | |
| 1402 | 1407 | } else if (!float64_le(FT0, FT1, &env->fp_status)) { |
| 1403 | - T0 = 0x04UL; | |
| 1408 | + ret = 0x04UL; | |
| 1404 | 1409 | } else { |
| 1405 | - T0 = 0x02UL; | |
| 1410 | + ret = 0x02UL; | |
| 1406 | 1411 | } |
| 1407 | 1412 | } |
| 1408 | 1413 | env->fpscr &= ~(0x0F << FPSCR_FPRF); |
| 1409 | - env->fpscr |= T0 << FPSCR_FPRF; | |
| 1414 | + env->fpscr |= ret << FPSCR_FPRF; | |
| 1415 | + return ret; | |
| 1410 | 1416 | } |
| 1411 | 1417 | |
| 1412 | 1418 | #if !defined (CONFIG_USER_ONLY) | ... | ... |
target-ppc/translate.c
| ... | ... | @@ -63,6 +63,7 @@ static TCGv cpu_nip; |
| 63 | 63 | static TCGv cpu_ctr; |
| 64 | 64 | static TCGv cpu_lr; |
| 65 | 65 | static TCGv cpu_xer; |
| 66 | +static TCGv cpu_fpscr; | |
| 66 | 67 | |
| 67 | 68 | /* dyngen register indexes */ |
| 68 | 69 | static TCGv cpu_T[3]; |
| ... | ... | @@ -179,6 +180,9 @@ void ppc_translate_init(void) |
| 179 | 180 | cpu_xer = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, |
| 180 | 181 | offsetof(CPUState, xer), "xer"); |
| 181 | 182 | |
| 183 | + cpu_fpscr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
| 184 | + offsetof(CPUState, fpscr), "fpscr"); | |
| 185 | + | |
| 182 | 186 | /* register helpers */ |
| 183 | 187 | #undef DEF_HELPER |
| 184 | 188 | #define DEF_HELPER(ret, name, params) tcg_register_helper(name, #name); |
| ... | ... | @@ -230,17 +234,6 @@ struct opc_handler_t { |
| 230 | 234 | #endif |
| 231 | 235 | }; |
| 232 | 236 | |
| 233 | -static always_inline void gen_set_Rc0 (DisasContext *ctx) | |
| 234 | -{ | |
| 235 | -#if defined(TARGET_PPC64) | |
| 236 | - if (ctx->sf_mode) | |
| 237 | - gen_op_cmpi_64(0); | |
| 238 | - else | |
| 239 | -#endif | |
| 240 | - gen_op_cmpi(0); | |
| 241 | - gen_op_set_Rc0(); | |
| 242 | -} | |
| 243 | - | |
| 244 | 237 | static always_inline void gen_reset_fpstatus (void) |
| 245 | 238 | { |
| 246 | 239 | #ifdef CONFIG_SOFTFLOAT |
| ... | ... | @@ -708,6 +701,155 @@ static opc_handler_t invalid_handler = { |
| 708 | 701 | .handler = gen_invalid, |
| 709 | 702 | }; |
| 710 | 703 | |
| 704 | +/*** Integer comparison ***/ | |
| 705 | + | |
| 706 | +static always_inline void gen_op_cmp(TCGv t0, TCGv t1, int s, int crf) | |
| 707 | +{ | |
| 708 | + int l1, l2, l3; | |
| 709 | + | |
| 710 | + tcg_gen_shri_i32(cpu_crf[crf], cpu_xer, XER_SO); | |
| 711 | + tcg_gen_andi_i32(cpu_crf[crf], cpu_crf[crf], 1); | |
| 712 | + | |
| 713 | + l1 = gen_new_label(); | |
| 714 | + l2 = gen_new_label(); | |
| 715 | + l3 = gen_new_label(); | |
| 716 | + if (s) { | |
| 717 | + tcg_gen_brcond_tl(TCG_COND_LT, t0, t1, l1); | |
| 718 | + tcg_gen_brcond_tl(TCG_COND_GT, t0, t1, l2); | |
| 719 | + } else { | |
| 720 | + tcg_gen_brcond_tl(TCG_COND_LTU, t0, t1, l1); | |
| 721 | + tcg_gen_brcond_tl(TCG_COND_GTU, t0, t1, l2); | |
| 722 | + } | |
| 723 | + tcg_gen_ori_i32(cpu_crf[crf], cpu_crf[crf], 1 << CRF_EQ); | |
| 724 | + tcg_gen_br(l3); | |
| 725 | + gen_set_label(l1); | |
| 726 | + tcg_gen_ori_i32(cpu_crf[crf], cpu_crf[crf], 1 << CRF_LT); | |
| 727 | + tcg_gen_br(l3); | |
| 728 | + gen_set_label(l2); | |
| 729 | + tcg_gen_ori_i32(cpu_crf[crf], cpu_crf[crf], 1 << CRF_GT); | |
| 730 | + gen_set_label(l3); | |
| 731 | +} | |
| 732 | + | |
| 733 | +static always_inline void gen_op_cmpi(TCGv t0, target_ulong t1, int s, int crf) | |
| 734 | +{ | |
| 735 | + TCGv temp = tcg_const_local_tl(t1); | |
| 736 | + gen_op_cmp(t0, temp, s, crf); | |
| 737 | + tcg_temp_free(temp); | |
| 738 | +} | |
| 739 | + | |
| 740 | +#if defined(TARGET_PPC64) | |
| 741 | +static always_inline void gen_op_cmp32(TCGv t0, TCGv t1, int s, int crf) | |
| 742 | +{ | |
| 743 | + TCGv t0_32, t1_32; | |
| 744 | + t0_32 = tcg_temp_local_new(TCG_TYPE_TL); | |
| 745 | + t1_32 = tcg_temp_local_new(TCG_TYPE_TL); | |
| 746 | + if (s) { | |
| 747 | + tcg_gen_ext32s_tl(t0_32, t0); | |
| 748 | + tcg_gen_ext32s_tl(t1_32, t1); | |
| 749 | + } else { | |
| 750 | + tcg_gen_ext32u_tl(t0_32, t0); | |
| 751 | + tcg_gen_ext32u_tl(t1_32, t1); | |
| 752 | + } | |
| 753 | + gen_op_cmp(t0_32, t1_32, s, crf); | |
| 754 | + tcg_temp_free(t1_32); | |
| 755 | + tcg_temp_free(t0_32); | |
| 756 | +} | |
| 757 | + | |
| 758 | +static always_inline void gen_op_cmpi32(TCGv t0, target_ulong t1, int s, int crf) | |
| 759 | +{ | |
| 760 | + TCGv temp = tcg_const_local_tl(t1); | |
| 761 | + gen_op_cmp32(t0, temp, s, crf); | |
| 762 | + tcg_temp_free(temp); | |
| 763 | +} | |
| 764 | +#endif | |
| 765 | + | |
| 766 | +static always_inline void gen_set_Rc0 (DisasContext *ctx, TCGv reg) | |
| 767 | +{ | |
| 768 | +#if defined(TARGET_PPC64) | |
| 769 | + if (!(ctx->sf_mode)) | |
| 770 | + gen_op_cmpi32(reg, 0, 1, 0); | |
| 771 | + else | |
| 772 | +#endif | |
| 773 | + gen_op_cmpi(reg, 0, 1, 0); | |
| 774 | +} | |
| 775 | + | |
| 776 | +/* cmp */ | |
| 777 | +GEN_HANDLER(cmp, 0x1F, 0x00, 0x00, 0x00400000, PPC_INTEGER) | |
| 778 | +{ | |
| 779 | +#if defined(TARGET_PPC64) | |
| 780 | + if (!(ctx->sf_mode && (ctx->opcode & 0x00200000))) | |
| 781 | + gen_op_cmp32(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)], | |
| 782 | + 1, crfD(ctx->opcode)); | |
| 783 | + else | |
| 784 | +#endif | |
| 785 | + gen_op_cmp(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)], | |
| 786 | + 1, crfD(ctx->opcode)); | |
| 787 | +} | |
| 788 | + | |
| 789 | +/* cmpi */ | |
| 790 | +GEN_HANDLER(cmpi, 0x0B, 0xFF, 0xFF, 0x00400000, PPC_INTEGER) | |
| 791 | +{ | |
| 792 | +#if defined(TARGET_PPC64) | |
| 793 | + if (!(ctx->sf_mode && (ctx->opcode & 0x00200000))) | |
| 794 | + gen_op_cmpi32(cpu_gpr[rA(ctx->opcode)], SIMM(ctx->opcode), | |
| 795 | + 1, crfD(ctx->opcode)); | |
| 796 | + else | |
| 797 | +#endif | |
| 798 | + gen_op_cmpi(cpu_gpr[rA(ctx->opcode)], SIMM(ctx->opcode), | |
| 799 | + 1, crfD(ctx->opcode)); | |
| 800 | +} | |
| 801 | + | |
| 802 | +/* cmpl */ | |
| 803 | +GEN_HANDLER(cmpl, 0x1F, 0x00, 0x01, 0x00400000, PPC_INTEGER) | |
| 804 | +{ | |
| 805 | +#if defined(TARGET_PPC64) | |
| 806 | + if (!(ctx->sf_mode && (ctx->opcode & 0x00200000))) | |
| 807 | + gen_op_cmp32(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)], | |
| 808 | + 0, crfD(ctx->opcode)); | |
| 809 | + else | |
| 810 | +#endif | |
| 811 | + gen_op_cmp(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)], | |
| 812 | + 0, crfD(ctx->opcode)); | |
| 813 | +} | |
| 814 | + | |
| 815 | +/* cmpli */ | |
| 816 | +GEN_HANDLER(cmpli, 0x0A, 0xFF, 0xFF, 0x00400000, PPC_INTEGER) | |
| 817 | +{ | |
| 818 | +#if defined(TARGET_PPC64) | |
| 819 | + if (!(ctx->sf_mode && (ctx->opcode & 0x00200000))) | |
| 820 | + gen_op_cmpi32(cpu_gpr[rA(ctx->opcode)], UIMM(ctx->opcode), | |
| 821 | + 0, crfD(ctx->opcode)); | |
| 822 | + else | |
| 823 | +#endif | |
| 824 | + gen_op_cmpi(cpu_gpr[rA(ctx->opcode)], UIMM(ctx->opcode), | |
| 825 | + 0, crfD(ctx->opcode)); | |
| 826 | +} | |
| 827 | + | |
| 828 | +/* isel (PowerPC 2.03 specification) */ | |
| 829 | +GEN_HANDLER(isel, 0x1F, 0x0F, 0xFF, 0x00000001, PPC_ISEL) | |
| 830 | +{ | |
| 831 | + int l1, l2; | |
| 832 | + uint32_t bi = rC(ctx->opcode); | |
| 833 | + uint32_t mask; | |
| 834 | + TCGv temp; | |
| 835 | + | |
| 836 | + l1 = gen_new_label(); | |
| 837 | + l2 = gen_new_label(); | |
| 838 | + | |
| 839 | + mask = 1 << (3 - (bi & 0x03)); | |
| 840 | + temp = tcg_temp_new(TCG_TYPE_I32); | |
| 841 | + tcg_gen_andi_i32(temp, cpu_crf[bi >> 2], mask); | |
| 842 | + tcg_gen_brcondi_i32(TCG_COND_EQ, temp, 0, l1); | |
| 843 | + if (rA(ctx->opcode) == 0) | |
| 844 | + tcg_gen_movi_tl(cpu_gpr[rD(ctx->opcode)], 0); | |
| 845 | + else | |
| 846 | + tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)]); | |
| 847 | + tcg_gen_br(l2); | |
| 848 | + gen_set_label(l1); | |
| 849 | + tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]); | |
| 850 | + gen_set_label(l2); | |
| 851 | +} | |
| 852 | + | |
| 711 | 853 | /*** Integer arithmetic ***/ |
| 712 | 854 | #define __GEN_INT_ARITH2(name, opc1, opc2, opc3, inval, type) \ |
| 713 | 855 | GEN_HANDLER(name, opc1, opc2, opc3, inval, type) \ |
| ... | ... | @@ -717,7 +859,7 @@ GEN_HANDLER(name, opc1, opc2, opc3, inval, type) \ |
| 717 | 859 | gen_op_##name(); \ |
| 718 | 860 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); \ |
| 719 | 861 | if (unlikely(Rc(ctx->opcode) != 0)) \ |
| 720 | - gen_set_Rc0(ctx); \ | |
| 862 | + gen_set_Rc0(ctx, cpu_T[0]); \ | |
| 721 | 863 | } |
| 722 | 864 | |
| 723 | 865 | #define __GEN_INT_ARITH2_O(name, opc1, opc2, opc3, inval, type) \ |
| ... | ... | @@ -728,7 +870,7 @@ GEN_HANDLER(name, opc1, opc2, opc3, inval, type) \ |
| 728 | 870 | gen_op_##name(); \ |
| 729 | 871 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); \ |
| 730 | 872 | if (unlikely(Rc(ctx->opcode) != 0)) \ |
| 731 | - gen_set_Rc0(ctx); \ | |
| 873 | + gen_set_Rc0(ctx, cpu_T[0]); \ | |
| 732 | 874 | } |
| 733 | 875 | |
| 734 | 876 | #define __GEN_INT_ARITH1(name, opc1, opc2, opc3, type) \ |
| ... | ... | @@ -738,7 +880,7 @@ GEN_HANDLER(name, opc1, opc2, opc3, 0x0000F800, type) \ |
| 738 | 880 | gen_op_##name(); \ |
| 739 | 881 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); \ |
| 740 | 882 | if (unlikely(Rc(ctx->opcode) != 0)) \ |
| 741 | - gen_set_Rc0(ctx); \ | |
| 883 | + gen_set_Rc0(ctx, cpu_T[0]); \ | |
| 742 | 884 | } |
| 743 | 885 | #define __GEN_INT_ARITH1_O(name, opc1, opc2, opc3, type) \ |
| 744 | 886 | GEN_HANDLER(name, opc1, opc2, opc3, 0x0000F800, type) \ |
| ... | ... | @@ -747,7 +889,7 @@ GEN_HANDLER(name, opc1, opc2, opc3, 0x0000F800, type) \ |
| 747 | 889 | gen_op_##name(); \ |
| 748 | 890 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); \ |
| 749 | 891 | if (unlikely(Rc(ctx->opcode) != 0)) \ |
| 750 | - gen_set_Rc0(ctx); \ | |
| 892 | + gen_set_Rc0(ctx, cpu_T[0]); \ | |
| 751 | 893 | } |
| 752 | 894 | |
| 753 | 895 | /* Two operands arithmetic functions */ |
| ... | ... | @@ -776,7 +918,7 @@ GEN_HANDLER(name, opc1, opc2, opc3, inval, type) \ |
| 776 | 918 | gen_op_##name(); \ |
| 777 | 919 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); \ |
| 778 | 920 | if (unlikely(Rc(ctx->opcode) != 0)) \ |
| 779 | - gen_set_Rc0(ctx); \ | |
| 921 | + gen_set_Rc0(ctx, cpu_T[0]); \ | |
| 780 | 922 | } |
| 781 | 923 | |
| 782 | 924 | #define __GEN_INT_ARITH2_O_64(name, opc1, opc2, opc3, inval, type) \ |
| ... | ... | @@ -790,7 +932,7 @@ GEN_HANDLER(name, opc1, opc2, opc3, inval, type) \ |
| 790 | 932 | gen_op_##name(); \ |
| 791 | 933 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); \ |
| 792 | 934 | if (unlikely(Rc(ctx->opcode) != 0)) \ |
| 793 | - gen_set_Rc0(ctx); \ | |
| 935 | + gen_set_Rc0(ctx, cpu_T[0]); \ | |
| 794 | 936 | } |
| 795 | 937 | |
| 796 | 938 | #define __GEN_INT_ARITH1_64(name, opc1, opc2, opc3, type) \ |
| ... | ... | @@ -803,7 +945,7 @@ GEN_HANDLER(name, opc1, opc2, opc3, 0x0000F800, type) \ |
| 803 | 945 | gen_op_##name(); \ |
| 804 | 946 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); \ |
| 805 | 947 | if (unlikely(Rc(ctx->opcode) != 0)) \ |
| 806 | - gen_set_Rc0(ctx); \ | |
| 948 | + gen_set_Rc0(ctx, cpu_T[0]); \ | |
| 807 | 949 | } |
| 808 | 950 | #define __GEN_INT_ARITH1_O_64(name, opc1, opc2, opc3, type) \ |
| 809 | 951 | GEN_HANDLER(name, opc1, opc2, opc3, 0x0000F800, type) \ |
| ... | ... | @@ -815,7 +957,7 @@ GEN_HANDLER(name, opc1, opc2, opc3, 0x0000F800, type) \ |
| 815 | 957 | gen_op_##name(); \ |
| 816 | 958 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); \ |
| 817 | 959 | if (unlikely(Rc(ctx->opcode) != 0)) \ |
| 818 | - gen_set_Rc0(ctx); \ | |
| 960 | + gen_set_Rc0(ctx, cpu_T[0]); \ | |
| 819 | 961 | } |
| 820 | 962 | |
| 821 | 963 | /* Two operands arithmetic functions */ |
| ... | ... | @@ -1084,7 +1226,7 @@ GEN_HANDLER2(addic_, "addic.", 0x0D, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
| 1084 | 1226 | tcg_gen_andi_i32(cpu_xer, cpu_xer, ~(1 << XER_CA)); |
| 1085 | 1227 | } |
| 1086 | 1228 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); |
| 1087 | - gen_set_Rc0(ctx); | |
| 1229 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 1088 | 1230 | } |
| 1089 | 1231 | /* addis */ |
| 1090 | 1232 | GEN_HANDLER(addis, 0x0F, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
| ... | ... | @@ -1134,78 +1276,6 @@ GEN_INT_ARITH2 (divd, 0x1F, 0x09, 0x0F, PPC_64B); |
| 1134 | 1276 | GEN_INT_ARITH2 (divdu, 0x1F, 0x09, 0x0E, PPC_64B); |
| 1135 | 1277 | #endif |
| 1136 | 1278 | |
| 1137 | -/*** Integer comparison ***/ | |
| 1138 | -#if defined(TARGET_PPC64) | |
| 1139 | -#define GEN_CMP(name, opc, type) \ | |
| 1140 | -GEN_HANDLER(name, 0x1F, 0x00, opc, 0x00400000, type) \ | |
| 1141 | -{ \ | |
| 1142 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rA(ctx->opcode)]); \ | |
| 1143 | - tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rB(ctx->opcode)]); \ | |
| 1144 | - if (ctx->sf_mode && (ctx->opcode & 0x00200000)) \ | |
| 1145 | - gen_op_##name##_64(); \ | |
| 1146 | - else \ | |
| 1147 | - gen_op_##name(); \ | |
| 1148 | - tcg_gen_andi_i32(cpu_crf[crfD(ctx->opcode)], cpu_T[0], 0xf); \ | |
| 1149 | -} | |
| 1150 | -#else | |
| 1151 | -#define GEN_CMP(name, opc, type) \ | |
| 1152 | -GEN_HANDLER(name, 0x1F, 0x00, opc, 0x00400000, type) \ | |
| 1153 | -{ \ | |
| 1154 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rA(ctx->opcode)]); \ | |
| 1155 | - tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rB(ctx->opcode)]); \ | |
| 1156 | - gen_op_##name(); \ | |
| 1157 | - tcg_gen_andi_i32(cpu_crf[crfD(ctx->opcode)], cpu_T[0], 0xf); \ | |
| 1158 | -} | |
| 1159 | -#endif | |
| 1160 | - | |
| 1161 | -/* cmp */ | |
| 1162 | -GEN_CMP(cmp, 0x00, PPC_INTEGER); | |
| 1163 | -/* cmpi */ | |
| 1164 | -GEN_HANDLER(cmpi, 0x0B, 0xFF, 0xFF, 0x00400000, PPC_INTEGER) | |
| 1165 | -{ | |
| 1166 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rA(ctx->opcode)]); | |
| 1167 | -#if defined(TARGET_PPC64) | |
| 1168 | - if (ctx->sf_mode && (ctx->opcode & 0x00200000)) | |
| 1169 | - gen_op_cmpi_64(SIMM(ctx->opcode)); | |
| 1170 | - else | |
| 1171 | -#endif | |
| 1172 | - gen_op_cmpi(SIMM(ctx->opcode)); | |
| 1173 | - tcg_gen_andi_i32(cpu_crf[crfD(ctx->opcode)], cpu_T[0], 0xf); | |
| 1174 | -} | |
| 1175 | -/* cmpl */ | |
| 1176 | -GEN_CMP(cmpl, 0x01, PPC_INTEGER); | |
| 1177 | -/* cmpli */ | |
| 1178 | -GEN_HANDLER(cmpli, 0x0A, 0xFF, 0xFF, 0x00400000, PPC_INTEGER) | |
| 1179 | -{ | |
| 1180 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rA(ctx->opcode)]); | |
| 1181 | -#if defined(TARGET_PPC64) | |
| 1182 | - if (ctx->sf_mode && (ctx->opcode & 0x00200000)) | |
| 1183 | - gen_op_cmpli_64(UIMM(ctx->opcode)); | |
| 1184 | - else | |
| 1185 | -#endif | |
| 1186 | - gen_op_cmpli(UIMM(ctx->opcode)); | |
| 1187 | - tcg_gen_andi_i32(cpu_crf[crfD(ctx->opcode)], cpu_T[0], 0xf); | |
| 1188 | -} | |
| 1189 | - | |
| 1190 | -/* isel (PowerPC 2.03 specification) */ | |
| 1191 | -GEN_HANDLER(isel, 0x1F, 0x0F, 0xFF, 0x00000001, PPC_ISEL) | |
| 1192 | -{ | |
| 1193 | - uint32_t bi = rC(ctx->opcode); | |
| 1194 | - uint32_t mask; | |
| 1195 | - | |
| 1196 | - if (rA(ctx->opcode) == 0) { | |
| 1197 | - tcg_gen_movi_tl(cpu_T[0], 0); | |
| 1198 | - } else { | |
| 1199 | - tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rA(ctx->opcode)]); | |
| 1200 | - } | |
| 1201 | - tcg_gen_mov_tl(cpu_T[2], cpu_gpr[rB(ctx->opcode)]); | |
| 1202 | - mask = 1 << (3 - (bi & 0x03)); | |
| 1203 | - tcg_gen_mov_i32(cpu_T[0], cpu_crf[bi >> 2]); | |
| 1204 | - gen_op_test_true(mask); | |
| 1205 | - gen_op_isel(); | |
| 1206 | - tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); | |
| 1207 | -} | |
| 1208 | - | |
| 1209 | 1279 | /*** Integer logical ***/ |
| 1210 | 1280 | #define __GEN_LOGICAL2(name, opc2, opc3, type) \ |
| 1211 | 1281 | GEN_HANDLER(name, 0x1F, opc2, opc3, 0x00000000, type) \ |
| ... | ... | @@ -1215,7 +1285,7 @@ GEN_HANDLER(name, 0x1F, opc2, opc3, 0x00000000, type) \ |
| 1215 | 1285 | gen_op_##name(); \ |
| 1216 | 1286 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); \ |
| 1217 | 1287 | if (unlikely(Rc(ctx->opcode) != 0)) \ |
| 1218 | - gen_set_Rc0(ctx); \ | |
| 1288 | + gen_set_Rc0(ctx, cpu_T[0]); \ | |
| 1219 | 1289 | } |
| 1220 | 1290 | #define GEN_LOGICAL2(name, opc, type) \ |
| 1221 | 1291 | __GEN_LOGICAL2(name, 0x1C, opc, type) |
| ... | ... | @@ -1227,7 +1297,7 @@ GEN_HANDLER(name, 0x1F, 0x1A, opc, 0x00000000, type) \ |
| 1227 | 1297 | gen_op_##name(); \ |
| 1228 | 1298 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); \ |
| 1229 | 1299 | if (unlikely(Rc(ctx->opcode) != 0)) \ |
| 1230 | - gen_set_Rc0(ctx); \ | |
| 1300 | + gen_set_Rc0(ctx, cpu_T[0]); \ | |
| 1231 | 1301 | } |
| 1232 | 1302 | |
| 1233 | 1303 | /* and & and. */ |
| ... | ... | @@ -1240,7 +1310,7 @@ GEN_HANDLER2(andi_, "andi.", 0x1C, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
| 1240 | 1310 | tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]); |
| 1241 | 1311 | tcg_gen_andi_tl(cpu_T[0], cpu_T[0], UIMM(ctx->opcode)); |
| 1242 | 1312 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 1243 | - gen_set_Rc0(ctx); | |
| 1313 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 1244 | 1314 | } |
| 1245 | 1315 | /* andis. */ |
| 1246 | 1316 | GEN_HANDLER2(andis_, "andis.", 0x1D, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
| ... | ... | @@ -1248,7 +1318,7 @@ GEN_HANDLER2(andis_, "andis.", 0x1D, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
| 1248 | 1318 | tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]); |
| 1249 | 1319 | tcg_gen_andi_tl(cpu_T[0], cpu_T[0], UIMM(ctx->opcode) << 16); |
| 1250 | 1320 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 1251 | - gen_set_Rc0(ctx); | |
| 1321 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 1252 | 1322 | } |
| 1253 | 1323 | |
| 1254 | 1324 | /* cntlzw */ |
| ... | ... | @@ -1281,10 +1351,10 @@ GEN_HANDLER(or, 0x1F, 0x1C, 0x0D, 0x00000000, PPC_INTEGER) |
| 1281 | 1351 | } |
| 1282 | 1352 | tcg_gen_mov_tl(cpu_gpr[ra], cpu_T[0]); |
| 1283 | 1353 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 1284 | - gen_set_Rc0(ctx); | |
| 1354 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 1285 | 1355 | } else if (unlikely(Rc(ctx->opcode) != 0)) { |
| 1286 | 1356 | tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rs]); |
| 1287 | - gen_set_Rc0(ctx); | |
| 1357 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 1288 | 1358 | #if defined(TARGET_PPC64) |
| 1289 | 1359 | } else { |
| 1290 | 1360 | switch (rs) { |
| ... | ... | @@ -1349,7 +1419,7 @@ GEN_HANDLER(xor, 0x1F, 0x1C, 0x09, 0x00000000, PPC_INTEGER) |
| 1349 | 1419 | } |
| 1350 | 1420 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 1351 | 1421 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 1352 | - gen_set_Rc0(ctx); | |
| 1422 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 1353 | 1423 | } |
| 1354 | 1424 | /* ori */ |
| 1355 | 1425 | GEN_HANDLER(ori, 0x18, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
| ... | ... | @@ -1467,7 +1537,7 @@ GEN_HANDLER(rlwimi, 0x14, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
| 1467 | 1537 | do_store: |
| 1468 | 1538 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 1469 | 1539 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 1470 | - gen_set_Rc0(ctx); | |
| 1540 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 1471 | 1541 | } |
| 1472 | 1542 | /* rlwinm & rlwinm. */ |
| 1473 | 1543 | GEN_HANDLER(rlwinm, 0x15, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
| ... | ... | @@ -1505,7 +1575,7 @@ GEN_HANDLER(rlwinm, 0x15, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
| 1505 | 1575 | do_store: |
| 1506 | 1576 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 1507 | 1577 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 1508 | - gen_set_Rc0(ctx); | |
| 1578 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 1509 | 1579 | } |
| 1510 | 1580 | /* rlwnm & rlwnm. */ |
| 1511 | 1581 | GEN_HANDLER(rlwnm, 0x17, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
| ... | ... | @@ -1526,7 +1596,7 @@ GEN_HANDLER(rlwnm, 0x17, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
| 1526 | 1596 | } |
| 1527 | 1597 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 1528 | 1598 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 1529 | - gen_set_Rc0(ctx); | |
| 1599 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 1530 | 1600 | } |
| 1531 | 1601 | |
| 1532 | 1602 | #if defined(TARGET_PPC64) |
| ... | ... | @@ -1588,7 +1658,7 @@ static always_inline void gen_rldinm (DisasContext *ctx, uint32_t mb, |
| 1588 | 1658 | do_store: |
| 1589 | 1659 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 1590 | 1660 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 1591 | - gen_set_Rc0(ctx); | |
| 1661 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 1592 | 1662 | } |
| 1593 | 1663 | /* rldicl - rldicl. */ |
| 1594 | 1664 | static always_inline void gen_rldicl (DisasContext *ctx, int mbn, int shn) |
| ... | ... | @@ -1632,7 +1702,7 @@ static always_inline void gen_rldnm (DisasContext *ctx, uint32_t mb, |
| 1632 | 1702 | } |
| 1633 | 1703 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 1634 | 1704 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 1635 | - gen_set_Rc0(ctx); | |
| 1705 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 1636 | 1706 | } |
| 1637 | 1707 | |
| 1638 | 1708 | /* rldcl - rldcl. */ |
| ... | ... | @@ -1682,7 +1752,7 @@ static always_inline void gen_rldimi (DisasContext *ctx, int mbn, int shn) |
| 1682 | 1752 | do_store: |
| 1683 | 1753 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 1684 | 1754 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 1685 | - gen_set_Rc0(ctx); | |
| 1755 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 1686 | 1756 | } |
| 1687 | 1757 | GEN_PPC64_R4(rldimi, 0x1E, 0x06); |
| 1688 | 1758 | #endif |
| ... | ... | @@ -1709,7 +1779,7 @@ GEN_HANDLER(srawi, 0x1F, 0x18, 0x19, 0x00000000, PPC_INTEGER) |
| 1709 | 1779 | } |
| 1710 | 1780 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 1711 | 1781 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 1712 | - gen_set_Rc0(ctx); | |
| 1782 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 1713 | 1783 | } |
| 1714 | 1784 | /* srw & srw. */ |
| 1715 | 1785 | __GEN_LOGICAL2(srw, 0x18, 0x10, PPC_INTEGER); |
| ... | ... | @@ -1736,7 +1806,7 @@ static always_inline void gen_sradi (DisasContext *ctx, int n) |
| 1736 | 1806 | } |
| 1737 | 1807 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 1738 | 1808 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 1739 | - gen_set_Rc0(ctx); | |
| 1809 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 1740 | 1810 | } |
| 1741 | 1811 | GEN_HANDLER2(sradi0, "sradi", 0x1F, 0x1A, 0x19, 0x00000000, PPC_64B) |
| 1742 | 1812 | { |
| ... | ... | @@ -1947,8 +2017,7 @@ GEN_HANDLER(fcmpo, 0x3F, 0x00, 0x01, 0x00600001, PPC_FLOAT) |
| 1947 | 2017 | tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rA(ctx->opcode)]); |
| 1948 | 2018 | tcg_gen_mov_i64(cpu_FT[1], cpu_fpr[rB(ctx->opcode)]); |
| 1949 | 2019 | gen_reset_fpstatus(); |
| 1950 | - gen_op_fcmpo(); | |
| 1951 | - tcg_gen_andi_i32(cpu_crf[crfD(ctx->opcode)], cpu_T[0], 0xf); | |
| 2020 | + tcg_gen_helper_1_0(helper_fcmpo, cpu_crf[crfD(ctx->opcode)]); | |
| 1952 | 2021 | gen_op_float_check_status(); |
| 1953 | 2022 | } |
| 1954 | 2023 | |
| ... | ... | @@ -1962,8 +2031,7 @@ GEN_HANDLER(fcmpu, 0x3F, 0x00, 0x00, 0x00600001, PPC_FLOAT) |
| 1962 | 2031 | tcg_gen_mov_i64(cpu_FT[0], cpu_fpr[rA(ctx->opcode)]); |
| 1963 | 2032 | tcg_gen_mov_i64(cpu_FT[1], cpu_fpr[rB(ctx->opcode)]); |
| 1964 | 2033 | gen_reset_fpstatus(); |
| 1965 | - gen_op_fcmpu(); | |
| 1966 | - tcg_gen_andi_i32(cpu_crf[crfD(ctx->opcode)], cpu_T[0], 0xf); | |
| 2034 | + tcg_gen_helper_1_0(helper_fcmpu, cpu_crf[crfD(ctx->opcode)]); | |
| 1967 | 2035 | gen_op_float_check_status(); |
| 1968 | 2036 | } |
| 1969 | 2037 | |
| ... | ... | @@ -2004,8 +2072,8 @@ GEN_HANDLER(mcrfs, 0x3F, 0x00, 0x02, 0x0063F801, PPC_FLOAT) |
| 2004 | 2072 | } |
| 2005 | 2073 | gen_optimize_fprf(); |
| 2006 | 2074 | bfa = 4 * (7 - crfS(ctx->opcode)); |
| 2007 | - gen_op_load_fpscr_T0(bfa); | |
| 2008 | - tcg_gen_andi_i32(cpu_crf[crfD(ctx->opcode)], cpu_T[0], 0xf); | |
| 2075 | + tcg_gen_shri_i32(cpu_crf[crfD(ctx->opcode)], cpu_fpscr, bfa); | |
| 2076 | + tcg_gen_andi_i32(cpu_crf[crfD(ctx->opcode)], cpu_crf[crfD(ctx->opcode)], 0xf); | |
| 2009 | 2077 | gen_op_fpscr_resetbit(~(0xF << bfa)); |
| 2010 | 2078 | } |
| 2011 | 2079 | |
| ... | ... | @@ -2038,8 +2106,7 @@ GEN_HANDLER(mtfsb0, 0x3F, 0x06, 0x02, 0x001FF800, PPC_FLOAT) |
| 2038 | 2106 | if (likely(crb != 30 && crb != 29)) |
| 2039 | 2107 | gen_op_fpscr_resetbit(~(1 << crb)); |
| 2040 | 2108 | if (unlikely(Rc(ctx->opcode) != 0)) { |
| 2041 | - gen_op_load_fpcc(); | |
| 2042 | - gen_op_set_Rc0(); | |
| 2109 | + tcg_gen_shri_i32(cpu_crf[1], cpu_fpscr, FPSCR_OX); | |
| 2043 | 2110 | } |
| 2044 | 2111 | } |
| 2045 | 2112 | |
| ... | ... | @@ -2059,8 +2126,7 @@ GEN_HANDLER(mtfsb1, 0x3F, 0x06, 0x01, 0x001FF800, PPC_FLOAT) |
| 2059 | 2126 | if (likely(crb != FPSCR_FEX && crb != FPSCR_VX && crb != FPSCR_NI)) |
| 2060 | 2127 | gen_op_fpscr_setbit(crb); |
| 2061 | 2128 | if (unlikely(Rc(ctx->opcode) != 0)) { |
| 2062 | - gen_op_load_fpcc(); | |
| 2063 | - gen_op_set_Rc0(); | |
| 2129 | + tcg_gen_shri_i32(cpu_crf[1], cpu_fpscr, FPSCR_OX); | |
| 2064 | 2130 | } |
| 2065 | 2131 | /* We can raise a differed exception */ |
| 2066 | 2132 | gen_op_float_check_status(); |
| ... | ... | @@ -2078,8 +2144,7 @@ GEN_HANDLER(mtfsf, 0x3F, 0x07, 0x16, 0x02010000, PPC_FLOAT) |
| 2078 | 2144 | gen_reset_fpstatus(); |
| 2079 | 2145 | gen_op_store_fpscr(FM(ctx->opcode)); |
| 2080 | 2146 | if (unlikely(Rc(ctx->opcode) != 0)) { |
| 2081 | - gen_op_load_fpcc(); | |
| 2082 | - gen_op_set_Rc0(); | |
| 2147 | + tcg_gen_shri_i32(cpu_crf[1], cpu_fpscr, FPSCR_OX); | |
| 2083 | 2148 | } |
| 2084 | 2149 | /* We can raise a differed exception */ |
| 2085 | 2150 | gen_op_float_check_status(); |
| ... | ... | @@ -2101,8 +2166,7 @@ GEN_HANDLER(mtfsfi, 0x3F, 0x06, 0x04, 0x006f0800, PPC_FLOAT) |
| 2101 | 2166 | gen_reset_fpstatus(); |
| 2102 | 2167 | gen_op_store_fpscr(1 << sh); |
| 2103 | 2168 | if (unlikely(Rc(ctx->opcode) != 0)) { |
| 2104 | - gen_op_load_fpcc(); | |
| 2105 | - gen_op_set_Rc0(); | |
| 2169 | + tcg_gen_shri_i32(cpu_crf[1], cpu_fpscr, FPSCR_OX); | |
| 2106 | 2170 | } |
| 2107 | 2171 | /* We can raise a differed exception */ |
| 2108 | 2172 | gen_op_float_check_status(); |
| ... | ... | @@ -3356,47 +3420,53 @@ GEN_HANDLER(bclr, 0x13, 0x10, 0x00, 0x00000000, PPC_FLOW) |
| 3356 | 3420 | } |
| 3357 | 3421 | |
| 3358 | 3422 | /*** Condition register logical ***/ |
| 3359 | -#define GEN_CRLOGIC(op, opc) \ | |
| 3360 | -GEN_HANDLER(cr##op, 0x13, 0x01, opc, 0x00000001, PPC_INTEGER) \ | |
| 3423 | +#define GEN_CRLOGIC(name, tcg_op, opc) \ | |
| 3424 | +GEN_HANDLER(name, 0x13, 0x01, opc, 0x00000001, PPC_INTEGER) \ | |
| 3361 | 3425 | { \ |
| 3362 | 3426 | uint8_t bitmask; \ |
| 3363 | 3427 | int sh; \ |
| 3364 | - tcg_gen_mov_i32(cpu_T[0], cpu_crf[crbA(ctx->opcode) >> 2]); \ | |
| 3428 | + TCGv temp1, temp2; \ | |
| 3365 | 3429 | sh = (crbD(ctx->opcode) & 0x03) - (crbA(ctx->opcode) & 0x03); \ |
| 3430 | + temp1 = tcg_temp_new(TCG_TYPE_I32); \ | |
| 3366 | 3431 | if (sh > 0) \ |
| 3367 | - gen_op_srli_T0(sh); \ | |
| 3432 | + tcg_gen_shri_i32(temp1, cpu_crf[crbA(ctx->opcode) >> 2], sh); \ | |
| 3368 | 3433 | else if (sh < 0) \ |
| 3369 | - gen_op_sli_T0(-sh); \ | |
| 3370 | - tcg_gen_mov_i32(cpu_T[1], cpu_crf[crbB(ctx->opcode) >> 2]); \ | |
| 3434 | + tcg_gen_shli_i32(temp1, cpu_crf[crbA(ctx->opcode) >> 2], -sh); \ | |
| 3435 | + else \ | |
| 3436 | + tcg_gen_mov_i32(temp1, cpu_crf[crbB(ctx->opcode) >> 2]); \ | |
| 3437 | + temp2 = tcg_temp_new(TCG_TYPE_I32); \ | |
| 3371 | 3438 | sh = (crbD(ctx->opcode) & 0x03) - (crbB(ctx->opcode) & 0x03); \ |
| 3372 | 3439 | if (sh > 0) \ |
| 3373 | - gen_op_srli_T1(sh); \ | |
| 3440 | + tcg_gen_shri_i32(temp2, cpu_crf[crbB(ctx->opcode) >> 2], sh); \ | |
| 3374 | 3441 | else if (sh < 0) \ |
| 3375 | - gen_op_sli_T1(-sh); \ | |
| 3376 | - gen_op_##op(); \ | |
| 3442 | + tcg_gen_shli_i32(temp2, cpu_crf[crbB(ctx->opcode) >> 2], -sh); \ | |
| 3443 | + else \ | |
| 3444 | + tcg_gen_mov_i32(temp2, cpu_crf[crbB(ctx->opcode) >> 2]); \ | |
| 3445 | + tcg_op(temp1, temp1, temp2); \ | |
| 3377 | 3446 | bitmask = 1 << (3 - (crbD(ctx->opcode) & 0x03)); \ |
| 3378 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], bitmask); \ | |
| 3379 | - tcg_gen_andi_i32(cpu_T[1], cpu_crf[crbD(ctx->opcode) >> 2], ~bitmask); \ | |
| 3380 | - gen_op_or(); \ | |
| 3381 | - tcg_gen_andi_i32(cpu_crf[crbD(ctx->opcode) >> 2], cpu_T[0], 0xf); \ | |
| 3447 | + tcg_gen_andi_i32(temp1, temp1, bitmask); \ | |
| 3448 | + tcg_gen_andi_i32(temp2, cpu_crf[crbD(ctx->opcode) >> 2], ~bitmask); \ | |
| 3449 | + tcg_gen_or_i32(cpu_crf[crbD(ctx->opcode) >> 2], temp1, temp2); \ | |
| 3450 | + tcg_temp_free(temp1); \ | |
| 3451 | + tcg_temp_free(temp2); \ | |
| 3382 | 3452 | } |
| 3383 | 3453 | |
| 3384 | 3454 | /* crand */ |
| 3385 | -GEN_CRLOGIC(and, 0x08); | |
| 3455 | +GEN_CRLOGIC(crand, tcg_gen_and_i32, 0x08); | |
| 3386 | 3456 | /* crandc */ |
| 3387 | -GEN_CRLOGIC(andc, 0x04); | |
| 3457 | +GEN_CRLOGIC(crandc, tcg_gen_andc_i32, 0x04); | |
| 3388 | 3458 | /* creqv */ |
| 3389 | -GEN_CRLOGIC(eqv, 0x09); | |
| 3459 | +GEN_CRLOGIC(creqv, tcg_gen_eqv_i32, 0x09); | |
| 3390 | 3460 | /* crnand */ |
| 3391 | -GEN_CRLOGIC(nand, 0x07); | |
| 3461 | +GEN_CRLOGIC(crnand, tcg_gen_nand_i32, 0x07); | |
| 3392 | 3462 | /* crnor */ |
| 3393 | -GEN_CRLOGIC(nor, 0x01); | |
| 3463 | +GEN_CRLOGIC(crnor, tcg_gen_nor_i32, 0x01); | |
| 3394 | 3464 | /* cror */ |
| 3395 | -GEN_CRLOGIC(or, 0x0E); | |
| 3465 | +GEN_CRLOGIC(cror, tcg_gen_or_i32, 0x0E); | |
| 3396 | 3466 | /* crorc */ |
| 3397 | -GEN_CRLOGIC(orc, 0x0D); | |
| 3467 | +GEN_CRLOGIC(crorc, tcg_gen_orc_i32, 0x0D); | |
| 3398 | 3468 | /* crxor */ |
| 3399 | -GEN_CRLOGIC(xor, 0x06); | |
| 3469 | +GEN_CRLOGIC(crxor, tcg_gen_xor_i32, 0x06); | |
| 3400 | 3470 | /* mcrf */ |
| 3401 | 3471 | GEN_HANDLER(mcrf, 0x13, 0x00, 0xFF, 0x00000001, PPC_INTEGER) |
| 3402 | 3472 | { |
| ... | ... | @@ -3527,12 +3597,11 @@ GEN_HANDLER(mfcr, 0x1F, 0x13, 0x00, 0x00000801, PPC_MISC) |
| 3527 | 3597 | crm = CRM(ctx->opcode); |
| 3528 | 3598 | if (likely((crm ^ (crm - 1)) == 0)) { |
| 3529 | 3599 | crn = ffs(crm); |
| 3530 | - tcg_gen_mov_i32(cpu_T[0], cpu_crf[7 - crn]); | |
| 3600 | + tcg_gen_extu_i32_tl(cpu_gpr[rD(ctx->opcode)], cpu_crf[7 - crn]); | |
| 3531 | 3601 | } |
| 3532 | 3602 | } else { |
| 3533 | - gen_op_load_cr(); | |
| 3603 | + tcg_gen_helper_1_0(helper_load_cr, cpu_gpr[rD(ctx->opcode)]); | |
| 3534 | 3604 | } |
| 3535 | - tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); | |
| 3536 | 3605 | } |
| 3537 | 3606 | |
| 3538 | 3607 | /* mfmsr */ |
| ... | ... | @@ -3624,14 +3693,15 @@ GEN_HANDLER(mtcrf, 0x1F, 0x10, 0x04, 0x00000801, PPC_MISC) |
| 3624 | 3693 | { |
| 3625 | 3694 | uint32_t crm, crn; |
| 3626 | 3695 | |
| 3627 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]); | |
| 3628 | 3696 | crm = CRM(ctx->opcode); |
| 3629 | 3697 | if (likely((ctx->opcode & 0x00100000) || (crm ^ (crm - 1)) == 0)) { |
| 3630 | 3698 | crn = ffs(crm); |
| 3631 | - gen_op_srli_T0(crn * 4); | |
| 3632 | - tcg_gen_andi_i32(cpu_crf[7 - crn], cpu_T[0], 0xf); | |
| 3699 | + tcg_gen_shri_i32(cpu_crf[7 - crn], cpu_gpr[rS(ctx->opcode)], crn * 4); | |
| 3700 | + tcg_gen_andi_i32(cpu_crf[7 - crn], cpu_crf[7 - crn], 0xf); | |
| 3633 | 3701 | } else { |
| 3634 | - gen_op_store_cr(crm); | |
| 3702 | + TCGv temp = tcg_const_tl(crm); | |
| 3703 | + tcg_gen_helper_0_2(helper_store_cr, cpu_gpr[rS(ctx->opcode)], temp); | |
| 3704 | + tcg_temp_free(temp); | |
| 3635 | 3705 | } |
| 3636 | 3706 | } |
| 3637 | 3707 | |
| ... | ... | @@ -4183,7 +4253,7 @@ GEN_HANDLER(abs, 0x1F, 0x08, 0x0B, 0x0000F800, PPC_POWER_BR) |
| 4183 | 4253 | gen_op_POWER_abs(); |
| 4184 | 4254 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); |
| 4185 | 4255 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4186 | - gen_set_Rc0(ctx); | |
| 4256 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4187 | 4257 | } |
| 4188 | 4258 | |
| 4189 | 4259 | /* abso - abso. */ |
| ... | ... | @@ -4193,7 +4263,7 @@ GEN_HANDLER(abso, 0x1F, 0x08, 0x1B, 0x0000F800, PPC_POWER_BR) |
| 4193 | 4263 | gen_op_POWER_abso(); |
| 4194 | 4264 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); |
| 4195 | 4265 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4196 | - gen_set_Rc0(ctx); | |
| 4266 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4197 | 4267 | } |
| 4198 | 4268 | |
| 4199 | 4269 | /* clcs */ |
| ... | ... | @@ -4213,7 +4283,7 @@ GEN_HANDLER(div, 0x1F, 0x0B, 0x0A, 0x00000000, PPC_POWER_BR) |
| 4213 | 4283 | gen_op_POWER_div(); |
| 4214 | 4284 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); |
| 4215 | 4285 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4216 | - gen_set_Rc0(ctx); | |
| 4286 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4217 | 4287 | } |
| 4218 | 4288 | |
| 4219 | 4289 | /* divo - divo. */ |
| ... | ... | @@ -4224,7 +4294,7 @@ GEN_HANDLER(divo, 0x1F, 0x0B, 0x1A, 0x00000000, PPC_POWER_BR) |
| 4224 | 4294 | gen_op_POWER_divo(); |
| 4225 | 4295 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); |
| 4226 | 4296 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4227 | - gen_set_Rc0(ctx); | |
| 4297 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4228 | 4298 | } |
| 4229 | 4299 | |
| 4230 | 4300 | /* divs - divs. */ |
| ... | ... | @@ -4235,7 +4305,7 @@ GEN_HANDLER(divs, 0x1F, 0x0B, 0x0B, 0x00000000, PPC_POWER_BR) |
| 4235 | 4305 | gen_op_POWER_divs(); |
| 4236 | 4306 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); |
| 4237 | 4307 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4238 | - gen_set_Rc0(ctx); | |
| 4308 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4239 | 4309 | } |
| 4240 | 4310 | |
| 4241 | 4311 | /* divso - divso. */ |
| ... | ... | @@ -4246,7 +4316,7 @@ GEN_HANDLER(divso, 0x1F, 0x0B, 0x1B, 0x00000000, PPC_POWER_BR) |
| 4246 | 4316 | gen_op_POWER_divso(); |
| 4247 | 4317 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); |
| 4248 | 4318 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4249 | - gen_set_Rc0(ctx); | |
| 4319 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4250 | 4320 | } |
| 4251 | 4321 | |
| 4252 | 4322 | /* doz - doz. */ |
| ... | ... | @@ -4257,7 +4327,7 @@ GEN_HANDLER(doz, 0x1F, 0x08, 0x08, 0x00000000, PPC_POWER_BR) |
| 4257 | 4327 | gen_op_POWER_doz(); |
| 4258 | 4328 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); |
| 4259 | 4329 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4260 | - gen_set_Rc0(ctx); | |
| 4330 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4261 | 4331 | } |
| 4262 | 4332 | |
| 4263 | 4333 | /* dozo - dozo. */ |
| ... | ... | @@ -4268,7 +4338,7 @@ GEN_HANDLER(dozo, 0x1F, 0x08, 0x18, 0x00000000, PPC_POWER_BR) |
| 4268 | 4338 | gen_op_POWER_dozo(); |
| 4269 | 4339 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); |
| 4270 | 4340 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4271 | - gen_set_Rc0(ctx); | |
| 4341 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4272 | 4342 | } |
| 4273 | 4343 | |
| 4274 | 4344 | /* dozi */ |
| ... | ... | @@ -4320,7 +4390,7 @@ GEN_HANDLER(lscbx, 0x1F, 0x15, 0x08, 0x00000000, PPC_POWER_BR) |
| 4320 | 4390 | tcg_gen_andi_tl(cpu_xer, cpu_xer, ~0x7F); |
| 4321 | 4391 | tcg_gen_or_tl(cpu_xer, cpu_xer, cpu_T[0]); |
| 4322 | 4392 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4323 | - gen_set_Rc0(ctx); | |
| 4393 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4324 | 4394 | } |
| 4325 | 4395 | |
| 4326 | 4396 | /* maskg - maskg. */ |
| ... | ... | @@ -4331,7 +4401,7 @@ GEN_HANDLER(maskg, 0x1F, 0x1D, 0x00, 0x00000000, PPC_POWER_BR) |
| 4331 | 4401 | gen_op_POWER_maskg(); |
| 4332 | 4402 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4333 | 4403 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4334 | - gen_set_Rc0(ctx); | |
| 4404 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4335 | 4405 | } |
| 4336 | 4406 | |
| 4337 | 4407 | /* maskir - maskir. */ |
| ... | ... | @@ -4343,7 +4413,7 @@ GEN_HANDLER(maskir, 0x1F, 0x1D, 0x10, 0x00000000, PPC_POWER_BR) |
| 4343 | 4413 | gen_op_POWER_maskir(); |
| 4344 | 4414 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4345 | 4415 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4346 | - gen_set_Rc0(ctx); | |
| 4416 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4347 | 4417 | } |
| 4348 | 4418 | |
| 4349 | 4419 | /* mul - mul. */ |
| ... | ... | @@ -4354,7 +4424,7 @@ GEN_HANDLER(mul, 0x1F, 0x0B, 0x03, 0x00000000, PPC_POWER_BR) |
| 4354 | 4424 | gen_op_POWER_mul(); |
| 4355 | 4425 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); |
| 4356 | 4426 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4357 | - gen_set_Rc0(ctx); | |
| 4427 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4358 | 4428 | } |
| 4359 | 4429 | |
| 4360 | 4430 | /* mulo - mulo. */ |
| ... | ... | @@ -4365,7 +4435,7 @@ GEN_HANDLER(mulo, 0x1F, 0x0B, 0x13, 0x00000000, PPC_POWER_BR) |
| 4365 | 4435 | gen_op_POWER_mulo(); |
| 4366 | 4436 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); |
| 4367 | 4437 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4368 | - gen_set_Rc0(ctx); | |
| 4438 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4369 | 4439 | } |
| 4370 | 4440 | |
| 4371 | 4441 | /* nabs - nabs. */ |
| ... | ... | @@ -4375,7 +4445,7 @@ GEN_HANDLER(nabs, 0x1F, 0x08, 0x0F, 0x00000000, PPC_POWER_BR) |
| 4375 | 4445 | gen_op_POWER_nabs(); |
| 4376 | 4446 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); |
| 4377 | 4447 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4378 | - gen_set_Rc0(ctx); | |
| 4448 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4379 | 4449 | } |
| 4380 | 4450 | |
| 4381 | 4451 | /* nabso - nabso. */ |
| ... | ... | @@ -4385,7 +4455,7 @@ GEN_HANDLER(nabso, 0x1F, 0x08, 0x1F, 0x00000000, PPC_POWER_BR) |
| 4385 | 4455 | gen_op_POWER_nabso(); |
| 4386 | 4456 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); |
| 4387 | 4457 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4388 | - gen_set_Rc0(ctx); | |
| 4458 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4389 | 4459 | } |
| 4390 | 4460 | |
| 4391 | 4461 | /* rlmi - rlmi. */ |
| ... | ... | @@ -4401,7 +4471,7 @@ GEN_HANDLER(rlmi, 0x16, 0xFF, 0xFF, 0x00000000, PPC_POWER_BR) |
| 4401 | 4471 | gen_op_POWER_rlmi(MASK(mb, me), ~MASK(mb, me)); |
| 4402 | 4472 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4403 | 4473 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4404 | - gen_set_Rc0(ctx); | |
| 4474 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4405 | 4475 | } |
| 4406 | 4476 | |
| 4407 | 4477 | /* rrib - rrib. */ |
| ... | ... | @@ -4413,7 +4483,7 @@ GEN_HANDLER(rrib, 0x1F, 0x19, 0x10, 0x00000000, PPC_POWER_BR) |
| 4413 | 4483 | gen_op_POWER_rrib(); |
| 4414 | 4484 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4415 | 4485 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4416 | - gen_set_Rc0(ctx); | |
| 4486 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4417 | 4487 | } |
| 4418 | 4488 | |
| 4419 | 4489 | /* sle - sle. */ |
| ... | ... | @@ -4424,7 +4494,7 @@ GEN_HANDLER(sle, 0x1F, 0x19, 0x04, 0x00000000, PPC_POWER_BR) |
| 4424 | 4494 | gen_op_POWER_sle(); |
| 4425 | 4495 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4426 | 4496 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4427 | - gen_set_Rc0(ctx); | |
| 4497 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4428 | 4498 | } |
| 4429 | 4499 | |
| 4430 | 4500 | /* sleq - sleq. */ |
| ... | ... | @@ -4435,7 +4505,7 @@ GEN_HANDLER(sleq, 0x1F, 0x19, 0x06, 0x00000000, PPC_POWER_BR) |
| 4435 | 4505 | gen_op_POWER_sleq(); |
| 4436 | 4506 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4437 | 4507 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4438 | - gen_set_Rc0(ctx); | |
| 4508 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4439 | 4509 | } |
| 4440 | 4510 | |
| 4441 | 4511 | /* sliq - sliq. */ |
| ... | ... | @@ -4446,7 +4516,7 @@ GEN_HANDLER(sliq, 0x1F, 0x18, 0x05, 0x00000000, PPC_POWER_BR) |
| 4446 | 4516 | gen_op_POWER_sle(); |
| 4447 | 4517 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4448 | 4518 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4449 | - gen_set_Rc0(ctx); | |
| 4519 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4450 | 4520 | } |
| 4451 | 4521 | |
| 4452 | 4522 | /* slliq - slliq. */ |
| ... | ... | @@ -4457,7 +4527,7 @@ GEN_HANDLER(slliq, 0x1F, 0x18, 0x07, 0x00000000, PPC_POWER_BR) |
| 4457 | 4527 | gen_op_POWER_sleq(); |
| 4458 | 4528 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4459 | 4529 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4460 | - gen_set_Rc0(ctx); | |
| 4530 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4461 | 4531 | } |
| 4462 | 4532 | |
| 4463 | 4533 | /* sllq - sllq. */ |
| ... | ... | @@ -4468,7 +4538,7 @@ GEN_HANDLER(sllq, 0x1F, 0x18, 0x06, 0x00000000, PPC_POWER_BR) |
| 4468 | 4538 | gen_op_POWER_sllq(); |
| 4469 | 4539 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4470 | 4540 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4471 | - gen_set_Rc0(ctx); | |
| 4541 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4472 | 4542 | } |
| 4473 | 4543 | |
| 4474 | 4544 | /* slq - slq. */ |
| ... | ... | @@ -4479,7 +4549,7 @@ GEN_HANDLER(slq, 0x1F, 0x18, 0x04, 0x00000000, PPC_POWER_BR) |
| 4479 | 4549 | gen_op_POWER_slq(); |
| 4480 | 4550 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4481 | 4551 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4482 | - gen_set_Rc0(ctx); | |
| 4552 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4483 | 4553 | } |
| 4484 | 4554 | |
| 4485 | 4555 | /* sraiq - sraiq. */ |
| ... | ... | @@ -4490,7 +4560,7 @@ GEN_HANDLER(sraiq, 0x1F, 0x18, 0x1D, 0x00000000, PPC_POWER_BR) |
| 4490 | 4560 | gen_op_POWER_sraq(); |
| 4491 | 4561 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4492 | 4562 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4493 | - gen_set_Rc0(ctx); | |
| 4563 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4494 | 4564 | } |
| 4495 | 4565 | |
| 4496 | 4566 | /* sraq - sraq. */ |
| ... | ... | @@ -4501,7 +4571,7 @@ GEN_HANDLER(sraq, 0x1F, 0x18, 0x1C, 0x00000000, PPC_POWER_BR) |
| 4501 | 4571 | gen_op_POWER_sraq(); |
| 4502 | 4572 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4503 | 4573 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4504 | - gen_set_Rc0(ctx); | |
| 4574 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4505 | 4575 | } |
| 4506 | 4576 | |
| 4507 | 4577 | /* sre - sre. */ |
| ... | ... | @@ -4512,7 +4582,7 @@ GEN_HANDLER(sre, 0x1F, 0x19, 0x14, 0x00000000, PPC_POWER_BR) |
| 4512 | 4582 | gen_op_POWER_sre(); |
| 4513 | 4583 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4514 | 4584 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4515 | - gen_set_Rc0(ctx); | |
| 4585 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4516 | 4586 | } |
| 4517 | 4587 | |
| 4518 | 4588 | /* srea - srea. */ |
| ... | ... | @@ -4523,7 +4593,7 @@ GEN_HANDLER(srea, 0x1F, 0x19, 0x1C, 0x00000000, PPC_POWER_BR) |
| 4523 | 4593 | gen_op_POWER_srea(); |
| 4524 | 4594 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4525 | 4595 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4526 | - gen_set_Rc0(ctx); | |
| 4596 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4527 | 4597 | } |
| 4528 | 4598 | |
| 4529 | 4599 | /* sreq */ |
| ... | ... | @@ -4534,7 +4604,7 @@ GEN_HANDLER(sreq, 0x1F, 0x19, 0x16, 0x00000000, PPC_POWER_BR) |
| 4534 | 4604 | gen_op_POWER_sreq(); |
| 4535 | 4605 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4536 | 4606 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4537 | - gen_set_Rc0(ctx); | |
| 4607 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4538 | 4608 | } |
| 4539 | 4609 | |
| 4540 | 4610 | /* sriq */ |
| ... | ... | @@ -4545,7 +4615,7 @@ GEN_HANDLER(sriq, 0x1F, 0x18, 0x15, 0x00000000, PPC_POWER_BR) |
| 4545 | 4615 | gen_op_POWER_srq(); |
| 4546 | 4616 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4547 | 4617 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4548 | - gen_set_Rc0(ctx); | |
| 4618 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4549 | 4619 | } |
| 4550 | 4620 | |
| 4551 | 4621 | /* srliq */ |
| ... | ... | @@ -4557,7 +4627,7 @@ GEN_HANDLER(srliq, 0x1F, 0x18, 0x17, 0x00000000, PPC_POWER_BR) |
| 4557 | 4627 | gen_op_POWER_srlq(); |
| 4558 | 4628 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4559 | 4629 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4560 | - gen_set_Rc0(ctx); | |
| 4630 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4561 | 4631 | } |
| 4562 | 4632 | |
| 4563 | 4633 | /* srlq */ |
| ... | ... | @@ -4568,7 +4638,7 @@ GEN_HANDLER(srlq, 0x1F, 0x18, 0x16, 0x00000000, PPC_POWER_BR) |
| 4568 | 4638 | gen_op_POWER_srlq(); |
| 4569 | 4639 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4570 | 4640 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4571 | - gen_set_Rc0(ctx); | |
| 4641 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4572 | 4642 | } |
| 4573 | 4643 | |
| 4574 | 4644 | /* srq */ |
| ... | ... | @@ -4579,7 +4649,7 @@ GEN_HANDLER(srq, 0x1F, 0x18, 0x14, 0x00000000, PPC_POWER_BR) |
| 4579 | 4649 | gen_op_POWER_srq(); |
| 4580 | 4650 | tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]); |
| 4581 | 4651 | if (unlikely(Rc(ctx->opcode) != 0)) |
| 4582 | - gen_set_Rc0(ctx); | |
| 4652 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4583 | 4653 | } |
| 4584 | 4654 | |
| 4585 | 4655 | /* PowerPC 602 specific instructions */ |
| ... | ... | @@ -4992,7 +5062,7 @@ static always_inline void gen_405_mulladd_insn (DisasContext *ctx, |
| 4992 | 5062 | tcg_gen_mov_tl(cpu_gpr[rt], cpu_T[0]); |
| 4993 | 5063 | if (unlikely(Rc) != 0) { |
| 4994 | 5064 | /* Update Rc0 */ |
| 4995 | - gen_set_Rc0(ctx); | |
| 5065 | + gen_set_Rc0(ctx, cpu_T[0]); | |
| 4996 | 5066 | } |
| 4997 | 5067 | } |
| 4998 | 5068 | ... | ... |