第一部分 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);

备注:不管是单精度数还是双精度数,在浮点寄存器中都是以双精度格式存储。

示意图如下:

2.1 通用寄存器GPRs

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

2.2 浮点寄存器FPRs

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

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

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

2.3 CR寄存器

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

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指令的目标地址,来实现长跳转。

示意图如下:

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

2.7 CTR指令

CTR寄存器用来保存循环变量,并可以根据bclr的BO操作数来自动进行减1操作。

此外CTR寄存器还可用来保存bcctr指令的目标地址,用来实现长调转。

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

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

示意图如下:

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;

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

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

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

备注:

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

关于TB寄存器的使用,更详细的内容可以参考:64 位 Linux 中 Power Architecture Time Base 的寄存器这篇文章写的很到位。

转自:http://blog.sina.com.cn/s/blog_70dd16910100yjm3.html

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

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

    4.6SR(Segment Registers)寄存器 OEA定义了16个32位的SR寄存器,段寄存器SR可以使用mtsr/mfsr,mtsrin/mfsrin指令进程访问. 随着CR[0]位(我们称 ...

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

    第四部分操作系统环境(OEA-Operating Environment Architecture)寄存器寄存器集 OEA寄存器集包含四类寄存器: 1:配置寄存器(Configuration Regi ...

  3. 【软件周刊第 24 期】Ubuntu 17.04 正式发布,不再支持 32 位 PowerPC(PPC)架构

    2019独角兽企业重金招聘Python工程师标准>>> PostgreSQL 10 新增特性 PostgreSQL 10 新增了多项新特性,这里梳理几项主要内容: 声明式分区 在以前 ...

  4. 32位PowerPC常用指令集总结

    第一部分 PowerPC 精简指令集计算机(RISC)简介 PowerPC 体系结构是一种精减指令集计算机(Reduced Instruction Set Computer,RISC)体系结构,定义了 ...

  5. PowerPC VxWorks BSP分析(1)--PowerPC体系结构

    POWER 是 Power Optimization With Enhanced RISC 的缩写,是 IBM 的很多服务器.工作站和超级计算机的主要处理器.POWER 芯片起源于 801 CPU,是 ...

  6. 32位系统处理64位数据

    64位返回值 x86平台 ARM平台 参数传递及加减运算 x86平台 ARM平台 右移 x86平台 ARM平台 32位数据转换为64位数据 x86平台 ARM平台 32位系统的通用寄存器GPR只能容纳 ...

  7. 开放性32位RISC处理器IP核的比较与分析(Z)

    引言 随着VLSI设计技术和深亚微米制造技术的飞速发展,SOC(SystemonChip)技术逐渐成为了集成电路设计的主流技术.SOC已经在便携式手持设备.无线网络终端和多媒体娱乐设备等领域得到了广泛 ...

  8. PowerPC 32位汇编入门讲解

    第一部分 PowerPC 精简指令集计算机(RISC)简介 PowerPC 体系结构是一种精减指令集计算机(ReducedInstruction Set Computer,RISC)体系结构,定义了 ...

  9. 32位、64位与Java开发研究分析

    1 32位与64位五大不同 1.1 设计初衷不同 64位操作系统的设计初衷是:满足机械设计和分析.三维动画.视频编辑和创作,以及科学计算和高性能计算应用程序等领域中需要大量内存和浮点性能的客户需求.换 ...

最新文章

  1. ISME:南农沈其荣团队基于大数据准确预测土壤的枯萎病发生
  2. Windows Server应用之32位系统如何安装64位打印机驱动
  3. php如何记录访问请求类型,检测PHP中的请求类型(GET、POST、PUT或DELETE)
  4. linux 与有什么不同
  5. Linux编辑只读文件
  6. ECCV2020 Oral | 图像修复之再思考
  7. java stream intermediateterminal方法
  8. 前端开发学java_Java前端开发需要学习什么
  9. 使用Spine软件制作骨骼动画供Cocos2d-x使用
  10. 复现IIS PUT任意上传漏洞(过程,步骤,说明)
  11. 中国五千年统一与分裂
  12. photoshop cs6(mac版)安装教程
  13. Win Server2016安装Glassfish4.1.2
  14. 平面设计是一种创造性的艺术形式
  15. java fillrect_Java graphics2D fillRect无法使用半透明颜色正常...
  16. 什么是EV SSL证书
  17. Unity酱~ 卡通渲染技术分析(一)
  18. 你是哪一型---左右脑性格测试(转)
  19. python split
  20. 佐罗zorro软件安装教程及一键新机使用方法详细简介

热门文章

  1. Python中如何创建数字和字母的组合
  2. MySQL的InnoDB存储引擎中,缓冲池中的Changer Buffer与系统表空间中的Changer Buffer的关系
  3. 2020,程序员本命年,去外包公司要小心的几个点
  4. mac双屏时,程序坞(dock)在主屏或者副屏显示的方法
  5. 为自己的snap应用添加变量
  6. 云教学服务器系统软件多少钱,LanStarMaxi多机房云教学管理平台
  7. DL基本知识(五)神经网络经典模型
  8. 分享几个默认密码在线查询网站
  9. ES DSL常用查询
  10. 工作之余可以赚钱的副业,这4个副业总有适合你的!