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

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


当前版本: 1.0
完成日期: 2008-7-23
作者: Jack Tan
Email: jiankemeng@gmail.com
版权声明: 转载请注明出处,商业用途请联系作者

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

3.3.1.2 Load Half-word Algebraic

lha/lhau            RT, D(RA)
lhax/lhaux          RT, RA, RB

与 lhz 不同的是,该指令将所读取的半字的最高位 (RT[48]) 填充到 RT[32:47],实际上就是形成一个 16 位的补码有符号数。

有效地址计算与上同;后缀 u, x 与上同。

对 64 位情形,上述指令皆加后缀 ‘e’,有效地址计算与上小节同。

3.3.1.3 Load Halfword/Word Byte-Reverse

从指定地址处读取 16 位/32 位数据,将字节反转后置入 RT,RT 高位置 0

lhbrx   RT, RA, RB
lwbrx   RT, RA, RB

如: lwbrx   r3, r2, r1,若 r2 + r1 地址处的数据为 0x55aa66bb,则 r3 的结果为 0xbb66aa55

对 64 位情形,上述指令皆加后缀 ‘e’,有效地址计算与上小节同。

3.3.1.4 Load Multiple Word

lmw    RT, D(RA)

该指令将 RA + D 开始处的数据,顺序置入 RT ~ R31 中,共读取 31 – T 个字

该指令无 64 位扩展。

3.3.1.5 Load String Word

lswi    RT, RA, NB      (后缀 i,表示立即数 Immediate)
lswx    RT, RA, RB      (后缀 x,表示 Indexed 寻址方式)

加载 n 个字节到 RT 开始的寄存器中;
当 NB == 0 时 n = 32; NB != 0 时 n = NB,NB 取值范围为 0 ~ 31

如 r3 = 0×1000 :

lswi   r4, r3, 16

则将 0×1000 处的 16 字节,依次写入 r4, r5, r6, r7

对于 lswx,要加载的字节数则位于 XER[57:63]

该指令无 64 位扩展。

3.3.1.6 Load Word/Doubleword and Reserve

lwarx    RT, RA, RB

该指令与 lwzx 的差别在于,其还将处理器内部的 RESERVE 位置为 1,并将有效地址对应的物理地址放入 RESERVE_ADDR 中。

该指令的 64 位版本为: lwarxe   RT, RA, RB,差别还是在于有效地址的 0 ~ 31 不被置 0

此外还有一个 ldarxe   RT, RA, RB,与 lwarxe 的差别在于其加载 8 字节的数据。

这三条指令常分别与 stwcx./stwcxe./stdcxe. 联用,用于实现锁操作,类似 MIPS 之 ll/sc 指令。

3.3.1.7 Store

stb/stbu            RS, D(RA)
stbx/stbux          RS, RA, RB
sth/sthu            RS, D(RA)
sthx/sthux          RS, RA, RB
stw/stwu            RS, D(RA)
stwx/stwux          RS, RA, RB

该类指令将 RS 中的 8 位、16 位、32 位数据写入有效地址处。后缀 ‘u’, ‘x’ 之含义与 3.3.1.1 同。

上述 12 条指令加后缀 ‘e’ 则用于 64 位。有效地址计算与与 3.3.1.1 同。

另用于 64 位的还有对双字操作的支持:

stde/stdue/stdxe/stduxe

3.3.1.8 Store Halfword/Word Byte-Reverse

sthbrx RS, RA, RB
stwbrx RS, RA, RB

将 RS 中的 16/32 bit 的数据字节反转后置入有效地址处。该指令用于支持在大端系统上以小端序存储数据,亦或在小端系统上以大端序存储数据。

对 64 位情形,上述指令皆加后缀 ‘e’,有效地址计算与上小节同。

3.3.1.9 Store Multiple Word

smw   RS, D(RA)

该指令将 RS ~ R31 中的数据 (一个字),写入到 RA + D 处

该指令无 64 位扩展。

3.3.1.10 Store String Word

stswi      RS, RA, NB    (后缀 i,表示立即数 Immediate)
stswx      RS, RA, RB    (后缀 x,表示 Indexed 寻址方式)

与 lswi/lswx 的操作相反,其将 RS 开始的寄存器组中的 n 个字节,写入到有效地址处(位于 RA)

当 NB == 0 时 n = 32; NB != 0 时 n = NB,NB 取值范围为 0 ~ 31

如 r3 = 0×1000 :

stswi   r4, r3, 16

则将 r4, r5, r6, r7 中的 16 字节数据依次写入 0×1000 处

对于 stswx,要加载的字节数则位于 XER[57:63]

该指令无 64 位扩展。

3.3.1.11 Store Word/Doubleword Conditional

stwcx.         RS, RA, RB

如果 RESERVE 位为 1,且 RA + RB 对应的物理地址与 RESERVE_ADDR 一致,则将 RS[32:63] 的内容写入到 RA + RB 处,将 CR0[eq] 位置为 1 后,再将 RESERVE 位复位为 0。

