首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

PPC入门与优化杂谈(2)

PPC入门与优化杂谈(2)

数值计算指令image特性:RISC的“加载/存储”体系RISC决定了PowerPC使用加载/存储体系,即所有计算都是在寄存器中完成,而不是在主存中。除去加载/存储指令,所有操作都是针对寄存器的(少部分立即数),执行消耗周期相同且无须访问主存。CISC体系(如x86)几乎所有操作都可对内存、寄存器或两者同时进行操作。传统上,处理器被设计成适应更加复杂的指令。RISC是基于 “最简单的计算机指令是最经常被执行的” 这一研究基础。用简单指令的组合来执行复杂的指令。这样处理器的时间安排能以较简单和快速运算为基础,能在给定时钟速度下执行较多指令。现代的CISC处理器将自己的指令转换成了内部使用RISC格式,以实现更高的效率。PowerPC 流程控制IBM公司70年代首次开发RISC,但知道多年以后才应用到IBM公司的系统中。尽管第一款IBM RISC处理器早在1986年就被应用到 IBM PC-RT中,但直道 IBM 1990年推出RS/6000服务器时,该技术才开始受到重视。                                                                                                  -- 《罗彻斯特城堡》条件寄存器CR(Condition Register)一共32位,从低位到高位被分成 CR0-CR7八段,每段四位。每个四位的CRn从低到高分别是:LT(小于标志)、GT(大于)、EQ(等于)和SO(溢出)比较指令或条件跳转指令均可指明具体操作哪个 CRn,由此可以同时判断多个条件。整数计算默认更改CR0,浮点数计算默认更改CR1。举例:求绝对值•    _ABS:•       cmpwi %r3, 0              /* 参数R3与0比较     */•       bgt greater_than        /* 如大于就跳转     */•       neg %r3, %r3             /* 取负值: R3 = Not(R3) + 1 */•    greater_than:•       blr                               /* 返回 (从LR取出地址并跳转)    */•    _start:•       li %r3, 123                  /* 加载立即数 123 */•       bl _ABS                       /* 调用 _ABS (跳转前记录地址到LR)*/•       li %r0, 1                     •       li %r3, 1•       sc                               /* 系统调用:结束程序 */比较:cmpw rA, rB (比较有符号),cmpwi rA, IMM(立即数比较),cmpwl rA, rB(无符号)。跳转:blt addr (小于跳转),bgt addr(大于跳转),beq addr(等于跳转)类似:bne(不等),ble(小于等于),bge(大于等于)数据比较指令image特性:多条件寄存器判断相同 - 老代码:    cmpw r3, r4    beq _branch_1判断相同 - 新代码:    cmpw cr4, r3, r4    beq cr4, _branch_1可以在比较和跳转命令第一个参数指明所使用的条件寄存器,如果不写的话,默认 CR0。由此我们可以用更多条件寄存器同时判断若干条件,再用cand/ cor/ cxor复合运算。 数值比较 - 有符号CMP crfD, L, rA, rB    a <- EXTS(rA) 扩展符号到a (如果无符号比较 cmpl 则直接 a = rA)    b <- EXTS(rB) 扩展符号到b (如果无符号比较 cmpl 则直接 b = rB)    If a < b then c = 0b100 设置小于标志    else if a > b then c = 0b010 设置大于标志    else c = 0b001 设置等于标志    CR[4 * crfD – 4 * crfD + 3] <- c || XER[SO] 记录4位状态举例说明:cmpw rA, rB 比较 rA, rB的低32位结果存cr0 (同 cmp 0, 0, rA, rB)cmpd rA, rB 比较 rA, rB的全64位结果存cr0 (同 cmp 0, 1, rA, rB)cmpwc r3, rA, rB 比较 rA, rB的低32位结果存cr3 (同 cmp 3, 0, rA, rB) 转移指令指令B(branch)是绝对地址无条件跳转,BA是相对地址无条件跳转,BL是跳转前将下一条指令的地址记录到LR(可以用blr跳转到LR所指地址),BLA是相对地址跳转,并将下条指令地址记录地址到LR。image条件跳转中 BI用来表示具体需要测试的条件寄存器CR的位,BO用来表示测试方式,比如是测试大于/小于/等于还是测试计数器CTR的值,故此blr等同 bclr 0b10100, 0。特性:指令的别名PowerPC指令助记符有大量别名:比如 CMPW rA, rB 其实是 CMP 0, 0, rA, rB比如 BEQ addr 其实是 BC 0xC, 2, addr比如 BLR 其实是 BCLR 0x14, 0image转移指令如果没有指明条件寄存器,则默认使用CR0(CR的0-3位);bca相对于bc或者ba相对于b,他们的指令码都相同,只是AA位(是否用绝对地址)为1 ;bcl相对于bc或者bl相对于b,他们的指令码亦同,仅LK位(是否记录地址)为1。问题3:如何跳转到R3所记录地址BC, B 等都是用相对地址跳转的。如何实现类似C里面的函数指针调用?答案:需要用到LR寄存器:        mtlr r3 将R3的值保存到LR        blr 跳转到LR所指位置
返回列表