ZHCU876Z July 2001 – October 2023 SM320F28335-EP
--opt_for_space 选项提高了编译器执行的代码大小优化的级别。这些优化以牺牲性能为代价的。优化包括过程抽象,其中公共代码块替换为函数调用。例如,prolog 和 epilog 代码、某些内在函数和其他常见代码序列可以替换为运行时库中定义的函数的调用。使用 --opt_for_space 选项时,必须与提供的运行时库链接。没有必要使用优化来调用 --opt_for_space 选项。
为了说明 --opt_for_space 选项的工作原理,下面将介绍如何替换 prolog 和 epilog 代码。根据 SOE 寄存器的数量、帧的大小以及是否使用帧指针,将此代码更改为函数调用。使用 --opt_for_space 选项在每个文件中定义这些函数,如下所示:
_prolog_c28x_1
_prolog_c28x_2
_prolog_c28x_3
_epilog_c28x_1
_epilog_c28x_2
假设以下 C 代码是使用 --opt_for_space 选项编译的。
extern int x, y, *ptr;
extern int foo();
int main(int a, int b, int c)
{
ptr[50] = foo();
y = ptr[50] + x + y + a +b + c;
}
生成的输出如下所示:
FP .set XAR2
.global _prolog_c28x_1
.global _prolog_c28x_2
.global _prolog_c28x_3
.global _epilog_c28x_1
.global _epilog_c28x_2
.sect ".text"
.global _main
;***************************************************************
;* FNAME: _main FR SIZE: 6 *
;* *
;* FUNCTION ENVIRONMENT *
;* *
;* FUNCTION PROPERTIES *
;* 0 Parameter, 0 Auto, 6 SOE *
;***************************************************************
_main:
FFC XAR7,_prolog_c28x_1
MOVZ AR3,AR4 ; |5|
MOVZ AR2,AH ; |5|
MOVZ AR1,AL ; |5|
LCR #_foo ; |6|
; call occurs [#_foo] ; |6|
MOVW DP,#_ptr
MOVL XAR6,@_ptr ; |6|
MOVB XAR0,#50 ; |6|
MOVW DP,#_y
MOV *+XAR6[AR0],AL ; |6|
MOV AH,@_y ; |7|
MOVW DP,#_x
ADD AH,AL ; |7|
ADD AH,@_x ; |7|
ADD AH,AR3 ; |7|
ADD AH,AR1 ; |7|
ADD AH,AR2 ; |7|
MOVB AL,#0
MOVW DP,#_y
MOV @_y,AH ; |7|
FFC XAR7,_epilog_c28x_1
LRETR
; return occurs