[Visual C++] Initializer List für __m128 erlaubt?
Verfasst: 12.03.2018, 15:56
Huhu,
auf der Arbeit stecken wir seit einem Jahr bei Visual C++ 2015 fest, weil das Produkt kaputtgeht, wenn wir auf 2017 aktualisieren.
Ich habe das Problem auf folgende Situation eingegrenzt:
struct Matrix {
__m128 a;
__m128 b;
__m128 c;
__m128 d;
};
…
return { // Matrix
{ fa, fb, fc, fd }, // alles floats
{ fe, ff, fg, fh },
{ fi, fj, fk, fl },
{ fm, fn, fo, fp }
};
Diese Initialisierungsliste funktionierte mit Visual C++ 2015 richtig, aber mit Visual C++ 2017 wird der zweite Vektor falsch initialisiert. Wenn ich statt einer Initialisierungsliste vier Mal _mm_set_ps() nutze, funktioniert der Code wieder.
Bevor ich einen Bug melde: Ist das undefined behavior? __m128 ist definiert als
union __m128 {
float m128_f32[4];
unsigned __int64 m128_u64[2];
…
};
Meines Wissens nach müsste die Initializer List für das erste Member gelten, also die vier floats. Oder gibt es da einen Fallstrick, dass meine zweite Initializer List auf die 64-Bit-Integer bezogen werden kann? (Dann kann ich mir aber nicht erklären, warum der dritte und vierte Vektor wieder richtig initialisiert werden.)
auf der Arbeit stecken wir seit einem Jahr bei Visual C++ 2015 fest, weil das Produkt kaputtgeht, wenn wir auf 2017 aktualisieren.
Ich habe das Problem auf folgende Situation eingegrenzt:
struct Matrix {
__m128 a;
__m128 b;
__m128 c;
__m128 d;
};
…
return { // Matrix
{ fa, fb, fc, fd }, // alles floats
{ fe, ff, fg, fh },
{ fi, fj, fk, fl },
{ fm, fn, fo, fp }
};
Diese Initialisierungsliste funktionierte mit Visual C++ 2015 richtig, aber mit Visual C++ 2017 wird der zweite Vektor falsch initialisiert. Wenn ich statt einer Initialisierungsliste vier Mal _mm_set_ps() nutze, funktioniert der Code wieder.
Bevor ich einen Bug melde: Ist das undefined behavior? __m128 ist definiert als
union __m128 {
float m128_f32[4];
unsigned __int64 m128_u64[2];
…
};
Meines Wissens nach müsste die Initializer List für das erste Member gelten, also die vier floats. Oder gibt es da einen Fallstrick, dass meine zweite Initializer List auf die 64-Bit-Integer bezogen werden kann? (Dann kann ich mir aber nicht erklären, warum der dritte und vierte Vektor wieder richtig initialisiert werden.)