Module Name: src Committed By: rin Date: Fri Sep 2 12:40:49 UTC 2022
Modified Files: src/sys/arch/powerpc/fpu: fpu_emu.c fpu_emu.h fpu_explode.c fpu_extern.h fpu_implode.c Log Message: Make fpu_explode() and fpu_implode() take uint64_t and uint64_t *, instead of register number, respectively. NFC. To generate a diff of this commit: cvs rdiff -u -r1.44 -r1.45 src/sys/arch/powerpc/fpu/fpu_emu.c cvs rdiff -u -r1.7 -r1.8 src/sys/arch/powerpc/fpu/fpu_emu.h cvs rdiff -u -r1.11 -r1.12 src/sys/arch/powerpc/fpu/fpu_explode.c cvs rdiff -u -r1.8 -r1.9 src/sys/arch/powerpc/fpu/fpu_extern.h cvs rdiff -u -r1.16 -r1.17 src/sys/arch/powerpc/fpu/fpu_implode.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/powerpc/fpu/fpu_emu.c diff -u src/sys/arch/powerpc/fpu/fpu_emu.c:1.44 src/sys/arch/powerpc/fpu/fpu_emu.c:1.45 --- src/sys/arch/powerpc/fpu/fpu_emu.c:1.44 Thu Sep 1 06:08:16 2022 +++ src/sys/arch/powerpc/fpu/fpu_emu.c Fri Sep 2 12:40:49 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: fpu_emu.c,v 1.44 2022/09/01 06:08:16 rin Exp $ */ +/* $NetBSD: fpu_emu.c,v 1.45 2022/09/02 12:40:49 rin Exp $ */ /* * Copyright 2001 Wasabi Systems, Inc. @@ -76,7 +76,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fpu_emu.c,v 1.44 2022/09/01 06:08:16 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fpu_emu.c,v 1.45 2022/09/02 12:40:49 rin Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -159,6 +159,7 @@ FPU_EMU_EVCNT_DECL(fnmadd); FPSCR_VXSOFT | FPSCR_VXSQRT | FPSCR_VXCVI \ ) +#define FR(reg) (fs->fpreg[reg]) int fpe_debug = 0; @@ -414,8 +415,9 @@ fpu_execute(struct trapframe *tf, struct DPRINTF(FPE_INSN, ("fpu_execute: Store SNG at %p\n", (void *)addr)); - fpu_explode(fe, fp = &fe->fe_f1, FTYPE_DBL, rt); - fpu_implode(fe, fp, type, (void *)&buf); + fpu_explode(fe, fp = &fe->fe_f1, FTYPE_DBL, + FR(rt)); + fpu_implode(fe, fp, type, &buf); if (copyout(&buf, (void *)addr, size)) { fe->fe_addr = addr; return (FAULT); @@ -439,9 +441,8 @@ fpu_execute(struct trapframe *tf, struct return (FAULT); } if (type != FTYPE_DBL) { - fpu_explode(fe, fp = &fe->fe_f1, type, rt); - fpu_implode(fe, fp, FTYPE_DBL, - (u_int *)&fs->fpreg[rt]); + fpu_explode(fe, fp = &fe->fe_f1, type, FR(rt)); + fpu_implode(fe, fp, FTYPE_DBL, &FR(rt)); } } if (update) @@ -471,8 +472,8 @@ fpu_execute(struct trapframe *tf, struct FPU_EMU_EVCNT_INCR(fcmpu); DPRINTF(FPE_INSN, ("fpu_execute: FCMPU\n")); rt >>= 2; - fpu_explode(fe, &fe->fe_f1, type, ra); - fpu_explode(fe, &fe->fe_f2, type, rb); + fpu_explode(fe, &fe->fe_f1, type, FR(ra)); + fpu_explode(fe, &fe->fe_f2, type, FR(rb)); fpu_compare(fe, 0); /* Make sure we do the condition regs. */ cond = 0; @@ -492,17 +493,18 @@ fpu_execute(struct trapframe *tf, struct */ FPU_EMU_EVCNT_INCR(frsp); DPRINTF(FPE_INSN, ("fpu_execute: FRSP\n")); - fpu_explode(fe, fp = &fe->fe_f1, FTYPE_DBL, rb); - fpu_implode(fe, fp, FTYPE_SNG, - (u_int *)&fs->fpreg[rt]); - fpu_explode(fe, fp = &fe->fe_f1, FTYPE_SNG, rt); + fpu_explode(fe, fp = &fe->fe_f1, FTYPE_DBL, + FR(rb)); + fpu_implode(fe, fp, FTYPE_SNG, &FR(rt)); + fpu_explode(fe, fp = &fe->fe_f1, FTYPE_SNG, + FR(rt)); type = FTYPE_DBL | FTYPE_FPRF; break; case OPC63_FCTIW: case OPC63_FCTIWZ: FPU_EMU_EVCNT_INCR(fctiw); DPRINTF(FPE_INSN, ("fpu_execute: FCTIW\n")); - fpu_explode(fe, fp = &fe->fe_f1, type, rb); + fpu_explode(fe, fp = &fe->fe_f1, type, FR(rb)); type = FTYPE_INT; if (instr.i_x.i_xo == OPC63_FCTIWZ) type |= FTYPE_RD_RZ; @@ -511,8 +513,8 @@ fpu_execute(struct trapframe *tf, struct FPU_EMU_EVCNT_INCR(fcmpo); DPRINTF(FPE_INSN, ("fpu_execute: FCMPO\n")); rt >>= 2; - fpu_explode(fe, &fe->fe_f1, type, ra); - fpu_explode(fe, &fe->fe_f2, type, rb); + fpu_explode(fe, &fe->fe_f1, type, FR(ra)); + fpu_explode(fe, &fe->fe_f2, type, FR(rb)); fpu_compare(fe, 1); /* Make sure we do the condition regs. */ cond = 0; @@ -614,7 +616,7 @@ fpu_execute(struct trapframe *tf, struct case OPC63_FCTIDZ: FPU_EMU_EVCNT_INCR(fctid); DPRINTF(FPE_INSN, ("fpu_execute: FCTID\n")); - fpu_explode(fe, fp = &fe->fe_f1, type, rb); + fpu_explode(fe, fp = &fe->fe_f1, type, FR(rb)); type = FTYPE_LNG; if (instr.i_x.i_xo == OPC63_FCTIDZ) type |= FTYPE_RD_RZ; @@ -623,7 +625,7 @@ fpu_execute(struct trapframe *tf, struct FPU_EMU_EVCNT_INCR(fcfid); DPRINTF(FPE_INSN, ("fpu_execute: FCFID\n")); type = FTYPE_LNG; - fpu_explode(fe, fp = &fe->fe_f1, type, rb); + fpu_explode(fe, fp = &fe->fe_f1, type, FR(rb)); type = FTYPE_DBL | FTYPE_FPRF; break; default: @@ -646,28 +648,28 @@ fpu_execute(struct trapframe *tf, struct case OPC59_FDIVS: FPU_EMU_EVCNT_INCR(fdiv); DPRINTF(FPE_INSN, ("fpu_execute: FDIV\n")); - fpu_explode(fe, &fe->fe_f1, type, ra); - fpu_explode(fe, &fe->fe_f2, type, rb); + fpu_explode(fe, &fe->fe_f1, type, FR(ra)); + fpu_explode(fe, &fe->fe_f2, type, FR(rb)); fp = fpu_div(fe); break; case OPC59_FSUBS: FPU_EMU_EVCNT_INCR(fsub); DPRINTF(FPE_INSN, ("fpu_execute: FSUB\n")); - fpu_explode(fe, &fe->fe_f1, type, ra); - fpu_explode(fe, &fe->fe_f2, type, rb); + fpu_explode(fe, &fe->fe_f1, type, FR(ra)); + fpu_explode(fe, &fe->fe_f2, type, FR(rb)); fp = fpu_sub(fe); break; case OPC59_FADDS: FPU_EMU_EVCNT_INCR(fadd); DPRINTF(FPE_INSN, ("fpu_execute: FADD\n")); - fpu_explode(fe, &fe->fe_f1, type, ra); - fpu_explode(fe, &fe->fe_f2, type, rb); + fpu_explode(fe, &fe->fe_f1, type, FR(ra)); + fpu_explode(fe, &fe->fe_f2, type, FR(rb)); fp = fpu_add(fe); break; case OPC59_FSQRTS: FPU_EMU_EVCNT_INCR(fsqrt); DPRINTF(FPE_INSN, ("fpu_execute: FSQRT\n")); - fpu_explode(fe, &fe->fe_f1, type, rb); + fpu_explode(fe, &fe->fe_f1, type, FR(rb)); fp = fpu_sqrt(fe); break; case OPC63M_FSEL: @@ -688,60 +690,56 @@ fpu_execute(struct trapframe *tf, struct case OPC59_FRES: FPU_EMU_EVCNT_INCR(fpres); DPRINTF(FPE_INSN, ("fpu_execute: FPRES\n")); - fpu_explode(fe, &fe->fe_f1, type, rb); + fpu_explode(fe, &fe->fe_f2, type, FR(rb)); fp = fpu_sqrt(fe); - /* now we've gotta overwrite the dest reg */ - *((int *)&fe->fe_fpstate->fpreg[rt]) = 1; - fpu_explode(fe, &fe->fe_f1, FTYPE_INT, rt); + fpu_explode(fe, &fe->fe_f1, FTYPE_INT, 1); fpu_div(fe); break; case OPC59_FMULS: FPU_EMU_EVCNT_INCR(fmul); DPRINTF(FPE_INSN, ("fpu_execute: FMUL\n")); - fpu_explode(fe, &fe->fe_f1, type, ra); - fpu_explode(fe, &fe->fe_f2, type, rc); + fpu_explode(fe, &fe->fe_f1, type, FR(ra)); + fpu_explode(fe, &fe->fe_f2, type, FR(rc)); fp = fpu_mul(fe); break; case OPC63M_FRSQRTE: /* Reciprocal sqrt() estimate */ FPU_EMU_EVCNT_INCR(frsqrte); DPRINTF(FPE_INSN, ("fpu_execute: FRSQRTE\n")); - fpu_explode(fe, &fe->fe_f1, type, rb); + fpu_explode(fe, &fe->fe_f1, type, FR(rb)); fp = fpu_sqrt(fe); fe->fe_f2 = *fp; - /* now we've gotta overwrite the dest reg */ - *((int *)&fe->fe_fpstate->fpreg[rt]) = 1; - fpu_explode(fe, &fe->fe_f1, FTYPE_INT, rt); + fpu_explode(fe, &fe->fe_f1, FTYPE_INT, 1); fpu_div(fe); break; case OPC59_FMSUBS: FPU_EMU_EVCNT_INCR(fmulsub); DPRINTF(FPE_INSN, ("fpu_execute: FMULSUB\n")); - fpu_explode(fe, &fe->fe_f1, type, ra); - fpu_explode(fe, &fe->fe_f2, type, rc); + fpu_explode(fe, &fe->fe_f1, type, FR(ra)); + fpu_explode(fe, &fe->fe_f2, type, FR(rc)); fp = fpu_mul(fe); fe->fe_f1 = *fp; - fpu_explode(fe, &fe->fe_f2, type, rb); + fpu_explode(fe, &fe->fe_f2, type, FR(rb)); fp = fpu_sub(fe); break; case OPC59_FMADDS: FPU_EMU_EVCNT_INCR(fmuladd); DPRINTF(FPE_INSN, ("fpu_execute: FMULADD\n")); - fpu_explode(fe, &fe->fe_f1, type, ra); - fpu_explode(fe, &fe->fe_f2, type, rc); + fpu_explode(fe, &fe->fe_f1, type, FR(ra)); + fpu_explode(fe, &fe->fe_f2, type, FR(rc)); fp = fpu_mul(fe); fe->fe_f1 = *fp; - fpu_explode(fe, &fe->fe_f2, type, rb); + fpu_explode(fe, &fe->fe_f2, type, FR(rb)); fp = fpu_add(fe); break; case OPC59_FNMSUBS: FPU_EMU_EVCNT_INCR(fnmsub); DPRINTF(FPE_INSN, ("fpu_execute: FNMSUB\n")); - fpu_explode(fe, &fe->fe_f1, type, ra); - fpu_explode(fe, &fe->fe_f2, type, rc); + fpu_explode(fe, &fe->fe_f1, type, FR(ra)); + fpu_explode(fe, &fe->fe_f2, type, FR(rc)); fp = fpu_mul(fe); fe->fe_f1 = *fp; - fpu_explode(fe, &fe->fe_f2, type, rb); + fpu_explode(fe, &fe->fe_f2, type, FR(rb)); fp = fpu_sub(fe); /* Negate */ fp->fp_sign ^= 1; @@ -749,11 +747,11 @@ fpu_execute(struct trapframe *tf, struct case OPC59_FNMADDS: FPU_EMU_EVCNT_INCR(fnmadd); DPRINTF(FPE_INSN, ("fpu_execute: FNMADD\n")); - fpu_explode(fe, &fe->fe_f1, type, ra); - fpu_explode(fe, &fe->fe_f2, type, rc); + fpu_explode(fe, &fe->fe_f1, type, FR(ra)); + fpu_explode(fe, &fe->fe_f2, type, FR(rc)); fp = fpu_mul(fe); fe->fe_f1 = *fp; - fpu_explode(fe, &fe->fe_f2, type, rb); + fpu_explode(fe, &fe->fe_f2, type, FR(rb)); fp = fpu_add(fe); /* Negate */ fp->fp_sign ^= 1; @@ -766,8 +764,9 @@ fpu_execute(struct trapframe *tf, struct /* If the instruction was single precision, round */ if (!(instr.i_any.i_opcd & 0x4)) { fpu_implode(fe, fp, FTYPE_SNG | FTYPE_FPRF, - (u_int *)&fs->fpreg[rt]); - fpu_explode(fe, fp = &fe->fe_f1, FTYPE_SNG, rt); + &FR(rt)); + fpu_explode(fe, fp = &fe->fe_f1, FTYPE_SNG, + FR(rt)); } else type |= FTYPE_FPRF; } @@ -782,7 +781,7 @@ fpu_execute(struct trapframe *tf, struct * Otherwise set new current exceptions and accrue. */ if (fp) - fpu_implode(fe, fp, type, (u_int *)&fs->fpreg[rt]); + fpu_implode(fe, fp, type, &FR(rt)); cx = fe->fe_cx; fsr = fe->fe_fpscr & ~(FPSCR_FEX|FPSCR_VX); if (cx != 0) { Index: src/sys/arch/powerpc/fpu/fpu_emu.h diff -u src/sys/arch/powerpc/fpu/fpu_emu.h:1.7 src/sys/arch/powerpc/fpu/fpu_emu.h:1.8 --- src/sys/arch/powerpc/fpu/fpu_emu.h:1.7 Thu Sep 1 06:08:16 2022 +++ src/sys/arch/powerpc/fpu/fpu_emu.h Fri Sep 2 12:40:49 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: fpu_emu.h,v 1.7 2022/09/01 06:08:16 rin Exp $ */ +/* $NetBSD: fpu_emu.h,v 1.8 2022/09/02 12:40:49 rin Exp $ */ /* * Copyright (c) 1992, 1993 @@ -185,8 +185,8 @@ struct fpn *fpu_newnan(struct fpemu *); */ int fpu_shr(struct fpn *, int); -void fpu_explode(struct fpemu *, struct fpn *, int, int); -void fpu_implode(struct fpemu *, struct fpn *, int, u_int *); +void fpu_explode(struct fpemu *, struct fpn *, int, uint64_t); +void fpu_implode(struct fpemu *, struct fpn *, int, uint64_t *); #ifdef DEBUG #define FPE_EX 0x1 Index: src/sys/arch/powerpc/fpu/fpu_explode.c diff -u src/sys/arch/powerpc/fpu/fpu_explode.c:1.11 src/sys/arch/powerpc/fpu/fpu_explode.c:1.12 --- src/sys/arch/powerpc/fpu/fpu_explode.c:1.11 Fri Sep 2 12:30:48 2022 +++ src/sys/arch/powerpc/fpu/fpu_explode.c Fri Sep 2 12:40:49 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: fpu_explode.c,v 1.11 2022/09/02 12:30:48 rin Exp $ */ +/* $NetBSD: fpu_explode.c,v 1.12 2022/09/02 12:40:49 rin Exp $ */ /* * Copyright (c) 1992, 1993 @@ -46,7 +46,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fpu_explode.c,v 1.11 2022/09/02 12:30:48 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fpu_explode.c,v 1.12 2022/09/02 12:40:49 rin Exp $"); #include <sys/types.h> #include <sys/systm.h> @@ -206,40 +206,38 @@ fpu_dtof(struct fpn *fp, u_int hi, u_int * operations are performed.) */ void -fpu_explode(struct fpemu *fe, struct fpn *fp, int type, int reg) +fpu_explode(struct fpemu *fe, struct fpn *fp, int type, uint64_t i) { - u_int s, *space; - uint64_t l, *xspace; + u_int hi, lo; + int class; - xspace = (uint64_t *)&fe->fe_fpstate->fpreg[reg]; - l = xspace[0]; - space = (u_int *)&fe->fe_fpstate->fpreg[reg]; - s = space[0]; - fp->fp_sign = s >> 31; + hi = (u_int)(i >> 32); + lo = (u_int)i; + fp->fp_sign = hi >> 31; fp->fp_sticky = 0; switch (type) { case FTYPE_LNG: - s = fpu_xtof(fp, l); + class = fpu_xtof(fp, i); break; case FTYPE_INT: - s = fpu_itof(fp, space[1]); + class = fpu_itof(fp, lo); break; case FTYPE_SNG: - s = fpu_stof(fp, s); + class = fpu_stof(fp, hi); break; case FTYPE_DBL: - s = fpu_dtof(fp, s, space[1]); + class = fpu_dtof(fp, hi, lo); break; default: panic("fpu_explode: invalid type %d", type); } - if (s == FPC_QNAN && (fp->fp_mant[0] & FP_QUIETBIT) == 0) { + if (class == FPC_QNAN && (fp->fp_mant[0] & FP_QUIETBIT) == 0) { /* * Input is a signalling NaN. All operations that return * an input NaN operand put it through a ``NaN conversion'', @@ -249,13 +247,8 @@ fpu_explode(struct fpemu *fe, struct fpn */ fp->fp_mant[0] |= FP_QUIETBIT; fe->fe_cx = FPSCR_VXSNAN; /* assert invalid operand */ - s = FPC_SNAN; + class = FPC_SNAN; } - fp->fp_class = s; - DPRINTF(FPE_REG, ("fpu_explode: %%%c%d => ", (type == FTYPE_LNG) ? 'x' : - ((type == FTYPE_INT) ? 'i' : - ((type == FTYPE_SNG) ? 's' : - ((type == FTYPE_DBL) ? 'd' : '?'))), - reg)); + fp->fp_class = class; DUMPFPN(FPE_REG, fp); } Index: src/sys/arch/powerpc/fpu/fpu_extern.h diff -u src/sys/arch/powerpc/fpu/fpu_extern.h:1.8 src/sys/arch/powerpc/fpu/fpu_extern.h:1.9 --- src/sys/arch/powerpc/fpu/fpu_extern.h:1.8 Thu Sep 1 05:58:19 2022 +++ src/sys/arch/powerpc/fpu/fpu_extern.h Fri Sep 2 12:40:49 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: fpu_extern.h,v 1.8 2022/09/01 05:58:19 rin Exp $ */ +/* $NetBSD: fpu_extern.h,v 1.9 2022/09/02 12:40:49 rin Exp $ */ /*- * Copyright (c) 1995 The NetBSD Foundation, Inc. @@ -60,10 +60,10 @@ int fpu_itof(struct fpn *, u_int); int fpu_xtof(struct fpn *, uint64_t); int fpu_stof(struct fpn *, u_int); int fpu_dtof(struct fpn *, u_int, u_int); -void fpu_explode(struct fpemu *, struct fpn *, int, int); +void fpu_explode(struct fpemu *, struct fpn *, int, uint64_t); /* fpu_implode.c */ -void fpu_implode(struct fpemu *, struct fpn *, int, u_int *); +void fpu_implode(struct fpemu *, struct fpn *, int, uint64_t *); /* fpu_mul.c */ struct fpn *fpu_mul(struct fpemu *); Index: src/sys/arch/powerpc/fpu/fpu_implode.c diff -u src/sys/arch/powerpc/fpu/fpu_implode.c:1.16 src/sys/arch/powerpc/fpu/fpu_implode.c:1.17 --- src/sys/arch/powerpc/fpu/fpu_implode.c:1.16 Fri Sep 2 12:24:54 2022 +++ src/sys/arch/powerpc/fpu/fpu_implode.c Fri Sep 2 12:40:49 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: fpu_implode.c,v 1.16 2022/09/02 12:24:54 rin Exp $ */ +/* $NetBSD: fpu_implode.c,v 1.17 2022/09/02 12:40:49 rin Exp $ */ /* * Copyright (c) 1992, 1993 @@ -46,7 +46,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fpu_implode.c,v 1.16 2022/09/02 12:24:54 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fpu_implode.c,v 1.17 2022/09/02 12:40:49 rin Exp $"); #include <sys/types.h> #include <sys/systm.h> @@ -516,11 +516,15 @@ done: * Implode an fpn, writing the result into the given space. */ void -fpu_implode(struct fpemu *fe, struct fpn *fp, int type, u_int *space) +fpu_implode(struct fpemu *fe, struct fpn *fp, int type, uint64_t *p) { + u_int *hi, *lo; int rn; bool fprf; + hi = (u_int *)p; + lo = hi + 1; + if (type & FTYPE_RD_RZ) rn = FSR_RD_RZ; else @@ -532,27 +536,27 @@ fpu_implode(struct fpemu *fe, struct fpn case FTYPE_LNG: /* FPRF is undefined. */ - *(uint64_t *)space = fpu_ftox(fe, fp, rn); + *p = fpu_ftox(fe, fp, rn); DPRINTF(FPE_REG, ("fpu_implode: long %x %x\n", space[0], space[1])); break; case FTYPE_INT: /* FPRF is undefined. */ - space[0] = 0; - space[1] = fpu_ftoi(fe, fp, rn); + *hi = 0; + *lo = fpu_ftoi(fe, fp, rn); DPRINTF(FPE_REG, ("fpu_implode: int %x\n", space[1])); break; case FTYPE_SNG: - space[0] = fpu_ftos(fe, fp, fprf); + *hi = fpu_ftos(fe, fp, fprf); DPRINTF(FPE_REG, ("fpu_implode: single %x\n", space[0])); break; case FTYPE_DBL: - *(uint64_t *)space = fpu_ftod(fe, fp, fprf); + *p = fpu_ftod(fe, fp, fprf); DPRINTF(FPE_REG, ("fpu_implode: double %x %x\n", space[0], space[1])); break; break;