2.5 译码单元
在 x86 架构的处理器中,译码是一个重要的阶段。译码单元的主要任务是将获取的二进制指令翻译成微指令,这些微指令会被送入下一个流水线阶段进行执行。在这个过程中,指令可能会被拆解成多个微指令。这是因为x86的CISC(Complex Instruction Set Computer,复杂指令集计算机)架构的特性,其指令可能包含多个操作,例如,一个指令可能包含加载数据和存储结果等操作,而每个操作可能会被翻译成单独的微指令。
当然所有的处理器架构,无论是 RISC(精简指令集计算机)还是 CISC,都需要一个译码器来将机器指令翻译成一系列的微指令或内部指令。RISC架构的一个核心设计原则是“指令的简单性”,RISC 架构中的指令设计得尽量简单,使得每个指令在一个时钟周期内就可以完成。这一设计理念使得RISC处理器的译码器设计相对简单,因为每个指令的操作更直观、复杂逻辑更少。比如在一个典型的RISC架构——MIPS中,所有的指令长度都是固定的(32位),并且指令的格式(不同部分的指令对应的功能,如操作码、源操作数、目标操作数等)也是固定的。这使得在 MIPS 架构中译码器可以通过简单地将指令的各个部分分开,很快地确定指令的类型和操作数。
由于x86指令集是一种CISC架构,其指令集的复杂性比较高,包含了大量的指令,从一字节到十几字节都有,而且很多指令需要进行复杂的内存寻址操作,因此需要不同类型的译码单元来处理。为了提高处理器的性能和效率,x86处理器一般会采用一个混合的译码策略,包括多个简单译码单元和复杂译码单元。以Intel的Sandy Bridge微架构为例,它具有4个简单译码器和一个复杂译码器。
● 简单译码器(Simple Decoder):一般用于处理那些直接可以翻译成一个或者少数几个微指令的x86指令。这种类型的指令在x86指令集中占有较大的比例,多个简单译码器可以并行工作,对这些指令进行快速译码。简单译码器一般用于处理简单的、可直接转换为一个或几个微操作的x86指令。
● 复杂译码器(Complex Decoder):用于处理那些需要翻译成多个微指令,或者需要进行更复杂处理的x86指令。这类指令在x86指令集中占比较小,但是它们的处理过程相对复杂,需要复杂译码器进行处理。
译码单元如图2-10所示,宏操作融合和微操作融合都是一种减少处理器所需的执行指令数量的技术,主要在Intel的处理器架构中使用,它们的主要目标是优化性能和提高能源使用效率。
● 宏操作融合(Macro-op Fusion):在宏操作融合中,两个宏操作(处理器指令)在前端流水线阶段被融合成一个宏操作。这种情况通常在一对指令可以被视为一种复合操作时发生,例如,跳转(Jump)和比较(Compare)经常可以被融合在一起,当这两个指令被融合后,它们将作为一个单一的指令进入指令队列,从而降低了队列压力和功耗。
● 微操作融合(Micro-op Fusion):在微操作融合中,一对微操作(处理器的内部指令)在执行流水线阶段被融合为一个微操作。例如,一条内存加载和一个操作可以被融合成一个微操作。使用微操作融合可以减少对执行资源的使用,降低功耗,以及优化性能。
图2-10 译码单元(3个简单译码器和1个复杂译码器)
现代 x86 处理器的译码单元可以同时处理多个指令译码,然后将这些译码后的微指令通过发射单元并行发射给执行单元,这也是一种提高处理器并行度和性能的方式,通常被称为“超标量”(Superscalar)设计。