当前版本: 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