PowerPC 体系结构之指令集 (II)

3.3 整数指令

这类指令大致分为如下几类:

整数访存指令
整数算术运算指令
整数逻辑运算指令
整数比较指令
整数陷阱指令
整数移位指令
XER 指令

其中以整数循环移位指令最为特别。

3.3.1 整数访存指令

3.3.1.1 Load Byte/Half-word/Word and Zero

该类指令从指定地址处读取 8 位、16 位、32 位数据,置入 RT,RT 高位置 0

lbz/lbzu            RT, D(RA)
lbzx/lbzux          RT, RA, RB

lhz/lhzu            RT, D(RA)
lhzx/lhzux          RT, RA, RB

lwz/lwzu            RT, D(RA)
lwzx/lwzux          RT, RA, RB

RT, RA, RB 皆为 GPR,D 为有符号立即数。则有效地址的计算分别为:RA[32:63] + D,RA[32:63] + RB[32:63],有效地址高 32 位置 0。

后缀 u 表示 Update,即将有效地址更新到 RA 中
后缀 x 表示 Indexed,即使用 RA + RB 的寻址方式

以上用于 32 位,对 64 位,上述指令皆加后缀 ‘e’。则有效地址的 0 ~ 31 位, 不再置 0,其计算方式如下:RA + D,RA + RB。

此外,用于 64 位的还有对双字操作的支持:

lde/ldue/ldxe/lduxe

PowerPC 体系结构之指令集 (I)

1. 概述

Book E 定义的 PowerPC 指令集的指令可分为以下几类:

分支跳转指令
CR 指令 整数指令
浮点指令
处理器控制指令
存储管理相关指令

CR 指令主要是对 CR 内部位运算支持的一些指令,如 crand, cror, crxor 等等。

2. 常用指令

先看一个测试程序:

int test_call(int a, int b, int c)
{
	a = b + c;
	return a;
}

int test_if(int s)
{
	int i;
	if(s > 0)
		i = s;
	else if(s < 0)
		i = -s;
	else
		i = s * 8;
	return i;
}

int test_cyc1(int c)
{
	int sum = 0;
	do {
		sum += c;
		c--;
	} while(c > 0);
	return c;
}

int test_cyc2(int c)
{
	int sum = 0;
	for(; c > 0; c--)
		sum += c;
	return c;
}

int main()
{
	int a, b, c, d;
	a = test_if(5);
	b = test_cyc1(10);
	c = test_cyc2(10);
	d = test_call(1, 2, 3);
	return a + b + c + d;
}

引入的目的在于查看判断、循环和过程调用这些基本结构在 PowerPC 里怎么被支持。

-O2 参数编译后,objdump -S -d 反汇编,则: