所有的CortexM3执行乘法指令MUL都是1个时钟周期,但此指令执行的结果是两个32位寄存器相乘后的低32位,高32位没有保存,也就是说要获得正确的结果,要么相乘后结果小于32位,要么不用此指令,改用长乘指令,即32位x32位=64位的UMULL、SMULL指令,此两指令的执行时间与MUL指令有天壤之别: Multiply:1 or 2 cycles。 Multiply with 64-bit result:3-7 cycles。
UMULL/SMULL/UMLAL/SMLAL use early termination depending on the size of source values. These are interruptible (abandoned/restarted), with worst case latency of one cycle. MLAL versions take four to seven cycles and MULL versions take three to five cycles. In both cases, the signed version is one cycle longer than the unsigned. UMULL/SMULL/UMLAL/SMLAL执行起来甚至比ARM7慢!据说AVR32也只需2或4周期,感觉这几个指令是M3中设计得最失败的,不知是基于功耗的考虑还是芯片面积或是其他方面的考虑。总之觉得M3不适于大的数据处理,只适于较小数据量方面的应用。STM32那个12位的ADC特别可爱。 |