commit 1a428de189 introduced a bug by using a signed enum in a bitfield, the value of which is then used in a ldmxcsr instruction. The sign-extension corrupts the value, causing an exception by attempting to load mxcsr with an invalid value.

This commit is contained in:
Shawn Hoffman 2014-03-04 22:49:33 -08:00
parent 0c613a5f5b
commit 7733463e65
2 changed files with 4 additions and 3 deletions

View File

@ -8,14 +8,15 @@
namespace FPURoundMode namespace FPURoundMode
{ {
enum RoundModes enum RoundModes : u32
{ {
ROUND_NEAR = 0, ROUND_NEAR = 0,
ROUND_CHOP = 1, ROUND_CHOP = 1,
ROUND_UP = 2, ROUND_UP = 2,
ROUND_DOWN = 3 ROUND_DOWN = 3
}; };
enum PrecisionModes { enum PrecisionModes : u32
{
PREC_24 = 0, PREC_24 = 0,
PREC_53 = 1, PREC_53 = 1,
PREC_64 = 2 PREC_64 = 2

View File

@ -390,7 +390,7 @@ union UReg_FPSCR
struct struct
{ {
// Rounding mode (towards: nearest, zero, +inf, -inf) // Rounding mode (towards: nearest, zero, +inf, -inf)
enum FPURoundMode::RoundModes RN : 2; FPURoundMode::RoundModes RN : 2;
// Non-IEEE mode enable (aka flush-to-zero) // Non-IEEE mode enable (aka flush-to-zero)
u32 NI : 1; u32 NI : 1;
// Inexact exception enable // Inexact exception enable