ZHCU876Z July 2001 – October 2023 SM320F28335-EP
使用 --optimizer_interlist 和 --c_src_interlist 选项进行优化(--opt_level=n 或 -On 选项)编译时,可以控制交叉列出特性的输出。
当 --optimizer_interlist 选项与优化一起使用时,交叉列出功能不会 单独运行。相反,编译器会在代码中插入注释,指示编译器已如何重新排列和优化代码。这些注释在汇编语言文件中以 ;** 开头显示。除非也使用了 --c_src_interlist 选项,否则不会交叉列出C/C++ 源代码。
交叉列出功能会影响优化代码,因为其可能会阻止某些优化跨越 C/C++ 语句边界。优化使正常的源代码交叉列出变得不切实际,因为编译器会大幅度重新排列程序。因此,使用 --optimizer_interlist 选项时,编译器会编写重构的 C/C++ 语句。
当 --c_src_interlist 和 --optimizer_interlist 选项与优化一起使用时,编译器会插入其注释,并且交叉列出功能在汇编器之前运行,从而将原始 C/C++ 源代码合并到汇编文件中。例如,假设下述C代码是使用优化 (--opt_level=2) 和 --optimizer_interlist 选项编译的:
int copy (char *str, const char *s, int n)
{
int i;
for (i = 0; i < n; i ++)
*str++ = *s++;
}
汇编文件包含与汇编代码交叉列出的编译器注释。
;***************************************************************
;* FNAME: _copy FR SIZE: 0 *
;* FUNCTION ENVIRONMENT *
;* FUNCTION PROPERTIES *
;* 0 Parameter, 0 Auto, 0 SOE *
;***************************************************************
_copy:
;*** 6 ----------------------- if ( n <= 0 ) goto g4;
CMPB AL,#0 ; |6|
B L2,LEQ ; |6|
; branch occurs ; |6|
;*** ----------------------- #pragma MUST_ITERATE(1, 4294967295, 1)
:*** ----------------------- L$1 = n-1;
ADDB AL,#-1
MOVZ AR6,AL
L1:
;*** -----------------------g3:
;*** 7 ----------------------- *str++ = *s++;
;*** 7 ----------------------- if ( (--L$1) != (-1) ) goto g3;
MOV AL,*XAR5++ ; |7|
MOV *XAR4++,AL ; |7|
BANZ L1,AR6--
; branch occurs ; |7|
;*** -----------------------g4:
;*** ----------------------- return;
L2:
LRETR
; return occurs
如果添加 --c_src_interlist 选项(使用 --opt_level=2、--c_src_interlist 和 --optimizer_interlist 进行编译),则汇编文件会包含与汇编代码交叉列出的编译器注释和 C 源代码。
;----------------------------------------------------------------------
; 2 | int copy (char *str, const char *s, int n)
;----------------------------------------------------------------------
;***************************************************************
;* FNAME: _copy FR SIZE: 0 *
;* *
;* FUNCTION ENVIRONMENT *
;* *
;* FUNCTION PROPERTIES *
;* FUNCTION PROPERTIES *
;* 0 Parameter, 0 Auto, 0 SOE *
;***************************************************************
_copy
;* AR4 assigned to _str
;* AR5 assigned to _s
;* AL assigned to _n
;* AL assigned to _n
;* AR5 assigned to _s
;* AR4 assigned to _str
;* AR6 assigned to L$1
;*** 6 ----------------------- if ( n <= 0 ) goto g4;
;----------------------------------------------------------------------
; 4 | int i;
;----------------------------------------------------------------------
;----------------------------------------------------------------------
; 6 | for (i = 0; i < n; i++)
;----------------------------------------------------------------------
CMPB AL,#0 ; |6|
B L2,LEQ ; |6|
; branch occurs ; |6|
;*** ----------------------- #pragma MUST_ITERATE(1, 4294967295, 1)
:*** ----------------------- L$1 = n-1;
ADDB AL,#-1
MOVZ AR6,AL
NOP
L1:
;*** 7 ----------------------- *str++ = *s++;
;*** 7 ----------------------- if ( (--L$1) != (-1) ) goto g3;
;----------------------------------------------------------------------
; 7 | *str++ = *s++;
;----------------------------------------------------------------------
MOV AL,*XAR5++ ; |7|
MOV *XAR4++,AL ; |7|
BANZ L1,AR6--
; branch occurs ; |7|
;*** -----------------------g4:
;*** ----------------------- return;
L2:
LRETR
; return occurs