![CISC 和 VLIW,以及指令和操作码](https://linux22.com/image/1395555/CISC%20%E5%92%8C%20VLIW%EF%BC%8C%E4%BB%A5%E5%8F%8A%E6%8C%87%E4%BB%A4%E5%92%8C%E6%93%8D%E4%BD%9C%E7%A0%81.png)
从http://en.wikipedia.org/wiki/Instruction_set
CISC 处理器在其指令集中包含“复杂”指令。单个“复杂”指令执行的操作可能需要其他计算机上的许多指令。此类指令的典型特征是需要多个步骤、控制多个功能单元或以其他方式出现在比给定处理器实现的大量简单指令更大的规模上的指令。
...
在超长指令字 (VLIW) 架构,其中包括许多微码架构,单个指令包括多个同时的操作码及其操作数。
在我看来,CISC 和 VLIW 是同一个概念,因为一条指令包含多个操作(即操作码)。那么它们是同一个概念吗?
当判断一条指令是否有多个操作(即操作码)时,如何定义单个操作(即操作码)?
答案1
现代 CISC 处理器有多个执行单元。它们还有许多额外的电路和逻辑来尝试在这些执行单元之间分配指令流。
VLIW 试图让编译器完成部分工作,并将节省的电路用于更多的执行单元、缓存或其他资源。
以 Itanium 为例,其指令字为 128 位,包含三条指令。这让编译器可以完成一些配对指令的工作,以便一起执行。
答案2
一条指令是一条命令,在逻辑上必须在下一条指令之前完成。如果一条指令包含多个操作,例如 VLIW 指令,则这些操作应同时完成。在 VLIW 指令中,每个操作槽对应于一个硬件处理单元(FPU 和 ALU 的组合),这些操作槽由指令静态分配。而在 CISC 或 RISC 中,处理器可以选择任何空闲的处理单元。但是,由于单元是在 VLIW 指令中分配的,因此您无法在具有更多或更少处理单元的另一个模型上运行一个 VLIW 的代码,因为该指令的指令中会有更多或更少的槽,尽管一些更大的指令可能允许运行使用具有较少槽的格式的代码,与 CISC 或 RISC 不同,在 CISC 或 RISC 中,代码可以自动使用额外的处理单元,VLIW 代码不能使用额外的处理单元,除非专门为处理器重新编译。
VLIW 的这种限制促使显式数据图执行 (EDGE)。
答案3
当判断一条指令是否有多个操作(即操作码)时,如何定义单个操作(即操作码)?
这些定义和您的期望不太正确。“操作码”用于指示可见的指令,而不是像微操作这样的隐藏操作,以及“操作说明”应该只指用户暴露的操作。“操作”并不对应于操作码,它可能是简单的(单个操作码)或复杂的(多个操作码),具体取决于您如何引用它,例如,如果您想要解决整个操作本身,或者解决用于实现该大目标的每个较低级别的操作。就像您执行除法时,它可以称为单个操作。但除法也可以细分为一系列减法/乘法,即多个操作(硬件术语中的阶段)。许多旧的 RISC 架构对除法的各个阶段都有单独的指令,以保持指令简单并使流水线变得简单。但现代 RISC 架构通常不会这样做,并且可以像 CISC 一样拥有非常复杂的指令,例如rlwinm
在 PowerPC 或ldm/stm
ARM 中。
在VLIW 架构,一条指令仍然是一条指令。但是,指令将组合在一起作为批处理。例如,Itanium 架构中的批处理包含 3 条将要运行的指令同时。当然,每条指令都必须有自己的操作码,这些操作码可供程序员使用。此外,这些指令与其他指令无关,不像微操作那样共同代表某些高级指令的操作。例如,在某些架构中,您可能在一个批处理中有 2 个加法、一个乘法和一个不同事物的按位异或,而这些事物彼此不相关。
相反,集成信息系统公司指令是只有一个执行单个操作的指令,并且具有一个操作码。前几代 CISC CPU 直接执行每条指令,因此它实际上是一条不可中断的指令。然而,在现代处理器中,复杂的“操作”将被分成多个更简单的微操作,可以在更短的时钟周期内完成。这些微操作是不对外可见,所以你不能称它们为多个操作码。对用户来说,它仍然是一条指令。你可能会永远不知道 Intel 或 AMD 在后台使用了哪些微操作。此外,CISC 指令可以分解为一个或多个微操作,因此说 CISC 在一条指令中包含多个操作是完全错误的。
事实上,现代 RISC 架构也像 CISC 一样将指令分解为微操作,并且非常简单的操作也会组合成用户不可见的宏操作,例如 x86 中的 CMP/Jcc 或 RISC-V 中的 DIV/REM,你不会说 RISC 很简单。RISC 指令仍然可以执行多个操作。
CISC 和 VLIW,一个每次只运行一条指令和一个操作码(目前超标量和乱序执行除外),一个每次执行多条指令,那么它们怎么会是同一个概念呢?您应该从指令集的顶部或至少从同一级别来看待。将 CPU 内部使用的东西与 CPU 上方指令集上的东西进行比较是没有意义的。