32位PowerPC构架通用寄存器分析及总结一

更新时间:2023-05-26 08:36:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

32位PowerPC构架通用寄存器分析及总结

32位PowerPC构架通用寄存器分析及总结一

第一部分 32位 PowerPC构架下寄存器概述

32 位PowerPC构架寄存器模型可以分成三个类级别:UISA,VEA,OEA,我们根据这三个级别把PowerPC所使用的所有寄存器分为三类:

第一类:用户指令集构架(UISA-User Instruction Set Architecture)下所使用的寄存器; 第二类:虚拟环境构架(VEA-Virtual Environment Architecture)下所使用的寄存器; 第三类:操作系统环境(OEA-Operating Environment Architecture)下所使用的寄存器; PowerPC指令集构架为所有的算术逻辑运算指令定义了“寄存器到寄存器”格式的指令,这些指令的操作数来自或者来自于寄存器,或者来自于指令中的立即数。而对于“三寄存器”格式的指令,PowerPC指令集定义其中一个寄存器用来存目的操作数,另外两个寄存器用来存放源操作数。这样的话,存放源操作数的寄存器还可以被其它指令使用,从而减少了某些操作的指令数目。并且对于访问寄存器,PowerPC构架定义了明确的load和store访存指令(这是RISC指令集的典型特点)。

备注:寄存器中的保留位允许软件写任何值(其实就是0或者1),但是读出来的值,未必是我们写出来的值。它的值依赖于具体的执行系统。

接下来,我们分别来介绍这三类寄存器。

第二部分 UISA寄存器集合

用户模式下的寄存器可以被所有的用户级软件和特权级软件所使用,它包含以下的寄存器: 32个通用寄存器GPRs(General-purpose registers):GPR0-GPR31;

32个浮点寄存器FRPs(Floating-point registers):FPR0-FPR31;

1个条件寄存器:CR(Condition register);

1个XER寄存器;

1个LR(Link register)寄存器;

1个CTR(Count register)寄存器;

1个浮点状态控制寄存器:FPSCR(Floating-point status and control register); 备注:不管是单精度数还是双精度数,在浮点寄存器中都是以双精度格式存储。 示意图如下:

32位PowerPC构架通用寄存器分析及总结

2.1 通用寄存器GPRs

32个32位通用寄存器主要用来操作整数数据,它们可以作为指令源寄存器和目的寄存器使用,使用起来比较简单,这里就不再相信介绍

2.2 浮点寄存器FPRs

PowerPC构架使用32个64位的浮点寄存器,这些寄存器可以在浮点指令中用作源操作数和目的操作数。无论是单精度浮点数还是双精度浮点数在浮点寄存器中都是以双精度格式存储。

除了浮点比较指令之外,其他的浮点操作指令都是操作FPRs中的数据,然后把操作结果放入FPRs中,同时把浮点操作的状态信息存入FPSCR中;而浮点比较指令的结果一般会存放在CR寄存器的CR2字段中。

另外对于FPRs同存放在内存中的双精度输进行数据转存时,不需要格式转换;而对于FPRs和放在在内存中的单精度数进行转存时需要格式转换;而且单精度指令操作FPRs中的数据时,必须把FPRs中的双精度格式的数据转化成单精度格式,单精度指令才能使用。

2.3 CR寄存器

32位PowerPC构架通用寄存器分析及总结

32位的CR寄存器可以反映某些操作的结果(比如cmp指令),协助测试和分支转移指令的执行。

CR寄存器用来存放指令执行之后的状态,该寄存器分为8个字段。分别为CR0,CR1, ,CR7。每个字段都由4bit组成。各个字段CRn(n从0至7)都可以表示响应指令执行的结果:

比如整数的加减及逻辑运算,使用CR0来存放状态,CR0的四个bit位的含义如下: CR0(0):用来表示LT(小于),当整型指令运算结果为负时置1;

CR0(1):用来表示GT(大于),当整型指令运算结果为正时置1;

CR0(2):用来表示EQ(等于),当整型指令运算结果为0时置1;

CR0(3):用来表示SO(溢出),当整型指令运算结果溢出时置1;

同理浮点数的运算使用CR1来保存运算状态,保存过程同上。

其实比较指令可以使用CR寄存器的全部的CRn(n从0至7)来保存运算的结果。在使用CR寄存器时,比较指令cmp之后都会有一个条件跳转指令,比如bc指令。其中cmp指令可以指定由CR寄存器的CRn段来保存结构, cmpi指令就用BF字段来指定CRn字段,一般而言bc指令就会指向cmp中相同的CRn段来决定跳转。

下面的指令用来操作CR寄存器的各个CRn域:

1:mtcrf用一个GPR的值来设置CR寄存器的CRn域;

2:mcrf把CR寄存器的一个域CRn拷贝到另一个域CRm;

3:mcrxr把XER寄存器的bit0-bit3拷贝到CR寄存器的一个域CRn

4:mcrfs把指定的FPSCR寄存器的一个域拷贝到指定的CR寄存器的一个域CRn

5:CR寄存器的CR0域存放整数指令的运算结果

6:CR寄存器的CR1域存放浮点数指令的运算结果

7:可以指定CR寄存器的任何一个域CRn来存放整数指令和浮点数指令的运算结果;

2.3.1 对于CR寄存器的CR0域解释

对于所有的整数指令比如addic. ,adni. 和andis.等(.表示Rc位置位),指令的执行结果将会反映在CR0位上。CR0[0:2]位根据整数指令的运算结构设定,CR[3]由XER[S0]位拷贝过来,四个bit位的含义上面已经讲过。

