Естественно, для этого мне пришлось изменить предварительное объявление на
< pre class="lang-cpp Prettyprint-override">
Код: Выделить всё
extern "C" __m128 _ZGVbN4v_cosf(const __m128&);
Это компилируется, но выдает неправильный (случайный/неопределенный) вывод.
Если вместо этого я вернусь к удалению ссылки,
Код: Выделить всё
extern "C" __m128 _ZGVbN4v_cosf(const __m128);
Мой первый вопрос: это запланированное поведение? Должен ли GCC вместо этого выдавать ошибку компиляции, если входной аргумент не соответствует фактическому поведению встроенной функции? Связано ли это с тем, что компоновщик не может видеть реальный символ (я делаю ссылку через -lm) до момента выполнения? Что на самом деле происходит, когда он компилируется, а затем выводит неправильные значения (или это просто неопределенное поведение)?
Мой второй вопрос: поскольку это не ссылка, является ли эта операция дорогостоящей? Копирует ли компилятор мои SIMD-векторы __m128 каждый раз, когда он это вызывает? Мой тест godbolt, кажется, говорит об обратном:
Код: Выделить всё
#include
extern "C" __m128 _ZGVbN4v_cosf(const __m128);
extern "C" __m128 _ZGVbN4v_sinf(const __m128&);
__m128 simdsinf(const __m128& x){
return _ZGVbN4v_sinf(x);
}
__m128 simdcosf(const __m128 x){
return _ZGVbN4v_cosf(x);
}
Код: Выделить всё
simdsinf(float __vector(4) const&):
jmp _ZGVbN4v_sinf
simdcosf(float __vector(4)):
jmp _ZGVbN4v_cosf
Подробнее здесь: https://stackoverflow.com/questions/793 ... lly-like-c