MMX Недопустимая операция с плавающей запятой

Использование C++ Builder 6 и попытка запустить этот код

  __int64 m64_1 = 1424115525456;
  __int64 m64_2 = 2222222222222;
  __int64 m64_3 = 1111111111111;


    __asm movq mm1, m64_1
    __asm paddd mm1, m64_2
    __asm movq m64_3, mm1

Получение и исключение

но я не выполняю деление на ноль. Что насчет этой ошибки


person keipa    schedule 30.04.2016    source источник
comment
Если вы MMX, вы также должны EMMS   -  person harold    schedule 01.05.2016
comment
Я не вижу, где это показывает, что одна из этих инструкций вызывает исключение. Как вы думаете, почему оно там?   -  person wallyk    schedule 01.05.2016
comment
@wallyk, когда я его отлаживаю. я перешел через строки __asm ​​и врезался в 'Memo1->Text = assemble';   -  person keipa    schedule 01.05.2016
comment
@harold моя задача - умножить на массивы с помощью mmx. Как вы думаете, EMMS поможет мне?   -  person keipa    schedule 01.05.2016
comment
Проект Project1.exe вызвал исключение EInvalidOp с сообщением Недопустимая операция с плавающей запятой. Процесс остановлен   -  person keipa    schedule 01.05.2016
comment
EMMS не помогает сама по себе, но необходима для того, чтобы сделать последующий код безопасным. Отсутствие EMMS оставляет стек FPU в состоянии, которое приводит к мгновенному сбою почти всего кода FPU. Ошибка, вызванная этим, действительно должна быть переполнением стека FPU, но, возможно, диалог не различает   -  person harold    schedule 01.05.2016
comment
@гарольд классный. я набрал __asm emms после команд mmx, и это сработало! Спасибо   -  person keipa    schedule 01.05.2016
comment
Вероятно, вам следует использовать SSE2 для нового кода вместо MMX. emms работает медленно, а в последних процессорах (Skylake) MMX-версии многих векторных инструкций не могут работать на таком количестве портов выполнения. (т. е. разработчики ЦП больше не заботятся о MMX, потому что он устарел.)   -  person Peter Cordes    schedule 02.05.2016


Ответы (1)


просто введите __asm emms после ваших команд mmx следующим образом:

__asm movq mm1, m64_1;
__asm paddd mm1, m64_2;
__asm movq m64_3, mm1;
__asm emms
person keipa    schedule 30.04.2016
comment
Вы действительно должны сделать это вики-ответом сообщества, поскольку на самом деле это ответ @harold. - person David Hoelzer; 01.05.2016