[an error occurred while processing this directive]
|
Развернул циклы как вы писали. Результат впечатляет: количество инструкций снизилось с 37тыс. до 16тыс.! Это 5% общей производительности.В сравнении с неоптимизированной функцией на С : 65 тыс. инструкций против 16 тыс. и размер кода 72 против 66 соответственно
Ну вот, видите, а вы говорили про какие-то несчастные 640! Не надо быть столь пессимистически настроенным(:-).
Сейчас Вы достигли коэффициента оптимизации 4 с хвостиком. Осталось снизить скорость всего в 1,5..2 раза, и Вы достигнете потолка оптимизации на ассемблере для данного множества инструкций. Далее придется только существенно менять алгоритм или процессор, увы.
Вот кстати, как Вы эти тысячи считаете?
+Высвободился регистр B, но возник вопрос - почему нельзя возвести в квадрат регистр А: SQUR A,B?
Возвести можно, такая команда есть SQUR A,А. Но зачем? В конце концов, Вам же нужно получить сумму квадратов частных сумм, поэтому лучшего места, чем асс В не придумать. Зачем Вам копить частные суммы во временном массиве, а потом брать их оттуда, возводить в квадрат и складывать. Это лишнее. Ну представьте сами, вот Вы получили текущую частную сумму в асс А, ну сдвиньте ее на сколько надо, возведите в квадрат и добавьте к содержимому асс В, как я Вам писал. В результате, после вычисления всех частных сумм Вы получаете непосредственно в асс В окончательный результат, который можно масштабировать и сохранить в массиве Y2.
Рекомендую обратить внимание на команду SQDST, она делает то, что доктор прописал, и быстро - всего один машинный цикл.
Эта команда что, перемножает только старшие части регистра А?
Ну а что Вы хотели? У процессора 17-битный перемножитель, а не 32-х!
Перемножить 32 на 32 это долгая песня, кроме того, подумайте, что Вы будете делать с 64-битным результатом? Почти наверное отсечете лишние 48 бит!
E-mail: info@telesys.ru