знатокам SSE

Тема в разделе "WASM.BEGINNERS", создана пользователем NetDemon, 7 май 2007.

  1. NetDemon

    NetDemon New Member

    Публикаций:
    0
    Регистрация:
    24 апр 2007
    Сообщения:
    22
    Вопрос к знатокам SSE!

    Задачка следущая:
    в регистре хmm0 находятся 4 числа (32bit, packed)
    свободных регистров осталось 4
    вопрос: как можно посчитать сумму 4 чисел
    за минимальное кол-во инструкций (и тактов)!

    Заранее спасибо!
     
  2. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    числа целые или плавающие?
    [added]
    haddps *2
     
  3. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    asmfan
    haddps - это SSE3. Ты уверен, что оно уже у всех есть? В любом случае стоило бы на всякий случай предусмотреть отдельный вариант (а мало ли? :) )
    Сильно быстро, правдо не получится, придется использовать shufps или что-то в этом роде.
     
  4. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Блин, хотел movsldup коварно применить, но она тоже SSE3 :dntknw:
    Ну, навскидку примерно так:
    Код (Text):
    1.     movaps      xmm1, xmm0
    2.     shufps      xmm1, xmm1, 00011011b
    3.     addps       xmm0, xmm1
    4.     movhlps     xmm1, xmm0
    5.     addps       xmm0, xmm1
    а насчет эффективности - сейчас здесь появится leo и в очередной раз доходчиво объяснит, что я дурак, и почему :):):)

    Но если есть уверенность в наличии SSE3, то тогда, конечно, да -
    Код (Text):
    1.     haddps    xmm0, xmm0
    2.     haddps    xmm0, xmm0
    и все дела.
     
  5. NetDemon

    NetDemon New Member

    Публикаций:
    0
    Регистрация:
    24 апр 2007
    Сообщения:
    22
    Влюбом случае спасибо, тк мой вариант гораздо более громоздкий :)

    ЗЫ забыл вписать что SSE3 низзя :dntknw:
     
  6. NetDemon

    NetDemon New Member

    Публикаций:
    0
    Регистрация:
    24 апр 2007
    Сообщения:
    22
    Следующая на очереди задачка:
    xmm0 = 1.0, 2.0, 3.0, 4.0
    xmm1 = 5.0, 6.0, 7.0, 8.0

    Требуется получить
    разницу (1.0 - 5.0 и 4.0 - 8.0) крайних элементов и
    сумму (2.0 + 6.0 и 3.0 + 7.0) внутренних элементов

    Результат должен быть xmm0 = -4.0, 8.0, 10.0, -4.0

    ЗЫ минздрав предупреждает - SSE3 низзя употреблять!!!!
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Код (Text):
    1. align 16
    2. xmask dd 0,80000000h,80000000h,0
    3.  
    4. ;ptr equ ;fasm
    5. xorps xmm1,qword ptr [xmask] ;= изменение знака двух средних чисел xmm1
    6. subps xmm0,xmm1