I've a binary (openend in IDA v7) that uses GUID variables to manipulate something. Whenever I see any variable with GUID data type there always be a _mm_store_si128()
or _mm_storeu_si128()
functions. I've seen the definitions in Intel Intrinsics Guide. But the article shows that those functions only stores 128-bits of integer data from a variable into memory. The full subroutine is lengthy so I add a small section. Here is an example:
In pseudocode:
if ( RtlGUIDFromString(&GuidString, Guid) >= 0 )
{
_mm_store_si128(&v18, v10);
v18.m128i_i64[1] -= v11;
v18.m128i_i64[0] = v10.m128i_i64[0] + 2 * v11;
_mm_store_si128((__m128i *)&GuidString, v18);
sub_140010DC0(&v18, (__m128i *)&GuidString);
v10 = v18;
}
So my questions are: Does those functions only copy 128bit data? Is it same as memcpy()
or memmove()
? If yes then why not IDA shows those functions (later ones)? Are there any hidden deep relation between _mm_store_si128
and CPU instructions?