备注:我们不难想到,如果发生溢出,CR0的前三个bit就没有参考价值了。

2.3.2对于CR寄存器的CR1域

对于所有的浮点运算指令(指令的Rc位置位),CR1将反映浮点运算指令的结果。具体的说CR1[0:3]位拷贝自FPSCR[0:3],来反映浮点运算的异常状态。

2.3.3 对于指定的CRn域的解释

对于比较指令而言,它们通常会自己指定一个CRn域来存放比较指令的运算结果。 比如对cmpi指令:

cmpi BF,L,RA,SI

语义:

n <— BF表示的数值

if L = 0 then a <—EXTS((RA)32:63)

else a <—(RA)

if a < EXTS(SI) then c <—0b100 //小于时设置CRn(0)为1

32位PowerPC构架通用寄存器分析及总结

else if a > EXTS(SI) then c <—0b010 //大于时设置CRn(1)为1

else c <—0b001 //等于时设置CRn(2)为1

CR寄存器中的: 4×BF+32:4×BF+35 <- c || XER寄存器中SO位 //||表示字符连接 解释:

将寄存器RA与立即数SI进行比较,然后将比较指令产生的状态放入CR寄存器的不同字段中,CR寄存器有8个CRn字段(n从0至7),可以有三个bit位的BF段指定。 L表示是进行32位还是64的比较。对于e600而言,只有L=0的比较。

2.4 FPSCR寄存器

FPSCR寄存器的各个bit位的作用:

1:记录浮点操作的异常

2:记录浮点操作的结果的类型

3:控制浮点操作的回旋模式(rounding mode)

4:使能或者禁止异常报告

FPSCR[0:23]是状态bit位,在浮点指令的执行单元完成时更新;

FPSCR[24:31]是控制位;

2.5 XER寄存器

XER寄存器是用户模式寄存器,存放整数运算操作的进位,溢出信息以及特殊加载和存储指令lswd和stsws传输的字节数。

XER寄存器有三个有效位(SO-Summary Overflow,OV-Overflow,CA-Carry)和一个有效字段Byte count

SO位:XER[0]位,该位为1表示算术指令曾经将OV位置1;CR寄存器的SO位就是复制了XER寄存器的SO位,SO位一旦被设置,就不会被清除,真到程序使用mtspr,mcrxr指令进行清除。

OV位:XER[1]位,表示有符合数的算术运算产生了溢出。

CA位:XER[2]位,表示无符号数运算产生了进位。

Byte count字段:XER[25:31]存放lswd和stsws传输的字节数。

2.6 LR寄存器

LR寄存器用来存放函数的返回地址,某些转移指令可以自动的将LR寄存器赋值为该转移指令所在地址的下一个地址。

LR寄存器还可以用作bclr指令的目标地址,来实现长跳转。

示意图如下:

32位PowerPC构架通用寄存器分析及总结

备注:图中的blr 是 bclr 20, 0指令的助记符。

2.7 CTR指令

CTR寄存器用来保存循环变量,并可以根据bclr的BO操作数来自动进行减1操作。 此外CTR寄存器还可用来保存bcctr指令的目标地址,用来实现长调转。

第三部分 虚拟环境构架(VEA-Virtual Environment Architecture)寄存器集

虚拟环境工具寄存器集只包含Time-Base寄存器组。

示意图如下:

32位PowerPC构架通用寄存器分析及总结

VEA寄存器组可以被所有的处于用户模式或者系统模式下的软件所访问,从VEA寄存器组的示意图我们可以看出,和UISA寄存器相比。VEA寄存器只是引入了一个64位的结构体,它包含两个寄存器:TBU(Time Base Upper)寄存器和TBL(Time Base Lower)寄存器,这两个寄存器可以被用户模式和系统模式的指令访问。在VEA环境中,用户模式下的应用程序仅能访问TB寄存器,而在操作系统环境构架(OEA)定义的系统模式下,系统模式指令可以写入TB寄存器。

TB寄存器组是存放了一个64bit的无符号整数,这个整数周期性的递增。每次递增,TB中的TBL寄存器第31bit位加1,TB中计数器更新的周期与具体的操作相关,即它依赖于具体的实现。

TB 寄存器会以一种依赖于实现的频率周期性地增加,这个频率可能不是恒定的。操作系统(OS)要负责确定更新频率是否发生了变化,以及对内部结构进行必要的调整。 小结一下:

1:TB 寄存器是 64 位长的;

2:每次更新都会增加 1;

32位PowerPC构架通用寄存器分析及总结

3:操作系统必须要能够确定更新频率;

4:当 TB 达到自己的最大值时,就会溢出并从 0 重新开始。此时没有明显的迹象,要交由操作系统进行处理。

5:OS 必须要在开机时对 TB 寄存器进行初始化。

备注:

TB 寄存器自己并没有包含计算时间所需要的足够信息。Power Architecture 规范将很多对 TB 寄存器进行处理的责任都交给操作系统来完成,操作系统需要提供其他一些信息,例如更新频率、启动时的 Time Base 寄存器的值,等等。整个计算机制非常迅速且高效。

关于TB寄存器的使用,更详细的内容可以参考:64 位 Linux 中 Power Architecture Time Base 的寄存器

这篇文章写的很到位。

待续。。。。。。

本文来源:https://www.bwwdw.com/article/b7x4.html

Top