История изменений
Исправление 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