diff options
Diffstat (limited to 'arch/sparc64/math-emu/math.c')
-rw-r--r-- | arch/sparc64/math-emu/math.c | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/arch/sparc64/math-emu/math.c b/arch/sparc64/math-emu/math.c index e0380720f..5a71804b9 100644 --- a/arch/sparc64/math-emu/math.c +++ b/arch/sparc64/math-emu/math.c @@ -1,4 +1,4 @@ -/* $Id: math.c,v 1.4 1998/04/06 16:09:57 jj Exp $ +/* $Id: math.c,v 1.5 1998/06/12 14:54:27 jj Exp $ * arch/sparc64/math-emu/math.c * * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) @@ -122,59 +122,57 @@ int do_mathemu(struct pt_regs *regs, struct fpustate *f) if (type) { void *rs1 = NULL, *rs2 = NULL, *rd = NULL; - freg = (f->fsr >> 14) & 0xf; + freg = (current->tss.xfsr[0] >> 14) & 0xf; if (freg != (type >> 8)) goto err; - f->fsr &= ~0x1c000; + current->tss.xfsr[0] &= ~0x1c000; freg = ((insn >> 14) & 0x1f); switch (type & 0x3) { case 3: if (freg & 2) { - f->fsr |= (6 << 14) /* invalid_fp_register */; + current->tss.xfsr[0] |= (6 << 14) /* invalid_fp_register */; goto err; } case 2: freg = ((freg & 1) << 5) | (freg & 0x1e); case 1: rs1 = (void *)&f->regs[freg]; - flags = (freg < 32) ? SPARC_FLAG_USEDFPUL : SPARC_FLAG_USEDFPUU; - if (!(current->tss.flags & flags)) - rs1 = (void *)&zero; + flags = (freg < 32) ? FPRS_DL : FPRS_DU; + if (!(current->tss.fpsaved[0] & flags)) + rs1 = (void *)&zero; break; } freg = (insn & 0x1f); switch ((type >> 2) & 0x3) { case 3: if (freg & 2) { - f->fsr |= (6 << 14) /* invalid_fp_register */; + current->tss.xfsr[0] |= (6 << 14) /* invalid_fp_register */; goto err; } case 2: freg = ((freg & 1) << 5) | (freg & 0x1e); case 1: rs2 = (void *)&f->regs[freg]; - flags = (freg < 32) ? SPARC_FLAG_USEDFPUL : SPARC_FLAG_USEDFPUU; - if (!(current->tss.flags & flags)) + flags = (freg < 32) ? FPRS_DL : FPRS_DU; + if (!(current->tss.fpsaved[0] & flags)) rs2 = (void *)&zero; break; } freg = ((insn >> 25) & 0x1f); switch ((type >> 4) & 0x3) { - case 0: rd = (void *)(((long)&f->fsr) | (freg & 3)); break; + case 0: rd = (void *)(((long)¤t->tss.xfsr[0]) | (freg & 3)); break; case 3: if (freg & 2) { - f->fsr |= (6 << 14) /* invalid_fp_register */; + current->tss.xfsr[0] |= (6 << 14) /* invalid_fp_register */; goto err; } case 2: freg = ((freg & 1) << 5) | (freg & 0x1e); case 1: rd = (void *)&f->regs[freg]; - flags = (freg < 32) ? SPARC_FLAG_USEDFPUL : SPARC_FLAG_USEDFPUU; - regs->fprs |= FPRS_FEF; - if (!(current->tss.flags & SPARC_FLAG_USEDFPU)) { - current->tss.flags |= SPARC_FLAG_USEDFPU; - f->fsr = 0; - f->gsr = 0; + flags = (freg < 32) ? FPRS_DL : FPRS_DU; + if (!(current->tss.fpsaved[0] & FPRS_FEF)) { + current->tss.fpsaved[0] = FPRS_FEF; + current->tss.gsr[0] = 0; } - if (!(current->tss.flags & flags)) { + if (!(current->tss.fpsaved[0] & flags)) { if (freg < 32) memset(f->regs, 0, 32*sizeof(u32)); else memset(f->regs+32, 0, 32*sizeof(u32)); } - current->tss.flags |= flags; + current->tss.fpsaved[0] |= flags; break; } func(rd, rs2, rs1); |