LINUX.ORG.RU

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

Исправление wandrien, (текущая версия) :

Что касается оптимизации кода, то далее в моих планах:

Реализовал, что было описано в этом комменте. В моих тестах это дало небольшое ускорение машинного кода. В пределах нескольких единиц процентов. Точные числа сказать сложно.

Пример компилируемой функции:

void DictAddToNamespace(word P; word pNamespace)
	when P >= nDict:
		StopInternal(__FILE__, __LINE__);
	when Dict[P].pNamespace != nDICT:
		StopInternal(__FILE__, __LINE__);
	when Dict[P].pNext != nDICT:
		StopInternal(__FILE__, __LINE__);
	when Dict[pNamespace].pFirst != nDICT & Dict[pNamespace].pLast == nDICT:
		StopInternal(__FILE__, __LINE__);
	when Dict[pNamespace].pFirst == nDICT & Dict[pNamespace].pLast != nDICT:
		StopInternal(__FILE__, __LINE__);
	when pNamespace >= nDict:
		StopInternal(__FILE__, __LINE__);

	Dict[P].pNamespace = pNamespace;
	if Dict[pNamespace].pLast < nDICT then
		Dict[Dict[pNamespace].pLast].pNext = P;
		Dict[pNamespace].pLast = P;
	else
		Dict[pNamespace].pFirst = P;
		Dict[pNamespace].pLast = P;
	end:if
end

Результат компиляции:

@10103:                                  ; ## DictAddToNamespace ##
        push    EBP
        mov     EBP,  ESP
                                         ; #line compiler_dict.qdi:280
        mov     EAX,  dword [EBP+8]
        cmp     EAX,  dword [@@DATA+9977192]
        jae     @10815
                                         ; #line compiler_dict.qdi:282
        imul    EAX,  92
        mov     EDX,  dword [@@DATA+EAX+777200]
        cmp     EDX,  100000
        jne     @10816
                                         ; #line compiler_dict.qdi:284
        mov     ECX,  dword [@@DATA+EAX+777204]
        cmp     ECX,  EDX
        jne     @10817
                                         ; #line compiler_dict.qdi:286
        mov     EBX,  dword [EBP+12]
        imul    EBX,  92
        mov     EAX,  dword [@@DATA+EBX+777208]
        cmp     EAX,  EDX
        je      @10818
        mov     EAX,  dword [@@DATA+EBX+777212]
        cmp     EAX,  EDX
        je      @10819
@10818: 
                                         ; #line compiler_dict.qdi:288
        mov     EAX,  dword [EBP+12]
        imul    EAX,  92
        mov     EDX,  dword [@@DATA+EAX+777208]
        cmp     EDX,  100000
        jne     @10820
        mov     ECX,  dword [@@DATA+EAX+777212]
        cmp     ECX,  EDX
        jne     @10821
@10820: 
                                         ; #line compiler_dict.qdi:290
        mov     EAX,  dword [EBP+12]
        cmp     EAX,  dword [@@DATA+9977192]
        jae     @10822
                                         ; #line compiler_dict.qdi:293
        mov     EDX,  dword [EBP+8]
        imul    EDX,  92
        mov     dword [@@DATA+EDX+777200], EAX
                                         ; #line compiler_dict.qdi:294
        imul    EAX,  92
        mov     ECX,  dword [@@DATA+EAX+777212]
        cmp     ECX,  100000
        jae     @10823
                                         ; #line compiler_dict.qdi:295
        imul    ECX,  92
        mov     EBX,  dword [EBP+8]
        mov     dword [@@DATA+ECX+777204], EBX
                                         ; #line compiler_dict.qdi:296
        mov     dword [@@DATA+EAX+777212], EBX
        jmp     @10824
@10823: 
                                         ; #line compiler_dict.qdi:298
        mov     EAX,  dword [EBP+12]
        imul    EAX,  92
        mov     EDX,  dword [EBP+8]
        mov     dword [@@DATA+EAX+777208], EDX
                                         ; #line compiler_dict.qdi:299
        mov     dword [@@DATA+EAX+777212], EDX
@10824: 
                                         ; #line qodc.qd:364
        pop     EBP
        ret     8
@10815: 
                                         ; #line compiler_dict.qdi:281
        push    dword 281
        push    dword @@ROLITERALS+9730
        call    @10071                   ; StopInternal
@10816: 
                                         ; #line compiler_dict.qdi:283
        push    dword 283
        push    dword @@ROLITERALS+9730
        call    @10071                   ; StopInternal
@10817: 
                                         ; #line compiler_dict.qdi:285
        push    dword 285
        push    dword @@ROLITERALS+9730
        call    @10071                   ; StopInternal
@10819: 
                                         ; #line compiler_dict.qdi:287
        push    dword 287
        push    dword @@ROLITERALS+9730
        call    @10071                   ; StopInternal
@10821: 
                                         ; #line compiler_dict.qdi:289
        push    dword 289
        push    dword @@ROLITERALS+9730
        call    @10071                   ; StopInternal
