乘法既是好例子,也是坏例子。首先,乘法是一条昂贵的指令,一些处理器没有一个很好的理由。你可以和x86等有,拿多个时钟或者一个时钟。要获得一个时钟乘法需要(相对)大量的芯片空间(正如 Dani 提到的,可能需要一个专用的逻辑块,仅用于乘法)。绝对没有理由为什么一位设计师会做出与另一位设计师相同的选择,无论是在同一家公司(一个 x86 与另一个相比)还是不同的架构(x86 与 arm 与 mips 等)。每个设计师都知道乘法的结果是操作数的两倍,所以你选择给程序员所有操作数组合的完整答案(结果与操作数的大小不同)还是剪裁结果在操作数大小?如果你剪辑给他们一个溢出或异常,或者你让他们继续运行而不知道结果是错误的?您是否强制他们在所有 mul 和 div 指令周围添加包装器,以便可以检测到溢出成本性能?
x86 是一个非常糟糕的架构,首先学习或用作其他人的参考。它会导致很多错误的假设。并非所有处理器都是微编码的。并非所有 CISC 处理器都是微码。 RISC处理器没有理由不能进行微编码,您可以对CISC或RISC进行微编码,也可以不对CISC或RISC进行微编码,这是一种设计选择,而不是规则。
RISC 并不意味着最少的步数,即使是一个简单的寄存器到寄存器移动也是最少两个步骤(获取源,存储结果),这可能需要两个时钟来执行处理器有时实现的方式(使用 sram bank 进行寄存器不一定是双端口的文件)。 alu 指令是三个步骤,在 RISC 处理器上可以占用三个时钟,RISC 将平均每条指令一个时钟,但 CISC 也可以。您可以使用超标量并超过每条指令一个时钟,至少对于处理器受限时的突发。对于 CISC 和 RISC,超标量的复杂性是相同的。
我建议编写一个指令集模拟器,或者至少启动一个。如果没有别的,那就是反汇编程序。最好让 100 名程序员执行相同的编程任务,但彼此隔离。即使所有人都在同一所学校由同一位老师授课,您也会为该 iss 或反汇编程序获得 3 到 100 种不同的设计。让它成为一个文本编辑器作为一项编程任务,只是编程语言的选择首先会有所不同,然后程序的设计会有所不同。硬件设与 CISC 与 RISC 的关系较少,而与设计团队及其选择有关。英特尔有不同的设计目标,例如反向兼容,这是一个非常昂贵的选择。
BOTH CISC 和 RISC 将每条指令转换为基于处理器设计的更小的可消化/可分割的步骤。将乘法替换为加法,然后在 asm 级别比较 CISC 与 RISC,然后更深入。使用 x86,您可以将内存用作操作数,例如,您不能使用 arm。所以
register = memory + register
是
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
现在 cisc 实际上稍微快了一点,因为要正确执行指令,risc 需要将从内存读取的值存储在额外的寄存器中(从 asm 的角度来看,cisc 有两个寄存器,risc,三个或两个 on 重用)。
如果从内存中读取的值未对齐,则 cisc 在技术上胜出(如果 risc 通常不允许未对齐传输)。 cisc 处理器需要相同数量的内存周期来获取所有保持相等的未对齐数据(两个处理器都需要两个内存周期,cisc 和 risc 都会受到惩罚)。但是要专注于 asm 指令与 asm 指令,如果内存操作数未对齐,则 risc 必须这样做
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)
您还具有指令大小,流行的 risc 处理器(如 arm 和 mips)倾向于固定指令长度,而 x86 是可变的。 x86 可以在一个字节内完成另一个需要四个字节才能完成的工作。是的,您的获取和解码更复杂(更多逻辑,更多功能等),但您可以在相同大小的缓存中容纳更多指令。
微编码不仅仅是将一个指令集分解成另一个指令集(另一个指令集可能非常痛苦,您永远不想在本机编程)。假设较低级别的系统可以更快地实现且错误更少,微编码可以帮助您更快地进入市场。假设您可以更快地提高产量,因为您可以在事后修复一些错误,并且可以在现场进行修补。并不总是完美,也不总是成功,但将其与非微码处理器相比,您必须让编译器人员修复错误或召回处理器或将公司视为黑眼圈并希望赢得一些客户等等……
所以答案是否定的。 RISC 和 CISC 都将单个指令转换为可以微编码或不编码的一系列步骤。简单地认为它们是您喜欢的状态机中的状态。 CISC 可能有一些将更多步骤打包到一条指令中,但这意味着更少的指令获取。并且知道整个 CISC 指令,这些步骤自然可以在芯片中更有效地实现,其中 RISC 处理器可能必须检查一系列指令并动态优化以获得相同数量的步骤。 (ldr r0,[r1]; 添加 r0,r0,r2)。如果 CISC 要检查指令组而不是专注于一个指令组,它也可以寻找相同类型的优化。两者都使用管道和并行执行。 CISC 通常意味着 x86,而 RISC 则意味着具有更现代和更简洁的架构。更清洁是指人类更容易编程和实施,但这并不意味着更快。完成相同工作的更多步骤。 x86 是可变字长,历史可以追溯到单字节指令,与 4 字节固定指令长度相比,x86 有可能将比固定指令长度 risc 更多的指令打包到缓存中,从而使 x86 成为可能性能提升。为什么 risc 不直接将许多指令转换成一条更小的指令,从而更快地通过缓存和流水线?