https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98495
Bug ID: 98495 Summary: X86 _mm_extract_pi16 incorrectly sign extends result Product: gcc Version: 11.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: foom at fuhm dot net Target Milestone: --- #include <xmmintrin.h> int test(__m64 a) { return _mm_extract_pi16 (a, 0); } Compiles to (x86_64 gcc, -O2): pextrw $0, %xmm0, %eax cwtl ret Which results in the value being sign-extended from 16-bits to 32-bits. The intel docs for PEXTRW state that the upper bits are zeroed, and state that _mm_extract_pi16 is supposed to implement PEXTRW. So, the expected result is no sign extension: pextrw $0, %xmm0, %eax ret I'd note that this is not a regression due to the new MMX with SSE2 changes -- GCC has had this bug as far back as I can see. It is currently present on trunk both for the MMX and SSE2 implementations. Both clang and MSVC zero-extend rather than sign-extend. And, for that matter, GCC's _mm_extract_epi16 function _also_ zero-extends -- it was fixed in PR45336 for GCC 4.6.