X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fi387-nat.c;h=5cb1a04c694ec547e3ce92d1887325203e3248aa;hb=39f770628a4eaf018fec8d55684bf2ec16ada9cc;hp=f22b4078c2104cadd6611b44de50c705124f8611;hpb=4e052eda914ce3a3c48b31a0d13bce89c364495e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/i387-nat.c b/gdb/i387-nat.c index f22b4078c2..5cb1a04c69 100644 --- a/gdb/i387-nat.c +++ b/gdb/i387-nat.c @@ -210,17 +210,19 @@ i387_supply_fxsave (char *fxsave) int top; fstat = *(unsigned short *) (FXSAVE_ADDR (fxsave, FSTAT_REGNUM)); - top = ((fstat >> 11) & 0x111); + top = ((fstat >> 11) & 0x7); for (fpreg = 7; fpreg >= 0; fpreg--) { - int tag = 0x11; + int tag; if (val & (1 << fpreg)) { int regnum = (fpreg + 8 - top) % 8 + FP0_REGNUM; tag = i387_tag (FXSAVE_ADDR (fxsave, regnum)); } + else + tag = 3; /* Empty */ ftag |= tag << (2 * fpreg); } @@ -275,10 +277,10 @@ i387_fill_fxsave (char *fxsave, int regnum) for (fpreg = 7; fpreg >= 0; fpreg--) { - int tag = (ftag >> (fpreg * 2)) & 0x11; + int tag = (ftag >> (fpreg * 2)) & 3; - if (tag != 0x11) - val |= (1 << fpreg); + if (tag != 3) + val |= (1 << (fpreg * 2)); } memcpy (FXSAVE_ADDR (fxsave, i), &val, 2); @@ -312,32 +314,32 @@ i387_tag (unsigned char *raw) if (exponent == 0x7fff) { /* Special. */ - return (0x10); + return (2); } else if (exponent == 0x0000) { - if (integer) + if (fraction[0] == 0x0000 && fraction[1] == 0x0000 && !integer) { - /* Valid. */ - return (0x00); + /* Zero. */ + return (1); } else { /* Special. */ - return (0x10); + return (2); } } else { - if (fraction[0] == 0x0000 && fraction[1] == 0x0000 && !integer) + if (integer) { - /* Zero. */ - return (0x01); + /* Valid. */ + return (0); } else { /* Special. */ - return (0x10); + return (2); } } }