operand type mismatch for `movntq'

программирование windows ассемблер ASM

Имеется функция c++ с асемблерной вставкой:

void memcpyMMX(void* dst, const void* src, int nbytes) {
int remainingBytes = nbytes;

if (nbytes > 64) {
asm (
"movl %esi, src\n\t"
"movl %edi, dst\n\t"
"movl %ecx, nbytes\n\t"
"shrl %ecx, $6\n\n" // 64 bytes per iteration

"loop1:\n\t"
"movq %mm1, 0(%ESI)\n\t" // Read in source data
"movq %mm2, 8(%ESI)\n\t"
"movq %mm3, 16(%ESI)\n\t"
"movq %mm4, 24(%ESI)\n\t"
"movq %mm5, 32(%ESI)\n\t"
"movq %mm6, 40(%ESI)\n\t"
"movq %mm7, 48(%ESI)\n\t"
"movq %mm0, 56(%ESI)\n\n\t"

"movntq 0(%EDI), %mm1\n\t" // Non-temporal stores
"movntq 8(%EDI), %mm2\n\t"
"movntq 16(%EDI), %mm3\n\t"
"movntq 24(%EDI), %mm4\n\t"
"movntq 32(%EDI), %mm5\n\t"
"movntq 40(%EDI), %mm6\n\t"
"movntq 48(%EDI), %mm7\n\t"
"movntq 56(%EDI), %mm0\n\n\t"

"addl %esi, $64\n\t"
"addl %edi, $64\n\t"
"dec %ecx\n\t"
"jnz loop1\n\n\t"

"emms"
);
remainingBytes -= ((nbytes >> 6) << 6);
}

if (remainingBytes > 0) {
// Memcpy the rest
memcpy((uint8*) dst + (nbytes - remainingBytes),
(const uint8*) src + (nbytes - remainingBytes), remainingBytes);
}
}

Компилирую с MinGW, выдает ошибки:
operand type mismatch for `movntq'
operand type mismatch for `shr'
operand type mismatch for `add'

Помогите, пожалуйста, где что не так?
Ответы:
Вы синтаксис ассемблера не путаете? В AT&T "movl src, dst". В Intel mov dst, src. gcc использует AT&T.
MOVNTQ m64, mm  Move quadword from mm to m64, minimizing pollution in the cache hierarchy. Intel синтаксис.
Диагноз, поменять все аргументы инструкций местами.


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.