With the push toward better efficiency, the stalling of clockspeed, and the impending die shrink wall I'm wondering if perhaps it might be the time for the powers that be to consider a new instruction set.
Like ARM? Not bad.
Like IA64? D: (though Paulson is quite impressive)
Quite a bit of effort has gone into "workout around" the x86 instructions. Micro-ops, macro-ops, fusion of these ops, SSID, AVX,... Perhaps it's finally time to start from scratch and design a microprocessor with up-to-date instructions?
Work has gone in to work around other ISA instructions, too. Micro-ops, fused ops, cracking ops...IBM and MIPS have done it, too, under different guises. That stuff, along with ucoded instructions, are not really bad. The ISA is there to tell the CPU what to do. The CPU can do it however it sees fit, as long as it does it correctly.
Oh, also, things like SSE, and AVX, are not work-arounds, but additions. They may fix weaknesses, but they make use of new hardware capability, and do so by acting differently. Every RISC ISA that's lasted has also gotten multiple different sets of such extensions. Scalar and vector operations are fundamentally different, in practical code. They are mostly pointless to have, without special hardware to make use of them.
Someone could surely come up with an instruction set that could fix x86' weaknesses. OTOH, it would need to catch on, and that presents a problem. An x86 CPU's decoders are going to be power-hungry, and need to be running more than a typical RISC's. Flags could be remade more cleanly, too. That stuff could be fixed, with a fairly compact IS, but would it be worth the software development and support effort, afterwards?
And, could someone do it, without screwing something up, in the process?
IA32, and x86-64, are by no means elegant, but they got a lot of things right. You could probably make page table trees a bit smaller, but it would easy to do memory management worse than x86. 2-operand, with heavy register overwriting, as it turned out, forced them to make plain better CPUs, not needing so many registers*, but instead renaming by replacing, and even memory aliasing and HW stack management.
While far from the strictest, and still needing
some barriers, x86's memory model is fairly strict, in-so-far-as the order instructions are run in one thread must be the order memory
appears to have been written to in the instruction stream, and cache coherency necessitates that other threads respect the apparent order from that thread (the subtle difference between
must be and
must appear to be is surprisingly important, allowing for reading and writing bypass optimizations, both in your code, and in the CPU itself). This can be seen as opposed to weak ordering, in which newer hardware could break your old code (yes, some CPUs did, and still may, rely on statically scheduling 'winners' of race conditions), unless it has barriers, but certain barrier semantics can necessitate either pipeline flushing, or excessive checkpointing.
Microcoded instructions can be implemented with dedicated special paths just for that CPU, and take fewer external instructions than equivalent non-ucode counterparts, including long RISC sequences. They look bad in isolation, but considering the case of being a handful of instructions in a whole program, they're not bad at all. While many do exist for legacy purposes, too, they are going to be on the slow side, most likely, and will surely be designed to take up as little die space as possible.
You could do it, yes. But, we
have x86, and while ARM's memory model can be annoying, it's well-known, both to humans and compilers, and isn't all that bad. As long as we have the memory wall, ISAs will
mostly remain uninteresting, in a practical sense, because the ones we have are good enough, that ISA differences represent a fairly small amount of difference in actual performance.
* Not that the added GPRs in x86-64 were unwelcome additions!