summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/9/pc64/main.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/sys/src/9/pc64/main.c b/sys/src/9/pc64/main.c
index e56ad9197..458ff0c16 100644
--- a/sys/src/9/pc64/main.c
+++ b/sys/src/9/pc64/main.c
@@ -712,20 +712,25 @@ int
fpusave(void)
{
int ostate = up->fpstate;
- if((up->fpstate & ~(FPnouser|FPkernel|FPindexm)) == FPactive)
+ if((ostate & ~(FPnouser|FPkernel|FPindexm)) == FPactive)
_stts();
- up->fpstate = FPpush | (up->fpstate & ~FPillegal);
+ up->fpstate = FPpush | (ostate & ~FPillegal);
return ostate;
}
void
fpurestore(int ostate)
{
- if((up->fpstate & ~(FPnouser|FPkernel|FPindexm)) == FPactive)
+ int astate = up->fpstate;
+ if((astate & ~(FPnouser|FPkernel|FPindexm)) == FPactive)
_stts();
- if((ostate & FPindexm) == (up->fpstate & FPindexm)){
- if((ostate & ~(FPnouser|FPkernel|FPindexm)) == FPactive)
+ if((astate & FPindexm) == (ostate & FPindexm)){
+ if((ostate & ~(FPnouser|FPkernel|FPindexm)) == FPactive){
+ if((astate & ~(FPpush|FPnouser|FPkernel|FPindexm)) != FPactive)
+ goto saved;
_clts();
+ }
} else {
+ saved:
up->fpsave = up->fpslot[ostate>>FPindexs];
ostate = FPinactive | (ostate & (FPillegal|FPpush|FPnouser|FPkernel|FPindexm));
}