История изменений
Исправление wandrien, (текущая версия) :
Пример генерации кода для следующей функции:
attribute(hot)
bool str_eq(char @S1; char @S2) of
when @S1 == @S2:
return true;
word i = 0;
while S1[i] == S2[i] do
if S1[i] != #0 then /* optimized for better code layout */
inc i;
else
return true;
end
end
return false;
end
align 32
@10031: ; ## str_eq ##
push EBP
mov EBP, ESP
sub ESP, 4
; #line include/strings_cmp.qdi:19
; #line include/strings_cmp.qdi:22
mov EAX, dword [EBP+8]
cmp EAX, dword [EBP+12]
jne @10035
; #line include/strings_cmp.qdi:23
mov EAX, 1
leave
ret 8
@10035:
; #line include/strings_cmp.qdi:25
xor EAX, EAX
mov dword [EBP-4], EAX
; #line include/strings_cmp.qdi:26
align 32
@10039:
mov EAX, dword [EBP-4]
add EAX, dword [EBP+8]
mov AL, byte [EAX]
mov EDX, dword [EBP-4]
add EDX, dword [EBP+12]
mov DL, byte [EDX]
cmp AL, DL
jne @10040
; #line include/strings_cmp.qdi:27
test AL, AL
je @10043
; #line include/strings_cmp.qdi:28
inc dword [EBP-4]
jmp @10039
@10043:
; #line include/strings_cmp.qdi:30
mov EAX, 1
leave
ret 8
@10040:
; #line include/strings_cmp.qdi:34
xor EAX, EAX
leave
ret 8
В целом с распределением регистров крупная работа, вероятно, на ближайшее время закончена. Мелкие правки еще надо будет внести, так как остались некоторые лишние mov. Позже вернусь к этому, чтобы добавить возможность вручную указывать переменные как регистровые и начать работу по поддержке разных видов calling conventions.
Считаю, что текущий уровень производительности получаемого кода подходит для практических целей, для создания практических программ.
firkax, что думаешь по этому поводу?
Исходная версия wandrien, :
Пример генерации кода для следующей функции:
bool str_eq(char @S1; char @S2)
when @S1 == @S2:
return true;
word i = 0;
while S1[i] == S2[i] do
if S1[i] != #0 then /* optimized for better code layout */
inc i;
else
return true;
end
end
return false;
end
align 32
@10031: ; ## str_eq ##
push EBP
mov EBP, ESP
sub ESP, 4
; #line include/strings_cmp.qdi:19
; #line include/strings_cmp.qdi:22
mov EAX, dword [EBP+8]
cmp EAX, dword [EBP+12]
jne @10035
; #line include/strings_cmp.qdi:23
mov EAX, 1
leave
ret 8
@10035:
; #line include/strings_cmp.qdi:25
xor EAX, EAX
mov dword [EBP-4], EAX
; #line include/strings_cmp.qdi:26
align 32
@10039:
mov EAX, dword [EBP-4]
add EAX, dword [EBP+8]
mov AL, byte [EAX]
mov EDX, dword [EBP-4]
add EDX, dword [EBP+12]
mov DL, byte [EDX]
cmp AL, DL
jne @10040
; #line include/strings_cmp.qdi:27
test AL, AL
je @10043
; #line include/strings_cmp.qdi:28
inc dword [EBP-4]
jmp @10039
@10043:
; #line include/strings_cmp.qdi:30
mov EAX, 1
leave
ret 8
@10040:
; #line include/strings_cmp.qdi:34
xor EAX, EAX
leave
ret 8
В целом с распределением регистров крупная работа, вероятно, на ближайшее время закончена. Мелкие правки еще надо будет внести, так как остались некоторые лишние mov. Позже вернусь к этому, чтобы добавить возможность вручную указывать переменные как регистровые и начать работу по поддержке разных видов calling conventions.
Считаю, что текущий уровень производительности получаемого кода подходит для практических целей, для создания практических программ.
firkax, что думаешь по этому поводу?