请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28388D 您好、E2E 专家!
你好。
我希望实现一个包含三个值的 MinMax 函数。 我首先将其实施如下:
void MinMax (float a、float b、float c、float &min、 float &max){float max_ab = a >b? a:b; max = max_ab > c? max_ab:c; float min_ab = a < b? a:b; min = min_ab < c? min_ab : c; }
使用此 Makefile 构建:
CCX =/home/ycr/ti/ccs1230/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS/bin/cl2000 CXXFLAGS =--define=cpu1 \ -v28 -ml -mt --float_support=fpu32 --TMU_support=tmu0 --vcu_support=vcu0 -O4 --fp_mode=relaxed \--c11 --c++03 --relaxed_float --tmu_support=tmu0 --vcu_support=tmu0 --vcu_support=vcu_support=vcu0- /home/ycr/ti/ccs1230/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS/include
将生成该 ASM:
MOV32 R3H、R0H ;[CPU_FPU] MINF32 R0H、R1H ;[CPU_FPU] MAXF32 R3H、R1H ;[CPU_FPU] MINF32 R0H、R2H ;[CPU_FPU] MAXF32 R3H、R2H ;[CPU_FPU] MOV32 *+XAR5[0]、R3H ;[CPU_FPU] MOV32 *+XAR4[0]、R0H ;[CPU_FPU]
但是、出于可移植性考虑、我使用 :
#包含 void MinMax (float a、float b、float c、float &min、float &max){ min = std::min (std::min (a、b)、c);max = std::max (std::max (a、b)、 c); }
所生成的代码远远不够理想:
优点: ; 4 | void MinMax (float a、float b、float c、float &min、float &max){ ; 5 | min = std :: min (std :: min (a, b ), c); ; 6 | max = std :: max (std :: max (a, b ), c); ; 8| 优点: CMPF32 R1H、R0H ;[CPU_FPU]|146| MOVST0 ZF、NF ;[CPU_FPU]|146| MOV32 *-SP[4]、R0H ;[CPU_FPU]|4| MOV32 *-SP[6]、R1H ;[CPU_FPU]|4| MOV32 *-SP[8]、R2H ;[CPU_FPU]|4| B |$C$L1||,LT ;[CPU_ALU]|146| ;发生支路;[]|146| MOVZ AR6、SP ;[CPU_ALU]|146| SubB XAR6、4号 ;[CPU_ARAU]|146| B |$C$L2|||,UNC ;[CPU_ALU]|146| ;分支发生;[]|146||||$C$L1|: MOVZ AR6、SP ;[CPU_ALU]|146| SubB XAR6、#6 ;[CPU_ARAU]|146|||||$C$L2|| : MOVZ AR6、AR6 ;[CPU_ALU]|146| MOV32 R1H、*-SP[8] ;[CPU_FPU]|146| MOV32 R0H、*+XAR6[0] ;[CPU_FPU]|146| CMPF32 R1H、R0H ;[CPU_FPU]|146| MOVST0 ZF、NF ;[CPU_FPU]|146| B |$C$L3|||, GEQ ;[CPU_ALU]|146| ;发生支路;[]|146| MOVZ AR6、SP ;[CPU_ALU]|146| SubB XAR6、8号 ;[CPU_ARAU]|146| MOVZ AR6、AR6 ;[CPU_ALU]|146|||||$C$L3|| : MOVL ACC、*+ XAR6[0] ;[CPU_ALU]|5| MOV32 R0H、*-SP[6] ;[CPU_FPU]|148| MOV32 R1H、*-SP[4] ;[CPU_FPU]|148| MOVL *+XAR4[0],ACC ;[CPU_ALU]|5| CMPF32 R1H、R0H ;[CPU_FPU]|148| MOVST0 ZF、NF ;[CPU_FPU]|148| B |$C$L4||、LT ;[CPU_ALU]|148| ;发生支路;[]|148| MOVZ AR4、SP ;[CPU_ALU]|148| SubB XAR4、4号 ;[CPU_ARAU]|148| B |$C$L5||,UNC ;[CPU_ALU]|148| ;分支出现;[]|148||||$C$L4|| : MOVZ AR4、SP ;[CPU_ALU]|148| SubB XAR4、6号 ;[CPU_ARAU]|148|||$C$L5|| : MOVZ AR4、AR4 ;[CPU_ALU]|148| MOV32 R0H、*-SP[8] ;[CPU_FPU]|148| MOV32 R1H、*+XAR4[0] ;[CPU_FPU]|148| CMPF32 R1H、R0H ;[CPU_FPU]|148| MOVST0 ZF、NF ;[CPU_FPU]|148| B |$C$L6||、GEQ ;[CPU_ALU]|148| ;发生支路;[]|148| MOVZ AR4、SP ;[CPU_ALU]|148| SubB XAR4、8号 ;[CPU_ARAU]|148| MOVZ AR4、AR4 ;[CPU_ALU]|148|||$C$L6|| : MOVL ACC、*+XAR4[0] ;[CPU_ALU]|6| SubB SP、8号 ;[CPU_ARAU] MOVL *+XAR5[0],ACC ;[CPU_ALU]|6| LRETR ;[CPU_ALU]
为什么?
此致、
CSC