PowerPC 体系结构开发者指南.docx
《PowerPC 体系结构开发者指南.docx》由会员分享,可在线阅读,更多相关《PowerPC 体系结构开发者指南.docx(19页珍藏版)》请在冰豆网上搜索。
PowerPC体系结构开发者指南
PowerPC体系结构开发者指南
对PowerPC体系结构家族树的所有分支来说,PowerPC体系结构和应用级编程模型是通用的。
要获得详细的资料,请参阅IBM®PowerPCWeb站点技术库中的产品用户手册(参阅参考资料以获取链接)。
PowerPC体系结构是一种精减指令集计算机(ReducedInstructionSetComputer,RISC)体系结构,定义了200多条指令。
PowerPC之所以是RISC,原因在于大部分指令在一个单一的周期内执行,而且通常只执行一个单一的操作(比如将内存加载到寄存器,或者将寄存器数据存储到内存)。
PowerPC体系结构分为三个级别(或者说是“book”)。
通过对体系结构以这种方式进行划分,为实现可以选择价格/性能比平衡的复杂性级别留出了空间,同时还保持了实现间的代码兼容性。
BookI.用户指令集体系结构
定义了通用于所有PowerPC实现的用户指令和寄存器的基本集合。
这些是非特权指令,为大多数程序所用。
BookII.虚拟环境体系结构
定义了常规应用软件要求之外的附加的用户级功能,比如高速缓存管理、原子操作和用户级计时器支持。
虽然这些操作也是非特权的,但是程序通常还是通过操作系统调用来访问这些函数。
BookIII.操作环境体系结构
定义了操作系统级需要和使用的操作。
其中包括用于内存管理、异常向量处理、特权寄存器访问、特权计时器访问的函数。
BookIII中详细说明了对各种系统服务和功能的直接硬件支持。
从最初的PowerPC体系结构的开发开始,就根据特定的市场需求而发生分支。
当前,PowerPC体系结构家族树有两个活跃的分支,分别是PowerPCAS体系结构和PowerPCBookE体系结构。
PowerPCAS体系结构是IBM为了满足它的eServerpSeriesUNIX和Linux服务器产品家族及它的eServeriSeries企业服务器产品家族的具体需要而定义的(参阅参考资料中的链接以获得更多资料)。
PowerPCBookE体系结构,也被称为BookE,是IBM和Motorola为满足嵌入式市场的特定需求而合作推出的。
PowerPCAS所采用的原始PowerPC体系结构与BookE所采用的扩展之间的主要区别大部分集中于BookIII区域中。
在这些衍生的体系结构中还有一些适当的应用级扩展,这些扩展大部分与具体应用的场合相关,但是PowerPCAS和PowerPCBookE共享在PowerPC体系结构的BookI中定义的基本指令集。
虽然三种体系结构主要在操作系统级别上表现出不同,但它们在很大程度上具备应用级的兼容性。
PowerPC最初定义了同时对32位和64位实现的支持,可以让32位的应用程序运行于64位系统之上。
在IBMpSeries和iSeries服务器上使用的PowerPCAS系统现在只提供体系结构的64位实现,新的64位应用程序和遗留的32位的应用程序可以运行于同一个系统之上。
PowerPCBookE体系结构同时有32位实现和64位实现,64位实现也完全兼容32位PowerPC应用程序。
这两种体系结构都具备与PowerPCBookI指令和寄存器的完全兼容性,同时提供了对内存管理、异常和中断、计时器支持和调试支持等各方面的系统级扩展。
POWER的自然历史
POWER和PowerPC微处理器有着漫长而传奇的历史,最初是IBM801,其后是POWER、RS64和PowerPC芯片系列(这些并不是线性发展的)。
每个芯片家族都对计算世界有自己强有力的影响,从游戏控制台到主机,从数字手表到高端工作站,到处都得到了应用。
欲了解全部历史,请阅读“人类的POWER:
IBM的芯片制造历史”。
最初的PowerPC体系结构仍是PowerPCAS和PowerPCBookE的主要组成部分,并仍保持了其完整性,表现出了令人信服的应用级兼容性。
PowerPC应用程序编程模型
当用到不只一种类型的PowerPC处理器时,开发人员应时刻谨记处理器处理内存的方式存在一些差异。
PowerPC存储模型
PowerPC体系结构本身支持字节(8位)、半字(16位)、字(32位)和双字(64位)数据类型。
PowerPC实现还可以处理最长128字节的多字节字符串操作。
32位PowerPC实现支持4-gigabyte的有效地址空间,而64位PowerPC实现支持16-exabyte的有效地址空间。
所有存储都可以字节寻址。
对于错位数据访问来说,不同的产品家族提供了不同的校准支持,有一些是以处理异常的方式,其他的是通过硬件中的一步或者多步操作来处理访问。
最高位字节在最前(Big-endian)还是最低位字节在最前(little-endian)?
PowerPC、PowerPCAS以及早期的IBMPowerPC4xx家族大部分是字节排列顺序最高位在最前的机器,这就意味着对半字、字以及双字访问来说,最重要的字节(most-significantbyte,MSB)位于最低的地址。
各实现对最低位在最前的字节排列顺序方式的支持不同。
PowerPC和PowerPCAS提供了最小限度的支持,而4xx家族为最低位字节在最前的存储提供了更为健壮的支持。
BookE是字节排列顺序无关的,因为BookE体系结构完全支持这两种访问方法。
PowerPC应用级寄存器
PowerPC的应用级寄存器分为三类:
通用寄存器(general-purposeregister,GPR)、浮点寄存器(floating-pointregister[FPR]和浮点状态和控制寄存器[Floating-PointStatusandControlRegister,FPSCR])和专用寄存器(special-purposeregister,SPR)。
让我们来分别看一下这三类寄存器。
通用寄存器(GPR)
用户指令集体系结构(BookI)规定,所有实现都有32个GPR(从GPR0到GPR31)。
GPR是所有整数操作的源和目的,也是所有加载/存储操作的地址操作数的源。
GPR还提供对SPR的访问。
所有GRP都是可用的,只有一种情况例外:
在某些指令中,GPR0只是代表数值0,而不会去查找GPR0的内容。
浮点寄存器(FPR)
BookI规定,所有实现都有32个FPR(从FPR0到FPR31)。
FPR是所有浮点操作的源和目的操作数,可以存放32位和64位的有符号和无符号整数,以及单精度和双精度浮点数。
FPR还提供对FPSCR的访问。
注意,嵌入式微处理器实现时经常不提供对浮点指令集的直接硬件支持,或者只是提供一个附加浮点硬件的接口。
很多嵌入式应用程序很少或者根本不需要浮点算法,而当需要的时候,对PowerPC浮点指令执行进行软件仿真就足够了。
在嵌入式微处理器中,硬件中省去浮点(支持)而为实现带来的芯片面积和功率的减少是至关重要的。
浮点状态和控制寄存器(FPSCR)捕获浮点操作的状态和异常结果,FPSCR还具有控制位,以支持特定的异常类型和对四种舍入模式之一的选择。
对FPSCR的访问要通过FPR。
专用寄存器(SPR)
SPR给出处理器核心内部资源的状态并对其进行控制。
不需要系统服务的支持就可以由应用程序读写的SPR包括计数寄存器(CountRegister)、链接寄存器(LinkRegister)和整型异常寄存器(IntegerExceptionRegister)。
需要系统服务的支持才可以由应用程序读写的SPR包括时基(TimeBase)和其他各种可能支持的计时器。
∙指令地址寄存器(InstructionAddressRegister,IAR)
这个寄存器就是程序员们所熟知的程序计数器或者指令指针。
它是当前指令的地址。
这实际上是一个伪寄存器,用户只能通过“branchandlink”指令才能直接使用这个寄存器。
IAR主要是由调试器使用,显示将要被执行的下一条指令。
∙链接寄存器(LinkRegister,LR)
这个寄存器存放的是函数调用结束处的返回地址。
某些转移指令可以自动加载LR到转移之后的指令。
每个转移指令编码中都有一个LK位。
如果LK为1,转移指令就会将程序计数器移为LR中的地址。
而且,条件转移指令bclr转移到LR中的值。
∙定点异常寄存器(Fixed-PointExceptionRegister,XER)
这个寄存器存放整数运算操作的进位以及溢出信息。
它还存放某些整数运算操作的进位输入以及加载和存储指令(lswx和stswx)中传输的字节数。
∙计数寄存器(CountRegister,CTR)
这个寄存器中存放了一个循环计数器,会随特定转移操作而递减。
条件转移指令bcctr转移到CTR中的值。
∙条件寄存器(ConditionRegister,CR)
这个寄存器分为八个字段,每个字段4位。
很多PowerPC指令将指令的第31位编码为Rc位,有一些指令要求Rc值等于1。
当Rc等于1且进行整数操作时,CR字段0被设置来表示指令操作的结果:
相等(Equal,EQ),大于(GreaterThan,GT),小于(LessThan,LT),以及和溢出(SummaryOverflow,SO)。
当Rc等于1且进行浮点操作时,CR字段1被设置用来表示FPSCR中异常状态位的状态:
FX、FEX、VX和OX。
任何一个CR字段都可以是整数或者浮点比较指令的目标。
CR字段0还被设置用来表示条件存储指令(stwcx或者stdcx)的结果。
还有一组指令可以操纵特定的CR位、特定的CR字段或者整个CR,通常为了测试而将几个条件组合到同一个位中。
∙处理器版本寄存器(ProcessorVersionRegister,PVR)
PVR是一个32位只读寄存器,标识处理器的版本和修订级别。
处理器版本由PowerPC体系结构过程分配。
修订级别由实现定义。
需要有特权才能访问PVR,所以应用程序只能在操作系统函数的帮助下才可以确定处理器版本。
回页首
PowerPC应用级指令集
表1列出了不同的指令类别以及每类的指令类型。
表1.指令类别
指令类别
基本指令
Branch
branch,branchconditional,branchtoLR,branchtoCTR
Conditionregister
crand,crnor,creqv,crxor,crandc,crorc,crnand,cror,CRmove
Storageaccess
loadGPR/FPR,storeGPR/FPR
Integerarithmetic
add,subtract,negate,multiply,divide
Integercomparison
comparealgebraic,comparealgebraicimmediate,comparelogical,comparelogicalimmediate
Integerlogical
and,andc,nand,or,orc,nor,xor,eqv,signextension,countleadingzeros
Integerrotate/shift
rotate,rotateandmask,shiftleft,shiftright
Floating-pointarithmetic
add,subtract,negate,multiply,divide,squareroot,multiply-add,multiply-subtract,negativemultiply-add,negativemultiply-subtract
Floating-pointcomparison
compareordered,compareunordered
Floating-pointconversion
roundtosingle,convertfrom/tointegerword/doubleword
FPSCRmanagement
moveto/fromFPSCR,set/clearFPSCRbit,copyFPSCRfieldtoCR
Cachecontrol
touch,zero,flush,store
Processormanagement
systemcall,moveto/fromspecialpurposeregisters,mtcrf,mfcr
指令解析
所有指令的编码长度都是32位。
PowerPC的位编号方式与大部分其他定义相反:
第0位是最重要的位,第31位是最不重要的位。
指令首先由一个字段中较高的6位进行解码,这6位称为主要操作码(primaryopcode)。
其余26位包含的字段分别是操作数说明、立即(immediate)操作数以及扩展的操作码(opcode),而且这些还可能是保留的位或字段。
表2列出了PowerPC定义的基本指令格式。
表2.PowerPC指令格式
格式
0
6
11
16
21
26
30
31
D-form
opcd
tgt/src
src/tgt
immediate
X-form
opcd
tgt/src
src/tgt
src
extendedopcd
A-form
opcd
tgt/src
src/tgt
src
src
extendedopcd
Rc
BD-form
opcd
BO
BI
BD
AA
LK
I-form
opcd
LI
AA
LK
∙D-form
这一指令格式提供至多两个寄存器作为源操作数,一个立即源,至多两个寄存器作为目的操作数。
这一指令格式的一些变种使用部分目的和源寄存器操作数说明符作为立即字段或作为扩展的操作码。
∙X-form
这一指令格式提供至多两个寄存器作为源操作数,至多两个目的操作数。
这一指令格式的一些变种使用部分目的和源寄存器操作数说明符作为立即字段或作为扩展的操作码。
∙A-form
这一指令格式提供至多三个寄存器作为源操作数,以及一个目的操作数。
这一指令格式的一些变种使用部分目的和源寄存器操作数说明符作为立即字段或作为扩展的操作码。
∙BD-form
条件转移指令使用的是这一指令格式。
BO指令字段指定了条件的类型;BI指令字段指定了以哪个CR位作为条件;BD字段用作转移位置。
AA位指定了转移是绝对转移还是相对转移。
换名话说,转移目标地址是立即字段的值,还是立即字段的值与转移地址的和。
LK位指定了下一个顺序指令的地址是否作为子例程调用的返回地址保存在链接寄存器中。
∙I-form
无条件转移指令使用这一指令格式。
由于是无条件的,BD格式中的BO和BI字段改变为另外的转移位置,以构成LI指令字段。
同BD格式一样,这一指令格式也支持AA和LK位。
如前所述,这些指令格式各有其变种。
不过,这些格式是对大部分PowerPC指令集编码结构的最好描述。
转移指令
PowerPC为控制流程提供了一组指令,包括:
∙条件和无条件转移指令。
∙“递减计数和如果是零或者非零时转移”的能力。
∙绝对转移和相对转移。
∙使用链接寄存器或计数寄存器来指定转移目标地址的转移指令。
所有的转移指令都具备保存后继顺序指令地址的能力,包括到链接寄存器的转移。
条件寄存器32位中的任意一位都可以指定为条件转移的条件,并可以指定CR位是否必须为0或1时转移条件才成立。
条件寄存器指令
PowerPC提供了一组用于对CR的特定位执行布尔操作和对CR字段进行拷贝的指令。
它允许组合多个转移条件,这样可以减少代价高昂的条件转移的数量。
表3列出了PowerPCCR逻辑指令。
表3.PowerPCCR逻辑指令
助记符
指令名
crand
CRlogicaland
crandc
CRlogicalandwithcomplement
creqv
CRlogicalequivalent
crnand
CRlogicalnotand
crnor
CRlogicalnotor
cror
CRlogicalor
crorc
CRlogicalorwithcomplement
crxor
CRlogicalxor
整数运算指令
很多指令用于执行运算操作,包括add、substract、negate、compare、multiply和divide。
很多格式用于立即值、溢出检测以及进位和借位。
各实现中multiply和divide的执行是不同的,因为这些通常是多周期指令。
表4列出了PowerPC整数运算指令。
表4.PowerPC整数运算指令
助记符
指令名
add[o][.]
add[&recordOV][&recordCR0]
addc[o][.]
addcarrying[&recordOV][&recordCR0]
adde[o][.]
addextended[&recordOV][&recordCR0]
addi
addimmediate
addis
addimmediateshifted
addic[.]
addimmediatecarrying[&recordCR0]
addme[o][.]
addtominusone[&recordOV][&recordCR0]
addze[o][.]
addtozero[&recordOV][&recordCR0]
divd[o][.]
dividedoubleword[&recordOV][&recordCR0]
divdu[o][.]
dividedoublewordunsigned[&recordOV][&recordCR0]
divw[o][.]
divideword[&recordOV][&recordCR0]
divwu[o][.]
dividewordunsigned[&recordOV][&recordCR0]
mulhd[.]
multiplyhighdoubleword[&recordCR0]
mulhdu[.]
multiplyhighdoublewordunsigned[&recordCR0]
mulhw[.]
multiplyhighword[&recordCR0]
mulhwu[.]
multiplyhighwordunsigned[&recordCR0]
mulld[o][.]
multiplylowdoubleword[&recordOV][&recordCR0]
mulli
multiplylowimmediate
mullw[o][.]
multiplylowword[&recordOV][&recordCR0]
neg[o][.]
negate[&recordOV][&recordCR0]
subf[o][.]
subtractfrom[&recordOV][&recordCR0]
subfc[o][.]
subtractfromcarrying[&recordOV][&recordCR0]
subfe[o][.]
subtractfromextended[&recordOV][&recordCR0]
subfi
subtractfromimmediate
subfis
subtractfromimmediateshifted
subfic[.]
subtractfromimmediatecarrying[&recordCR0]
subfme[o][.]
subtractfromtominusone[&recordOV][&recordCR0]
subfze[o][.]
subtractfromtozero[&recordOV][&recordCR0]
逻辑、循环和移位指令
PowerPC提供了一组完整的逻辑操作(指令),还支持对符号的扩展以及对GPR中前置零的统计。
表5列出了PowerPC逻辑指令。
表5.PowerPC逻辑指令
助记符
指令名
and[.]
and[&recordCR0]
andc[.]
andwithcomplement[&recordCR0]
andi.
andimmediate&recordCR0
andis.
andimmediateshifted&recordCR0
eqv[.]
equivalent[&recordCR0]
nand[.]
notand[&recordCR0]
nor[.]
notor[&recordCR0]
or[.]
or[&recordCR0]
orc[.]
orwithcomplement[&recordCR0]
oris
orimmediateshifted
ori
orimmediate
xor[.]
xor[&recordCR0]
xoris
xorimmediateshifted
xori
xorimmediate
cntlzd[.]
countleadingzerosdoubleword[&recordCR0]
cntlzw[.]
countleadingzerosword[&recordCR0]
extsb[.]
extendsignbyte[&recordCR0]
extsh[.]
extendsignhalfword[&recordCR0]
extsw[.]
extendsignword[&recordCR0]
PowerPC提供了一组健壮而强大的循环和移位操作(指令),如表6所列。