Загадочный PADDQ

Тема в разделе "WASM.BEGINNERS", создана пользователем persicum, 16 сен 2010.

  1. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Хочу складывать 64-битные регистры в MMX. Но комманды PADDQ в MMX вроде нет. Но в машинах с SSE2 вроде как есть даже с MMX. Совсем запутался... Как определить поддержку PADDQ в машине?


    И есще, видимо нужно будет использовать и альтернативный код где такой фичи нет.
    Как тогда сложить 64 бита в MMX? Про 32-разрядные ADD,ADC знаю, это удобно но медленно... С другой стороны эмулировать PADDQ будет гиморно с масками MMX да и так сразу не сообразишь как отловить перенос внутри упакованного двойного числа.
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    persicum
    быстрее add+adc без SSE2 и XMM-регистров сложить вряд ли получится.
    а с MMX можно что-то попытаться сделать только если младшие половины хранить отдельно от старших и грузить парами.
    Код (Text):
    1. movq mm0,[low1]
    2. movq mm1,[low2]
    3. movq mm2,[high1]
    4. paddd mm0,mm1
    5. paddd mm2,[high2]
    6. pcmpgtd mm1,mm0
    7. psubd mm2,mm1
    8. movq [res_l],mm0
    9. movq [res_h],mm2
    вроде как-то так
     
  3. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    В разных SSEx есть свои расширения MMX.
    A fisttp для FPU появился вместе SSE3.
     
  4. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    код, нарисованный выше, совсем не годится, потому что pcmpgt сравнивает числа со знаком, то есть их предварительно с 2^31 нужно xor'ить, а это +2 команды и скорее всего полный проигрыш.
     
  5. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    PADDQ - это медиа инструкция. И все такие инструкции разрабатывались для увелечения скорости выполнения конкретных алгоритмов. Так что cкорей всего add/adc.
     
  6. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    persicum
    бросайте кодить под 32 бита, есть замечательный FPC кросс-компилер для x64 ;)
     
  7. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Написал тестовый код =)))
    Код (Text):
    1.  pcmpeqd mm0,mm0  //-1
    2.  pcmpeqd mm1,mm1
    3.  psrlq  mm1,63  //+1
    4.  paddq  mm0,mm1
    Прикольно получается, на II Пне он вылетает в недопустимую инструкцию,
    а на IV Пне отрабатывается корректно, при всем при том что как известно mmx регистры это не младшие части xmm, а вполне себе отдельные регистры впридачу к xmm

    Стало быть есть риск что данный код будет вылетать на всяких там несовсем свежих AMD и т.п. =(((

    >бросайте кодить под 32 бита
    Да я бы с радостью, тока интели и мелкомягкие решили что для 64бит нужна специальная винда 64битная, а так бы я вызывал 64-комманды скажем для умножения 64х64=128 для RSA и так далее.
     
  8. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499
    А на "II Пне" есть SSE2? ;)

    Код (Text):
    1.     sub     eax, eax
    2.     inc     eax
    3.     cpuid
    4.     and     edx, 0x4000000 ;bit 26 == SSE2 Extensions
    5.     jz      not_supported
     
  9. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    G13
    Ну, например у меня как-то получились интересные вещи на Mendocino. У него и SSE-то нет, так он, подлец на оные инструкции UD не кидает, а тупо игнорирует префикс и выполняет как MMX. Так что варианты есть :)