У меня есть функтор, который принимает значение, отбрасывает его в double, берет журнал и возвращает значение обратно в исходный тип. Для целей этого вопроса исходный и выходной тип - float. Вот исходный код на С++:
return static_cast< TOutput >( std::log( static_cast< double >( A ) ) )
Когда я компилирую в режиме отладки, все идет так, как ожидалось, и GCC вызывает базовую функцию log
:
51:/myfile.h **** return static_cast< TOutput >( std::log( static_cast< double >( A ) ) );
219133 .loc 112 51 0
219134 0010 488B45F0 movq -16(%rbp), %rax # A, tmp64
219135 0014 F30F1000 movss (%rax), %xmm0 # *A_1(D), D.237346
219136 0018 0F14C0 unpcklps %xmm0, %xmm0 # D.237346, D.237346
219137 001b 0F5AC0 cvtps2pd %xmm0, %xmm0 # D.237346, D.237347
219138 001e E8000000 call log #
219138 00
219139 0023 660F14C0 unpcklpd %xmm0, %xmm0 # D.237347
219140 0027 660F5AC0 cvtpd2ps %xmm0, %xmm0 # D.237347, D.237346
219141 002b F30F1145 movss %xmm0, -20(%rbp) # D.237346, %sfp
219141 EC
219142 0030 8B45EC movl -20(%rbp), %eax # %sfp, <retval>
Однако, когда я включаю оптимизации на (-O2 -ggdb3 -DNDEBUG), он вызывает функцию logf
(???):
51:/myfile.h **** return static_cast< TOutput >( std::log( static_cast< double >( A ) ) );
145171 .loc 64 51 0
145172 01a0 F30F1004 movss (%rdx,%rax,4), %xmm0 # MEM[(const float &)_84], MEM[(const float &)_84]
145172 82
145173 01a5 E8000000 call logf #
Он дает другой вывод. Это нормально? Я что-то делаю неправильно? Мне кажется, что GCC очень либерально интерпретирует мой код, чего я не ожидал бы в отсутствие опции -ffast-math
.