乘法是一个糟糕的例子 - 在两种体系结构中都是单个指令。在上面的"乘法"中用在CISC中更复杂且RISC没有等效的单个指令来替换它。
无论是 CISC 还是 RISC,都会根据处理器的设计将每个指令转换为更小、易于理解和分割的步骤。将乘法替换为加法,然后在汇编级别及更深层次上比较 CISC 和 RISC。例如,在 x86 中,您可以使用内存作为操作数,但在 ARM 中则不行。
register = memory + register
is
load register from memory
regster = register + register
你需要额外的步骤。
但它们都可以分解为相同的步骤序列。
resolve memory address
start memory cycle,
wait for memory cycle to end,
fetch register from register memory
send operands to alu
take alu output and store in register memory
read memory to register a
read memory to register b
shift a,
shift b,
or/add
其中CISC是什么意思:
read memory to register (takes two memory cycles)
它可能会转换成更小的指令,但像乘法这样经常使用的指令通常会有一个指定的电路。
@Pink 把它想象成一个工人使用手推车搬运砖块,一次装载10个, 相比于10个工人排队互相递送砖块,优势在于用更低的价格购买手推车, 除非那10个是太阳能机器 ;)
我对老一辈的回答感到惊讶。虽然RISC指令也可以分解成小步骤,并且它们通常被流水线化,每个周期产生一个指令(不是平均值)。用于寄存器文件的SRAM几乎总是双端口的(具有同时读写),因为这几乎可以没有成本地完成,因为它们是SRAM(只需参加数字系统课程即可)。因此,RISC处理器的实现方式是设计选择,它们可以使用微码实现,但RISC指令集被选择使得它们不需要,而实际上非微编码的CISC接近不可能。 CISC指令在实践中从未直接进行流水线处理,而仅进行CISC微码处理(实现RISC指令)。
RISC指令集不容易由人类编程。 它们更难以由人类编程,但编译器更容易优化它们。
如果指令的微码很复杂,仅通过更正微码来更正指令中的错误似乎是合理的。你不能通过微码来更正加法中的错误。因此,你可以通过更改微码来更正的错误是在RISC处理器中没有的,因为这些复杂的指令通常是由软件实现的。然而,在某些情况下,可能会将简单的RISC指令替换为微编码指令以修复错误(例如在除法中),但代价是性能大幅下降。
CISC指令可能比RISC指令更有效率,因为它们可以具有专用硬件。例如,向量移动在RISC中需要加载、存储、增量、比较和跳转指令,而它可以是单个CISC指令。CISC处理器可以有一个额外的增量单元,可以与加载和比较并行地增加地址寄存器。然而,这实际上在RISC机器中也得到了支持(如ARM)。事实上,RISC背后的基本思想是使用代码而不是微码。这导致了更少的指令直接在硬件中实现,有点像程序员或编译器直接编写微码。缺点是代码更大,
最后,RISC指令不会被分解成更小的指令,因为它们已经在单个时钟周期内以非常快的时钟速度在硬件中运行。
最终,如今高性能的CISC架构的芯片(例如x86)也将它们的指令分解成类似于RISC的微代码指令。push
/ pop
或内存目的地add
这样的指令,因为它们无法有效地流水线化。P5是双发射超标量的按顺序uarch,具有有关哪些指令可以一起运行的配对规则。请参阅Agner Fog微体系结构指南中的P5章节以获取详细信息。 - Peter Cordesmemcpy
作为单个指令可以在内部实现优化处理。x86的rep movsb
/ rep movsd
正是如此,而P6(PPro / Pentium II)引入了“快速字符串”优化微码实现以及memset
(REP设置是什么?)。但是,在具有SIMD向量的CPU上,使用SSE或AVX向量进行调整的memcpy
通常可以击败微码。rep movs
非常适合只能触摸整数寄存器的内核代码。 - Peter Cordes