CVS Xserver breaks on non-SSE capable i386 machines

Krzysztof Halasa khc at pm.waw.pl
Sat Jul 23 16:47:18 PDT 2005


Hi,

It looks like the following change broke Xserver on non-SSE i386
machines (Pentium MMX and earlier, and VIA C3 which lacks cmov
instruction):

diff -u -r1.9 -r1.10
--- /cvs/xorg/xc/programs/Xserver/fb/Imakefile	2005/01/19 21:56:07	1.9
+++ /cvs/xorg/xc/programs/Xserver/fb/Imakefile	2005/07/12 10:02:10	1.10
@@ -4,17 +4,11 @@
 XCOMM Id: Imakefile,v 1.1 1999/11/02 03:54:44 keithp Exp $
 
 #if defined(HasGcc34) && HasGcc34
-MMXOPTIONS= -mmmx -Winline --param inline-unit-growth=10000 \
+MMXOPTIONS= -mmmx -msse -Winline --param inline-unit-growth=10000 \
 	--param large-function-growth=10000 -DUSE_MMX
-SSEOPTIONS= $(MMXOPTIONS) -msse -DUSE_SSE
-
-#if defined(i386Architecture)
-SpecialCObjectRule(fbmmx,fbmmx.c,$(MMXOPTIONS))
-#elif defined(AMD64Architecture)
-SpecialCObjectRule(fbmmx,fbmmx.c,$(SSEOPTIONS))
-#endif
 
 #if defined(i386Architecture) || defined(AMD64Architecture)
+SpecialCObjectRule(fbmmx,fbmmx.c,$(MMXOPTIONS))
 SpecialCObjectRule(fbpict,fbpict.c,$(MMXOPTIONS))
 SpecialCObjectRule(fbfill,fbfill.c,$(MMXOPTIONS))
 SpecialCObjectRule(fbcopy,fbcopy.c,$(MMXOPTIONS))

---------------------------------------------------------------------

Unless I miss something, this change inconditionally adds "-msse" on
all i386 machines with gcc 3.4+.


The problems are:

1. "-msse" argument to gcc causes it to generate code using "cmov"
instruction. Pentium MMX and earlier, and certain VIA C3 CPUs, lack
cmov instruction, causing Xserver to die with SIGILL.

Fix: Removing "-msse" for those files (fbmmx.c, fbpict.c, fbfill.c,
fbcopy.c) should fix this problem.



2. fbmmx.c does:
#include <xmmintrin.h> /* for _mm_shuffle_pi16 and _MM_SHUFFLE */

xmmintrin.h (a gcc header file) can't be included unless "-msse" or
equivalent is passed to gcc:

#ifndef __SSE__
# error "SSE instruction set not enabled"

fbmmx.c uses _mm_shuffle_pi16 which is pshufw (SSE and not just MMX)
instruction. fbmmx.c and friends use it when MMX is available (#defined
USE_MMX and fbHaveMMX()) but it can't work on Pentium MMX and other
non-SSE capable CPUs.

Fix: xmmintrin.h and "-msse" must not be used, pshufw (if available)
must be called using other means (asm?) and a replacement routine must
be written in case no SSE CPU is detected.

Comments?

I can try to fix it if the above is correct.
-- 
Krzysztof Halasa



More information about the xorg mailing list