【原创】TI C2833x介绍---(4) FPU流水线
0赞2833x附带了专门的浮点处理引擎FPU(floating point unit),可以理解为是一个协处理器。既然是两个并行的处理器,则在它们直接比如涉及到数据的交换,且在整数与浮点格式直接的转换需要1个延迟槽(delay slot)。其余的指令,例如load, store, max, min, absolute, negative等等,则不需要延迟槽。其流水线如图1所示。
图1 FPU流水线
总结其基本特性为:
- 浮点运算是没有流水线保护的:例如,FPU可以在前一条指令写操作结果前就发出一条新的指令;
- 汇编器检测流水线的冲突
- 编译器将阻止流水线的冲突;
- 在浮点流水线的延迟槽中防止非冲突指令可以提高性能。
浮点运算是没有流水线保护的,这意味着一些与其有关的指令需要使用延迟槽来等待操作完成;在使用汇编变成的时候,需要手动插入很多NOP指令来解决此问题(用C语言编程的时候,这个问题由编译器来自动处理了),或者使用在操作之间不会产生时序冲突的指令。在FPU的汇编指令中,DSP的设计人员已经帮我们定义的很清楚了,例如,如果一条指令需要在它的指令周期结束后插入一个延迟槽,在这个指令以‘p’结尾;如果需要插入两个延迟槽,则这个指令以‘2p’结尾,此时每个周期都以一个新的指令开始,其结果到2个指令之后才有效。
将指令分为3类,总结为
Math |
MPYF32, ADDF32, SUBF32, MACF32 |
2p cycles One delay slot |
Conversion |
I16TOF32, F32TOI16, F32TOI16R, etc… |
2p cycles One delay slot |
Everything else* |
Load, Store, Compare, Min, Max, Absolute and Negative value |
Single cycle No delay slot |
需要注意的是,FPU与CPU寄存器之间的指令MOV32是一个特例。