The execution units don't know what `01 C0` (add eax, eax) means; only the decoder does. The decoder turns those bytes into something like `eax := ADD_DSZ32(eax, eax)` that the execution unit understands.
For example, `01 01 00 00` (add [ecx], ebx) is probably translated by the PLAs into 3 uops similar to these:
tmp0 := LOAD_DSZ32(ecx)
tmp0 := ADD_DSZ32(tmp0, eax)
STORE_DSZ32(ecx, tmp0)
But any operation requiring four or more uops (such as "complex addressing") would go to either the "long" decoders or the microcode ROMHorizontal microcode is the execution unit control lines being toggled directly by the PLA. Vertical microcode (of the P5 and up) is more in line with what people understand "microcode" to be, but it's still internal uops, never "raw" x86 instructions. The encoding of the actual uop can usually be roughly correlated with the external ISA encoding, but that's just to ease work on the decoder.
Realistically, with CISC, you'll always have a microcode sequencer of some sort. More broadly, short of a TTA, there's going to be a PLA somewhere.
[0]: https://en.wikipedia.org/wiki/Transport_triggered_architectu...
AFAIK the whole RISC vs CISC thing has always been more about the software-visible instruction set than the implementation.
If the compiler could emit that microcode directly, it would be easier to optimize and the CPU wouldn't have the task of decoding and translating the CIS.
Perhaps, although ARMv8 is fixed 4 bytes and x86-64 averages more than 4 bytes an instruction despite each x86 instruction mapping to more than 1.0 uops on average. Oops.
But, yes, compilers rarely are told the right architectural generation to target.
reduced instruction sets don’t have any advantage, because if I recall what he said correctly, decoding and translating are a very small part of the transistor and latency budget. Missed branch prediction, cache and memory access are what matters for a modern CPU. Fetching from main memory has a cost, just like fetching off spinning rust used to, so hoops are jumped through to avoid memory stalls.
Still the claim that x86 implementations are RISC internally is not really true.