summaryrefslogtreecommitdiff
path: root/base/cpudep.c
diff options
context:
space:
mode:
Diffstat (limited to 'base/cpudep.c')
-rw-r--r--base/cpudep.c44
1 files changed, 31 insertions, 13 deletions
diff --git a/base/cpudep.c b/base/cpudep.c
index 0301213d..c7af38b9 100644
--- a/base/cpudep.c
+++ b/base/cpudep.c
@@ -32,8 +32,8 @@ static void sse(void)
static void sse2(void)
{ __asm__ ("andpd %xmm0, %xmm0\n\t"); }
-static void sse3(void)
-{ __asm__ ("haddps %%xmm0, %%xmm0\n\t" : : : "%xmm0"); }
+/* static void sse3(void) */
+/* { __asm__ ("haddps %%xmm0, %%xmm0\n\t" : : : "%xmm0"); } */
#ifdef ARCH_X86_64
static void amd64(void)
@@ -47,7 +47,7 @@ static const featuretest features[] = {
{ mmxext, HAVE_MMXEXT, "mmxext" },
{ sse, HAVE_SSE, "sse" },
{ sse2, HAVE_SSE2, "sse2" },
- { sse3, HAVE_SSE3, "sse3" },
+/* { sse3, HAVE_SSE3, "sse3" }, */
#ifdef ARCH_X86_64
{ amd64, HAVE_AMD64, "amd64" }
#endif
@@ -105,33 +105,45 @@ sigillhandler(int sig)
siglongjmp(jmpbuf, 1);
}
+static int
+enabled(char *env, const char *ext)
+{
+ int len;
+ char *s;
+ if (!env)
+ return 1;
+ len = strlen(ext);
+ while ((s = strstr(env, ext)))
+ {
+ s += len;
+ if (*s == ' ' || *s == ',' || *s == '\0')
+ return 1;
+ }
+ return 0;
+}
+
static void
dumpflags(void)
{
unsigned f = fz_cpuflags;
int i, n;
- fputs("detected cpu features: ", stdout);
+ fputs("detected cpu features:", stdout);
n = 0;
for (i = 0; i < sizeof(features) / sizeof(featuretest); i++)
{
if (f & features[i].flag)
{
+ fputc(' ', stdout);
fputs(features[i].name, stdout);
n ++;
}
}
if (!n)
- fputs("none", stdout);
+ fputs(" none", stdout);
fputc('\n', stdout);
}
-/* called by runtime before main()...
- * TODO:
- * CPUACCEL=0 ./x11pdf disables detection
- * CPUACCEL='mmx sse' enables only mmx and sse
- * not set enables everything
- */
void fz_cpudetect(void)
{
static int hasrun = 0;
@@ -140,11 +152,14 @@ void fz_cpudetect(void)
int i;
void (*oldhandler)(int) = NULL;
void (*tmphandler)(int);
+ char *env;
if (hasrun)
return;
hasrun = 1;
+ env = getenv("CPUACCEL");
+
for (i = 0; i < sizeof(features) / sizeof(featuretest); i++)
{
canjump = 0;
@@ -165,7 +180,10 @@ void fz_cpudetect(void)
features[i].test();
/* if we got here the test succeeded */
- flags |= features[i].flag;
+ if (enabled(env, features[i].name))
+ flags |= features[i].flag;
+ else
+ flags &= ~features[i].flag;
}
/* restore previous signal handler */
@@ -176,7 +194,7 @@ void fz_cpudetect(void)
dumpflags();
}
-static __attribute__((constructor)) void fzcpudetect(void)
+static __attribute__((constructor, used)) void fzcpudetect(void)
{
fz_cpudetect();
}