История изменений
Исправление 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, что думаешь по этому поводу?