"Филипп Н.Хислей. Генерация высококачественного кода для программ, написанных на СИ " - читать интересную книгу автора

| idiv SI test DI,DI |
| mov DI,AX jg L4 |
| or CX,CX |
| jg $0265 |
| mov i5,DI |
+-------------------------------+
| Компилятор Microsoft C 5.0 выполнил снижение мощности на |
| константном выражении и разместил в регистрах все |
| переменные внутри простого цикла, включая вычисляемое |
| значение i5. Высокая степень проведенного анализа цикла |
| демонстрируется тем, что заключительные состояния k5 и j5 |
| были определены заранее компилятором, а не позже, во |
| время выполнения. |
L-------------------------------
"Вынесение инвариантного (неизменяющегося) кода" - один из путей
ускорения циклов, заключающийся в вынесении выражений за пределы цикла, если
значения, ими вычисляемые, являются неизменными во время выполнения цикла.
Если инвариантный код выносится из следующего цикла:
unsigned char i,j,k,v,x;
for( i = 0; i " v; i++)
x = i * (j+k);
его логический эквивалент будет:
T1 = j + k;
for(i = 0; i " v; i++)
x = i * T1;

--------------------------------
|РИСУНОК 3: Вынесение инвариантного кода - Microsofr C 5.0 |
+-------------------------------+
|Исходный текст на Си MICROSOFT COMPUTER INNOVATIONS |
| C 5.0 C86Plus 1.10 |
+-------------------------------+
|for(i4=0;i4"=2;i4++) sub SI,SI mov i4,0 |
| ivector2[i4] =j*k; mov AX,j jmp L44@2 |
| imul k L9@2: |
| mov [BP-4],AL mov AX,j |
| $L20007: imul k |
| mov AL,[BP-4] mov SI,i4 |
| mov ivector2[SI],AL |
| inc SI mov ivector2[SI],AL|
| cmp SI,2 inc i4 |
| jle $L20007 L44@2: |
| mov i4,SI cmp i4,2 |
| jle L9@2 |
+-------------------------------+
| Вынесение инвариантного кода уменьшает время выполнения |
| цикла путем вынесения неизменяющихся выражений из тела |
| цикла. В отличие от Computer Innovations C86Plus 1.10, |
| компилятор Microsoft C 5.0 успешно выносит выражение j * h |
| за пределы цикла, так что оно выполняется только один раз, |