changeset 13809:1f4c439e16c3

3146 i915 debugging code can chew SSE state Reviewed by: Robert Mustacchi <rm@joyent.com> Approved by: Eric Schrock <eric.schrock@delphix.com>
author Richard Lowe <richlowe@richlowe.net>
date Sat, 01 Sep 2012 21:48:46 -0400
parents ca8df0188218
children 4b38a0c01186
files usr/src/Makefile.master usr/src/uts/intel/io/drm/i915_gem_debug.c
diffstat 2 files changed, 31 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/Makefile.master	Sat Sep 08 13:51:40 2012 -0400
+++ b/usr/src/Makefile.master	Sat Sep 01 21:48:46 2012 -0400
@@ -384,8 +384,11 @@
 #
 sparc_STAND_FLAGS=	-_gcc=-ffreestanding
 sparcv9_STAND_FLAGS=	-_gcc=-ffreestanding
-i386_STAND_FLAGS=	-_gcc=-ffreestanding
-amd64_STAND_FLAGS=	-xmodel=kernel
+# Disabling MMX also disables 3DNow, disabling SSE also disables all later
+# additions to SSE (SSE2, AVX ,etc.)
+NO_SIMD=		-_gcc=-mno-mmx -_gcc=-mno-sse
+i386_STAND_FLAGS=	-_gcc=-ffreestanding $(NO_SIMD)
+amd64_STAND_FLAGS=	-xmodel=kernel $(NO_SIMD)
 
 SAVEARGS=		-Wu,-save_args
 amd64_STAND_FLAGS	+= $(SAVEARGS)
--- a/usr/src/uts/intel/io/drm/i915_gem_debug.c	Sat Sep 08 13:51:40 2012 -0400
+++ b/usr/src/uts/intel/io/drm/i915_gem_debug.c	Sat Sep 01 21:48:46 2012 -0400
@@ -49,18 +49,6 @@
 static uint32_t saved_s2 = 0, saved_s4 = 0;
 static char saved_s2_set = 0, saved_s4_set = 0;
 
-static float
-int_as_float(uint32_t intval)
-{
-    union intfloat {
-	uint32_t i;
-	float f;
-    } uval;
-
-    uval.i = intval;
-    return uval.f;
-}
-
 static void
 instr_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
 	  const char *fmt, ...)
@@ -465,17 +453,17 @@
 	    if (data[1] & (1 << c)) {
 		if (i + 4 >= count)
 		    BUFFER_FAIL(count, len, "3DSTATE_PIXEL_SHADER_CONSTANTS");
-		instr_out(data, hw_offset, i, "C%d.X = %f\n",
-			  c, int_as_float(data[i]));
+		instr_out(data, hw_offset, i, "C%d.X = %x float\n",
+			  c, data[i]);
 		i++;
-		instr_out(data, hw_offset, i, "C%d.Y = %f\n",
-			  c, int_as_float(data[i]));
+		instr_out(data, hw_offset, i, "C%d.Y = %x float\n",
+			  c, data[i]);
 		i++;
-		instr_out(data, hw_offset, i, "C%d.Z = %f\n",
-			  c, int_as_float(data[i]));
+		instr_out(data, hw_offset, i, "C%d.Z = %x float\n",
+			  c, data[i]);
 		i++;
-		instr_out(data, hw_offset, i, "C%d.W = %f\n",
-			  c, int_as_float(data[i]));
+		instr_out(data, hw_offset, i, "C%d.W = %x float\n",
+			  c, data[i]);
 		i++;
 	    }
 	}
@@ -594,8 +582,8 @@
 	    DRM_ERROR("unknown vertex format\n");
 	    for (i = 1; i < len; i++) {
 		instr_out(data, hw_offset, i,
-			  "           vertex data (%f float)\n",
-			  int_as_float(data[i]));
+			  "           vertex data (%x float)\n",
+			  data[i]);
 	    }
 	} else {
 	    unsigned int vertex = 0;
@@ -610,20 +598,20 @@
     i++;								\
 }
 
-		VERTEX_OUT("X = %f", int_as_float(data[i]));
-		VERTEX_OUT("Y = %f", int_as_float(data[i]));
+		VERTEX_OUT("X = %x float", data[i]);
+		VERTEX_OUT("Y = %x float", data[i]);
 	        switch (saved_s4 >> 6 & 0x7) {
 		case 0x1:
-		    VERTEX_OUT("Z = %f", int_as_float(data[i]));
+		    VERTEX_OUT("Z = %x float", data[i]);
 		    break;
 		case 0x2:
-		    VERTEX_OUT("Z = %f", int_as_float(data[i]));
-		    VERTEX_OUT("W = %f", int_as_float(data[i]));
+		    VERTEX_OUT("Z = %x float", data[i]);
+		    VERTEX_OUT("W = %x float", data[i]);
 		    break;
 		case 0x3:
 		    break;
 		case 0x4:
-		    VERTEX_OUT("W = %f", int_as_float(data[i]));
+		    VERTEX_OUT("W = %x float", data[i]);
 		    break;
 		default:
 		    DRM_ERROR("bad S4 position mask\n");
@@ -651,22 +639,22 @@
 		for (tc = 0; tc <= 7; tc++) {
 		    switch ((saved_s2 >> (tc * 4)) & 0xf) {
 		    case 0x0:
-			VERTEX_OUT("T%d.X = %f", tc, int_as_float(data[i]));
-			VERTEX_OUT("T%d.Y = %f", tc, int_as_float(data[i]));
+			VERTEX_OUT("T%d.X = %x float", tc, data[i]);
+			VERTEX_OUT("T%d.Y = %x float", tc, data[i]);
 			break;
 		    case 0x1:
-			VERTEX_OUT("T%d.X = %f", tc, int_as_float(data[i]));
-			VERTEX_OUT("T%d.Y = %f", tc, int_as_float(data[i]));
-			VERTEX_OUT("T%d.Z = %f", tc, int_as_float(data[i]));
+			VERTEX_OUT("T%d.X = %x float", tc, data[i]);
+			VERTEX_OUT("T%d.Y = %x float", tc, data[i]);
+			VERTEX_OUT("T%d.Z = %x float", tc, data[i]);
 			break;
 		    case 0x2:
-			VERTEX_OUT("T%d.X = %f", tc, int_as_float(data[i]));
-			VERTEX_OUT("T%d.Y = %f", tc, int_as_float(data[i]));
-			VERTEX_OUT("T%d.Z = %f", tc, int_as_float(data[i]));
-			VERTEX_OUT("T%d.W = %f", tc, int_as_float(data[i]));
+			VERTEX_OUT("T%d.X = %x float", tc, data[i]);
+			VERTEX_OUT("T%d.Y = %x float", tc, data[i]);
+			VERTEX_OUT("T%d.Z = %x float", tc, data[i]);
+			VERTEX_OUT("T%d.W = %x float", tc, data[i]);
 			break;
 		    case 0x3:
-			VERTEX_OUT("T%d.X = %f", tc, int_as_float(data[i]));
+			VERTEX_OUT("T%d.X = %x float", tc, data[i]);
 			break;
 		    case 0x4:
 			VERTEX_OUT("T%d.XY = 0x%08x half-float", tc, data[i]);