"Оптимизация для PENTIUM процессора" - читать интересную книгу автораBS1:
Следующий пример эмулирует BSF ECX,EAX: TEST EAX,EAX JZ SHORT BS2 XOR ECX,ECX MOV DWORD PTR [TEMP+4],ECX SUB ECX,EAX AND EAX,ECX MOV DWORD PTR [TEMP],EAX FILD QWORD PTR [TEMP] FSTP QWORD PTR [TEMP] WAIT ; для совместимости с ранними процессорами MOV ECX, DWORD PTR [TEMP+4] SHR ECX,20 SUB ECX,3FFH TEST EAX,EAX ; сбрасываем флаг нуля BS2: 17.7 битовый тест ----------------- BT, BTC, BTR и BTS предпочтительно должны заменяться инструкциями вроде TEST, AND, OR, XOR или сдвигов. 17.8 умножения целых Целочисленное умножение занимает примерно 9 тактов. Следовательно выгоднее заменить умножение константы на одну из следующих инструкций: SHL, ADD, SUB и LEA. Например: IMUL EAX,10 можно заменить на MOV EBX,EAX / ADD EAX,EAX / SHL EBX,3 / ADD EAX,EBX или LEA EAX,[EAX+4*EAX] / ADD EAX,EAX Умножение с плавающей точкой быстрее чем целочисленная операция на Pentium без MMX, но время затрачиваемое на преобразование целого в вещественное и преобразования результата назад обычно намного больше, чем время сохраненное при использовании умножения с плавающей точкой, кроме одного случая, когда количество умножений гораздо больше количества преобразований. 17.9 деление ------------ Деление поглощает очень много времени. Инструкция DIV берет 17, 25 или 41 такт для байта, слова или двойного слова, соответственно. Инструкция IDIV использует на 5 тактов больше. Следовательно, предпочтительно использовать наименьший из возможных операндов, который не вызовет переполнения, даже если придется пожертвовать префиксом размера и использовать без значное деление, если возможно. |
|
|