Рассмотрим этот простой код:
#include <complex.h>
complex float f(complex float x) {
return x*x;
}
Если вы скомпилируете его с помощью -O3 -march=core-avx2 -fp-model strict
с помощью компилятора Intel, вы получите:
f:
vmovsldup xmm1, xmm0 #3.12
vmovshdup xmm2, xmm0 #3.12
vshufps xmm3, xmm0, xmm0, 177 #3.12
vmulps xmm4, xmm1, xmm0 #3.12
vmulps xmm5, xmm2, xmm3 #3.12
vaddsubps xmm0, xmm4, xmm5 #3.12
ret
Это гораздо более простой код, чем вы получаете от gcc
и clang
, а также гораздо проще, чем код, который вы найдете в Интернете для умножения сложных чисел. Это не означает, например, явное обращение с комплексными NaN или бесконечностями.
Соответствует ли эта сборка спецификациям для комплексного умножения C99?