elseifa>EXTS(SI) thenc<-0b010 //大于时设置CRn
(1)为1
else c<-0b001 //等于时设置CRn
(2)为1
CR寄存器中的:
4×BF+32:
4×BF+35<-c||XER寄存器中SO位 //||表示字符连接
解释:
将寄存器RA与立即数SI进行比较,然后将比较指令产生的状态放入CR寄存器的不同字段中,CR寄存器有8个CRn字段(n从0至7),可以由三bit位的BF段指定。
L:
表示是进行32位还是64的比较。
对于e600而言,只有L=0的比较。
备注:
解释一下CR寄存器,e600中32位CR寄存器用来存放指令执行之后的状态,该寄存器分为8个字段。
分别为CR0,CR1,…,CR7。
每个字段都由4bit组成。
各个字段CRn(n从0至7)都可以表示响应指令执行的结果:
比如整数的加减及逻辑运算,使用CR0来存放状态,CR0的四个bit位的含义如下:
CR0(0):
用来表示LT(小于),当整型指令运算结果为负时置1;
CR0
(1):
用来表示GT(大于),当整型指令运算结果为正时置1;
CR0
(2):
用来表示EQ(等于),当整型指令运算结果为0时置1;
CR0(3):
用来表示SO(溢出),当整型指令运算结果溢出时置1;
同理浮点数的运算使用CR1来保存运算状态,保存过程同上,e600的比较指令可以使用CR寄存器的全部的CRn(n从0至7)来保存运算的结果。
一般在比较指令cmp之后都会有一个条件跳转指令,比如bc指令。
其中cmp指令可以指定由CR寄存器的CRn段来保存结构,比如上面的cmpi指令就用BF来指定CRn字段,一般而言bc指令就会更新cmp中相同的CRn段来决定条状。
2.4.8CompareLogicalImmediate指令
cmpliBF,L,RA,UI和cmpli的指令的用法相同,所不同的是cmpli是无符号数直接的比较,而cmpi是有无符号之间的比较。
2.4.9TrapWordImmediate指令
twiTO,RA,SI
解释:
该指令称之为陷阱(trap)指令,该指令对一些Trap条件进行测试,如果条件成立,则处理器进入系统的trap程序,然后对trap事件进行处理。
TO字段(有5位),第0至4位此次表示:
LTS:
(有符号式比较:
小于)
GTS:
(有符号数比较:
大于)
EQ:
(有符号数比较:
等于)
LT:
(无符号数比较:
小于)
GT:
(无符号数比较大于)
比如:
如果用户将TO设置为1,并且RA中的有符号数小于立即数SI(符合扩展之后),则处理器进程Trap处理程序。
备注:
如果把立即数SI换成寄存器索引RB,则twTO,RA,RB就是X-Form形式。
tw31,r0, r0就是一个无条件trap指令,可用助记符“trap”表示。
另外,D-Form指令包含了很多用于算术和逻辑运算的指令,这些指令都是需要一个立即数的,由于这些立即数都是在指令中的,这样在e600内核中,这些立即数的长度只能限制在16位。
为了能顺利的处理32位的立即数,e600内核中的D-Form指令可以在立即数的计算时把立即数左移16位,这样我们就可以用两条指令就可以把一个立即数放到一个通用计算器中。
例如:
读取一个word(0x12345678)到目的寄存器:
lis RA,0x12345678@h //高16位(0x1234)偏移16位后变成0x12340000放进RA
oriRB,RA, 0x12345678@l //RA与低16位(0x5678)相或后构成完整数据放进RA
备注:
PowerPC指令中,i后缀表示立即数,s后缀表示左移16位。
例如addi、addis、ori、oris等。
这段代码也可以用来读取某个变量的值,只需要把立即数替换成变量名。
从某个地址(0x56789abc)读取数据
lis RA,0x56789abc@ha //调整后的高16位(0x5679)偏移16位后变成(0x56790000)放进RA
lwzRB,0x56789abc@l(RA)//RA加上低16位(0xffff9abc)构成完整数据地址,然后将其内容放进RB
注意:
用于算术运算的操作数(包括addi的操作数)时,@l获取的是符号扩展的低16位数据(0xffff9abc),因此高16位必须进行根据bit15进行调整,而不能简单的使用@h来获取。
2.5X-Form指令
E600中X-Form指令的数量最多,D-form指令的每一个指令在X-Form中都有对应的指令。
除此之外,X-Form指令还有一些专用的指令。
X-Form的指令格式如下:
0-5 6-10 11-15 16-20 21-30 31
OPCD TS/RT RA RB XO Rc
X-Form的指令格式与
D-Form指令格式:
0-5 5-10 11-15 16-31
OPCD RS/RT RA D
相比,只是将D-Form指令中的D字段差分为RB,XO和Rc字段。
X-Form中的RB和RS字段存放源操作数寄存器的索引
RT字段存放目的操作数的索引;
RA字段既可以存放源操作数寄存器的索引,而言可以存放目的操作数的索引;
Rc字段置1表示当前指令的运算结果将改变CR寄存器中的相应CRn段,具有“.”的后缀的指令,其Rc位置1。
典型的X-Form指令如下:
存储器访问类指令:
lbzx,lhzx,lhax,lwzx,stbx,sthx,stwx,lbzux,lhzux,lwzux,stbux,sthux,stwux指令等,这些指令和D-Form中的lbz,lhz,lha,lwz,stb,sth,stw,lbzu,lhzu,lwzu,stub,sthu,stwu一一对应,所不同的是D-Form使用的立即数,换成了X-Form使用的寄存器索引。
字节序列交换指令:
lhbrx,lwbrx,sthbrx,stwbrx指令,这些指令的作用是调整字节序列。
比较类指令和trap指令:
cmp,cmpl,tw指令
算术逻辑运算指令:
and,or,xor,nand,nor,eqv指令
CountLeadingZerosWord指令:
cntlzwRA,RS
备注:
该指令找出RS寄存器中从左边开始第一个不为0的位,然后将该位所在的位序(从0开始)存入RA中;
2.6XL-Form指令
XL-Form指令支持条件转移指令,与B-Form类条件转移指令:
B-Form指令格式
有条件转移指令
0-5 6-10 11-15 16-29 30 31
OPCD BO BI BD AA LK
不同,该类指令使用LR寄存器或者CTR寄存器,而不适用16位的立即数作为跳转目标。
XL-Form指令格式:
0-5 6-10 11-15 16-18 19-20 21-30 31
OPCD BO BI ~ BH 16或者528 LK
所支持的指令格式:
bclr BO,BI,BH //LK=0,21-30字段值为16
bclrl BO,BI,BH //LK=1,21-30字段值为16
bcctr BO, BI,BH //LK=0,21-30字段值为528
bcctrlBO, BI, BH //LK=1,21-30字段值为528
X-Form类指令的BO,BI字段值和B-Form类中的BO,BI字段含义相同,LK置1表示跳转指令执行后,LR寄存器指向下一条指令的地址(当前指令地址+4),BH字段用于静态分支预测。
当条件满足时,bclr和bclrl指令使用LR寄存器进行长条状,而bcctr,bcctrl指令使用CTR寄存器进行长跳转。
于B-Form指令类似,X-Form指令也使用了很多助记符,比如:
blr相当于bclr20,0
备注:
XL-Form指令和I-Form指令协作完成指令的跳转
例子如下:
备注:
blr是XL-Form指令,bc是I-Form指令。
XL-Form指令还可以支持CR寄存器不同段CRn的与,或,异或,同或操作,指令格式如下:
0-5 6-10 11-15 16-20 21-30 31
OPCD BT BA BB 257/449/193/225/0 ~
这里举出以下几种指令:
crand BT,BA,BB //第21-30字段为257,BT<-BA&BB
cror BT,BA,BB //第21-30字段为449,BT<-BA|BB
crxor BT,BA,BB //第21-30字段为193,BT<-BA同或BB
crnand BT,BA,BB //第21-30字段为255,BT<-!
(BA&BB)
mcrf BF,BFA //第21-30字段为0,将CR的BFA字段拷贝到BF字段
2.7XFX-Form,XFL-Form,XS-Fomr,XO-Form类指令
XFX-Form指令格式:
0-5 6-10 11-20 21-30 31
OPCD RT spr/tbr XO ~
包括mrspr,mfspr,mrcrf,mfcr,mtocrf等等
XO-Form指令用来支持带进位的算术运算指令和乘除法指令格式:
0-5 6-10 11-15 16-20 21 22-30 31
OPCD RT RA RB OE XO Rc
有下面几类指令:
1:
addo.,subfo.,addco.,subfo.指令,此类指令将会影响CA,SO,OV位和CR0字段;
2:
addeo.,subfeo.,addzeo.,subfzeo.指令,此类指令除会影响CA,SO,OV位和CR0字段外,还可以将CA位参与运算;
3:
mullw,divw指令,此类指令用作乘除运算;
4:
A-Form指令用作浮点运算,典型指令有fadd,fsub,fmul,fdiv。
2.8M-Form指令
M-Form指令主要作用是对选定的字段做循环左移,并做一些相应掩码操作,该类指令时PowerPC指令的精华,包含了一组非常强大的指令。
这里主要介绍三条指令:
2.8.1RotateLeftWordImmediatethenANDwithMask指令
rlwinmRA,RS,SH,MB,ME(Rc=0)
rlwinm.RA,RS,SH,MB,ME(Rc=1)
指令字段:
0-5 6-10 11-15 16-20 21-25 26-30 31
21 RS RA SH MB ME Rc
解释:
寄存器RS的内容循环左移立即数SH位,然后跟立即数MB和ME形成的MASK相与后放进RA
备注:
MASK形成的规则是,如果MB小于等于ME,则MB到ME之间的位全部置1,包括这两位,形成MASK;否则,MB到ME之间的位清0,其他位包括这两位置1,形成MASK。
例子1:
从立即数0x12345678(RS)中抽取bit20-23,并左移16位,从而得到0x06000000.
rlwinmrA,rS,16,4,7
具体过程:
0x12345678循环左移16位得到0x56781234,然后与MASK:
0x0f000000 (MASK[4,7])相与。
该指令可以用来抽取C语言代码或者寄存器中的位域。
例子2:
清除立即数0x12345678(RS)的bit28-31,并左移24位,从而得到0x00123456
rlwinmrA,rS,24,8,31
具体过程如下:
0x12345678循环左移24位得到0x78123456,然后与MASK:
0x00ffffff (MASK[8,31])相与。
例子3:
清除立即数0x12345678(RS)的bit6,从而得到0x10345678
rlwinmrA,rS,0,7,5
具体过程:
0x12345678循环左移0位,仍是0x56781234,然后与MASK0xfdffffff (MASK[7,5])相与。
功能:
该指令可以用来清除C语言代码或者寄存器中的位域。
2.8.2RotateLeftWordthen