F
CheckersGuy schrieb:
Habe alle Informationen zu der Funktion in der Dokumentation von Intel gefunden https://msdn.microsoft.com/en-us/library/w486zcfa(v=vs.90).aspx
Das ist nicht die Doku von Intel, sondern die von MS. Es empfielt sich, tatsächlich mal bei Intel nachzuschlagen:
https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_srl_epi32&expand=5110,5080
Diese Doku ist auf jeden Fall deutlich informativer, vor allem da man für jede Funktion im Zweifelsfall den angegebenen Pseudocode konsultieren kann,
und auch die Performance-Angaben sind praktisch für etwaige Mikro-Optimierungen.
Bezüglich deines Ergebnisses passiert wohl folgendes (richtig getippt, @hustbaer):
count wird zwar in einem 128-Bit-Register übergeben, davon werden aber nur die unteren 64 Bit für den count herangezogen.
Ist dieser count größer als 31 werden alle 4 Integer auf 0 gesetzt (alle Bits rechts rausgeshiftet) - siehe Pseudocode.
Nun setzt du allerdings mit _mm_set_epi32() jeden der 4 32-Bit-Integer auf 1, d.h. die unteren 64 Bit sind 1 << 32 + 1 = 4294967297 .
Das ist definitiv größer als 31
Versuchs mal mit der von hustbaer vorgeschlagenen Funktion, oder mit:
__m128i SHIFT=_mm_set_epi32(0,0,0,1);
Ich denke das liefert das Ergebnis, das du erwartest.
Zusatz: Die Funktion _mm_srlv_epi32() verhält sich so, wie du es wahrscheinlich hier erwartet hast (unabhängige Shift-Counts für jeden der 4 Integer).
Diese ist jedoch eine AVX2-Funktion (ab Haswell, Mitte 2013) - bei meiner betagten Mühle, auf der ich das hier gerade schreibe, wäre das ein Illegal-Instruction-Crash ;).