Как загрузить все 1 в регистр mmx?Почему это не работает? - PullRequest
3 голосов
/ 24 июня 2010

не смог найти ничего, кроме вопросов о мнении о 64/32-битном материале, когда я искал.

__asm__ {
  mov rbx, 0xFFFFffffFFFFffffull
  movq mm2, rbx 
}

После этих 2 инструкций регистр mm2 содержит значение 0x30500004ffffffff в соответствии с моим отладчиком xcode (это встроенный asm в C ++). Теперь я новичок в сборке x86, и мой класс ассемблера преподавали на MIPS, который я учил вечно, но я полагаю, это не работает, потому что я компилирую (это часть плагина photoshop) в 32-битном режиме и rbx 64-битная версия ebx, bx и т. д., верно?), вероятно, технически не существует. Я попробовал другие методы, чтобы получить все 1, такие как загрузка 0xfffffffful в mm2 и другой регистр и умножение, но это также, похоже, не сработало.

Я исправляю оптимизацию своего плагина с помощью некоторых SIMD-инструкций, но я не могу понять это или найти какую-либо документацию, которая не причиняет боль моим глазам. Любая помощь очень ценится!

Ответы [ 2 ]

8 голосов
/ 27 июня 2010

Хотя код interjay делает то, что вы хотите, есть более простой способ установить регистр MMX (или регистр XMM, в этом отношении) на все -1 (здесь для mm2):

pcmpeqw mm2, mm2
1 голос
/ 24 июня 2010

Вы не можете запустить 64-битный ассемблерный код в 32-битной программе.Вы можете либо прочитать значение в регистр MMX из ячейки памяти, либо использовать что-то вроде этого:

mov ebx, 0xffffffff
movd mm2, ebx       //copy value to lower 32 bits
punpckldq mm2, mm2  //copy lower 32-bits to upper 32 bits
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...