Я думаю, что сам исходник:
CODE
if ((col1 & 0xff000000)!=0) return 1;
if (1) {
if ((col1 & 0xff000000)==0)
offset1=X1;
offset1=offset1*1024;
offset1=offset1+Y1;
offset1=(offset1<<2);
}
должен выглядеть так:
CODE
if ((col1 & 0xff000000)!=0) return 1;
offset1=X1;
offset1=offset1*1024;
offset1=offset1+Y1;
offset1=(offset1<<2);
Это эквивалентно и гораздо яснее. Вторичная проверка не нужна, да и вдруг оптимизатор её сам не выбросит.
Там на самом деле из всего получается простая формула:
CODE
offset1 = (X1<<12) + (Y1<<2);
, которую можно вычислять однострочно. Даже завести временные переменные с (X1<<12) и (Y1<<2), обновляемые в тех местах, где исходные меняются.
Может быть, это еще что-то ускорит на десяток тактов. Можно посравнивать сдвиги с умножением -- оно бывает аппаратное и на LE, сдвиги тоже им. Barrel можно настроить.
Само помещение кода в другой тип памяти вряд ли даст выигрыш -- в кэше он всю жизнь сидит при постоянном исполнении, а кэш из того же теста, что и пресловутая Tightly Coupled, да на вызов куча тактов пойдет. Легче само это тело текущей функции сделать inline-функцией, чтобы return-ов было поменьше.
Ну и, конечно, главная оптимизация уходом от -О0 получается
Сообщение отредактировал WitFed - Dec 8 2011, 15:00