PowerPC 指令集架构介绍
PowerPC 简介
PowerPC,有时也被简称 PPC,是一种精简指令集(RISC)架构。PowerPC 英文全名为 “Performance Optimization With Enhanced RISC – Performance Computing”。
PowerPC 是由 Apple、IBM、Motorola 三家公司在 1991 年设计的,设计源自 IBM 的 POWER 架构,主要应用在通信、工控、航天国防等要求高性能和高可靠性的一些高端领域。
PowerPC 指令集架构(PowerPC Instruction Set Architecture,PowerPC ISA),主要包括寄存器类别和指令格式两部分内容。
PowerPC 处理器提供 32 位和 64 位两种指令运行环境。
寄存器类别
PowerPC 用户态寄存器包括:
- GPR(General Purpose Registers,通用寄存器,64 位),32 个
- FPR(Floating-Point Registers,浮点寄存器,64 位),32 个
- FPSCR(Floating-Point Status and Control Register,浮点状态和控制寄存器,32 位)
- LR(Link Register,链接寄存器,64 位),用来存放函数的返回地址,转移指令的编码中 LK 位为 1 时,转移指令就会将当前指令地址加 4 后保存到 LR 寄存器,从而实现函数的调用和返回。
- CTR( Count Register,计数寄存器,64 位),用来保存循环变量。
- XER( Fixed-Point Exception Register,整数运算进位和溢出寄存器,64 位),用来存放整数运算的溢出、进位。分为 3 个有效位,1 个有效字段,其他是保留位。
- SO(第 32 位):当检测到有指令设置 OV 时,置 1
- OV(第 33 位):有符号数算术运算出现溢位
- CA(第 34 位):无符号数算术运算出现进位
- 第 57~63 位:表示 load/store 指令传送的字节数
- CR(Condition Register,条件寄存器,32 位),用来存放指令执行后的状态,分为 8 个字段(CR0 ~ CR7),每个字段 4 位。整数运算指令的结果状态保存到 CR0,浮点运算指令的结果状态保存到 CR1。
- CR0 [0]:小于 LT,结果为负时置 1
- CR0 [0]:大于 GT,结果为正时置 1
- CR0 [0]:等于 EQ,结果为 0 时置 1
- CR0 [0]:溢出 SO,结果溢出时置 1
指令格式
- 指令长度 4 字节 32 位,按字对齐,通常采用大端存储,指令最低 2 位忽略,通常为 0。
- [0:5] 位表示操作码 OPCD,很多指令同时也有扩展码 XO(extended opcode)。
- [6:31] 位根据不同指令格式,分别表示不同含义。
I-Form
无条件转移指令格式,如函数调用 bl 指令,跳转到指定函数并保存下一条指令地址:
1 | bl LI AA=0,LK=1 |
LI (6:29) :立即数字段(Immediate field),表示 24 位带符号的二进制整数,右侧添加 0b00 (即 LI*4)并符号扩展为 64 位。
AA (30) :绝对地址位(Absolute Address bit)。
AA=0 表示立即数字段为当前指令地址的相对地址。 对于 I-form 分支指令,分支目标的有效地址是 LI 字段符号扩展到 64 位后再加上分支指令地址。 对于 B-form 分支指令,分支目标的有效地址是 BD 字段符号扩展到 64 位后再加上分支指令地址。
AA=1 表示立即数字段代表一个绝对地址。 对于 I-form 分支指令,分支跳转目标的有效地址是 LI 字段符号扩展到 64 位。 对于 B-form 分支指令,分支跳转目标的有效地址是 BD 字段符号扩展到 64 位。
LK (31) :链接位(LINK bit)。
0 表示不设置 LR 寄存器
1 表示将分支指令后的下一条指令地址设置到 LR 寄存器中。
B-Form
条件转移指令格式
BO (6:10):该字段表示指令根据什么条件进行跳转。
- 第 0 位为 1 时,bc 指令根据 CTR 寄存器进行条件跳转
- 第 1 为为 1 时,表示条件为真时进行跳转
- 第 2 为为 1 时,表示执行 bc 指令时 CTR 值不变
- ……
BI (11:15):该字段用于指定 CR 中需要由分支条件指令测试的位。
- BI [3:4]=00,使用 LT 状态位用作指令转移条件
- BI [3:4]=01,使用 GT 状态位用作指令转移条件
- BI [3:4]=10,使用 EQ 状态位用作指令转移条件
- BI [3:4]=11,使用 SO 状态位用作指令转移条件
BD (16:29):该字段用于指定 14 位有符号数的分支位移的立即数,右侧添加 0b00 并符号扩展为 64 位。
SC-Form
系统调用指令格式,即 sc 指令。
LEV (20:26):该字段被系统调用指令使用(System Call)。
/,//,///
表示指令中保留的字段。
D-Form 和 DS-Form
存储器、寄存器读写指令,立即数算术运算和逻辑运算指令,由 6 位操作码 + 10 位寄存器索引 + 16 位立即数构成。
RT (6:10):存放指令运算结果的寄存器索引,用作目标寄存器。
RS (6:10):存放指令运算结果的寄存器索引。
RA (11:15):存放指令所需数据源的寄存器索引。
D (16:31):存放指令所需另一个数据源,16 位有符号立即数,并符号扩展到 64 位。
SI (16:31):存放指令所需另一个数据源,16 位有符号立即数。
UI (16:31):存放指令所需另一个数据源,16 位无符号立即数。
L (10):表示进行 32 位还是 64 位比较。
BF (6:8):表示使用的 CR 字段或者 FPSCR 字段。
TO (6:10):表示 trap 自陷指令的条件。
DS (16:29):表示 14 位有符号立即数,右侧用 0x00 进行位拼接,并符号扩展到 64 位。
XO (30:31):表示扩展的操作码字段。
X-Form
X-Form 格式指令与 D-Form 类似,只是将 D 字段拆分为 RB、XO、Rc。
RB 和 RS 字段用来存放源操作数寄存器的索引,RT 字段存放目的操作寄存器的索引,RA 既可以当源操作数又可以当目的操作数。
Rc 字段为 1 表示指令运算结果将改变 CR 寄存器的值,为 0 则不改变 CR 寄存器。具有.
后缀的指令,其 Rc 位为 1。
XL-Form
XL-Form 格式指令支持条件转移,与 B-Form 格式指令不同的是,此类指令使用 LR 或 CTR 寄存器进行跳转,而不是使用 16 位立即数进行跳转,因此可以实现一些 32 位的长跳转。
XFX-Form、XFL-Form、XS-Form、XO-Form 与 A-Form
XFX-Form 格式指令用于访问 SPR 寄存器和 CR 寄存器。
XO-Form 格式指令用来支持带进位的算术运算和乘除法指令。
A-Form 格式指令用于浮点计算。
M-Form、MD-Form 和 MDS-Form
M-Form 格式指令用于对选定的字段进行循环左移并做一些相应的掩码操作。