|
> As you kinda said, almost everything about the 1980s definition of RISC has ceased to be true. A central difference that still exists that RISC processors are typically load/store architectures. That means that before an operand that exists in memory can be used, it has to be transfered to a register. This means that an instruction like add eax, [ecx] does not work, say, under ARM. Under ARM, you have to use ldr r1, [r1]
add r0, r0, r1
Intel found out that using memory addresses both as source and target turned out to be a bad idea add [ecx], eax
(since it needs 3 phases: load value from memory, do instruction, store back). No such instructions thus exist in MMX, SSE..., AVX..., ... On the other hand, Intel still believes that using a memory operand as source only is quite a good idea on x86 (look at the encoding of SSE..., AVX..., AVX-512). Nevertheless: having the capability to do such a complicated instruction atomically is very useful for multithreading; consider for example lock add [ecx], eax
which adds eax to the memory address in ecx atomically.Also, a very typical distinction (that Intel only dropped with AVX on) is that CISC CPUs typically use 2 operands per instruction (of which one may be memory) and RISC CPUs have 3-operand instructions. So add r0, r1, r2
works on ARM, but under x86, only instructions that were introduced from AVX on (i.e. use a VEX (VEX2 or VEX3) or EVEX prefix (AVX-512); I have to look up whether something like that is also possible with a XOP prefix) have this capability.Also very often, CISC instruction sets offer complicated addressing modes, such as in x86 mov edx, [ecx+4*eax] It is not completely clear whether this is worth the complexity or not. On one hand, such instructions are hard to use for a compiler (which is the central reason why they were abolished in RISC architectures). On the other hand, skilled programmers can use them to write quite elegant and fast code. TLDR: A central difference that still exists is that - RISC architectures are load-store architectures - on CISC architectures 2 operands (1 can be memory address) are typically used and "feel more natural" - on RISC architectures, instructions typically have 3 operands. - CISC architectures often support much more different and complicated addressing modes than CISC. |