PowerPC 体系结构之 ULR 和 ABI

A. 以下取 Book E 之 ULR 精要

ULR (User Level Register) 即用户态程序能用的寄存器,包括只读的和可读写的。

最常用的 ULR 包括以下寄存器:

1. GRP (General Purpose Register) 通用寄存器,即用于定点运算的寄存器,共 32 个

2. CR (Condition Register) 指令状态寄存器,其格式如下所示:


注意:Book E 对寄存器的位编号与通常不同,因其支持 PowerPC 64,故其将 64 位寄存器从最高位 (MSB) 到最低位 (LSB) 编号为 0 ~ 63,32 位寄存器则编号为 32 ~ 63。

CR 以4位为单位分成 8 个域,每个域能描述 4 种状态。

2.1 CR0 用于存放 RC 位为1 的整数指令执行后的状态。CR[32:35] 依次表示小于、大于、等于和溢出。当指令执行的结果小于、大于或等于 0 时则置相应的CR[32:34] 的位;CR[35] 的值则直接复制自XER 的 SO (Summary Overflow)位。

2.2 CR1用于存放 RC 位为 1 的所有浮点指令执行后的浮点异常状态。其内容直接复制于浮点状态与控制寄存器 (FPSCR),CR[36:39] 依次对应于浮点异常 (FX)、浮点使能异常 (FEX)、浮点非法操作异常 (VX) 和浮点溢出异常 (OX)。

RC 位为 1 的指令,其助记符的最后有一个 ‘.‘ ,如 addic./divw./mullw./neg./and./or./xor./nand./nor.

2.3 对于比较指令(整数和浮点),可以通过操作数 BF 指定比较结果所存储的 CR 域:

cmp   3, 0, r3, r4        (cmp    BF, L, RA, RB)

操作数 L = 0,表示此为 32 位比较,即只比较 r3, r4 的 32 ~ 63 位。若 r3 > r4,则将 CR3[gt] (CR[45]) 置位。浮点比较类似,但域内第 4 位含义与整数不同,整数依然表示溢出 (SO),且其值拷贝自 XER[SO];而对浮点比较,若该位被置,则表示某一浮点操作数不是数值。

2.4 此外 RC 位为 1 的条件存储指令 (stwcx./stwcxe./stdcxe.),在存储操作成功时置 CR0[2] (EQ 位) 为 1。