<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jack&#039;s Lab &#187; 体系结构</title>
	<atom:link href="http://www.jackslab.org/?feed=rss2&#038;tag=%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84" rel="self" type="application/rss+xml" />
	<link>http://www.jackslab.org</link>
	<description>好奇之心，改变之力</description>
	<lastBuildDate>Sun, 02 Jul 2017 02:48:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>PowerPC 体系结构之 ULR 和 ABI</title>
		<link>http://www.jackslab.org/?p=203</link>
		<comments>http://www.jackslab.org/?p=203#comments</comments>
		<pubDate>Mon, 21 Feb 2011 09:21:54 +0000</pubDate>
		<dc:creator>Jack Tan</dc:creator>
				<category><![CDATA[PowerPC]]></category>
		<category><![CDATA[体系结构]]></category>
		<category><![CDATA[ISA]]></category>
		<category><![CDATA[ULR]]></category>

		<guid isPermaLink="false">http://www.jackslab.org/?p=203</guid>
		<description><![CDATA[A. 以下取 Book E 之 ULR 精要 ULR (User Level Register) 即用户态程序能用的寄存器，包括只读的和可读写的。 最常用的 ULR 包括以下寄存器： 1. GRP ...]]></description>
			<content:encoded><![CDATA[<p><span style="color: #99cc00;"><strong>A. 以下取 Book E 之 ULR 精要</strong></span></p>
<p>ULR (User Level Register)  即用户态程序能用的寄存器，包括只读的和可读写的。</p>
<p>最常用的 ULR 包括以下寄存器：</p>
<p><strong> 1.</strong> GRP (General Purpose Register)  通用寄存器，即用于定点运算的寄存器，共 32 个</p>
<p><strong> 2.</strong> <span style="color: #ff9900;">CR</span> (Condition Register) 指令状态寄存器，其格式如下所示：</p>
<p><a href="http://www.jackslab.org/wp-content/uploads/2011/02/CR.png"><img class="aligncenter size-full wp-image-204" title="CR" src="http://www.jackslab.org/wp-content/uploads/2011/02/CR.png" alt="" width="336" height="63" /></a><br />
<span style="color: #ff0000;"><strong>注意：</strong></span>Book E 对寄存器的位编号与通常不同，因其支持 PowerPC 64，故其将 64 位寄存器从最高位 (MSB) 到最低位 (LSB) 编号为 0 ~ 63，32 位寄存器则编号为 32 ~ 63。</p>
<p>CR 以4位为单位分成 8 个域，每个域能描述 4 种状态。</p>
<p><strong> 2.1</strong> CR0 用于存放 RC 位为1 的整数指令执行后的状态。CR[32:35] 依次表示小于、大于、等于和溢出。当指令执行的结果小于、大于或等于 0 时则置相应的CR[32:34] 的位；CR[35] 的值则直接复制自XER 的 SO (Summary Overflow)位。</p>
<p><strong> 2.2</strong> CR1用于存放 RC 位为 1 的所有浮点指令执行后的浮点异常状态。其内容直接复制于浮点状态与控制寄存器 (FPSCR)，CR[36:39] 依次对应于浮点异常 (FX)、浮点使能异常 (FEX)、浮点非法操作异常 (VX) 和浮点溢出异常 (OX)。</p>
<p>RC 位为 1 的指令，其助记符的最后有一个 &#8216;<strong>.</strong>&#8216; ，如 addic./divw./mullw./neg./and./or./xor./nand./nor.</p>
<p><strong> 2.3</strong> 对于比较指令（整数和浮点），可以通过操作数 BF 指定比较结果所存储的 CR 域：</p>
<p>cmp      <span style="color: #99cc00;"><strong>3</strong></span>, 0, r3, r4         (cmp     BF, L, RA, RB)</p>
<p>操作数 L = 0，表示此为 32 位比较，即只比较 r3, r4 的 32 ~ 63 位。若 r3 &gt; r4，则将 CR<span style="color: #99cc00;"><strong>3</strong></span>[gt] (CR[45]) 置位。浮点比较类似，但域内第 4 位含义与整数不同，整数依然表示溢出 (SO)，且其值拷贝自 XER[SO]；而对浮点比较，若该位被置，则表示某一浮点操作数不是数值。</p>
<p><strong> 2.4</strong> 此外 RC 位为 1 的条件存储指令 (stwcx<strong>.</strong>/stwcxe<strong>.</strong>/stdcxe<strong>.</strong>)，在存储操作成功时置 CR0[2] (EQ 位) 为 1。</p>
<p><span id="more-203"></span></p>
<p><strong>3. </strong>LR (Link Register) 链接寄存器，用于存放返回地址<br />
Branch and Link 类指令（如 bl，指令内 LK 位为 1）会将下条指令的地址自动写入 LR。bl 用于调用子过程，则置入 LR 的即为返回地址<br />
Branch Conditional to Link Register 类指令（如 bclr）则使用 LR 作为跳转的目标地址，该类指令通常用于子过程返回</p>
<p><strong> 4. </strong>CTR (Count Register) 计数寄存器，常用于存放跳转目标地址，与 Branch Conditional to Count Register 类指令配合使用；亦可存放循环变量与条件分支指令 (Branch Conditional) 配合，实现循环</p>
<p>CR，LR 和 CTR 是与分支指令紧密联系的，在实现基本程序结构之判断、循环以及过程调用方面作用巨大。</p>
<p><strong> 5. </strong>XER (Integer eXception Register) 整数异常寄存器，用于置整数运算的溢出 (Overflow)、进位 (Carry Out) 以及批量加载和存储指令要操作的字节数</p>
<p><strong>6. E500 ULR</strong></p>
<p>下图为 e500 之 ULR 概览：</p>
<p><a href="http://www.jackslab.org/wp-content/uploads/2011/02/e500-ulr.png"><img class="aligncenter size-full wp-image-205" title="e500-ulr" src="http://www.jackslab.org/wp-content/uploads/2011/02/e500-ulr.png" alt="" width="689" height="278" /></a></p>
<p>可以看到 e500 没有浮点寄存器，其没有浮点部件。</p>
<p><strong>7. E600 ULR</strong></p>
<p>下图为 e600 之 ULR 概览：</p>
<p><a href="http://www.jackslab.org/wp-content/uploads/2011/02/e600-ulr.png"><img class="aligncenter size-full wp-image-206" title="e600-ulr" src="http://www.jackslab.org/wp-content/uploads/2011/02/e600-ulr.png" alt="" width="258" height="541" /></a></p>
<p>e600 则含32个浮点寄存器，且含 32 个向量寄存器 (VR0 ~ VR31) 用于支持向量计算。</p>
<p><strong><span style="color: #ff6600;"><br />
B. ABI</span></strong></p>
<p>ABI 即 Application Binary Interface。其主要规定通用寄存器的使用约定，以及过程调用的栈的组织。一般最常用的就是通用寄存器的使用约定。Linux 下常用SYS V ABI。</p>
<p>以下是比较诸多 PowerPC ABI 版本后的一个交集：</p>
<p>GPR1: Stack Pointer<br />
GPR3 ~ GPR4: 参数1 ~ 2，同时复用之，置 2 个返回值<br />
GPR5 ~ GPR10: 参数 3 ~ 8</p>
<p>e500 ABI 继承于 System V ABI PowerPC Processor Supplement</p>
<p>以较为常用的 System V ABI 为准，其他寄存器的约定如下：</p>
<p>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</p>
<p><span style="color: #3366ff;"><strong>C. Reference</strong></span></p>
<p>[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’s Guide, Rev. 1.0, 2003.3</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jackslab.org/?feed=rss2&#038;p=203</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
