Всем хай! Гляжу доку от Intel, там я вижу что префикс Lock относится к группе куда включены префиксы: REPNE, REPE. В мануале от AMD говорится, что этот префикс сам по себе. Почему мне это важно: Возьмем ситуацию: 0xF0, 0xF2, 0xF3, 0xXX(конкретный опкод) При декодировании влияния префиксов друг на друга,надо точно знать кто и кого бьет. В примере выше, байт 0xF3 бьет 0xF2, т.к. он последний ! А они входят в одну группу! Если префикс Lock в той же группе, а это соглассно мануалу Intel то его роль бьет 0xF2. Если же поверить мануалу AMD то его власть на маш.команду никто не оспаривает. Вопрос: Кому верить AMD или Intel? Предполагаемый ответ: AMD
EvilsInterrupt вот что говорит AMD о префиксе LOCK: а вот о REP: То есть по идее LOCK и REP вообще никогда не могут использоваться вместе. В таком случае они как бы ни за что не отвечают
EvilsInterrupt Префиксы F2 и F3 не дружат с префиксом 66 для MMX и SSE команд. Если перед командой поставить 66 и F2(F3), то возникает исключение.
EvilsInterrupt Я бы не назвал это ошибкой - группировка-то условная. Black_mirror Интересно, даже об этом не задумывался Это на всех процах так? А то я как-то на Athlon XP наблюдал интересную фичу с SSE2, которого на нем не было: например в последовательности 66 0F EB C1 (por xmm0, xmm1) он подло игнорировал префикс и получалось 0F EB C1 (por mm0, mm1), и никаких исключений, просто работает неправильно А вот на F2/F3 ругается, все честь по чести.
rmn Да нет, исключение это как раз штатное поведение. Мануалы говорят, что даже оно не гарантируется (см. мой предыдущий пост)
Ustus Мне кажется что на тех процах на которых нет SSE можно префиксы F2,F3 ставить перед любой MMX командой и никакого исключения не будет.
Black_mirror Про все процессоры не скажу, не знаю, а на Athlon XP Barton/Thorton префиксы F2/F3 провоцируют исключение, сам проверял. А префикс 66 - нет Хотя это SSE2... Блин, не помню, проверял же на Celeron Mendocino... по-моему у него точно также, только с учетом того, что SSE тоже нет.
Ustus Посмотрел AMDшную доку про x86-64, в таблице двухбайтовых инструкций все ячейки со SIMD инструкциями делятся на 4 части: нет префикса, F2, 66, F3. Если префикс 66 есть, а инструкцию такую еще не придумали, то написано invalid: 0F 53 - RCPPS F3 0F 53 - RCPSS 66 0F 53 - invalid (у меня тут тоже исключение есть) F2 0F 53 - invalid А вот для EMMS (0F 77) или для PCMPEQD XMM0,XMM0 (66 0F 76) префиксы 66,F2,F3 игнорируются.
Black_mirror Я вообще-то имел ввиду процы, в которых префикс 66 еще не мог быть частью опкода, т.е. до SSE2. Вот они и не считают его, поэтому интерпретируют SSE/SSE2 инструкции как соответствующие MMX.
Заметил в таблице несколько интересных опкодов: XX 0F D6 (MOVQ2DQ, MOVQ, MOVDQ2Q) XX 0F E6 (CVTDQ2PD, CVTTPD2DQ, CVTPD2DQ) 66 0F 6C (PUNPCKLQDQ) 66 0F 6D (PUNPCKHQDQ) А если убрать префикс, то получается invalid.
Black_mirror Я вот в мане от АМД вижу что все 3DNow содержат два 0Fh но один чел говорит это не всегда, я читал до дыр ман, и ничего не нашел! Чел видать не прав и для 3DNow всегда два байта 0Fh будут ! ?
A.2.6 3DNow!™ Opcodes The 3DNow! instructions are encoded using two 0Fh opcode bytes and an immediate byte that is located at the last byte position of the instruction encoding. Thus, the format for 3DNow! instructions is: 0Fh 0Fh [ModRM] [SIB] [displacement] imm8_opcode Других вариантов я не вижу.
К AMD 3DNow! также относятся: 0F 0E - femms 0F 0D /0 - prefetch 0F 0D /1 - prefetchw Было еще какое-то расширение на Cyrix, которое вроде бы иногда называли 3DNow! (?) но не знаю, насколько это официально.