operand type mismatch for `movntq’

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

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

if (nbytes > 64) {
asm (
"movl %esi, srcnt"
"movl %edi, dstnt"
"movl %ecx, nbytesnt"
"shrl %ecx, $6nn" // 64 bytes per iteration

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

"movntq 0(%EDI), %mm1nt" // Non-temporal stores
"movntq 8(%EDI), %mm2nt"
"movntq 16(%EDI), %mm3nt"
"movntq 24(%EDI), %mm4nt"
"movntq 32(%EDI), %mm5nt"
"movntq 40(%EDI), %mm6nt"
"movntq 48(%EDI), %mm7nt"
"movntq 56(%EDI), %mm0nnt"

"addl %esi, $64nt"
"addl %edi, $64nt"
"dec %ecxnt"
"jnz loop1nnt"

"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’

Помогите, пожалуйста, где что не так?  

1 комментарий

  • Вы синтаксис ассемблера не путаете? В 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 синтаксис.
    Диагноз, поменять все аргументы инструкций местами.