История изменений
Исправление wandrien, (текущая версия) :
В процессе отладки кодогенератора удалось добиться такого улучшения генерации кода:
Исходник:
while j < Size do
if i >= _nChar then
exit;
end
if Str[j] != Char[i] then
Было:
mov EAX, dword [EBP-12]
cmp EAX, dword [EBP+12]
jae @10257
; #line compiler_chardata.qdi:31
mov EAX, dword [EBP-8]
cmp EAX, dword [@@DATA+49284]
jae @10257
; #line compiler_chardata.qdi:35
mov EAX, dword [EBP-12]
add EAX, dword [EBP+8]
mov AL, byte [EAX]
mov EDX, dword [EBP-8]
mov DL, byte [@@DATA+EDX+49288]
cmp AL, DL
je @10263
Стало:
mov EAX, dword [EBP-12]
cmp EAX, dword [EBP+12]
jae @10257
; #line compiler_chardata.qdi:31
mov EDX, dword [EBP-8]
cmp EDX, dword [@@DATA+49284]
jae @10257
; #line compiler_chardata.qdi:35
add EAX, dword [EBP+8]
mov AL, byte [EAX]
mov DL, byte [@@DATA+EDX+49288]
cmp AL, DL
je @10263
И таких мест по коду много, где компилятор «пропускает» содержимое регистров через блок ветвлений, чтобы потом переиспользовать.
Но в некоторых случаях стало хуже, как тут:
Было:
mov EDX, dword [EBP+20]
cmp EDX, 127
ja @13199
cmp EDX, 4294967168
Стало
mov EAX, dword [EBP+20]
cmp EAX, 127
ja @13199
mov ECX, dword [EBP+20]
cmp ECX, 4294967168
Причину регрессии пока не выяснил.
Исходная версия wandrien, :
В процессе отладки кодогенератора удалось добиться такого улучшения генерации кода:
Исходник:
while j < Size do
if i >= _nChar then
exit;
end
if Str[j] != Char[i] then
Было:
mov EAX, dword [EBP-12]
cmp EAX, dword [EBP+12]
jae @10257
; #line compiler_chardata.qdi:31
mov EAX, dword [EBP-8]
cmp EAX, dword [@@DATA+49284]
jae @10257
; #line compiler_chardata.qdi:35
mov EAX, dword [EBP-12]
add EAX, dword [EBP+8]
mov AL, byte [EAX]
mov EDX, dword [EBP-8]
mov DL, byte [@@DATA+EDX+49288]
cmp AL, DL
je @10263
Стало:
mov EAX, dword [EBP-12]
cmp EAX, dword [EBP+12]
jae @10257
; #line compiler_chardata.qdi:31
mov EDX, dword [EBP-8]
cmp EDX, dword [@@DATA+49284]
jae @10257
; #line compiler_chardata.qdi:35
add EAX, dword [EBP+8]
mov AL, byte [EAX]
mov DL, byte [@@DATA+EDX+49288]
cmp AL, DL
je @10263
И таких мест по коду много, где компилятор «пропускает» содержимое регистров через блок ветвлений, чтобы потом переиспользовать.
Но в некоторых случаях стало хуже, как тут:
Было:
mov EDX, dword [EBP+20]
cmp EDX, 127
ja @13199
cmp EDX, 4294967168
Стало
mov EAX, dword [EBP+20]
cmp EAX, 127
ja @13199
mov ECX, dword [EBP+20]
cmp ECX, 4294967168
Причину регрессии пока не выяснил.