若条件不满足,则仅将 CR0[eq] 位置为 0

可用该指令与 lwarx 联用,实现 spin_lock:

li   r0, 1
loop:
lwarx   r4, 0, r3
cmpwi   r4, 0          # r4[32:63] 与 0 比较
bne loop
stwcw.   r0, 0, r3
bne   loop
isync

解锁则为:

msync
li   r0, 0
stw   r0, 0(r3)

下面的指令用于 64 位:

stwcxe.       RS, RA, RB
stdcxe.       RS, RA, RB

差别在于有效地址的高 32 位不再被置为 0。

3.3.2 整数算术运算指令

加、减、乘、除、取负

3.3.3 整数逻辑运算指令

与、或、非、异或


3.3.4 整数比较指令

cmp       BF, L, RA, RB
cmpi       BF, L, RA, SI          # RA 与有符号立即数 SI 比较
cmpl       BF, L, RA, RB          # RA, RB 逻辑比较。l —> logical
cmpli      BF, L, RA, UI          # RA 与无符号立即数 UI 逻辑比较

BF 取值 0 ~ 7,用于指定使用的 CR 域
L 为 0,则为 32 位比较;为 1,则为 64 位比较

如:

cmpi      0, 0, r3, 5

若 r3 > 5,则 CR0[gt] = 1;若 r3 < 5,则 CR0[lt] = 1

3.3.5 整数陷阱指令

tw      TO, RA, RB
twi   TO, RA, SI

TO 为立即数,5 位,从左到右标号为 0 ~ 4,依次表示小于、大于、等于、无符号小于、无符号大于。用于指定 Trap 的条件。
SI: Signed Immediate

如:

twi   0×10, r3, 5

则如果 r3 < 5,则陷入异常。

以上用于单字 (32 bit) 比较,双字比较则用:

td      TO, RA, RB
tdi   TO, RA, SI


3.3.6 整数移位指令
3.3.6.1 Rotate

rlwimi        RA, RS, SH, MB, ME            # Rotate Left Word Immediate then Mask Insert
rlwinm        RA, RS, SH, MB, ME            # Rotate Left Word Immediate then AND with Mask
rlwnm         RA, RS, RB, MB, ME            # Rotate Left Word then AND with Mask

以下是该指令的一些例子:

all r11 is: 0x55aa67bb

r0 = 0×00000000
rlwimi    r0, r11, 8, 0, 31
r0 is: 0xaa67bb55

r0 = 0×12345678
rlwimi    r0, r11, 8, 0, 14
r0 is: 0xaa665678

r0 = 0×12345678
rlwimi    r0, r11, 8, 28, 3
r0 is: 0xa2345675

即:取 RS 循环左移 SH 位后的 WB 到 WE 位,替换 RA 的 WB 到 WE 位。

r0 = 0×00000000
rlwinm    r0, r11, 8, 0, 31
r0 is: 0xaa67bb55

r0 = 0×12345678
rlwinm    r0, r11, 8, 0, 14
r0 is: 0xaa660000

即:取 RS 循环左移 SH 位后的 WB 到 WE 位,替换归零后的 RA

rldcl
rldcr
rldic
rldicl
rldicr
rldimi

3.3.6.2 Shift

slw
srw
sraw
srawi

slw./srw./sraw./srawi.

sld
srd
srad
sradi

3.3.7 XER 指令

mcrxr          BF
mcrxr64        BF

3.4 浮点指令

这类指令包括:

浮点数据加载与存储指令
浮点运算指令
浮点数近似和转化指令
浮点比较指令
浮点状态和控制寄存器指令

有关该指令的详情留待以后以《PowerPC 浮点结构》的形式讨论吧。

3.5 处理器控制指令

这类指令包括用于支持异常中断处理的:

sc            System Call
rfci          Return From Critical Interrupt
rfi         Return From Interrup

用于处理器控制寄存器维护的:

mfspr      RT, SPRN         Move From SPRN (Special Purpose Register) to RT
mtspr      SPRN, RS         Move RS To SPRN

mfdcr      RT, DCRN         Move From DCRN (Device Control Register) to RT
mtdcr      DCRN, RS         Move RS To DCRN

mfmsr      RT            Move From MSR to RT
mtmsr      RS            Move RS To MSR

wrtee        RA    Write MSR External Enable, MSR[EE] = RA[48]
wrteei    E   Write MSR External Enable Immediate, MSR[EE] = E

以及用于指令同步的:

isync

其保证在其之前的所有指令皆提交,在其自己被提交前,其之后的指令不会进入流水线

3.6 存储管理相关指令

这类指令包括用于 TLB 管理的:

tlbivax
tlbre
tlbwe
tlbsx
tlbsync

tlbivaxe
tlbsxe

用于 Cache 管理的:

dcba/dcbf/dcbi/dcbst/dcbt/dcbtst/dctz/icbi/icbt
dcbae/dcbfe/dcbie/dcbste/dcbte/dcbtste/dctze/icbie/icbte

用于存储同步的:

msync
mbar

发表评论

8 + 1 = ?