svn commit: r258250 - head/sys/powerpc/fpu

Nathan Whitehorn nwhitehorn at FreeBSD.org
Sun Nov 17 05:03:16 UTC 2013


Author: nwhitehorn
Date: Sun Nov 17 05:03:15 2013
New Revision: 258250
URL: http://svnweb.freebsd.org/changeset/base/258250

Log:
  Make single precision floating point arithmetic actually work -- I think
  it never did -- and fix an obvious missing line. Floating point emulation
  on Book-E still needs some work but this gets it basically functional on
  soft-FPU systems (hard FPU for Book-E is not yet implemented).
  
  MFC after:	1 week

Modified:
  head/sys/powerpc/fpu/fpu_emu.c
  head/sys/powerpc/fpu/fpu_explode.c

Modified: head/sys/powerpc/fpu/fpu_emu.c
==============================================================================
--- head/sys/powerpc/fpu/fpu_emu.c	Sun Nov 17 03:11:36 2013	(r258249)
+++ head/sys/powerpc/fpu/fpu_emu.c	Sun Nov 17 05:03:15 2013	(r258250)
@@ -606,9 +606,11 @@ fpu_execute(struct trapframe *tf, struct
 			rb = instr.i_a.i_frb;
 			rc = instr.i_a.i_frc;
 
-			type = FTYPE_SNG;
-			if (instr.i_any.i_opcd & 0x4)
-				type = FTYPE_DBL;
+			/*
+			 * All arithmetic operations work on registers, which
+			 * are stored as doubles.
+			 */
+			type = FTYPE_DBL;
 			switch ((unsigned int)instr.i_a.i_xo) {
 			case	OPC59_FDIVS:
 				FPU_EMU_EVCNT_INCR(fdiv);
@@ -725,6 +727,13 @@ fpu_execute(struct trapframe *tf, struct
 				return (NOTFPU);
 				break;
 			}
+
+			/* If the instruction was single precision, round */
+			if (!(instr.i_any.i_opcd & 0x4)) {
+				fpu_implode(fe, fp, FTYPE_SNG, 
+					(u_int *)&fs->fpreg[rt]);
+				fpu_explode(fe, fp = &fe->fe_f1, FTYPE_SNG, rt);
+			}
 		}
 	} else {
 		return (NOTFPU);

Modified: head/sys/powerpc/fpu/fpu_explode.c
==============================================================================
--- head/sys/powerpc/fpu/fpu_explode.c	Sun Nov 17 03:11:36 2013	(r258249)
+++ head/sys/powerpc/fpu/fpu_explode.c	Sun Nov 17 05:03:15 2013	(r258250)
@@ -235,6 +235,7 @@ fpu_explode(struct fpemu *fe, struct fpn
 		s = fpu_dtof(fp, s, space[1]);
 		break;
 
+	default:
 		panic("fpu_explode");
 		panic("fpu_explode: invalid type %d", type);
 	}


More information about the svn-src-all mailing list