<?xml version="1.0" encoding="gbk"?> <rss version="2.0"><channel> <title>定阅帖子更新</title> <link>http://www.broadkey.com.cn/XML.ASP</link><description>TEAM Board - 意得法电子</description> <copyright>TEAM 2.0.5 Release</copyright><generator>TEAM Board by TEAM5.Cn Studio</generator> <ttl>30</ttl><item><link>http://www.broadkey.com.cn/Thread.asp?tid=47 </link><title>PowerPC&amp;nbsp;体系结构之&amp;nbsp;ULR&amp;nbsp;和&amp;nbsp;ABI</title><author>east</author><pubDate>2009-11-25 23:32:45</pubDate><description><![CDATA[<strong><font color="#99cc00">A. 以下取 Book E 之 ULR 精要<br />
<br />
</font></strong>ULR (User Level Register) 即用户态程序能用的寄存器，包括只读的和可读写的。<br />
<br />
最常用的 ULR 包括以下寄存器：<br />
<br />
<strong>1.</strong> GRP (General Purpose Register) 通用寄存器，即用于定点运算的寄存器，共 32 个<br />
<br />
<strong>2.</strong> <font color="#ff9900">CR</font> (Condition Register) 指令状态寄存器，其格式如下所示：<br />
<br />
<div forimg="1" align="center"><img class="blogimg" border="0" src="http://hiphotos.baidu.com/comcat/pic/item/12d2092b558d26ede7cd4008.jpg" small="0" alt="" /></div>
<br />
<font color="#ff0000"><strong>注意：</strong></font>Book E 对寄存器的位编号与通常不同，因其支持 PowerPC 64，故其将 64 位寄存器从最高位 (MSB) 到最低位 (LSB) 编号为 0 ~ 63，32 位寄存器则编号为 32 ~ 63。<br />
<br />
CR 以4位为单位分成 8 个域，每个域能描述 4 种状态。<br />
<br />
<strong>2.1</strong> CR0 用于存放 RC 位为1 的整数指令执行后的状态。CR[32:35] 依次表示小于、大于、等于和溢出。当指令执行的结果小于、大于或等于 0 时则置相应的CR[32:34] 的位；CR[35] 的值则直接复制自XER 的 SO (Summary Overflow)位。<br />
<br />
<strong>2.2</strong> CR1用于存放 RC 位为 1 的所有浮点指令执行后的浮点异常状态。其内容直接复制于浮点状态与控制寄存器 (FPSCR)，CR[36:39] 依次对应于浮点异常 (FX)、浮点使能异常 (FEX)、浮点非法操作异常 (VX) 和浮点溢出异常 (OX)。<br />
<br />
RC 位为 1 的指令，其助记符的最后有一个 '<strong>.</strong>' ，如 addic./divw./mullw./neg./and./or./xor./nand./nor.<br />
<br />
<strong>2.3</strong> 对于比较指令（整数和浮点），可以通过操作数 BF 指定比较结果所存储的 CR 域：<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; cmp&nbsp;&nbsp; <font color="#99cc00"><strong>3</strong></font>, 0, r3, r4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cmp&nbsp;&nbsp;&nbsp; BF, L, RA, RB)<br />
<br />
操作数 L = 0，表示此为 32 位比较，即只比较 r3, r4 的 32 ~ 63 位。若 r3 &gt; r4，则将 CR<font color="#99cc00"><strong>3</strong></font>[gt] (CR[45]) 置位。浮点比较类似，但域内第 4 位含义与整数不同，整数依然表示溢出 (SO)，且其值拷贝自 XER[SO]；而对浮点比较，若该位被置，则表示某一浮点操作数不是数值。<br />
<br />
<strong>2.4</strong> 此外 RC 位为 1 的条件存储指令 (stwcx<strong>.</strong>/stwcxe<strong>.</strong>/stdcxe<strong>.</strong>)，在存储操作成功时置 CR0[2] (EQ 位) 为 1。<br />
<br />
<strong>3. </strong>LR (Link Register) 链接寄存器，用于存放返回地址<br />
&nbsp;&nbsp; Branch and Link 类指令（如 bl，指令内 LK 位为 1）会将下条指令的地址自动写入 LR。bl 用于调用子过程，则置入 LR 的即为返回地址<br />
&nbsp;&nbsp; Branch Conditional to Link Register 类指令（如 bclr）则使用 LR 作为跳转的目标地址，该类指令通常用于子过程返回<br />
<br />
<strong>4. </strong>CTR (Count Register) 计数寄存器，常用于存放跳转目标地址，与 Branch Conditional to Count Register 类指令配合使用；亦可存放循环变量与条件分支指令 (Branch Conditional) 配合，实现循环<br />
<br />
CR，LR 和 CTR 是与分支指令紧密联系的，在实现基本程序结构之判断、循环以及过程调用方面作用巨大。<br />
<br />
<strong>5. </strong>XER (Integer eXception Register) 整数异常寄存器，用于置整数运算的溢出 (Overflow)、进位 (Carry Out) 以及批量加载和存储指令要操作的字节数<br />
<br />
<strong>6. E500 ULR</strong><br />
<br />
下图为 e500 之 ULR 概览：<br />
<br />
<div forimg="1" align="center"><img class="blogimg" border="0" src="http://hiphotos.baidu.com/comcat/pic/item/cf0c39efb5915800fcfa3c08.jpg" small="0" alt="" /></div>
<br />
可以看到 e500 没有浮点寄存器，其没有浮点部件。<br />
<br />
<br />
<strong>7. E600 ULR</strong><br />
<br />
下图为 e600 之 ULR 概览：<br />
<br />
<div forimg="1" align="center"><img class="blogimg" border="0" src="http://hiphotos.baidu.com/comcat/pic/item/0ad12e510192430e377abe0a.jpg" small="0" alt="" /></div>
<br />
e600 则含32个浮点寄存器，且含 32 个向量寄存器 (VR0 ~ VR31) 用于支持向量计算。<br />
<br />
<strong><font color="#ff6600"><br />
B. ABI</font></strong><br />
<br />
ABI 即 Application Binary Interface。其主要规定通用寄存器的使用约定，以及过程调用的栈的组织。一般最常用的就是通用寄存器的使用约定。Linux 下常用SYS V ABI。<br />
<br />
以下是比较诸多 PowerPC ABI 版本后的一个交集：<br />
<br />
GPR1: Stack Pointer<br />
GPR3 ~ GPR4: 参数1 ~ 2，同时复用之，置 2 个返回值<br />
GPR5 ~ GPR10: 参数 3 ~ 8<br />
<br />
e500 ABI 继承于 System V ABI PowerPC Processor Supplement<br />
<br />
以较为常用的 System V ABI 为准，其他寄存器的约定如下：<br />
<br />
GPR0: volatile, may be used by function linkage<br />
GPR2: reserved for system<br />
GPR11 ~ 12: volatile, may be used by function linkage<br />
GPR13: small data area pointer<br />
GPR14 ~ 31: saved<br />
<br />
<br />
<font color="#3366ff"><strong>C. Reference</strong></font><br />
<br />
[1] Book E: Enhanced PowerPC Architecture, v1.0, 2002.7<br />
[2] PowerPC e500 Core Family Reference Manual, Rev. 1, 2005.4<br />
[3] e600 PowerPC Core Reference Manual, Rev. 0, 2006.3<br />
[4] SYSTEM V APPLICATION BINARY INTERFACE PowerPC Processor Supplement (SYS V ABI), Rev. A, 1995.9<br />
[5] PowerPC Embedded Application Binary Interface (EABI), v1.0, 1995.1<br />
[6] PowerPC e500 Application Binary Interface User&rsquo;s Guide, Rev. 1.0, 2003.3<br />]]></description></item></channel></rss>