LINUX.ORG.RU

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

Исправление 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

Причину регрессии пока не выяснил.