Сохраните low128 с vmovdqu [rdi], xmm0
.
Сохраните high128 с VEXTRACTI128 xmm1/m128, ymm2, 1
. Вероятно, вы можете заставить компилятор сгенерировать хранилище в памяти, присвоив результат внутреннего извлечения ссылке в памяти.
vextracti128 / f128
занимает 2 мопа, даже в объединенном домене (Haswell), так что IDK имеет смысл кодировать его с непосредственным операндом 0. (до AVX512, когда непосредственный индекс вместо movh
становится актуальным, поскольку они не знали, что собираются заменить VEX на EVEX для AVX512). Нет никакого штрафа за смешивание AVX2 с регистрами xmm и AVX2 с регистрами ymm, поэтому вы можете просто использовать 128-битное хранилище версии xmm, чтобы получить низкий 128, точно так же, как вы можете получить low32 для 64-битного регистра GP, указав eax
вместо rax
.
При использовании встроенных функций, вероятно, раздражает приведение чего-либо, поэтому, если повезет, компилятор скомпилирует _mm256_extracti128_si256 (vec, 0)
в vmovdqu
соответствующего xmm reg. Но если ваш компилятор этого не сделает, ваш код будет быстрее, если вы заставите его генерировать vmovdqu
. (movdqu
работает так же быстро, как vmovdqa
, если адрес выровнен, точно так же, как доступ к памяти AVX без использования mov.)
person
Peter Cordes
schedule
08.06.2015