您好:
最近编写并行汇编的时候出现了很奇怪的问题,希望各位技术支持能解答下.
现象:多条指令并行执行的时候,单步调试,,结果存放在寄存器中,发现有些指令执行完后,寄存器中的值没有变化, 但是Simulator下执行是很正常的. 有时候改变该指令执行的功能单元的时候,该指令会正常执行!
希望能解决这个问题,多谢!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
有的指令的执行结果是有延迟的,也就是说执行之后需要几个Cycle才能得到最终结果。例如LDW指令,其延时周期数是4,意味着指令执行4个cycle之后,内存的值才会load到寄存器中。更详细内容请参考sprugh7的3.4节。
c6000的汇编复杂程度较高,如果对性能不是要求到极致,您可以尝试使用编译器提供的intrinsic指令,通过该方式告诉编译器你要使用某些特殊指令,让编译器帮你做优化,效率也是很高的。
在c66x指令集中3.8.13 Constraints on Floating-Point Instructions,提到了某些指令在排流水时是有些限制的,你的代码有违反4-cycle指令的地方, loop 后的第二个cycle (mpysp .m2 b20,b6,b28 ;16),你可以看看。因为很多限制人工去考虑的话问题很多,所以强烈建议你在C语言中使用intrinsic来实现你们的算法,这样编译器会把很多限制考虑进去,保证代码不会出错。