|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 cjsb37 于 2013-4-29 09:08 编辑
熟悉C64处理器的人都知道,该处理器支持跨取指包边界派发执行包。所以这款处理器就存在分支到跨边界执行包的现象,当连续的分支都跨边界的时候就会出现流水线异常。先跨边界的分支会因为后面紧跟着另外一个分支而无法取到自己另外一半取指包。对于偏移量型分支TI的ccs3.1并不支持分支跨边界,只有寄存器型分支才支持分支跨边界。下面我上传的这段程序在CCS3.1中执行,编译后通过反汇编可以发现在地址00060D40开始的一个名为IMG_conv_3x3的库函数。从该函数起始有连续的几个分支分别跳转到00F78,00F84,00FB8,00E98,00E98 ,00ED8。其中00F78,00FB8, 00E98, 00E98 ,00ED8 均为跨边界的分支目的地址。在实际单步执行的时候发现上面一串分支实际跳转的地址分别为
实际跳转到的分支地址 00F78 ,00A84 ,00FB8 ,00EB8 ,00E98 ,00EF8
理论分支地址 00F78 ,00F84 ,00FB8 ,00E98 ,00E98 00ED8
看到有什么问题了吗 ?
在连续跨边界的情况下,分支实际跳转的地址比理论地址滞后了一个取指包。这段程序在C64的DSK开发板上执行的结果与其CCS3.1的执行轨迹相同。
从体系结构上来分析,当出现跨边界的分支后面紧跟分支的时候,由于在指令地址产生阶段不能预测出取指包是否跨边界,所以必然会出现跨边界的分支丢失其一半的执行包。这时的解决方案我考虑到的有两种: 1、像通用处理器分支预测失败那样清空流水线重新开始取值,这么做的好处是设计简单,但效率很低。 2、增加新的取指令旁路,这么做虽然设计复杂但效率比较高。TI的CCS编译器正常情况下也不执行分支跨边界取指包的编译,说明TI处理这种情况代价也很大。但上述这些分析都不足以解释分支地址的异常情况。
在目前能够查找到的TI文档中并没有关于这方面的说明。
为什么会出现这种问题,急盼有熟悉TI C64处理器结构的强人能解释一下。本人下面附了这段程序,有安装CCS的可以执行看看。
|
|