Commit f01be154589f6e137195d9cc28d1296d885e4eea
1 parent
a1cf28f4
Move the active FPU registers into env again, and use more TCG registers
to access them. Signed-off-by: Thiemo Seufer <ths@networkno.de> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5252 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
7 changed files
with
338 additions
and
322 deletions
gdbstub.c
| ... | ... | @@ -731,16 +731,16 @@ static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) |
| 731 | 731 | for (i = 0; i < 32; i++) |
| 732 | 732 | { |
| 733 | 733 | if (env->CP0_Status & (1 << CP0St_FR)) |
| 734 | - *(target_ulong *)ptr = tswapl(env->fpu->fpr[i].d); | |
| 734 | + *(target_ulong *)ptr = tswapl(env->active_fpu.fpr[i].d); | |
| 735 | 735 | else |
| 736 | - *(target_ulong *)ptr = tswap32(env->fpu->fpr[i].w[FP_ENDIAN_IDX]); | |
| 736 | + *(target_ulong *)ptr = tswap32(env->active_fpu.fpr[i].w[FP_ENDIAN_IDX]); | |
| 737 | 737 | ptr += sizeof(target_ulong); |
| 738 | 738 | } |
| 739 | 739 | |
| 740 | - *(target_ulong *)ptr = (int32_t)tswap32(env->fpu->fcr31); | |
| 740 | + *(target_ulong *)ptr = (int32_t)tswap32(env->active_fpu.fcr31); | |
| 741 | 741 | ptr += sizeof(target_ulong); |
| 742 | 742 | |
| 743 | - *(target_ulong *)ptr = (int32_t)tswap32(env->fpu->fcr0); | |
| 743 | + *(target_ulong *)ptr = (int32_t)tswap32(env->active_fpu.fcr0); | |
| 744 | 744 | ptr += sizeof(target_ulong); |
| 745 | 745 | } |
| 746 | 746 | |
| ... | ... | @@ -771,7 +771,7 @@ static unsigned int ieee_rm[] = |
| 771 | 771 | float_round_down |
| 772 | 772 | }; |
| 773 | 773 | #define RESTORE_ROUNDING_MODE \ |
| 774 | - set_float_rounding_mode(ieee_rm[env->fpu->fcr31 & 3], &env->fpu->fp_status) | |
| 774 | + set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], &env->active_fpu.fp_status) | |
| 775 | 775 | |
| 776 | 776 | static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) |
| 777 | 777 | { |
| ... | ... | @@ -808,13 +808,13 @@ static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) |
| 808 | 808 | for (i = 0; i < 32; i++) |
| 809 | 809 | { |
| 810 | 810 | if (env->CP0_Status & (1 << CP0St_FR)) |
| 811 | - env->fpu->fpr[i].d = tswapl(*(target_ulong *)ptr); | |
| 811 | + env->active_fpu.fpr[i].d = tswapl(*(target_ulong *)ptr); | |
| 812 | 812 | else |
| 813 | - env->fpu->fpr[i].w[FP_ENDIAN_IDX] = tswapl(*(target_ulong *)ptr); | |
| 813 | + env->active_fpu.fpr[i].w[FP_ENDIAN_IDX] = tswapl(*(target_ulong *)ptr); | |
| 814 | 814 | ptr += sizeof(target_ulong); |
| 815 | 815 | } |
| 816 | 816 | |
| 817 | - env->fpu->fcr31 = tswapl(*(target_ulong *)ptr) & 0xFF83FFFF; | |
| 817 | + env->active_fpu.fcr31 = tswapl(*(target_ulong *)ptr) & 0xFF83FFFF; | |
| 818 | 818 | ptr += sizeof(target_ulong); |
| 819 | 819 | |
| 820 | 820 | /* The remaining registers are assumed to be read-only. */ | ... | ... |
target-mips/TODO
| ... | ... | @@ -30,11 +30,6 @@ General |
| 30 | 30 | each ASID change. Using the MMU modes to implement ASIDs hinges on |
| 31 | 31 | implementing the global bit efficiently. |
| 32 | 32 | - save/restore of the CPU state is not implemented (see machine.c). |
| 33 | -- Improve cpu state handling: | |
| 34 | - Step 1) Collect all the TC state in a single struct, so we need only | |
| 35 | - a single global pointer for the active TC. | |
| 36 | - Step 2) Use only a single TC context as working context, and copy the | |
| 37 | - contexts on TC switch. Likewise for FPU contexts. | |
| 38 | 33 | |
| 39 | 34 | MIPS64 |
| 40 | 35 | ------ | ... | ... |
target-mips/cpu.h
| ... | ... | @@ -84,9 +84,9 @@ struct CPUMIPSFPUContext { |
| 84 | 84 | #define FCR0_REV 0 |
| 85 | 85 | /* fcsr */ |
| 86 | 86 | uint32_t fcr31; |
| 87 | -#define SET_FP_COND(num,env) do { ((env)->fcr31) |= ((num) ? (1 << ((num) + 24)) : (1 << 23)); } while(0) | |
| 88 | -#define CLEAR_FP_COND(num,env) do { ((env)->fcr31) &= ~((num) ? (1 << ((num) + 24)) : (1 << 23)); } while(0) | |
| 89 | -#define GET_FP_COND(env) ((((env)->fcr31 >> 24) & 0xfe) | (((env)->fcr31 >> 23) & 0x1)) | |
| 87 | +#define SET_FP_COND(num,env) do { ((env).fcr31) |= ((num) ? (1 << ((num) + 24)) : (1 << 23)); } while(0) | |
| 88 | +#define CLEAR_FP_COND(num,env) do { ((env).fcr31) &= ~((num) ? (1 << ((num) + 24)) : (1 << 23)); } while(0) | |
| 89 | +#define GET_FP_COND(env) ((((env).fcr31 >> 24) & 0xfe) | (((env).fcr31 >> 23) & 0x1)) | |
| 90 | 90 | #define GET_FP_CAUSE(reg) (((reg) >> 12) & 0x3f) |
| 91 | 91 | #define GET_FP_ENABLE(reg) (((reg) >> 7) & 0x1f) |
| 92 | 92 | #define GET_FP_FLAGS(reg) (((reg) >> 2) & 0x1f) |
| ... | ... | @@ -132,6 +132,7 @@ typedef struct mips_def_t mips_def_t; |
| 132 | 132 | |
| 133 | 133 | #define MIPS_SHADOW_SET_MAX 16 |
| 134 | 134 | #define MIPS_TC_MAX 5 |
| 135 | +#define MIPS_FPU_MAX 1 | |
| 135 | 136 | #define MIPS_DSP_ACC 4 |
| 136 | 137 | |
| 137 | 138 | typedef struct TCState TCState; |
| ... | ... | @@ -170,11 +171,12 @@ struct TCState { |
| 170 | 171 | typedef struct CPUMIPSState CPUMIPSState; |
| 171 | 172 | struct CPUMIPSState { |
| 172 | 173 | TCState active_tc; |
| 174 | + CPUMIPSFPUContext active_fpu; | |
| 173 | 175 | |
| 174 | 176 | CPUMIPSMVPContext *mvp; |
| 175 | 177 | CPUMIPSTLBContext *tlb; |
| 176 | - CPUMIPSFPUContext *fpu; | |
| 177 | 178 | uint32_t current_tc; |
| 179 | + uint32_t current_fpu; | |
| 178 | 180 | |
| 179 | 181 | uint32_t SEGBITS; |
| 180 | 182 | uint32_t PABITS; |
| ... | ... | @@ -404,6 +406,7 @@ struct CPUMIPSState { |
| 404 | 406 | int32_t CP0_DESAVE; |
| 405 | 407 | /* We waste some space so we can handle shadow registers like TCs. */ |
| 406 | 408 | TCState tcs[MIPS_SHADOW_SET_MAX]; |
| 409 | + CPUMIPSFPUContext fpus[MIPS_FPU_MAX]; | |
| 407 | 410 | /* Qemu */ |
| 408 | 411 | int error_code; |
| 409 | 412 | uint32_t hflags; /* CPU State */ | ... | ... |
target-mips/exec.h
| ... | ... | @@ -86,7 +86,7 @@ static inline void compute_hflags(CPUState *env) |
| 86 | 86 | if (env->CP0_Status & (1 << CP0St_FR)) |
| 87 | 87 | env->hflags |= MIPS_HFLAG_F64; |
| 88 | 88 | if (env->insn_flags & ISA_MIPS32R2) { |
| 89 | - if (env->fpu->fcr0 & (1 << FCR0_F64)) | |
| 89 | + if (env->active_fpu.fcr0 & (1 << FCR0_F64)) | |
| 90 | 90 | env->hflags |= MIPS_HFLAG_COP1X; |
| 91 | 91 | } else if (env->insn_flags & ISA_MIPS32) { |
| 92 | 92 | if (env->hflags & MIPS_HFLAG_64) | ... | ... |
target-mips/op_helper.c
| ... | ... | @@ -1940,7 +1940,7 @@ unsigned int ieee_rm[] = { |
| 1940 | 1940 | }; |
| 1941 | 1941 | |
| 1942 | 1942 | #define RESTORE_ROUNDING_MODE \ |
| 1943 | - set_float_rounding_mode(ieee_rm[env->fpu->fcr31 & 3], &env->fpu->fp_status) | |
| 1943 | + set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], &env->active_fpu.fp_status) | |
| 1944 | 1944 | |
| 1945 | 1945 | target_ulong do_cfc1 (uint32_t reg) |
| 1946 | 1946 | { |
| ... | ... | @@ -1948,19 +1948,19 @@ target_ulong do_cfc1 (uint32_t reg) |
| 1948 | 1948 | |
| 1949 | 1949 | switch (reg) { |
| 1950 | 1950 | case 0: |
| 1951 | - t0 = (int32_t)env->fpu->fcr0; | |
| 1951 | + t0 = (int32_t)env->active_fpu.fcr0; | |
| 1952 | 1952 | break; |
| 1953 | 1953 | case 25: |
| 1954 | - t0 = ((env->fpu->fcr31 >> 24) & 0xfe) | ((env->fpu->fcr31 >> 23) & 0x1); | |
| 1954 | + t0 = ((env->active_fpu.fcr31 >> 24) & 0xfe) | ((env->active_fpu.fcr31 >> 23) & 0x1); | |
| 1955 | 1955 | break; |
| 1956 | 1956 | case 26: |
| 1957 | - t0 = env->fpu->fcr31 & 0x0003f07c; | |
| 1957 | + t0 = env->active_fpu.fcr31 & 0x0003f07c; | |
| 1958 | 1958 | break; |
| 1959 | 1959 | case 28: |
| 1960 | - t0 = (env->fpu->fcr31 & 0x00000f83) | ((env->fpu->fcr31 >> 22) & 0x4); | |
| 1960 | + t0 = (env->active_fpu.fcr31 & 0x00000f83) | ((env->active_fpu.fcr31 >> 22) & 0x4); | |
| 1961 | 1961 | break; |
| 1962 | 1962 | default: |
| 1963 | - t0 = (int32_t)env->fpu->fcr31; | |
| 1963 | + t0 = (int32_t)env->active_fpu.fcr31; | |
| 1964 | 1964 | break; |
| 1965 | 1965 | } |
| 1966 | 1966 | |
| ... | ... | @@ -1973,32 +1973,32 @@ void do_ctc1 (target_ulong t0, uint32_t reg) |
| 1973 | 1973 | case 25: |
| 1974 | 1974 | if (t0 & 0xffffff00) |
| 1975 | 1975 | return; |
| 1976 | - env->fpu->fcr31 = (env->fpu->fcr31 & 0x017fffff) | ((t0 & 0xfe) << 24) | | |
| 1976 | + env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0x017fffff) | ((t0 & 0xfe) << 24) | | |
| 1977 | 1977 | ((t0 & 0x1) << 23); |
| 1978 | 1978 | break; |
| 1979 | 1979 | case 26: |
| 1980 | 1980 | if (t0 & 0x007c0000) |
| 1981 | 1981 | return; |
| 1982 | - env->fpu->fcr31 = (env->fpu->fcr31 & 0xfffc0f83) | (t0 & 0x0003f07c); | |
| 1982 | + env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0xfffc0f83) | (t0 & 0x0003f07c); | |
| 1983 | 1983 | break; |
| 1984 | 1984 | case 28: |
| 1985 | 1985 | if (t0 & 0x007c0000) |
| 1986 | 1986 | return; |
| 1987 | - env->fpu->fcr31 = (env->fpu->fcr31 & 0xfefff07c) | (t0 & 0x00000f83) | | |
| 1987 | + env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0xfefff07c) | (t0 & 0x00000f83) | | |
| 1988 | 1988 | ((t0 & 0x4) << 22); |
| 1989 | 1989 | break; |
| 1990 | 1990 | case 31: |
| 1991 | 1991 | if (t0 & 0x007c0000) |
| 1992 | 1992 | return; |
| 1993 | - env->fpu->fcr31 = t0; | |
| 1993 | + env->active_fpu.fcr31 = t0; | |
| 1994 | 1994 | break; |
| 1995 | 1995 | default: |
| 1996 | 1996 | return; |
| 1997 | 1997 | } |
| 1998 | 1998 | /* set rounding mode */ |
| 1999 | 1999 | RESTORE_ROUNDING_MODE; |
| 2000 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2001 | - if ((GET_FP_ENABLE(env->fpu->fcr31) | 0x20) & GET_FP_CAUSE(env->fpu->fcr31)) | |
| 2000 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2001 | + if ((GET_FP_ENABLE(env->active_fpu.fcr31) | 0x20) & GET_FP_CAUSE(env->active_fpu.fcr31)) | |
| 2002 | 2002 | do_raise_exception(EXCP_FPE); |
| 2003 | 2003 | } |
| 2004 | 2004 | |
| ... | ... | @@ -2022,13 +2022,13 @@ static inline char mips_ex_to_ieee(char xcpt) |
| 2022 | 2022 | |
| 2023 | 2023 | static inline void update_fcr31(void) |
| 2024 | 2024 | { |
| 2025 | - int tmp = ieee_ex_to_mips(get_float_exception_flags(&env->fpu->fp_status)); | |
| 2025 | + int tmp = ieee_ex_to_mips(get_float_exception_flags(&env->active_fpu.fp_status)); | |
| 2026 | 2026 | |
| 2027 | - SET_FP_CAUSE(env->fpu->fcr31, tmp); | |
| 2028 | - if (GET_FP_ENABLE(env->fpu->fcr31) & tmp) | |
| 2027 | + SET_FP_CAUSE(env->active_fpu.fcr31, tmp); | |
| 2028 | + if (GET_FP_ENABLE(env->active_fpu.fcr31) & tmp) | |
| 2029 | 2029 | do_raise_exception(EXCP_FPE); |
| 2030 | 2030 | else |
| 2031 | - UPDATE_FP_FLAGS(env->fpu->fcr31, tmp); | |
| 2031 | + UPDATE_FP_FLAGS(env->active_fpu.fcr31, tmp); | |
| 2032 | 2032 | } |
| 2033 | 2033 | |
| 2034 | 2034 | /* Float support. |
| ... | ... | @@ -2039,20 +2039,20 @@ static inline void update_fcr31(void) |
| 2039 | 2039 | /* unary operations, modifying fp status */ |
| 2040 | 2040 | uint64_t do_float_sqrt_d(uint64_t fdt0) |
| 2041 | 2041 | { |
| 2042 | - return float64_sqrt(fdt0, &env->fpu->fp_status); | |
| 2042 | + return float64_sqrt(fdt0, &env->active_fpu.fp_status); | |
| 2043 | 2043 | } |
| 2044 | 2044 | |
| 2045 | 2045 | uint32_t do_float_sqrt_s(uint32_t fst0) |
| 2046 | 2046 | { |
| 2047 | - return float32_sqrt(fst0, &env->fpu->fp_status); | |
| 2047 | + return float32_sqrt(fst0, &env->active_fpu.fp_status); | |
| 2048 | 2048 | } |
| 2049 | 2049 | |
| 2050 | 2050 | uint64_t do_float_cvtd_s(uint32_t fst0) |
| 2051 | 2051 | { |
| 2052 | 2052 | uint64_t fdt2; |
| 2053 | 2053 | |
| 2054 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2055 | - fdt2 = float32_to_float64(fst0, &env->fpu->fp_status); | |
| 2054 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2055 | + fdt2 = float32_to_float64(fst0, &env->active_fpu.fp_status); | |
| 2056 | 2056 | update_fcr31(); |
| 2057 | 2057 | return fdt2; |
| 2058 | 2058 | } |
| ... | ... | @@ -2061,8 +2061,8 @@ uint64_t do_float_cvtd_w(uint32_t wt0) |
| 2061 | 2061 | { |
| 2062 | 2062 | uint64_t fdt2; |
| 2063 | 2063 | |
| 2064 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2065 | - fdt2 = int32_to_float64(wt0, &env->fpu->fp_status); | |
| 2064 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2065 | + fdt2 = int32_to_float64(wt0, &env->active_fpu.fp_status); | |
| 2066 | 2066 | update_fcr31(); |
| 2067 | 2067 | return fdt2; |
| 2068 | 2068 | } |
| ... | ... | @@ -2071,8 +2071,8 @@ uint64_t do_float_cvtd_l(uint64_t dt0) |
| 2071 | 2071 | { |
| 2072 | 2072 | uint64_t fdt2; |
| 2073 | 2073 | |
| 2074 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2075 | - fdt2 = int64_to_float64(dt0, &env->fpu->fp_status); | |
| 2074 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2075 | + fdt2 = int64_to_float64(dt0, &env->active_fpu.fp_status); | |
| 2076 | 2076 | update_fcr31(); |
| 2077 | 2077 | return fdt2; |
| 2078 | 2078 | } |
| ... | ... | @@ -2081,10 +2081,10 @@ uint64_t do_float_cvtl_d(uint64_t fdt0) |
| 2081 | 2081 | { |
| 2082 | 2082 | uint64_t dt2; |
| 2083 | 2083 | |
| 2084 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2085 | - dt2 = float64_to_int64(fdt0, &env->fpu->fp_status); | |
| 2084 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2085 | + dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); | |
| 2086 | 2086 | update_fcr31(); |
| 2087 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2087 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2088 | 2088 | dt2 = FLOAT_SNAN64; |
| 2089 | 2089 | return dt2; |
| 2090 | 2090 | } |
| ... | ... | @@ -2093,10 +2093,10 @@ uint64_t do_float_cvtl_s(uint32_t fst0) |
| 2093 | 2093 | { |
| 2094 | 2094 | uint64_t dt2; |
| 2095 | 2095 | |
| 2096 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2097 | - dt2 = float32_to_int64(fst0, &env->fpu->fp_status); | |
| 2096 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2097 | + dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); | |
| 2098 | 2098 | update_fcr31(); |
| 2099 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2099 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2100 | 2100 | dt2 = FLOAT_SNAN64; |
| 2101 | 2101 | return dt2; |
| 2102 | 2102 | } |
| ... | ... | @@ -2106,9 +2106,9 @@ uint64_t do_float_cvtps_pw(uint64_t dt0) |
| 2106 | 2106 | uint32_t fst2; |
| 2107 | 2107 | uint32_t fsth2; |
| 2108 | 2108 | |
| 2109 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2110 | - fst2 = int32_to_float32(dt0 & 0XFFFFFFFF, &env->fpu->fp_status); | |
| 2111 | - fsth2 = int32_to_float32(dt0 >> 32, &env->fpu->fp_status); | |
| 2109 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2110 | + fst2 = int32_to_float32(dt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); | |
| 2111 | + fsth2 = int32_to_float32(dt0 >> 32, &env->active_fpu.fp_status); | |
| 2112 | 2112 | update_fcr31(); |
| 2113 | 2113 | return ((uint64_t)fsth2 << 32) | fst2; |
| 2114 | 2114 | } |
| ... | ... | @@ -2118,11 +2118,11 @@ uint64_t do_float_cvtpw_ps(uint64_t fdt0) |
| 2118 | 2118 | uint32_t wt2; |
| 2119 | 2119 | uint32_t wth2; |
| 2120 | 2120 | |
| 2121 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2122 | - wt2 = float32_to_int32(fdt0 & 0XFFFFFFFF, &env->fpu->fp_status); | |
| 2123 | - wth2 = float32_to_int32(fdt0 >> 32, &env->fpu->fp_status); | |
| 2121 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2122 | + wt2 = float32_to_int32(fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); | |
| 2123 | + wth2 = float32_to_int32(fdt0 >> 32, &env->active_fpu.fp_status); | |
| 2124 | 2124 | update_fcr31(); |
| 2125 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) { | |
| 2125 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) { | |
| 2126 | 2126 | wt2 = FLOAT_SNAN32; |
| 2127 | 2127 | wth2 = FLOAT_SNAN32; |
| 2128 | 2128 | } |
| ... | ... | @@ -2133,8 +2133,8 @@ uint32_t do_float_cvts_d(uint64_t fdt0) |
| 2133 | 2133 | { |
| 2134 | 2134 | uint32_t fst2; |
| 2135 | 2135 | |
| 2136 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2137 | - fst2 = float64_to_float32(fdt0, &env->fpu->fp_status); | |
| 2136 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2137 | + fst2 = float64_to_float32(fdt0, &env->active_fpu.fp_status); | |
| 2138 | 2138 | update_fcr31(); |
| 2139 | 2139 | return fst2; |
| 2140 | 2140 | } |
| ... | ... | @@ -2143,8 +2143,8 @@ uint32_t do_float_cvts_w(uint32_t wt0) |
| 2143 | 2143 | { |
| 2144 | 2144 | uint32_t fst2; |
| 2145 | 2145 | |
| 2146 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2147 | - fst2 = int32_to_float32(wt0, &env->fpu->fp_status); | |
| 2146 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2147 | + fst2 = int32_to_float32(wt0, &env->active_fpu.fp_status); | |
| 2148 | 2148 | update_fcr31(); |
| 2149 | 2149 | return fst2; |
| 2150 | 2150 | } |
| ... | ... | @@ -2153,8 +2153,8 @@ uint32_t do_float_cvts_l(uint64_t dt0) |
| 2153 | 2153 | { |
| 2154 | 2154 | uint32_t fst2; |
| 2155 | 2155 | |
| 2156 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2157 | - fst2 = int64_to_float32(dt0, &env->fpu->fp_status); | |
| 2156 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2157 | + fst2 = int64_to_float32(dt0, &env->active_fpu.fp_status); | |
| 2158 | 2158 | update_fcr31(); |
| 2159 | 2159 | return fst2; |
| 2160 | 2160 | } |
| ... | ... | @@ -2163,7 +2163,7 @@ uint32_t do_float_cvts_pl(uint32_t wt0) |
| 2163 | 2163 | { |
| 2164 | 2164 | uint32_t wt2; |
| 2165 | 2165 | |
| 2166 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2166 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2167 | 2167 | wt2 = wt0; |
| 2168 | 2168 | update_fcr31(); |
| 2169 | 2169 | return wt2; |
| ... | ... | @@ -2173,7 +2173,7 @@ uint32_t do_float_cvts_pu(uint32_t wth0) |
| 2173 | 2173 | { |
| 2174 | 2174 | uint32_t wt2; |
| 2175 | 2175 | |
| 2176 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2176 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2177 | 2177 | wt2 = wth0; |
| 2178 | 2178 | update_fcr31(); |
| 2179 | 2179 | return wt2; |
| ... | ... | @@ -2183,10 +2183,10 @@ uint32_t do_float_cvtw_s(uint32_t fst0) |
| 2183 | 2183 | { |
| 2184 | 2184 | uint32_t wt2; |
| 2185 | 2185 | |
| 2186 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2187 | - wt2 = float32_to_int32(fst0, &env->fpu->fp_status); | |
| 2186 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2187 | + wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); | |
| 2188 | 2188 | update_fcr31(); |
| 2189 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2189 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2190 | 2190 | wt2 = FLOAT_SNAN32; |
| 2191 | 2191 | return wt2; |
| 2192 | 2192 | } |
| ... | ... | @@ -2195,10 +2195,10 @@ uint32_t do_float_cvtw_d(uint64_t fdt0) |
| 2195 | 2195 | { |
| 2196 | 2196 | uint32_t wt2; |
| 2197 | 2197 | |
| 2198 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2199 | - wt2 = float64_to_int32(fdt0, &env->fpu->fp_status); | |
| 2198 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2199 | + wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); | |
| 2200 | 2200 | update_fcr31(); |
| 2201 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2201 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2202 | 2202 | wt2 = FLOAT_SNAN32; |
| 2203 | 2203 | return wt2; |
| 2204 | 2204 | } |
| ... | ... | @@ -2207,11 +2207,11 @@ uint64_t do_float_roundl_d(uint64_t fdt0) |
| 2207 | 2207 | { |
| 2208 | 2208 | uint64_t dt2; |
| 2209 | 2209 | |
| 2210 | - set_float_rounding_mode(float_round_nearest_even, &env->fpu->fp_status); | |
| 2211 | - dt2 = float64_to_int64(fdt0, &env->fpu->fp_status); | |
| 2210 | + set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status); | |
| 2211 | + dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); | |
| 2212 | 2212 | RESTORE_ROUNDING_MODE; |
| 2213 | 2213 | update_fcr31(); |
| 2214 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2214 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2215 | 2215 | dt2 = FLOAT_SNAN64; |
| 2216 | 2216 | return dt2; |
| 2217 | 2217 | } |
| ... | ... | @@ -2220,11 +2220,11 @@ uint64_t do_float_roundl_s(uint32_t fst0) |
| 2220 | 2220 | { |
| 2221 | 2221 | uint64_t dt2; |
| 2222 | 2222 | |
| 2223 | - set_float_rounding_mode(float_round_nearest_even, &env->fpu->fp_status); | |
| 2224 | - dt2 = float32_to_int64(fst0, &env->fpu->fp_status); | |
| 2223 | + set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status); | |
| 2224 | + dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); | |
| 2225 | 2225 | RESTORE_ROUNDING_MODE; |
| 2226 | 2226 | update_fcr31(); |
| 2227 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2227 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2228 | 2228 | dt2 = FLOAT_SNAN64; |
| 2229 | 2229 | return dt2; |
| 2230 | 2230 | } |
| ... | ... | @@ -2233,11 +2233,11 @@ uint32_t do_float_roundw_d(uint64_t fdt0) |
| 2233 | 2233 | { |
| 2234 | 2234 | uint32_t wt2; |
| 2235 | 2235 | |
| 2236 | - set_float_rounding_mode(float_round_nearest_even, &env->fpu->fp_status); | |
| 2237 | - wt2 = float64_to_int32(fdt0, &env->fpu->fp_status); | |
| 2236 | + set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status); | |
| 2237 | + wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); | |
| 2238 | 2238 | RESTORE_ROUNDING_MODE; |
| 2239 | 2239 | update_fcr31(); |
| 2240 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2240 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2241 | 2241 | wt2 = FLOAT_SNAN32; |
| 2242 | 2242 | return wt2; |
| 2243 | 2243 | } |
| ... | ... | @@ -2246,11 +2246,11 @@ uint32_t do_float_roundw_s(uint32_t fst0) |
| 2246 | 2246 | { |
| 2247 | 2247 | uint32_t wt2; |
| 2248 | 2248 | |
| 2249 | - set_float_rounding_mode(float_round_nearest_even, &env->fpu->fp_status); | |
| 2250 | - wt2 = float32_to_int32(fst0, &env->fpu->fp_status); | |
| 2249 | + set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status); | |
| 2250 | + wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); | |
| 2251 | 2251 | RESTORE_ROUNDING_MODE; |
| 2252 | 2252 | update_fcr31(); |
| 2253 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2253 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2254 | 2254 | wt2 = FLOAT_SNAN32; |
| 2255 | 2255 | return wt2; |
| 2256 | 2256 | } |
| ... | ... | @@ -2259,9 +2259,9 @@ uint64_t do_float_truncl_d(uint64_t fdt0) |
| 2259 | 2259 | { |
| 2260 | 2260 | uint64_t dt2; |
| 2261 | 2261 | |
| 2262 | - dt2 = float64_to_int64_round_to_zero(fdt0, &env->fpu->fp_status); | |
| 2262 | + dt2 = float64_to_int64_round_to_zero(fdt0, &env->active_fpu.fp_status); | |
| 2263 | 2263 | update_fcr31(); |
| 2264 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2264 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2265 | 2265 | dt2 = FLOAT_SNAN64; |
| 2266 | 2266 | return dt2; |
| 2267 | 2267 | } |
| ... | ... | @@ -2270,9 +2270,9 @@ uint64_t do_float_truncl_s(uint32_t fst0) |
| 2270 | 2270 | { |
| 2271 | 2271 | uint64_t dt2; |
| 2272 | 2272 | |
| 2273 | - dt2 = float32_to_int64_round_to_zero(fst0, &env->fpu->fp_status); | |
| 2273 | + dt2 = float32_to_int64_round_to_zero(fst0, &env->active_fpu.fp_status); | |
| 2274 | 2274 | update_fcr31(); |
| 2275 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2275 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2276 | 2276 | dt2 = FLOAT_SNAN64; |
| 2277 | 2277 | return dt2; |
| 2278 | 2278 | } |
| ... | ... | @@ -2281,9 +2281,9 @@ uint32_t do_float_truncw_d(uint64_t fdt0) |
| 2281 | 2281 | { |
| 2282 | 2282 | uint32_t wt2; |
| 2283 | 2283 | |
| 2284 | - wt2 = float64_to_int32_round_to_zero(fdt0, &env->fpu->fp_status); | |
| 2284 | + wt2 = float64_to_int32_round_to_zero(fdt0, &env->active_fpu.fp_status); | |
| 2285 | 2285 | update_fcr31(); |
| 2286 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2286 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2287 | 2287 | wt2 = FLOAT_SNAN32; |
| 2288 | 2288 | return wt2; |
| 2289 | 2289 | } |
| ... | ... | @@ -2292,9 +2292,9 @@ uint32_t do_float_truncw_s(uint32_t fst0) |
| 2292 | 2292 | { |
| 2293 | 2293 | uint32_t wt2; |
| 2294 | 2294 | |
| 2295 | - wt2 = float32_to_int32_round_to_zero(fst0, &env->fpu->fp_status); | |
| 2295 | + wt2 = float32_to_int32_round_to_zero(fst0, &env->active_fpu.fp_status); | |
| 2296 | 2296 | update_fcr31(); |
| 2297 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2297 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2298 | 2298 | wt2 = FLOAT_SNAN32; |
| 2299 | 2299 | return wt2; |
| 2300 | 2300 | } |
| ... | ... | @@ -2303,11 +2303,11 @@ uint64_t do_float_ceill_d(uint64_t fdt0) |
| 2303 | 2303 | { |
| 2304 | 2304 | uint64_t dt2; |
| 2305 | 2305 | |
| 2306 | - set_float_rounding_mode(float_round_up, &env->fpu->fp_status); | |
| 2307 | - dt2 = float64_to_int64(fdt0, &env->fpu->fp_status); | |
| 2306 | + set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); | |
| 2307 | + dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); | |
| 2308 | 2308 | RESTORE_ROUNDING_MODE; |
| 2309 | 2309 | update_fcr31(); |
| 2310 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2310 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2311 | 2311 | dt2 = FLOAT_SNAN64; |
| 2312 | 2312 | return dt2; |
| 2313 | 2313 | } |
| ... | ... | @@ -2316,11 +2316,11 @@ uint64_t do_float_ceill_s(uint32_t fst0) |
| 2316 | 2316 | { |
| 2317 | 2317 | uint64_t dt2; |
| 2318 | 2318 | |
| 2319 | - set_float_rounding_mode(float_round_up, &env->fpu->fp_status); | |
| 2320 | - dt2 = float32_to_int64(fst0, &env->fpu->fp_status); | |
| 2319 | + set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); | |
| 2320 | + dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); | |
| 2321 | 2321 | RESTORE_ROUNDING_MODE; |
| 2322 | 2322 | update_fcr31(); |
| 2323 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2323 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2324 | 2324 | dt2 = FLOAT_SNAN64; |
| 2325 | 2325 | return dt2; |
| 2326 | 2326 | } |
| ... | ... | @@ -2329,11 +2329,11 @@ uint32_t do_float_ceilw_d(uint64_t fdt0) |
| 2329 | 2329 | { |
| 2330 | 2330 | uint32_t wt2; |
| 2331 | 2331 | |
| 2332 | - set_float_rounding_mode(float_round_up, &env->fpu->fp_status); | |
| 2333 | - wt2 = float64_to_int32(fdt0, &env->fpu->fp_status); | |
| 2332 | + set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); | |
| 2333 | + wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); | |
| 2334 | 2334 | RESTORE_ROUNDING_MODE; |
| 2335 | 2335 | update_fcr31(); |
| 2336 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2336 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2337 | 2337 | wt2 = FLOAT_SNAN32; |
| 2338 | 2338 | return wt2; |
| 2339 | 2339 | } |
| ... | ... | @@ -2342,11 +2342,11 @@ uint32_t do_float_ceilw_s(uint32_t fst0) |
| 2342 | 2342 | { |
| 2343 | 2343 | uint32_t wt2; |
| 2344 | 2344 | |
| 2345 | - set_float_rounding_mode(float_round_up, &env->fpu->fp_status); | |
| 2346 | - wt2 = float32_to_int32(fst0, &env->fpu->fp_status); | |
| 2345 | + set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); | |
| 2346 | + wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); | |
| 2347 | 2347 | RESTORE_ROUNDING_MODE; |
| 2348 | 2348 | update_fcr31(); |
| 2349 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2349 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2350 | 2350 | wt2 = FLOAT_SNAN32; |
| 2351 | 2351 | return wt2; |
| 2352 | 2352 | } |
| ... | ... | @@ -2355,11 +2355,11 @@ uint64_t do_float_floorl_d(uint64_t fdt0) |
| 2355 | 2355 | { |
| 2356 | 2356 | uint64_t dt2; |
| 2357 | 2357 | |
| 2358 | - set_float_rounding_mode(float_round_down, &env->fpu->fp_status); | |
| 2359 | - dt2 = float64_to_int64(fdt0, &env->fpu->fp_status); | |
| 2358 | + set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); | |
| 2359 | + dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); | |
| 2360 | 2360 | RESTORE_ROUNDING_MODE; |
| 2361 | 2361 | update_fcr31(); |
| 2362 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2362 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2363 | 2363 | dt2 = FLOAT_SNAN64; |
| 2364 | 2364 | return dt2; |
| 2365 | 2365 | } |
| ... | ... | @@ -2368,11 +2368,11 @@ uint64_t do_float_floorl_s(uint32_t fst0) |
| 2368 | 2368 | { |
| 2369 | 2369 | uint64_t dt2; |
| 2370 | 2370 | |
| 2371 | - set_float_rounding_mode(float_round_down, &env->fpu->fp_status); | |
| 2372 | - dt2 = float32_to_int64(fst0, &env->fpu->fp_status); | |
| 2371 | + set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); | |
| 2372 | + dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); | |
| 2373 | 2373 | RESTORE_ROUNDING_MODE; |
| 2374 | 2374 | update_fcr31(); |
| 2375 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2375 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2376 | 2376 | dt2 = FLOAT_SNAN64; |
| 2377 | 2377 | return dt2; |
| 2378 | 2378 | } |
| ... | ... | @@ -2381,11 +2381,11 @@ uint32_t do_float_floorw_d(uint64_t fdt0) |
| 2381 | 2381 | { |
| 2382 | 2382 | uint32_t wt2; |
| 2383 | 2383 | |
| 2384 | - set_float_rounding_mode(float_round_down, &env->fpu->fp_status); | |
| 2385 | - wt2 = float64_to_int32(fdt0, &env->fpu->fp_status); | |
| 2384 | + set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); | |
| 2385 | + wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); | |
| 2386 | 2386 | RESTORE_ROUNDING_MODE; |
| 2387 | 2387 | update_fcr31(); |
| 2388 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2388 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2389 | 2389 | wt2 = FLOAT_SNAN32; |
| 2390 | 2390 | return wt2; |
| 2391 | 2391 | } |
| ... | ... | @@ -2394,11 +2394,11 @@ uint32_t do_float_floorw_s(uint32_t fst0) |
| 2394 | 2394 | { |
| 2395 | 2395 | uint32_t wt2; |
| 2396 | 2396 | |
| 2397 | - set_float_rounding_mode(float_round_down, &env->fpu->fp_status); | |
| 2398 | - wt2 = float32_to_int32(fst0, &env->fpu->fp_status); | |
| 2397 | + set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); | |
| 2398 | + wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); | |
| 2399 | 2399 | RESTORE_ROUNDING_MODE; |
| 2400 | 2400 | update_fcr31(); |
| 2401 | - if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2401 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) | |
| 2402 | 2402 | wt2 = FLOAT_SNAN32; |
| 2403 | 2403 | return wt2; |
| 2404 | 2404 | } |
| ... | ... | @@ -2431,8 +2431,8 @@ uint64_t do_float_recip_d(uint64_t fdt0) |
| 2431 | 2431 | { |
| 2432 | 2432 | uint64_t fdt2; |
| 2433 | 2433 | |
| 2434 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2435 | - fdt2 = float64_div(FLOAT_ONE64, fdt0, &env->fpu->fp_status); | |
| 2434 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2435 | + fdt2 = float64_div(FLOAT_ONE64, fdt0, &env->active_fpu.fp_status); | |
| 2436 | 2436 | update_fcr31(); |
| 2437 | 2437 | return fdt2; |
| 2438 | 2438 | } |
| ... | ... | @@ -2441,8 +2441,8 @@ uint32_t do_float_recip_s(uint32_t fst0) |
| 2441 | 2441 | { |
| 2442 | 2442 | uint32_t fst2; |
| 2443 | 2443 | |
| 2444 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2445 | - fst2 = float32_div(FLOAT_ONE32, fst0, &env->fpu->fp_status); | |
| 2444 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2445 | + fst2 = float32_div(FLOAT_ONE32, fst0, &env->active_fpu.fp_status); | |
| 2446 | 2446 | update_fcr31(); |
| 2447 | 2447 | return fst2; |
| 2448 | 2448 | } |
| ... | ... | @@ -2451,9 +2451,9 @@ uint64_t do_float_rsqrt_d(uint64_t fdt0) |
| 2451 | 2451 | { |
| 2452 | 2452 | uint64_t fdt2; |
| 2453 | 2453 | |
| 2454 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2455 | - fdt2 = float64_sqrt(fdt0, &env->fpu->fp_status); | |
| 2456 | - fdt2 = float64_div(FLOAT_ONE64, fdt2, &env->fpu->fp_status); | |
| 2454 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2455 | + fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status); | |
| 2456 | + fdt2 = float64_div(FLOAT_ONE64, fdt2, &env->active_fpu.fp_status); | |
| 2457 | 2457 | update_fcr31(); |
| 2458 | 2458 | return fdt2; |
| 2459 | 2459 | } |
| ... | ... | @@ -2462,9 +2462,9 @@ uint32_t do_float_rsqrt_s(uint32_t fst0) |
| 2462 | 2462 | { |
| 2463 | 2463 | uint32_t fst2; |
| 2464 | 2464 | |
| 2465 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2466 | - fst2 = float32_sqrt(fst0, &env->fpu->fp_status); | |
| 2467 | - fst2 = float32_div(FLOAT_ONE32, fst2, &env->fpu->fp_status); | |
| 2465 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2466 | + fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status); | |
| 2467 | + fst2 = float32_div(FLOAT_ONE32, fst2, &env->active_fpu.fp_status); | |
| 2468 | 2468 | update_fcr31(); |
| 2469 | 2469 | return fst2; |
| 2470 | 2470 | } |
| ... | ... | @@ -2473,8 +2473,8 @@ uint64_t do_float_recip1_d(uint64_t fdt0) |
| 2473 | 2473 | { |
| 2474 | 2474 | uint64_t fdt2; |
| 2475 | 2475 | |
| 2476 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2477 | - fdt2 = float64_div(FLOAT_ONE64, fdt0, &env->fpu->fp_status); | |
| 2476 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2477 | + fdt2 = float64_div(FLOAT_ONE64, fdt0, &env->active_fpu.fp_status); | |
| 2478 | 2478 | update_fcr31(); |
| 2479 | 2479 | return fdt2; |
| 2480 | 2480 | } |
| ... | ... | @@ -2483,8 +2483,8 @@ uint32_t do_float_recip1_s(uint32_t fst0) |
| 2483 | 2483 | { |
| 2484 | 2484 | uint32_t fst2; |
| 2485 | 2485 | |
| 2486 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2487 | - fst2 = float32_div(FLOAT_ONE32, fst0, &env->fpu->fp_status); | |
| 2486 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2487 | + fst2 = float32_div(FLOAT_ONE32, fst0, &env->active_fpu.fp_status); | |
| 2488 | 2488 | update_fcr31(); |
| 2489 | 2489 | return fst2; |
| 2490 | 2490 | } |
| ... | ... | @@ -2494,9 +2494,9 @@ uint64_t do_float_recip1_ps(uint64_t fdt0) |
| 2494 | 2494 | uint32_t fst2; |
| 2495 | 2495 | uint32_t fsth2; |
| 2496 | 2496 | |
| 2497 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2498 | - fst2 = float32_div(FLOAT_ONE32, fdt0 & 0XFFFFFFFF, &env->fpu->fp_status); | |
| 2499 | - fsth2 = float32_div(FLOAT_ONE32, fdt0 >> 32, &env->fpu->fp_status); | |
| 2497 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2498 | + fst2 = float32_div(FLOAT_ONE32, fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); | |
| 2499 | + fsth2 = float32_div(FLOAT_ONE32, fdt0 >> 32, &env->active_fpu.fp_status); | |
| 2500 | 2500 | update_fcr31(); |
| 2501 | 2501 | return ((uint64_t)fsth2 << 32) | fst2; |
| 2502 | 2502 | } |
| ... | ... | @@ -2505,9 +2505,9 @@ uint64_t do_float_rsqrt1_d(uint64_t fdt0) |
| 2505 | 2505 | { |
| 2506 | 2506 | uint64_t fdt2; |
| 2507 | 2507 | |
| 2508 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2509 | - fdt2 = float64_sqrt(fdt0, &env->fpu->fp_status); | |
| 2510 | - fdt2 = float64_div(FLOAT_ONE64, fdt2, &env->fpu->fp_status); | |
| 2508 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2509 | + fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status); | |
| 2510 | + fdt2 = float64_div(FLOAT_ONE64, fdt2, &env->active_fpu.fp_status); | |
| 2511 | 2511 | update_fcr31(); |
| 2512 | 2512 | return fdt2; |
| 2513 | 2513 | } |
| ... | ... | @@ -2516,9 +2516,9 @@ uint32_t do_float_rsqrt1_s(uint32_t fst0) |
| 2516 | 2516 | { |
| 2517 | 2517 | uint32_t fst2; |
| 2518 | 2518 | |
| 2519 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2520 | - fst2 = float32_sqrt(fst0, &env->fpu->fp_status); | |
| 2521 | - fst2 = float32_div(FLOAT_ONE32, fst2, &env->fpu->fp_status); | |
| 2519 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2520 | + fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status); | |
| 2521 | + fst2 = float32_div(FLOAT_ONE32, fst2, &env->active_fpu.fp_status); | |
| 2522 | 2522 | update_fcr31(); |
| 2523 | 2523 | return fst2; |
| 2524 | 2524 | } |
| ... | ... | @@ -2528,11 +2528,11 @@ uint64_t do_float_rsqrt1_ps(uint64_t fdt0) |
| 2528 | 2528 | uint32_t fst2; |
| 2529 | 2529 | uint32_t fsth2; |
| 2530 | 2530 | |
| 2531 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2532 | - fst2 = float32_sqrt(fdt0 & 0XFFFFFFFF, &env->fpu->fp_status); | |
| 2533 | - fsth2 = float32_sqrt(fdt0 >> 32, &env->fpu->fp_status); | |
| 2534 | - fst2 = float32_div(FLOAT_ONE32, fst2, &env->fpu->fp_status); | |
| 2535 | - fsth2 = float32_div(FLOAT_ONE32, fsth2, &env->fpu->fp_status); | |
| 2531 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2532 | + fst2 = float32_sqrt(fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); | |
| 2533 | + fsth2 = float32_sqrt(fdt0 >> 32, &env->active_fpu.fp_status); | |
| 2534 | + fst2 = float32_div(FLOAT_ONE32, fst2, &env->active_fpu.fp_status); | |
| 2535 | + fsth2 = float32_div(FLOAT_ONE32, fsth2, &env->active_fpu.fp_status); | |
| 2536 | 2536 | update_fcr31(); |
| 2537 | 2537 | return ((uint64_t)fsth2 << 32) | fst2; |
| 2538 | 2538 | } |
| ... | ... | @@ -2545,10 +2545,10 @@ uint64_t do_float_ ## name ## _d(uint64_t fdt0, uint64_t fdt1) \ |
| 2545 | 2545 | { \ |
| 2546 | 2546 | uint64_t dt2; \ |
| 2547 | 2547 | \ |
| 2548 | - set_float_exception_flags(0, &env->fpu->fp_status); \ | |
| 2549 | - dt2 = float64_ ## name (fdt0, fdt1, &env->fpu->fp_status); \ | |
| 2548 | + set_float_exception_flags(0, &env->active_fpu.fp_status); \ | |
| 2549 | + dt2 = float64_ ## name (fdt0, fdt1, &env->active_fpu.fp_status); \ | |
| 2550 | 2550 | update_fcr31(); \ |
| 2551 | - if (GET_FP_CAUSE(env->fpu->fcr31) & FP_INVALID) \ | |
| 2551 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_INVALID) \ | |
| 2552 | 2552 | dt2 = FLOAT_QNAN64; \ |
| 2553 | 2553 | return dt2; \ |
| 2554 | 2554 | } \ |
| ... | ... | @@ -2557,10 +2557,10 @@ uint32_t do_float_ ## name ## _s(uint32_t fst0, uint32_t fst1) \ |
| 2557 | 2557 | { \ |
| 2558 | 2558 | uint32_t wt2; \ |
| 2559 | 2559 | \ |
| 2560 | - set_float_exception_flags(0, &env->fpu->fp_status); \ | |
| 2561 | - wt2 = float32_ ## name (fst0, fst1, &env->fpu->fp_status); \ | |
| 2560 | + set_float_exception_flags(0, &env->active_fpu.fp_status); \ | |
| 2561 | + wt2 = float32_ ## name (fst0, fst1, &env->active_fpu.fp_status); \ | |
| 2562 | 2562 | update_fcr31(); \ |
| 2563 | - if (GET_FP_CAUSE(env->fpu->fcr31) & FP_INVALID) \ | |
| 2563 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_INVALID) \ | |
| 2564 | 2564 | wt2 = FLOAT_QNAN32; \ |
| 2565 | 2565 | return wt2; \ |
| 2566 | 2566 | } \ |
| ... | ... | @@ -2574,11 +2574,11 @@ uint64_t do_float_ ## name ## _ps(uint64_t fdt0, uint64_t fdt1) \ |
| 2574 | 2574 | uint32_t wt2; \ |
| 2575 | 2575 | uint32_t wth2; \ |
| 2576 | 2576 | \ |
| 2577 | - set_float_exception_flags(0, &env->fpu->fp_status); \ | |
| 2578 | - wt2 = float32_ ## name (fst0, fst1, &env->fpu->fp_status); \ | |
| 2579 | - wth2 = float32_ ## name (fsth0, fsth1, &env->fpu->fp_status); \ | |
| 2577 | + set_float_exception_flags(0, &env->active_fpu.fp_status); \ | |
| 2578 | + wt2 = float32_ ## name (fst0, fst1, &env->active_fpu.fp_status); \ | |
| 2579 | + wth2 = float32_ ## name (fsth0, fsth1, &env->active_fpu.fp_status); \ | |
| 2580 | 2580 | update_fcr31(); \ |
| 2581 | - if (GET_FP_CAUSE(env->fpu->fcr31) & FP_INVALID) { \ | |
| 2581 | + if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_INVALID) { \ | |
| 2582 | 2582 | wt2 = FLOAT_QNAN32; \ |
| 2583 | 2583 | wth2 = FLOAT_QNAN32; \ |
| 2584 | 2584 | } \ |
| ... | ... | @@ -2596,15 +2596,15 @@ FLOAT_BINOP(div) |
| 2596 | 2596 | uint64_t do_float_ ## name1 ## name2 ## _d(uint64_t fdt0, uint64_t fdt1, \ |
| 2597 | 2597 | uint64_t fdt2) \ |
| 2598 | 2598 | { \ |
| 2599 | - fdt0 = float64_ ## name1 (fdt0, fdt1, &env->fpu->fp_status); \ | |
| 2600 | - return float64_ ## name2 (fdt0, fdt2, &env->fpu->fp_status); \ | |
| 2599 | + fdt0 = float64_ ## name1 (fdt0, fdt1, &env->active_fpu.fp_status); \ | |
| 2600 | + return float64_ ## name2 (fdt0, fdt2, &env->active_fpu.fp_status); \ | |
| 2601 | 2601 | } \ |
| 2602 | 2602 | \ |
| 2603 | 2603 | uint32_t do_float_ ## name1 ## name2 ## _s(uint32_t fst0, uint32_t fst1, \ |
| 2604 | 2604 | uint32_t fst2) \ |
| 2605 | 2605 | { \ |
| 2606 | - fst0 = float32_ ## name1 (fst0, fst1, &env->fpu->fp_status); \ | |
| 2607 | - return float32_ ## name2 (fst0, fst2, &env->fpu->fp_status); \ | |
| 2606 | + fst0 = float32_ ## name1 (fst0, fst1, &env->active_fpu.fp_status); \ | |
| 2607 | + return float32_ ## name2 (fst0, fst2, &env->active_fpu.fp_status); \ | |
| 2608 | 2608 | } \ |
| 2609 | 2609 | \ |
| 2610 | 2610 | uint64_t do_float_ ## name1 ## name2 ## _ps(uint64_t fdt0, uint64_t fdt1, \ |
| ... | ... | @@ -2617,10 +2617,10 @@ uint64_t do_float_ ## name1 ## name2 ## _ps(uint64_t fdt0, uint64_t fdt1, \ |
| 2617 | 2617 | uint32_t fst2 = fdt2 & 0XFFFFFFFF; \ |
| 2618 | 2618 | uint32_t fsth2 = fdt2 >> 32; \ |
| 2619 | 2619 | \ |
| 2620 | - fst0 = float32_ ## name1 (fst0, fst1, &env->fpu->fp_status); \ | |
| 2621 | - fsth0 = float32_ ## name1 (fsth0, fsth1, &env->fpu->fp_status); \ | |
| 2622 | - fst2 = float32_ ## name2 (fst0, fst2, &env->fpu->fp_status); \ | |
| 2623 | - fsth2 = float32_ ## name2 (fsth0, fsth2, &env->fpu->fp_status); \ | |
| 2620 | + fst0 = float32_ ## name1 (fst0, fst1, &env->active_fpu.fp_status); \ | |
| 2621 | + fsth0 = float32_ ## name1 (fsth0, fsth1, &env->active_fpu.fp_status); \ | |
| 2622 | + fst2 = float32_ ## name2 (fst0, fst2, &env->active_fpu.fp_status); \ | |
| 2623 | + fsth2 = float32_ ## name2 (fsth0, fsth2, &env->active_fpu.fp_status); \ | |
| 2624 | 2624 | return ((uint64_t)fsth2 << 32) | fst2; \ |
| 2625 | 2625 | } |
| 2626 | 2626 | |
| ... | ... | @@ -2633,16 +2633,16 @@ FLOAT_TERNOP(mul, sub) |
| 2633 | 2633 | uint64_t do_float_n ## name1 ## name2 ## _d(uint64_t fdt0, uint64_t fdt1, \ |
| 2634 | 2634 | uint64_t fdt2) \ |
| 2635 | 2635 | { \ |
| 2636 | - fdt0 = float64_ ## name1 (fdt0, fdt1, &env->fpu->fp_status); \ | |
| 2637 | - fdt2 = float64_ ## name2 (fdt0, fdt2, &env->fpu->fp_status); \ | |
| 2636 | + fdt0 = float64_ ## name1 (fdt0, fdt1, &env->active_fpu.fp_status); \ | |
| 2637 | + fdt2 = float64_ ## name2 (fdt0, fdt2, &env->active_fpu.fp_status); \ | |
| 2638 | 2638 | return float64_chs(fdt2); \ |
| 2639 | 2639 | } \ |
| 2640 | 2640 | \ |
| 2641 | 2641 | uint32_t do_float_n ## name1 ## name2 ## _s(uint32_t fst0, uint32_t fst1, \ |
| 2642 | 2642 | uint32_t fst2) \ |
| 2643 | 2643 | { \ |
| 2644 | - fst0 = float32_ ## name1 (fst0, fst1, &env->fpu->fp_status); \ | |
| 2645 | - fst2 = float32_ ## name2 (fst0, fst2, &env->fpu->fp_status); \ | |
| 2644 | + fst0 = float32_ ## name1 (fst0, fst1, &env->active_fpu.fp_status); \ | |
| 2645 | + fst2 = float32_ ## name2 (fst0, fst2, &env->active_fpu.fp_status); \ | |
| 2646 | 2646 | return float32_chs(fst2); \ |
| 2647 | 2647 | } \ |
| 2648 | 2648 | \ |
| ... | ... | @@ -2656,10 +2656,10 @@ uint64_t do_float_n ## name1 ## name2 ## _ps(uint64_t fdt0, uint64_t fdt1,\ |
| 2656 | 2656 | uint32_t fst2 = fdt2 & 0XFFFFFFFF; \ |
| 2657 | 2657 | uint32_t fsth2 = fdt2 >> 32; \ |
| 2658 | 2658 | \ |
| 2659 | - fst0 = float32_ ## name1 (fst0, fst1, &env->fpu->fp_status); \ | |
| 2660 | - fsth0 = float32_ ## name1 (fsth0, fsth1, &env->fpu->fp_status); \ | |
| 2661 | - fst2 = float32_ ## name2 (fst0, fst2, &env->fpu->fp_status); \ | |
| 2662 | - fsth2 = float32_ ## name2 (fsth0, fsth2, &env->fpu->fp_status); \ | |
| 2659 | + fst0 = float32_ ## name1 (fst0, fst1, &env->active_fpu.fp_status); \ | |
| 2660 | + fsth0 = float32_ ## name1 (fsth0, fsth1, &env->active_fpu.fp_status); \ | |
| 2661 | + fst2 = float32_ ## name2 (fst0, fst2, &env->active_fpu.fp_status); \ | |
| 2662 | + fsth2 = float32_ ## name2 (fsth0, fsth2, &env->active_fpu.fp_status); \ | |
| 2663 | 2663 | fst2 = float32_chs(fst2); \ |
| 2664 | 2664 | fsth2 = float32_chs(fsth2); \ |
| 2665 | 2665 | return ((uint64_t)fsth2 << 32) | fst2; \ |
| ... | ... | @@ -2672,18 +2672,18 @@ FLOAT_NTERNOP(mul, sub) |
| 2672 | 2672 | /* MIPS specific binary operations */ |
| 2673 | 2673 | uint64_t do_float_recip2_d(uint64_t fdt0, uint64_t fdt2) |
| 2674 | 2674 | { |
| 2675 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2676 | - fdt2 = float64_mul(fdt0, fdt2, &env->fpu->fp_status); | |
| 2677 | - fdt2 = float64_chs(float64_sub(fdt2, FLOAT_ONE64, &env->fpu->fp_status)); | |
| 2675 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2676 | + fdt2 = float64_mul(fdt0, fdt2, &env->active_fpu.fp_status); | |
| 2677 | + fdt2 = float64_chs(float64_sub(fdt2, FLOAT_ONE64, &env->active_fpu.fp_status)); | |
| 2678 | 2678 | update_fcr31(); |
| 2679 | 2679 | return fdt2; |
| 2680 | 2680 | } |
| 2681 | 2681 | |
| 2682 | 2682 | uint32_t do_float_recip2_s(uint32_t fst0, uint32_t fst2) |
| 2683 | 2683 | { |
| 2684 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2685 | - fst2 = float32_mul(fst0, fst2, &env->fpu->fp_status); | |
| 2686 | - fst2 = float32_chs(float32_sub(fst2, FLOAT_ONE32, &env->fpu->fp_status)); | |
| 2684 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2685 | + fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); | |
| 2686 | + fst2 = float32_chs(float32_sub(fst2, FLOAT_ONE32, &env->active_fpu.fp_status)); | |
| 2687 | 2687 | update_fcr31(); |
| 2688 | 2688 | return fst2; |
| 2689 | 2689 | } |
| ... | ... | @@ -2695,31 +2695,31 @@ uint64_t do_float_recip2_ps(uint64_t fdt0, uint64_t fdt2) |
| 2695 | 2695 | uint32_t fst2 = fdt2 & 0XFFFFFFFF; |
| 2696 | 2696 | uint32_t fsth2 = fdt2 >> 32; |
| 2697 | 2697 | |
| 2698 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2699 | - fst2 = float32_mul(fst0, fst2, &env->fpu->fp_status); | |
| 2700 | - fsth2 = float32_mul(fsth0, fsth2, &env->fpu->fp_status); | |
| 2701 | - fst2 = float32_chs(float32_sub(fst2, FLOAT_ONE32, &env->fpu->fp_status)); | |
| 2702 | - fsth2 = float32_chs(float32_sub(fsth2, FLOAT_ONE32, &env->fpu->fp_status)); | |
| 2698 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2699 | + fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); | |
| 2700 | + fsth2 = float32_mul(fsth0, fsth2, &env->active_fpu.fp_status); | |
| 2701 | + fst2 = float32_chs(float32_sub(fst2, FLOAT_ONE32, &env->active_fpu.fp_status)); | |
| 2702 | + fsth2 = float32_chs(float32_sub(fsth2, FLOAT_ONE32, &env->active_fpu.fp_status)); | |
| 2703 | 2703 | update_fcr31(); |
| 2704 | 2704 | return ((uint64_t)fsth2 << 32) | fst2; |
| 2705 | 2705 | } |
| 2706 | 2706 | |
| 2707 | 2707 | uint64_t do_float_rsqrt2_d(uint64_t fdt0, uint64_t fdt2) |
| 2708 | 2708 | { |
| 2709 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2710 | - fdt2 = float64_mul(fdt0, fdt2, &env->fpu->fp_status); | |
| 2711 | - fdt2 = float64_sub(fdt2, FLOAT_ONE64, &env->fpu->fp_status); | |
| 2712 | - fdt2 = float64_chs(float64_div(fdt2, FLOAT_TWO64, &env->fpu->fp_status)); | |
| 2709 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2710 | + fdt2 = float64_mul(fdt0, fdt2, &env->active_fpu.fp_status); | |
| 2711 | + fdt2 = float64_sub(fdt2, FLOAT_ONE64, &env->active_fpu.fp_status); | |
| 2712 | + fdt2 = float64_chs(float64_div(fdt2, FLOAT_TWO64, &env->active_fpu.fp_status)); | |
| 2713 | 2713 | update_fcr31(); |
| 2714 | 2714 | return fdt2; |
| 2715 | 2715 | } |
| 2716 | 2716 | |
| 2717 | 2717 | uint32_t do_float_rsqrt2_s(uint32_t fst0, uint32_t fst2) |
| 2718 | 2718 | { |
| 2719 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2720 | - fst2 = float32_mul(fst0, fst2, &env->fpu->fp_status); | |
| 2721 | - fst2 = float32_sub(fst2, FLOAT_ONE32, &env->fpu->fp_status); | |
| 2722 | - fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, &env->fpu->fp_status)); | |
| 2719 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2720 | + fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); | |
| 2721 | + fst2 = float32_sub(fst2, FLOAT_ONE32, &env->active_fpu.fp_status); | |
| 2722 | + fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, &env->active_fpu.fp_status)); | |
| 2723 | 2723 | update_fcr31(); |
| 2724 | 2724 | return fst2; |
| 2725 | 2725 | } |
| ... | ... | @@ -2731,13 +2731,13 @@ uint64_t do_float_rsqrt2_ps(uint64_t fdt0, uint64_t fdt2) |
| 2731 | 2731 | uint32_t fst2 = fdt2 & 0XFFFFFFFF; |
| 2732 | 2732 | uint32_t fsth2 = fdt2 >> 32; |
| 2733 | 2733 | |
| 2734 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2735 | - fst2 = float32_mul(fst0, fst2, &env->fpu->fp_status); | |
| 2736 | - fsth2 = float32_mul(fsth0, fsth2, &env->fpu->fp_status); | |
| 2737 | - fst2 = float32_sub(fst2, FLOAT_ONE32, &env->fpu->fp_status); | |
| 2738 | - fsth2 = float32_sub(fsth2, FLOAT_ONE32, &env->fpu->fp_status); | |
| 2739 | - fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, &env->fpu->fp_status)); | |
| 2740 | - fsth2 = float32_chs(float32_div(fsth2, FLOAT_TWO32, &env->fpu->fp_status)); | |
| 2734 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2735 | + fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); | |
| 2736 | + fsth2 = float32_mul(fsth0, fsth2, &env->active_fpu.fp_status); | |
| 2737 | + fst2 = float32_sub(fst2, FLOAT_ONE32, &env->active_fpu.fp_status); | |
| 2738 | + fsth2 = float32_sub(fsth2, FLOAT_ONE32, &env->active_fpu.fp_status); | |
| 2739 | + fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, &env->active_fpu.fp_status)); | |
| 2740 | + fsth2 = float32_chs(float32_div(fsth2, FLOAT_TWO32, &env->active_fpu.fp_status)); | |
| 2741 | 2741 | update_fcr31(); |
| 2742 | 2742 | return ((uint64_t)fsth2 << 32) | fst2; |
| 2743 | 2743 | } |
| ... | ... | @@ -2751,9 +2751,9 @@ uint64_t do_float_addr_ps(uint64_t fdt0, uint64_t fdt1) |
| 2751 | 2751 | uint32_t fst2; |
| 2752 | 2752 | uint32_t fsth2; |
| 2753 | 2753 | |
| 2754 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2755 | - fst2 = float32_add (fst0, fsth0, &env->fpu->fp_status); | |
| 2756 | - fsth2 = float32_add (fst1, fsth1, &env->fpu->fp_status); | |
| 2754 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2755 | + fst2 = float32_add (fst0, fsth0, &env->active_fpu.fp_status); | |
| 2756 | + fsth2 = float32_add (fst1, fsth1, &env->active_fpu.fp_status); | |
| 2757 | 2757 | update_fcr31(); |
| 2758 | 2758 | return ((uint64_t)fsth2 << 32) | fst2; |
| 2759 | 2759 | } |
| ... | ... | @@ -2767,9 +2767,9 @@ uint64_t do_float_mulr_ps(uint64_t fdt0, uint64_t fdt1) |
| 2767 | 2767 | uint32_t fst2; |
| 2768 | 2768 | uint32_t fsth2; |
| 2769 | 2769 | |
| 2770 | - set_float_exception_flags(0, &env->fpu->fp_status); | |
| 2771 | - fst2 = float32_mul (fst0, fsth0, &env->fpu->fp_status); | |
| 2772 | - fsth2 = float32_mul (fst1, fsth1, &env->fpu->fp_status); | |
| 2770 | + set_float_exception_flags(0, &env->active_fpu.fp_status); | |
| 2771 | + fst2 = float32_mul (fst0, fsth0, &env->active_fpu.fp_status); | |
| 2772 | + fsth2 = float32_mul (fst1, fsth1, &env->active_fpu.fp_status); | |
| 2773 | 2773 | update_fcr31(); |
| 2774 | 2774 | return ((uint64_t)fsth2 << 32) | fst2; |
| 2775 | 2775 | } |
| ... | ... | @@ -2781,9 +2781,9 @@ void do_cmp_d_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ |
| 2781 | 2781 | int c = cond; \ |
| 2782 | 2782 | update_fcr31(); \ |
| 2783 | 2783 | if (c) \ |
| 2784 | - SET_FP_COND(cc, env->fpu); \ | |
| 2784 | + SET_FP_COND(cc, env->active_fpu); \ | |
| 2785 | 2785 | else \ |
| 2786 | - CLEAR_FP_COND(cc, env->fpu); \ | |
| 2786 | + CLEAR_FP_COND(cc, env->active_fpu); \ | |
| 2787 | 2787 | } \ |
| 2788 | 2788 | void do_cmpabs_d_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ |
| 2789 | 2789 | { \ |
| ... | ... | @@ -2793,9 +2793,9 @@ void do_cmpabs_d_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ |
| 2793 | 2793 | c = cond; \ |
| 2794 | 2794 | update_fcr31(); \ |
| 2795 | 2795 | if (c) \ |
| 2796 | - SET_FP_COND(cc, env->fpu); \ | |
| 2796 | + SET_FP_COND(cc, env->active_fpu); \ | |
| 2797 | 2797 | else \ |
| 2798 | - CLEAR_FP_COND(cc, env->fpu); \ | |
| 2798 | + CLEAR_FP_COND(cc, env->active_fpu); \ | |
| 2799 | 2799 | } |
| 2800 | 2800 | |
| 2801 | 2801 | int float64_is_unordered(int sig, float64 a, float64 b STATUS_PARAM) |
| ... | ... | @@ -2814,24 +2814,24 @@ int float64_is_unordered(int sig, float64 a, float64 b STATUS_PARAM) |
| 2814 | 2814 | |
| 2815 | 2815 | /* NOTE: the comma operator will make "cond" to eval to false, |
| 2816 | 2816 | * but float*_is_unordered() is still called. */ |
| 2817 | -FOP_COND_D(f, (float64_is_unordered(0, fdt1, fdt0, &env->fpu->fp_status), 0)) | |
| 2818 | -FOP_COND_D(un, float64_is_unordered(0, fdt1, fdt0, &env->fpu->fp_status)) | |
| 2819 | -FOP_COND_D(eq, !float64_is_unordered(0, fdt1, fdt0, &env->fpu->fp_status) && float64_eq(fdt0, fdt1, &env->fpu->fp_status)) | |
| 2820 | -FOP_COND_D(ueq, float64_is_unordered(0, fdt1, fdt0, &env->fpu->fp_status) || float64_eq(fdt0, fdt1, &env->fpu->fp_status)) | |
| 2821 | -FOP_COND_D(olt, !float64_is_unordered(0, fdt1, fdt0, &env->fpu->fp_status) && float64_lt(fdt0, fdt1, &env->fpu->fp_status)) | |
| 2822 | -FOP_COND_D(ult, float64_is_unordered(0, fdt1, fdt0, &env->fpu->fp_status) || float64_lt(fdt0, fdt1, &env->fpu->fp_status)) | |
| 2823 | -FOP_COND_D(ole, !float64_is_unordered(0, fdt1, fdt0, &env->fpu->fp_status) && float64_le(fdt0, fdt1, &env->fpu->fp_status)) | |
| 2824 | -FOP_COND_D(ule, float64_is_unordered(0, fdt1, fdt0, &env->fpu->fp_status) || float64_le(fdt0, fdt1, &env->fpu->fp_status)) | |
| 2817 | +FOP_COND_D(f, (float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status), 0)) | |
| 2818 | +FOP_COND_D(un, float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status)) | |
| 2819 | +FOP_COND_D(eq, !float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status) && float64_eq(fdt0, fdt1, &env->active_fpu.fp_status)) | |
| 2820 | +FOP_COND_D(ueq, float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status) || float64_eq(fdt0, fdt1, &env->active_fpu.fp_status)) | |
| 2821 | +FOP_COND_D(olt, !float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status) && float64_lt(fdt0, fdt1, &env->active_fpu.fp_status)) | |
| 2822 | +FOP_COND_D(ult, float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status) || float64_lt(fdt0, fdt1, &env->active_fpu.fp_status)) | |
| 2823 | +FOP_COND_D(ole, !float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status) && float64_le(fdt0, fdt1, &env->active_fpu.fp_status)) | |
| 2824 | +FOP_COND_D(ule, float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status) || float64_le(fdt0, fdt1, &env->active_fpu.fp_status)) | |
| 2825 | 2825 | /* NOTE: the comma operator will make "cond" to eval to false, |
| 2826 | 2826 | * but float*_is_unordered() is still called. */ |
| 2827 | -FOP_COND_D(sf, (float64_is_unordered(1, fdt1, fdt0, &env->fpu->fp_status), 0)) | |
| 2828 | -FOP_COND_D(ngle,float64_is_unordered(1, fdt1, fdt0, &env->fpu->fp_status)) | |
| 2829 | -FOP_COND_D(seq, !float64_is_unordered(1, fdt1, fdt0, &env->fpu->fp_status) && float64_eq(fdt0, fdt1, &env->fpu->fp_status)) | |
| 2830 | -FOP_COND_D(ngl, float64_is_unordered(1, fdt1, fdt0, &env->fpu->fp_status) || float64_eq(fdt0, fdt1, &env->fpu->fp_status)) | |
| 2831 | -FOP_COND_D(lt, !float64_is_unordered(1, fdt1, fdt0, &env->fpu->fp_status) && float64_lt(fdt0, fdt1, &env->fpu->fp_status)) | |
| 2832 | -FOP_COND_D(nge, float64_is_unordered(1, fdt1, fdt0, &env->fpu->fp_status) || float64_lt(fdt0, fdt1, &env->fpu->fp_status)) | |
| 2833 | -FOP_COND_D(le, !float64_is_unordered(1, fdt1, fdt0, &env->fpu->fp_status) && float64_le(fdt0, fdt1, &env->fpu->fp_status)) | |
| 2834 | -FOP_COND_D(ngt, float64_is_unordered(1, fdt1, fdt0, &env->fpu->fp_status) || float64_le(fdt0, fdt1, &env->fpu->fp_status)) | |
| 2827 | +FOP_COND_D(sf, (float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status), 0)) | |
| 2828 | +FOP_COND_D(ngle,float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status)) | |
| 2829 | +FOP_COND_D(seq, !float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status) && float64_eq(fdt0, fdt1, &env->active_fpu.fp_status)) | |
| 2830 | +FOP_COND_D(ngl, float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status) || float64_eq(fdt0, fdt1, &env->active_fpu.fp_status)) | |
| 2831 | +FOP_COND_D(lt, !float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status) && float64_lt(fdt0, fdt1, &env->active_fpu.fp_status)) | |
| 2832 | +FOP_COND_D(nge, float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status) || float64_lt(fdt0, fdt1, &env->active_fpu.fp_status)) | |
| 2833 | +FOP_COND_D(le, !float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status) && float64_le(fdt0, fdt1, &env->active_fpu.fp_status)) | |
| 2834 | +FOP_COND_D(ngt, float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status) || float64_le(fdt0, fdt1, &env->active_fpu.fp_status)) | |
| 2835 | 2835 | |
| 2836 | 2836 | #define FOP_COND_S(op, cond) \ |
| 2837 | 2837 | void do_cmp_s_ ## op (uint32_t fst0, uint32_t fst1, int cc) \ |
| ... | ... | @@ -2839,9 +2839,9 @@ void do_cmp_s_ ## op (uint32_t fst0, uint32_t fst1, int cc) \ |
| 2839 | 2839 | int c = cond; \ |
| 2840 | 2840 | update_fcr31(); \ |
| 2841 | 2841 | if (c) \ |
| 2842 | - SET_FP_COND(cc, env->fpu); \ | |
| 2842 | + SET_FP_COND(cc, env->active_fpu); \ | |
| 2843 | 2843 | else \ |
| 2844 | - CLEAR_FP_COND(cc, env->fpu); \ | |
| 2844 | + CLEAR_FP_COND(cc, env->active_fpu); \ | |
| 2845 | 2845 | } \ |
| 2846 | 2846 | void do_cmpabs_s_ ## op (uint32_t fst0, uint32_t fst1, int cc) \ |
| 2847 | 2847 | { \ |
| ... | ... | @@ -2851,9 +2851,9 @@ void do_cmpabs_s_ ## op (uint32_t fst0, uint32_t fst1, int cc) \ |
| 2851 | 2851 | c = cond; \ |
| 2852 | 2852 | update_fcr31(); \ |
| 2853 | 2853 | if (c) \ |
| 2854 | - SET_FP_COND(cc, env->fpu); \ | |
| 2854 | + SET_FP_COND(cc, env->active_fpu); \ | |
| 2855 | 2855 | else \ |
| 2856 | - CLEAR_FP_COND(cc, env->fpu); \ | |
| 2856 | + CLEAR_FP_COND(cc, env->active_fpu); \ | |
| 2857 | 2857 | } |
| 2858 | 2858 | |
| 2859 | 2859 | flag float32_is_unordered(int sig, float32 a, float32 b STATUS_PARAM) |
| ... | ... | @@ -2872,24 +2872,24 @@ flag float32_is_unordered(int sig, float32 a, float32 b STATUS_PARAM) |
| 2872 | 2872 | |
| 2873 | 2873 | /* NOTE: the comma operator will make "cond" to eval to false, |
| 2874 | 2874 | * but float*_is_unordered() is still called. */ |
| 2875 | -FOP_COND_S(f, (float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status), 0)) | |
| 2876 | -FOP_COND_S(un, float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status)) | |
| 2877 | -FOP_COND_S(eq, !float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) && float32_eq(fst0, fst1, &env->fpu->fp_status)) | |
| 2878 | -FOP_COND_S(ueq, float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) || float32_eq(fst0, fst1, &env->fpu->fp_status)) | |
| 2879 | -FOP_COND_S(olt, !float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) && float32_lt(fst0, fst1, &env->fpu->fp_status)) | |
| 2880 | -FOP_COND_S(ult, float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) || float32_lt(fst0, fst1, &env->fpu->fp_status)) | |
| 2881 | -FOP_COND_S(ole, !float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) && float32_le(fst0, fst1, &env->fpu->fp_status)) | |
| 2882 | -FOP_COND_S(ule, float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) || float32_le(fst0, fst1, &env->fpu->fp_status)) | |
| 2875 | +FOP_COND_S(f, (float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status), 0)) | |
| 2876 | +FOP_COND_S(un, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status)) | |
| 2877 | +FOP_COND_S(eq, !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) && float32_eq(fst0, fst1, &env->active_fpu.fp_status)) | |
| 2878 | +FOP_COND_S(ueq, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) || float32_eq(fst0, fst1, &env->active_fpu.fp_status)) | |
| 2879 | +FOP_COND_S(olt, !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) && float32_lt(fst0, fst1, &env->active_fpu.fp_status)) | |
| 2880 | +FOP_COND_S(ult, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) || float32_lt(fst0, fst1, &env->active_fpu.fp_status)) | |
| 2881 | +FOP_COND_S(ole, !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) && float32_le(fst0, fst1, &env->active_fpu.fp_status)) | |
| 2882 | +FOP_COND_S(ule, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) || float32_le(fst0, fst1, &env->active_fpu.fp_status)) | |
| 2883 | 2883 | /* NOTE: the comma operator will make "cond" to eval to false, |
| 2884 | 2884 | * but float*_is_unordered() is still called. */ |
| 2885 | -FOP_COND_S(sf, (float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status), 0)) | |
| 2886 | -FOP_COND_S(ngle,float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status)) | |
| 2887 | -FOP_COND_S(seq, !float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) && float32_eq(fst0, fst1, &env->fpu->fp_status)) | |
| 2888 | -FOP_COND_S(ngl, float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) || float32_eq(fst0, fst1, &env->fpu->fp_status)) | |
| 2889 | -FOP_COND_S(lt, !float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) && float32_lt(fst0, fst1, &env->fpu->fp_status)) | |
| 2890 | -FOP_COND_S(nge, float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) || float32_lt(fst0, fst1, &env->fpu->fp_status)) | |
| 2891 | -FOP_COND_S(le, !float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) && float32_le(fst0, fst1, &env->fpu->fp_status)) | |
| 2892 | -FOP_COND_S(ngt, float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) || float32_le(fst0, fst1, &env->fpu->fp_status)) | |
| 2885 | +FOP_COND_S(sf, (float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status), 0)) | |
| 2886 | +FOP_COND_S(ngle,float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status)) | |
| 2887 | +FOP_COND_S(seq, !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) && float32_eq(fst0, fst1, &env->active_fpu.fp_status)) | |
| 2888 | +FOP_COND_S(ngl, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) || float32_eq(fst0, fst1, &env->active_fpu.fp_status)) | |
| 2889 | +FOP_COND_S(lt, !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) && float32_lt(fst0, fst1, &env->active_fpu.fp_status)) | |
| 2890 | +FOP_COND_S(nge, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) || float32_lt(fst0, fst1, &env->active_fpu.fp_status)) | |
| 2891 | +FOP_COND_S(le, !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) && float32_le(fst0, fst1, &env->active_fpu.fp_status)) | |
| 2892 | +FOP_COND_S(ngt, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) || float32_le(fst0, fst1, &env->active_fpu.fp_status)) | |
| 2893 | 2893 | |
| 2894 | 2894 | #define FOP_COND_PS(op, condl, condh) \ |
| 2895 | 2895 | void do_cmp_ps_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ |
| ... | ... | @@ -2903,13 +2903,13 @@ void do_cmp_ps_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ |
| 2903 | 2903 | \ |
| 2904 | 2904 | update_fcr31(); \ |
| 2905 | 2905 | if (cl) \ |
| 2906 | - SET_FP_COND(cc, env->fpu); \ | |
| 2906 | + SET_FP_COND(cc, env->active_fpu); \ | |
| 2907 | 2907 | else \ |
| 2908 | - CLEAR_FP_COND(cc, env->fpu); \ | |
| 2908 | + CLEAR_FP_COND(cc, env->active_fpu); \ | |
| 2909 | 2909 | if (ch) \ |
| 2910 | - SET_FP_COND(cc + 1, env->fpu); \ | |
| 2910 | + SET_FP_COND(cc + 1, env->active_fpu); \ | |
| 2911 | 2911 | else \ |
| 2912 | - CLEAR_FP_COND(cc + 1, env->fpu); \ | |
| 2912 | + CLEAR_FP_COND(cc + 1, env->active_fpu); \ | |
| 2913 | 2913 | } \ |
| 2914 | 2914 | void do_cmpabs_ps_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ |
| 2915 | 2915 | { \ |
| ... | ... | @@ -2922,48 +2922,48 @@ void do_cmpabs_ps_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ |
| 2922 | 2922 | \ |
| 2923 | 2923 | update_fcr31(); \ |
| 2924 | 2924 | if (cl) \ |
| 2925 | - SET_FP_COND(cc, env->fpu); \ | |
| 2925 | + SET_FP_COND(cc, env->active_fpu); \ | |
| 2926 | 2926 | else \ |
| 2927 | - CLEAR_FP_COND(cc, env->fpu); \ | |
| 2927 | + CLEAR_FP_COND(cc, env->active_fpu); \ | |
| 2928 | 2928 | if (ch) \ |
| 2929 | - SET_FP_COND(cc + 1, env->fpu); \ | |
| 2929 | + SET_FP_COND(cc + 1, env->active_fpu); \ | |
| 2930 | 2930 | else \ |
| 2931 | - CLEAR_FP_COND(cc + 1, env->fpu); \ | |
| 2931 | + CLEAR_FP_COND(cc + 1, env->active_fpu); \ | |
| 2932 | 2932 | } |
| 2933 | 2933 | |
| 2934 | 2934 | /* NOTE: the comma operator will make "cond" to eval to false, |
| 2935 | 2935 | * but float*_is_unordered() is still called. */ |
| 2936 | -FOP_COND_PS(f, (float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status), 0), | |
| 2937 | - (float32_is_unordered(0, fsth1, fsth0, &env->fpu->fp_status), 0)) | |
| 2938 | -FOP_COND_PS(un, float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status), | |
| 2939 | - float32_is_unordered(0, fsth1, fsth0, &env->fpu->fp_status)) | |
| 2940 | -FOP_COND_PS(eq, !float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) && float32_eq(fst0, fst1, &env->fpu->fp_status), | |
| 2941 | - !float32_is_unordered(0, fsth1, fsth0, &env->fpu->fp_status) && float32_eq(fsth0, fsth1, &env->fpu->fp_status)) | |
| 2942 | -FOP_COND_PS(ueq, float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) || float32_eq(fst0, fst1, &env->fpu->fp_status), | |
| 2943 | - float32_is_unordered(0, fsth1, fsth0, &env->fpu->fp_status) || float32_eq(fsth0, fsth1, &env->fpu->fp_status)) | |
| 2944 | -FOP_COND_PS(olt, !float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) && float32_lt(fst0, fst1, &env->fpu->fp_status), | |
| 2945 | - !float32_is_unordered(0, fsth1, fsth0, &env->fpu->fp_status) && float32_lt(fsth0, fsth1, &env->fpu->fp_status)) | |
| 2946 | -FOP_COND_PS(ult, float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) || float32_lt(fst0, fst1, &env->fpu->fp_status), | |
| 2947 | - float32_is_unordered(0, fsth1, fsth0, &env->fpu->fp_status) || float32_lt(fsth0, fsth1, &env->fpu->fp_status)) | |
| 2948 | -FOP_COND_PS(ole, !float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) && float32_le(fst0, fst1, &env->fpu->fp_status), | |
| 2949 | - !float32_is_unordered(0, fsth1, fsth0, &env->fpu->fp_status) && float32_le(fsth0, fsth1, &env->fpu->fp_status)) | |
| 2950 | -FOP_COND_PS(ule, float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) || float32_le(fst0, fst1, &env->fpu->fp_status), | |
| 2951 | - float32_is_unordered(0, fsth1, fsth0, &env->fpu->fp_status) || float32_le(fsth0, fsth1, &env->fpu->fp_status)) | |
| 2936 | +FOP_COND_PS(f, (float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status), 0), | |
| 2937 | + (float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status), 0)) | |
| 2938 | +FOP_COND_PS(un, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status), | |
| 2939 | + float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status)) | |
| 2940 | +FOP_COND_PS(eq, !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) && float32_eq(fst0, fst1, &env->active_fpu.fp_status), | |
| 2941 | + !float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status) && float32_eq(fsth0, fsth1, &env->active_fpu.fp_status)) | |
| 2942 | +FOP_COND_PS(ueq, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) || float32_eq(fst0, fst1, &env->active_fpu.fp_status), | |
| 2943 | + float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status) || float32_eq(fsth0, fsth1, &env->active_fpu.fp_status)) | |
| 2944 | +FOP_COND_PS(olt, !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) && float32_lt(fst0, fst1, &env->active_fpu.fp_status), | |
| 2945 | + !float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status) && float32_lt(fsth0, fsth1, &env->active_fpu.fp_status)) | |
| 2946 | +FOP_COND_PS(ult, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) || float32_lt(fst0, fst1, &env->active_fpu.fp_status), | |
| 2947 | + float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status) || float32_lt(fsth0, fsth1, &env->active_fpu.fp_status)) | |
| 2948 | +FOP_COND_PS(ole, !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) && float32_le(fst0, fst1, &env->active_fpu.fp_status), | |
| 2949 | + !float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status) && float32_le(fsth0, fsth1, &env->active_fpu.fp_status)) | |
| 2950 | +FOP_COND_PS(ule, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) || float32_le(fst0, fst1, &env->active_fpu.fp_status), | |
| 2951 | + float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status) || float32_le(fsth0, fsth1, &env->active_fpu.fp_status)) | |
| 2952 | 2952 | /* NOTE: the comma operator will make "cond" to eval to false, |
| 2953 | 2953 | * but float*_is_unordered() is still called. */ |
| 2954 | -FOP_COND_PS(sf, (float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status), 0), | |
| 2955 | - (float32_is_unordered(1, fsth1, fsth0, &env->fpu->fp_status), 0)) | |
| 2956 | -FOP_COND_PS(ngle,float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status), | |
| 2957 | - float32_is_unordered(1, fsth1, fsth0, &env->fpu->fp_status)) | |
| 2958 | -FOP_COND_PS(seq, !float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) && float32_eq(fst0, fst1, &env->fpu->fp_status), | |
| 2959 | - !float32_is_unordered(1, fsth1, fsth0, &env->fpu->fp_status) && float32_eq(fsth0, fsth1, &env->fpu->fp_status)) | |
| 2960 | -FOP_COND_PS(ngl, float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) || float32_eq(fst0, fst1, &env->fpu->fp_status), | |
| 2961 | - float32_is_unordered(1, fsth1, fsth0, &env->fpu->fp_status) || float32_eq(fsth0, fsth1, &env->fpu->fp_status)) | |
| 2962 | -FOP_COND_PS(lt, !float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) && float32_lt(fst0, fst1, &env->fpu->fp_status), | |
| 2963 | - !float32_is_unordered(1, fsth1, fsth0, &env->fpu->fp_status) && float32_lt(fsth0, fsth1, &env->fpu->fp_status)) | |
| 2964 | -FOP_COND_PS(nge, float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) || float32_lt(fst0, fst1, &env->fpu->fp_status), | |
| 2965 | - float32_is_unordered(1, fsth1, fsth0, &env->fpu->fp_status) || float32_lt(fsth0, fsth1, &env->fpu->fp_status)) | |
| 2966 | -FOP_COND_PS(le, !float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) && float32_le(fst0, fst1, &env->fpu->fp_status), | |
| 2967 | - !float32_is_unordered(1, fsth1, fsth0, &env->fpu->fp_status) && float32_le(fsth0, fsth1, &env->fpu->fp_status)) | |
| 2968 | -FOP_COND_PS(ngt, float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) || float32_le(fst0, fst1, &env->fpu->fp_status), | |
| 2969 | - float32_is_unordered(1, fsth1, fsth0, &env->fpu->fp_status) || float32_le(fsth0, fsth1, &env->fpu->fp_status)) | |
| 2954 | +FOP_COND_PS(sf, (float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status), 0), | |
| 2955 | + (float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status), 0)) | |
| 2956 | +FOP_COND_PS(ngle,float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status), | |
| 2957 | + float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status)) | |
| 2958 | +FOP_COND_PS(seq, !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) && float32_eq(fst0, fst1, &env->active_fpu.fp_status), | |
| 2959 | + !float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status) && float32_eq(fsth0, fsth1, &env->active_fpu.fp_status)) | |
| 2960 | +FOP_COND_PS(ngl, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) || float32_eq(fst0, fst1, &env->active_fpu.fp_status), | |
| 2961 | + float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status) || float32_eq(fsth0, fsth1, &env->active_fpu.fp_status)) | |
| 2962 | +FOP_COND_PS(lt, !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) && float32_lt(fst0, fst1, &env->active_fpu.fp_status), | |
| 2963 | + !float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status) && float32_lt(fsth0, fsth1, &env->active_fpu.fp_status)) | |
| 2964 | +FOP_COND_PS(nge, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) || float32_lt(fst0, fst1, &env->active_fpu.fp_status), | |
| 2965 | + float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status) || float32_lt(fsth0, fsth1, &env->active_fpu.fp_status)) | |
| 2966 | +FOP_COND_PS(le, !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) && float32_le(fst0, fst1, &env->active_fpu.fp_status), | |
| 2967 | + !float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status) && float32_le(fsth0, fsth1, &env->active_fpu.fp_status)) | |
| 2968 | +FOP_COND_PS(ngt, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) || float32_le(fst0, fst1, &env->active_fpu.fp_status), | |
| 2969 | + float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status) || float32_le(fsth0, fsth1, &env->active_fpu.fp_status)) | ... | ... |
target-mips/translate.c
| ... | ... | @@ -423,7 +423,8 @@ enum { |
| 423 | 423 | }; |
| 424 | 424 | |
| 425 | 425 | /* global register indices */ |
| 426 | -static TCGv cpu_env, bcond, btarget, current_fpu; | |
| 426 | +static TCGv cpu_env, bcond, btarget; | |
| 427 | +static TCGv fpu_fpr32[32], fpu_fpr32h[32], fpu_fpr64[32], fpu_fcr0, fpu_fcr31; | |
| 427 | 428 | |
| 428 | 429 | #include "gen-icount.h" |
| 429 | 430 | |
| ... | ... | @@ -547,6 +548,18 @@ static const char *fregnames[] = |
| 547 | 548 | "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", |
| 548 | 549 | "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", }; |
| 549 | 550 | |
| 551 | +static const char *fregnames_64[] = | |
| 552 | + { "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", | |
| 553 | + "F8", "F9", "F10", "F11", "F12", "F13", "F14", "F15", | |
| 554 | + "F16", "F17", "F18", "F19", "F20", "F21", "F22", "F23", | |
| 555 | + "F24", "F25", "F26", "F27", "F28", "F29", "F30", "F31", }; | |
| 556 | + | |
| 557 | +static const char *fregnames_h[] = | |
| 558 | + { "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7", | |
| 559 | + "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15", | |
| 560 | + "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23", | |
| 561 | + "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31", }; | |
| 562 | + | |
| 550 | 563 | #ifdef MIPS_DEBUG_DISAS |
| 551 | 564 | #define MIPS_DEBUG(fmt, args...) \ |
| 552 | 565 | do { \ |
| ... | ... | @@ -652,57 +665,48 @@ static inline void gen_store_srsgpr (int from, int to) |
| 652 | 665 | /* Floating point register moves. */ |
| 653 | 666 | static inline void gen_load_fpr32 (TCGv t, int reg) |
| 654 | 667 | { |
| 655 | - tcg_gen_ld_i32(t, current_fpu, 8 * reg + 4 * FP_ENDIAN_IDX); | |
| 668 | + tcg_gen_mov_i32(t, fpu_fpr32[reg]); | |
| 656 | 669 | } |
| 657 | 670 | |
| 658 | 671 | static inline void gen_store_fpr32 (TCGv t, int reg) |
| 659 | 672 | { |
| 660 | - tcg_gen_st_i32(t, current_fpu, 8 * reg + 4 * FP_ENDIAN_IDX); | |
| 673 | + tcg_gen_mov_i32(fpu_fpr32[reg], t); | |
| 661 | 674 | } |
| 662 | 675 | |
| 663 | 676 | static inline void gen_load_fpr64 (DisasContext *ctx, TCGv t, int reg) |
| 664 | 677 | { |
| 665 | - if (ctx->hflags & MIPS_HFLAG_F64) { | |
| 666 | - tcg_gen_ld_i64(t, current_fpu, 8 * reg); | |
| 667 | - } else { | |
| 668 | - TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32); | |
| 678 | + if (ctx->hflags & MIPS_HFLAG_F64) | |
| 679 | + tcg_gen_mov_i64(t, fpu_fpr64[reg]); | |
| 680 | + else { | |
| 669 | 681 | TCGv r_tmp2 = tcg_temp_new(TCG_TYPE_I64); |
| 670 | 682 | |
| 671 | - tcg_gen_ld_i32(r_tmp1, current_fpu, 8 * (reg | 1) + 4 * FP_ENDIAN_IDX); | |
| 672 | - tcg_gen_extu_i32_i64(t, r_tmp1); | |
| 683 | + tcg_gen_extu_i32_i64(t, fpu_fpr32[reg | 1]); | |
| 673 | 684 | tcg_gen_shli_i64(t, t, 32); |
| 674 | - tcg_gen_ld_i32(r_tmp1, current_fpu, 8 * (reg & ~1) + 4 * FP_ENDIAN_IDX); | |
| 675 | - tcg_gen_extu_i32_i64(r_tmp2, r_tmp1); | |
| 685 | + tcg_gen_extu_i32_i64(r_tmp2, fpu_fpr32[reg & ~1]); | |
| 676 | 686 | tcg_gen_or_i64(t, t, r_tmp2); |
| 677 | - tcg_temp_free(r_tmp1); | |
| 678 | 687 | tcg_temp_free(r_tmp2); |
| 679 | 688 | } |
| 680 | 689 | } |
| 681 | 690 | |
| 682 | 691 | static inline void gen_store_fpr64 (DisasContext *ctx, TCGv t, int reg) |
| 683 | 692 | { |
| 684 | - if (ctx->hflags & MIPS_HFLAG_F64) { | |
| 685 | - tcg_gen_st_i64(t, current_fpu, 8 * reg); | |
| 686 | - } else { | |
| 687 | - TCGv r_tmp = tcg_temp_new(TCG_TYPE_I32); | |
| 688 | - | |
| 689 | - tcg_gen_trunc_i64_i32(r_tmp, t); | |
| 690 | - tcg_gen_st_i32(r_tmp, current_fpu, 8 * (reg & ~1) + 4 * FP_ENDIAN_IDX); | |
| 693 | + if (ctx->hflags & MIPS_HFLAG_F64) | |
| 694 | + tcg_gen_mov_i64(fpu_fpr64[reg], t); | |
| 695 | + else { | |
| 696 | + tcg_gen_trunc_i64_i32(fpu_fpr32[reg & ~1], t); | |
| 691 | 697 | tcg_gen_shri_i64(t, t, 32); |
| 692 | - tcg_gen_trunc_i64_i32(r_tmp, t); | |
| 693 | - tcg_gen_st_i32(r_tmp, current_fpu, 8 * (reg | 1) + 4 * FP_ENDIAN_IDX); | |
| 694 | - tcg_temp_free(r_tmp); | |
| 698 | + tcg_gen_trunc_i64_i32(fpu_fpr32[reg | 1], t); | |
| 695 | 699 | } |
| 696 | 700 | } |
| 697 | 701 | |
| 698 | 702 | static inline void gen_load_fpr32h (TCGv t, int reg) |
| 699 | 703 | { |
| 700 | - tcg_gen_ld_i32(t, current_fpu, 8 * reg + 4 * !FP_ENDIAN_IDX); | |
| 704 | + tcg_gen_mov_i32(t, fpu_fpr32h[reg]); | |
| 701 | 705 | } |
| 702 | 706 | |
| 703 | 707 | static inline void gen_store_fpr32h (TCGv t, int reg) |
| 704 | 708 | { |
| 705 | - tcg_gen_st_i32(t, current_fpu, 8 * reg + 4 * !FP_ENDIAN_IDX); | |
| 709 | + tcg_gen_mov_i32(fpu_fpr32h[reg], t); | |
| 706 | 710 | } |
| 707 | 711 | |
| 708 | 712 | static inline void get_fp_cond (TCGv t) |
| ... | ... | @@ -710,10 +714,9 @@ static inline void get_fp_cond (TCGv t) |
| 710 | 714 | TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32); |
| 711 | 715 | TCGv r_tmp2 = tcg_temp_new(TCG_TYPE_I32); |
| 712 | 716 | |
| 713 | - tcg_gen_ld_i32(r_tmp1, current_fpu, offsetof(CPUMIPSFPUContext, fcr31)); | |
| 714 | - tcg_gen_shri_i32(r_tmp2, r_tmp1, 24); | |
| 717 | + tcg_gen_shri_i32(r_tmp2, fpu_fcr31, 24); | |
| 715 | 718 | tcg_gen_andi_i32(r_tmp2, r_tmp2, 0xfe); |
| 716 | - tcg_gen_shri_i32(r_tmp1, r_tmp1, 23); | |
| 719 | + tcg_gen_shri_i32(r_tmp1, fpu_fcr31, 23); | |
| 717 | 720 | tcg_gen_andi_i32(r_tmp1, r_tmp1, 0x1); |
| 718 | 721 | tcg_gen_or_i32(t, r_tmp1, r_tmp2); |
| 719 | 722 | tcg_temp_free(r_tmp1); |
| ... | ... | @@ -6009,8 +6012,7 @@ static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf) |
| 6009 | 6012 | |
| 6010 | 6013 | gen_load_gpr(t0, rd); |
| 6011 | 6014 | gen_load_gpr(t1, rs); |
| 6012 | - tcg_gen_ld_i32(r_tmp, current_fpu, offsetof(CPUMIPSFPUContext, fcr31)); | |
| 6013 | - tcg_gen_andi_i32(r_tmp, r_tmp, ccbit); | |
| 6015 | + tcg_gen_andi_i32(r_tmp, fpu_fcr31, ccbit); | |
| 6014 | 6016 | tcg_gen_brcondi_i32(cond, r_tmp, 0, l1); |
| 6015 | 6017 | tcg_temp_free(r_tmp); |
| 6016 | 6018 | |
| ... | ... | @@ -6043,8 +6045,7 @@ static inline void gen_movcf_s (int fs, int fd, int cc, int tf) |
| 6043 | 6045 | |
| 6044 | 6046 | gen_load_fpr32(fp0, fs); |
| 6045 | 6047 | gen_load_fpr32(fp1, fd); |
| 6046 | - tcg_gen_ld_i32(r_tmp1, current_fpu, offsetof(CPUMIPSFPUContext, fcr31)); | |
| 6047 | - tcg_gen_andi_i32(r_tmp1, r_tmp1, ccbit); | |
| 6048 | + tcg_gen_andi_i32(r_tmp1, fpu_fcr31, ccbit); | |
| 6048 | 6049 | tcg_gen_brcondi_i32(cond, r_tmp1, 0, l1); |
| 6049 | 6050 | tcg_gen_mov_i32(fp1, fp0); |
| 6050 | 6051 | tcg_temp_free(fp0); |
| ... | ... | @@ -6075,8 +6076,7 @@ static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int t |
| 6075 | 6076 | |
| 6076 | 6077 | gen_load_fpr64(ctx, fp0, fs); |
| 6077 | 6078 | gen_load_fpr64(ctx, fp1, fd); |
| 6078 | - tcg_gen_ld_i32(r_tmp1, current_fpu, offsetof(CPUMIPSFPUContext, fcr31)); | |
| 6079 | - tcg_gen_andi_i32(r_tmp1, r_tmp1, ccbit); | |
| 6079 | + tcg_gen_andi_i32(r_tmp1, fpu_fcr31, ccbit); | |
| 6080 | 6080 | tcg_gen_brcondi_i32(cond, r_tmp1, 0, l1); |
| 6081 | 6081 | tcg_gen_mov_i64(fp1, fp0); |
| 6082 | 6082 | tcg_temp_free(fp0); |
| ... | ... | @@ -8632,11 +8632,11 @@ static void fpu_dump_state(CPUState *env, FILE *f, |
| 8632 | 8632 | |
| 8633 | 8633 | |
| 8634 | 8634 | fpu_fprintf(f, "CP1 FCR0 0x%08x FCR31 0x%08x SR.FR %d fp_status 0x%08x(0x%02x)\n", |
| 8635 | - env->fpu->fcr0, env->fpu->fcr31, is_fpu64, env->fpu->fp_status, | |
| 8636 | - get_float_exception_flags(&env->fpu->fp_status)); | |
| 8635 | + env->active_fpu.fcr0, env->active_fpu.fcr31, is_fpu64, env->active_fpu.fp_status, | |
| 8636 | + get_float_exception_flags(&env->active_fpu.fp_status)); | |
| 8637 | 8637 | for (i = 0; i < 32; (is_fpu64) ? i++ : (i += 2)) { |
| 8638 | 8638 | fpu_fprintf(f, "%3s: ", fregnames[i]); |
| 8639 | - printfpr(&env->fpu->fpr[i]); | |
| 8639 | + printfpr(&env->active_fpu.fpr[i]); | |
| 8640 | 8640 | } |
| 8641 | 8641 | |
| 8642 | 8642 | #undef printfpr |
| ... | ... | @@ -8706,6 +8706,7 @@ void cpu_dump_state (CPUState *env, FILE *f, |
| 8706 | 8706 | |
| 8707 | 8707 | static void mips_tcg_init(void) |
| 8708 | 8708 | { |
| 8709 | + int i; | |
| 8709 | 8710 | static int inited; |
| 8710 | 8711 | |
| 8711 | 8712 | /* Initialize various static tables. */ |
| ... | ... | @@ -8717,10 +8718,24 @@ static void mips_tcg_init(void) |
| 8717 | 8718 | offsetof(CPUState, bcond), "bcond"); |
| 8718 | 8719 | btarget = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, |
| 8719 | 8720 | offsetof(CPUState, btarget), "btarget"); |
| 8720 | - current_fpu = tcg_global_mem_new(TCG_TYPE_PTR, | |
| 8721 | - TCG_AREG0, | |
| 8722 | - offsetof(CPUState, fpu), | |
| 8723 | - "current_fpu"); | |
| 8721 | + for (i = 0; i < 32; i++) | |
| 8722 | + fpu_fpr32[i] = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
| 8723 | + offsetof(CPUState, active_fpu.fpr[i].w[FP_ENDIAN_IDX]), | |
| 8724 | + fregnames[i]); | |
| 8725 | + for (i = 0; i < 32; i++) | |
| 8726 | + fpu_fpr64[i] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0, | |
| 8727 | + offsetof(CPUState, active_fpu.fpr[i]), | |
| 8728 | + fregnames_64[i]); | |
| 8729 | + for (i = 0; i < 32; i++) | |
| 8730 | + fpu_fpr32h[i] = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
| 8731 | + offsetof(CPUState, active_fpu.fpr[i].w[!FP_ENDIAN_IDX]), | |
| 8732 | + fregnames_h[i]); | |
| 8733 | + fpu_fcr0 = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
| 8734 | + offsetof(CPUState, active_fpu.fcr0), | |
| 8735 | + "fcr0"); | |
| 8736 | + fpu_fcr31 = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
| 8737 | + offsetof(CPUState, active_fpu.fcr31), | |
| 8738 | + "fcr31"); | |
| 8724 | 8739 | |
| 8725 | 8740 | /* register helpers */ |
| 8726 | 8741 | #undef DEF_HELPER | ... | ... |
target-mips/translate_init.c
| ... | ... | @@ -489,14 +489,17 @@ static void mmu_init (CPUMIPSState *env, const mips_def_t *def) |
| 489 | 489 | |
| 490 | 490 | static void fpu_init (CPUMIPSState *env, const mips_def_t *def) |
| 491 | 491 | { |
| 492 | - env->fpu = qemu_mallocz(sizeof(CPUMIPSFPUContext)); | |
| 492 | + int i; | |
| 493 | + | |
| 494 | + for (i = 0; i < MIPS_FPU_MAX; i++) | |
| 495 | + env->fpus[i].fcr0 = def->CP1_fcr0; | |
| 493 | 496 | |
| 494 | - env->fpu->fcr0 = def->CP1_fcr0; | |
| 497 | + memcpy(&env->active_fpu, &env->fpus[0], sizeof(env->active_fpu)); | |
| 495 | 498 | if (env->user_mode_only) { |
| 496 | 499 | if (env->CP0_Config1 & (1 << CP0C1_FP)) |
| 497 | 500 | env->hflags |= MIPS_HFLAG_FPU; |
| 498 | 501 | #ifdef TARGET_MIPS64 |
| 499 | - if (env->fpu->fcr0 & (1 << FCR0_F64)) | |
| 502 | + if (env->active_fpu.fcr0 & (1 << FCR0_F64)) | |
| 500 | 503 | env->hflags |= MIPS_HFLAG_F64; |
| 501 | 504 | #endif |
| 502 | 505 | } | ... | ... |