"Оптимизация для PENTIUM процессора" - читать интересную книгу автораLEA EAX,[EBX+8*ECX-1000]
намного быстрее, чем MOV EAX,ECX / SHL EAX,3 / ADD EAX,EBX / SUB EAX,1000 Инструкция LEA может быть также быть использована для сложения или сдвига без изменения флагов. Источник и приемник не должны иметь тоже размер слова, таким образом LEA EAX,[BX] лучше заменить на MOVZX EAX,BX. Но вы должны знать, что инструкция LEA приводит к остановкам AGI, если она использует базовый или индексный регистр, который был изменен в предыдущем такте. А с тех пор как инструкция LEA может спариваться и в V-трубе, а инструкции сдвига нет, то вы можете использовать LEA как заменитель SHL на 1, 2, 3 если вы хотите, что бы эта операция выполнилась в V-трубе. У 32 битных процессоров нет документированного способа адресации масштабом индексного регистра, так например LEA EAX,[EAX*2] в действительности кодируется как LEA EAX,[EAX*2+00000000] с добавлением 4 байт к смещению. Вы можете уменьшить размер кода записав так: LEA EAX,[EAX+EAX] или лучше ADD EAX,EAX. Последняя версия кода не может вызвать остановку AGI. А если вам везет и у вас есть регистр с нулевым значением(например счетчик цикла, после его завершения), то вы можете использовать его как базовый для уменьшения размера кода: LEA EAX,[EBX*4] ; 7 байт 17.2 TEST --------- Инструкция TEST с непосредственным значением операнда, только если сравнение идет с AL, AX или EAX. TEST регистр,регистр или TEST регистр,память всегда спаривается. Примеры: TEST ECX,ECX ; спариться TEST [mem],EBX ; спариться TEST EDX,256 ; не спариться TEST DWORD PTR [EBX],8000H ; не спариться Что бы сделать их спариваемыми, используйте любой из следующих методов: MOV EAX,[EBX] / TEST EAX,8000H MOV EDX,[EBX] / AND EDX,8000H MOV AL,[EBX+1] / TEST AL,80H MOV AL,[EBX+1] / TEST AL,AL ; (результат в флаге знака(SF)) Так же можно сдвинуть тестовый бит в флаг переноса(CF): MOV EAX,[EBX] / SHR EAX,16 ; (результат в флаге переноса(CF)) но этот метод приведет к потерям на PentiumPro, если переносится более одного бита. (Причина не спариваемости - скорее всего в том, что первый байт 2 байтной |
|
|