PowerPC 应用级寄存器
PowerPC 的应用级寄存器分为三类:通用寄存器(general-purpose register,GPR)、浮点寄存器(floating-point register [FPR] 和浮点状态和控制寄存器 [Floating-Point Status and Control Register,FPSCR])和专用寄存器(special-purpose register,SPR)。让我们来分别看一下这三类寄存器。
通用寄存器(GPR)
用户指令集体系结构(Book I)规定,所有实现都有 32 个 GPR(从GPR0 到 GPR31)。GPR 是所有整数操作的源和目的,也是所有加载/存储操作的地址操作数的源。GPR 还提供对 SPR 的访问。所有 GRP 都是可用的,只有一种情况例外:在某些指令中,GPR0 只是代表数值 0,而不会去查找 GPR0 的内容。
浮点寄存器(FPR)
Book I 规定,所有实现都有 32 个 FPR(从 FPR0 到 FPR31)。FPR 是所有浮点操作的源和目的操作数,可以存放 32 位和 64 位的有符号和无符号整数,以及单精度和双精度浮点数。FPR 还提供对 FPSCR 的访问。
注意,嵌入式微处理器实现时经常不提供对浮点指令集的直接硬件支持,或者只是提供一个附加浮点硬件的接口。很多嵌入式应用程序很少或者根本不需要浮点算法,而当需要的时候,对 PowerPC 浮点指令执行进行软件仿真就足够了。在嵌入式微处理器中,硬件中省去浮点(支持)而为实现带来的芯片面积和功率的减少是至关重要的。
浮点状态和控制寄存器(FPSCR)捕获浮点操作的状态和异常结果,FPSCR 还具有控制位,以支持特定的异常类型和对四种舍入模式之一的选择。对 FPSCR 的访问要通过 FPR。
专用寄存器(SPR)
SPR 给出处理器核心内部资源的状态并对其进行控制。不需要系统服务的支持就可以由应用程序读写的 SPR 包括计数寄存器(Count Register)、链接寄存器(Link Register)和整型异常寄存器(Integer Exception Register)。需要系统服务的支持才可以由应用程序读写的 SPR 包括时基(Time Base)和其他各种可能支持的计时器。
- 指令地址寄存器(Instruction Address Register,IAR)
这个寄存器就是程序员们所熟知的 程序计数器或者 指令指针。它是当前指令的地址。这实际上是一个伪寄存器,用户只能通过“branch and link”指令才能直接使用这个寄存器。IAR 主要是由调试器使用,显示将要被执行的下一条指令。 - 链接寄存器(Link Register,LR)
这个寄存器存放的是函数调用结束处的返回地址。某些转移指令可以自动加载 LR 到转移之后的指令。每个转移指令编码中都有一个 LK 位。如果 LK 为 1,转移指令就会将程序计数器移为 LR 中的地址。而且,条件转移指令 bclr 转移到 LR 中的值。 - 定点异常寄存器(Fixed-Point Exception Register,XER)
这个寄存器存放整数运算操作的进位以及溢出信息。它还存放某些整数运算操作的进位输入以及加载和存储指令( lswx 和 stswx )中传输的字节数。 - 计数寄存器(Count Register,CTR)
这个寄存器中存放了一个循环计数器,会随特定转移操作而递减。条件转移指令 bcctr 转移到 CTR 中的值。 - 条件寄存器(Condition Register,CR)
这个寄存器分为八个字段,每个字段 4 位。很多 PowerPC 指令将指令的第 31 位编码为 Rc 位,有一些指令要求 Rc 值等于 1。当 Rc 等于 1 且进行整数操作时,CR 字段 0 被设置来表示指令操作的结果:相等(Equal, EQ),大于(Greater Than, GT),小于(Less Than, LT),以及和溢出(Summary Overflow, SO)。当 Rc 等于 1 且进行浮点操作时,CR 字段 1 被设置用来表示 FPSCR 中异常状态位的状态:FX、FEX、VX 和 OX。任何一个 CR 字段都可以是整数或者浮点比较指令的目标。CR 字段 0 还被设置用来表示条件存储指令( stwcx 或者 stdcx ) 的结果。还有一组指令可以操纵特定的 CR 位、特定的 CR 字段或者整个 CR,通常为了测试而将几个条件组合到同一个位中。 - 处理器版本寄存器(Processor Version Register,PVR)
PVR 是一个 32 位只读寄存器,标识处理器的版本和修订级别。处理器版本由 PowerPC 体系结构过程分配。修订级别由实现定义。需要有特权才能访问 PVR,所以应用程序只能在操作系统函数的帮助下才可以确定处理器版本。 PowerPC 应用级指令集
表 1 列出了不同的指令类别以及每类的指令类型。
表 1. 指令类别
指令类别基本指令Branchbranch, branch conditional, branch to LR, branch to CTRCondition registercrand, crnor, creqv, crxor, crandc, crorc, crnand, cror, CR moveStorage accessload GPR/FPR, store GPR/FPRInteger arithmeticadd, subtract, negate, multiply, divideInteger comparisoncompare algebraic, compare algebraic immediate, compare logical,compare logical immediateInteger logicaland, andc, nand, or, orc, nor, xor, eqv, sign extension, countleading zerosInteger rotate/shiftrotate, rotate and mask, shift left, shift rightFloating-point arithmeticadd, subtract, negate, multiply, divide, square root, multiply-add,multiply-subtract, negative multiply-add, negative multiply-subtractFloating-point comparisoncompare ordered, compare unorderedFloating-point conversionround to single, convert from/to integer word/doublewordFPSCR managementmove to/from FPSCR, set/clear FPSCR bit, copy FPSCR field to CRCache controltouch, zero, flush, storeProcessor managementsystem call, move to/from special purpose registers, mtcrf, mfcr
指令解析
所有指令的编码长度都是 32 位。PowerPC 的位编号方式与大部分其他定义相反:第 0 位是最重要的位,第 31 位是最不重要的位。指令首先由一个字段中较高的 6 位进行解码,这 6 位称为 主要操作码(primary opcode)。其余 26 位包含的字段分别是操作数说明、立即(immediate)操作数以及扩展的操作码(opcode),而且这些还可能是保留的位或字段。表 2 列出了 PowerPC 定义的基本指令格式。
表 2. PowerPC 指令格式
格式06111621263031D-formopcdtgt/srcsrc/tgtimmediateX-formopcdtgt/srcsrc/tgtsrcextended opcdA-formopcdtgt/srcsrc/tgtsrcsrcextended opcdRcBD-formopcdBOBIBDAALKI-formopcdLIAALK- D-form
这一指令格式提供至多两个寄存器作为源操作数,一个立即源,至多两个寄存器作为目的操作数。这一指令格式的一些变种使用部分目的和源寄存器操作数说明符作为立即字段或作为扩展的操作码。 - X-form
这一指令格式提供至多两个寄存器作为源操作数,至多两个目的操作数。这一指令格式的一些变种使用部分目的和源寄存器操作数说明符作为立即字段或作为扩展的操作码。 - A-form
这一指令格式提供至多三个寄存器作为源操作数,以及一个目的操作数。这一指令格式的一些变种使用部分目的和源寄存器操作数说明符作为立即字段或作为扩展的操作码。 - BD-form
条件转移指令使用的是这一指令格式。BO 指令字段指定了条件的类型;BI 指令字段指定了以哪个 CR 位作为条件;BD 字段用作转移位置。AA 位指定了转移是绝对转移还是相对转移。换名话说,转移目标地址是立即字段的值,还是立即字段的值与转移地址的和。LK 位指定了下一个顺序指令的地址是否作为子例程调用的返回地址保存在链接寄存器中。 - I-form
无条件转移指令使用这一指令格式。由于是无条件的,BD 格式中的 BO 和 BI 字段改变为另外的转移位置,以构成 LI 指令字段。同 BD 格式一样,这一指令格式也支持 AA 和 LK 位。 如前所述,这些指令格式各有其变种。不过,这些格式是对大部分 PowerPC 指令集编码结构的最好描述。
转移指令
PowerPC 为控制流程提供了一组指令,包括:
- 条件和无条件转移指令。
- “递减计数和如果是零或者非零时转移”的能力。
- 绝对转移和相对转移。
- 使用链接寄存器或计数寄存器来指定转移目标地址的转移指令。
所有的转移指令都具备保存后继顺序指令地址的能力,包括到链接寄存器的转移。条件寄存器 32 位中的任意一位都可以指定为条件转移的条件,并可以指定 CR 位是否必须为 0 或 1 时转移条件才成立。
条件寄存器指令
PowerPC 提供了一组用于对 CR 的特定位执行布尔操作和对 CR 字段进行拷贝的指令。它允许组合多个转移条件,这样可以减少代价高昂的条件转移的数量。表 3 列出了 PowerPC CR 逻辑指令。
表 3. PowerPC CR 逻辑指令
助记符指令名crandCR logical andcrandcCR logical and with complementcreqvCR logical equivalentcrnandCR logical not andcrnorCR logical not orcrorCR logical orcrorcCR logical or with complementcrxorCR logical xor |