TI C66x DSP 指令集 -之- ADDKPC

时间:2022-11-10 00:01:27

          ADDKPC指令的作用是通过一条指令实现返回地址的保存与nop指令的执行。在调用B指令实现真正跳转前,要保存下一条指令的地址(为了执行完跳转程序后,能够返回),并同时执行n个nop指令。该指令有助于减小设置函数调用的返回地址时使用的指令数。

如下面的汇编代码,未使用ADDKPC指令时,在B指令后要保存LABEL的地址到B3寄存器(因为B指令在5个cycle后才会起作用,所以保存LABEL地址的两条指令会执行到,因为只需2个cycle),然后执行3个nop,这样在B指令后,共用了5个cycle,下个cycle B指令就是真正起作用,跳转到func执行;使用ADDKPC指令后,只需一条指令即可实现地址的保存与NOP的执行,ADDKPC指令使用一个cycle,再执行4个nop,也是共5个cycle,之后跳转到func执行

TI C66x DSP 指令集 -之- ADDKPC

ADDKPC的用法:ADDKPC label, reg, n  //label是标签的地址,reg是寄存器,n是执行nop数

TI C66x DSP 汇编:

TI C66x DSP 指令集 -之- ADDKPC

如上图,第一条指令执行B跳转指令,B指令后,执行了一个nop(1个cycle),然后执行两个ADD指令(2个cycle),然后在一个cycle同时执行OR与ADDAW指令(||所在行的执令会与他前面的那条指令同时执行,所以占用1个cycle),最后三条指令ADDAW,ADDAW,ADDKPC会同时执行(1个cycle,并在ADDKPC指令中保存CacluateEquWeightsIRC_2PIPE函数的返回地址),所以B指令后共用了5个cycle,在第6个cycle后,就会真正的跳转了,在CacluateEquWeightsIRC_2PIPE函数汇编代码的最后,会直接跳到B3地址处。B3寄存器应该是编译器默认的保存返回地址的寄存器。