LINUX.ORG.RU

История изменений

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