Search code examples
cassemblyx86sseintrinsics

Does _mm_stream_load_si128 (movntdqa) modify the memory its argument points to?


_mm_stream_load_si128 is declared as

__m128i _mm_stream_load_si128 (__m128i * mem_addr)

while _mm_load_si128 is declared as

__m128i _mm_load_si128 (__m128i const* mem_addr)

Does the former modify the contents of what mem_addr points to? If not, what's the motivation for the non-const declaration?


Solution

  • I think it is declared this way for no reason. See _mm256_stream_load_si256 and _mm512_stream_load_si512 that are the same for wider operand, they take const argument.

    Also in <smmintrin.h> that comes with Visual Studio 2015 it is const:

    /*
     * Load double quadword using non-temporal aligned hint
     */
    
    extern __m128i _mm_stream_load_si128(const __m128i*);