mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 23:03:54 -06:00
target-mips: Implement FCR31's R/W bitmask and related functionalities
This patch implements read and write access rules for Mips floating point control and status register (FCR31). The change can be divided into following parts: - Add fields that will keep FCR31's R/W bitmask in procesor definitions and processor float_status structure. - Add appropriate value for FCR31's R/W bitmask for each supported processor. - Add function for setting snan_bit_is_one, and integrate it in appropriate places. - Modify handling of CTC1 (case 31) instruction to use FCR31's R/W bitmask. - Modify handling user mode executables for Mips, in relation to the bit EF_MIPS_NAN2008 from ELF header, that is in turn related to reading and writing to FCR31. - Modify gdb behavior in relation to FCR31. Signed-off-by: Thomas Schwinge <thomas@codesourcery.com> Signed-off-by: Maciej W. Rozycki <macro@codesourcery.com> Signed-off-by: Aleksandar Markovic <aleksandar.markovic@imgtec.com> Reviewed-by: Leon Alrae <leon.alrae@imgtec.com> Signed-off-by: Leon Alrae <leon.alrae@imgtec.com>
This commit is contained in:
parent
87552089b6
commit
599bc5e89c
6 changed files with 56 additions and 19 deletions
|
@ -2575,21 +2575,13 @@ void helper_ctc1(CPUMIPSState *env, target_ulong arg1, uint32_t fs, uint32_t rt)
|
|||
((arg1 & 0x4) << 22);
|
||||
break;
|
||||
case 31:
|
||||
if (env->insn_flags & ISA_MIPS32R6) {
|
||||
uint32_t mask = 0xfefc0000;
|
||||
env->active_fpu.fcr31 = (arg1 & ~mask) |
|
||||
(env->active_fpu.fcr31 & mask);
|
||||
} else if (!(arg1 & 0x007c0000)) {
|
||||
env->active_fpu.fcr31 = arg1;
|
||||
}
|
||||
env->active_fpu.fcr31 = (arg1 & env->active_fpu.fcr31_rw_bitmask) |
|
||||
(env->active_fpu.fcr31 & ~(env->active_fpu.fcr31_rw_bitmask));
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
/* set rounding mode */
|
||||
restore_rounding_mode(env);
|
||||
/* set flush-to-zero mode */
|
||||
restore_flush_mode(env);
|
||||
restore_fp_status(env);
|
||||
set_float_exception_flags(0, &env->active_fpu.fp_status);
|
||||
if ((GET_FP_ENABLE(env->active_fpu.fcr31) | 0x20) & GET_FP_CAUSE(env->active_fpu.fcr31))
|
||||
do_raise_exception(env, EXCP_FPE, GETPC());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue