Несколько вопросов по применению SSE/SSE2 intrinsics.

Тема в разделе "WASM.ASSEMBLER", создана пользователем destrator, 11 фев 2011.

  1. destrator

    destrator New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2010
    Сообщения:
    16
    Собственно, вопрос первый. Как реализовать загрузку двух 2D float векторов в верхнее и нижнее qword регистра xmm? На голом асме эта задача тривиальна, но ккак быть с интрисками? Для перемещения floats есть следующие
    Код (Text):
    1. _mm_load_ss
    2. _mm_load1_ps, _mm_load_ps1 
    3. _mm_load_ps
    4. _mm_loadu_ps   
    5. _mm_loadr_ps
    Но, как видите, они копируют либо один float, либо сразу четыре. Есть ли аналоги инструкций movlps и movhps для float среди интрсиков? Перерыл весь справочник в MSDN и ни одной не нашел :dntknw:

    И вопрос второй. В той же MSDN некоторое замечание, касающееся применения типа __m64.
    Но среди интрисков SSE2 этот тип применяется. Правильно ли я понимаю, что тип __m64 будет правильно скомпилирован в работоспособный под x64 код применительно к SSE2, а замечание касается лишь снятия с поддержки MMX под x64?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Оно? - http://msdn.microsoft.com/en-us/library/dzs626wx%28v=vs.71%29.aspx

    Полагаю, что да. Вообще смысла в использовании mmx на x64 не наблюдается.
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Хм, не прав - "Any SSE2 intrinsics that use the __m64 data type are not supported on x64 processors."
    http://msdn.microsoft.com/ru-ru/library/bytwczae.aspx
     
  4. destrator

    destrator New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2010
    Сообщения:
    16
    Код (Text):
    1. __m128 _mm_loadh_pi( __m128 a , __m64 * p );
    Да, похоже что оно, вот только меня смущает наличие типа __m64. Это будет работать под x64? Судя по замечанию Boosterа это не будет работать. И не наплодит ли компилятор лишних инструкций, если я буду писать:
    Код (Text):
    1. float vec2[2];
    2. // ..
    3. __m128 v1 = _mm_loadh_pi(v1, reinterpret_cast<__m64*>(vec2));
    Да еще и варнинги будет выдавать по поводу не инициализированного v1 :dntknw: