x86-64 still includes IA32 opcodes. They don't behave exactly like standard IA32 opcodes any more: the default size of addresses gets promoted to 64 bits, while the default size of data remains 32 bits. x86-64 also introduces operand size prefix bytes which may be used to override either default.
Because x86-64 is so closely built on top of IA32, you can't get away from its legacy, especially in the place where you most want to - the decoders. I suspect a x86-64-only core wouldn't be much less complex than a x86-64 + IA32 core. As far as I know, when
@cmaier has talked about how it'd be nice to see modern x86-64 drop some legacy, he's been discussing the latter option, not the former - feel free to correct me if I'm wrong, Cliff!
Crossover's support for 32-bit Windows apps is based on the recognition that for the most part, 32-bit IA32 code can run fine on an x86-64 in 64-bit mode as long as there's enough thunking supporting it. A 'thunk' is an ABI translation layer between the system (or a library) and userspace code. This kind of thing would have to be very careful about what it lets the IA32 code see, and where it's allowed to live - code compiled for IA32 is incredibly likely to break on x86-64 if it's ever allowed to see an address outside the low 4GB of the 64-bit address space, since it has no idea how to preserve the upper 32 bits of any pointer.
As far as I know, that's what Crossover has done. It's hard to find definitive statements, but things like this blog post make it clear they're currently reliant on Rosetta 2 and will have to come up with an alternative if Apple ever drops it.
By James Ramey | You asked. We answered. Today, tomorrow and the future.
www.codeweavers.com