@10822: 
                                         ; #line compiler_dict.qdi:291
        push    dword 291
        push    dword @@ROLITERALS+9730
        call    @10071                   ; StopInternal

Исходная версия wandrien, :

Что касается оптимизации кода, то далее в моих планах:

Реализовал, что было описано в этом комменте.

Пример компилируемой функции:

void DictAddToNamespace(word P; word pNamespace)
	when P >= nDict:
		StopInternal(__FILE__, __LINE__);
	when Dict[P].pNamespace != nDICT:
		StopInternal(__FILE__, __LINE__);
	when Dict[P].pNext != nDICT:
		StopInternal(__FILE__, __LINE__);
	when Dict[pNamespace].pFirst != nDICT & Dict[pNamespace].pLast == nDICT:
		StopInternal(__FILE__, __LINE__);
	when Dict[pNamespace].pFirst == nDICT & Dict[pNamespace].pLast != nDICT:
		StopInternal(__FILE__, __LINE__);
	when pNamespace >= nDict:
		StopInternal(__FILE__, __LINE__);

	Dict[P].pNamespace = pNamespace;
	if Dict[pNamespace].pLast < nDICT then
		Dict[Dict[pNamespace].pLast].pNext = P;
		Dict[pNamespace].pLast = P;
	else
		Dict[pNamespace].pFirst = P;
		Dict[pNamespace].pLast = P;
	end:if
end

Результат компиляции:

@10103:                                  ; ## DictAddToNamespace ##
        push    EBP
        mov     EBP,  ESP
                                         ; #line compiler_dict.qdi:280
        mov     EAX,  dword [EBP+8]
        cmp     EAX,  dword [@@DATA+9977192]
        jae     @10815
                                         ; #line compiler_dict.qdi:282
        imul    EAX,  92
        mov     EDX,  dword [@@DATA+EAX+777200]
        cmp     EDX,  100000
        jne     @10816
                                         ; #line compiler_dict.qdi:284
        mov     ECX,  dword [@@DATA+EAX+777204]
        cmp     ECX,  EDX
        jne     @10817
                                         ; #line compiler_dict.qdi:286
        mov     EBX,  dword [EBP+12]
        imul    EBX,  92
        mov     EAX,  dword [@@DATA+EBX+777208]
        cmp     EAX,  EDX
        je      @10818
        mov     EAX,  dword [@@DATA+EBX+777212]
        cmp     EAX,  EDX
        je      @10819
@10818: 
                                         ; #line compiler_dict.qdi:288
        mov     EAX,  dword [EBP+12]
        imul    EAX,  92
        mov     EDX,  dword [@@DATA+EAX+777208]
        cmp     EDX,  100000
        jne     @10820
        mov     ECX,  dword [@@DATA+EAX+777212]
        cmp     ECX,  EDX
        jne     @10821
@10820: 
                                         ; #line compiler_dict.qdi:290
        mov     EAX,  dword [EBP+12]
        cmp     EAX,  dword [@@DATA+9977192]
        jae     @10822
                                         ; #line compiler_dict.qdi:293
        mov     EDX,  dword [EBP+8]
        imul    EDX,  92
        mov     dword [@@DATA+EDX+777200], EAX
                                         ; #line compiler_dict.qdi:294
        imul    EAX,  92
        mov     ECX,  dword [@@DATA+EAX+777212]
        cmp     ECX,  100000
        jae     @10823
                                         ; #line compiler_dict.qdi:295
        imul    ECX,  92
        mov     EBX,  dword [EBP+8]
        mov     dword [@@DATA+ECX+777204], EBX
                                         ; #line compiler_dict.qdi:296
        mov     dword [@@DATA+EAX+777212], EBX
        jmp     @10824
@10823: 
                                         ; #line compiler_dict.qdi:298
        mov     EAX,  dword [EBP+12]
        imul    EAX,  92
        mov     EDX,  dword [EBP+8]
        mov     dword [@@DATA+EAX+777208], EDX
                                         ; #line compiler_dict.qdi:299
        mov     dword [@@DATA+EAX+777212], EDX
@10824: 
                                         ; #line qodc.qd:364
        pop     EBP
        ret     8
@10815: 
                                         ; #line compiler_dict.qdi:281
        push    dword 281
        push    dword @@ROLITERALS+9730
        call    @10071                   ; StopInternal
@10816: 
                                         ; #line compiler_dict.qdi:283
        push    dword 283
        push    dword @@ROLITERALS+9730
        call    @10071                   ; StopInternal
@10817: 
                                         ; #line compiler_dict.qdi:285
        push    dword 285
        push    dword @@ROLITERALS+9730
        call    @10071                   ; StopInternal
@10819: 
                                         ; #line compiler_dict.qdi:287
        push    dword 287
        push    dword @@ROLITERALS+9730
        call    @10071                   ; StopInternal
@10821: 
                                         ; #line compiler_dict.qdi:289
        push    dword 289
        push    dword @@ROLITERALS+9730
        call    @10071                   ; StopInternal
@10822: 
                                         ; #line compiler_dict.qdi:291
        push    dword 291
        push    dword @@ROLITERALS+9730
        call    @10071                   ; StopInternal