"Оптимизация для PENTIUM процессора" - читать интересную книгу автораБез значное деление, если делитель кратен 2, может быть заменено на SHR. Деление
числа со знаком может быть заменено на SAR, но результат, при делении на ноль, округлиться к минус бесконечности. Деля положительное число, N (< 2^16) на константу D, не кратную 2 может быть заменена умножением N с 2^16 / D, а затем разделить на 2^16. Например, что бы разделить число на 5 вы должны умножения умножить его на 2^16 / 5 = 3333H, а затем разделить на 2^16: INC EAX / IMUL EAX,3333H / SHR EAX,16 INC EAX добавлен для компенсации двойной ошибки от округления. Этот метод работает при 0 <= N <= 2^16. Вы должны протестировать этот код тщательно, что бы убедиться, что округление правильно. Если вы хотите заменить IMUL более быстрыми, спариваемыми инструкциями, то вы должны написать: LEA EBX,[EAX+2*EAX+3] LEA ECX,[EAX+2*EAX+3] SHL EBX,4 MOV EAX,ECX SHL ECX,8 ADD EAX,EBX SHL EBX,8 ADD EAX,EBX SHR EAX,16 Вы можете использовать то же код, что бы разделить на 10. Просто измените сдвиг 16 на 17 в конце. Делению с плавающей точкой требуется 39 тактов, при максимальной точности. Вы можете сохранить время, определив для числа более низкую точность в управляющем слове. (Только на инструкции FDIV и FIDIV распространяется ускорение, ни какие други инструкции не выполняются быстрее). Возможно делать деление с плавающей точкой и целочисленное деление параллельным, что бы сохранить время. Например: A = A1 / A2; B = B1 / B2 FILD [B1] FILD [B2] MOV EAX,[A1] MOV EBX,[A2] CDQ FDIV DIV EBX FISTP [B] MOV [A],EAX (убедитесь, что вы правильно устанавливаете слово управления операций с |
|
|