工具/软件:TI C/C++编译器
我正在尝试让编译器生成有效的代码来查找最小的16位整数数组:
int array_min_i16 (const int *array,int num)
{
间隔最小值;
_nassert( num >0);
min =*array++;
同时(--num )
{
min =__min (min,*array++);
}
返回最小值;
}
这将生成程序集(可以从.compiler_opts标记中获取编译器选项)
;*******************************************************
;* TMS320C2000 C/C++ Codegen PC v 17.9 .0.STS *
;*创建日期/时间:2017年11月14日星期二16:56:02 *
;*******************************************************
compiler_opts --abi=coffabi --cla_support=cla1 --diag_wrap=off --float_support=fpu32 --hll_source=on --mem_model:code=flat --mem_model:data=large --object_format=coff --section_sizes=on --silit_version=28 --mu_none
ASGXAR2,FP
; 17.9 C:\\ccsv6\tools\compiler\ti-CGT-C2000_DCX.0.STS\bin\opt2000.exe --gen_opt_info=12000. --gen_opt_info=1 C:\\Users\\XXXX\\AppData\\Local\\Temp\\{B44A09E1-C4D6-4F83-8D85-016C0A54BF9C\}\A0524\Atemp\{A44A0546AFE_AFE_A05462\\\AFE#\A5\A5\A5\A5462\A5\A5\A5\A5\A5C\A5\A5\A5\A5BE\A5\A5\A5\A5BE\A5\A5BE\A5\A5\A5BE\A5</s>0546 0.5462万5462
; C:\\ccsv6\tools\compiler\ti-CGT-C2000_C2000<xmt-block0>2000 17.9 .STS\bin\ac2000.exe -@C:\\Users\\XXX\\AppData\\Local\\Temp\\{74F4C8A9-E322-45BA-9328-AB0817806698}</s>0817806698
.sect ".ti.ramfunc:_array_min_i16"
单击
.global _array_min_i16
;*******************************************************
;* FNAME:_array_min_i16 FR大小: 0*
;**
;*函数环境*
;**
;*函数属性*
;* 0参数,0自动,0 SOE *
;*******************************************************
_array_min_i16:
;***7------------------ min =*array;
;***8 --------------------------- 如果(!(--num))转到g7;
ADDB AL,#-1;[CPU_ALU]|8|
MOVZ AR6,AL;[CPU_ALU]|8|
MOV AL,*+XAR4[0];[CPU_ALU]|7|
MOV AH,AR6;[CPU_ALU]|7|
BF $C$L3,EQ;[CPU_ALU]|8|
;发生分支;[]|8|
;***10 --------------------------- D1美元 =编号和1;
;***7------------------ ++数组;
;***10 --------------------------- 如果(num < 2)转到G5;
ANDB AH,#1;[CPU_ALU]|10|
MOVZ AR7,AH;[CPU_ALU]|10|
ADDB XAR4,#1;[CPU_ALU]|7|
MOV AH,AR6;[CPU_FPU]|7|
CMBB AH,#2;[CPU_ALU]|10|
BF $C$L2,LT;[CPU_ALU]|10|
;出现分支;[]|10|
;***--------------- l1美元 =(num>>>1)-1;
;***--------------- #pragma must迭代(116383,1)
;***--------------- //以下循环按因子展开(2)
;***--------------- #pragma loop_flags(4102u)
ASR AH,1;[CPU_ALU]
ADDB AH,#-1;[CPU_ALU]
MOVZ AR6,AH;[CPU_ALU]
$C$L1:
;***--------------- G4:
;***10 --------------------------- min =__min (min,*array++);
;***10 --------------------------- min =__min (min,*array++);
;***8 --------------------------- 如果(--L1美元)!=(-1))转到G4;
最小Al,*XAR4++;[CPU_ALU]|10|
最小Al,*XAR4++;[CPU_ALU]|10|
Banz $C$L1,AR6-;[CPU_ALU]|8|
;发生分支;[]|8|
$C$L2:
;***--------------- G5:
;***--------------- 如果(d1美元<=0)转到G7;
MOV AH,AR7;[CPU_ALU]
BF $C$L3,Leq;[CPU_ALU]
;发生分支;[]
;未滚动循环的剥离循环迭代:
;***10 --------------------------- min =__min (min,*array);
;***--------------- G7:
;***13--------------- 返回最小值;
最小Al,*+XAR4[0];[CPU_ALU]|10|
$C$L3:
LRETR;[CPU_ALU]
;出现返回;[]
我无法让编译器产生更高效的
_array_min_i16:
SubB ACC,#2
MOV AH,AL
MOV AL,*XAR4++
RPT AH
||最小AL,*XAR0++;
LRETR;
如何让编译器生成更优化的函数版本? 是否缺少编译器开关(可能是最大不间断序列)?