Измените определение на
static const float values[4] = {-4312.435f, -432.44333f, 4.798, 7898.89};
Статические массивы не будут помещаться в стек функций, поэтому они не будут регенерироваться при каждом вызове функции.
Вы также можете попытаться переместитьэтот массив вне функции (сделайте его глобальным массивом с некоторым префиксом, таким как function1_values
).
РЕДАКТИРОВАТЬ:
Если вы считаете "flds"
или "movss"
инстанции как восстанавливающие -не.Константы будут храниться в разделе .rodata
файла elf, но для их использования компилятор должен загрузить их в регистры.Таким образом, fld
& movss
будет загружать константу только из памяти, и невозможно получить значение из памяти без ее загрузки.
Пример кода:
int function4(float *a, int sz)
{
int i;
const float values[4] = {-4312.435f, -432.44333f, 4.798, 7898.89};
for(i=4;i<sz;i++);
a[i]+=a[i-1]*values[0]+a[i-2]*values[1]+a[i-3]*values[2]+a[i-4]*values[3];
return i;
}
gcc-4.5.2 -O3 ac -fverbose-asm -mfpmath = sse -march = native -S
Ассемблер для тела цикла:
.L2:
movl -20(%ebp), %ecx # %sfp, D.2677
leal (%edx,%ecx), %ecx #, D.2677
movss .LC0, %xmm0 #, tmp192 << THIS is a constant loading
mulss (%edx,%edi), %xmm0 #* prephitmp.46, tmp192
movss .LC1, %xmm1 #, tmp179
mulss (%edx,%esi), %xmm1 #* prephitmp.46, tmp179
addss %xmm1, %xmm0 # tmp179, tmp192
movss .LC2, %xmm1 #, tmp183
mulss (%edx,%ebx), %xmm1 #* prephitmp.46, tmp183
addss %xmm1, %xmm0 # tmp183, tmp192
movss .LC3, %xmm1 #, tmp187
movl -16(%ebp), %ebx # %sfp,
А константы хранятся в .rodata
:
.section .rodata.cst4,"aM",@progbits,4
.align 4
.LC0:
.long -981023877
.align 4
.LC1:
.long -1009239873
.align 4
.LC2:
.long 1083803959
.align 4
.LC3:
.long 1173804831