Поддерживает ли Delphi все инструкции MMX/SSE?

У меня есть этот фрагмент кода:

@combinerows:
    mov esi,eax
    and edi,Row1Mask
    and ebx,Row2Mask
    or ebx,edi
    //NewQ:= (Row1 and Row1Mask) or (Row2 and Row2Mask);

  //Result:= NewQ xor q;
  PUNPCKDQ mm4,mm5   <-- I get an error here
  //mov eax,[eax].q
  movd eax,mm4

  //q:= NewQ;
  mov [esi].q,ebx
  xor eax,ebx  //Return difference.

Я получаю эту ошибку:

[Ошибка Pascal] SDIMAIN.pas(718): E2003 Необъявленный идентификатор: 'PUNPCKDQ'

Я делаю что-то не так, или Delphi 2007 не поддерживает полный набор инструкций MMX/SSE?


person Johan    schedule 20.06.2011    source источник
comment
Для любой мнемоники, которую Delphi не распознает, вы можете использовать команду DB для вставки необработанных байтов инструкции.   -  person Rob Kennedy    schedule 21.06.2011
comment
Я не знал, что Delphi поддерживает такие инструкции. Когда была добавлена ​​поддержка?   -  person David Heffernan    schedule 21.06.2011
comment
@David: я уверен, что они уже были в D7.   -  person Giel    schedule 21.06.2011
comment
В любом случае, на всякий случай, если людям интересно: замена push ebx на movd mm0,ebx медленнее, а movq mm4,[eax] для загрузки 2 целых чисел за один раз медленнее, чем загрузка двух целых чисел с использованием mov ebx,[eax] + mov ecx,[eax+4] Использование регистров mmx в качестве фиктивного стека освобождает esp для изящных вещей. Это действительно сработало.   -  person Johan    schedule 21.06.2011


Ответы (2)


Delphi 2007 поддерживает наборы инструкций MMX и SSE. Конечно, Delphi 2010 и XE поддерживают наборы инструкций вплоть до SSE4.2 (но пока не поддерживают AVX).

Тем не менее, Delphi правильно жалуется на вашу инструкцию "PUNPCKDQ": Руководство разработчика программного обеспечения для архитектуры IA-32 (особенно важны тома 2A и 2B), вы НЕ найдете инструкции с таким названием. То есть это ваша ошибка, а не отсутствие поддержки этой инструкции в Delphi.

person PhiS    schedule 21.06.2011
comment
Да, я начинаю понимать, что теперь я читал руководство по MMX, чтобы освежить в памяти этот материал, но в нем полно неправильных ключевых слов. Очень назойливый. - person Johan; 21.06.2011

Быстрый Google дает информацию о PUNPCKLDQ, а не о PUNPCKDQ.

D2007 принимает PUNPCKLDQ
и, что еще лучше, он также поддерживает PUNPCKHDQ, что позволяет вам передавать двойное слово старшего порядка в младшее двойное слово, что позволяет загружать его в регистр общего назначения.

person Gerry Coll    schedule 20.06.2011
comment
Не обращайте внимания на мой предыдущий комментарий, эта инструкция помещает два двойных слова низкого порядка и перебирает их, мне нужно зашифровать двойные слова высокого порядка, чтобы получить это hidden старшее двойное слово, см. :-). PUNPCKHDQ - это ответ. - person Johan; 21.06.2011
comment
Йохан, вы действительно говорите, что ответ на вопрос, почему Delphi не поддерживает PUNPCKDQ, заключается в том, что любой, кто хочет его использовать, должен вместо этого использовать PUNPCKHDQ или PUNPCKLDQ? Это три разные инструкции с разными эффектами на операнды. Я не понимаю, как это отвечает на вопрос, который вы задали. - person Rob Kennedy; 21.06.2011
comment
@Rob, ну, это действительно ответило на вопрос, код с PUNPCKHDQ работал прекрасно. Может я не ту инструкцию искал, в таком случае извиняюсь. Я не хочу сказать, что люди должны использовать PUNPCKHDQ/...L.. вместо любой инструкции MMX, просто это сработало для меня. - person Johan; 21.06.2011