> + f_set_flags(env); > \
You shouldn't need to set the flags every instruction. You ought to be able to limit the changes to reset and stores to the PSW. > + arg1 = float32_squash_input_denormal(arg1, &env->fp_status); > \ > + arg2 = float32_squash_input_denormal(arg2, &env->fp_status); > \ > + > \ > + if (float32_is_any_nan(arg1) || float32_is_any_nan(arg2)) { > \ > + f_result = QUIET_NAN; > \ > + if (float32_is_signaling_nan(arg1) || > \ > + float32_is_signaling_nan(arg2)) { > \ > + env->fp_status.float_exception_flags |= float_flag_invalid; > \ > + } > \ > + } else if (f_is_pos_inf(arg1) && f_is_neg_inf(arg2)) { > \ > + f_result = ADD_NAN; > \ > + } else if (f_is_pos_inf(arg2) && f_is_neg_inf(arg1)) { > \ > + f_result = ADD_NAN; > \ > + } else { > \ > + f_result = float32_##name(arg1, arg2 , &env->fp_status); > \ > + } > \ If we assume that exceptional situations are, well, exceptional, then we can re-order this to f_result = float32_op(arg1, arg2, &env->fp_status); flags = env->fp_status.float_exception_flags; if (flags) { /* If the output is a NaN, but the inputs aren't, we return a unique value. */ if ((flags & float_flag_invalid) && !float32_is_any_nan(arg1) && !float32_is_any_nan(arg2)) { f_result = ADD_NAN; } f_update_psw_flags(env, flags, false); } This does assume that fp_status.default_nan_mode = 1, so that float32_default_nan is returned. Which means that first patch should touch fpu/softfloat-specialize.h to add tricore to the list of those defaulting to 0x7fc00000. r~