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

image-20230405222500629

指令格式

  • 指令长度 4 字节 32 位,按字对齐,通常采用大端存储,指令最低 2 位忽略,通常为 0。
  • [0:5] 位表示操作码 OPCD,很多指令同时也有扩展码 XO(extended opcode)。
  • [6:31] 位根据不同指令格式,分别表示不同含义。

I-Form

image-20230405225019176

无条件转移指令格式,如函数调用 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

image-20230405231908193

条件转移指令格式

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

image-20230405232752028

系统调用指令格式,即 sc 指令。

LEV (20:26):该字段被系统调用指令使用(System Call)。

/,//,/// 表示指令中保留的字段。

D-Form 和 DS-Form

image-20230415221607770

存储器、寄存器读写指令,立即数算术运算和逻辑运算指令,由 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 自陷指令的条件。

image-20230415223101813

DS (16:29):表示 14 位有符号立即数,右侧用 0x00 进行位拼接,并符号扩展到 64 位。

XO (30:31):表示扩展的操作码字段。

X-Form

image-20230415223333681

X-Form 格式指令与 D-Form 类似,只是将 D 字段拆分为 RB、XO、Rc。

RB 和 RS 字段用来存放源操作数寄存器的索引,RT 字段存放目的操作寄存器的索引,RA 既可以当源操作数又可以当目的操作数。

Rc 字段为 1 表示指令运算结果将改变 CR 寄存器的值,为 0 则不改变 CR 寄存器。具有. 后缀的指令,其 Rc 位为 1。

XL-Form

image-20230415223357207

XL-Form 格式指令支持条件转移,与 B-Form 格式指令不同的是,此类指令使用 LR 或 CTR 寄存器进行跳转,而不是使用 16 位立即数进行跳转,因此可以实现一些 32 位的长跳转。

XFX-Form、XFL-Form、XS-Form、XO-Form 与 A-Form

image-20230415223415305

XFX-Form 格式指令用于访问 SPR 寄存器和 CR 寄存器。

image-20230416223505933

image-20230416223530521

image-20230416223543594

XO-Form 格式指令用来支持带进位的算术运算和乘除法指令。

image-20230416223558649

A-Form 格式指令用于浮点计算。

M-Form、MD-Form 和 MDS-Form

image-20230416223700825

M-Form 格式指令用于对选定的字段进行循环左移并做一些相应的掩码操作。

image-20230416223714490

image-20230416223724263