Commit f5c5cb10 authored by Mike Gabriel's avatar Mike Gabriel

Xserver/fb: Drop fbmmx.[ch] files and code passages wrapped-in by USE_MMX macro.

commit 78179ae827bb5d19abb1340084362bc51ad5c1e5 Author: Søren Sandmann Pedersen <sandmann@redhat.com> Date: Mon Jun 11 22:46:42 2007 -0400 Remove fbmmx.[ch] files Backported-to-NX-by: 's avatarMike Gabriel <mike.gabriel@das-netzwerkteam.de> Other than X.org, we don't yet introduce using pixman_* function calls in the nxagent Xserver's fb code. Fixes ArcticaProject/nx-libs#252.
parent 89e1457d
/*
* The X.org 6.8.99.16 snapshot fails to compile with GCC 4.
* Temporarily disable the MMX features until the bug is
* fixed.
*
#if defined(HasGcc34) && HasGcc34
MMXOPTIONS= -mmmx -msse -Winline --param inline-unit-growth=10000 \
--param large-function-growth=10000 -DUSE_MMX
USEMMXOPTIONS= -DUSE_MMX
#if defined(i386Architecture) || defined(AMD64Architecture)
SpecialCObjectRule(fbmmx,fbmmx.c,$(MMXOPTIONS))
SpecialCObjectRule(fbpict,fbpict.c,$(USEMMXOPTIONS))
SpecialCObjectRule(fbfill,fbfill.c,$(USEMMXOPTIONS))
SpecialCObjectRule(fbcopy,fbcopy.c,$(USEMMXOPTIONS))
#endif
#endif
*/
NULL = NULL =
#include <Server.tmpl> #include <Server.tmpl>
...@@ -74,7 +55,6 @@ SRCS = $(XFMODSRC) \ ...@@ -74,7 +55,6 @@ SRCS = $(XFMODSRC) \
fbwindow.c \ fbwindow.c \
fb24_32.c \ fb24_32.c \
fbpict.c \ fbpict.c \
fbmmx.c \
$(NULL) $(NULL)
OBJS = $(XFMODOBJ) \ OBJS = $(XFMODOBJ) \
...@@ -111,7 +91,6 @@ OBJS = $(XFMODOBJ) \ ...@@ -111,7 +91,6 @@ OBJS = $(XFMODOBJ) \
fbwindow.o \ fbwindow.o \
fb24_32.o \ fb24_32.o \
fbpict.o \ fbpict.o \
fbmmx.o \
$(NULL) $(NULL)
INCLUDES = -I$(SERVERSRC)/fb -I$(SERVERSRC)/mi -I$(SERVERSRC)/include \ INCLUDES = -I$(SERVERSRC)/fb -I$(SERVERSRC)/mi -I$(SERVERSRC)/include \
...@@ -173,7 +152,6 @@ LinkSourceFile(fbtile.c,LinkDirectory) ...@@ -173,7 +152,6 @@ LinkSourceFile(fbtile.c,LinkDirectory)
LinkSourceFile(fbtrap.c,LinkDirectory) LinkSourceFile(fbtrap.c,LinkDirectory)
LinkSourceFile(fbutil.c,LinkDirectory) LinkSourceFile(fbutil.c,LinkDirectory)
LinkSourceFile(fbwindow.c,LinkDirectory) LinkSourceFile(fbwindow.c,LinkDirectory)
LinkSourceFile(fbmmx.c,LinkDirectory)
#endif #endif
InstallDriverSDKLibraryModule(fb,$(DRIVERSDKMODULEDIR),.) InstallDriverSDKLibraryModule(fb,$(DRIVERSDKMODULEDIR),.)
......
...@@ -30,7 +30,6 @@ ...@@ -30,7 +30,6 @@
#ifdef IN_MODULE #ifdef IN_MODULE
#include "xf86_ansic.h" #include "xf86_ansic.h"
#endif #endif
#include "fbmmx.h"
void void
fbCopyNtoN (DrawablePtr pSrcDrawable, fbCopyNtoN (DrawablePtr pSrcDrawable,
...@@ -61,27 +60,6 @@ fbCopyNtoN (DrawablePtr pSrcDrawable, ...@@ -61,27 +60,6 @@ fbCopyNtoN (DrawablePtr pSrcDrawable,
while (nbox--) while (nbox--)
{ {
#ifdef USE_MMX
if (pm == FB_ALLONES && alu == GXcopy && !reverse &&
!upsidedown && fbHaveMMX())
{
if (!fbCopyAreammx (pSrcDrawable,
pDstDrawable,
(pbox->x1 + dx),
(pbox->y1 + dy),
(pbox->x1),
(pbox->y1),
(pbox->x2 - pbox->x1),
(pbox->y2 - pbox->y1)))
goto fallback;
else
goto next;
}
fallback:
#endif
fbBlt (src + (pbox->y1 + dy + srcYoff) * srcStride, fbBlt (src + (pbox->y1 + dy + srcYoff) * srcStride,
srcStride, srcStride,
(pbox->x1 + dx + srcXoff) * srcBpp, (pbox->x1 + dx + srcXoff) * srcBpp,
...@@ -99,9 +77,6 @@ fbCopyNtoN (DrawablePtr pSrcDrawable, ...@@ -99,9 +77,6 @@ fbCopyNtoN (DrawablePtr pSrcDrawable,
reverse, reverse,
upsidedown); upsidedown);
#ifdef USE_MMX
next:
#endif
pbox++; pbox++;
} }
} }
......
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
#endif #endif
#include "fb.h" #include "fb.h"
#include "fbmmx.h"
void void
fbFill (DrawablePtr pDrawable, fbFill (DrawablePtr pDrawable,
...@@ -47,11 +46,6 @@ fbFill (DrawablePtr pDrawable, ...@@ -47,11 +46,6 @@ fbFill (DrawablePtr pDrawable,
switch (pGC->fillStyle) { switch (pGC->fillStyle) {
case FillSolid: case FillSolid:
#ifdef USE_MMX
if (!pPriv->and && fbHaveMMX())
if (fbSolidFillmmx (pDrawable, x, y, width, height, pPriv->xor))
return;
#endif
fbSolid (dst + (y + dstYoff) * dstStride, fbSolid (dst + (y + dstYoff) * dstStride,
dstStride, dstStride,
(x + dstXoff) * dstBpp, (x + dstXoff) * dstBpp,
......
/*
* Copyright © 2004 Red Hat, Inc.
* Copyright © 2005 Trolltech AS
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Red Hat not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. Red Hat makes no representations about the
* suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
* SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*
* Author: Søren Sandmann (sandmann@redhat.com)
* Lars Knoll (lars@trolltech.com)
*
* Based on work by Owen Taylor
*/
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#ifdef USE_MMX
#if !defined(__amd64__) && !defined(__x86_64__)
Bool fbHaveMMX(void);
#else
#define fbHaveMMX() TRUE
#endif
#else
#define fbHaveMMX() FALSE
#endif
#ifdef USE_MMX
void fbComposeSetupMMX(void);
void fbCompositeSolidMask_nx8888x0565Cmmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void fbCompositeSrcAdd_8888x8888mmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void fbCompositeSrc_8888x8888mmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void fbCompositeSolidMask_nx8888x8888Cmmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void fbCompositeSolidMask_nx8x8888mmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void fbCompositeSrcAdd_8000x8000mmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void fbCompositeSrc_8888RevNPx8888mmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void fbCompositeSrc_8888RevNPx0565mmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void fbCompositeSolid_nx8888mmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void fbCompositeSolid_nx0565mmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void fbCompositeSolidMask_nx8x0565mmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void fbCompositeSrc_8888x8x8888mmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
Bool fbCopyAreammx (DrawablePtr pSrc,
DrawablePtr pDst,
int src_x,
int src_y,
int dst_x,
int dst_y,
int width,
int height);
void fbCompositeCopyAreammx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
Bool fbSolidFillmmx (DrawablePtr pDraw,
int x,
int y,
int width,
int height,
FbBits xor);
#endif /* USE_MMX */
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#include "picturestr.h" #include "picturestr.h"
#include "mipict.h" #include "mipict.h"
#include "fbpict.h" #include "fbpict.h"
#include "fbmmx.h"
typedef void (*CompositeFunc) (CARD8 op, typedef void (*CompositeFunc) (CARD8 op,
PicturePtr pSrc, PicturePtr pSrc,
...@@ -850,14 +849,6 @@ fbComposite (CARD8 op, ...@@ -850,14 +849,6 @@ fbComposite (CARD8 op,
int x_msk, y_msk, x_src, y_src, x_dst, y_dst; int x_msk, y_msk, x_src, y_src, x_dst, y_dst;
int w, h, w_this, h_this; int w, h, w_this, h_this;
#ifdef USE_MMX
static Bool mmx_setup = FALSE;
if (!mmx_setup) {
fbComposeSetupMMX();
mmx_setup = TRUE;
}
#endif
xDst += pDst->pDrawable->x; xDst += pDst->pDrawable->x;
yDst += pDst->pDrawable->y; yDst += pDst->pDrawable->y;
if (pSrc->pDrawable) { if (pSrc->pDrawable) {
...@@ -879,13 +870,6 @@ fbComposite (CARD8 op, ...@@ -879,13 +870,6 @@ fbComposite (CARD8 op,
&& (!pMask || pMask->filter != PictFilterConvolution)) && (!pMask || pMask->filter != PictFilterConvolution))
switch (op) { switch (op) {
case PictOpSrc: case PictOpSrc:
#ifdef USE_MMX
if (!pMask && pSrc->format == pDst->format &&
pSrc->format != PICT_a8 && pSrc->pDrawable != pDst->pDrawable)
{
func = fbCompositeCopyAreammx;
}
#endif
break; break;
case PictOpOver: case PictOpOver:
if (pMask) if (pMask)
...@@ -901,11 +885,6 @@ fbComposite (CARD8 op, ...@@ -901,11 +885,6 @@ fbComposite (CARD8 op,
switch (pDst->format) { switch (pDst->format) {
case PICT_r5g6b5: case PICT_r5g6b5:
case PICT_b5g6r5: case PICT_b5g6r5:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSolidMask_nx8x0565mmx;
else
#endif
func = fbCompositeSolidMask_nx8x0565; func = fbCompositeSolidMask_nx8x0565;
break; break;
case PICT_r8g8b8: case PICT_r8g8b8:
...@@ -916,11 +895,6 @@ fbComposite (CARD8 op, ...@@ -916,11 +895,6 @@ fbComposite (CARD8 op,
case PICT_x8r8g8b8: case PICT_x8r8g8b8:
case PICT_a8b8g8r8: case PICT_a8b8g8r8:
case PICT_x8b8g8r8: case PICT_x8b8g8r8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSolidMask_nx8x8888mmx;
else
#endif
func = fbCompositeSolidMask_nx8x8888; func = fbCompositeSolidMask_nx8x8888;
break; break;
} }
...@@ -930,19 +904,9 @@ fbComposite (CARD8 op, ...@@ -930,19 +904,9 @@ fbComposite (CARD8 op,
switch (pDst->format) { switch (pDst->format) {
case PICT_a8r8g8b8: case PICT_a8r8g8b8:
case PICT_x8r8g8b8: case PICT_x8r8g8b8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSolidMask_nx8888x8888Cmmx;
else
#endif
func = fbCompositeSolidMask_nx8888x8888C; func = fbCompositeSolidMask_nx8888x8888C;
break; break;
case PICT_r5g6b5: case PICT_r5g6b5:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSolidMask_nx8888x0565Cmmx;
else
#endif
func = fbCompositeSolidMask_nx8888x0565C; func = fbCompositeSolidMask_nx8888x0565C;
break; break;
} }
...@@ -953,19 +917,9 @@ fbComposite (CARD8 op, ...@@ -953,19 +917,9 @@ fbComposite (CARD8 op,
switch (pDst->format) { switch (pDst->format) {
case PICT_a8b8g8r8: case PICT_a8b8g8r8:
case PICT_x8b8g8r8: case PICT_x8b8g8r8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSolidMask_nx8888x8888Cmmx;
else
#endif
func = fbCompositeSolidMask_nx8888x8888C; func = fbCompositeSolidMask_nx8888x8888C;
break; break;
case PICT_b5g6r5: case PICT_b5g6r5:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSolidMask_nx8888x0565Cmmx;
else
#endif
func = fbCompositeSolidMask_nx8888x0565C; func = fbCompositeSolidMask_nx8888x0565C;
break; break;
} }
...@@ -1003,16 +957,8 @@ fbComposite (CARD8 op, ...@@ -1003,16 +957,8 @@ fbComposite (CARD8 op,
switch (pDst->format) { switch (pDst->format) {
case PICT_a8r8g8b8: case PICT_a8r8g8b8:
case PICT_x8r8g8b8: case PICT_x8r8g8b8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrc_8888RevNPx8888mmx;
#endif
break; break;
case PICT_r5g6b5: case PICT_r5g6b5:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrc_8888RevNPx0565mmx;
#endif
break; break;
} }
break; break;
...@@ -1025,16 +971,8 @@ fbComposite (CARD8 op, ...@@ -1025,16 +971,8 @@ fbComposite (CARD8 op,
switch (pDst->format) { switch (pDst->format) {
case PICT_a8b8g8r8: case PICT_a8b8g8r8:
case PICT_x8b8g8r8: case PICT_x8b8g8r8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrc_8888RevNPx8888mmx;
#endif
break; break;
case PICT_r5g6b5: case PICT_r5g6b5:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrc_8888RevNPx0565mmx;
#endif
break; break;
} }
break; break;
...@@ -1054,10 +992,6 @@ fbComposite (CARD8 op, ...@@ -1054,10 +992,6 @@ fbComposite (CARD8 op,
pDst->format == PICT_x8r8g8b8 && pDst->format == PICT_x8r8g8b8 &&
pMask->format == PICT_a8) pMask->format == PICT_a8)
{ {
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrc_8888x8x8888mmx;
#endif
} }
} }
} }
...@@ -1075,22 +1009,8 @@ fbComposite (CARD8 op, ...@@ -1075,22 +1009,8 @@ fbComposite (CARD8 op,
switch (pDst->format) { switch (pDst->format) {
case PICT_a8r8g8b8: case PICT_a8r8g8b8:
case PICT_x8r8g8b8: case PICT_x8r8g8b8:
#ifdef USE_MMX
if (fbHaveMMX())
{
srcRepeat = FALSE;
func = fbCompositeSolid_nx8888mmx;
}
#endif
break; break;
case PICT_r5g6b5: case PICT_r5g6b5:
#ifdef USE_MMX
if (fbHaveMMX())
{
srcRepeat = FALSE;
func = fbCompositeSolid_nx0565mmx;
}
#endif
break; break;
} }
break; break;
...@@ -1103,11 +1023,6 @@ fbComposite (CARD8 op, ...@@ -1103,11 +1023,6 @@ fbComposite (CARD8 op,
switch (pDst->format) { switch (pDst->format) {
case PICT_a8r8g8b8: case PICT_a8r8g8b8:
case PICT_x8r8g8b8: case PICT_x8r8g8b8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrc_8888x8888mmx;
else
#endif
func = fbCompositeSrc_8888x8888; func = fbCompositeSrc_8888x8888;
break; break;
case PICT_r8g8b8: case PICT_r8g8b8:
...@@ -1122,20 +1037,12 @@ fbComposite (CARD8 op, ...@@ -1122,20 +1037,12 @@ fbComposite (CARD8 op,
switch (pDst->format) { switch (pDst->format) {
case PICT_a8r8g8b8: case PICT_a8r8g8b8:
case PICT_x8r8g8b8: case PICT_x8r8g8b8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeCopyAreammx;
#endif
break; break;
} }
case PICT_x8b8g8r8: case PICT_x8b8g8r8:
switch (pDst->format) { switch (pDst->format) {
case PICT_a8b8g8r8: case PICT_a8b8g8r8:
case PICT_x8b8g8r8: case PICT_x8b8g8r8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeCopyAreammx;
#endif
break; break;
} }
break; break;
...@@ -1143,11 +1050,6 @@ fbComposite (CARD8 op, ...@@ -1143,11 +1050,6 @@ fbComposite (CARD8 op,
switch (pDst->format) { switch (pDst->format) {
case PICT_a8b8g8r8: case PICT_a8b8g8r8:
case PICT_x8b8g8r8: case PICT_x8b8g8r8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrc_8888x8888mmx;
else
#endif
func = fbCompositeSrc_8888x8888; func = fbCompositeSrc_8888x8888;
break; break;
case PICT_b8g8r8: case PICT_b8g8r8:
...@@ -1183,11 +1085,6 @@ fbComposite (CARD8 op, ...@@ -1183,11 +1085,6 @@ fbComposite (CARD8 op,
case PICT_a8r8g8b8: case PICT_a8r8g8b8:
switch (pDst->format) { switch (pDst->format) {
case PICT_a8r8g8b8: case PICT_a8r8g8b8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrcAdd_8888x8888mmx;
else
#endif
func = fbCompositeSrcAdd_8888x8888; func = fbCompositeSrcAdd_8888x8888;
break; break;
} }
...@@ -1195,11 +1092,6 @@ fbComposite (CARD8 op, ...@@ -1195,11 +1092,6 @@ fbComposite (CARD8 op,
case PICT_a8b8g8r8: case PICT_a8b8g8r8:
switch (pDst->format) { switch (pDst->format) {
case PICT_a8b8g8r8: case PICT_a8b8g8r8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrcAdd_8888x8888mmx;
else
#endif
func = fbCompositeSrcAdd_8888x8888; func = fbCompositeSrcAdd_8888x8888;
break; break;
} }
...@@ -1207,11 +1099,6 @@ fbComposite (CARD8 op, ...@@ -1207,11 +1099,6 @@ fbComposite (CARD8 op,
case PICT_a8: case PICT_a8:
switch (pDst->format) { switch (pDst->format) {
case PICT_a8: case PICT_a8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrcAdd_8000x8000mmx;
else
#endif
func = fbCompositeSrcAdd_8000x8000; func = fbCompositeSrcAdd_8000x8000;
break; break;
} }
...@@ -1336,121 +1223,3 @@ fbPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats) ...@@ -1336,121 +1223,3 @@ fbPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
return TRUE; return TRUE;
} }
#ifdef USE_MMX
/* The CPU detection code needs to be in a file not compiled with
* "-mmmx -msse", as gcc would generate CMOV instructions otherwise
* that would lead to SIGILL instructions on old CPUs that don't have
* it.
*/
#if !defined(__amd64__) && !defined(__x86_64__)
enum CPUFeatures {
NoFeatures = 0,
MMX = 0x1,
MMX_Extensions = 0x2,
SSE = 0x6,
SSE2 = 0x8,
CMOV = 0x10
};
static unsigned int detectCPUFeatures(void) {
unsigned int result;
char vendor[13];
vendor[0] = 0;
vendor[12] = 0;
/* see p. 118 of amd64 instruction set manual Vol3 */
/* We need to be careful about the handling of %ebx and
* %esp here. We can't declare either one as clobbered
* since they are special registers (%ebx is the "PIC
* register" holding an offset to global data, %esp the
* stack pointer), so we need to make sure they have their+ * original values when we access the output operands.
*/
__asm__ ("pushf\n"
"pop %%eax\n"
"mov %%eax, %%ecx\n"
"xor $0x00200000, %%eax\n"
"push %%eax\n"
"popf\n"
"pushf\n"
"pop %%eax\n"
"mov $0x0, %%edx\n"
"xor %%ecx, %%eax\n"
"jz 1\n"
"mov $0x00000000, %%eax\n"
"push %%ebx\n"
"cpuid\n"
"mov %%ebx, %%eax\n"
"pop %%ebx\n"
"mov %%eax, %1\n"
"mov %%edx, %2\n"
"mov %%ecx, %3\n"
"mov $0x00000001, %%eax\n"
"push %%ebx\n"
"cpuid\n"
"pop %%ebx\n"
"1:\n"
"mov %%edx, %0\n"
: "=r" (result),
"=m" (vendor[0]),
"=m" (vendor[4]),
"=m" (vendor[8])
:
: "%eax", "%ecx", "%edx"
);
unsigned int features = 0;
if (result) {
/* result now contains the standard feature bits */
if (result & (1 << 15))
features |= CMOV;
if (result & (1 << 23))
features |= MMX;
if (result & (1 << 25))
features |= SSE;
if (result & (1 << 26))
features |= SSE2;
if ((result & MMX) && !(result & SSE) && (strcmp(vendor, "AuthenticAMD") == 0)) {
/* check for AMD MMX extensions */
unsigned int result;
__asm__("push %%ebx\n"
"mov $0x80000000, %%eax\n"
"cpuid\n"
"xor %%edx, %%edx\n"
"cmp $0x1, %%eax\n"
"jge 2\n"
"mov $0x80000001, %%eax\n"
"cpuid\n"
"2:\n"
"pop %%ebx\n"
"mov %%edx, %0\n"
: "=r" (result)
:
: "%eax", "%ecx", "%edx"
);
if (result & (1<<22))
features |= MMX_Extensions;
}
}
return features;
}
Bool
fbHaveMMX (void)
{
static Bool initialized = FALSE;
static Bool mmx_present;
if (!initialized)
{
unsigned int features = detectCPUFeatures();
mmx_present = (features & (MMX|MMX_Extensions)) == (MMX|MMX_Extensions);
initialized = TRUE;
}
return mmx_present;
}
#endif /* __amd64__ */
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment