Natürlich musste ich dazu die Forward-Deklaration in
< ändern pre class="lang-cpp Prettyprint-override">
Code: Select all
extern "C" __m128 _ZGVbN4v_cosf(const __m128&);
Dies wird kompiliert, erzeugt aber eine falsche (zufällige/undefinierte) Ausgabe.
Wenn ich stattdessen wieder den Verweis entferne,
Code: Select all
extern "C" __m128 _ZGVbN4v_cosf(const __m128);
Meine erste Frage ist: Ist das beabsichtigtes Verhalten? Sollte GCC stattdessen einen Kompilierungsfehler auslösen, wenn das Eingabeargument nicht mit dem tatsächlichen Verhalten des Intrinsic übereinstimmt? Liegt das daran, dass der Linker das eigentliche Symbol (ich verlinke über -lm) erst zur Laufzeit sehen kann? Was passiert eigentlich, wenn es kompiliert und dann falsche Werte ausgibt (oder handelt es sich einfach nur um undefiniertes Verhalten)?
Meine zweite Frage lautet: Ist dieser Vorgang kostspielig, da es sich nicht um eine Referenz handelt? Kopiert der Compiler meine __m128 SIMD-Vektoren jedes Mal, wenn er dies aufruft? Mein Godbolt-Test scheint etwas anderes zu suggerieren:
Code: Select all
#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);
}
Code: Select all
simdsinf(float __vector(4) const&):
jmp _ZGVbN4v_sinf
simdcosf(float __vector(4)):
jmp _ZGVbN4v_cosf