用C语言看CCS的编译效率 -- ( 1 ) 比较两数大小

2019-07-30 15:37发布

本帖最后由 dontium 于 2014-10-9 10:28 编辑

比较两数大小编译器CCS V6CPU C2000任务:比较两数大小目的:看看CCS会不会用C28 的MAX、MIN指令
例句:
    使用C语言编程,其C语句如下,      if  ( xyz >abc )              abc= xyz;        即判断最大数,并将其保留。    在C28CPU中,有16位最大(最小)数的比较指令,也有32位的最大(最小)数的比较指令,16位及32位的比较指令均为单周期,16位比较指令可以嵌套重复指令,32位的却不能。如果使用汇编语言,最少可以用两个指令(MOVW指令为定位数据段,如果之前的指令在同一段内,可以省去)。最佳效果为:         MOVW     DP,#_abc       ; 1周期,定位数据段,并假设两数均在同一段内(下同)         MOV   AL, @_abc          ; 1周期         MAX   AL, @_xyz           ; 1周期    现在使用CCS V6编译器,在不同情况下对上述C语句进行编译,以下是几种情况下的编译结果一、不优化时          MOVW DP, #_abc        MOV       AL,@_abc       ; 1周期         CMP       AL,@_xyz       ; 1周期        B         $C$L2,HIS        ;7周期(条件真)/ 4周期(条件假)|         MOV       AL,@_xyz       ;1周期        MOV       @_abcAL       ; 1周期$C$L2,HIS       ……二、0级优化语句同上三、1级优化,        MOV       AL,@_abc               MOVB      @_xyz,#55,UNC          CMPB      AL,#55                ;         B         $C$L2,LOS             ;         MOV      @_xyz,AL       ; $C$L2,LOS:           ……四、2级优化        MOVW      DP,#_xyz       ;         MOV       AL,@_abc       ; .        MOVB      @_xyz,#55,UNC  ;         CMPB      AL,#55                ;          MOV       @_xyz,AL,HI   ; 五、3级优化        MOVW      DP,#_xyz       ;         MOV       AL,@_abc       ;         MOVB      @_xyz,#55,UNC  ;         CMPB      AL,#55                ;         MOV       @_xyz,AL,HI   ;六、4级优化        MOVW      DP,#_xyz       ;         MOV       AL,@_abc       ;         MOVB      @_Txyz,#55,UNC  ;         CMPB      AL,#55            ;        MOV       @_Txyz,AL,HI   ; 七、4级优化+优化速度最快        MOVW      DP,#_xyz       ;         MOV       AL,@_abc       ;        MOVB     @_xyz,#55,UNC  ;         CMPB      AL,#55                ;        MOV       @_xyz,AL,HI   ;

    由上可见,在1级优化以前,都使用了跳转指令,它会占用很多时间(7个或4个周期),    而在后面的优化级别里,使用了有条件保存(MOV loc16, AX, COND)这样一条指令,但是,用这个指令必须要有标志位的支持,所以都不例外地使用了CMP指令。      在所有的优化级别里,均未用到C28中的MAXMIN)指令,可见,编译器对CPU指令的应用还不到位,对CPU效率的发挥还存在障碍。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
aozima
1楼-- · 2019-07-30 15:48
 精彩回答 2  元偷偷看……
dirtwillfly
2楼-- · 2019-07-30 19:07
感谢楼主分享。
楼上说的有道理。楼主可以用计算圆周率或者其他测试mcu性能的算法来测试
angerbird
3楼-- · 2019-07-30 22:20
谢谢分享,,讲解的非常详细的。

一周热门 更多>