If you're going to emulate them, it has to be at the software level instead of part of the CPU (otherwise you'd effectively just have implemented the instruction, but stupidly, and still fall foul of any intellectual property issues), so you need to run custom code when an unimplemented instruction is decoded (that's easy - you can just trap on an invalid opcode), but also need to tell software that might try to use them that you support those extensions (plenty of software checks the CPUID on startup and just errors out if required extensions aren't reported). That's harder to do. You could:
- run all user software with a debugger attached, single-stepping it and intervening when the CPUID instruction appears. This would be really slow as you'd have to context switch to run some debugger code after every instruction.
- run all user software on an emulated machine, in which case it doesn't matter what your real architecture is (although having a compatible memory model helps avoid loads of locks).
- run all user software on a virtual machine, which requires virtualisation extensions, which came later than AMD64.