Moving Targets Under Your Feet

An interesting (but unfortunate) situation with many softwares for Windows has come to my attention recently – a lack of control over development environments and packaging kits…

There is still a lot of independant software out there that claims quite proudly to eg: “run on Windows XP, Vista, 7, 8 and 10”. Unfortunately, much of this software will not always run on XP despite the claim.

The Mode of Failure

On a fully-patched XP (with latest service-pack and all updates), running on a 1GHz Pentium-III processor, quite a bit of said software won’t even install – the setup program triggers an invalid-opcode exception (ie: an illegal instruction fault). In other cases, software that uses the good old flat-file SQLcompact database can’t run, because the SQLcompact database-creation statement triggers an invalid-opcode exception thus fails to initialise the database that the software needs.

I have tried this on several Pentium-III systems, from slimline laptops through desktop systems, without any change to the result.

When running fully-patched XP (with latest service-pack, etc, etc) on a Pentium-4, Athlon-64, or Transmeta Efficeon processor, the particular softwares concerned install and run perfectly.

Digging Deeper

The problem is that the software (its’ installer or the installed program itself) uses SSE2 instructions, which are only available on Pentium-4, Athlon-64 and later processors. This is in spite of two significant facts:

(1) Windows XP is officially supported on Pentium-II (no SSE at all) and Pentium-III (has SSE but not SSE2) processors.

(2) Why on earth would a software installer want to use SSE2 instructions anyway? Answer: it wouldn’t want to, but much of it accidentally does so.

Root Cause(s)

It seems that many of these software packages are built using third-party “toolkits” (libraries of utility functions etc), that have themselves recently been built using updated development environments (example: Visual Studio 2010 versus Visual Studio 2005) – using the “default optimised” target-CPU settings.

Unfortunately, many of these development environments default to enabling SSE2 instructions, thus often making the built software unable to run on Pentium-II, Pentium-III, AMD K6-2, AMD Athlon (original version), et al, et al – any processor not providing SSE2 instructions, even if running Windows XP.

Moving Targets

Alas, this kind of thing (development environments changing their “default target” settings when upgraded) is often not handled, at all, by many software developers/packagers: “it builds OK and runs on my desktop system, so it must be alright” – actually no, you need to think about (1) your claims for the software and (2) your desired target user(s).

This is a real shame, as the fix is often particularly straightforward: explicitly configure your development environment/compiler, for the projects concerned, to target the actual targets you want to support – don’t just let it assume whatever funky defaults it has this year.


Beware: your upgraded development/build tools may be cutting your prospective customers off from you, without you even realising it!

Take explicit control of your software build tools – tell the tools explicitly what you *actually* desire, not just the tools’ own guesstimate.

One thought on “Moving Targets Under Your Feet

  1. There is a piece of software for Transmeta Crusoe CPUs called CrusoeSSE which intercepts SSE instructions and skips over them, allowing hte program to continue normally without them. I wonder if anyone’s made one for older x86 chips otherwise.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s