Shaos wrote:5) написать оптимизатор (по типу как для некоторых других 8-битных компилей были), который бы шёл по асмовскому тексту и преобразовывал бы некоторые вещи для скорости, хотя я смотрю там вроде и так всё более менее оптимально - например OPTD1.COM (из того же архива от Василия) нашёл в результате компилирования LZH3.C размером 2.5 тыщи строк только несущественные мелочи:
Code: Select all
0a1
> ; Code optimized with XelaSoft's code optimizer version 1.1
2045,2046c2046
< call update_
< ret
---
> jp update_ ; -optimized-
2076,2077c2076
< call Putcode_
< ret
---
> jp Putcode_ ; -optimized-
2088,2089c2087
< call putc_
< ret
---
> jp putc_ ; -optimized-
2397,2398c2395
< call EncodeEnd_
< ret
---
> jp EncodeEnd_ ; -optimized-
---
>
> ; # BC load groups replaced: 0
> ; # DE load groups replaced: 0
> ; # EX DE,HL pairs removed: 0
> ; # call/ret pairs replaced: 4
> ; # in/out instr. used: 0
> ; # shift instructions replaced 0
P.S. А вообще "интеллектуальный" оптимайзер может разворачивать циклы при необходимости и вставлять тела небольших подпрограмм вместо call (видимо ещё надо и профайлер делать, чтобы узнать какие части кода часто вызываются и выполняются дольше всего)
P.P.S. В коде солида вот такие штуки попадаются:
Code: Select all
ex de,hl
ld a,e
sub c
ld c,a
ld a,d
sbc a,b
ld b,a
ld l,c
ld h,b
которые можно заменить на:
и даже такое можно встретить:
по сути можно проанализировать операции с регистрами по всей длине программы и убрать лишние копирования в регистры, которые далее по коду перетирваются
Ещё одна возможная оптимизация вокруг изредка встречающейся инструкции ld sp,ix:
- убирать лишнюю команду ld sp,ix если по ходу функции sp не менялся - как например тут:
Code: Select all
;{
printxy_:
push ix
ld ix,0
add ix,sp
ld a,c
ld (inregs_+1),a
ld (inregs_+8),hl
ex de,hl
ld (inregs_+10),hl
ld l,(ix+4)
ld h,(ix+5)
ld (inregs_+4),hl
ld bc,inregs_
ld de,3
ld hl,(handle_)
call calldll_
ld a,l
and h
inc a
jp nz,@0
ld hl,1
call exit_
@0:
ld sp,ix <<<<<<<<<< ненужно (и даже вредно, т.к. calldll_ портит IX)
pop ix
ret
;}
- убирать последнюю математику по восстановлению sp в функции после вызова вложенной функции с аргументами переданными через стек, если далее стоит ld sp,ix - как например тут:
Code: Select all
...
call printf_
ex de,hl
ld hl,14
add hl,sp
ld sp,hl
ex de,hl
ld sp,ix <<<< оставить вместо предыдущих 5 инструкций
pop ix
ret