2012
2013
/*** Integer rotate ***/
2014
2015
-/* rlwimi & rlwimi. */
2016
-static void gen_rlwimi(DisasContext *ctx)
2017
-{
2018
- TCGv t_ra = cpu_gpr[rA(ctx->opcode)];
2019
- TCGv t_rs = cpu_gpr[rS(ctx->opcode)];
2020
- uint32_t sh = SH(ctx->opcode);
2021
- uint32_t mb = MB(ctx->opcode);
2022
- uint32_t me = ME(ctx->opcode);
2023
-
2024
- if (sh == (31 - me) && mb <= me) {
2025
- tcg_gen_deposit_tl(t_ra, t_ra, t_rs, sh, me - mb + 1);
2026
- } else {
2027
- target_ulong mask;
2028
- bool mask_in_32b = true;
2029
- TCGv t1;
2030
-
2031
-#if defined(TARGET_PPC64)
2032
- mb += 32;
2033
- me += 32;
2034
-#endif
2035
- mask = MASK(mb, me);
2036
-
2037
-#if defined(TARGET_PPC64)
2038
- if (mask > 0xffffffffu) {
2039
- mask_in_32b = false;
2040
- }
2041
-#endif
2042
- t1 = tcg_temp_new();
2043
- if (mask_in_32b) {
2044
- TCGv_i32 t0 = tcg_temp_new_i32();
2045
- tcg_gen_trunc_tl_i32(t0, t_rs);
2046
- tcg_gen_rotli_i32(t0, t0, sh);
2047
- tcg_gen_extu_i32_tl(t1, t0);
2048
- } else {
2049
-#if defined(TARGET_PPC64)
2050
- tcg_gen_deposit_i64(t1, t_rs, t_rs, 32, 32);
2051
- tcg_gen_rotli_i64(t1, t1, sh);
2052
-#else
2053
- g_assert_not_reached();
2054
-#endif
2055
- }
2056
-
2057
- tcg_gen_andi_tl(t1, t1, mask);
2058
- tcg_gen_andi_tl(t_ra, t_ra, ~mask);
2059
- tcg_gen_or_tl(t_ra, t_ra, t1);
2060
- }
2061
- if (unlikely(Rc(ctx->opcode) != 0)) {
2062
- gen_set_Rc0(ctx, t_ra);
2063
- }
2064
-}
2065
-
2066
-/* rlwinm & rlwinm. */
2067
-static void gen_rlwinm(DisasContext *ctx)
2068
-{
2069
- TCGv t_ra = cpu_gpr[rA(ctx->opcode)];
2070
- TCGv t_rs = cpu_gpr[rS(ctx->opcode)];
2071
- int sh = SH(ctx->opcode);
2072
- int mb = MB(ctx->opcode);
2073
- int me = ME(ctx->opcode);
2074
- int len = me - mb + 1;
2075
- int rsh = (32 - sh) & 31;
2076
-
2077
- if (sh != 0 && len > 0 && me == (31 - sh)) {
2078
- tcg_gen_deposit_z_tl(t_ra, t_rs, sh, len);
2079
- } else if (me == 31 && rsh + len <= 32) {
2080
- tcg_gen_extract_tl(t_ra, t_rs, rsh, len);
2081
- } else {
2082
- target_ulong mask;
2083
- bool mask_in_32b = true;
2084
-#if defined(TARGET_PPC64)
2085
- mb += 32;
2086
- me += 32;
2087
-#endif
2088
- mask = MASK(mb, me);
2089
-#if defined(TARGET_PPC64)
2090
- if (mask > 0xffffffffu) {
2091
- mask_in_32b = false;
2092
- }
2093
-#endif
2094
- if (mask_in_32b) {
2095
- if (sh == 0) {
2096
- tcg_gen_andi_tl(t_ra, t_rs, mask);
2097
- } else {
2098
- TCGv_i32 t0 = tcg_temp_new_i32();
2099
- tcg_gen_trunc_tl_i32(t0, t_rs);
2100
- tcg_gen_rotli_i32(t0, t0, sh);
2101
- tcg_gen_andi_i32(t0, t0, mask);
2102
- tcg_gen_extu_i32_tl(t_ra, t0);
2103
- }
2104
- } else {
2105
-#if defined(TARGET_PPC64)
2106
- tcg_gen_deposit_i64(t_ra, t_rs, t_rs, 32, 32);
2107
- tcg_gen_rotli_i64(t_ra, t_ra, sh);
2108
- tcg_gen_andi_i64(t_ra, t_ra, mask);
2109
-#else
2110
- g_assert_not_reached();
2111
-#endif
2112
- }
2113
- }
2114
- if (unlikely(Rc(ctx->opcode) != 0)) {
2115
- gen_set_Rc0(ctx, t_ra);
2116
- }
2117
-}
2118
-
2015
/* rlwnm & rlwnm. */
2016
static void gen_rlwnm(DisasContext *ctx)
2017
{
4690
GEN_HANDLER_E(copy, 0x1F, 0x06, 0x18, 0x03C00001, PPC_NONE, PPC2_ISA300),
4691
GEN_HANDLER_E(cp_abort, 0x1F, 0x06, 0x1A, 0x03FFF801, PPC_NONE, PPC2_ISA300),
4692
GEN_HANDLER_E(paste, 0x1F, 0x06, 0x1C, 0x03C00000, PPC_NONE, PPC2_ISA300),
4797
-GEN_HANDLER(rlwimi, 0x14, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
4798
-GEN_HANDLER(rlwinm, 0x15, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
4693
GEN_HANDLER(rlwnm, 0x17, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
4694
/* handles lfdp, lxsd, lxssp */
4695
GEN_HANDLER_E(dform39, 0x39, 0xFF, 0xFF, 0x00000000, PPC_NONE, PPC2_ISA205),